3 # Generator script for a dracut initramfs
4 # Tries to retain some degree of compatibility with the command line
5 # of the various mkinitrd implementations out there
8 # Copyright 2005-2013 Red Hat, Inc. All rights reserved.
10 # This program is free software; you can redistribute it and/or modify
11 # it under the terms of the GNU General Public License as published by
12 # the Free Software Foundation; either version 2 of the License, or
13 # (at your option) any later version.
15 # This program is distributed in the hope that it will be useful,
16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 # GNU General Public License for more details.
20 # You should have received a copy of the GNU General Public License
21 # along with this program. If not, see <http://www.gnu.org/licenses/>.
30 [[ $dracutbasedir ]] || dracutbasedir
=/usr
/lib
/dracut
31 if [[ -f $dracutbasedir/dracut-version.sh
]]; then
32 .
$dracutbasedir/dracut-version.sh
35 # 80x25 linebreak here ^
37 Usage: $0 [OPTION]... [<initramfs> [<kernel-version>]]
39 Version: $DRACUT_VERSION
41 Creates initial ramdisk images for preloading modules
43 -h, --help Display all options
45 If a [LIST] has multiple arguments, then you have to put these in quotes.
49 # dracut --add-drivers "module1 module2" ...
55 [[ $dracutbasedir ]] || dracutbasedir
=/usr
/lib
/dracut
56 if [[ -f $dracutbasedir/dracut-version.sh
]]; then
57 .
$dracutbasedir/dracut-version.sh
60 # 80x25 linebreak here ^
62 Usage: $0 [OPTION]... [<initramfs> [<kernel-version>]]
64 Version: $DRACUT_VERSION
66 Creates initial ramdisk images for preloading modules
68 --kver [VERSION] Set kernel version to [VERSION].
69 -f, --force Overwrite existing initramfs file.
70 -a, --add [LIST] Add a space-separated list of dracut modules.
71 --rebuild Append arguments to those of existing image and rebuild
72 -m, --modules [LIST] Specify a space-separated list of dracut modules to
73 call when building the initramfs. Modules are located
74 in /usr/lib/dracut/modules.d.
75 -o, --omit [LIST] Omit a space-separated list of dracut modules.
76 --force-add [LIST] Force to add a space-separated list of dracut modules
77 to the default set of modules, when -H is specified.
78 -d, --drivers [LIST] Specify a space-separated list of kernel modules to
79 exclusively include in the initramfs.
80 --add-drivers [LIST] Specify a space-separated list of kernel
81 modules to add to the initramfs.
82 --force-drivers [LIST] Specify a space-separated list of kernel
83 modules to add to the initramfs and make sure they
84 are tried to be loaded via modprobe same as passing
85 rd.driver.pre=DRIVER kernel parameter.
86 --omit-drivers [LIST] Specify a space-separated list of kernel
87 modules not to add to the initramfs.
88 --filesystems [LIST] Specify a space-separated list of kernel filesystem
89 modules to exclusively include in the generic
91 -k, --kmoddir [DIR] Specify the directory, where to look for kernel
93 --fwdir [DIR] Specify additional directories, where to look for
94 firmwares, separated by :
95 --kernel-only Only install kernel drivers and firmware files
96 --no-kernel Do not install kernel drivers and firmware files
97 --print-cmdline Print the kernel command line for the given disk layout
98 --early-microcode Combine early microcode with ramdisk
99 --no-early-microcode Do not combine early microcode with ramdisk
100 --kernel-cmdline [PARAMETERS] Specify default kernel command line parameters
101 --strip Strip binaries in the initramfs
102 --nostrip Do not strip binaries in the initramfs
103 --prelink Prelink binaries in the initramfs
104 --noprelink Do not prelink binaries in the initramfs
105 --hardlink Hardlink files in the initramfs
106 --nohardlink Do not hardlink files in the initramfs
107 --prefix [DIR] Prefix initramfs files with [DIR]
108 --noprefix Do not prefix initramfs files
109 --mdadmconf Include local /etc/mdadm.conf
110 --nomdadmconf Do not include local /etc/mdadm.conf
111 --lvmconf Include local /etc/lvm/lvm.conf
112 --nolvmconf Do not include local /etc/lvm/lvm.conf
113 --fscks [LIST] Add a space-separated list of fsck helpers.
114 --nofscks Inhibit installation of any fsck helpers.
115 --ro-mnt Mount / and /usr read-only by default.
116 -h, --help This message
117 --debug Output debug information of the build process
118 --profile Output profile information of the build process
119 -L, --stdlog [0-6] Specify logging level (to standard error)
120 0 - suppress any messages
121 1 - only fatal errors
125 5 - debug info (here starts lots of output)
126 6 - trace info (and even more)
127 -v, --verbose Increase verbosity level
128 -q, --quiet Decrease verbosity level
129 -c, --conf [FILE] Specify configuration file to use.
130 Default: /etc/dracut.conf
131 --confdir [DIR] Specify configuration directory to use *.conf files
132 from. Default: /etc/dracut.conf.d
133 --tmpdir [DIR] Temporary directory to be used instead of default
135 -l, --local Local mode. Use modules from the current working
136 directory instead of the system-wide installed in
137 /usr/lib/dracut/modules.d.
138 Useful when running dracut from a git checkout.
139 -H, --hostonly Host-Only mode: Install only what is needed for
140 booting the local host instead of a generic host.
141 -N, --no-hostonly Disables Host-Only mode
142 --hostonly-cmdline Store kernel command line arguments needed
144 --no-hostonly-cmdline Do not store kernel command line arguments needed
146 --persistent-policy [POLICY]
147 Use [POLICY] to address disks and partitions.
148 POLICY can be any directory name found in /dev/disk.
149 E.g. "by-uuid", "by-label"
150 --fstab Use /etc/fstab to determine the root device.
151 --add-fstab [FILE] Add file to the initramfs fstab
152 --mount "[DEV] [MP] [FSTYPE] [FSOPTS]"
153 Mount device [DEV] on mountpoint [MP] with filesystem
154 [FSTYPE] and options [FSOPTS] in the initramfs
155 --add-device "[DEV]" Bring up [DEV] in initramfs
156 -i, --include [SOURCE] [TARGET]
157 Include the files in the SOURCE directory into the
158 Target directory in the final initramfs.
159 If SOURCE is a file, it will be installed to TARGET
160 in the final initramfs.
161 -I, --install [LIST] Install the space separated list of files into the
163 --install-optional [LIST] Install the space separated list of files into the
164 initramfs, if they exist.
165 --gzip Compress the generated initramfs using gzip.
166 This will be done by default, unless another
167 compression option or --no-compress is passed.
168 --bzip2 Compress the generated initramfs using bzip2.
169 Make sure your kernel has bzip2 decompression support
170 compiled in, otherwise you will not be able to boot.
171 --lzma Compress the generated initramfs using lzma.
172 Make sure your kernel has lzma support compiled in,
173 otherwise you will not be able to boot.
174 --xz Compress the generated initramfs using xz.
175 Make sure that your kernel has xz support compiled
176 in, otherwise you will not be able to boot.
177 --lzo Compress the generated initramfs using lzop.
178 Make sure that your kernel has lzo support compiled
179 in, otherwise you will not be able to boot.
180 --lz4 Compress the generated initramfs using lz4.
181 Make sure that your kernel has lz4 support compiled
182 in, otherwise you will not be able to boot.
183 --compress [COMPRESSION] Compress the generated initramfs with the
184 passed compression program. Make sure your kernel
185 knows how to decompress the generated initramfs,
186 otherwise you will not be able to boot.
187 --no-compress Do not compress the generated initramfs. This will
188 override any other compression options.
189 --list-modules List all available dracut modules.
190 -M, --show-modules Print included module's name to standard output during
192 --keep Keep the temporary initramfs for debugging purposes
193 --printsize Print out the module install size
194 --sshkey [SSHKEY] Add ssh key to initramfs (use with ssh-client module)
195 --logfile [FILE] Logfile to use (overrides configuration setting)
196 --reproducible Create reproducible images
197 --loginstall [DIR] Log all files installed from the host to [DIR]
198 --uefi Create an UEFI executable with the kernel cmdline and
200 --uefi-stub [FILE] Use the UEFI stub [FILE] to create an UEFI executable
201 --kernel-image [FILE] location of the kernel image
203 If [LIST] has multiple arguments, then you have to put these in quotes.
207 # dracut --add-drivers "module1 module2" ...
212 # Fills up host_devs stack variable and makes sure there are no duplicates
215 [[ " ${host_devs[@]} " == *" $1 "* ]] && return
220 # pops the last value from a stack
221 # assigns value to second argument variable
222 # or echo to stdout, if no second argument
223 # $1 = stack variable
224 # $2 = optional variable to store the value
229 local __stack
=$1; shift
232 # check for empty stack
233 eval '[[ ${#'${__stack}'[@]} -eq 0 ]] && return 1'
235 eval _value
='${'${__stack}'[${#'${__stack}'[@]}-1]}'
237 if [[ "$__resultvar" ]]; then
238 eval $__resultvar="'$_value'"
240 printf "%s" "$_value"
242 eval unset ${__stack}'[${#'${__stack}'[@]}-1]'
246 # Little helper function for reading args from the commandline.
247 # it automatically handles -a b and -a=b variants, and returns 1 if
248 # we need to shift $3.
253 local rematch='^
[^
=]*=(.
*)$
'
254 if [[ $2 =~ $rematch ]]; then
255 read "$1" <<< "${BASH_REMATCH[1]}"
258 # There is no way to shift our callers args, so
259 # return 1 to indicate they should do it instead.
266 local suffix=$1; shift
271 for i in "$d/"*"$suffix"; do
272 if [[ -e "$i" ]]; then
273 printf "%s\n" "${i##*/}"
279 for f in "${files[@]}"; do
281 if [[ -e "$d/$f" ]]; then
282 printf "%s\n" "$d/$f"
292 # Workaround -i, --include taking 2 arguments
293 set -- "${@/--include/++include}"
295 # This prevents any long argument ending with "-i"
296 # -i, like --opt-i but I think we can just prevent that
297 set -- "${@/%-i/++include}"
299 TEMP=$(unset POSIXLY_CORRECT; getopt \
300 -o "a:m:o:d:I:k:c:L:fvqlHhMN" \
304 --long add-drivers: \
305 --long force-drivers: \
306 --long omit-drivers: \
310 --long filesystems: \
312 --long install-optional: \
333 --long print-cmdline \
334 --long kernel-cmdline: \
356 --long no-host-only \
357 --long hostonly-cmdline \
358 --long no-hostonly-cmdline \
359 --long persistent-policy: \
369 --long list-modules \
370 --long show-modules \
373 --long regenerate-all \
374 --long noimageifnotneeded \
375 --long early-microcode \
376 --long no-early-microcode \
377 --long reproducible \
381 --long kernel-image: \
384 if (( $? != 0 )); then
394 rearrange_params "$@"
397 # parse command line args to check if '--rebuild' option is present
402 if [ "$1" == "--" ]; then
405 if [ "$1" == "--rebuild" ]; then
408 if [ ! -e $rebuild_file ]; then
409 echo "Image file '$rebuild_file', for rebuild, does not exist!"
412 abs_rebuild_file=$(readlink -f "$rebuild_file") && rebuild_file="$abs_rebuild_file"
418 # get output file name and kernel version from command line arguments
424 if ! [[ ${outfile+x} ]]; then
426 elif ! [[ ${kernel+x} ]]; then
429 printf "\nUnknown arguments: %s\n\n" "$*" >&2
437 # extract input image file provided with rebuild option to get previous parameters, if any
438 if [[ $append_args_l == "yes" ]]; then
441 # determine resultant file
442 if ! [[ $outfile ]]; then
443 outfile=$rebuild_file
446 if ! rebuild_param=$(lsinitrd $rebuild_file '*lib
/dracut
/build-parameter.txt
'); then
447 echo "Image '$rebuild_file' has no rebuild information stored"
451 # prepend previous parameters to current command line args
452 if [[ $rebuild_param ]]; then
453 TEMP="$rebuild_param $TEMP"
455 rearrange_params "$@"
458 # clean the temporarily used scratch-pad directory
468 if [ $1 != "--" ] && [ $1 != "--rebuild" ]; then
469 PARMS_TO_STORE+=" $1";
472 --kver) kernel="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
473 -a|--add) add_dracutmodules_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
474 --force-add) force_add_dracutmodules_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
475 --add-drivers) add_drivers_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
476 --force-drivers) force_drivers_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
477 --omit-drivers) omit_drivers_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
478 -m|--modules) dracutmodules_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
479 -o|--omit) omit_dracutmodules_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
480 -d|--drivers) drivers_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
481 --filesystems) filesystems_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
482 -I|--install) install_items_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
483 --install-optional) install_optional_items_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
484 --fwdir) fw_dir_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
485 --libdirs) libdirs_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
486 --fscks) fscks_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
487 --add-fstab) add_fstab_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
488 --mount) fstab_lines+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
489 --add-device|--device) add_device_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
490 --kernel-cmdline) kernel_cmdline_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
491 --nofscks) nofscks_l="yes";;
492 --ro-mnt) ro_mnt_l="yes";;
493 -k|--kmoddir) drivers_dir_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
494 -c|--conf) conffile="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
495 --confdir) confdir="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
496 --tmpdir) tmpdir_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
497 -L|--stdlog) stdloglvl_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
498 --compress) compress_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
499 --prefix) prefix_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
500 --loginstall) loginstall_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
501 --rebuild) if [ $rebuild_file == $outfile ]; then
506 -f|--force) force=yes;;
507 --kernel-only) kernel_only="yes"; no_kernel="no";;
508 --no-kernel) kernel_only="no"; no_kernel="yes";;
510 print_cmdline="yes"; hostonly_l="yes"; kernel_only="yes"; no_kernel="yes";;
512 early_microcode_l="yes";;
513 --no-early-microcode)
514 early_microcode_l="no";;
515 --strip) do_strip_l="yes";;
516 --nostrip) do_strip_l="no";;
517 --prelink) do_prelink_l="yes";;
518 --noprelink) do_prelink_l="no";;
519 --hardlink) do_hardlink_l="yes";;
520 --nohardlink) do_hardlink_l="no";;
521 --noprefix) prefix_l="/";;
522 --mdadmconf) mdadmconf_l="yes";;
523 --nomdadmconf) mdadmconf_l="no";;
524 --lvmconf) lvmconf_l="yes";;
525 --nolvmconf) lvmconf_l="no";;
526 --debug) debug="yes";;
527 --profile) profile="yes";;
528 --sshkey) sshkey="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
529 --logfile) logfile_l="$2"; shift;;
530 -v|--verbose) ((verbosity_mod_l++));;
531 -q|--quiet) ((verbosity_mod_l--));;
534 [[ -f "$(readlink -f "${0%/*}")/dracut-init.sh" ]] \
535 && dracutbasedir="$(readlink -f "${0%/*}")"
537 -H|--hostonly|--host-only)
539 -N|--no-hostonly|--no-host-only)
542 hostonly_cmdline_l="yes" ;;
543 --no-hostonly-cmdline)
544 hostonly_cmdline_l="no" ;;
546 persistent_policy_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
547 --fstab) use_fstab_l="yes" ;;
548 -h|--help) long_usage; exit 1 ;;
549 -i|--include) include_src+=("$2"); PARMS_TO_STORE+=" '$2'";
551 --bzip2) compress_l="bzip2";;
552 --lzma) compress_l="lzma";;
553 --xz) compress_l="xz";;
554 --lzo) compress_l="lzo";;
555 --lz4) compress_l="lz4";;
556 --no-compress) _no_compress_l="cat";;
557 --gzip) compress_l="gzip";;
558 --list-modules) do_list="yes";;
563 --printsize) printsize="yes";;
564 --regenerate-all) regenerate_all="yes";;
565 --noimageifnotneeded) noimageifnotneeded="yes";;
566 --reproducible) reproducible_l="yes";;
569 uefi_stub_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
571 kernel_image_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
574 *) # should not even reach this point
575 printf "\n!Unknown option: '%s
'\n\n" "$1" >&2; usage; exit 1;;
580 # getopt cannot handle multiple arguments, so just handle "-I,--include"
581 # the old fashioned way
584 if [ "${1%%=*}" == "++include" ]; then
586 include_target+=("$3")
587 PARMS_TO_STORE+=" --include '$2' '$3'"
593 if [[ $regenerate_all == "yes" ]]; then
595 if [[ $kernel ]]; then
596 printf -- "--regenerate-all cannot be called with a kernel version\n" >&2
600 if [[ $outfile ]]; then
601 printf -- "--regenerate-all cannot be called with a image file\n" >&2
605 ((len=${#dracut_args[@]}))
606 for ((i=0; i < len; i++)); do
607 [[ ${dracut_args[$i]} == "--regenerate-all" ]] && \
608 unset dracut_args[$i]
613 [[ -f $i/modules.dep ]] || [[ -f $i/modules.dep.bin ]] || continue
614 dracut --kver="$i" "${dracut_args[@]}"
620 if ! [[ $kernel ]]; then
624 if [[ $kernel ]]; then
625 if ! [[ -d /lib/modules/$kernel ]] && [[ $no_kernel != yes ]]; then
626 printf -- "Kernel version $kernel has no module directory /lib/modules/$kernel\n" >&2
630 if ! [[ $outfile ]]; then
631 [[ -f /etc/machine-id ]] && read MACHINE_ID < /etc/machine-id
633 if [[ $MACHINE_ID ]] && ( [[ -d /boot/${MACHINE_ID} ]] || [[ -L /boot/${MACHINE_ID} ]] ); then
634 outfile="/boot/${MACHINE_ID}/$kernel/initrd"
636 outfile="/boot/initramfs-$kernel.img"
644 unset LD_LIBRARY_PATH
648 export DRACUT_LOG_LEVEL=warning
650 export DRACUT_LOG_LEVEL=debug
651 export PS4='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): ';
656 export PS4='+ $
(date "+%s.%N") ${BASH_SOURCE}@
${LINENO}: ';
661 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
663 # if we were not passed a config file, try the default one
664 if [[ ! -f $conffile ]]; then
665 if [[ $allowlocal ]]; then
666 conffile="$dracutbasedir/dracut.conf"
668 conffile="/etc/dracut.conf"
672 if [[ ! -d $confdir ]]; then
673 if [[ $allowlocal ]]; then
674 confdir="$dracutbasedir/dracut.conf.d"
676 confdir="/etc/dracut.conf.d"
680 # source our config file
681 [[ -f $conffile ]] && . "$conffile"
683 # source our config dir
684 for f in $(dropindirs_sort ".conf" "$confdir" "$dracutbasedir/dracut.conf.d"); do
685 [[ -e $f ]] && . "$f"
688 DRACUT_PATH=${DRACUT_PATH:-/sbin /bin /usr/sbin /usr/bin}
690 for i in $DRACUT_PATH; do
695 if [[ "$NPATH" != *:$rl* ]] ; then
699 export PATH="${NPATH#:}"
702 # these optins add to the stuff in the config file
703 if (( ${#add_dracutmodules_l[@]} )); then
704 while pop add_dracutmodules_l val; do
705 add_dracutmodules+=" $val "
709 if (( ${#force_add_dracutmodules_l[@]} )); then
710 while pop force_add_dracutmodules_l val; do
711 force_add_dracutmodules+=" $val "
715 if (( ${#fscks_l[@]} )); then
716 while pop fscks_l val; do
721 if (( ${#add_fstab_l[@]} )); then
722 while pop add_fstab_l val; do
727 if (( ${#fstab_lines_l[@]} )); then
728 while pop fstab_lines_l val; do
733 if (( ${#install_items_l[@]} )); then
734 while pop install_items_l val; do
735 install_items+=" $val "
739 if (( ${#install_optional_items_l[@]} )); then
740 while pop install_optional_items_l val; do
741 install_optional_items+=" $val "
745 # these options override the stuff in the config file
746 if (( ${#dracutmodules_l[@]} )); then
748 while pop dracutmodules_l val; do
749 dracutmodules+="$val "
753 if (( ${#omit_dracutmodules_l[@]} )); then
754 omit_dracutmodules=''
755 while pop omit_dracutmodules_l val; do
756 omit_dracutmodules+="$val "
760 if (( ${#filesystems_l[@]} )); then
762 while pop filesystems_l val; do
767 if (( ${#fw_dir_l[@]} )); then
769 while pop fw_dir_l val; do
774 if (( ${#libdirs_l[@]} )); then
776 while pop libdirs_l val; do
781 [[ $stdloglvl_l ]] && stdloglvl=$stdloglvl_l
782 [[ ! $stdloglvl ]] && stdloglvl=4
783 stdloglvl=$((stdloglvl + verbosity_mod_l))
784 ((stdloglvl > 6)) && stdloglvl=6
785 ((stdloglvl < 0)) && stdloglvl=0
787 [[ $drivers_dir_l ]] && drivers_dir=$drivers_dir_l
788 [[ $do_strip_l ]] && do_strip=$do_strip_l
789 [[ $do_strip ]] || do_strip=yes
790 [[ $do_prelink_l ]] && do_prelink=$do_prelink_l
791 [[ $do_prelink ]] || do_prelink=yes
792 [[ $do_hardlink_l ]] && do_hardlink=$do_hardlink_l
793 [[ $do_hardlink ]] || do_hardlink=yes
794 [[ $prefix_l ]] && prefix=$prefix_l
795 [[ $prefix = "/" ]] && unset prefix
796 [[ $hostonly_l ]] && hostonly=$hostonly_l
797 [[ $hostonly_cmdline_l ]] && hostonly_cmdline=$hostonly_cmdline_l
798 [[ "$hostonly" == "yes" ]] && ! [[ $hostonly_cmdline ]] && hostonly_cmdline="yes"
799 [[ $persistent_policy_l ]] && persistent_policy=$persistent_policy_l
800 [[ $use_fstab_l ]] && use_fstab=$use_fstab_l
801 [[ $mdadmconf_l ]] && mdadmconf=$mdadmconf_l
802 [[ $lvmconf_l ]] && lvmconf=$lvmconf_l
803 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
804 [[ $fw_dir ]] || fw_dir="/lib/firmware/updates /lib/firmware /lib/firmware/$kernel"
805 [[ $tmpdir_l ]] && tmpdir="$tmpdir_l"
806 [[ $tmpdir ]] || tmpdir=/var/tmp
807 [[ $INITRD_COMPRESS ]] && compress=$INITRD_COMPRESS
808 [[ $compress_l ]] && compress=$compress_l
809 [[ $show_modules_l ]] && show_modules=$show_modules_l
810 [[ $nofscks_l ]] && nofscks="yes"
811 [[ $ro_mnt_l ]] && ro_mnt="yes"
812 [[ $early_microcode_l ]] && early_microcode=$early_microcode_l
813 [[ $early_microcode ]] || early_microcode=no
814 [[ $logfile_l ]] && logfile="$logfile_l"
815 [[ $reproducible_l ]] && reproducible="$reproducible_l"
816 [[ $loginstall_l ]] && loginstall="$loginstall_l"
817 [[ $uefi_stub_l ]] && uefi_stub="$uefi_stub_l"
818 [[ $kernel_image_l ]] && kernel_image="$kernel_image_l"
820 # eliminate IFS hackery when messing with fw_dir
821 fw_dir=${fw_dir//:/ }
823 # check for logfile and try to create one if it doesn't exist
824 if [[ -n "$logfile" ]];then
825 if [[ ! -f "$logfile" ]];then
827 if [ ! $?
-eq 0 ] ;then
828 printf "%s\n" "dracut: touch $logfile failed." >&2
833 # handle compression options.
834 [[ $compress ]] ||
compress="gzip"
836 bzip2) compress="bzip2 -9";
837 command -v lbzip2
> /dev
/null
2>&1 && compress="lbzip2 -9";;
838 lzma
) compress="lzma -9 -T0";;
839 xz
) compress="xz --check=crc32 --lzma2=dict=1MiB -T0";;
840 gzip) compress="gzip -n -9";
841 if command -v pigz
> /dev
/null
2>&1; then
842 compress="pigz -9 -n -T -R"
843 elif command -v gzip --help 2>&1 |
grep -q rsyncable
; then
844 compress="gzip -n -9 --rsyncable"
847 lzo
) compress="lzop -9";;
848 lz4
) compress="lz4 -l -9";;
850 if [[ $_no_compress_l = "cat" ]]; then
854 [[ $hostonly = yes ]] && hostonly
="-h"
855 [[ $hostonly != "-h" ]] && unset hostonly
857 [[ $reproducible == yes ]] && DRACUT_REPRODUCIBLE
=1
859 readonly TMPDIR
="$tmpdir"
860 readonly initdir
="$(mktemp --tmpdir="$TMPDIR/" -d -t initramfs.XXXXXX)"
861 [ -d "$initdir" ] ||
{
862 printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t initramfs.XXXXXX failed." >&2
866 if [[ $early_microcode = yes ]] ||
( [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]] ); then
867 readonly early_cpio_dir
="$(mktemp --tmpdir="$TMPDIR/" -d -t early_cpio.XXXXXX)"
868 [ -d "$early_cpio_dir" ] ||
{
869 printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t early_cpio.XXXXXX failed." >&2
873 # clean up after ourselves no matter how we die.
876 [[ $keep ]] && echo "Not removing $initdir." >&2 || { [[ $initdir ]] && rm -rf -- "$initdir"; };
877 [[ $keep ]] && echo "Not removing $early_cpio_dir." >&2 || { [[ $early_cpio_dir ]] && rm -Rf -- "$early_cpio_dir"; };
878 [[ $keep ]] && echo "Not removing $uefi_outdir." >&2 || { [[ $uefi_outdir ]] && rm -Rf -- "$uefi_outdir"; };
879 [[ $_dlogdir ]] && rm -Rf -- "$_dlogdir";
883 # clean up after ourselves no matter how we die.
884 trap 'exit 1;' SIGINT
886 export DRACUT_KERNEL_LAZY
="1"
887 export DRACUT_RESOLVE_LAZY
="1"
889 if [[ $print_cmdline ]]; then
896 if [[ -f $dracutbasedir/dracut-version.sh
]]; then
897 .
$dracutbasedir/dracut-version.sh
900 if [[ -f $dracutbasedir/dracut-init.sh
]]; then
901 .
$dracutbasedir/dracut-init.sh
903 printf "%s\n" "dracut: Cannot find $dracutbasedir/dracut-init.sh." >&2
904 printf "%s\n" "dracut: Are you running from a git checkout?" >&2
905 printf "%s\n" "dracut: Try passing -l as an argument to $0" >&2
909 if ! [[ $print_cmdline ]]; then
911 if ! $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R "$initdir/bin/sh" &>/dev
/null
; then
912 unset DRACUT_RESOLVE_LAZY
913 export DRACUT_RESOLVE_DEPS
=1
915 rm -fr -- ${initdir}/*
918 # Verify bash version, current minimum is 4
919 if (( BASH_VERSINFO
[0] < 4 )); then
920 dfatal
'You need at least Bash 4 to use dracut, sorry.'
924 dracutfunctions
=$dracutbasedir/dracut-functions.sh
925 export dracutfunctions
927 if (( ${#drivers_l[@]} )); then
929 while pop drivers_l val
; do
933 drivers
=${drivers/-/_}
935 if (( ${#add_drivers_l[@]} )); then
936 while pop add_drivers_l val
; do
937 add_drivers
+=" $val "
940 add_drivers
=${add_drivers/-/_}
942 if (( ${#force_drivers_l[@]} )); then
943 while pop force_drivers_l val
; do
944 force_drivers
+=" $val "
947 force_drivers
=${force_drivers/-/_}
949 if (( ${#omit_drivers_l[@]} )); then
950 while pop omit_drivers_l val
; do
951 omit_drivers
+=" $val "
954 omit_drivers
=${omit_drivers/-/_}
956 if (( ${#kernel_cmdline_l[@]} )); then
957 while pop kernel_cmdline_l val
; do
958 kernel_cmdline
+=" $val "
962 omit_drivers_corrected
=""
963 for d
in $omit_drivers; do
964 [[ " $drivers $add_drivers " == *\
$d\
* ]] && continue
965 [[ " $drivers $force_drivers " == *\
$d\
* ]] && continue
966 omit_drivers_corrected
+="$d|"
968 omit_drivers
="${omit_drivers_corrected%|}"
969 unset omit_drivers_corrected
971 # prepare args for logging
972 for ((i
=0; i
< ${#dracut_args[@]}; i
++)); do
973 [[ "${dracut_args[$i]}" == *\
* ]] && \
974 dracut_args
[$i]="\"${dracut_args[$i]}\""
978 dinfo
"Executing: $0 ${dracut_args[@]}"
980 [[ $do_list = yes ]] && {
981 for mod
in $dracutbasedir/modules.d
/*; do
982 [[ -d $mod ]] ||
continue;
983 [[ -e $mod/install ||
-e $mod/installkernel || \
984 -e $mod/module-setup.sh
]] ||
continue
985 printf "%s\n" "${mod##*/??}"
990 # This is kinda legacy -- eventually it should go away.
991 case $dracutmodules in
992 ""|auto
) dracutmodules
="all" ;;
995 abs_outfile
=$
(readlink
-f "$outfile") && outfile
="$abs_outfile"
997 if [[ -d $srcmods ]]; then
998 [[ -f $srcmods/modules.dep
]] ||
{
999 dwarn
"$srcmods/modules.dep is missing. Did you run depmod?"
1003 if [[ ! $print_cmdline ]]; then
1004 if [[ -f $outfile && ! $force ]]; then
1005 dfatal
"Will not override existing initramfs ($outfile) without --force"
1009 outdir
=${outfile%/*}
1010 [[ $outdir ]] || outdir
="/"
1012 if [[ ! -d "$outdir" ]]; then
1013 dfatal
"Can't write to $outdir: Directory $outdir does not exist or is not accessible."
1015 elif [[ ! -w "$outdir" ]]; then
1016 dfatal
"No permission to write to $outdir."
1018 elif [[ -f "$outfile" && ! -w "$outfile" ]]; then
1019 dfatal
"No permission to write $outfile."
1023 if [[ $loginstall ]]; then
1024 if ! mkdir
-p "$loginstall"; then
1025 dfatal
"Could not create directory to log installed files to '$loginstall'."
1028 loginstall
=$
(readlink
-f "$loginstall")
1031 if [[ $uefi = yes ]]; then
1032 if ! command -v objcopy
&>/dev
/null
; then
1033 dfatal
"Need 'objcopy' to create a UEFI executable"
1036 unset EFI_MACHINE_TYPE_NAME
1039 EFI_MACHINE_TYPE_NAME
=x64
;;
1041 EFI_MACHINE_TYPE_NAME
=ia32
;;
1043 dfatal
"Architecture '$(arch)' not supported to create a UEFI executable"
1048 if ! [[ -s $uefi_stub ]]; then
1050 "/lib/systemd/boot/efi/linux${EFI_MACHINE_TYPE_NAME}.efi.stub" \
1051 "/usr/lib/gummiboot/linux${EFI_MACHINE_TYPE_NAME}.efi.stub"; do
1052 [[ -s $uefi_stub ]] ||
continue
1056 if ! [[ -s $uefi_stub ]]; then
1057 dfatal
"Can't find a uefi stub '$uefi_stub' to create a UEFI executable"
1061 if ! [[ $kernel_image ]]; then
1062 for kernel_image
in "/lib/modules/$kernel/vmlinuz" "/boot/vmlinuz-$kernel"; do
1063 [[ -s "$kernel_image" ]] ||
continue
1067 if ! [[ -s $kernel_image ]]; then
1068 dfatal
"Can't find a kernel image '$kernel_image' to create a UEFI executable"
1074 if [[ $acpi_override = yes ]] && ! check_kernel_config CONFIG_ACPI_INITRD_TABLE_OVERRIDE
; then
1075 dwarn
"Disabling ACPI override, because kernel does not support it. CONFIG_ACPI_INITRD_TABLE_OVERRIDE!=y"
1079 if [[ $early_microcode = yes ]]; then
1080 if [[ $hostonly ]]; then
1081 [[ $
(get_cpu_vendor
) == "AMD" ]] \
1082 && ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
1083 && unset early_microcode
1084 [[ $
(get_cpu_vendor
) == "Intel" ]] \
1085 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
1086 && unset early_microcode
1088 ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
1089 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
1090 && unset early_microcode
1092 [[ $early_microcode != yes ]] \
1093 && dwarn
"Disabling early microcode, because kernel does not support it. CONFIG_MICROCODE_[AMD|INTEL]_EARLY!=y"
1096 # Need to be able to have non-root users read stuff (rpcbind etc)
1097 chmod 755 "$initdir"
1099 if [[ $hostonly ]]; then
1100 for i
in /sys
/proc
/run
/dev
; do
1101 if ! findmnt
--target "$i" &>/dev
/null
; then
1102 dwarning
"Turning off host-only mode: '$i' is not mounted!"
1108 declare -A host_fs_types
1110 for line
in "${fstab_lines[@]}"; do
1116 dev
=$
(blkid
-l -t UUID
=${dev#UUID=} -o device
)
1119 dev
=$
(blkid
-l -t LABEL
=${dev#LABEL=} -o device
)
1122 dev
=$
(blkid
-l -t PARTUUID
=${dev#PARTUUID=} -o device
)
1125 dev
=$
(blkid
-l -t PARTLABEL
=${dev#PARTLABEL=} -o device
)
1128 [ -z "$dev" ] && dwarn
"Bad fstab entry $@" && continue
1129 if [[ "$3" == btrfs
]]; then
1130 for i
in $
(btrfs_devs
"$2"); do
1134 push_host_devs
"$dev"
1135 host_fs_types
["$dev"]="$3"
1138 for f
in $add_fstab; do
1139 [[ -e $f ]] ||
continue
1140 while read dev rest ||
[ -n "$dev" ]; do
1141 push_host_devs
"$dev"
1145 for dev
in $add_device; do
1146 push_host_devs
"$dev"
1149 if (( ${#add_device_l[@]} )); then
1150 while pop add_device_l val
; do
1151 add_device
+=" $val "
1152 push_host_devs
"$val"
1156 if [[ $hostonly ]]; then
1157 # in hostonly mode, determine all devices, which have to be accessed
1158 # and examine them for filesystem types
1176 mp
=$
(readlink
-f "$mp")
1177 mountpoint
"$mp" >/dev
/null
2>&1 ||
continue
1178 _dev
=$
(find_block_device
"$mp")
1179 _bdev
=$
(readlink
-f "/dev/block/$_dev")
1180 [[ -b $_bdev ]] && _dev
=$_bdev
1181 push_host_devs
$_dev
1182 [[ "$mp" == "/" ]] && root_devs
+=("$_dev")
1183 push_host_devs
"$_dev"
1184 if [[ $
(find_mp_fstype
"$mp") == btrfs
]]; then
1185 for i
in $
(btrfs_devs
"$mp"); do
1186 [[ "$mp" == "/" ]] && root_devs
+=("$i")
1192 if [[ -f /proc
/swaps
]] && [[ -f /etc
/fstab
]]; then
1193 while read dev
type rest ||
[ -n "$dev" ]; do
1194 [[ -b $dev ]] ||
continue
1195 [[ "$type" == "partition" ]] ||
continue
1197 while read _d _m _t _o _r ||
[ -n "$_d" ]; do
1198 [[ "$_d" == \
#* ]] && continue
1199 [[ $_d ]] ||
continue
1200 [[ $_t != "swap" ]] && continue
1201 [[ $_m != "swap" ]] && [[ $_m != "none" ]] && continue
1202 [[ "$_o" == *noauto
* ]] && continue
1203 _d
=$
(expand_persistent_dev
"$_d")
1204 [[ "$_d" -ef "$dev" ]] ||
continue
1206 if [[ -f /etc
/crypttab
]]; then
1207 while read _mapper _a _p _o ||
[ -n "$_mapper" ]; do
1208 [[ $_mapper = \
#* ]] && continue
1209 [[ "$_d" -ef /dev
/mapper
/"$_mapper" ]] ||
continue
1210 [[ "$_o" ]] || _o
="$_p"
1211 # skip entries with password files
1212 [[ "$_p" == /* ]] && [[ -f $_p ]] && continue 2
1214 [[ $_o == *swap
* ]] && continue 2
1215 done < /etc
/crypttab
1218 _dev
="$(readlink -f "$dev")"
1219 push_host_devs
"$_dev"
1220 swap_devs
+=("$_dev")
1226 # collect all "x-initrd.mount" entries from /etc/fstab
1227 if [[ -f /etc
/fstab
]]; then
1228 while read _d _m _t _o _r ||
[ -n "$_d" ]; do
1229 [[ "$_d" == \
#* ]] && continue
1230 [[ $_d ]] ||
continue
1231 [[ "$_o" != *x-initrd.mount
* ]] && continue
1232 _dev
=$
(expand_persistent_dev
"$_d")
1233 _dev
="$(readlink -f "$_dev")"
1234 [[ -b $_dev ]] ||
continue
1236 push_host_devs
"$_dev"
1237 if [[ "$_t" == btrfs
]]; then
1238 for i
in $
(find_btrfs_devs
"$_m"); do
1245 # record all host modaliases
1246 declare -A host_modalias
1247 find /sys
/devices
/ -name uevent
-print > "$initdir/.modalias"
1248 while read m ||
[ -n "$m" ]; do
1249 while read line ||
[ -n "$line" ]; do
1250 [[ "$line" != MODALIAS\
=* ]] && continue
1251 modalias
="${line##MODALIAS=}" && [[ $modalias ]] && host_modalias
["$modalias"]=1
1254 done < "$initdir/.modalias"
1256 rm -f -- "$initdir/.modalias"
1258 while read _k _s _v ||
[ -n "$_k" ]; do
1259 [ "$_k" != "name" -a "$_k" != "driver" ] && continue
1260 host_modalias
["$_v"]=1
1263 # check /proc/modules
1264 declare -A host_modules
1265 while read m rest ||
[ -n "$m" ]; do
1266 host_modules
["$m"]=1
1275 if [[ -b /dev
/block
/$1 ]]; then
1276 ID_FS_TYPE
=$
(get_fs_env
"/dev/block/$1") && host_fs_types
["$(readlink -f "/dev
/block
/$1")"]="$ID_FS_TYPE"
1279 if [[ -b $1 ]]; then
1280 ID_FS_TYPE
=$
(get_fs_env
"$1") && host_fs_types
["$(readlink -f "$1")"]="$ID_FS_TYPE"
1283 if fstype
=$
(find_dev_fstype
"$1"); then
1284 host_fs_types
["$1"]="$fstype"
1290 for dev
in ${host_devs[@]}; do
1292 check_block_and_slaves_all _get_fs_type
"$(get_maj_min "$dev")"
1295 for dev
in "${!host_fs_types[@]}"; do
1296 [[ ${host_fs_types[$dev]} = "reiserfs" ]] ||
[[ ${host_fs_types[$dev]} = "xfs" ]] ||
continue
1297 rootopts
=$
(find_dev_fsopts
"$dev")
1298 if [[ ${host_fs_types[$dev]} = "reiserfs" ]]; then
1299 journaldev
=$
(fs_get_option
$rootopts "jdev")
1300 elif [[ ${host_fs_types[$dev]} = "xfs" ]]; then
1301 journaldev
=$
(fs_get_option
$rootopts "logdev")
1303 if [[ $journaldev ]]; then
1304 dev
="$(readlink -f "$dev")"
1305 push_host_devs
"$dev"
1307 check_block_and_slaves_all _get_fs_type
"$(get_maj_min "$dev")"
1312 || udevdir
="$(pkg-config udev --variable=udevdir 2>/dev/null)"
1313 if ! [[ -d "$udevdir" ]]; then
1314 [[ ! -h /lib
]] && [[ -d /lib
/udev
]] && udevdir
=/lib
/udev
1315 [[ -d /usr
/lib
/udev
]] && udevdir
=/usr
/lib
/udev
1318 [[ -d $systemdutildir ]] \
1319 || systemdutildir
=$
(pkg-config systemd
--variable=systemdutildir
2>/dev
/null
)
1321 if ! [[ -d "$systemdutildir" ]]; then
1322 [[ ! -h /lib
]] && [[ -d /lib
/systemd
]] && systemdutildir
=/lib
/systemd
1323 [[ -d /usr
/lib
/systemd
]] && systemdutildir
=/usr
/lib
/systemd
1326 [[ -d $systemdsystemunitdir ]] \
1327 || systemdsystemunitdir
=$
(pkg-config systemd
--variable=systemdsystemunitdir
2>/dev
/null
)
1329 [[ -d "$systemdsystemunitdir" ]] || systemdsystemunitdir
=${systemdutildir}/system
1331 [[ -d $systemdsystemconfdir ]] \
1332 || systemdsystemconfdir
=$
(pkg-config systemd
--variable=systemdsystemconfdir
2>/dev
/null
)
1334 [[ -d "$systemdsystemconfdir" ]] || systemdsystemconfdir
=/etc
/systemd
/system
1336 [[ -d $tmpfilesdir ]] \
1337 || tmpfilesdir
=$
(pkg-config systemd
--variable=tmpfilesdir
2>/dev
/null
)
1339 if ! [[ -d "$tmpfilesdir" ]]; then
1340 [[ -f /lib
/tmpfiles.d
]] && tmpfilesdir
=/lib
/tmpfiles.d
1341 [[ -f /usr
/lib
/tmpfiles.d
]] && tmpfilesdir
=/usr
/lib
/tmpfiles.d
1344 export initdir dracutbasedir \
1345 dracutmodules force_add_dracutmodules add_dracutmodules omit_dracutmodules \
1347 fw_dir drivers_dir debug no_kernel kernel_only \
1348 omit_drivers mdadmconf lvmconf root_dev \
1349 use_fstab fstab_lines libdirs fscks nofscks ro_mnt \
1350 stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
1351 debug host_fs_types host_devs swap_devs sshkey add_fstab \
1352 DRACUT_VERSION udevdir prefix filesystems drivers \
1353 systemdutildir systemdsystemunitdir systemdsystemconfdir \
1354 host_modalias host_modules hostonly_cmdline loginstall \
1358 # check all our modules to see if they should be sourced.
1359 # This builds a list of modules that we will install next.
1360 for_each_module_dir check_module
1361 for_each_module_dir check_mount
1363 dracut_module_included
"fips" && export DRACUT_FIPS_MODE
=1
1367 local -A _mods_to_print
1368 for i
in $modules_loaded $mods_to_load; do
1369 _mods_to_print
[$i]=1
1372 # source our modules.
1373 for moddir
in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1374 _d_mod
=${moddir##*/}; _d_mod
=${_d_mod#[0-9][0-9]}
1375 [[ ${_mods_to_print[$_d_mod]} ]] ||
continue
1376 module_cmdline
"$_d_mod"
1381 if [[ $print_cmdline ]]; then
1387 # Create some directory structure first
1388 [[ $prefix ]] && mkdir
-m 0755 -p "${initdir}${prefix}"
1390 [[ -h /lib
]] || mkdir
-m 0755 -p "${initdir}${prefix}/lib"
1391 [[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib"
1393 if [[ $prefix ]]; then
1394 for d
in bin etc lib sbin tmp usr var
$libdirs; do
1395 [[ "$d" == */* ]] && continue
1396 ln -sfn "${prefix#/}/${d#/}" "$initdir/$d"
1400 if [[ $kernel_only != yes ]]; then
1401 for d
in usr
/bin usr
/sbin bin etc lib sbin tmp usr var var
/tmp
$libdirs; do
1402 [[ -e "${initdir}${prefix}/$d" ]] && continue
1403 if [ -L "/$d" ]; then
1404 inst_symlink
"/$d" "${prefix}/$d"
1406 mkdir
-m 0755 -p "${initdir}${prefix}/$d"
1410 for d
in dev proc sys sysroot root run
; do
1411 if [ -L "/$d" ]; then
1414 mkdir
-m 0755 -p "$initdir/$d"
1418 ln -sfn ..
/run
"$initdir/var/run"
1419 ln -sfn ..
/run
/lock
"$initdir/var/lock"
1421 for d
in lib
"$libdir"; do
1422 [[ -e "${initdir}${prefix}/$d" ]] && continue
1423 if [ -h "/$d" ]; then
1424 inst
"/$d" "${prefix}/$d"
1426 mkdir
-m 0755 -p "${initdir}${prefix}/$d"
1431 if [[ $kernel_only != yes ]]; then
1432 mkdir
-p "${initdir}/etc/cmdline.d"
1433 for _d
in $hookdirs; do
1434 mkdir
-m 0755 -p ${initdir}/lib
/dracut
/hooks
/$_d
1436 if [[ "$UID" = "0" ]]; then
1437 [ -c ${initdir}/dev
/null
] || mknod
${initdir}/dev
/null c
1 3
1438 [ -c ${initdir}/dev
/kmsg
] || mknod
${initdir}/dev
/kmsg c
1 11
1439 [ -c ${initdir}/dev
/console
] || mknod
${initdir}/dev
/console c
5 1
1443 _isize
=0 #initramfs size
1445 # source our modules.
1446 for moddir
in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1447 _d_mod
=${moddir##*/}; _d_mod
=${_d_mod#[0-9][0-9]}
1448 [[ "$mods_to_load" == *\
$_d_mod\
* ]] ||
continue
1449 if [[ $show_modules = yes ]]; then
1450 printf "%s\n" "$_d_mod"
1452 dinfo
"*** Including module: $_d_mod ***"
1454 if [[ $kernel_only == yes ]]; then
1455 module_installkernel
"$_d_mod" ||
{
1456 dfatal
"installkernel failed in module $_d_mod"
1460 module_install
"$_d_mod"
1461 if [[ $no_kernel != yes ]]; then
1462 module_installkernel
"$_d_mod" ||
{
1463 dfatal
"installkernel failed in module $_d_mod"
1468 mods_to_load
=${mods_to_load// $_d_mod /}
1469 modules_loaded
+="$_d_mod "
1471 #print the module install size
1472 if [ -n "$printsize" ]; then
1473 _isize_new
=$
(du
-sk ${initdir}|cut
-f1)
1474 _isize_delta
=$
((_isize_new
- _isize
))
1475 printf "%s\n" "$_d_mod install size: ${_isize_delta}k"
1481 for i
in $modules_loaded; do
1482 mkdir
-p $initdir/lib
/dracut
1483 printf "%s\n" "$i" >> $initdir/lib
/dracut
/modules.txt
1486 dinfo
"*** Including modules done ***"
1488 ## final stuff that has to happen
1489 if [[ $no_kernel != yes ]]; then
1491 if [[ $drivers ]]; then
1492 hostonly
='' instmods
$drivers
1495 if [[ $add_drivers ]]; then
1496 hostonly
='' instmods
-c $add_drivers
1498 if [[ $force_drivers ]]; then
1499 hostonly
='' instmods
-c $force_drivers
1500 rm -f $initdir/etc
/cmdline.d
/20-force_driver.conf
1501 for mod
in $force_drivers; do
1502 echo "rd.driver.pre=$mod" >>$initdir/etc
/cmdline.d
/20-force_drivers.conf
1505 if [[ $filesystems ]]; then
1506 hostonly
='' instmods
-c $filesystems
1509 dinfo
"*** Installing kernel module dependencies and firmware ***"
1511 dinfo
"*** Installing kernel module dependencies and firmware done ***"
1513 if [[ $noimageifnotneeded == yes ]] && [[ $hostonly ]]; then
1514 if [[ ! -f "$initdir/lib/dracut/need-initqueue" ]] && \
1515 [[ -f ${initdir}/lib
/modules
/$kernel/modules.dep
&& ! -s ${initdir}/lib
/modules
/$kernel/modules.dep
]]; then
1516 for i
in ${initdir}/etc
/cmdline.d
/*.conf
; do
1517 # We need no initramfs image and do not generate one.
1518 [[ $i == "${initdir}/etc/cmdline.d/*.conf" ]] && exit 0
1524 if [[ $kernel_only != yes ]]; then
1525 (( ${#install_items[@]} > 0 )) && inst_multiple
${install_items[@]}
1526 (( ${#install_optional_items[@]} > 0 )) && inst_multiple
-o ${install_optional_items[@]}
1528 [[ $kernel_cmdline ]] && printf "%s\n" "$kernel_cmdline" >> "${initdir}/etc/cmdline.d/01-default.conf"
1530 while pop fstab_lines line
; do
1532 [ -z "${line[3]}" ] && line
[3]="defaults"
1533 [ -z "${line[4]}" ] && line
[4]="0"
1534 [ -z "${line[5]}" ] && line
[5]="2"
1535 strstr
"${line[2]}" "nfs" && line
[5]="0"
1536 echo "${line[@]}" >> "${initdir}/etc/fstab"
1539 for f
in $add_fstab; do
1540 cat "$f" >> "${initdir}/etc/fstab"
1543 if [ -d ${initdir}/$systemdutildir ]; then
1544 mkdir
-p ${initdir}/etc
/conf.d
1546 printf "%s\n" "systemdutildir=\"$systemdutildir\""
1547 printf "%s\n" "systemdsystemunitdir=\"$systemdsystemunitdir\""
1548 printf "%s\n" "systemdsystemconfdir=\"$systemdsystemconfdir\""
1549 } > ${initdir}/etc
/conf.d
/systemd.conf
1552 if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then
1553 dinfo
"*** Resolving executable dependencies ***"
1554 find "$initdir" -type f
-perm /0111 -not -path '*.ko' -print0 \
1555 |
xargs -r -0 $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R ${DRACUT_FIPS_MODE:+-H} --
1556 dinfo
"*** Resolving executable dependencies done***"
1559 # libpthread workaround: pthread_cancel wants to dlopen libgcc_s.so
1560 for _dir
in $libdirs; do
1561 for _f
in "$_dir/libpthread.so"*; do
1562 [[ -e "$_f" ]] ||
continue
1563 inst_libdir_file
"libgcc_s.so*"
1569 while pop include_src src
&& pop include_target target
; do
1570 if [[ $src && $target ]]; then
1571 if [[ -f $src ]]; then
1574 ddebug
"Including directory: $src"
1575 destdir
="${initdir}/${target}"
1577 # check for preexisting symlinks, so we can cope with the
1578 # symlinks to $prefix
1579 # Objectname is a file or a directory
1580 for objectname
in "$src"/*; do
1581 [[ -e "$objectname" ||
-h "$objectname" ]] ||
continue
1582 if [[ -d "$objectname" ]]; then
1583 # objectname is a directory, let's compute the final directory name
1584 object_destdir
=${destdir}/${objectname#$src/}
1585 if ! [[ -e "$object_destdir" ]]; then
1586 mkdir
-m 0755 -p "$object_destdir"
1587 chmod --reference="$objectname" "$object_destdir"
1589 cp --reflink=auto
--sparse=auto
-fa -t "$object_destdir" "$objectname"/*
1591 cp --reflink=auto
--sparse=auto
-fa -t "$destdir" "$objectname"
1598 if [[ $kernel_only != yes ]]; then
1599 # make sure that library links are correct and up to date
1600 for f
in /etc
/ld.so.conf
/etc
/ld.so.conf.d
/*; do
1601 [[ -f $f ]] && inst_simple
"$f"
1603 if ! ldconfig
-r "$initdir"; then
1604 if [[ $UID = 0 ]]; then
1605 derror
"ldconfig exited ungracefully"
1607 derror
"ldconfig might need uid=0 (root) for chroot()"
1612 PRELINK_BIN
="$(command -v prelink)"
1613 if [[ $UID = 0 ]] && [[ $PRELINK_BIN ]]; then
1614 if [[ $DRACUT_FIPS_MODE ]]; then
1615 dinfo
"*** Installing prelink files ***"
1616 inst_multiple
-o prelink
/etc
/prelink.conf
/etc
/prelink.conf.d
/*.conf
/etc
/prelink.cache
1617 elif [[ $do_prelink == yes ]]; then
1618 dinfo
"*** Pre-linking files ***"
1619 inst_multiple
-o prelink
/etc
/prelink.conf
/etc
/prelink.conf.d
/*.conf
1620 chroot
"$initdir" "$PRELINK_BIN" -a
1621 rm -f -- "$initdir/$PRELINK_BIN"
1622 rm -fr -- "$initdir"/etc
/prelink.
*
1623 dinfo
"*** Pre-linking files done ***"
1627 if [[ $do_hardlink = yes ]] && command -v hardlink
>/dev
/null
; then
1628 dinfo
"*** Hardlinking files ***"
1629 hardlink
"$initdir" 2>&1
1630 dinfo
"*** Hardlinking files done ***"
1634 if [[ $do_strip = yes ]] ; then
1635 for p
in strip
xargs find; do
1636 if ! type -P $p >/dev
/null
; then
1637 dinfo
"Could not find '$p'. Not stripping the initramfs."
1643 if [[ $do_strip = yes ]] && ! [[ $DRACUT_FIPS_MODE ]]; then
1644 dinfo
"*** Stripping files ***"
1645 find "$initdir" -type f \
1646 -executable -not -path '*/lib/modules/*.ko' -print0 \
1647 |
xargs -r -0 strip
-g 2>/dev
/null
1649 # strip kernel modules, but do not touch signed modules
1650 find "$initdir" -type f
-path '*/lib/modules/*.ko' -print0 \
1651 |
while read -r -d $
'\0' f ||
[ -n "$f" ]; do
1652 SIG
=$
(tail -c 28 "$f")
1653 [[ $SIG == '~Module signature appended~' ]] ||
{ printf "%s\000" "$f"; }
1654 done |
xargs -r -0 strip
-g
1656 dinfo
"*** Stripping files done ***"
1658 if [[ $early_microcode = yes ]]; then
1659 dinfo
"*** Generating early-microcode cpio image ***"
1660 ucode_dir
=(amd-ucode intel-ucode
)
1661 ucode_dest
=(AuthenticAMD.bin GenuineIntel.bin
)
1662 _dest_dir
="$early_cpio_dir/d/kernel/x86/microcode"
1665 if [[ $hostonly ]]; then
1666 [[ $
(get_cpu_vendor
) == "AMD" ]] && _dest_idx
="0"
1667 [[ $
(get_cpu_vendor
) == "Intel" ]] && _dest_idx
="1"
1669 for idx
in $_dest_idx; do
1670 _fw
=${ucode_dir[$idx]}
1671 for _fwdir
in $fw_dir; do
1672 if [[ -d $_fwdir && -d $_fwdir/$_fw ]]; then
1674 dinfo
"*** Constructing ${ucode_dest[$idx]} ****"
1675 if [[ $hostonly ]]; then
1676 _src
=$
(get_ucode_file
)
1677 if ! [[ -r $_fwdir/$_fw/$_src ]];then
1681 cat $_fwdir/$_fw/$_src > $_dest_dir/${ucode_dest[$idx]}
1682 create_early_cpio
="yes"
1688 if [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]]; then
1689 dinfo
"*** Packaging ACPI tables to override BIOS provided ones ***"
1690 _dest_dir
="$early_cpio_dir/d/kernel/firmware/acpi"
1692 for table
in $acpi_table_dir/*.aml
; do
1693 dinfo
" Adding ACPI table: $table"
1694 cp -a $table $_dest_dir
1695 create_early_cpio
="yes"
1699 dinfo
"*** Store current command line parameters ***"
1700 if ! ( echo $PARMS_TO_STORE > $initdir/lib
/dracut
/build-parameter.txt
); then
1701 dfatal
"Could not store the current command line parameters"
1705 if [[ $hostonly_cmdline ]] ; then
1706 unset _stored_cmdline
1707 if [ -d $initdir/etc
/cmdline.d
];then
1708 dinfo
"Stored kernel commandline:"
1709 for conf
in $initdir/etc
/cmdline.d
/*.conf
; do
1710 [ -e "$conf" ] ||
continue
1715 if ! [[ $_stored_cmdline ]]; then
1716 dinfo
"No dracut internal kernel commandline stored in initrd"
1720 dinfo
"*** Creating image file '$outfile' ***"
1722 if [[ $uefi = yes ]]; then
1723 uefi_outfile
="$outfile"
1724 readonly uefi_outdir
="$(mktemp --tmpdir="$TMPDIR/" -d -t initrd.XXXXXX)"
1725 # redirect initrd output
1726 outfile
="$uefi_outdir/initrd"
1729 if [[ $DRACUT_REPRODUCIBLE ]]; then
1730 find "$initdir" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1731 |
xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1733 [[ "$(cpio --help)" == *--reproducible* ]] && CPIO_REPRODUCIBLE
=1
1736 [[ "$UID" != 0 ]] && cpio_owner_root
="-R 0:0"
1738 if [[ $create_early_cpio = yes ]]; then
1739 echo 1 > "$early_cpio_dir/d/early_cpio"
1741 if [[ $DRACUT_REPRODUCIBLE ]]; then
1742 find "$early_cpio_dir/d" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1743 |
xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1746 # The microcode blob is _before_ the initramfs blob, not after
1748 cd "$early_cpio_dir/d"
1749 find .
-print0 |
sort -z \
1750 |
cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc
-o --quiet > $outfile
1755 umask 077; cd "$initdir"
1756 find .
-print0 |
sort -z \
1757 |
cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc
-o --quiet \
1758 |
$compress >> "$outfile"
1760 dfatal
"dracut: creation of $outfile failed"
1763 dinfo
"*** Creating initrd image file '$outfile' done ***"
1765 if (( maxloglvl
>= 5 )); then
1766 if [[ $allowlocal ]]; then
1767 "$dracutbasedir/lsinitrd.sh" "$outfile"| ddebug
1769 lsinitrd
"$outfile"| ddebug
1773 if [[ $uefi = yes ]]; then
1774 if [[ $kernel_cmdline ]]; then
1775 echo -n "$kernel_cmdline" > "$uefi_outdir/cmdline.txt"
1776 elif [[ $hostonly_cmdline = yes ]] && [ -d $initdir/etc
/cmdline.d
];then
1777 for conf
in $initdir/etc
/cmdline.d
/*.conf
; do
1778 [ -e "$conf" ] ||
continue
1779 printf "%s " "$(< $conf)" >> "$uefi_outdir/cmdline.txt"
1782 do_print_cmdline
> "$uefi_outdir/cmdline.txt"
1784 echo -ne "\x00" >> "$uefi_outdir/cmdline.txt"
1786 dinfo
"Using UEFI kernel cmdline:"
1787 dinfo $
(< "$uefi_outdir/cmdline.txt")
1789 [[ -s /usr
/lib
/os-release
]] && uefi_osrelease
="/usr/lib/os-release"
1790 [[ -s /etc
/os-release
]] && uefi_osrelease
="/etc/os-release"
1793 ${uefi_osrelease:+--add-section .osrel=$uefi_osrelease --change-section-vma .osrel=0x20000} \
1794 --add-section .cmdline
="$uefi_outdir/cmdline.txt" --change-section-vma .cmdline
=0x30000 \
1795 --add-section .linux
="$kernel_image" --change-section-vma .linux
=0x40000 \
1796 --add-section .initrd
="$outfile" --change-section-vma .initrd
=0x3000000 \
1797 "$uefi_stub" "$uefi_outfile"
1798 dinfo
"*** Creating UEFI image file '$uefi_outfile' done ***"