Harald Hoyer d9da66
From 8e7d0856d0c94e9cc0e17c2f715aa7bc715fd37d Mon Sep 17 00:00:00 2001
Harald Hoyer d9da66
From: Harald Hoyer <harald@hoyer.xyz>
Harald Hoyer d9da66
Date: Fri, 12 Jan 2018 09:34:08 +0100
Harald Hoyer d9da66
Subject: [PATCH] Merge pull request #351 from danimo/91zipl
Harald Hoyer d9da66
Harald Hoyer d9da66
Add 91zipl, which adds support for indirect booting on s390.
Harald Hoyer d9da66
---
Harald Hoyer d9da66
 dracut.cmdline.7.asc                     | 14 ++++++++
Harald Hoyer d9da66
 dracut.sh                                |  1 +
Harald Hoyer d9da66
 modules.d/91zipl/install_zipl_cmdline.sh | 40 +++++++++++++++++++++
Harald Hoyer d9da66
 modules.d/91zipl/module-setup.sh         | 61 ++++++++++++++++++++++++++++++++
Harald Hoyer d9da66
 modules.d/91zipl/parse-zipl.sh           | 41 +++++++++++++++++++++
Harald Hoyer d9da66
 5 files changed, 157 insertions(+)
Harald Hoyer d9da66
Harald Hoyer d9da66
diff --git a/dracut.cmdline.7.asc b/dracut.cmdline.7.asc
Harald Hoyer d9da66
index b5f6f0f6..f95f4d63 100644
Harald Hoyer d9da66
--- a/dracut.cmdline.7.asc
Harald Hoyer d9da66
+++ b/dracut.cmdline.7.asc
Harald Hoyer d9da66
@@ -1001,6 +1001,20 @@ be mounted read only through a higher level transient overlay directory, has
Harald Hoyer d9da66
 been implemented through the multiple lower layers feature of OverlayFS.
Harald Hoyer d9da66
 
Harald Hoyer d9da66
 
Harald Hoyer d9da66
+ZIPL
Harald Hoyer d9da66
+~~~~
Harald Hoyer d9da66
+**rd.zipl=**__<path to blockdevice>__::
Harald Hoyer d9da66
+    Update the dracut commandline with the values found in the
Harald Hoyer d9da66
+    _dracut-cmdline.conf_ file on the given device.
Harald Hoyer d9da66
+    The values are merged into the existing commandline values
Harald Hoyer d9da66
+    and the udev events are regenerated.
Harald Hoyer d9da66
++
Harald Hoyer d9da66
+[listing]
Harald Hoyer d9da66
+.Example
Harald Hoyer d9da66
+--
Harald Hoyer d9da66
+rd.zipl=UUID=0fb28157-99e3-4395-adef-da3f7d44835a
Harald Hoyer d9da66
+--
Harald Hoyer d9da66
+
Harald Hoyer d9da66
 Plymouth Boot Splash
Harald Hoyer d9da66
 ~~~~~~~~~~~~~~~~~~~~
Harald Hoyer d9da66
 **plymouth.enable=0**::
Harald Hoyer d9da66
diff --git a/dracut.sh b/dracut.sh
Harald Hoyer d9da66
index f6a75996..fb23f117 100755
Harald Hoyer d9da66
--- a/dracut.sh
Harald Hoyer d9da66
+++ b/dracut.sh
Harald Hoyer d9da66
@@ -1172,6 +1172,7 @@ if [[ $hostonly ]] && [[ "$hostonly_default_device" != "no" ]]; then
Harald Hoyer d9da66
         "/usr/lib64" \
Harald Hoyer d9da66
         "/boot" \
Harald Hoyer d9da66
         "/boot/efi" \
Harald Hoyer d9da66
+        "/boot/zipl" \
Harald Hoyer d9da66
         ;
Harald Hoyer d9da66
     do
Harald Hoyer d9da66
         mp=$(readlink -f "$mp")
