summaryrefslogtreecommitdiffstats
path: root/modules.d/91zipl
diff options
context:
space:
mode:
Diffstat (limited to 'modules.d/91zipl')
-rwxr-xr-xmodules.d/91zipl/install_zipl_cmdline.sh39
-rwxr-xr-xmodules.d/91zipl/module-setup.sh67
-rwxr-xr-xmodules.d/91zipl/parse-zipl.sh51
3 files changed, 157 insertions, 0 deletions
diff --git a/modules.d/91zipl/install_zipl_cmdline.sh b/modules.d/91zipl/install_zipl_cmdline.sh
new file mode 100755
index 0000000..9332d31
--- /dev/null
+++ b/modules.d/91zipl/install_zipl_cmdline.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+DEV="$1"
+MNT=/boot/zipl
+
+if [ -z "$DEV" ]; then
+ echo "No IPL device given"
+ : > /tmp/install.zipl.cmdline-done
+ exit 1
+fi
+
+[ -d ${MNT} ] || mkdir -p ${MNT}
+
+if ! mount -o ro "${DEV}" ${MNT}; then
+ echo "Failed to mount ${MNT}"
+ : > /tmp/install.zipl.cmdline-done
+ exit 1
+fi
+
+if [ -f ${MNT}/dracut-cmdline.conf ]; then
+ cp ${MNT}/dracut-cmdline.conf /etc/cmdline.d/99zipl.conf
+fi
+
+if [ -f ${MNT}/active_devices.txt ]; then
+ while read -r dev _ || [[ $dev ]]; do
+ [ "$dev" = "#" -o "$dev" = "" ] && continue
+ cio_ignore -r "$dev"
+ done < ${MNT}/active_devices.txt
+fi
+
+umount ${MNT}
+
+if [ -f /etc/cmdline.d/99zipl.conf ]; then
+ systemctl restart dracut-cmdline.service
+ systemctl restart systemd-udev-trigger.service
+fi
+: > /tmp/install.zipl.cmdline-done
+
+exit 0
diff --git a/modules.d/91zipl/module-setup.sh b/modules.d/91zipl/module-setup.sh
new file mode 100755
index 0000000..cb21454
--- /dev/null
+++ b/modules.d/91zipl/module-setup.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+get_boot_zipl_dev() {
+ local _boot_zipl
+ _boot_zipl=$(sed -n -e '/^[[:space:]]*#/d' -e 's/\(.*\)\w*\/boot\/zipl.*/\1/p' "$dracutsysrootdir"/etc/fstab)
+ printf "%s" "$(trim "$_boot_zipl")"
+}
+
+# called by dracut
+check() {
+ local _arch=${DRACUT_ARCH:-$(uname -m)}
+ # Only for systems on s390 using indirect booting via userland grub
+ [ "$_arch" = "s390" -o "$_arch" = "s390x" ] || return 1
+ # /boot/zipl contains a first stage kernel used to launch grub in initrd
+ [ -d /boot/zipl ] || return 1
+ return 0
+}
+
+# called by dracut
+depends() {
+ return 0
+}
+
+# called by dracut
+installkernel() {
+ local _boot_zipl
+
+ _boot_zipl=$(get_boot_zipl_dev)
+ if [ -n "$_boot_zipl" ]; then
+ eval "$(blkid -s TYPE -o udev "${_boot_zipl}")"
+ if [ -n "$ID_FS_TYPE" ]; then
+ case "$ID_FS_TYPE" in
+ ext?)
+ ID_FS_TYPE=ext4
+ ;;
+ esac
+ instmods ${ID_FS_TYPE}
+ fi
+ fi
+}
+
+# called by dracut
+cmdline() {
+ local _boot_zipl
+
+ _boot_zipl=$(get_boot_zipl_dev)
+ if [ -n "$_boot_zipl" ]; then
+ printf "%s" " rd.zipl=${_boot_zipl}"
+ fi
+}
+
+# called by dracut
+install() {
+ inst_multiple mount umount
+
+ inst_hook cmdline 91 "$moddir/parse-zipl.sh"
+ inst_script "${moddir}/install_zipl_cmdline.sh" /sbin/install_zipl_cmdline.sh
+ if [[ $hostonly_cmdline == "yes" ]]; then
+ local _zipl
+ _zipl=$(cmdline)
+
+ [[ $_zipl ]] && printf "%s\n" "$_zipl" > "${initdir}/etc/cmdline.d/91zipl.conf"
+ fi
+ dracut_need_initqueue
+}
diff --git a/modules.d/91zipl/parse-zipl.sh b/modules.d/91zipl/parse-zipl.sh
new file mode 100755
index 0000000..d95a1dd
--- /dev/null
+++ b/modules.d/91zipl/parse-zipl.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+zipl_arg=$(getarg rd.zipl)
+
+if [ -n "$zipl_arg" ]; then
+ case "$zipl_arg" in
+ LABEL=*)
+ zipl_env="ENV{ID_FS_LABEL}"
+ zipl_val=${zipl_arg#LABEL=}
+ zipl_arg="$(label_uuid_to_dev "${zipl_val}")"
+ ;;
+ UUID=*)
+ zipl_env="ENV{ID_FS_UUID}"
+ zipl_val=${zipl_arg#UUID=}
+ zipl_arg="$(label_uuid_to_dev "${zipl_val}")"
+ ;;
+ PARTLABEL=*)
+ zipl_env="ENV{ID_FS_PARTLABEL}"
+ zipl_val=${zipl_arg#PARTLABEL=}
+ zipl_arg="$(label_uuid_to_dev "${zipl_val}")"
+ ;;
+ PARTUUID=*)
+ zipl_env="ENV{ID_FS_PARTUUID}"
+ zipl_val=${zipl_arg#PARTUUID=}
+ zipl_arg="$(label_uuid_to_dev "${zipl_val}")"
+ ;;
+ /dev/mapper/*)
+ zipl_env="ENV{DM_NAME}"
+ zipl_val=${zipl_arg#/dev/mapper/}
+ ;;
+ /dev/disk/by-*)
+ zipl_env="SYMLINK"
+ zipl_val=${zipl_arg#/dev/}
+ ;;
+ /dev/*)
+ zipl_env="KERNEL"
+ zipl_val=${zipl_arg}
+ ;;
+ esac
+ if [ "$zipl_env" ]; then
+ {
+ printf 'ACTION=="add|change", SUBSYSTEM=="block", %s=="%s", ENV{SYSTEMD_READY}!="0", RUN+="/sbin/initqueue --settled --onetime --unique --name install_zipl_cmdline /sbin/install_zipl_cmdline.sh %s"\n' \
+ ${zipl_env} "${zipl_val}" "${zipl_arg}"
+ echo "[ -f /tmp/install.zipl.cmdline-done ]" > "$hookdir"/initqueue/finished/wait-zipl-conf.sh
+ } >> /etc/udev/rules.d/99zipl-conf.rules
+ cat /etc/udev/rules.d/99zipl-conf.rules
+ fi
+ wait_for_dev -n "$zipl_arg"
+fi