Merge pull request #351 from danimo/91zipl

Add 91zipl, which adds support for indirect booting on s390.
master
Harald Hoyer 2018-01-12 09:34:08 +01:00 committed by GitHub
commit 8e7d0856d0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 157 additions and 0 deletions

View 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**::

View File

@ -1172,6 +1172,7 @@ if [[ $hostonly ]] && [[ "$hostonly_default_device" != "no" ]]; then
"/usr/lib64" \
"/boot" \
"/boot/efi" \
"/boot/zipl" \
;
do
mp=$(readlink -f "$mp")

View File

@ -0,0 +1,40 @@
#!/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

if [ -f ${MNT}/active_devices.txt ] ; then
while read dev etc ; 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

View File

@ -0,0 +1,61 @@
#!/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() {
local _boot_zipl

_boot_zipl=$(sed -n 's/\(.*\)\w*\/boot\/zipl.*/\1/p' /etc/fstab)
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=$(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_script "${moddir}/install_zipl_cmdline.sh" /sbin/install_zipl_cmdline.sh
if [[ $hostonly_cmdline == "yes" ]] ; then
local _zipl=$(cmdline)

[[ $_zipl ]] && printf "%s\n" "$_zipl" > "${initdir}/etc/cmdline.d/91zipl.conf"
fi
dracut_need_initqueue
}

41
modules.d/91zipl/parse-zipl.sh Executable file
View File

@ -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 --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