Harald Hoyer d9da66
diff --git a/modules.d/91zipl/install_zipl_cmdline.sh b/modules.d/91zipl/install_zipl_cmdline.sh
Harald Hoyer d9da66
new file mode 100755
Harald Hoyer d9da66
index 00000000..b7546bef
Harald Hoyer d9da66
--- /dev/null
Harald Hoyer d9da66
+++ b/modules.d/91zipl/install_zipl_cmdline.sh
Harald Hoyer d9da66
@@ -0,0 +1,40 @@
Harald Hoyer d9da66
+#!/bin/bash
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+DEV="$1"
Harald Hoyer d9da66
+MNT=/boot/zipl
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+if [ -z "$DEV" ] ; then
Harald Hoyer d9da66
+    echo "No IPL device given"
Harald Hoyer d9da66
+    > /tmp/install.zipl.cmdline-done
Harald Hoyer d9da66
+    exit 1
Harald Hoyer d9da66
+fi
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+[ -d ${MNT} ] || mkdir -p ${MNT}
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+mount -o ro ${DEV} ${MNT}
Harald Hoyer d9da66
+if [ "$?" != "0" ] ; then
Harald Hoyer d9da66
+    echo "Failed to mount ${MNT}"
Harald Hoyer d9da66
+    > /tmp/install.zipl.cmdline-done
Harald Hoyer d9da66
+    exit 1
Harald Hoyer d9da66
+fi
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+if [ -f ${MNT}/dracut-cmdline.conf ] ; then
Harald Hoyer d9da66
+    cp ${MNT}/dracut-cmdline.conf /etc/cmdline.d/99zipl.conf
Harald Hoyer d9da66
+fi
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+if [ -f ${MNT}/active_devices.txt ] ; then
Harald Hoyer d9da66
+    while read dev etc ; do
Harald Hoyer d9da66
+        [ "$dev" = "#" -o "$dev" = "" ] && continue;
Harald Hoyer d9da66
+        cio_ignore -r $dev
Harald Hoyer d9da66
+    done < ${MNT}/active_devices.txt
Harald Hoyer d9da66
+fi
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+umount ${MNT}
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+if [ -f /etc/cmdline.d/99zipl.conf ] ; then
Harald Hoyer d9da66
+    systemctl restart dracut-cmdline.service
Harald Hoyer d9da66
+    systemctl restart systemd-udev-trigger.service
Harald Hoyer d9da66
+fi
Harald Hoyer d9da66
+> /tmp/install.zipl.cmdline-done
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+exit 0
Harald Hoyer d9da66
diff --git a/modules.d/91zipl/module-setup.sh b/modules.d/91zipl/module-setup.sh
Harald Hoyer d9da66
new file mode 100755
Harald Hoyer d9da66
index 00000000..d0cd75da
Harald Hoyer d9da66
--- /dev/null
Harald Hoyer d9da66
+++ b/modules.d/91zipl/module-setup.sh
Harald Hoyer d9da66
@@ -0,0 +1,61 @@
Harald Hoyer d9da66
+#!/bin/bash
Harald Hoyer d9da66
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
Harald Hoyer d9da66
+# ex: ts=8 sw=4 sts=4 et filetype=sh
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+# called by dracut
Harald Hoyer d9da66
+check() {
Harald Hoyer d9da66
+    local _arch=$(uname -m)
Harald Hoyer d9da66
+    # Only for systems on s390 using indirect booting via userland grub
Harald Hoyer d9da66
+    [ "$_arch" = "s390" -o "$_arch" = "s390x" ] || return 1
Harald Hoyer d9da66
+    # /boot/zipl contains a first stage kernel used to launch grub in initrd
Harald Hoyer d9da66
+    [ -d /boot/zipl ] || return 1
Harald Hoyer d9da66
+    return 0
Harald Hoyer d9da66
+}
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+# called by dracut
Harald Hoyer d9da66
+depends() {
Harald Hoyer d9da66
+    echo grub2
Harald Hoyer d9da66
+    return 0
Harald Hoyer d9da66
+}
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+# called by dracut
Harald Hoyer d9da66
+installkernel() {
Harald Hoyer d9da66
+    local _boot_zipl
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+    _boot_zipl=$(sed -n 's/\(.*\)\w*\/boot\/zipl.*/\1/p' /etc/fstab)
Harald Hoyer d9da66
+    if [ -n "$_boot_zipl" ] ; then
Harald Hoyer d9da66
+        eval $(blkid -s TYPE -o udev ${_boot_zipl})
Harald Hoyer d9da66
+        if [ -n "$ID_FS_TYPE" ] ; then
Harald Hoyer d9da66
+            case "$ID_FS_TYPE" in
Harald Hoyer d9da66
+                ext?)
Harald Hoyer d9da66
+                    ID_FS_TYPE=ext4
Harald Hoyer d9da66
+                    ;;
Harald Hoyer d9da66
+            esac
Harald Hoyer d9da66
+            instmods ${ID_FS_TYPE}
Harald Hoyer d9da66
+        fi
Harald Hoyer d9da66
+    fi
Harald Hoyer d9da66
+}
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+# called by dracut
Harald Hoyer d9da66
+cmdline() {
Harald Hoyer d9da66
+    local _boot_zipl
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+    _boot_zipl=$(sed -n 's/\(.*\)\w*\/boot\/zipl.*/\1/p' /etc/fstab)
Harald Hoyer d9da66
+    if [ -n "$_boot_zipl" ] ; then
Harald Hoyer d9da66
+        echo "rd.zipl=${_boot_zipl}"
Harald Hoyer d9da66
+    fi
Harald Hoyer d9da66
+}
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+# called by dracut
Harald Hoyer d9da66
+install() {
Harald Hoyer d9da66
+    inst_multiple mount umount
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+    inst_hook cmdline 91 "$moddir/parse-zipl.sh"
Harald Hoyer d9da66
+    inst_script "${moddir}/install_zipl_cmdline.sh" /sbin/install_zipl_cmdline.sh
Harald Hoyer d9da66
+    if [[ $hostonly_cmdline == "yes" ]] ; then
Harald Hoyer d9da66
+        local _zipl=$(cmdline)
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+        [[ $_zipl ]] && printf "%s\n" "$_zipl" > "${initdir}/etc/cmdline.d/91zipl.conf"
Harald Hoyer d9da66
+    fi
Harald Hoyer d9da66
+    dracut_need_initqueue
Harald Hoyer d9da66
+}
Harald Hoyer d9da66
diff --git a/modules.d/91zipl/parse-zipl.sh b/modules.d/91zipl/parse-zipl.sh
Harald Hoyer d9da66
new file mode 100755
Harald Hoyer d9da66
index 00000000..308f228b
Harald Hoyer d9da66
--- /dev/null
Harald Hoyer d9da66
+++ b/modules.d/91zipl/parse-zipl.sh
Harald Hoyer d9da66
@@ -0,0 +1,41 @@
Harald Hoyer d9da66
+#!/bin/sh
Harald Hoyer d9da66
+# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
Harald Hoyer d9da66
+# ex: ts=8 sw=4 sts=4 et filetype=sh
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+zipl_arg=$(getarg rd.zipl)
Harald Hoyer d9da66
+
Harald Hoyer d9da66
+if [ -n "$zipl_arg" ] ; then
Harald Hoyer d9da66
+    case "$zipl_arg" in
Harald Hoyer d9da66
+    LABEL=*) \
Harald Hoyer d9da66
+        zipl_env="ENV{ID_FS_LABEL}"
Harald Hoyer d9da66
+        zipl_val=${zipl_arg#LABEL=}
Harald Hoyer d9da66
+        zipl_arg="/dev/disk/by-label/${zipl_val}"
Harald Hoyer d9da66
+        ;;
Harald Hoyer d9da66
+    UUID=*) \
Harald Hoyer d9da66
+        zipl_env="ENV{ID_FS_UUID}"
Harald Hoyer d9da66
+        zipl_val=${zipl_arg#UUID=}
Harald Hoyer d9da66
+        zipl_arg="/dev/disk/by-uuid/${zipl_val}"
Harald Hoyer d9da66
+        ;;
Harald Hoyer d9da66
+    /dev/mapper/*) \
Harald Hoyer d9da66
+        zipl_env="ENV{DM_NAME}"
Harald Hoyer d9da66
+        zipl_val=${zipl_arg#/dev/mapper/}
Harald Hoyer d9da66
+        ;;
Harald Hoyer d9da66
+    /dev/disk/by-*) \
Harald Hoyer d9da66
+        zipl_env="SYMLINK"
Harald Hoyer d9da66
+        zipl_val=${zipl_arg#/dev/}
Harald Hoyer d9da66
+        ;;
Harald Hoyer d9da66
+    /dev/*) \
Harald Hoyer d9da66
+        zipl_env="KERNEL"
Harald Hoyer d9da66
+        zipl_val=${zipl_arg}
Harald Hoyer d9da66
+        ;;
Harald Hoyer d9da66
+    esac
Harald Hoyer d9da66
+    if [ "$zipl_env" ] ; then
Harald Hoyer d9da66
+        {
Harald Hoyer d9da66
+            printf 'ACTION=="add|change", SUBSYSTEM=="block", %s=="%s", RUN+="/sbin/initqueue --settled --onetime --unique --name install_zipl_cmdline /sbin/install_zipl_cmdline.sh %s"\n' \
Harald Hoyer d9da66
+                ${zipl_env} ${zipl_val} ${zipl_arg}
Harald Hoyer d9da66
+            echo "[ -f /tmp/install.zipl.cmdline-done ]" >$hookdir/initqueue/finished/wait-zipl-conf.sh
Harald Hoyer d9da66
+        } >> /etc/udev/rules.d/99zipl-conf.rules
Harald Hoyer d9da66
+        cat /etc/udev/rules.d/99zipl-conf.rules
Harald Hoyer d9da66
+    fi
Harald Hoyer d9da66
+    wait_for_dev -n "$zipl_arg"
Harald Hoyer d9da66
+fi
Harald Hoyer d9da66