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/>.
26 # Verify bash version, current minimum is 4
27 if (( BASH_VERSINFO
[0] < 4 )); then
28 printf -- 'You need at least Bash 4 to use dracut, sorry.' >&2
33 readonly dracut_cmd
="$(readlink -f $0)"
38 [[ $dracutbasedir ]] || dracutbasedir
=/usr
/lib
/dracut
39 if [[ -f $dracutbasedir/dracut-version.sh
]]; then
40 .
$dracutbasedir/dracut-version.sh
43 # 80x25 linebreak here ^
45 Usage: $dracut_cmd [OPTION]... [<initramfs> [<kernel-version>]]
47 Version: $DRACUT_VERSION
49 Creates initial ramdisk images for preloading modules
51 -h, --help Display all options
53 If a [LIST] has multiple arguments, then you have to put these in quotes.
57 # dracut --add-drivers "module1 module2" ...
63 [[ $dracutbasedir ]] || dracutbasedir
=/usr
/lib
/dracut
64 if [[ -f $dracutbasedir/dracut-version.sh
]]; then
65 .
$dracutbasedir/dracut-version.sh
68 # 80x25 linebreak here ^
70 Usage: $dracut_cmd [OPTION]... [<initramfs> [<kernel-version>]]
72 Version: $DRACUT_VERSION
74 Creates initial ramdisk images for preloading modules
76 --kver [VERSION] Set kernel version to [VERSION].
77 -f, --force Overwrite existing initramfs file.
78 -a, --add [LIST] Add a space-separated list of dracut modules.
79 --rebuild Append arguments to those of existing image and rebuild
80 -m, --modules [LIST] Specify a space-separated list of dracut modules to
81 call when building the initramfs. Modules are located
82 in /usr/lib/dracut/modules.d.
83 -o, --omit [LIST] Omit a space-separated list of dracut modules.
84 --force-add [LIST] Force to add a space-separated list of dracut modules
85 to the default set of modules, when -H is specified.
86 -d, --drivers [LIST] Specify a space-separated list of kernel modules to
87 exclusively include in the initramfs.
88 --add-drivers [LIST] Specify a space-separated list of kernel
89 modules to add to the initramfs.
90 --force-drivers [LIST] Specify a space-separated list of kernel
91 modules to add to the initramfs and make sure they
92 are tried to be loaded via modprobe same as passing
93 rd.driver.pre=DRIVER kernel parameter.
94 --omit-drivers [LIST] Specify a space-separated list of kernel
95 modules not to add to the initramfs.
96 --filesystems [LIST] Specify a space-separated list of kernel filesystem
97 modules to exclusively include in the generic
99 -k, --kmoddir [DIR] Specify the directory, where to look for kernel
101 --fwdir [DIR] Specify additional directories, where to look for
102 firmwares, separated by :
103 --kernel-only Only install kernel drivers and firmware files
104 --no-kernel Do not install kernel drivers and firmware files
105 --print-cmdline Print the kernel command line for the given disk layout
106 --early-microcode Combine early microcode with ramdisk
107 --no-early-microcode Do not combine early microcode with ramdisk
108 --kernel-cmdline [PARAMETERS] Specify default kernel command line parameters
109 --strip Strip binaries in the initramfs
110 --nostrip Do not strip binaries in the initramfs
111 --prelink Prelink binaries in the initramfs
112 --noprelink Do not prelink binaries in the initramfs
113 --hardlink Hardlink files in the initramfs
114 --nohardlink Do not hardlink files in the initramfs
115 --prefix [DIR] Prefix initramfs files with [DIR]
116 --noprefix Do not prefix initramfs files
117 --mdadmconf Include local /etc/mdadm.conf
118 --nomdadmconf Do not include local /etc/mdadm.conf
119 --lvmconf Include local /etc/lvm/lvm.conf
120 --nolvmconf Do not include local /etc/lvm/lvm.conf
121 --fscks [LIST] Add a space-separated list of fsck helpers.
122 --nofscks Inhibit installation of any fsck helpers.
123 --ro-mnt Mount / and /usr read-only by default.
124 -h, --help This message
125 --debug Output debug information of the build process
126 --profile Output profile information of the build process
127 -L, --stdlog [0-6] Specify logging level (to standard error)
128 0 - suppress any messages
129 1 - only fatal errors
133 5 - debug info (here starts lots of output)
134 6 - trace info (and even more)
135 -v, --verbose Increase verbosity level
136 -q, --quiet Decrease verbosity level
137 -c, --conf [FILE] Specify configuration file to use.
138 Default: /etc/dracut.conf
139 --confdir [DIR] Specify configuration directory to use *.conf files
140 from. Default: /etc/dracut.conf.d
141 --tmpdir [DIR] Temporary directory to be used instead of default
143 -l, --local Local mode. Use modules from the current working
144 directory instead of the system-wide installed in
145 /usr/lib/dracut/modules.d.
146 Useful when running dracut from a git checkout.
147 -H, --hostonly Host-Only mode: Install only what is needed for
148 booting the local host instead of a generic host.
149 -N, --no-hostonly Disables Host-Only mode
150 --hostonly-cmdline Store kernel command line arguments needed
152 --no-hostonly-cmdline Do not store kernel command line arguments needed
154 --hostonly-i18n Install only needed keyboard and font files according
155 to the host configuration (default).
156 --no-hostonly-i18n Install all keyboard and font files available.
157 --persistent-policy [POLICY]
158 Use [POLICY] to address disks and partitions.
159 POLICY can be any directory name found in /dev/disk.
160 E.g. "by-uuid", "by-label"
161 --fstab Use /etc/fstab to determine the root device.
162 --add-fstab [FILE] Add file to the initramfs fstab
163 --mount "[DEV] [MP] [FSTYPE] [FSOPTS]"
164 Mount device [DEV] on mountpoint [MP] with filesystem
165 [FSTYPE] and options [FSOPTS] in the initramfs
166 --mount "[MP]" Same as above, but [DEV], [FSTYPE] and [FSOPTS] are
167 determined by looking at the current mounts.
168 --add-device "[DEV]" Bring up [DEV] in initramfs
169 -i, --include [SOURCE] [TARGET]
170 Include the files in the SOURCE directory into the
171 Target directory in the final initramfs.
172 If SOURCE is a file, it will be installed to TARGET
173 in the final initramfs.
174 -I, --install [LIST] Install the space separated list of files into the
176 --install-optional [LIST] Install the space separated list of files into the
177 initramfs, if they exist.
178 --gzip Compress the generated initramfs using gzip.
179 This will be done by default, unless another
180 compression option or --no-compress is passed.
181 --bzip2 Compress the generated initramfs using bzip2.
182 Make sure your kernel has bzip2 decompression support
183 compiled in, otherwise you will not be able to boot.
184 --lzma Compress the generated initramfs using lzma.
185 Make sure your kernel has lzma support compiled in,
186 otherwise you will not be able to boot.
187 --xz Compress the generated initramfs using xz.
188 Make sure that your kernel has xz support compiled
189 in, otherwise you will not be able to boot.
190 --lzo Compress the generated initramfs using lzop.
191 Make sure that your kernel has lzo support compiled
192 in, otherwise you will not be able to boot.
193 --lz4 Compress the generated initramfs using lz4.
194 Make sure that your kernel has lz4 support compiled
195 in, otherwise you will not be able to boot.
196 --compress [COMPRESSION] Compress the generated initramfs with the
197 passed compression program. Make sure your kernel
198 knows how to decompress the generated initramfs,
199 otherwise you will not be able to boot.
200 --no-compress Do not compress the generated initramfs. This will
201 override any other compression options.
202 --list-modules List all available dracut modules.
203 -M, --show-modules Print included module's name to standard output during
205 --keep Keep the temporary initramfs for debugging purposes
206 --printsize Print out the module install size
207 --sshkey [SSHKEY] Add ssh key to initramfs (use with ssh-client module)
208 --logfile [FILE] Logfile to use (overrides configuration setting)
209 --reproducible Create reproducible images
210 --no-reproducible Do not create reproducible images
211 --loginstall [DIR] Log all files installed from the host to [DIR]
212 --uefi Create an UEFI executable with the kernel cmdline and
214 --uefi-stub [FILE] Use the UEFI stub [FILE] to create an UEFI executable
215 --kernel-image [FILE] location of the kernel image
217 If [LIST] has multiple arguments, then you have to put these in quotes.
221 # dracut --add-drivers "module1 module2" ...
226 # Fills up host_devs stack variable and makes sure there are no duplicates
230 [[ " ${host_devs[@]} " == *" $_dev "* ]] && return
231 host_devs
+=( "$_dev" )
235 # Little helper function for reading args from the commandline.
236 # it automatically handles -a b and -a=b variants, and returns 1 if
237 # we need to shift $3.
242 local rematch
='^[^=]*=(.*)$'
243 if [[ $2 =~
$rematch ]]; then
244 read "$1" <<< "${BASH_REMATCH[1]}"
247 # There is no way to shift our callers args, so
248 # return 1 to indicate they should do it instead.
255 local suffix
=$1; shift
260 for i
in "$d/"*"$suffix"; do
261 if [[ -e "$i" ]]; then
262 printf "%s\n" "${i##*/}"
268 for f
in "${files[@]}"; do
270 if [[ -e "$d/$f" ]]; then
271 printf "%s\n" "$d/$f"
281 # Workaround -i, --include taking 2 arguments
282 set -- "${@/--include/++include}"
284 # This prevents any long argument ending with "-i"
285 # -i, like --opt-i but I think we can just prevent that
286 set -- "${@/%-i/++include}"
288 TEMP
=$
(unset POSIXLY_CORRECT
; getopt \
289 -o "a:m:o:d:I:k:c:L:fvqlHhMN" \
293 --long add-drivers
: \
294 --long force-drivers
: \
295 --long omit-drivers
: \
299 --long filesystems
: \
301 --long install-optional
: \
322 --long print-cmdline \
323 --long kernel-cmdline
: \
345 --long no-host-only \
346 --long hostonly-cmdline \
347 --long no-hostonly-cmdline \
348 --long persistent-policy
: \
358 --long list-modules \
359 --long show-modules \
362 --long regenerate-all \
363 --long noimageifnotneeded \
364 --long early-microcode \
365 --long no-early-microcode \
366 --long reproducible \
367 --long no-reproducible \
371 --long kernel-image
: \
372 --long no-hostonly-i18n \
373 --long hostonly-i18n \
374 --long no-machineid \
377 if (( $?
!= 0 )); then
387 rearrange_params
"$@"
390 # parse command line args to check if '--rebuild' option is present
395 if [ "$1" == "--" ]; then
398 if [ "$1" == "--rebuild" ]; then
401 if [ ! -e $rebuild_file ]; then
402 echo "Image file '$rebuild_file', for rebuild, does not exist!"
405 abs_rebuild_file
=$
(readlink
-f "$rebuild_file") && rebuild_file
="$abs_rebuild_file"
411 # get output file name and kernel version from command line arguments
417 if ! [[ ${outfile+x} ]]; then
419 elif ! [[ ${kernel+x} ]]; then
422 printf "\nUnknown arguments: %s\n\n" "$*" >&2
430 # extract input image file provided with rebuild option to get previous parameters, if any
431 if [[ $append_args_l == "yes" ]]; then
434 # determine resultant file
435 if ! [[ $outfile ]]; then
436 outfile
=$rebuild_file
439 if ! rebuild_param
=$
(lsinitrd
$rebuild_file '*lib/dracut/build-parameter.txt'); then
440 echo "Image '$rebuild_file' has no rebuild information stored"
444 # prepend previous parameters to current command line args
445 if [[ $rebuild_param ]]; then
446 TEMP
="$rebuild_param $TEMP"
448 rearrange_params
"$@"
451 # clean the temporarily used scratch-pad directory
461 if [ $1 != "--" ] && [ $1 != "--rebuild" ]; then
462 PARMS_TO_STORE
+=" $1";
465 --kver) kernel
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
466 -a|
--add) add_dracutmodules_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
467 --force-add) force_add_dracutmodules_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
468 --add-drivers) add_drivers_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
469 --force-drivers) force_drivers_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
470 --omit-drivers) omit_drivers_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
471 -m|
--modules) dracutmodules_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
472 -o|
--omit) omit_dracutmodules_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
473 -d|
--drivers) drivers_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
474 --filesystems) filesystems_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
475 -I|
--install) install_items_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
476 --install-optional) install_optional_items_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
477 --fwdir) fw_dir_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
478 --libdirs) libdirs_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
479 --fscks) fscks_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
480 --add-fstab) add_fstab_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
481 --mount) fstab_lines
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
482 --add-device|
--device) add_device_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
483 --kernel-cmdline) kernel_cmdline_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
484 --nofscks) nofscks_l
="yes";;
485 --ro-mnt) ro_mnt_l
="yes";;
486 -k|
--kmoddir) drivers_dir_l
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
487 -c|
--conf) conffile
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
488 --confdir) confdir
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
489 --tmpdir) tmpdir_l
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
490 -L|
--stdlog) stdloglvl_l
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
491 --compress) compress_l
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
492 --prefix) prefix_l
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
493 --loginstall) loginstall_l
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
494 --rebuild) if [ $rebuild_file == $outfile ]; then
499 -f|
--force) force
=yes;;
500 --kernel-only) kernel_only
="yes"; no_kernel
="no";;
501 --no-kernel) kernel_only
="no"; no_kernel
="yes";;
503 print_cmdline
="yes"; hostonly_l
="yes"; kernel_only
="yes"; no_kernel
="yes";;
505 early_microcode_l
="yes";;
506 --no-early-microcode)
507 early_microcode_l
="no";;
508 --strip) do_strip_l
="yes";;
509 --nostrip) do_strip_l
="no";;
510 --prelink) do_prelink_l
="yes";;
511 --noprelink) do_prelink_l
="no";;
512 --hardlink) do_hardlink_l
="yes";;
513 --nohardlink) do_hardlink_l
="no";;
514 --noprefix) prefix_l
="/";;
515 --mdadmconf) mdadmconf_l
="yes";;
516 --nomdadmconf) mdadmconf_l
="no";;
517 --lvmconf) lvmconf_l
="yes";;
518 --nolvmconf) lvmconf_l
="no";;
519 --debug) debug
="yes";;
520 --profile) profile
="yes";;
521 --sshkey) sshkey
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
522 --logfile) logfile_l
="$2"; shift;;
523 -v|
--verbose) ((verbosity_mod_l
++));;
524 -q|
--quiet) ((verbosity_mod_l--
));;
527 [[ -f "$(readlink -f "${0%/*}")/dracut-init.sh" ]] \
528 && dracutbasedir
="$(readlink -f "${0%/*}")"
530 -H|
--hostonly|
--host-only)
532 -N|
--no-hostonly|
--no-host-only)
535 hostonly_cmdline_l
="yes" ;;
537 i18n_install_all_l
="no" ;;
539 i18n_install_all_l
="yes" ;;
540 --no-hostonly-cmdline)
541 hostonly_cmdline_l
="no" ;;
543 persistent_policy_l
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
544 --fstab) use_fstab_l
="yes" ;;
545 -h|
--help) long_usage
; exit 1 ;;
546 -i|
--include) include_src
+=("$2"); PARMS_TO_STORE
+=" '$2'";
548 --bzip2) compress_l
="bzip2";;
549 --lzma) compress_l
="lzma";;
550 --xz) compress_l
="xz";;
551 --lzo) compress_l
="lzo";;
552 --lz4) compress_l
="lz4";;
553 --no-compress) _no_compress_l
="cat";;
554 --gzip) compress_l
="gzip";;
555 --list-modules) do_list
="yes";;
560 --printsize) printsize
="yes";;
561 --regenerate-all) regenerate_all
="yes";;
562 --noimageifnotneeded) noimageifnotneeded
="yes";;
563 --reproducible) reproducible_l
="yes";;
564 --no-reproducible) reproducible_l
="no";;
567 uefi_stub_l
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
569 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_cmd" --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
634 unset LD_LIBRARY_PATH
638 export DRACUT_LOG_LEVEL
=warning
640 export DRACUT_LOG_LEVEL
=debug
641 export PS4
='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): ';
646 export PS4
='+ $(date "+%s.%N") ${BASH_SOURCE}@${LINENO}: ';
651 [[ $dracutbasedir ]] || dracutbasedir
=/usr
/lib
/dracut
653 # if we were not passed a config file, try the default one
654 if [[ ! -f $conffile ]]; then
655 if [[ $allowlocal ]]; then
656 conffile
="$dracutbasedir/dracut.conf"
658 conffile
="/etc/dracut.conf"
662 if [[ ! -d $confdir ]]; then
663 if [[ $allowlocal ]]; then
664 confdir
="$dracutbasedir/dracut.conf.d"
666 confdir
="/etc/dracut.conf.d"
670 # source our config file
671 [[ -f $conffile ]] && .
"$conffile"
673 # source our config dir
674 for f
in $
(dropindirs_sort
".conf" "$confdir" "$dracutbasedir/dracut.conf.d"); do
675 [[ -e $f ]] && .
"$f"
678 DRACUT_PATH
=${DRACUT_PATH:-/sbin /bin /usr/sbin /usr/bin}
680 for i
in $DRACUT_PATH; do
685 if [[ "$NPATH" != *:$rl* ]] ; then
689 export PATH
="${NPATH#:}"
692 # these options add to the stuff in the config file
693 (( ${#add_dracutmodules_l[@]} )) && add_dracutmodules
+=" ${add_dracutmodules_l[@]} "
694 (( ${#force_add_dracutmodules_l[@]} )) && force_add_dracutmodules
+=" ${force_add_dracutmodules_l[@]} "
695 (( ${#fscks_l[@]} )) && fscks
+=" ${fscks_l[@]} "
696 (( ${#add_fstab_l[@]} )) && add_fstab
+=" ${add_fstab_l[@]} "
697 (( ${#fstab_lines_l[@]} )) && fstab_lines
+=( "${fstab_lines_l[@]}" )
698 (( ${#install_items_l[@]} )) && install_items
+=" ${install_items_l[@]} "
699 (( ${#install_optional_items_l[@]} )) && install_optional_items
+=" ${install_optional_items_l[@]} "
701 # these options override the stuff in the config file
702 (( ${#dracutmodules_l[@]} )) && dracutmodules
="${dracutmodules_l[@]}"
703 (( ${#omit_dracutmodules_l[@]} )) && omit_dracutmodules
="${omit_dracutmodules_l[@]}"
704 (( ${#filesystems_l[@]} )) && filesystems
="${filesystems_l[@]}"
705 (( ${#fw_dir_l[@]} )) && fw_dir
="${fw_dir_l[@]}"
706 (( ${#libdirs_l[@]} ))&& libdirs
="${libdirs_l[@]}"
708 [[ $stdloglvl_l ]] && stdloglvl
=$stdloglvl_l
709 [[ ! $stdloglvl ]] && stdloglvl
=4
710 stdloglvl
=$
((stdloglvl
+ verbosity_mod_l
))
711 ((stdloglvl
> 6)) && stdloglvl
=6
712 ((stdloglvl
< 0)) && stdloglvl
=0
714 [[ $drivers_dir_l ]] && drivers_dir
=$drivers_dir_l
715 [[ $do_strip_l ]] && do_strip
=$do_strip_l
716 [[ $do_strip ]] || do_strip
=yes
717 [[ $do_prelink_l ]] && do_prelink
=$do_prelink_l
718 [[ $do_prelink ]] || do_prelink
=yes
719 [[ $do_hardlink_l ]] && do_hardlink
=$do_hardlink_l
720 [[ $do_hardlink ]] || do_hardlink
=yes
721 [[ $prefix_l ]] && prefix
=$prefix_l
722 [[ $prefix = "/" ]] && unset prefix
723 [[ $hostonly_l ]] && hostonly
=$hostonly_l
724 [[ $hostonly_cmdline_l ]] && hostonly_cmdline
=$hostonly_cmdline_l
725 [[ "$hostonly" == "yes" ]] && ! [[ $hostonly_cmdline ]] && hostonly_cmdline
="yes"
726 [[ $i18n_install_all_l ]] && i18n_install_all
=$i18n_install_all_l
727 [[ $persistent_policy_l ]] && persistent_policy
=$persistent_policy_l
728 [[ $use_fstab_l ]] && use_fstab
=$use_fstab_l
729 [[ $mdadmconf_l ]] && mdadmconf
=$mdadmconf_l
730 [[ $lvmconf_l ]] && lvmconf
=$lvmconf_l
731 [[ $dracutbasedir ]] || dracutbasedir
=/usr
/lib
/dracut
732 [[ $fw_dir ]] || fw_dir
="/lib/firmware/updates:/lib/firmware:/lib/firmware/$kernel"
733 [[ $tmpdir_l ]] && tmpdir
="$tmpdir_l"
734 [[ $tmpdir ]] || tmpdir
=/var
/tmp
735 [[ $INITRD_COMPRESS ]] && compress=$INITRD_COMPRESS
736 [[ $compress_l ]] && compress=$compress_l
737 [[ $show_modules_l ]] && show_modules
=$show_modules_l
738 [[ $nofscks_l ]] && nofscks
="yes"
739 [[ $ro_mnt_l ]] && ro_mnt
="yes"
740 [[ $early_microcode_l ]] && early_microcode
=$early_microcode_l
741 [[ $early_microcode ]] || early_microcode
=no
742 [[ $logfile_l ]] && logfile
="$logfile_l"
743 [[ $reproducible_l ]] && reproducible
="$reproducible_l"
744 [[ $loginstall_l ]] && loginstall
="$loginstall_l"
745 [[ $uefi_stub_l ]] && uefi_stub
="$uefi_stub_l"
746 [[ $kernel_image_l ]] && kernel_image
="$kernel_image_l"
747 [[ $machine_id_l ]] && machine_id
="$machine_id_l"
749 if ! [[ $outfile ]]; then
750 if [[ $machine_id != "no" ]]; then
751 [[ -f /etc
/machine-id
]] && read MACHINE_ID
< /etc
/machine-id
754 if [[ $uefi == "yes" ]]; then
755 BUILD_ID
=$
(cat /etc
/os-release
/usr
/lib
/os-release \
756 |
while read -r line ||
[[ $line ]]; do \
757 [[ $line =~ BUILD_ID\
=* ]] && eval "$line" && echo "$BUILD_ID" && break; \
759 if [[ -d /efi
]] && mountpoint
-q /efi
; then
763 if [[ -d /boot
/efi
/EFI
]] && mountpoint
-q /boot
/efi
; then
767 mkdir
-p "$efidir/Linux"
768 outfile
="$efidir/Linux/linux-$kernel${MACHINE_ID:+-${MACHINE_ID}}${BUILD_ID:+-${BUILD_ID}}.efi"
770 if [[ $MACHINE_ID ]] && ( [[ -d /boot
/${MACHINE_ID} ]] ||
[[ -L /boot
/${MACHINE_ID} ]] ); then
771 outfile
="/boot/${MACHINE_ID}/$kernel/initrd"
773 outfile
="/boot/initramfs-$kernel.img"
778 # eliminate IFS hackery when messing with fw_dir
779 export DRACUT_FIRMWARE_PATH
=${fw_dir// /:}
780 fw_dir
=${fw_dir//:/ }
782 # check for logfile and try to create one if it doesn't exist
783 if [[ -n "$logfile" ]];then
784 if [[ ! -f "$logfile" ]];then
786 if [ ! $?
-eq 0 ] ;then
787 printf "%s\n" "dracut: touch $logfile failed." >&2
792 # handle compression options.
793 if [[ $_no_compress_l = "cat" ]]; then
797 if ! [[ $compress ]]; then
798 # check all known compressors, if none specified
799 for i
in pigz
gzip lz4 lzop lzma xz lbzip2
bzip2 cat; do
800 command -v "$i" &>/dev
/null ||
continue
804 if [[ $compress = cat ]]; then
805 printf "%s\n" "dracut: no compression tool available. Initramfs image is going to be big." >&2
809 # choose the right arguments for the compressor
812 if [[ "$compress" = lbzip2
]] ||
command -v lbzip2
&>/dev
/null
; then
819 compress="lzma -9 -T0"
822 compress="xz --check=crc32 --lzma2=dict=1MiB -T0"
825 if [[ "$compress" = pigz
]] ||
command -v pigz
&>/dev
/null
; then
826 compress="pigz -9 -n -T -R"
827 elif command -v gzip &>/dev
/null
&& gzip --help 2>&1 |
grep -q rsyncable
; then
828 compress="gzip -n -9 --rsyncable"
830 compress="gzip -n -9"
841 [[ $hostonly = yes ]] && hostonly
="-h"
842 [[ $hostonly != "-h" ]] && unset hostonly
844 [[ $reproducible == yes ]] && DRACUT_REPRODUCIBLE
=1
846 readonly TMPDIR
="$(realpath -e "$tmpdir")"
847 [ -d "$TMPDIR" ] ||
{
848 printf "%s\n" "dracut: Invalid tmpdir '$tmpdir'." >&2
851 readonly DRACUT_TMPDIR
="$(mktemp -p "$TMPDIR/" -d -t dracut.XXXXXX)"
852 [ -d "$DRACUT_TMPDIR" ] ||
{
853 printf "%s\n" "dracut: mktemp -p '$TMPDIR/' -d -t dracut.XXXXXX failed." >&2
857 # clean up after ourselves no matter how we die.
860 [[ $keep ]] && echo "Not removing $DRACUT_TMPDIR." >&2 || { [[ $DRACUT_TMPDIR ]] && rm -rf -- "$DRACUT_TMPDIR"; };
864 # clean up after ourselves no matter how we die.
865 trap 'exit 1;' SIGINT
867 readonly initdir
="${DRACUT_TMPDIR}/initramfs"
870 if [[ $early_microcode = yes ]] ||
( [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]] ); then
871 readonly early_cpio_dir
="${DRACUT_TMPDIR}/earlycpio"
872 mkdir
"$early_cpio_dir"
875 export DRACUT_RESOLVE_LAZY
="1"
877 if [[ $print_cmdline ]]; then
884 if [[ -f $dracutbasedir/dracut-version.sh
]]; then
885 .
$dracutbasedir/dracut-version.sh
888 if [[ -f $dracutbasedir/dracut-init.sh
]]; then
889 .
$dracutbasedir/dracut-init.sh
891 printf "%s\n" "dracut: Cannot find $dracutbasedir/dracut-init.sh." >&2
892 printf "%s\n" "dracut: Are you running from a git checkout?" >&2
893 printf "%s\n" "dracut: Try passing -l as an argument to $dracut_cmd" >&2
897 if ! [[ $print_cmdline ]]; then
899 if ! $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R "$initdir/bin/sh" &>/dev
/null
; then
900 unset DRACUT_RESOLVE_LAZY
901 export DRACUT_RESOLVE_DEPS
=1
903 rm -fr -- ${initdir}/*
906 dracutfunctions
=$dracutbasedir/dracut-functions.sh
907 export dracutfunctions
909 (( ${#drivers_l[@]} )) && drivers
="${drivers_l[@]}"
910 drivers
=${drivers/-/_}
912 (( ${#add_drivers_l[@]} )) && add_drivers
+=" ${add_drivers_l[@]} "
913 add_drivers
=${add_drivers/-/_}
915 (( ${#force_drivers_l[@]} )) && force_drivers
+=" ${force_drivers_l[@]} "
916 force_drivers
=${force_drivers/-/_}
918 (( ${#omit_drivers_l[@]} )) && omit_drivers
+=" ${omit_drivers_l[@]} "
919 omit_drivers
=${omit_drivers/-/_}
921 (( ${#kernel_cmdline_l[@]} )) && kernel_cmdline
+=" ${kernel_cmdline_l[@]} "
923 omit_drivers_corrected
=""
924 for d
in $omit_drivers; do
925 [[ " $drivers $add_drivers " == *\
$d\
* ]] && continue
926 [[ " $drivers $force_drivers " == *\
$d\
* ]] && continue
927 omit_drivers_corrected
+="$d|"
929 omit_drivers
="${omit_drivers_corrected%|}"
930 unset omit_drivers_corrected
932 # prepare args for logging
933 for ((i
=0; i
< ${#dracut_args[@]}; i
++)); do
934 [[ "${dracut_args[$i]}" == *\
* ]] && \
935 dracut_args
[$i]="\"${dracut_args[$i]}\""
939 dinfo
"Executing: $dracut_cmd ${dracut_args[@]}"
941 [[ $do_list = yes ]] && {
942 for mod
in $dracutbasedir/modules.d
/*; do
943 [[ -d $mod ]] ||
continue;
944 [[ -e $mod/install ||
-e $mod/installkernel || \
945 -e $mod/module-setup.sh
]] ||
continue
946 printf "%s\n" "${mod##*/??}"
951 # This is kinda legacy -- eventually it should go away.
952 case $dracutmodules in
953 ""|auto
) dracutmodules
="all" ;;
956 abs_outfile
=$
(readlink
-f "$outfile") && outfile
="$abs_outfile"
958 if [[ $no_kernel != yes ]] && [[ -d $srcmods ]]; then
959 if ! [[ -f $srcmods/modules.dep
]]; then
960 if [[ -n "$(find "$srcmods" -name '*.ko*')" ]]; then
961 dfatal
"$srcmods/modules.dep is missing. Did you run depmod?"
964 dwarn
"$srcmods/modules.dep is missing. Did you run depmod?"
966 elif ! ( command -v gzip &>/dev
/null
&& command -v xz
&>/dev
/null
); then
967 read _mod
< $srcmods/modules.dep
969 if [[ -f $srcmods/"$_mod" ]]; then
970 # Check, if kernel modules are compressed, and if we can uncompress them
972 *.ko.gz
) kcompress
=gzip;;
973 *.ko.xz
) kcompress
=xz
;;
975 if [[ $kcompress ]]; then
976 if ! command -v "$kcompress" &>/dev
/null
; then
977 dfatal
"Kernel modules are compressed with $kcompress, but $kcompress is not available."
985 if [[ ! $print_cmdline ]]; then
986 if [[ -f $outfile && ! $force ]]; then
987 dfatal
"Will not override existing initramfs ($outfile) without --force"
992 [[ $outdir ]] || outdir
="/"
994 if [[ ! -d "$outdir" ]]; then
995 dfatal
"Can't write to $outdir: Directory $outdir does not exist or is not accessible."
997 elif [[ ! -w "$outdir" ]]; then
998 dfatal
"No permission to write to $outdir."
1000 elif [[ -f "$outfile" && ! -w "$outfile" ]]; then
1001 dfatal
"No permission to write $outfile."
1005 if [[ $loginstall ]]; then
1006 if ! mkdir
-p "$loginstall"; then
1007 dfatal
"Could not create directory to log installed files to '$loginstall'."
1010 loginstall
=$
(readlink
-f "$loginstall")
1013 if [[ $uefi = yes ]]; then
1014 if ! command -v objcopy
&>/dev
/null
; then
1015 dfatal
"Need 'objcopy' to create a UEFI executable"
1018 unset EFI_MACHINE_TYPE_NAME
1021 EFI_MACHINE_TYPE_NAME
=x64
;;
1023 EFI_MACHINE_TYPE_NAME
=ia32
;;
1025 dfatal
"Architecture '$(arch)' not supported to create a UEFI executable"
1030 if ! [[ -s $uefi_stub ]]; then
1032 "/lib/systemd/boot/efi/linux${EFI_MACHINE_TYPE_NAME}.efi.stub" \
1033 "/usr/lib/gummiboot/linux${EFI_MACHINE_TYPE_NAME}.efi.stub"; do
1034 [[ -s $uefi_stub ]] ||
continue
1038 if ! [[ -s $uefi_stub ]]; then
1039 dfatal
"Can't find a uefi stub '$uefi_stub' to create a UEFI executable"
1043 if ! [[ $kernel_image ]]; then
1044 for kernel_image
in "/lib/modules/$kernel/vmlinuz" "/boot/vmlinuz-$kernel"; do
1045 [[ -s "$kernel_image" ]] ||
continue
1049 if ! [[ -s $kernel_image ]]; then
1050 dfatal
"Can't find a kernel image '$kernel_image' to create a UEFI executable"
1056 if [[ $acpi_override = yes ]] && ! check_kernel_config CONFIG_ACPI_INITRD_TABLE_OVERRIDE
; then
1057 dwarn
"Disabling ACPI override, because kernel does not support it. CONFIG_ACPI_INITRD_TABLE_OVERRIDE!=y"
1061 if [[ $early_microcode = yes ]]; then
1062 if [[ $hostonly ]]; then
1063 [[ $
(get_cpu_vendor
) == "AMD" ]] \
1064 && ! check_kernel_config CONFIG_MICROCODE_AMD \
1065 && unset early_microcode
1066 [[ $
(get_cpu_vendor
) == "Intel" ]] \
1067 && ! check_kernel_config CONFIG_MICROCODE_INTEL \
1068 && unset early_microcode
1070 ! check_kernel_config CONFIG_MICROCODE_AMD \
1071 && ! check_kernel_config CONFIG_MICROCODE_INTEL \
1072 && unset early_microcode
1074 [[ $early_microcode != yes ]] \
1075 && dwarn
"Disabling early microcode, because kernel does not support it. CONFIG_MICROCODE_[AMD|INTEL]!=y"
1078 # Need to be able to have non-root users read stuff (rpcbind etc)
1079 chmod 755 "$initdir"
1081 if [[ $hostonly ]]; then
1082 for i
in /sys
/proc
/run
/dev
; do
1083 if ! findmnt
--target "$i" &>/dev
/null
; then
1084 dwarning
"Turning off host-only mode: '$i' is not mounted!"
1090 declare -A host_fs_types
1092 for line
in "${fstab_lines[@]}"; do
1098 dev
=$
(blkid
-l -t UUID
=${dev#UUID=} -o device
)
1101 dev
=$
(blkid
-l -t LABEL
=${dev#LABEL=} -o device
)
1104 dev
=$
(blkid
-l -t PARTUUID
=${dev#PARTUUID=} -o device
)
1107 dev
=$
(blkid
-l -t PARTLABEL
=${dev#PARTLABEL=} -o device
)
1110 [ -z "$dev" ] && dwarn
"Bad fstab entry $@" && continue
1111 if [[ "$3" == btrfs
]]; then
1112 for i
in $
(btrfs_devs
"$2"); do
1116 push_host_devs
"$dev"
1117 host_fs_types
["$dev"]="$3"
1120 for f
in $add_fstab; do
1121 [[ -e $f ]] ||
continue
1122 while read dev rest ||
[ -n "$dev" ]; do
1123 push_host_devs
"$dev"
1127 for dev
in $add_device; do
1128 push_host_devs
"$dev"
1131 if (( ${#add_device_l[@]} )); then
1132 add_device
+=" ${add_device_l[@]} "
1133 push_host_devs
"${add_device_l[@]}"
1136 if [[ $hostonly ]]; then
1137 # in hostonly mode, determine all devices, which have to be accessed
1138 # and examine them for filesystem types
1156 mp
=$
(readlink
-f "$mp")
1157 mountpoint
"$mp" >/dev
/null
2>&1 ||
continue
1158 _dev
=$
(find_block_device
"$mp")
1159 _bdev
=$
(readlink
-f "/dev/block/$_dev")
1160 [[ -b $_bdev ]] && _dev
=$_bdev
1161 [[ "$mp" == "/" ]] && root_devs
+=("$_dev")
1162 push_host_devs
"$_dev"
1163 if [[ $
(find_mp_fstype
"$mp") == btrfs
]]; then
1164 for i
in $
(btrfs_devs
"$mp"); do
1165 [[ "$mp" == "/" ]] && root_devs
+=("$i")
1171 if [[ -f /proc
/swaps
]] && [[ -f /etc
/fstab
]]; then
1172 while read dev
type rest ||
[ -n "$dev" ]; do
1173 [[ -b $dev ]] ||
continue
1174 [[ "$type" == "partition" ]] ||
continue
1176 while read _d _m _t _o _r ||
[ -n "$_d" ]; do
1177 [[ "$_d" == \
#* ]] && continue
1178 [[ $_d ]] ||
continue
1179 [[ $_t != "swap" ]] && continue
1180 [[ $_m != "swap" ]] && [[ $_m != "none" ]] && continue
1181 [[ "$_o" == *noauto
* ]] && continue
1182 _d
=$
(expand_persistent_dev
"$_d")
1183 [[ "$_d" -ef "$dev" ]] ||
continue
1185 if [[ -f /etc
/crypttab
]]; then
1186 while read _mapper _a _p _o ||
[ -n "$_mapper" ]; do
1187 [[ $_mapper = \
#* ]] && continue
1188 [[ "$_d" -ef /dev
/mapper
/"$_mapper" ]] ||
continue
1189 [[ "$_o" ]] || _o
="$_p"
1190 # skip entries with password files
1191 [[ "$_p" == /* ]] && [[ -f $_p ]] && continue 2
1193 [[ $_o == *swap
* ]] && continue 2
1194 done < /etc
/crypttab
1197 _dev
="$(readlink -f "$dev")"
1198 push_host_devs
"$_dev"
1199 swap_devs
+=("$_dev")
1205 # collect all "x-initrd.mount" entries from /etc/fstab
1206 if [[ -f /etc
/fstab
]]; then
1207 while read _d _m _t _o _r ||
[ -n "$_d" ]; do
1208 [[ "$_d" == \
#* ]] && continue
1209 [[ $_d ]] ||
continue
1210 [[ "$_o" != *x-initrd.mount
* ]] && continue
1211 _dev
=$
(expand_persistent_dev
"$_d")
1212 _dev
="$(readlink -f "$_dev")"
1213 [[ -b $_dev ]] ||
continue
1215 push_host_devs
"$_dev"
1216 if [[ "$_t" == btrfs
]]; then
1217 for i
in $
(find_btrfs_devs
"$_m"); do
1230 if [[ -b /dev
/block
/$1 ]]; then
1231 ID_FS_TYPE
=$
(get_fs_env
"/dev/block/$1") && host_fs_types
["$(readlink -f "/dev
/block
/$1")"]="$ID_FS_TYPE"
1234 if [[ -b $1 ]]; then
1235 ID_FS_TYPE
=$
(get_fs_env
"$1") && host_fs_types
["$(readlink -f "$1")"]="$ID_FS_TYPE"
1238 if fstype
=$
(find_dev_fstype
"$1"); then
1239 host_fs_types
["$1"]="$fstype"
1245 for dev
in "${host_devs[@]}"; do
1247 check_block_and_slaves_all _get_fs_type
"$(get_maj_min "$dev")"
1250 for dev
in "${!host_fs_types[@]}"; do
1251 [[ ${host_fs_types[$dev]} = "reiserfs" ]] ||
[[ ${host_fs_types[$dev]} = "xfs" ]] ||
continue
1252 rootopts
=$
(find_dev_fsopts
"$dev")
1253 if [[ ${host_fs_types[$dev]} = "reiserfs" ]]; then
1254 journaldev
=$
(fs_get_option
$rootopts "jdev")
1255 elif [[ ${host_fs_types[$dev]} = "xfs" ]]; then
1256 journaldev
=$
(fs_get_option
$rootopts "logdev")
1258 if [[ $journaldev ]]; then
1259 dev
="$(readlink -f "$dev")"
1260 push_host_devs
"$dev"
1262 check_block_and_slaves_all _get_fs_type
"$(get_maj_min "$dev")"
1267 || udevdir
="$(pkg-config udev --variable=udevdir 2>/dev/null)"
1268 if ! [[ -d "$udevdir" ]]; then
1269 [[ ! -h /lib
]] && [[ -d /lib
/udev
]] && udevdir
=/lib
/udev
1270 [[ -d /usr
/lib
/udev
]] && udevdir
=/usr
/lib
/udev
1273 [[ -d $systemdutildir ]] \
1274 || systemdutildir
=$
(pkg-config systemd
--variable=systemdutildir
2>/dev
/null
)
1276 if ! [[ -d "$systemdutildir" ]]; then
1277 [[ ! -h /lib
]] && [[ -d /lib
/systemd
]] && systemdutildir
=/lib
/systemd
1278 [[ -d /usr
/lib
/systemd
]] && systemdutildir
=/usr
/lib
/systemd
1281 [[ -d $systemdsystemunitdir ]] \
1282 || systemdsystemunitdir
=$
(pkg-config systemd
--variable=systemdsystemunitdir
2>/dev
/null
)
1284 [[ -d "$systemdsystemunitdir" ]] || systemdsystemunitdir
=${systemdutildir}/system
1286 [[ -d $systemdsystemconfdir ]] \
1287 || systemdsystemconfdir
=$
(pkg-config systemd
--variable=systemdsystemconfdir
2>/dev
/null
)
1289 [[ -d "$systemdsystemconfdir" ]] || systemdsystemconfdir
=/etc
/systemd
/system
1291 [[ -d $tmpfilesdir ]] \
1292 || tmpfilesdir
=$
(pkg-config systemd
--variable=tmpfilesdir
2>/dev
/null
)
1294 if ! [[ -d "$tmpfilesdir" ]]; then
1295 [[ -d /lib
/tmpfiles.d
]] && tmpfilesdir
=/lib
/tmpfiles.d
1296 [[ -d /usr
/lib
/tmpfiles.d
]] && tmpfilesdir
=/usr
/lib
/tmpfiles.d
1299 export initdir dracutbasedir \
1300 dracutmodules force_add_dracutmodules add_dracutmodules omit_dracutmodules \
1302 fw_dir drivers_dir debug no_kernel kernel_only \
1303 omit_drivers mdadmconf lvmconf root_dev \
1304 use_fstab fstab_lines libdirs fscks nofscks ro_mnt \
1305 stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
1306 debug host_fs_types host_devs swap_devs sshkey add_fstab \
1307 DRACUT_VERSION udevdir prefix filesystems drivers \
1308 systemdutildir systemdsystemunitdir systemdsystemconfdir \
1309 hostonly_cmdline loginstall \
1313 # check all our modules to see if they should be sourced.
1314 # This builds a list of modules that we will install next.
1315 for_each_module_dir check_module
1316 for_each_module_dir check_mount
1318 dracut_module_included
"fips" && export DRACUT_FIPS_MODE
=1
1322 local -A _mods_to_print
1323 for i
in $modules_loaded $mods_to_load; do
1324 _mods_to_print
[$i]=1
1327 # source our modules.
1328 for moddir
in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1329 _d_mod
=${moddir##*/}; _d_mod
=${_d_mod#[0-9][0-9]}
1330 [[ ${_mods_to_print[$_d_mod]} ]] ||
continue
1331 module_cmdline
"$_d_mod"
1336 if [[ $print_cmdline ]]; then
1342 # Create some directory structure first
1343 [[ $prefix ]] && mkdir
-m 0755 -p "${initdir}${prefix}"
1345 [[ -h /lib
]] || mkdir
-m 0755 -p "${initdir}${prefix}/lib"
1346 [[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib"
1348 if [[ $prefix ]]; then
1349 for d
in bin etc lib sbin tmp usr var
$libdirs; do
1350 [[ "$d" == */* ]] && continue
1351 ln -sfn "${prefix#/}/${d#/}" "$initdir/$d"
1355 if [[ $kernel_only != yes ]]; then
1356 for d
in usr
/bin usr
/sbin bin etc lib sbin tmp usr var var
/tmp
$libdirs; do
1357 [[ -e "${initdir}${prefix}/$d" ]] && continue
1358 if [ -L "/$d" ]; then
1359 inst_symlink
"/$d" "${prefix}/$d"
1361 mkdir
-m 0755 -p "${initdir}${prefix}/$d"
1365 for d
in dev proc sys sysroot root run
; do
1366 if [ -L "/$d" ]; then
1369 mkdir
-m 0755 -p "$initdir/$d"
1373 ln -sfn ..
/run
"$initdir/var/run"
1374 ln -sfn ..
/run
/lock
"$initdir/var/lock"
1376 for d
in lib
"$libdir"; do
1377 [[ -e "${initdir}${prefix}/$d" ]] && continue
1378 if [ -h "/$d" ]; then
1379 inst
"/$d" "${prefix}/$d"
1381 mkdir
-m 0755 -p "${initdir}${prefix}/$d"
1386 if [[ $kernel_only != yes ]]; then
1387 mkdir
-p "${initdir}/etc/cmdline.d"
1388 for _d
in $hookdirs; do
1389 mkdir
-m 0755 -p ${initdir}/lib
/dracut
/hooks
/$_d
1391 if [[ "$UID" = "0" ]]; then
1392 [ -c ${initdir}/dev
/null
] || mknod
${initdir}/dev
/null c
1 3
1393 [ -c ${initdir}/dev
/kmsg
] || mknod
${initdir}/dev
/kmsg c
1 11
1394 [ -c ${initdir}/dev
/console
] || mknod
${initdir}/dev
/console c
5 1
1398 _isize
=0 #initramfs size
1400 # source our modules.
1401 for moddir
in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1402 _d_mod
=${moddir##*/}; _d_mod
=${_d_mod#[0-9][0-9]}
1403 [[ "$mods_to_load" == *\
$_d_mod\
* ]] ||
continue
1404 if [[ $show_modules = yes ]]; then
1405 printf "%s\n" "$_d_mod"
1407 dinfo
"*** Including module: $_d_mod ***"
1409 if [[ $kernel_only == yes ]]; then
1410 module_installkernel
"$_d_mod" ||
{
1411 dfatal
"installkernel failed in module $_d_mod"
1415 module_install
"$_d_mod"
1416 if [[ $no_kernel != yes ]]; then
1417 module_installkernel
"$_d_mod" ||
{
1418 dfatal
"installkernel failed in module $_d_mod"
1423 mods_to_load
=${mods_to_load// $_d_mod /}
1424 modules_loaded
+="$_d_mod "
1426 #print the module install size
1427 if [ -n "$printsize" ]; then
1428 _isize_new
=$
(du
-sk ${initdir}|cut
-f1)
1429 _isize_delta
=$
((_isize_new
- _isize
))
1430 printf "%s\n" "$_d_mod install size: ${_isize_delta}k"
1436 for i
in $modules_loaded; do
1437 mkdir
-p $initdir/lib
/dracut
1438 printf "%s\n" "$i" >> $initdir/lib
/dracut
/modules.txt
1441 dinfo
"*** Including modules done ***"
1443 ## final stuff that has to happen
1444 if [[ $no_kernel != yes ]]; then
1446 if [[ $drivers ]]; then
1447 hostonly
='' instmods
$drivers
1450 if [[ $add_drivers ]]; then
1451 hostonly
='' instmods
-c $add_drivers
1453 if [[ $force_drivers ]]; then
1454 hostonly
='' instmods
-c $force_drivers
1455 rm -f $initdir/etc
/cmdline.d
/20-force_driver.conf
1456 for mod
in $force_drivers; do
1457 echo "rd.driver.pre=$mod" >>$initdir/etc
/cmdline.d
/20-force_drivers.conf
1460 if [[ $filesystems ]]; then
1461 hostonly
='' instmods
-c $filesystems
1464 dinfo
"*** Installing kernel module dependencies ***"
1466 dinfo
"*** Installing kernel module dependencies done ***"
1468 if [[ $noimageifnotneeded == yes ]] && [[ $hostonly ]]; then
1469 if [[ ! -f "$initdir/lib/dracut/need-initqueue" ]] && \
1470 [[ -f ${initdir}/lib
/modules
/$kernel/modules.dep
&& ! -s ${initdir}/lib
/modules
/$kernel/modules.dep
]]; then
1471 for i
in ${initdir}/etc
/cmdline.d
/*.conf
; do
1472 # We need no initramfs image and do not generate one.
1473 [[ $i == "${initdir}/etc/cmdline.d/*.conf" ]] && exit 0
1479 if [[ $kernel_only != yes ]]; then
1480 (( ${#install_items[@]} > 0 )) && inst_multiple
${install_items[@]}
1481 (( ${#install_optional_items[@]} > 0 )) && inst_multiple
-o ${install_optional_items[@]}
1483 [[ $kernel_cmdline ]] && printf "%s\n" "$kernel_cmdline" >> "${initdir}/etc/cmdline.d/01-default.conf"
1485 for line
in "${fstab_lines[@]}"; do
1488 if [ -z "${line[1]}" ]; then
1489 # Determine device and mount options from current system
1490 mountpoint
-q "${line[0]}" || derror
"${line[0]} is not a mount point!"
1491 line
=($
(findmnt
--raw -n --target "${line[0]}" --output=source,target
,fstype
,options
))
1492 dinfo
"Line for ${line[1]}: ${line[@]}"
1494 # Use default options
1495 [ -z "${line[3]}" ] && line
[3]="defaults"
1498 # Default options for freq and passno
1499 [ -z "${line[4]}" ] && line
[4]="0"
1500 [ -z "${line[5]}" ] && line
[5]="2"
1502 strstr
"${line[2]}" "nfs" && line
[5]="0"
1503 echo "${line[@]}" >> "${initdir}/etc/fstab"
1506 for f
in $add_fstab; do
1507 cat "$f" >> "${initdir}/etc/fstab"
1510 if [[ $systemdutildir ]]; then
1511 if [ -d ${initdir}/$systemdutildir ]; then
1512 mkdir
-p ${initdir}/etc
/conf.d
1514 printf "%s\n" "systemdutildir=\"$systemdutildir\""
1515 printf "%s\n" "systemdsystemunitdir=\"$systemdsystemunitdir\""
1516 printf "%s\n" "systemdsystemconfdir=\"$systemdsystemconfdir\""
1517 } > ${initdir}/etc
/conf.d
/systemd.conf
1521 if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then
1522 dinfo
"*** Resolving executable dependencies ***"
1523 find "$initdir" -type f
-perm /0111 -not -path '*.ko' -print0 \
1524 |
xargs -r -0 $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R ${DRACUT_FIPS_MODE:+-f} --
1525 dinfo
"*** Resolving executable dependencies done***"
1528 # libpthread workaround: pthread_cancel wants to dlopen libgcc_s.so
1529 for _dir
in $libdirs; do
1530 for _f
in "$_dir/libpthread.so"*; do
1531 [[ -e "$_f" ]] ||
continue
1532 inst_libdir_file
"libgcc_s.so*"
1538 for ((i
=0; i
< ${#include_src[@]}; i
++)); do
1539 src
="${include_src[$i]}"
1540 target
="${include_target[$i]}"
1541 if [[ $src && $target ]]; then
1542 if [[ -f $src ]]; then
1545 ddebug
"Including directory: $src"
1546 destdir
="${initdir}/${target}"
1548 # check for preexisting symlinks, so we can cope with the
1549 # symlinks to $prefix
1550 # Objectname is a file or a directory
1551 for objectname
in "$src"/*; do
1552 [[ -e "$objectname" ||
-h "$objectname" ]] ||
continue
1553 if [[ -d "$objectname" ]]; then
1554 # objectname is a directory, let's compute the final directory name
1555 object_destdir
=${destdir}/${objectname#$src/}
1556 if ! [[ -e "$object_destdir" ]]; then
1557 mkdir
-m 0755 -p "$object_destdir"
1558 chmod --reference="$objectname" "$object_destdir"
1560 cp --reflink=auto
--sparse=auto
-fa -t "$object_destdir" "$objectname"/*
1562 cp --reflink=auto
--sparse=auto
-fa -t "$destdir" "$objectname"
1569 if [[ $kernel_only != yes ]]; then
1570 # make sure that library links are correct and up to date
1571 for f
in /etc
/ld.so.conf
/etc
/ld.so.conf.d
/*; do
1572 [[ -f $f ]] && inst_simple
"$f"
1574 if ! ldconfig
-r "$initdir"; then
1575 if [[ $UID = 0 ]]; then
1576 derror
"ldconfig exited ungracefully"
1578 derror
"ldconfig might need uid=0 (root) for chroot()"
1583 PRELINK_BIN
="$(command -v prelink)"
1584 if [[ $UID = 0 ]] && [[ $PRELINK_BIN ]]; then
1585 if [[ $DRACUT_FIPS_MODE ]]; then
1586 dinfo
"*** Installing prelink files ***"
1587 inst_multiple
-o prelink
/etc
/prelink.conf
/etc
/prelink.conf.d
/*.conf
/etc
/prelink.cache
1588 elif [[ $do_prelink == yes ]]; then
1589 dinfo
"*** Pre-linking files ***"
1590 inst_multiple
-o prelink
/etc
/prelink.conf
/etc
/prelink.conf.d
/*.conf
1591 chroot
"$initdir" "$PRELINK_BIN" -a
1592 rm -f -- "$initdir/$PRELINK_BIN"
1593 rm -fr -- "$initdir"/etc
/prelink.
*
1594 dinfo
"*** Pre-linking files done ***"
1598 if [[ $do_hardlink = yes ]] && command -v hardlink
>/dev
/null
; then
1599 dinfo
"*** Hardlinking files ***"
1600 hardlink
"$initdir" 2>&1
1601 dinfo
"*** Hardlinking files done ***"
1605 if [[ $do_strip = yes ]] ; then
1606 for p
in strip
xargs find; do
1607 if ! type -P $p >/dev
/null
; then
1608 dinfo
"Could not find '$p'. Not stripping the initramfs."
1614 if [[ $do_strip = yes ]] && ! [[ $DRACUT_FIPS_MODE ]]; then
1615 dinfo
"*** Stripping files ***"
1616 find "$initdir" -type f \
1617 -executable -not -path '*/lib/modules/*.ko' -print0 \
1618 |
xargs -r -0 strip
-g 2>/dev
/null
1620 # strip kernel modules, but do not touch signed modules
1621 find "$initdir" -type f
-path '*/lib/modules/*.ko' -print0 \
1622 |
while read -r -d $
'\0' f ||
[ -n "$f" ]; do
1623 SIG
=$
(tail -c 28 "$f")
1624 [[ $SIG == '~Module signature appended~' ]] ||
{ printf "%s\000" "$f"; }
1625 done |
xargs -r -0 strip
-g
1627 dinfo
"*** Stripping files done ***"
1629 if [[ $early_microcode = yes ]]; then
1630 dinfo
"*** Generating early-microcode cpio image ***"
1631 ucode_dir
=(amd-ucode intel-ucode
)
1632 ucode_dest
=(AuthenticAMD.bin GenuineIntel.bin
)
1633 _dest_dir
="$early_cpio_dir/d/kernel/x86/microcode"
1636 if [[ $hostonly ]]; then
1637 [[ $
(get_cpu_vendor
) == "AMD" ]] && _dest_idx
="0"
1638 [[ $
(get_cpu_vendor
) == "Intel" ]] && _dest_idx
="1"
1640 for idx
in $_dest_idx; do
1641 _fw
=${ucode_dir[$idx]}
1642 for _fwdir
in $fw_dir; do
1643 if [[ -d $_fwdir && -d $_fwdir/$_fw ]]; then
1645 dinfo
"*** Constructing ${ucode_dest[$idx]} ****"
1646 if [[ $hostonly ]]; then
1647 _src
=$
(get_ucode_file
)
1648 [[ $_src ]] ||
break
1649 [[ -r $_fwdir/$_fw/$_src ]] ||
break
1652 for i
in $_fwdir/$_fw/$_src; do
1653 [ -e "$i" ] && break
1656 for i
in $_fwdir/$_fw/$_src; do
1657 [[ -e "$i" ]] ||
continue
1659 str_ends
"$i" ".asc" && continue
1660 cat "$i" >> $_dest_dir/${ucode_dest[$idx]}
1662 create_early_cpio
="yes"
1668 if [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]]; then
1669 dinfo
"*** Packaging ACPI tables to override BIOS provided ones ***"
1670 _dest_dir
="$early_cpio_dir/d/kernel/firmware/acpi"
1672 for table
in $acpi_table_dir/*.aml
; do
1673 dinfo
" Adding ACPI table: $table"
1674 cp -a $table $_dest_dir
1675 create_early_cpio
="yes"
1679 dinfo
"*** Store current command line parameters ***"
1680 if ! ( echo $PARMS_TO_STORE > $initdir/lib
/dracut
/build-parameter.txt
); then
1681 dfatal
"Could not store the current command line parameters"
1685 if [[ $hostonly_cmdline ]] ; then
1686 unset _stored_cmdline
1687 if [ -d $initdir/etc
/cmdline.d
];then
1688 dinfo
"Stored kernel commandline:"
1689 for conf
in $initdir/etc
/cmdline.d
/*.conf
; do
1690 [ -e "$conf" ] ||
continue
1695 if ! [[ $_stored_cmdline ]]; then
1696 dinfo
"No dracut internal kernel commandline stored in the initramfs"
1700 dinfo
"*** Creating image file '$outfile' ***"
1702 if [[ $uefi = yes ]]; then
1703 readonly uefi_outdir
="$DRACUT_TMPDIR/uefi"
1704 mkdir
"$uefi_outdir"
1707 if [[ $DRACUT_REPRODUCIBLE ]]; then
1708 find "$initdir" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1709 |
xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1711 if [[ "$(cpio --help)" == *--reproducible* ]]; then
1714 dinfo
"cpio does not support '--reproducible'. Resulting image will not be reproducible."
1718 [[ "$UID" != 0 ]] && cpio_owner_root
="-R 0:0"
1720 if [[ $create_early_cpio = yes ]]; then
1721 echo 1 > "$early_cpio_dir/d/early_cpio"
1723 if [[ $DRACUT_REPRODUCIBLE ]]; then
1724 find "$early_cpio_dir/d" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1725 |
xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1728 # The microcode blob is _before_ the initramfs blob, not after
1730 umask 077; cd "$early_cpio_dir/d"
1731 find .
-print0 |
sort -z \
1732 |
cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc
-o --quiet > "${DRACUT_TMPDIR}/initramfs.img"
1734 dfatal
"dracut: creation of $outfile failed"
1740 umask 077; cd "$initdir"
1741 find .
-print0 |
sort -z \
1742 |
cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc
-o --quiet \
1743 |
$compress >> "${DRACUT_TMPDIR}/initramfs.img"
1745 dfatal
"dracut: creation of $outfile failed"
1749 if (( maxloglvl
>= 5 )); then
1750 if [[ $allowlocal ]]; then
1751 "$dracutbasedir/lsinitrd.sh" "${DRACUT_TMPDIR}/initramfs.img"| ddebug
1753 lsinitrd
"${DRACUT_TMPDIR}/initramfs.img"| ddebug
1759 if [[ $uefi = yes ]]; then
1760 if [[ $kernel_cmdline ]]; then
1761 echo -n "$kernel_cmdline" > "$uefi_outdir/cmdline.txt"
1762 elif [[ $hostonly_cmdline = yes ]] && [ -d $initdir/etc
/cmdline.d
];then
1763 for conf
in $initdir/etc
/cmdline.d
/*.conf
; do
1764 [ -e "$conf" ] ||
continue
1765 printf "%s " "$(< $conf)" >> "$uefi_outdir/cmdline.txt"
1768 do_print_cmdline
> "$uefi_outdir/cmdline.txt"
1770 echo -ne "\x00" >> "$uefi_outdir/cmdline.txt"
1772 dinfo
"Using UEFI kernel cmdline:"
1773 dinfo $
(< "$uefi_outdir/cmdline.txt")
1775 [[ -s /usr
/lib
/os-release
]] && uefi_osrelease
="/usr/lib/os-release"
1776 [[ -s /etc
/os-release
]] && uefi_osrelease
="/etc/os-release"
1779 ${uefi_osrelease:+--add-section .osrel=$uefi_osrelease --change-section-vma .osrel=0x20000} \
1780 --add-section .cmdline
="${uefi_outdir}/cmdline.txt" --change-section-vma .cmdline
=0x30000 \
1781 --add-section .linux
="$kernel_image" --change-section-vma .linux
=0x40000 \
1782 --add-section .initrd
="${DRACUT_TMPDIR}/initramfs.img" --change-section-vma .initrd
=0x3000000 \
1783 "$uefi_stub" "${uefi_outdir}/linux.efi" \
1784 && cp --reflink=auto
"${uefi_outdir}/linux.efi" "$outfile"; then
1785 dinfo
"*** Creating UEFI image file '$outfile' done ***"
1788 dfatal
"*** Creating UEFI image file '$outfile' failed ***"
1792 if cp --reflink=auto
"${DRACUT_TMPDIR}/initramfs.img" "$outfile"; then
1793 dinfo
"*** Creating initramfs image file '$outfile' done ***"
1796 dfatal
"dracut: creation of $outfile failed"
1801 command -v restorecon
&>/dev
/null
&& restorecon
-- "$outfile"