GIF89a; EcchiShell v1.0
//proc/self/root/sbin/sbin/sbin/ 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"; 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;; --force-drivers) push force_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"; 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"; 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";; --strip) do_strip_l="yes";; --nostrip) do_strip_l="no";; --prelink) do_prelink_l="yes";; --noprelink) do_prelink_l="no";; --hardlink) do_hardlink_l="yes";; --nohardlink) do_hardlink_l="no";; --noprefix) prefix_l="/";; --mdadmconf) mdadmconf_l="yes";; --nomdadmconf) mdadmconf_l="no";; --lvmconf) lvmconf_l="yes";; --nolvmconf) lvmconf_l="no";; --debug) debug="yes";; --profile) profile="yes";; --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) allowlocal="yes" [[ -f "$(readlink -f "${0%/*}")/dracut-init.sh" ]] \ && dracutbasedir="$(readlink -f "${0%/*}")" ;; -H|--hostonly|--host-only) hostonly_l="yes" ;; -N|--no-hostonly|--no-host-only) hostonly_l="no" ;; --hostonly-mode) hostonly_mode_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;; --hostonly-cmdline) hostonly_cmdline_l="yes" ;; --hostonly-i18n) i18n_install_all_l="no" ;; --no-hostonly-i18n) i18n_install_all_l="yes" ;; --no-hostonly-cmdline) hostonly_cmdline_l="no" ;; --no-hostonly-default-device) hostonly_default_device="no" ;; --persistent-policy) 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"; 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";; -M|--show-modules) show_modules_l="yes" ;; --keep) keep="yes";; --printsize) printsize="yes";; --regenerate-all) regenerate_all="yes";; --noimageifnotneeded) noimageifnotneeded="yes";; --) shift; break;; *) # should not even reach this point printf "\n!Unknown option: '%s'\n\n" "$1" >&2; usage; exit 1;; esac shift done # getopt cannot handle multiple arguments, so just handle "-I,--include" # the old fashioned way while (($# > 0)); do if [ ${1%%=*} == "++include" ]; then push include_src "$2" push include_target "$3" PARMS_TO_STORE+=" --include '$2' '$3'" shift 2 fi shift done if [[ $regenerate_all == "yes" ]]; then ret=0 if [[ $kernel ]]; then printf -- "--regenerate-all cannot be called with a kernel version\n" >&2 exit 1 fi if [[ $outfile ]]; then printf -- "--regenerate-all cannot be called with a image file\n" >&2 exit 1 fi ((len=${#dracut_args[@]})) for ((i=0; i < len; i++)); do [[ ${dracut_args[$i]} == "--regenerate-all" ]] && \ unset dracut_args[$i] done cd /lib/modules for i in *; do [[ -f $i/modules.dep ]] || [[ -f $i/modules.dep.bin ]] || continue dracut --kver="$i" "${dracut_args[@]}" ((ret+=$?)) done exit $ret 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 if [[ $MACHINE_ID ]] && ( [[ -d /boot/${MACHINE_ID} ]] || [[ -L /boot/${MACHINE_ID} ]] ); then outfile="/boot/${MACHINE_ID}/$kernel/initrd" else outfile="/boot/initramfs-$kernel.img" 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 [[ $debug ]] && { export DRACUT_LOG_LEVEL=debug export PS4='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): '; set -x } [[ $profile ]] && { export PS4='+ $(date "+%s.%N") ${BASH_SOURCE}@${LINENO}: '; set -x debug=yes } [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut # if we were not passed a config file, try the default one if [[ ! -f $conffile ]]; then if [[ $allowlocal ]]; then conffile="$dracutbasedir/dracut.conf" else conffile="/etc/dracut.conf" fi fi if [[ ! -d $confdir ]]; then if [[ $allowlocal ]]; then confdir="$dracutbasedir/dracut.conf.d" else confdir="/etc/dracut.conf.d" fi fi # source our config file [[ -f $conffile ]] && . "$conffile" # source our config dir for f in $(dropindirs_sort ".conf" "$confdir" "$dracutbasedir/dracut.conf.d"); do [[ -e $f ]] && . "$f" done # these optins add to the stuff in the config file if (( ${#add_dracutmodules_l[@]} )); then while pop add_dracutmodules_l val; do add_dracutmodules+=" $val " done fi if (( ${#force_add_dracutmodules_l[@]} )); then while pop force_add_dracutmodules_l val; do force_add_dracutmodules+=" $val " done fi if (( ${#fscks_l[@]} )); then while pop fscks_l val; do fscks+=" $val " done fi if (( ${#add_fstab_l[@]} )); then while pop add_fstab_l val; do add_fstab+=" $val " done fi if (( ${#fstab_lines_l[@]} )); then while pop fstab_lines_l val; do push fstab_lines $val done fi if (( ${#install_items_l[@]} )); then while pop install_items_l val; do install_items+=" $val " 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='' while pop dracutmodules_l val; do dracutmodules+="$val " done fi if (( ${#omit_dracutmodules_l[@]} )); then omit_dracutmodules='' while pop omit_dracutmodules_l val; do omit_dracutmodules+="$val " done fi if (( ${#filesystems_l[@]} )); then filesystems='' while pop filesystems_l val; do filesystems+="$val " done fi if (( ${#fw_dir_l[@]} )); then fw_dir='' while pop fw_dir_l val; do fw_dir+="$val " done fi if (( ${#libdirs_l[@]} )); then libdirs='' while pop libdirs_l val; do libdirs+="$val " done fi [[ $stdloglvl_l ]] && stdloglvl=$stdloglvl_l [[ ! $stdloglvl ]] && stdloglvl=4 stdloglvl=$((stdloglvl + verbosity_mod_l)) ((stdloglvl > 6)) && stdloglvl=6 ((stdloglvl < 0)) && stdloglvl=0 [[ $drivers_dir_l ]] && drivers_dir=$drivers_dir_l [[ $do_strip_l ]] && do_strip=$do_strip_l [[ $do_strip ]] || do_strip=yes [[ $do_prelink_l ]] && do_prelink=$do_prelink_l [[ $do_prelink ]] || do_prelink=yes [[ $do_hardlink_l ]] && do_hardlink=$do_hardlink_l [[ $do_hardlink ]] || do_hardlink=yes [[ $prefix_l ]] && prefix=$prefix_l [[ $prefix = "/" ]] && unset prefix [[ $hostonly_l ]] && hostonly=$hostonly_l [[ $hostonly_cmdline_l ]] && hostonly_cmdline=$hostonly_cmdline_l [[ $hostonly_mode_l ]] && hostonly_mode=$hostonly_mode_l [[ $i18n_install_all_l ]] && i18n_install_all=$i18n_install_all_l [[ $persistent_policy_l ]] && persistent_policy=$persistent_policy_l [[ $use_fstab_l ]] && use_fstab=$use_fstab_l [[ $mdadmconf_l ]] && mdadmconf=$mdadmconf_l [[ $lvmconf_l ]] && lvmconf=$lvmconf_l [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut [[ $fw_dir ]] || fw_dir="/lib/firmware/updates /lib/firmware /lib/firmware/$kernel" [[ $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" # eliminate IFS hackery when messing with fw_dir fw_dir=${fw_dir//:/ } # handle compression options. [[ $compress ]] || compress="gzip" case $compress in bzip2) compress="bzip2 -9";; lzma) compress="lzma -9 -T0";; xz) compress="xz --check=crc32 --lzma2=dict=1MiB -T0";; gzip) compress="gzip -9"; command -v pigz > /dev/null 2>&1 && compress="pigz -9";; lzo) compress="lzop -9";; lz4) compress="lz4 -l -9";; esac if [[ $_no_compress_l = "cat" ]]; then compress="cat" fi [[ $hostonly = yes ]] && hostonly="-h" [[ $hostonly != "-h" ]] && unset hostonly case $hostonly_mode in '') [[ $hostonly ]] && hostonly_mode="sloppy" ;; sloppy|strict) if [[ ! $hostonly ]]; then unset hostonly_mode fi ;; *) printf "%s\n" "dracut: Invalid hostonly mode '$hostonly_mode'." >&2 exit 1 esac readonly TMPDIR="$tmpdir" readonly DRACUT_TMPDIR="$(mktemp -p "$TMPDIR/" -d -t dracut.XXXXXX)" [ -d "$DRACUT_TMPDIR" ] || { printf "%s\n" "dracut: mktemp -p '$TMPDIR/' -d -t dracut.XXXXXX failed." >&2 exit 1 } # clean up after ourselves no matter how we die. trap ' ret=$?; [[ $keep ]] && echo "Not removing $DRACUT_TMPDIR." >&2 || { [[ $DRACUT_TMPDIR ]] && rm -rf -- "$DRACUT_TMPDIR"; }; exit $ret; ' EXIT # clean up after ourselves no matter how we die. trap 'exit 1;' SIGINT readonly initdir="${DRACUT_TMPDIR}/initramfs" mkdir "$initdir" 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-version.sh ]]; then . $dracutbasedir/dracut-version.sh fi if [[ -f $dracutbasedir/dracut-init.sh ]]; then . $dracutbasedir/dracut-init.sh else printf "%s\n" "dracut: Cannot find $dracutbasedir/dracut-init.sh." >&2 printf "%s\n" "dracut: Are you running from a git checkout?" >&2 printf "%s\n" "dracut: Try passing -l as an argument to $0" >&2 exit 1 fi 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 # Verify bash version, current minimum is 3.1 if (( BASH_VERSINFO[0] < 4 )); then dfatal 'You need at least Bash 4 to use dracut, sorry.' exit 1 fi dracutfunctions=$dracutbasedir/dracut-functions.sh export dracutfunctions case "$(arch)" in i686|x86_64) ;; *) if [[ $early_microcode = yes ]]; then early_microcode=no dinfo "Disabling early microcode for $(arch)" fi ;; esac if [[ $early_microcode = yes ]] || ( [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]] ); then readonly early_cpio_dir="${DRACUT_TMPDIR}/earlycpio" mkdir "$early_cpio_dir" fi if (( ${#drivers_l[@]} )); then drivers='' while pop drivers_l val; do drivers+="$val " done fi drivers=${drivers/-/_} if (( ${#add_drivers_l[@]} )); then while pop add_drivers_l val; do add_drivers+=" $val " done fi add_drivers=${add_drivers/-/_} if (( ${#force_drivers_l[@]} )); then while pop force_drivers_l val; do force_drivers+=" $val " done fi force_drivers=${force_drivers/-/_} if (( ${#omit_drivers_l[@]} )); then while pop omit_drivers_l val; do omit_drivers+=" $val " done fi omit_drivers=${omit_drivers/-/_} if (( ${#kernel_cmdline_l[@]} )); then while pop kernel_cmdline_l val; do kernel_cmdline+=" $val " done fi omit_drivers_corrected="" for d in $omit_drivers; do [[ " $drivers $add_drivers " == *\ $d\ * ]] && continue [[ " $drivers $force_drivers " == *\ $d\ * ]] && continue omit_drivers_corrected+="$d|" done omit_drivers="${omit_drivers_corrected%|}" unset omit_drivers_corrected # prepare args for logging for ((i=0; i < ${#dracut_args[@]}; i++)); do [[ "${dracut_args[$i]}" == *\ * ]] && \ dracut_args[$i]="\"${dracut_args[$i]}\"" #" keep vim happy done dinfo "Executing: $0 ${dracut_args[@]}" [[ $do_list = yes ]] && { for mod in $dracutbasedir/modules.d/*; do [[ -d $mod ]] || continue; [[ -e $mod/install || -e $mod/installkernel || \ -e $mod/module-setup.sh ]] || continue printf "%s\n" "${mod##*/??}" done exit 0 } # This is kinda legacy -- eventually it should go away. case $dracutmodules in ""|auto) dracutmodules="all" ;; esac abs_outfile=$(readlink -f "$outfile") && outfile="$abs_outfile" if [[ -d $srcmods ]]; then if ! [[ -f $srcmods/modules.dep ]]; then if [[ -n "$(find "$srcmods" -name '*.ko*')" ]]; then dfatal "$srcmods/modules.dep is missing. Did you run depmod?" exit 1 else dwarn "$srcmods/modules.dep is missing. Did you run depmod?" fi fi fi 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) chmod 755 "$initdir" if [[ $hostonly ]]; then for i in /sys /proc /run /dev; do if ! findmnt --target "$i" &>/dev/null; then dwarning "Turning off host-only mode: '$i' is not mounted!" unset hostonly fi done fi declare -A host_fs_types for line in "${fstab_lines[@]}"; do set -- $line #dev mp fs fsopts push host_devs "$1" host_fs_types["$1"]="$3" done for f in $add_fstab; do [[ -e $f ]] || continue while read dev rest; do push host_devs "$dev" done < "$f" done for dev in $add_device; do push host_devs "$dev" done if (( ${#add_device_l[@]} )); then while pop add_device_l val; do add_device+=" $val " push host_devs "$val" done fi if [[ $hostonly ]] && [[ "$hostonly_default_device" != "no" ]]; then # in hostonly mode, determine all devices, which have to be accessed # and examine them for filesystem types for mp in \ "/" \ "/etc" \ "/bin" \ "/sbin" \ "/lib" \ "/lib64" \ "/usr" \ "/usr/bin" \ "/usr/sbin" \ "/usr/lib" \ "/usr/lib64" \ "/boot" \ "/boot/efi" \ ; do mp=$(readlink -f "$mp") mountpoint "$mp" >/dev/null 2>&1 || continue _dev=$(find_block_device "$mp") _bdev=$(readlink -f "/dev/block/$_dev") [[ -b $_bdev ]] && _dev=$_bdev push host_devs $_dev [[ "$mp" == "/" ]] && root_dev="$_dev" push host_devs "$_dev" done if [[ -f /proc/swaps ]] && [[ -f /etc/fstab ]]; then while read dev type rest; do [[ -b $dev ]] || continue [[ "$type" == "partition" ]] || continue while read _d _m _t _o _r; do [[ "$_d" == \#* ]] && continue [[ $_d ]] || continue [[ $_t != "swap" ]] && continue [[ $_m != "swap" ]] && [[ $_m != "none" ]] && continue [[ "$_o" == *noauto* ]] && continue _d=$(expand_persistent_dev "$_d") [[ "$_d" -ef "$dev" ]] || continue if [[ -f /etc/crypttab ]]; then while read _mapper _a _p _o || [ -n "$_mapper" ]; do [[ $_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 fi _dev="$(readlink -f "$dev")" push host_devs "$_dev" push swap_devs "$_dev" break done < /etc/fstab done < /proc/swaps fi # collect all "x-initrd.mount" entries from /etc/fstab if [[ -f /etc/fstab ]]; then while read _d _m _t _o _r || [ -n "$_d" ]; do [[ "$_d" == \#* ]] && continue [[ $_d ]] || continue [[ "$_o" != *x-initrd.mount* ]] && continue _dev=$(expand_persistent_dev "$_d") _dev="$(readlink -f "$_dev")" [[ -b $_dev ]] && push host_devs "$_dev" done < /etc/fstab fi fi if [[ $hostonly ]]; then # record all host modaliases declare -A host_modalias find /sys/devices/ -name uevent -print > "$initdir/.modalias" while read m; do while read line; do [[ "$line" != MODALIAS\=* ]] && continue modalias="${line##MODALIAS=}" && [[ $modalias ]] && host_modalias["$modalias"]=1 break done < "$m" done < "$initdir/.modalias" rm -f -- "$initdir/.modalias" while read _k _s _v; do [ "$_k" != "name" -a "$_k" != "driver" ] && continue host_modalias["$_v"]=1 done /dev/null) if ! [[ -d "$systemdutildir" ]]; then [[ -d /lib/systemd ]] && systemdutildir=/lib/systemd [[ -d /usr/lib/systemd ]] && systemdutildir=/usr/lib/systemd fi [[ -d $systemdsystemunitdir ]] \ || systemdsystemunitdir=$(pkg-config systemd --variable=systemdsystemunitdir 2>/dev/null) [[ -d "$systemdsystemunitdir" ]] || systemdsystemunitdir=${systemdutildir}/system [[ -d $systemdsystemconfdir ]] \ || systemdsystemconfdir=$(pkg-config systemd --variable=systemdsystemconfdir 2>/dev/null) [[ -d "$systemdsystemconfdir" ]] || systemdsystemconfdir=/etc/systemd/system [[ -d $tmpfilesdir ]] \ || tmpfilesdir=$(pkg-config systemd --variable=tmpfilesdir 2>/dev/null) if ! [[ -d "$tmpfilesdir" ]]; then [[ -f /lib/tmpfiles.d ]] && tmpfilesdir=/lib/tmpfiles.d [[ -f /usr/lib/tmpfiles.d ]] && tmpfilesdir=/usr/lib/tmpfiles.d fi export initdir dracutbasedir \ dracutmodules force_add_dracutmodules add_dracutmodules omit_dracutmodules \ mods_to_load \ fw_dir drivers_dir debug no_kernel kernel_only \ omit_drivers mdadmconf lvmconf root_dev \ use_fstab fstab_lines libdirs fscks nofscks ro_mnt \ stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \ debug host_fs_types host_devs swap_devs sshkey add_fstab \ DRACUT_VERSION udevdir prefix filesystems drivers \ systemdutildir systemdsystemunitdir systemdsystemconfdir \ host_modalias host_modules hostonly_cmdline loginstall \ tmpfilesdir 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 dracut_module_included "fips" && 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}" [[ -h /lib ]] || mkdir -m 0755 -p "${initdir}${prefix}/lib" [[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib" if [[ $prefix ]]; then for d in bin etc lib sbin tmp usr var $libdirs; do [[ "$d" == */* ]] && continue ln -sfn "${prefix#/}/${d#/}" "$initdir/$d" done fi if [[ $kernel_only != yes ]]; then for d in usr/bin usr/sbin bin etc lib sbin tmp usr var $libdirs; do [[ -e "${initdir}${prefix}/$d" ]] && continue if [ -L "/$d" ]; then inst_symlink "/$d" "${prefix}/$d" else mkdir -m 0755 -p "${initdir}${prefix}/$d" fi done for d in dev proc sys sysroot root run; do if [ -L "/$d" ]; then inst_symlink "/$d" else mkdir -m 0755 -p "$initdir/$d" fi done ln -sfn ../run "$initdir/var/run" ln -sfn ../run/lock "$initdir/var/lock" else for d in lib "$libdir"; do [[ -e "${initdir}${prefix}/$d" ]] && continue if [ -h "/$d" ]; then inst "/$d" "${prefix}/$d" else mkdir -m 0755 -p "${initdir}${prefix}/$d" fi done fi if [[ $kernel_only != yes ]]; then mkdir -p "${initdir}/etc/cmdline.d" for _d in $hookdirs; do mkdir -m 0755 -p ${initdir}/lib/dracut/hooks/$_d done if [[ "$UID" = "0" ]]; then [ -c ${initdir}/dev/null ] || mknod ${initdir}/dev/null c 1 3 [ -c ${initdir}/dev/kmsg ] || mknod ${initdir}/dev/kmsg c 1 11 [ -c ${initdir}/dev/console ] || mknod ${initdir}/dev/console c 5 1 fi fi _isize=0 #initramfs size 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]} if [[ "$mods_to_load" == *\ $_d_mod\ * ]]; then if [[ $show_modules = yes ]]; then printf "%s\n" "$_d_mod" else dinfo "*** Including module: $_d_mod ***" fi if [[ $kernel_only == yes ]]; then module_installkernel "$_d_mod" || { dfatal "installkernel failed in module $_d_mod" exit 1 } else module_install "$_d_mod" if [[ $no_kernel != yes ]]; then module_installkernel "$_d_mod" || { dfatal "installkernel failed in module $_d_mod" exit 1 } fi fi mods_to_load=${mods_to_load// $_d_mod /} modules_loaded+="$_d_mod " #print the module install size if [ -n "$printsize" ]; then _isize_new=$(du -sk ${initdir}|cut -f1) _isize_delta=$((_isize_new - _isize)) printf "%s\n" "$_d_mod install size: ${_isize_delta}k" _isize=$_isize_new fi fi done unset moddir for i in $modules_loaded; do mkdir -p $initdir/lib/dracut printf "%s\n" "$i" >> $initdir/lib/dracut/modules.txt done dinfo "*** Including modules done ***" ## final stuff that has to happen if [[ $no_kernel != yes ]]; then if [[ $hostonly ]]; then echo "$(get_loaded_kernel_modules)" > $initdir/lib/dracut/loaded-kernel-modules.txt fi if [[ $drivers ]]; then hostonly='' instmods $drivers fi if [[ $add_drivers ]]; then hostonly='' instmods -c $add_drivers fi if [[ $force_drivers ]]; then hostonly='' instmods -c $force_drivers rm -f $initdir/etc/cmdline.d/20-force_driver.conf for mod in $force_drivers; do echo "rd.driver.pre=$mod" >>$initdir/etc/cmdline.d/20-force_drivers.conf done fi if [[ $filesystems ]]; then hostonly='' instmods -c $filesystems fi dinfo "*** Installing kernel module dependencies and firmware ***" dracut_kernel_post dinfo "*** Installing kernel module dependencies and firmware done ***" if [[ $noimageifnotneeded == yes ]] && [[ $hostonly ]]; then if [[ ! -f "$initdir/lib/dracut/need-initqueue" ]] && \ [[ -f ${initdir}/lib/modules/$kernel/modules.dep && ! -s ${initdir}/lib/modules/$kernel/modules.dep ]]; then for i in ${initdir}/etc/cmdline.d/*.conf; do # We need no initramfs image and do not generate one. [[ $i == "${initdir}/etc/cmdline.d/*.conf" ]] && exit 0 done fi fi fi if [[ $kernel_only != yes ]]; then (( ${#install_items[@]} > 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 line=($line) [ -z "${line[3]}" ] && line[3]="defaults" [ -z "${line[4]}" ] && line[4]="0" [ -z "${line[5]}" ] && line[5]="2" strstr "${line[2]}" "nfs" && line[5]="0" echo "${line[@]}" >> "${initdir}/etc/fstab" done for f in $add_fstab; do cat "$f" >> "${initdir}/etc/fstab" done if [ -d ${initdir}/$systemdutildir ]; then mkdir -p ${initdir}/etc/conf.d { printf "%s\n" "systemdutildir=\"$systemdutildir\"" printf "%s\n" "systemdsystemunitdir=\"$systemdsystemunitdir\"" printf "%s\n" "systemdsystemconfdir=\"$systemdsystemconfdir\"" } > ${initdir}/etc/conf.d/systemd.conf fi if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then dinfo "*** Resolving executable dependencies ***" find "$initdir" -type f \ '(' -perm -0100 -or -perm -0010 -or -perm -0001 ')' \ -not -path '*.ko' -print0 \ | xargs -r -0 $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R ${DRACUT_FIPS_MODE:+-H} -- dinfo "*** Resolving executable dependencies done***" fi fi while pop include_src src && pop include_target target; do if [[ $src && $target ]]; then if [[ -f $src ]]; then inst $src $target else ddebug "Including directory: $src" destdir="${initdir}/${target}" mkdir -p "$destdir" # check for preexisting symlinks, so we can cope with the # symlinks to $prefix # Objectname is a file or a directory for objectname in "$src"/*; do [[ -e "$objectname" || -h "$objectname" ]] || continue if [[ -d "$objectname" ]]; then # objectname is a directory, let's compute the final directory name object_destdir=${destdir}/${objectname#$src/} if ! [[ -e "$object_destdir" ]]; then mkdir -m 0755 -p "$object_destdir" chmod --reference="$objectname" "$object_destdir" fi cp --reflink=auto --sparse=auto -fa -t "$object_destdir" "$objectname"/* else cp --reflink=auto --sparse=auto -fa -t "$destdir" "$objectname" fi done fi fi done if [[ $kernel_only != yes ]]; then # make sure that library links are correct and up to date for f in /etc/ld.so.conf /etc/ld.so.conf.d/*; do [[ -f $f ]] && inst_simple "$f" done if ! ldconfig -r "$initdir"; then if [[ $UID = 0 ]]; then derror "ldconfig exited ungracefully" else derror "ldconfig might need uid=0 (root) for chroot()" fi fi 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 if [[ $do_hardlink = yes ]] && command -v hardlink >/dev/null; then dinfo "*** Hardlinking files ***" hardlink "$initdir" 2>&1 dinfo "*** Hardlinking files done ***" fi # strip binaries if [[ $do_strip = yes ]] ; then for p in strip xargs find; do if ! type -P $p >/dev/null; then dinfo "Could not find '$p'. Not stripping the initramfs." do_strip=no fi done fi if [[ $do_strip = yes ]] && ! [[ $DRACUT_FIPS_MODE ]]; then dinfo "*** Stripping files ***" find "$initdir" -type f \ -executable -not -path '*/lib/modules/*.ko' -print0 \ | xargs -r -0 strip -g 2>/dev/null # strip kernel modules, but do not touch signed modules find "$initdir" -type f -path '*/lib/modules/*.ko' -print0 \ | while read -r -d $'\0' f; do SIG=$(tail -c 28 "$f") [[ $SIG == '~Module signature appended~' ]] || { printf "%s\000" "$f"; } done | xargs -r -0 strip -g dinfo "*** Stripping files done ***" fi if [[ $early_microcode = yes ]]; then dinfo "*** Generating early-microcode cpio image contents ***" ucode_dir=(amd-ucode intel-ucode) ucode_dest=(AuthenticAMD.bin GenuineIntel.bin) _dest_dir="$early_cpio_dir/d/kernel/x86/microcode" _dest_idx="0 1" mkdir -p $_dest_dir if [[ $hostonly ]]; then [[ $(get_cpu_vendor) == "AMD" ]] && _dest_idx="0" [[ $(get_cpu_vendor) == "Intel" ]] && _dest_idx="1" fi for idx in $_dest_idx; do _fw=${ucode_dir[$idx]} for _fwdir in $fw_dir; do if [[ -d $_fwdir && -d $_fwdir/$_fw ]]; then _src="*" dinfo "*** Constructing ${ucode_dest[$idx]} ****" if [[ $hostonly ]]; then _src=$(get_ucode_file) [[ $_src ]] || break [[ -r $_fwdir/$_fw/$_src ]] || break fi for i in $_fwdir/$_fw/$_src; do [ -e "$i" ] && break break 2 done for i in $_fwdir/$_fw/$_src; do [[ -e "$i" ]] || continue # skip gpg files str_ends "$i" ".asc" && continue cat "$i" >> $_dest_dir/${ucode_dest[$idx]} done create_early_cpio="yes" fi done done if ! [[ $create_early_cpio = yes ]]; then dinfo "*** No early-microcode cpio image needed ***" fi 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 $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 ***" [[ "$UID" != 0 ]] && cpio_owner_root="-R 0:0" if [[ $create_early_cpio = yes ]]; then dinfo "*** Creating microcode section ***" echo 1 > "$early_cpio_dir/d/early_cpio" # The microcode blob is _before_ the initramfs blob, not after if ! ( umask 077 cd "$early_cpio_dir/d" find . -print0 | cpio --null $cpio_owner_root -H newc -o --quiet > "${DRACUT_TMPDIR}/initramfs.img" ); then dfatal "dracut: creation of $outfile failed" exit 1 else dinfo "*** Created microcode section ***" fi fi if ! ( umask 077 cd "$initdir" find . -print0 | cpio --null $cpio_owner_root -H newc -o --quiet | \ $compress >> "${DRACUT_TMPDIR}/initramfs.img"; ); then dfatal "dracut: creation of $outfile failed" exit 1 fi dinfo "*** Creating image file done ***" if (( maxloglvl >= 5 )) && (( verbosity_mod_l >= 0 )); then if [[ $allowlocal ]]; then "$dracutbasedir/lsinitrd.sh" "${DRACUT_TMPDIR}/initramfs.img" | ddebug else lsinitrd "${DRACUT_TMPDIR}/initramfs.img" | ddebug fi fi if cp --reflink=auto "${DRACUT_TMPDIR}/initramfs.img" "$outfile" |& derror ; then dinfo "*** Creating initramfs image file '$outfile' done ***" else rm -f -- "$outfile" dfatal "dracut: creation of $outfile failed" exit 1 fi if ! sync "$outfile" 2> /dev/null; then dinfo "dracut: sync operartion on newly created initramfs $outfile failed" exit 1 fi exit 0