diff options
-rw-r--r-- | dracut-bash-completion.sh | 2 | ||||
-rwxr-xr-x | dracut-functions.sh | 43 | ||||
-rw-r--r-- | dracut.8.asc | 3 | ||||
-rwxr-xr-x | dracut.sh | 47 | ||||
-rwxr-xr-x | modules.d/90crypt/module-setup.sh | 34 | ||||
-rwxr-xr-x | modules.d/90dmraid/module-setup.sh | 31 | ||||
-rwxr-xr-x | modules.d/90lvm/module-setup.sh | 51 | ||||
-rwxr-xr-x | modules.d/90mdraid/module-setup.sh | 44 | ||||
-rwxr-xr-x | modules.d/95rootfs-block/module-setup.sh | 9 |
9 files changed, 169 insertions, 95 deletions
diff --git a/dracut-bash-completion.sh b/dracut-bash-completion.sh index 0f45f16e..66b9bc9f 100644 --- a/dracut-bash-completion.sh +++ b/dracut-bash-completion.sh @@ -34,7 +34,7 @@ _dracut() { --local --hostonly --no-hostonly --fstab --help --bzip2 --lzma --xz --no-compress --gzip --list-modules --show-modules --keep --printsize --regenerate-all --noimageifnotneeded --early-microcode - --no-early-microcode' + --no-early-microcode --print-cmdline' [ARG]='-a -m -o -d -I -k -c -L --kver --add --force-add --add-drivers --omit-drivers --modules --omit --drivers --filesystems --install diff --git a/dracut-functions.sh b/dracut-functions.sh index 7ee45877..1a73e603 100755 --- a/dracut-functions.sh +++ b/dracut-functions.sh @@ -304,6 +304,7 @@ get_persistent_dev() { [ -z "$_dev" ] && return for i in /dev/mapper/* /dev/disk/by-uuid/* /dev/disk/by-id/*; do + [[ $i == /dev/mapper/control ]] && continue [[ $i == /dev/mapper/mpath* ]] && continue _tmp=$(get_maj_min "$i") if [ "$_tmp" = "$_dev" ]; then @@ -584,6 +585,7 @@ for_each_host_dev_and_slaves() check_vol_slaves() { local _lv _vg _pv for i in /dev/mapper/*; do + [[ $i == /dev/mapper/control ]] && continue _lv=$(get_maj_min $i) if [[ $_lv = $2 ]]; then _vg=$(lvm lvs --noheadings -o vg_name $i 2>/dev/null) @@ -978,14 +980,14 @@ module_check() { $_moddir/check $hostonly _ret=$? else - unset check depends install installkernel + unset check depends cmdline install installkernel check() { true; } . $_moddir/module-setup.sh is_func check || return 0 [ $_forced -ne 0 ] && unset hostonly check $hostonly _ret=$? - unset check depends install installkernel + unset check depends cmdline install installkernel fi hostonly=$_hostonly return $_ret @@ -1006,12 +1008,12 @@ module_check_mount() { mount_needs=1 $_moddir/check 0 _ret=$? else - unset check depends install installkernel + unset check depends cmdline install installkernel check() { false; } . $_moddir/module-setup.sh check 0 _ret=$? - unset check depends install installkernel + unset check depends cmdline install installkernel fi unset mount_needs return $_ret @@ -1030,12 +1032,33 @@ module_depends() { $_moddir/check -d return $? else - unset check depends install installkernel + unset check depends cmdline install installkernel depends() { true; } . $_moddir/module-setup.sh depends _ret=$? - unset check depends install installkernel + unset check depends cmdline install installkernel + return $_ret + fi +} + +# module_cmdline <dracut module> +# execute the cmdline() function of module-setup.sh of <dracut module> +# or the "cmdline" script, if module-setup.sh is not found +module_cmdline() { + local _moddir=$(echo ${dracutbasedir}/modules.d/??${1}) + local _ret + [[ -d $_moddir ]] || return 1 + if [[ ! -f $_moddir/module-setup.sh ]]; then + [[ -x $_moddir/cmdline ]] && . "$_moddir/cmdline" + return $? + else + unset check depends cmdline install installkernel + cmdline() { true; } + . $_moddir/module-setup.sh + cmdline + _ret=$? + unset check depends cmdline install installkernel return $_ret fi } @@ -1051,12 +1074,12 @@ module_install() { [[ -x $_moddir/install ]] && . "$_moddir/install" return $? else - unset check depends install installkernel + unset check depends cmdline install installkernel install() { true; } . $_moddir/module-setup.sh install _ret=$? - unset check depends install installkernel + unset check depends cmdline install installkernel return $_ret fi } @@ -1072,12 +1095,12 @@ module_installkernel() { [[ -x $_moddir/installkernel ]] && . "$_moddir/installkernel" return $? else - unset check depends install installkernel + unset check depends cmdline install installkernel installkernel() { true; } . $_moddir/module-setup.sh installkernel _ret=$? - unset check depends install installkernel + unset check depends cmdline install installkernel return $_ret fi } diff --git a/dracut.8.asc b/dracut.8.asc index f5199b06..08af94ef 100644 --- a/dracut.8.asc +++ b/dracut.8.asc @@ -225,6 +225,9 @@ example: **--no-kernel**:: do not install kernel drivers and firmware files +**--print-cmdline**:: + print the kernel command line for the current disk layout + **--mdadmconf**:: include local _/etc/mdadm.conf_ @@ -91,6 +91,7 @@ Creates initial ramdisk images for preloading modules firmwares, separated by : --kernel-only Only install kernel drivers and firmware files --no-kernel Do not install kernel drivers and firmware files + --print-cmdline Print the kernel command line for the given disk layout --early-microcode Combine early microcode with ramdisk --no-early-microcode Do not combine early microcode with ramdisk --kernel-cmdline [PARAMETERS] Specify default kernel command line parameters @@ -306,6 +307,7 @@ TEMP=$(unset POSIXLY_CORRECT; getopt \ --long force \ --long kernel-only \ --long no-kernel \ + --long print-cmdline \ --long kernel-cmdline: \ --long strip \ --long nostrip \ @@ -380,6 +382,7 @@ while :; do -f|--force) force=yes;; --kernel-only) kernel_only="yes"; no_kernel="no";; --no-kernel) kernel_only="no"; no_kernel="yes";; + --print-cmdline) print_cmdline="yes"; hostonly_l="yes"; kernel_only="yes"; no_kernel="yes";; --early-microcode) early_microcode="yes";; --no-early-microcode) early_microcode="no";; --strip) do_strip_l="yes";; @@ -712,12 +715,14 @@ else exit 1 fi -inst /bin/sh -if ! $DRACUT_INSTALL ${initdir+-D "$initdir"} -R "$initdir/bin/sh" &>/dev/null; then - unset DRACUT_RESOLVE_LAZY - export DRACUT_RESOLVE_DEPS=1 +if ! [[ $print_cmdline ]]; then + inst /bin/sh + if ! $DRACUT_INSTALL ${initdir+-D "$initdir"} -R "$initdir/bin/sh" &>/dev/null; then + unset DRACUT_RESOLVE_LAZY + export DRACUT_RESOLVE_DEPS=1 + fi + rm -fr -- ${initdir}/* fi -rm -fr -- ${initdir}/* if [[ -f $dracutbasedir/dracut-version.sh ]]; then . $dracutbasedir/dracut-version.sh @@ -799,7 +804,7 @@ if [[ -d $srcmods ]]; then } fi -if [[ -f $outfile && ! $force ]]; then +if [[ -f $outfile && ! $force && ! $print_cmdline ]]; then dfatal "Will not override existing initramfs ($outfile) without --force" exit 1 fi @@ -904,7 +909,7 @@ if [[ $hostonly ]]; then [[ $_mapper = \#* ]] && continue [[ "$_d" -ef /dev/mapper/"$_mapper" ]] || continue [[ "$_o" ]] || _o="$_p" - # skip mkswap swap + # skip mkswap swap [[ $_o == *swap* ]] && continue 2 done < /etc/crypttab fi @@ -988,6 +993,26 @@ export initdir dracutbasedir dracutmodules \ DRACUT_VERSION udevdir prefix filesystems drivers \ systemdutildir systemdsystemunitdir systemdsystemconfdir +mods_to_load="" +# check all our modules to see if they should be sourced. +# This builds a list of modules that we will install next. +for_each_module_dir check_module +for_each_module_dir check_mount + +[[ "$mods_to_load " == *01fips\ * ]] && export DRACUT_FIPS_MODE=1 + +if [[ $print_cmdline ]]; then + modules_loaded=" " + # source our modules. + for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do + _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]} + module_cmdline "$_d_mod" + done + unset moddir + printf "\n" + exit 0 +fi + # Create some directory structure first [[ $prefix ]] && mkdir -m 0755 -p "${initdir}${prefix}" @@ -1045,14 +1070,6 @@ if [[ $kernel_only != yes ]]; then fi fi -mods_to_load="" -# check all our modules to see if they should be sourced. -# This builds a list of modules that we will install next. -for_each_module_dir check_module -for_each_module_dir check_mount - -[[ "$mods_to_load " == *01fips\ * ]] && export DRACUT_FIPS_MODE=1 - _isize=0 #initramfs size modules_loaded=" " # source our modules. diff --git a/modules.d/90crypt/module-setup.sh b/modules.d/90crypt/module-setup.sh index bb014b98..67bc83d6 100755 --- a/modules.d/90crypt/module-setup.sh +++ b/modules.d/90crypt/module-setup.sh @@ -26,25 +26,27 @@ installkernel() { instmods dm_crypt =crypto } -install() { - - check_crypt() { - local dev=$1 fs=$2 UUID - - [[ $fs = "crypto_LUKS" ]] || return 1 - UUID=$(blkid -u crypto -o export $dev \ - | while read line; do +cmdline() { + local dev UUID + for dev in "${!host_fs_types[@]}"; do + [[ "${host_fs_types[$dev]}" != "crypto_LUKS" ]] && continue + + UUID=$( + blkid -u crypto -o export $dev \ + | while read line; do [[ ${line#UUID} = $line ]] && continue printf "%s" "${line#UUID=}" break - done) - [[ ${UUID} ]] || return 1 - if ! [[ $kernel_only ]]; then - echo " rd.luks.uuid=luks-${UUID} " >> "${initdir}/etc/cmdline.d/90crypt.conf" - fi - return 0 - } + done + ) + [[ ${UUID} ]] || continue + printf "%s" " rd.luks.uuid=luks-${UUID}" + done +} + +install() { + cmdline >> "${initdir}/etc/cmdline.d/90crypt.conf" inst_multiple cryptsetup rmdir readlink umount inst_script "$moddir"/cryptroot-ask.sh /sbin/cryptroot-ask @@ -74,8 +76,6 @@ install() { done < /etc/crypttab > $initdir/etc/crypttab fi - for_each_host_dev_fs check_crypt - inst_simple "$moddir/crypt-lib.sh" "/lib/dracut-crypt-lib.sh" inst_multiple -o \ diff --git a/modules.d/90dmraid/module-setup.sh b/modules.d/90dmraid/module-setup.sh index 87465d93..b93db8f7 100755 --- a/modules.d/90dmraid/module-setup.sh +++ b/modules.d/90dmraid/module-setup.sh @@ -23,13 +23,13 @@ depends() { return 0 } -install() { - local _i - - check_dmraid() { - local dev=$1 fs=$2 holder DEVPATH DM_NAME majmin - [[ "$fs" != *_raid_member ]] && return 1 +cmdline() { + local _activated + declare -A _activated + for dev in "${!host_fs_types[@]}"; do + local holder DEVPATH DM_NAME majmin + [[ "${host_fs_types[$dev]}" != *_raid_member ]] && continue majmin=$(get_maj_min $dev) DEVPATH=$( @@ -45,18 +45,23 @@ install() { for holder in "$DEVPATH"/holders/*; do [[ -e "$holder" ]] || continue dev="/dev/${holder##*/}" - DM_NAME="$(/usr/sbin/dmsetup info -c --noheadings -o name "$dev" 2>/dev/null)" + DM_NAME="$(dmsetup info -c --noheadings -o name "$dev" 2>/dev/null)" [[ ${DM_NAME} ]] && break done - [[ ${DM_NAME} ]] || return 1 - if ! [[ $kernel_only ]]; then - echo " rd.dm.uuid=${DM_NAME} " >> "${initdir}/etc/cmdline.d/90dmraid.conf" + [[ ${DM_NAME} ]] || continue + + if ! [[ ${_activated[${DM_NAME}]} ]]; then + printf "%s" " rd.dm.uuid=${DM_NAME}" + _activated["${DM_NAME}"]=1 fi - return 0 - } + done +} + +install() { + local _i - for_each_host_dev_fs check_dmraid + cmdline >> "${initdir}/etc/cmdline.d/90dmraid.conf" inst_multiple dmraid inst_multiple -o kpartx diff --git a/modules.d/90lvm/module-setup.sh b/modules.d/90lvm/module-setup.sh index 4b774c9c..69250393 100755 --- a/modules.d/90lvm/module-setup.sh +++ b/modules.d/90lvm/module-setup.sh @@ -22,29 +22,42 @@ depends() { return 0 } -install() { - local _i - local _needthin +get_host_lvs() { local _activated - inst lvm - - check_lvm() { - local DM_VG_NAME DM_LV_NAME - - eval $(/usr/sbin/dmsetup splitname --nameprefixes --noheadings --rows $1 2>/dev/null) + declare -A _activated + + for dev in "${!host_fs_types[@]}"; do + [ -e /sys/block/${dev#/dev/}/dm/name ] || continue + [ -e /sys/block/${dev#/dev/}/dm/uuid ] || continue + uuid=$(</sys/block/${dev#/dev/}/dm/uuid) + [[ "${uuid#LVM-}" == "$uuid" ]] && continue + dev=$(</sys/block/${dev#/dev/}/dm/name) + eval $(dmsetup splitname --nameprefixes --noheadings --rows "$dev" 2>/dev/null) [[ ${DM_VG_NAME} ]] && [[ ${DM_LV_NAME} ]] || return 1 - if ! [[ " ${_activated[*]} " == *\ ${DM_VG_NAME}/${DM_LV_NAME}\ * ]]; then - echo " rd.lvm.lv=${DM_VG_NAME}/${DM_LV_NAME} " >> "${initdir}/etc/cmdline.d/90lvm.conf" - push _activated "${DM_VG_NAME}/${DM_LV_NAME}" - fi - if ! [[ $_needthin ]]; then - [[ $(lvs --noheadings -o segtype ${DM_VG_NAME} 2>/dev/null) == *thin* ]] && _needthin=1 + if ! [[ ${_activated[${DM_VG_NAME}/${DM_LV_NAME}]} ]]; then + printf "%s\n" "${DM_VG_NAME}/${DM_LV_NAME} " + _activated["${DM_VG_NAME}/${DM_LV_NAME}"]=1 fi + done +} - return 0 - } +cmdline() { + get_host_lvs | while read line; do + printf " rd.lvm.lv=$line" + done +} + +install() { + local _i _needthin - for_each_host_dev_fs check_lvm + inst lvm + + get_host_lvs | while read line; do + printf "%s" " rd.lvm.lv=$line" + if ! [[ $_needthin ]]; then + [[ "$(lvs --noheadings -o segtype ${line%%/*} 2>/dev/null)" == *thin* ]] && _needthin=1 + fi + done >> "${initdir}/etc/cmdline.d/90lvm.conf" inst_rules "$moddir/64-lvm.rules" @@ -81,7 +94,7 @@ install() { inst_libdir_file "libdevmapper-event-lvm*.so" if [[ $_needthin ]]; then - inst_multiple -o thin_dump thin_restore thin_check + inst_multiple -o thin_dump thin_restore thin_check thin_repair fi } diff --git a/modules.d/90mdraid/module-setup.sh b/modules.d/90mdraid/module-setup.sh index b44ce50b..2fe4074d 100755 --- a/modules.d/90mdraid/module-setup.sh +++ b/modules.d/90mdraid/module-setup.sh @@ -26,32 +26,36 @@ installkernel() { instmods =drivers/md } +cmdline() { + local _activated dev line UUID + declare -A _activated + + for dev in "${!host_fs_types[@]}"; do + [[ "${host_fs_types[$dev]}" != *_raid_member ]] && continue + + UUID=$( + /sbin/mdadm --examine --export $dev \ + | while read line; do + [[ ${line#MD_UUID=} = $line ]] && continue + printf "%s" "${line#MD_UUID=} " + done + ) + + if ! [[ ${_activated[${UUID}]} ]]; then + printf "%s" " rd.md.uuid=${UUID}" + _activated["${UUID}"]=1 + fi + + done +} + install() { inst_multiple cat inst_multiple -o mdmon inst $(command -v partx) /sbin/partx inst $(command -v mdadm) /sbin/mdadm - check_mdraid() { - local dev=$1 fs=$2 holder DEVPATH MD_UUID - [[ "$fs" != *_raid_member ]] && return 1 - - MD_UUID=$(/sbin/mdadm --examine --export $dev \ - | while read line; do - [[ ${line#MD_UUID} = $line ]] && continue - eval "$line" - echo $MD_UUID - break - done) - - [[ ${MD_UUID} ]] || return 1 - if ! [[ $kernel_only ]]; then - echo " rd.md.uuid=${MD_UUID} " >> "${initdir}/etc/cmdline.d/90mdraid.conf" - fi - return 0 - } - - for_each_host_dev_fs check_mdraid + cmdline >> "${initdir}/etc/cmdline.d/90mdraid.conf" inst_rules 64-md-raid.rules # remove incremental assembly from stock rules, so they don't shadow diff --git a/modules.d/95rootfs-block/module-setup.sh b/modules.d/95rootfs-block/module-setup.sh index 32eec4a4..6792f1d3 100755 --- a/modules.d/95rootfs-block/module-setup.sh +++ b/modules.d/95rootfs-block/module-setup.sh @@ -10,6 +10,15 @@ depends() { echo fs-lib } +cmdline() { + local dev=/dev/block/$(find_root_block_device) + if [ -e $dev ]; then + printf " root=%s" $(get_persistent_dev "$dev") + printf " rootflags=%s" $(find_mp_fsopts /) + printf " rootfstype=%s" $(find_mp_fstype /) + fi +} + install() { if [[ $hostonly ]]; then |