X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=dracut.sh;h=2cce85b47a8bd638bdfc7dea0c35e551a3d0ff93;hb=80626ded3e849ba840ddd64c1713be5abb1c7449;hp=e43227e834092a2c8e49d600525be85b0333fc4c;hpb=d8b04dc1840047a7533d19f577f30f19d42e2d33;p=thirdparty%2Fdracut.git diff --git a/dracut.sh b/dracut.sh index e43227e83..2cce85b47 100755 --- a/dracut.sh +++ b/dracut.sh @@ -70,6 +70,7 @@ Creates initial ramdisk images for preloading modules --kver [VERSION] Set kernel version to [VERSION]. -f, --force Overwrite existing initramfs file. -a, --add [LIST] Add a space-separated list of dracut modules. + --rebuild Append arguments to those of existing image and rebuild -m, --modules [LIST] Specify a space-separated list of dracut modules to call when building the initramfs. Modules are located in /usr/lib/dracut/modules.d. @@ -136,6 +137,10 @@ Creates initial ramdisk images for preloading modules -H, --hostonly Host-Only mode: Install only what is needed for booting the local host instead of a generic host. -N, --no-hostonly Disables Host-Only mode + --hostonly-cmdline Store kernel command line arguments needed + in the initramfs + --no-hostonly-cmdline Do not store kernel command line arguments needed + in the initramfs --persistent-policy [POLICY] Use [POLICY] to address disks and partitions. POLICY can be any directory name found in /dev/disk. @@ -153,6 +158,8 @@ Creates initial ramdisk images for preloading modules in the final initramfs. -I, --install [LIST] Install the space separated list of files into the initramfs. + --install-optional [LIST] Install the space separated list of files into the + initramfs, if they exist. --gzip Compress the generated initramfs using gzip. This will be done by default, unless another compression option or --no-compress is passed. @@ -165,6 +172,12 @@ Creates initial ramdisk images for preloading modules --xz Compress the generated initramfs using xz. Make sure that your kernel has xz support compiled in, otherwise you will not be able to boot. + --lzo Compress the generated initramfs using lzop. + Make sure that your kernel has lzo support compiled + in, otherwise you will not be able to boot. + --lz4 Compress the generated initramfs using lz4. + Make sure that your kernel has lz4 support compiled + in, otherwise you will not be able to boot. --compress [COMPRESSION] Compress the generated initramfs with the passed compression program. Make sure your kernel knows how to decompress the generated initramfs, @@ -177,6 +190,8 @@ Creates initial ramdisk images for preloading modules --keep Keep the temporary initramfs for debugging purposes --printsize Print out the module install size --sshkey [SSHKEY] Add ssh key to initramfs (use with ssh-client module) + --logfile [FILE] Logfile to use (overrides configuration setting) + --reproducible Create reproducible images If [LIST] has multiple arguments, then you have to put these in quotes. @@ -272,130 +287,227 @@ dropindirs_sort() } } +rearrange_params() +{ + # Workaround -i, --include taking 2 arguments + set -- "${@/--include/++include}" + + # This prevents any long argument ending with "-i" + # -i, like --opt-i but I think we can just prevent that + set -- "${@/%-i/++include}" + + TEMP=$(unset POSIXLY_CORRECT; getopt \ + -o "a:m:o:d:I:k:c:L:fvqlHhMN" \ + --long kver: \ + --long add: \ + --long force-add: \ + --long add-drivers: \ + --long omit-drivers: \ + --long modules: \ + --long omit: \ + --long drivers: \ + --long filesystems: \ + --long install: \ + --long install-optional: \ + --long fwdir: \ + --long libdirs: \ + --long fscks: \ + --long add-fstab: \ + --long mount: \ + --long device: \ + --long add-device: \ + --long nofscks: \ + --long ro-mnt \ + --long kmoddir: \ + --long conf: \ + --long confdir: \ + --long tmpdir: \ + --long stdlog: \ + --long compress: \ + --long prefix: \ + --long rebuild: \ + --long force \ + --long kernel-only \ + --long no-kernel \ + --long print-cmdline \ + --long kernel-cmdline: \ + --long strip \ + --long nostrip \ + --long prelink \ + --long noprelink \ + --long hardlink \ + --long nohardlink \ + --long noprefix \ + --long mdadmconf \ + --long nomdadmconf \ + --long lvmconf \ + --long nolvmconf \ + --long debug \ + --long profile \ + --long sshkey: \ + --long logfile: \ + --long verbose \ + --long quiet \ + --long local \ + --long hostonly \ + --long host-only \ + --long no-hostonly \ + --long no-host-only \ + --long hostonly-cmdline \ + --long no-hostonly-cmdline \ + --long persistent-policy: \ + --long fstab \ + --long help \ + --long bzip2 \ + --long lzma \ + --long xz \ + --long lzo \ + --long lz4 \ + --long no-compress \ + --long gzip \ + --long list-modules \ + --long show-modules \ + --long keep \ + --long printsize \ + --long regenerate-all \ + --long noimageifnotneeded \ + --long early-microcode \ + --long no-early-microcode \ + --long reproducible \ + -- "$@") + + if (( $? != 0 )); then + usage + exit 1 + fi +} + verbosity_mod_l=0 unset kernel unset outfile -# Workaround -i, --include taking 2 arguments -set -- "${@/--include/++include}" - -# This prevents any long argument ending with "-i" -# -i, like --opt-i but I think we can just prevent that -set -- "${@/%-i/++include}" - -TEMP=$(unset POSIXLY_CORRECT; getopt \ - -o "a:m:o:d:I:k:c:L:fvqlHhMN" \ - --long kver: \ - --long add: \ - --long force-add: \ - --long add-drivers: \ - --long omit-drivers: \ - --long modules: \ - --long omit: \ - --long drivers: \ - --long filesystems: \ - --long install: \ - --long fwdir: \ - --long libdirs: \ - --long fscks: \ - --long add-fstab: \ - --long mount: \ - --long device: \ - --long nofscks: \ - --long ro-mnt \ - --long kmoddir: \ - --long conf: \ - --long confdir: \ - --long tmpdir: \ - --long stdlog: \ - --long compress: \ - --long prefix: \ - --long force \ - --long kernel-only \ - --long no-kernel \ - --long print-cmdline \ - --long kernel-cmdline: \ - --long strip \ - --long nostrip \ - --long prelink \ - --long noprelink \ - --long hardlink \ - --long nohardlink \ - --long noprefix \ - --long mdadmconf \ - --long nomdadmconf \ - --long lvmconf \ - --long nolvmconf \ - --long debug \ - --long profile \ - --long sshkey: \ - --long verbose \ - --long quiet \ - --long local \ - --long hostonly \ - --long host-only \ - --long no-hostonly \ - --long no-host-only \ - --long persistent-policy: \ - --long fstab \ - --long help \ - --long bzip2 \ - --long lzma \ - --long xz \ - --long no-compress \ - --long gzip \ - --long list-modules \ - --long show-modules \ - --long keep \ - --long printsize \ - --long regenerate-all \ - --long noimageifnotneeded \ - --long early-microcode \ - --long no-early-microcode \ - -- "$@") - -if (( $? != 0 )); then - usage - exit 1 +rearrange_params "$@" +eval set -- "$TEMP" + +# parse command line args to check if '--rebuild' option is present +unset append_args_l +unset rebuild_file +while : +do + if [ "$1" == "--" ]; then + shift; break + fi + if [ "$1" == "--rebuild" ]; then + append_args_l="yes" + rebuild_file=$2 + if [ ! -e $rebuild_file ]; then + echo "Image file '$rebuild_file', for rebuild, does not exist!" + exit 1 + fi + abs_rebuild_file=$(readlink -f "$rebuild_file") && rebuild_file="$abs_rebuild_file" + shift; continue + fi + shift +done + +# get output file name and kernel version from command line arguments +while (($# > 0)); do + case ${1%%=*} in + ++include) + shift 2;; + *) + if ! [[ ${outfile+x} ]]; then + outfile=$1 + elif ! [[ ${kernel+x} ]]; then + kernel=$1 + else + printf "\nUnknown arguments: %s\n\n" "$*" >&2 + usage; exit 1; + fi + ;; + esac + shift +done + +# extract input image file provided with rebuild option to get previous parameters, if any +if [[ $append_args_l == "yes" ]]; then + unset rebuild_param + + # determine resultant file + if ! [[ $outfile ]]; then + outfile=$rebuild_file + fi + + if ! rebuild_param=$(lsinitrd $rebuild_file '*lib/dracut/build-parameter.txt'); then + echo "Image '$rebuild_file' has no rebuild information stored" + exit 1 + fi + + # prepend previous parameters to current command line args + if [[ $rebuild_param ]]; then + TEMP="$rebuild_param $TEMP" + eval set -- "$TEMP" + rearrange_params "$@" + fi + + # clean the temporarily used scratch-pad directory + rm -rf $scratch_dir fi +unset PARMS_TO_STORE +PARMS_TO_STORE="" + eval set -- "$TEMP" while :; do + if [ $1 != "--" ] && [ $1 != "--rebuild" ]; then + PARMS_TO_STORE+=" $1"; + fi case $1 in - --kver) kernel="$2"; shift;; - -a|--add) push add_dracutmodules_l "$2"; shift;; - --force-add) push force_add_dracutmodules_l "$2"; shift;; - --add-drivers) push add_drivers_l "$2"; shift;; - --omit-drivers) push omit_drivers_l "$2"; shift;; - -m|--modules) push dracutmodules_l "$2"; shift;; - -o|--omit) push omit_dracutmodules_l "$2"; shift;; - -d|--drivers) push drivers_l "$2"; shift;; - --filesystems) push filesystems_l "$2"; shift;; - -I|--install) push install_items_l "$2"; shift;; - --fwdir) push fw_dir_l "$2"; shift;; - --libdirs) push libdirs_l "$2"; shift;; - --fscks) push fscks_l "$2"; shift;; - --add-fstab) push add_fstab_l "$2"; shift;; - --mount) push fstab_lines "$2"; shift;; + --kver) kernel="$2"; PARMS_TO_STORE+=" '$2'"; shift;; + -a|--add) push add_dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;; + --force-add) push force_add_dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;; + --add-drivers) push add_drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;; + --omit-drivers) push omit_drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;; + -m|--modules) push dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;; + -o|--omit) push omit_dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;; + -d|--drivers) push drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;; + --filesystems) push filesystems_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;; + -I|--install) push install_items_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;; + --install-optional) + push install_optional_items_l \ + "$2"; PARMS_TO_STORE+=" '$2'"; shift;; + --fwdir) push fw_dir_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;; + --libdirs) push libdirs_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;; + --fscks) push fscks_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;; + --add-fstab) push add_fstab_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;; + --mount) push fstab_lines "$2"; PARMS_TO_STORE+=" '$2'"; shift;; --add-device|--device) - push add_device_l "$2"; shift;; - --kernel-cmdline) push kernel_cmdline_l "$2"; shift;; + push add_device_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;; + --kernel-cmdline) push kernel_cmdline_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;; --nofscks) nofscks_l="yes";; --ro-mnt) ro_mnt_l="yes";; - -k|--kmoddir) drivers_dir_l="$2"; shift;; - -c|--conf) conffile="$2"; shift;; - --confdir) confdir="$2"; shift;; - --tmpdir) tmpdir_l="$2"; shift;; - -L|--stdlog) stdloglvl_l="$2"; shift;; - --compress) compress_l="$2"; shift;; - --prefix) prefix_l="$2"; shift;; + -k|--kmoddir) drivers_dir_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;; + -c|--conf) conffile="$2"; PARMS_TO_STORE+=" '$2'"; shift;; + --confdir) confdir="$2"; PARMS_TO_STORE+=" '$2'"; shift;; + --tmpdir) tmpdir_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;; + -L|--stdlog) stdloglvl_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;; + --compress) compress_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;; + --prefix) prefix_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;; + --rebuild) if [ $rebuild_file == $outfile ]; then + force=yes + fi + shift + ;; -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_l="yes";; - --no-early-microcode) early_microcode_l="no";; + --print-cmdline) + print_cmdline="yes"; hostonly_l="yes"; kernel_only="yes"; no_kernel="yes";; + --early-microcode) + early_microcode_l="yes";; + --no-early-microcode) + early_microcode_l="no";; --strip) do_strip_l="yes";; --nostrip) do_strip_l="no";; --prelink) do_prelink_l="yes";; @@ -409,7 +521,8 @@ while :; do --nolvmconf) lvmconf_l="no";; --debug) debug="yes";; --profile) profile="yes";; - --sshkey) sshkey="$2"; shift;; + --sshkey) sshkey="$2"; PARMS_TO_STORE+=" '$2'"; shift;; + --logfile) logfile_l="$2"; shift;; -v|--verbose) ((verbosity_mod_l++));; -q|--quiet) ((verbosity_mod_l--));; -l|--local) @@ -421,15 +534,21 @@ while :; do hostonly_l="yes" ;; -N|--no-hostonly|--no-host-only) hostonly_l="no" ;; + --hostonly-cmdline) + hostonly_cmdline_l="yes" ;; + --no-hostonly-cmdline) + hostonly_cmdline_l="no" ;; --persistent-policy) - persistent_policy_l="$2"; shift;; + persistent_policy_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;; --fstab) use_fstab_l="yes" ;; -h|--help) long_usage; exit 1 ;; - -i|--include) push include_src "$2" + -i|--include) push include_src "$2"; PARMS_TO_STORE+=" '$2'"; shift;; --bzip2) compress_l="bzip2";; --lzma) compress_l="lzma";; --xz) compress_l="xz";; + --lzo) compress_l="lzo";; + --lz4) compress_l="lz4";; --no-compress) _no_compress_l="cat";; --gzip) compress_l="gzip";; --list-modules) do_list="yes";; @@ -440,7 +559,7 @@ while :; do --printsize) printsize="yes";; --regenerate-all) regenerate_all="yes";; --noimageifnotneeded) noimageifnotneeded="yes";; - + --reproducible) reproducible_l="yes";; --) shift; break;; *) # should not even reach this point @@ -453,21 +572,12 @@ done # the old fashioned way while (($# > 0)); do - case ${1%%=*} in - ++include) push include_src "$2" - push include_target "$3" - shift 2;; - *) - if ! [[ ${outfile+x} ]]; then - outfile=$1 - elif ! [[ ${kernel+x} ]]; then - kernel=$1 - else - printf "\nUnknown arguments: %s\n\n" "$*" >&2 - usage; exit 1; - fi - ;; - esac + if [ "${1%%=*}" == "++include" ]; then + push include_src "$2" + push include_target "$3" + PARMS_TO_STORE+=" --include '$2' '$3'" + shift 2 + fi shift done @@ -491,22 +601,23 @@ if [[ $regenerate_all == "yes" ]]; then cd /lib/modules for i in *; do - [[ -f $i/modules.builtin ]] || continue + [[ -f $i/modules.dep ]] || [[ -f $i/modules.dep.bin ]] || continue dracut --kver="$i" "${dracut_args[@]}" ((ret+=$?)) done exit $ret -elif [[ $kernel ]]; then - if ! [[ -d /lib/modules/$kernel ]] && [[ $no_kernel != yes ]]; then - printf -- "Kernel version $kernel has no modules in /lib/modules/$kernel\n" >&2 - exit 1 - fi fi if ! [[ $kernel ]]; then kernel=$(uname -r) fi +if [[ $kernel ]]; then + if ! [[ -d /lib/modules/$kernel ]] && [[ $no_kernel != yes ]]; then + printf -- "Kernel version $kernel has no module directory /lib/modules/$kernel\n" >&2 + fi +fi + if ! [[ $outfile ]]; then [[ -f /etc/machine-id ]] && read MACHINE_ID < /etc/machine-id @@ -517,22 +628,12 @@ if ! [[ $outfile ]]; then fi fi -for i in /usr/sbin /sbin /usr/bin /bin; do - rl=$i - if [ -L "$i" ]; then - rl=$(readlink -f $i) - fi - if [[ "$NPATH" != "*:$rl*" ]] ; then - NPATH+=":$rl" - fi -done -export PATH="${NPATH#:}" unset LC_MESSAGES unset LC_CTYPE export LC_ALL=C export LANG=C -unset NPATH unset LD_LIBRARY_PATH +unset LD_PRELOAD unset GREP_OPTIONS export DRACUT_LOG_LEVEL=warning @@ -575,6 +676,20 @@ for f in $(dropindirs_sort ".conf" "$confdir" "$dracutbasedir/dracut.conf.d"); d [[ -e $f ]] && . "$f" done +DRACUT_PATH=${DRACUT_PATH:-/usr/sbin /sbin /usr/bin /bin} + +for i in $DRACUT_PATH; do + rl=$i + if [ -L "$i" ]; then + rl=$(readlink -f $i) + fi + if [[ "$NPATH" != *:$rl* ]] ; then + NPATH+=":$rl" + fi +done +export PATH="${NPATH#:}" +unset NPATH + # these optins add to the stuff in the config file if (( ${#add_dracutmodules_l[@]} )); then while pop add_dracutmodules_l val; do @@ -612,6 +727,12 @@ if (( ${#install_items_l[@]} )); then done fi +if (( ${#install_optional_items_l[@]} )); then + while pop install_optional_items_l val; do + install_optional_items+=" $val " + done +fi + # these options override the stuff in the config file if (( ${#dracutmodules_l[@]} )); then dracutmodules='' @@ -664,6 +785,8 @@ stdloglvl=$((stdloglvl + verbosity_mod_l)) [[ $prefix_l ]] && prefix=$prefix_l [[ $prefix = "/" ]] && unset prefix [[ $hostonly_l ]] && hostonly=$hostonly_l +[[ $hostonly_cmdline_l ]] && hostonly_cmdline=$hostonly_cmdline_l +[[ "$hostonly" == "yes" ]] && ! [[ $hostonly_cmdline ]] && hostonly_cmdline="yes" [[ $persistent_policy_l ]] && persistent_policy=$persistent_policy_l [[ $use_fstab_l ]] && use_fstab=$use_fstab_l [[ $mdadmconf_l ]] && mdadmconf=$mdadmconf_l @@ -672,12 +795,16 @@ stdloglvl=$((stdloglvl + verbosity_mod_l)) [[ $fw_dir ]] || fw_dir="/lib/firmware/updates /lib/firmware" [[ $tmpdir_l ]] && tmpdir="$tmpdir_l" [[ $tmpdir ]] || tmpdir=/var/tmp +[[ $INITRD_COMPRESS ]] && compress=$INITRD_COMPRESS [[ $compress_l ]] && compress=$compress_l [[ $show_modules_l ]] && show_modules=$show_modules_l [[ $nofscks_l ]] && nofscks="yes" [[ $ro_mnt_l ]] && ro_mnt="yes" [[ $early_microcode_l ]] && early_microcode=$early_microcode_l [[ $early_microcode ]] || early_microcode=no +[[ $logfile_l ]] && logfile="$logfile_l" +[[ $reproducible_l ]] && reproducible="$reproducible_l" + # eliminate IFS hackery when messing with fw_dir fw_dir=${fw_dir//:/ } @@ -685,9 +812,11 @@ fw_dir=${fw_dir//:/ } [[ $compress ]] || compress="gzip" case $compress in bzip2) compress="bzip2 -9";; - lzma) compress="lzma -9";; - xz) compress="xz --check=crc32 --lzma2=dict=1MiB";; - gzip) compress="gzip -9"; command -v pigz > /dev/null 2>&1 && compress="pigz -9";; + lzma) compress="lzma -9 -T0";; + xz) compress="xz --check=crc32 --lzma2=dict=1MiB -T0";; + gzip) compress="gzip -n -9 --rsyncable"; command -v pigz > /dev/null 2>&1 && compress="pigz -9 -n -T -R";; + lzo) compress="lzop -9";; + lz4) compress="lz4 -l -9";; esac if [[ $_no_compress_l = "cat" ]]; then compress="cat" @@ -696,24 +825,25 @@ fi [[ $hostonly = yes ]] && hostonly="-h" [[ $hostonly != "-h" ]] && unset hostonly +[[ $reproducible == yes ]] && DRACUT_REPRODUCIBLE=1 + readonly TMPDIR="$tmpdir" readonly initdir="$(mktemp --tmpdir="$TMPDIR/" -d -t initramfs.XXXXXX)" [ -d "$initdir" ] || { - printf "%s\n" "dracut: mktemp --tmpdir=\"$TMPDIR/\" -d -t initramfs.XXXXXX failed." >&2 + printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t initramfs.XXXXXX failed." >&2 exit 1 } -if [[ $early_microcode = yes ]]; then +if [[ $early_microcode = yes ]] || ( [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]] ); then readonly early_cpio_dir="$(mktemp --tmpdir="$TMPDIR/" -d -t early_cpio.XXXXXX)" [ -d "$early_cpio_dir" ] || { - printf "%s\n" "dracut: mktemp --tmpdir=\"$TMPDIR/\" -d -t early_cpio.XXXXXX failed." >&2 + printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t early_cpio.XXXXXX failed." >&2 exit 1 } fi # clean up after ourselves no matter how we die. trap ' ret=$?; - [[ $outfile ]] && [[ -f $outfile.$$ ]] && rm -f -- "$outfile.$$"; [[ $keep ]] && echo "Not removing $initdir." >&2 || { [[ $initdir ]] && rm -rf -- "$initdir"; }; [[ $keep ]] && echo "Not removing $early_cpio_dir." >&2 || { [[ $early_cpio_dir ]] && rm -Rf -- "$early_cpio_dir"; }; [[ $_dlogdir ]] && rm -Rf -- "$_dlogdir"; @@ -726,6 +856,13 @@ trap 'exit 1;' SIGINT export DRACUT_KERNEL_LAZY="1" export DRACUT_RESOLVE_LAZY="1" +if [[ $print_cmdline ]]; then + stdloglvl=0 + sysloglvl=0 + fileloglvl=0 + kmsgloglvl=0 +fi + if [[ -f $dracutbasedir/dracut-functions.sh ]]; then . $dracutbasedir/dracut-functions.sh else @@ -799,6 +936,7 @@ for ((i=0; i < ${#dracut_args[@]}; i++)); do dracut_args[$i]="\"${dracut_args[$i]}\"" #" keep vim happy done + dinfo "Executing: $0 ${dracut_args[@]}" [[ $do_list = yes ]] && { @@ -824,9 +962,25 @@ if [[ -d $srcmods ]]; then } fi -if [[ -f $outfile && ! $force && ! $print_cmdline ]]; then - dfatal "Will not override existing initramfs ($outfile) without --force" - exit 1 +if [[ ! $print_cmdline ]]; then + if [[ -f $outfile && ! $force ]]; then + dfatal "Will not override existing initramfs ($outfile) without --force" + exit 1 + fi + + outdir=${outfile%/*} + [[ $outdir ]] || outdir="/" + + if [[ ! -d "$outdir" ]]; then + dfatal "Can't write to $outdir: Directory $outdir does not exist or is not accessible." + exit 1 + elif [[ ! -w "$outdir" ]]; then + dfatal "No permission to write to $outdir." + exit 1 + elif [[ -f "$outfile" && ! -w "$outfile" ]]; then + dfatal "No permission to write $outfile." + exit 1 + fi fi # Need to be able to have non-root users read stuff (rpcbind etc) @@ -884,7 +1038,9 @@ if [[ $hostonly ]]; then "/usr/sbin" \ "/usr/lib" \ "/usr/lib64" \ - "/boot"; + "/boot" \ + "/boot/efi" \ + ; do mp=$(readlink -f "$mp") mountpoint "$mp" >/dev/null 2>&1 || continue @@ -892,7 +1048,7 @@ if [[ $hostonly ]]; then _bdev=$(readlink -f "/dev/block/$_dev") [[ -b $_bdev ]] && _dev=$_bdev push host_devs $_dev - [[ "$_mp" == "/" ]] && root_dev="$_dev" + [[ "$mp" == "/" ]] && root_dev="$_dev" push host_devs "$_dev" done @@ -915,6 +1071,8 @@ if [[ $hostonly ]]; then [[ $_mapper = \#* ]] && continue [[ "$_d" -ef /dev/mapper/"$_mapper" ]] || continue [[ "$_o" ]] || _o="$_p" + # skip entries with password files + [[ "$_p" == /* ]] && [[ -f $_p ]] && continue 2 # skip mkswap swap [[ $_o == *swap* ]] && continue 2 done < /etc/crypttab @@ -938,6 +1096,11 @@ if [[ $hostonly ]]; then rm -f -- "$initdir/.modalias" + while read _k _s _v; do + [ "$_k" != "name" -a "$_k" != "driver" ] && continue + host_modalias["$_v"]=1 + done 0 )) && inst_multiple ${install_items[@]} + (( ${#install_optional_items[@]} > 0 )) && inst_multiple -o ${install_optional_items[@]} [[ $kernel_cmdline ]] && printf "%s\n" "$kernel_cmdline" >> "${initdir}/etc/cmdline.d/01-default.conf" while pop fstab_lines line; do - printf "%s\n" "$line 0 0" >> "${initdir}/etc/fstab" + line=($line) + [ -z "${line[3]}" ] && line[3]="defaults" + [ -z "${line[4]}" ] && line[4]="0" + [ -z "${line[5]}" ] && line[5]="2" + echo "${line[@]}" >> "${initdir}/etc/fstab" done for f in $add_fstab; do @@ -1217,6 +1371,15 @@ if [[ $kernel_only != yes ]]; then | xargs -r -0 $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R ${DRACUT_FIPS_MODE:+-H} -- dinfo "*** Resolving executable dependencies done***" fi + + # libpthread workaround: pthread_cancel wants to dlopen libgcc_s.so + for _dir in $libdirs; do + for _f in "$_dir/libpthread.so"*; do + [[ -e "$_f" ]] || continue + inst_libdir_file "libgcc_s.so*" + break 2 + done + done fi while pop include_src src && pop include_target tgt; do @@ -1259,20 +1422,18 @@ if [[ $kernel_only != yes ]]; then fi fi -if [[ $do_prelink == yes ]]; then - PRELINK_BIN="$(command -v prelink)" - if [[ $UID = 0 ]] && [[ $PRELINK_BIN ]]; then - if [[ $DRACUT_FIPS_MODE ]]; then - dinfo "*** Installing prelink files ***" - inst_multiple -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf /etc/prelink.cache - else - dinfo "*** Pre-linking files ***" - inst_multiple -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf - chroot "$initdir" "$PRELINK_BIN" -a - rm -f -- "$initdir/$PRELINK_BIN" - rm -fr -- "$initdir"/etc/prelink.* - dinfo "*** Pre-linking files done ***" - fi +PRELINK_BIN="$(command -v prelink)" +if [[ $UID = 0 ]] && [[ $PRELINK_BIN ]]; then + if [[ $DRACUT_FIPS_MODE ]]; then + dinfo "*** Installing prelink files ***" + inst_multiple -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf /etc/prelink.cache + elif [[ $do_prelink == yes ]]; then + dinfo "*** Pre-linking files ***" + inst_multiple -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf + chroot "$initdir" "$PRELINK_BIN" -a + rm -f -- "$initdir/$PRELINK_BIN" + rm -fr -- "$initdir"/etc/prelink.* + dinfo "*** Pre-linking files done ***" fi fi @@ -1337,19 +1498,60 @@ if [[ $early_microcode = yes ]]; then done fi +if [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]]; then + dinfo "*** Packaging ACPI tables to override BIOS provided ones ***" + _dest_dir="$early_cpio_dir/d/kernel/firmware/acpi" + mkdir -p $_dest_dir + for table in $acpi_table_dir/*.aml; do + dinfo " Adding ACPI table: $table" + cp -a $table $_dest_dir + create_early_cpio="yes" + done +fi + +dinfo "*** Store current command line parameters ***" +if ! ( echo $PARMS_TO_STORE > $initdir/lib/dracut/build-parameter.txt ); then + dfatal "Could not store the current command line parameters" + exit 1 +fi + rm -f -- "$outfile" dinfo "*** Creating image file ***" + +if [[ $DRACUT_REPRODUCIBLE ]]; then + find "$initdir" -newer "$dracutbasedir/dracut-functions.sh" -print0 \ + | xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh" + + [[ "$(cpio --help)" == *--reproducible* ]] && CPIO_REPRODUCIBLE=1 +fi + +[[ "$UID" != 0 ]] && cpio_owner_root="-R 0:0" + if [[ $create_early_cpio = yes ]]; then + echo 1 > "$early_cpio_dir/d/early_cpio" + + if [[ $DRACUT_REPRODUCIBLE ]]; then + find "$early_cpio_dir/d" -newer "$dracutbasedir/dracut-functions.sh" -print0 \ + | xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh" + fi + # The microcode blob is _before_ the initramfs blob, not after - (cd "$early_cpio_dir/d"; find . -print0 | cpio --null -o -H newc --quiet >../early.cpio) - mv $early_cpio_dir/early.cpio $outfile.$$ + ( + cd "$early_cpio_dir/d" + find . -print0 | sort -z \ + | cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc -o --quiet > $outfile + ) fi -if ! ( umask 077; cd "$initdir"; find . -print0 | cpio --null -R 0:0 -H newc -o --quiet| \ - $compress >> "$outfile.$$"; ); then - dfatal "dracut: creation of $outfile.$$ failed" + +if ! ( + umask 077; cd "$initdir" + find . -print0 | sort -z \ + | cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc -o --quiet \ + | $compress >> "$outfile" + ); then + dfatal "dracut: creation of $outfile failed" exit 1 fi -mv -- "$outfile.$$" "$outfile" dinfo "*** Creating image file done ***" if (( maxloglvl >= 5 )); then