]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
91zipl: Add new module to update s390x configuration
authorHannes Reinecke <hare@suse.de>
Fri, 27 Jun 2014 09:43:28 +0000 (11:43 +0200)
committerDaniel Molkentin <dmolkentin@suse.com>
Thu, 11 Jan 2018 10:12:39 +0000 (11:12 +0100)
Add new module to update the dracut commandline values
during booting with the values found in the file
dracut-cmdline.conf on the device specified by
rd.zipl.

Signed-off-by: Hannes Reinecke <hare@suse.de>
Contrary to the original patch, this one has been modified
to check for /boot/zipl, the location of the first stage kernel
in indirect boot, in order not to install on systems
booting directly via zipl.

Signed-off-by: Daniel Molkentin <daniel.molkentin@suse.com>
dracut.cmdline.7.asc
modules.d/91zipl/install_zipl_cmdline.sh [new file with mode: 0755]
modules.d/91zipl/module-setup.sh [new file with mode: 0755]
modules.d/91zipl/parse-zipl.sh [new file with mode: 0755]

index b5f6f0f61c6267bbc98557358a46b32057a82cf7..f95f4d639239d407b2c18be1d115fc5f6072ea51 100644 (file)
@@ -1001,6 +1001,20 @@ be mounted read only through a higher level transient overlay directory, has
 been implemented through the multiple lower layers feature of OverlayFS.
 
 
+ZIPL
+~~~~
+**rd.zipl=**__<path to blockdevice>__::
+    Update the dracut commandline with the values found in the
+    _dracut-cmdline.conf_ file on the given device.
+    The values are merged into the existing commandline values
+    and the udev events are regenerated.
++
+[listing]
+.Example
+--
+rd.zipl=UUID=0fb28157-99e3-4395-adef-da3f7d44835a
+--
+
 Plymouth Boot Splash
 ~~~~~~~~~~~~~~~~~~~~
 **plymouth.enable=0**::
diff --git a/modules.d/91zipl/install_zipl_cmdline.sh b/modules.d/91zipl/install_zipl_cmdline.sh
new file mode 100755 (executable)
index 0000000..8b454b8
--- /dev/null
@@ -0,0 +1,33 @@
+#!/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}
+
+mount -o ro ${DEV} ${MNT}
+if [ "$?" != "0" ] ; 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
+
+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 (executable)
index 0000000..07a2e6b
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/bash
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
+# ex: ts=8 sw=4 sts=4 et filetype=sh
+
+# called by dracut
+check() {
+    local _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() {
+    echo grub2
+    return 0
+}
+
+# called by dracut
+installkernel() {
+    instmods ext2
+}
+
+# called by dracut
+cmdline() {
+    local _boot_zipl
+
+    _boot_zipl=$(sed -n 's/\(.*\)\w*\/boot\/zipl.*/\1/p' /etc/fstab)
+    if [ -n "$_boot_zipl" ] ; then
+        echo "rd.zipl=${_boot_zipl}"
+    fi
+}
+
+# called by dracut
+install() {
+    inst_multiple mount umount
+
+    inst_hook cmdline 91 "$moddir/parse-zipl.sh"
+    inst "${moddir}/install_zipl_cmdline.sh" /sbin/install_zipl_cmdline.sh
+    if [[ $hostonly_cmdline == "yes" ]] ; then
+        local _zipl=$(cmdline)
+
+        [[ $_zipl ]] && printf "%s\n" "$_zipl"
+    fi
+    dracut_need_initqueue
+}
diff --git a/modules.d/91zipl/parse-zipl.sh b/modules.d/91zipl/parse-zipl.sh
new file mode 100755 (executable)
index 0000000..f8c2ca4
--- /dev/null
@@ -0,0 +1,41 @@
+#!/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="/dev/disk/by-label/${zipl_val}"
+        ;;
+    UUID=*) \
+        zipl_env="ENV{ID_FS_UUID}"
+        zipl_val=${zipl_arg#UUID=}
+        zipl_arg="/dev/disk/by-uuid/${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", RUN+="/sbin/initqueue --settled --onetime --unique /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