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 --persistent-policy [POLICY]
155 Use [POLICY] to address disks and partitions.
156 POLICY can be any directory name found in /dev/disk.
157 E.g. "by-uuid", "by-label"
158 --fstab Use /etc/fstab to determine the root device.
159 --add-fstab [FILE] Add file to the initramfs fstab
160 --mount "[DEV] [MP] [FSTYPE] [FSOPTS]"
161 Mount device [DEV] on mountpoint [MP] with filesystem
162 [FSTYPE] and options [FSOPTS] in the initramfs
163 --add-device "[DEV]" Bring up [DEV] in initramfs
164 -i, --include [SOURCE] [TARGET]
165 Include the files in the SOURCE directory into the
166 Target directory in the final initramfs.
167 If SOURCE is a file, it will be installed to TARGET
168 in the final initramfs.
169 -I, --install [LIST] Install the space separated list of files into the
171 --install-optional [LIST] Install the space separated list of files into the
172 initramfs, if they exist.
173 --gzip Compress the generated initramfs using gzip.
174 This will be done by default, unless another
175 compression option or --no-compress is passed.
176 --bzip2 Compress the generated initramfs using bzip2.
177 Make sure your kernel has bzip2 decompression support
178 compiled in, otherwise you will not be able to boot.
179 --lzma Compress the generated initramfs using lzma.
180 Make sure your kernel has lzma support compiled in,
181 otherwise you will not be able to boot.
182 --xz Compress the generated initramfs using xz.
183 Make sure that your kernel has xz support compiled
184 in, otherwise you will not be able to boot.
185 --lzo Compress the generated initramfs using lzop.
186 Make sure that your kernel has lzo support compiled
187 in, otherwise you will not be able to boot.
188 --lz4 Compress the generated initramfs using lz4.
189 Make sure that your kernel has lz4 support compiled
190 in, otherwise you will not be able to boot.
191 --compress [COMPRESSION] Compress the generated initramfs with the
192 passed compression program. Make sure your kernel
193 knows how to decompress the generated initramfs,
194 otherwise you will not be able to boot.
195 --no-compress Do not compress the generated initramfs. This will
196 override any other compression options.
197 --list-modules List all available dracut modules.
198 -M, --show-modules Print included module's name to standard output during
200 --keep Keep the temporary initramfs for debugging purposes
201 --printsize Print out the module install size
202 --sshkey [SSHKEY] Add ssh key to initramfs (use with ssh-client module)
203 --logfile [FILE] Logfile to use (overrides configuration setting)
204 --reproducible Create reproducible images
205 --loginstall [DIR] Log all files installed from the host to [DIR]
206 --uefi Create an UEFI executable with the kernel cmdline and
208 --uefi-stub [FILE] Use the UEFI stub [FILE] to create an UEFI executable
209 --kernel-image [FILE] location of the kernel image
211 If [LIST] has multiple arguments, then you have to put these in quotes.
215 # dracut --add-drivers "module1 module2" ...
220 # Fills up host_devs stack variable and makes sure there are no duplicates
224 [[ " ${host_devs[@]} " == *" $_dev "* ]] && return
225 host_devs
+=( "$_dev" )
229 # Little helper function for reading args from the commandline.
230 # it automatically handles -a b and -a=b variants, and returns 1 if
231 # we need to shift $3.
236 local rematch
='^[^=]*=(.*)$'
237 if [[ $2 =~
$rematch ]]; then
238 read "$1" <<< "${BASH_REMATCH[1]}"
241 # There is no way to shift our callers args, so
242 # return 1 to indicate they should do it instead.
249 local suffix
=$1; shift
254 for i
in "$d/"*"$suffix"; do
255 if [[ -e "$i" ]]; then
256 printf "%s\n" "${i##*/}"
262 for f
in "${files[@]}"; do
264 if [[ -e "$d/$f" ]]; then
265 printf "%s\n" "$d/$f"
275 # Workaround -i, --include taking 2 arguments
276 set -- "${@/--include/++include}"
278 # This prevents any long argument ending with "-i"
279 # -i, like --opt-i but I think we can just prevent that
280 set -- "${@/%-i/++include}"
282 TEMP
=$
(unset POSIXLY_CORRECT
; getopt \
283 -o "a:m:o:d:I:k:c:L:fvqlHhMN" \
287 --long add-drivers
: \
288 --long force-drivers
: \
289 --long omit-drivers
: \
293 --long filesystems
: \
295 --long install-optional
: \
316 --long print-cmdline \
317 --long kernel-cmdline
: \
339 --long no-host-only \
340 --long hostonly-cmdline \
341 --long no-hostonly-cmdline \
342 --long persistent-policy
: \
352 --long list-modules \
353 --long show-modules \
356 --long regenerate-all \
357 --long noimageifnotneeded \
358 --long early-microcode \
359 --long no-early-microcode \
360 --long reproducible \
364 --long kernel-image
: \
367 if (( $?
!= 0 )); then
377 rearrange_params
"$@"
380 # parse command line args to check if '--rebuild' option is present
385 if [ "$1" == "--" ]; then
388 if [ "$1" == "--rebuild" ]; then
391 if [ ! -e $rebuild_file ]; then
392 echo "Image file '$rebuild_file', for rebuild, does not exist!"
395 abs_rebuild_file
=$
(readlink
-f "$rebuild_file") && rebuild_file
="$abs_rebuild_file"
401 # get output file name and kernel version from command line arguments
407 if ! [[ ${outfile+x} ]]; then
409 elif ! [[ ${kernel+x} ]]; then
412 printf "\nUnknown arguments: %s\n\n" "$*" >&2
420 # extract input image file provided with rebuild option to get previous parameters, if any
421 if [[ $append_args_l == "yes" ]]; then
424 # determine resultant file
425 if ! [[ $outfile ]]; then
426 outfile
=$rebuild_file
429 if ! rebuild_param
=$
(lsinitrd
$rebuild_file '*lib/dracut/build-parameter.txt'); then
430 echo "Image '$rebuild_file' has no rebuild information stored"
434 # prepend previous parameters to current command line args
435 if [[ $rebuild_param ]]; then
436 TEMP
="$rebuild_param $TEMP"
438 rearrange_params
"$@"
441 # clean the temporarily used scratch-pad directory
451 if [ $1 != "--" ] && [ $1 != "--rebuild" ]; then
452 PARMS_TO_STORE
+=" $1";
455 --kver) kernel
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
456 -a|
--add) add_dracutmodules_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
457 --force-add) force_add_dracutmodules_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
458 --add-drivers) add_drivers_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
459 --force-drivers) force_drivers_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
460 --omit-drivers) omit_drivers_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
461 -m|
--modules) dracutmodules_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
462 -o|
--omit) omit_dracutmodules_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
463 -d|
--drivers) drivers_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
464 --filesystems) filesystems_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
465 -I|
--install) install_items_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
466 --install-optional) install_optional_items_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
467 --fwdir) fw_dir_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
468 --libdirs) libdirs_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
469 --fscks) fscks_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
470 --add-fstab) add_fstab_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
471 --mount) fstab_lines
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
472 --add-device|
--device) add_device_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
473 --kernel-cmdline) kernel_cmdline_l
+=("$2"); PARMS_TO_STORE
+=" '$2'"; shift;;
474 --nofscks) nofscks_l
="yes";;
475 --ro-mnt) ro_mnt_l
="yes";;
476 -k|
--kmoddir) drivers_dir_l
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
477 -c|
--conf) conffile
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
478 --confdir) confdir
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
479 --tmpdir) tmpdir_l
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
480 -L|
--stdlog) stdloglvl_l
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
481 --compress) compress_l
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
482 --prefix) prefix_l
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
483 --loginstall) loginstall_l
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
484 --rebuild) if [ $rebuild_file == $outfile ]; then
489 -f|
--force) force
=yes;;
490 --kernel-only) kernel_only
="yes"; no_kernel
="no";;
491 --no-kernel) kernel_only
="no"; no_kernel
="yes";;
493 print_cmdline
="yes"; hostonly_l
="yes"; kernel_only
="yes"; no_kernel
="yes";;
495 early_microcode_l
="yes";;
496 --no-early-microcode)
497 early_microcode_l
="no";;
498 --strip) do_strip_l
="yes";;
499 --nostrip) do_strip_l
="no";;
500 --prelink) do_prelink_l
="yes";;
501 --noprelink) do_prelink_l
="no";;
502 --hardlink) do_hardlink_l
="yes";;
503 --nohardlink) do_hardlink_l
="no";;
504 --noprefix) prefix_l
="/";;
505 --mdadmconf) mdadmconf_l
="yes";;
506 --nomdadmconf) mdadmconf_l
="no";;
507 --lvmconf) lvmconf_l
="yes";;
508 --nolvmconf) lvmconf_l
="no";;
509 --debug) debug
="yes";;
510 --profile) profile
="yes";;
511 --sshkey) sshkey
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
512 --logfile) logfile_l
="$2"; shift;;
513 -v|
--verbose) ((verbosity_mod_l
++));;
514 -q|
--quiet) ((verbosity_mod_l--
));;
517 [[ -f "$(readlink -f "${0%/*}")/dracut-init.sh" ]] \
518 && dracutbasedir
="$(readlink -f "${0%/*}")"
520 -H|
--hostonly|
--host-only)
522 -N|
--no-hostonly|
--no-host-only)
525 hostonly_cmdline_l
="yes" ;;
526 --no-hostonly-cmdline)
527 hostonly_cmdline_l
="no" ;;
529 persistent_policy_l
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
530 --fstab) use_fstab_l
="yes" ;;
531 -h|
--help) long_usage
; exit 1 ;;
532 -i|
--include) include_src
+=("$2"); PARMS_TO_STORE
+=" '$2'";
534 --bzip2) compress_l
="bzip2";;
535 --lzma) compress_l
="lzma";;
536 --xz) compress_l
="xz";;
537 --lzo) compress_l
="lzo";;
538 --lz4) compress_l
="lz4";;
539 --no-compress) _no_compress_l
="cat";;
540 --gzip) compress_l
="gzip";;
541 --list-modules) do_list
="yes";;
546 --printsize) printsize
="yes";;
547 --regenerate-all) regenerate_all
="yes";;
548 --noimageifnotneeded) noimageifnotneeded
="yes";;
549 --reproducible) reproducible_l
="yes";;
552 uefi_stub_l
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
554 kernel_image_l
="$2"; PARMS_TO_STORE
+=" '$2'"; shift;;
557 *) # should not even reach this point
558 printf "\n!Unknown option: '%s'\n\n" "$1" >&2; usage
; exit 1;;
563 # getopt cannot handle multiple arguments, so just handle "-I,--include"
564 # the old fashioned way
567 if [ "${1%%=*}" == "++include" ]; then
569 include_target
+=("$3")
570 PARMS_TO_STORE
+=" --include '$2' '$3'"
576 if [[ $regenerate_all == "yes" ]]; then
578 if [[ $kernel ]]; then
579 printf -- "--regenerate-all cannot be called with a kernel version\n" >&2
583 if [[ $outfile ]]; then
584 printf -- "--regenerate-all cannot be called with a image file\n" >&2
588 ((len
=${#dracut_args[@]}))
589 for ((i
=0; i
< len
; i
++)); do
590 [[ ${dracut_args[$i]} == "--regenerate-all" ]] && \
591 unset dracut_args
[$i]
596 [[ -f $i/modules.dep
]] ||
[[ -f $i/modules.dep.bin
]] ||
continue
597 "$dracut_cmd" --kver="$i" "${dracut_args[@]}"
603 if ! [[ $kernel ]]; then
607 if [[ $kernel ]]; then
608 if ! [[ -d /lib
/modules
/$kernel ]] && [[ $no_kernel != yes ]]; then
609 printf -- "Kernel version $kernel has no module directory /lib/modules/$kernel\n" >&2
613 if ! [[ $outfile ]]; then
614 [[ -f /etc
/machine-id
]] && read MACHINE_ID
< /etc
/machine-id
616 if [[ $MACHINE_ID ]] && ( [[ -d /boot
/${MACHINE_ID} ]] ||
[[ -L /boot
/${MACHINE_ID} ]] ); then
617 outfile
="/boot/${MACHINE_ID}/$kernel/initrd"
619 outfile
="/boot/initramfs-$kernel.img"
627 unset LD_LIBRARY_PATH
631 export DRACUT_LOG_LEVEL
=warning
633 export DRACUT_LOG_LEVEL
=debug
634 export PS4
='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): ';
639 export PS4
='+ $(date "+%s.%N") ${BASH_SOURCE}@${LINENO}: ';
644 [[ $dracutbasedir ]] || dracutbasedir
=/usr
/lib
/dracut
646 # if we were not passed a config file, try the default one
647 if [[ ! -f $conffile ]]; then
648 if [[ $allowlocal ]]; then
649 conffile
="$dracutbasedir/dracut.conf"
651 conffile
="/etc/dracut.conf"
655 if [[ ! -d $confdir ]]; then
656 if [[ $allowlocal ]]; then
657 confdir
="$dracutbasedir/dracut.conf.d"
659 confdir
="/etc/dracut.conf.d"
663 # source our config file
664 [[ -f $conffile ]] && .
"$conffile"
666 # source our config dir
667 for f
in $
(dropindirs_sort
".conf" "$confdir" "$dracutbasedir/dracut.conf.d"); do
668 [[ -e $f ]] && .
"$f"
671 DRACUT_PATH
=${DRACUT_PATH:-/sbin /bin /usr/sbin /usr/bin}
673 for i
in $DRACUT_PATH; do
678 if [[ "$NPATH" != *:$rl* ]] ; then
682 export PATH
="${NPATH#:}"
685 # these options add to the stuff in the config file
686 (( ${#add_dracutmodules_l[@]} )) && add_dracutmodules
+=" ${add_dracutmodules_l[@]} "
687 (( ${#force_add_dracutmodules_l[@]} )) && force_add_dracutmodules
+=" ${force_add_dracutmodules_l[@]} "
688 (( ${#fscks_l[@]} )) && fscks
+=" ${fscks_l[@]} "
689 (( ${#add_fstab_l[@]} )) && add_fstab
+=" ${add_fstab_l[@]} "
690 (( ${#fstab_lines_l[@]} )) && fstab_lines
+=( "${fstab_lines_l[@]}" )
691 (( ${#install_items_l[@]} )) && install_items
+=" ${install_items_l[@]} "
692 (( ${#install_optional_items_l[@]} )) && install_optional_items
+=" ${install_optional_items_l[@]} "
694 # these options override the stuff in the config file
695 (( ${#dracutmodules_l[@]} )) && dracutmodules
="${dracutmodules_l[@]}"
696 (( ${#omit_dracutmodules_l[@]} )) && omit_dracutmodules
="${omit_dracutmodules_l[@]}"
697 (( ${#filesystems_l[@]} )) && filesystems
="${filesystems_l[@]}"
698 (( ${#fw_dir_l[@]} )) && fw_dir
="${fw_dir_l[@]}"
699 (( ${#libdirs_l[@]} ))&& libdirs
="${libdirs_l[@]}"
701 [[ $stdloglvl_l ]] && stdloglvl
=$stdloglvl_l
702 [[ ! $stdloglvl ]] && stdloglvl
=4
703 stdloglvl
=$
((stdloglvl
+ verbosity_mod_l
))
704 ((stdloglvl
> 6)) && stdloglvl
=6
705 ((stdloglvl
< 0)) && stdloglvl
=0
707 [[ $drivers_dir_l ]] && drivers_dir
=$drivers_dir_l
708 [[ $do_strip_l ]] && do_strip
=$do_strip_l
709 [[ $do_strip ]] || do_strip
=yes
710 [[ $do_prelink_l ]] && do_prelink
=$do_prelink_l
711 [[ $do_prelink ]] || do_prelink
=yes
712 [[ $do_hardlink_l ]] && do_hardlink
=$do_hardlink_l
713 [[ $do_hardlink ]] || do_hardlink
=yes
714 [[ $prefix_l ]] && prefix
=$prefix_l
715 [[ $prefix = "/" ]] && unset prefix
716 [[ $hostonly_l ]] && hostonly
=$hostonly_l
717 [[ $hostonly_cmdline_l ]] && hostonly_cmdline
=$hostonly_cmdline_l
718 [[ "$hostonly" == "yes" ]] && ! [[ $hostonly_cmdline ]] && hostonly_cmdline
="yes"
719 [[ $persistent_policy_l ]] && persistent_policy
=$persistent_policy_l
720 [[ $use_fstab_l ]] && use_fstab
=$use_fstab_l
721 [[ $mdadmconf_l ]] && mdadmconf
=$mdadmconf_l
722 [[ $lvmconf_l ]] && lvmconf
=$lvmconf_l
723 [[ $dracutbasedir ]] || dracutbasedir
=/usr
/lib
/dracut
724 [[ $fw_dir ]] || fw_dir
="/lib/firmware/updates /lib/firmware /lib/firmware/$kernel"
725 [[ $tmpdir_l ]] && tmpdir
="$tmpdir_l"
726 [[ $tmpdir ]] || tmpdir
=/var
/tmp
727 [[ $INITRD_COMPRESS ]] && compress=$INITRD_COMPRESS
728 [[ $compress_l ]] && compress=$compress_l
729 [[ $show_modules_l ]] && show_modules
=$show_modules_l
730 [[ $nofscks_l ]] && nofscks
="yes"
731 [[ $ro_mnt_l ]] && ro_mnt
="yes"
732 [[ $early_microcode_l ]] && early_microcode
=$early_microcode_l
733 [[ $early_microcode ]] || early_microcode
=no
734 [[ $logfile_l ]] && logfile
="$logfile_l"
735 [[ $reproducible_l ]] && reproducible
="$reproducible_l"
736 [[ $loginstall_l ]] && loginstall
="$loginstall_l"
737 [[ $uefi_stub_l ]] && uefi_stub
="$uefi_stub_l"
738 [[ $kernel_image_l ]] && kernel_image
="$kernel_image_l"
740 # eliminate IFS hackery when messing with fw_dir
741 fw_dir
=${fw_dir//:/ }
743 # check for logfile and try to create one if it doesn't exist
744 if [[ -n "$logfile" ]];then
745 if [[ ! -f "$logfile" ]];then
747 if [ ! $?
-eq 0 ] ;then
748 printf "%s\n" "dracut: touch $logfile failed." >&2
753 # handle compression options.
754 if [[ $_no_compress_l = "cat" ]]; then
758 if ! [[ $compress ]]; then
759 # check all known compressors, if none specified
760 for i
in pigz
gzip lz4 lzop lzma xz lbzip2
bzip2 cat; do
761 command -v "$i" &>/dev
/null ||
continue
765 if [[ $compress = cat ]]; then
766 printf "%s\n" "dracut: no compression tool available. Initramfs image is going to be big." >&2
770 # choose the right arguments for the compressor
773 if [[ "$compress" = lbzip2
]] ||
command -v lbzip2
&>/dev
/null
; then
780 compress="lzma -9 -T0"
783 compress="xz --check=crc32 --lzma2=dict=1MiB -T0"
786 if [[ "$compress" = pigz
]] ||
command -v pigz
&>/dev
/null
; then
787 compress="pigz -9 -n -T -R"
788 elif command -v gzip &>/dev
/null
&& gzip --help 2>&1 |
grep -q rsyncable
; then
789 compress="gzip -n -9 --rsyncable"
791 compress="gzip -n -9"
802 [[ $hostonly = yes ]] && hostonly
="-h"
803 [[ $hostonly != "-h" ]] && unset hostonly
805 [[ $reproducible == yes ]] && DRACUT_REPRODUCIBLE
=1
807 readonly TMPDIR
="$tmpdir"
808 readonly initdir
="$(mktemp -p "$TMPDIR/" -d -t initramfs.XXXXXX)"
809 [ -d "$initdir" ] ||
{
810 printf "%s\n" "dracut: mktemp -p '$TMPDIR/' -d -t initramfs.XXXXXX failed." >&2
814 if [[ $early_microcode = yes ]] ||
( [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]] ); then
815 readonly early_cpio_dir
="$(mktemp -p "$TMPDIR/" -d -t early_cpio.XXXXXX)"
816 [ -d "$early_cpio_dir" ] ||
{
817 printf "%s\n" "dracut: mktemp -p '$TMPDIR/' -d -t early_cpio.XXXXXX failed." >&2
821 # clean up after ourselves no matter how we die.
824 [[ $keep ]] && echo "Not removing $initdir." >&2 || { [[ $initdir ]] && rm -rf -- "$initdir"; };
825 [[ $keep ]] && echo "Not removing $early_cpio_dir." >&2 || { [[ $early_cpio_dir ]] && rm -Rf -- "$early_cpio_dir"; };
826 [[ $keep ]] && echo "Not removing $uefi_outdir." >&2 || { [[ $uefi_outdir ]] && rm -Rf -- "$uefi_outdir"; };
827 [[ $_dlogdir ]] && rm -Rf -- "$_dlogdir";
831 # clean up after ourselves no matter how we die.
832 trap 'exit 1;' SIGINT
834 export DRACUT_KERNEL_LAZY
="1"
835 export DRACUT_RESOLVE_LAZY
="1"
837 if [[ $print_cmdline ]]; then
844 if [[ -f $dracutbasedir/dracut-version.sh
]]; then
845 .
$dracutbasedir/dracut-version.sh
848 if [[ -f $dracutbasedir/dracut-init.sh
]]; then
849 .
$dracutbasedir/dracut-init.sh
851 printf "%s\n" "dracut: Cannot find $dracutbasedir/dracut-init.sh." >&2
852 printf "%s\n" "dracut: Are you running from a git checkout?" >&2
853 printf "%s\n" "dracut: Try passing -l as an argument to $dracut_cmd" >&2
857 if ! [[ $print_cmdline ]]; then
859 if ! $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R "$initdir/bin/sh" &>/dev
/null
; then
860 unset DRACUT_RESOLVE_LAZY
861 export DRACUT_RESOLVE_DEPS
=1
863 rm -fr -- ${initdir}/*
866 dracutfunctions
=$dracutbasedir/dracut-functions.sh
867 export dracutfunctions
869 (( ${#drivers_l[@]} )) && drivers
="${drivers_l[@]}"
870 drivers
=${drivers/-/_}
872 (( ${#add_drivers_l[@]} )) && add_drivers
+=" ${add_drivers_l[@]} "
873 add_drivers
=${add_drivers/-/_}
875 (( ${#force_drivers_l[@]} )) && force_drivers
+=" ${force_drivers_l[@]} "
876 force_drivers
=${force_drivers/-/_}
878 (( ${#omit_drivers_l[@]} )) && omit_drivers
+=" ${omit_drivers_l[@]} "
879 omit_drivers
=${omit_drivers/-/_}
881 (( ${#kernel_cmdline_l[@]} )) && kernel_cmdline
+=" ${kernel_cmdline_l[@]} "
883 omit_drivers_corrected
=""
884 for d
in $omit_drivers; do
885 [[ " $drivers $add_drivers " == *\
$d\
* ]] && continue
886 [[ " $drivers $force_drivers " == *\
$d\
* ]] && continue
887 omit_drivers_corrected
+="$d|"
889 omit_drivers
="${omit_drivers_corrected%|}"
890 unset omit_drivers_corrected
892 # prepare args for logging
893 for ((i
=0; i
< ${#dracut_args[@]}; i
++)); do
894 [[ "${dracut_args[$i]}" == *\
* ]] && \
895 dracut_args
[$i]="\"${dracut_args[$i]}\""
899 dinfo
"Executing: $dracut_cmd ${dracut_args[@]}"
901 [[ $do_list = yes ]] && {
902 for mod
in $dracutbasedir/modules.d
/*; do
903 [[ -d $mod ]] ||
continue;
904 [[ -e $mod/install ||
-e $mod/installkernel || \
905 -e $mod/module-setup.sh
]] ||
continue
906 printf "%s\n" "${mod##*/??}"
911 # This is kinda legacy -- eventually it should go away.
912 case $dracutmodules in
913 ""|auto
) dracutmodules
="all" ;;
916 abs_outfile
=$
(readlink
-f "$outfile") && outfile
="$abs_outfile"
918 if [[ $no_kernel != yes ]] && [[ -d $srcmods ]]; then
919 if ! [[ -f $srcmods/modules.dep
]]; then
920 dwarn
"$srcmods/modules.dep is missing. Did you run depmod?"
921 elif ! ( command -v gzip &>/dev
/null
&& command -v xz
&>/dev
/null
); then
922 read _mod
< $srcmods/modules.dep
924 if [[ -f $srcmods/"$_mod" ]]; then
925 # Check, if kernel modules are compressed, and if we can uncompress them
927 *.ko.gz
) kcompress
=gzip;;
928 *.ko.xz
) kcompress
=xz
;;
930 if [[ $kcompress ]]; then
931 if ! command -v "$kcompress" &>/dev
/null
; then
932 dfatal
"Kernel modules are compressed with $kcompress, but $kcompress is not available."
940 if [[ ! $print_cmdline ]]; then
941 if [[ -f $outfile && ! $force ]]; then
942 dfatal
"Will not override existing initramfs ($outfile) without --force"
947 [[ $outdir ]] || outdir
="/"
949 if [[ ! -d "$outdir" ]]; then
950 dfatal
"Can't write to $outdir: Directory $outdir does not exist or is not accessible."
952 elif [[ ! -w "$outdir" ]]; then
953 dfatal
"No permission to write to $outdir."
955 elif [[ -f "$outfile" && ! -w "$outfile" ]]; then
956 dfatal
"No permission to write $outfile."
960 if [[ $loginstall ]]; then
961 if ! mkdir
-p "$loginstall"; then
962 dfatal
"Could not create directory to log installed files to '$loginstall'."
965 loginstall
=$
(readlink
-f "$loginstall")
968 if [[ $uefi = yes ]]; then
969 if ! command -v objcopy
&>/dev
/null
; then
970 dfatal
"Need 'objcopy' to create a UEFI executable"
973 unset EFI_MACHINE_TYPE_NAME
976 EFI_MACHINE_TYPE_NAME
=x64
;;
978 EFI_MACHINE_TYPE_NAME
=ia32
;;
980 dfatal
"Architecture '$(arch)' not supported to create a UEFI executable"
985 if ! [[ -s $uefi_stub ]]; then
987 "/lib/systemd/boot/efi/linux${EFI_MACHINE_TYPE_NAME}.efi.stub" \
988 "/usr/lib/gummiboot/linux${EFI_MACHINE_TYPE_NAME}.efi.stub"; do
989 [[ -s $uefi_stub ]] ||
continue
993 if ! [[ -s $uefi_stub ]]; then
994 dfatal
"Can't find a uefi stub '$uefi_stub' to create a UEFI executable"
998 if ! [[ $kernel_image ]]; then
999 for kernel_image
in "/lib/modules/$kernel/vmlinuz" "/boot/vmlinuz-$kernel"; do
1000 [[ -s "$kernel_image" ]] ||
continue
1004 if ! [[ -s $kernel_image ]]; then
1005 dfatal
"Can't find a kernel image '$kernel_image' to create a UEFI executable"
1011 if [[ $acpi_override = yes ]] && ! check_kernel_config CONFIG_ACPI_INITRD_TABLE_OVERRIDE
; then
1012 dwarn
"Disabling ACPI override, because kernel does not support it. CONFIG_ACPI_INITRD_TABLE_OVERRIDE!=y"
1016 if [[ $early_microcode = yes ]]; then
1017 if [[ $hostonly ]]; then
1018 [[ $
(get_cpu_vendor
) == "AMD" ]] \
1019 && ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
1020 && unset early_microcode
1021 [[ $
(get_cpu_vendor
) == "Intel" ]] \
1022 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
1023 && unset early_microcode
1025 ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
1026 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
1027 && unset early_microcode
1029 [[ $early_microcode != yes ]] \
1030 && dwarn
"Disabling early microcode, because kernel does not support it. CONFIG_MICROCODE_[AMD|INTEL]_EARLY!=y"
1033 # Need to be able to have non-root users read stuff (rpcbind etc)
1034 chmod 755 "$initdir"
1036 if [[ $hostonly ]]; then
1037 for i
in /sys
/proc
/run
/dev
; do
1038 if ! findmnt
--target "$i" &>/dev
/null
; then
1039 dwarning
"Turning off host-only mode: '$i' is not mounted!"
1045 declare -A host_fs_types
1047 for line
in "${fstab_lines[@]}"; do
1053 dev
=$
(blkid
-l -t UUID
=${dev#UUID=} -o device
)
1056 dev
=$
(blkid
-l -t LABEL
=${dev#LABEL=} -o device
)
1059 dev
=$
(blkid
-l -t PARTUUID
=${dev#PARTUUID=} -o device
)
1062 dev
=$
(blkid
-l -t PARTLABEL
=${dev#PARTLABEL=} -o device
)
1065 [ -z "$dev" ] && dwarn
"Bad fstab entry $@" && continue
1066 if [[ "$3" == btrfs
]]; then
1067 for i
in $
(btrfs_devs
"$2"); do
1071 push_host_devs
"$dev"
1072 host_fs_types
["$dev"]="$3"
1075 for f
in $add_fstab; do
1076 [[ -e $f ]] ||
continue
1077 while read dev rest ||
[ -n "$dev" ]; do
1078 push_host_devs
"$dev"
1082 for dev
in $add_device; do
1083 push_host_devs
"$dev"
1086 if (( ${#add_device_l[@]} )); then
1087 add_device
+=" ${add_device_l[@]} "
1088 push_host_devs
"${add_device_l[@]}"
1091 if [[ $hostonly ]]; then
1092 # in hostonly mode, determine all devices, which have to be accessed
1093 # and examine them for filesystem types
1111 mp
=$
(readlink
-f "$mp")
1112 mountpoint
"$mp" >/dev
/null
2>&1 ||
continue
1113 _dev
=$
(find_block_device
"$mp")
1114 _bdev
=$
(readlink
-f "/dev/block/$_dev")
1115 [[ -b $_bdev ]] && _dev
=$_bdev
1116 [[ "$mp" == "/" ]] && root_devs
+=("$_dev")
1117 push_host_devs
"$_dev"
1118 if [[ $
(find_mp_fstype
"$mp") == btrfs
]]; then
1119 for i
in $
(btrfs_devs
"$mp"); do
1120 [[ "$mp" == "/" ]] && root_devs
+=("$i")
1126 if [[ -f /proc
/swaps
]] && [[ -f /etc
/fstab
]]; then
1127 while read dev
type rest ||
[ -n "$dev" ]; do
1128 [[ -b $dev ]] ||
continue
1129 [[ "$type" == "partition" ]] ||
continue
1131 while read _d _m _t _o _r ||
[ -n "$_d" ]; do
1132 [[ "$_d" == \
#* ]] && continue
1133 [[ $_d ]] ||
continue
1134 [[ $_t != "swap" ]] && continue
1135 [[ $_m != "swap" ]] && [[ $_m != "none" ]] && continue
1136 [[ "$_o" == *noauto
* ]] && continue
1137 _d
=$
(expand_persistent_dev
"$_d")
1138 [[ "$_d" -ef "$dev" ]] ||
continue
1140 if [[ -f /etc
/crypttab
]]; then
1141 while read _mapper _a _p _o ||
[ -n "$_mapper" ]; do
1142 [[ $_mapper = \
#* ]] && continue
1143 [[ "$_d" -ef /dev
/mapper
/"$_mapper" ]] ||
continue
1144 [[ "$_o" ]] || _o
="$_p"
1145 # skip entries with password files
1146 [[ "$_p" == /* ]] && [[ -f $_p ]] && continue 2
1148 [[ $_o == *swap
* ]] && continue 2
1149 done < /etc
/crypttab
1152 _dev
="$(readlink -f "$dev")"
1153 push_host_devs
"$_dev"
1154 swap_devs
+=("$_dev")
1160 # collect all "x-initrd.mount" entries from /etc/fstab
1161 if [[ -f /etc
/fstab
]]; then
1162 while read _d _m _t _o _r ||
[ -n "$_d" ]; do
1163 [[ "$_d" == \
#* ]] && continue
1164 [[ $_d ]] ||
continue
1165 [[ "$_o" != *x-initrd.mount
* ]] && continue
1166 _dev
=$
(expand_persistent_dev
"$_d")
1167 _dev
="$(readlink -f "$_dev")"
1168 [[ -b $_dev ]] ||
continue
1170 push_host_devs
"$_dev"
1171 if [[ "$_t" == btrfs
]]; then
1172 for i
in $
(find_btrfs_devs
"$_m"); do
1179 # record all host modaliases
1180 declare -A host_modalias
1181 find /sys
/devices
-name modalias
-exec cat '{}' \
; > "$initdir/.modalias"
1182 while read -r modalias ||
[ -n "$modalias" ]; do
1183 [[ $modalias ]] && host_modalias
["$modalias"]=1
1184 done < "$initdir/.modalias"
1186 rm -f -- "$initdir/.modalias"
1188 while read _k _s _v ||
[ -n "$_k" ]; do
1189 [ "$_k" != "name" -a "$_k" != "driver" ] && continue
1190 host_modalias
["$_v"]=1
1193 # check /proc/modules
1194 declare -A host_modules
1195 while read m rest ||
[ -n "$m" ]; do
1196 host_modules
["$m"]=1
1205 if [[ -b /dev
/block
/$1 ]]; then
1206 ID_FS_TYPE
=$
(get_fs_env
"/dev/block/$1") && host_fs_types
["$(readlink -f "/dev
/block
/$1")"]="$ID_FS_TYPE"
1209 if [[ -b $1 ]]; then
1210 ID_FS_TYPE
=$
(get_fs_env
"$1") && host_fs_types
["$(readlink -f "$1")"]="$ID_FS_TYPE"
1213 if fstype
=$
(find_dev_fstype
"$1"); then
1214 host_fs_types
["$1"]="$fstype"
1220 for dev
in "${host_devs[@]}"; do
1222 check_block_and_slaves_all _get_fs_type
"$(get_maj_min "$dev")"
1225 for dev
in "${!host_fs_types[@]}"; do
1226 [[ ${host_fs_types[$dev]} = "reiserfs" ]] ||
[[ ${host_fs_types[$dev]} = "xfs" ]] ||
continue
1227 rootopts
=$
(find_dev_fsopts
"$dev")
1228 if [[ ${host_fs_types[$dev]} = "reiserfs" ]]; then
1229 journaldev
=$
(fs_get_option
$rootopts "jdev")
1230 elif [[ ${host_fs_types[$dev]} = "xfs" ]]; then
1231 journaldev
=$
(fs_get_option
$rootopts "logdev")
1233 if [[ $journaldev ]]; then
1234 dev
="$(readlink -f "$dev")"
1235 push_host_devs
"$dev"
1237 check_block_and_slaves_all _get_fs_type
"$(get_maj_min "$dev")"
1242 || udevdir
="$(pkg-config udev --variable=udevdir 2>/dev/null)"
1243 if ! [[ -d "$udevdir" ]]; then
1244 [[ ! -h /lib
]] && [[ -d /lib
/udev
]] && udevdir
=/lib
/udev
1245 [[ -d /usr
/lib
/udev
]] && udevdir
=/usr
/lib
/udev
1248 [[ -d $systemdutildir ]] \
1249 || systemdutildir
=$
(pkg-config systemd
--variable=systemdutildir
2>/dev
/null
)
1251 if ! [[ -d "$systemdutildir" ]]; then
1252 [[ ! -h /lib
]] && [[ -d /lib
/systemd
]] && systemdutildir
=/lib
/systemd
1253 [[ -d /usr
/lib
/systemd
]] && systemdutildir
=/usr
/lib
/systemd
1256 [[ -d $systemdsystemunitdir ]] \
1257 || systemdsystemunitdir
=$
(pkg-config systemd
--variable=systemdsystemunitdir
2>/dev
/null
)
1259 [[ -d "$systemdsystemunitdir" ]] || systemdsystemunitdir
=${systemdutildir}/system
1261 [[ -d $systemdsystemconfdir ]] \
1262 || systemdsystemconfdir
=$
(pkg-config systemd
--variable=systemdsystemconfdir
2>/dev
/null
)
1264 [[ -d "$systemdsystemconfdir" ]] || systemdsystemconfdir
=/etc
/systemd
/system
1266 [[ -d $tmpfilesdir ]] \
1267 || tmpfilesdir
=$
(pkg-config systemd
--variable=tmpfilesdir
2>/dev
/null
)
1269 if ! [[ -d "$tmpfilesdir" ]]; then
1270 [[ -f /lib
/tmpfiles.d
]] && tmpfilesdir
=/lib
/tmpfiles.d
1271 [[ -f /usr
/lib
/tmpfiles.d
]] && tmpfilesdir
=/usr
/lib
/tmpfiles.d
1274 export initdir dracutbasedir \
1275 dracutmodules force_add_dracutmodules add_dracutmodules omit_dracutmodules \
1277 fw_dir drivers_dir debug no_kernel kernel_only \
1278 omit_drivers mdadmconf lvmconf root_dev \
1279 use_fstab fstab_lines libdirs fscks nofscks ro_mnt \
1280 stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
1281 debug host_fs_types host_devs swap_devs sshkey add_fstab \
1282 DRACUT_VERSION udevdir prefix filesystems drivers \
1283 systemdutildir systemdsystemunitdir systemdsystemconfdir \
1284 host_modalias host_modules hostonly_cmdline loginstall \
1288 # check all our modules to see if they should be sourced.
1289 # This builds a list of modules that we will install next.
1290 for_each_module_dir check_module
1291 for_each_module_dir check_mount
1293 dracut_module_included
"fips" && export DRACUT_FIPS_MODE
=1
1297 local -A _mods_to_print
1298 for i
in $modules_loaded $mods_to_load; do
1299 _mods_to_print
[$i]=1
1302 # source our modules.
1303 for moddir
in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1304 _d_mod
=${moddir##*/}; _d_mod
=${_d_mod#[0-9][0-9]}
1305 [[ ${_mods_to_print[$_d_mod]} ]] ||
continue
1306 module_cmdline
"$_d_mod"
1311 if [[ $print_cmdline ]]; then
1317 # Create some directory structure first
1318 [[ $prefix ]] && mkdir
-m 0755 -p "${initdir}${prefix}"
1320 [[ -h /lib
]] || mkdir
-m 0755 -p "${initdir}${prefix}/lib"
1321 [[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib"
1323 if [[ $prefix ]]; then
1324 for d
in bin etc lib sbin tmp usr var
$libdirs; do
1325 [[ "$d" == */* ]] && continue
1326 ln -sfn "${prefix#/}/${d#/}" "$initdir/$d"
1330 if [[ $kernel_only != yes ]]; then
1331 for d
in usr
/bin usr
/sbin bin etc lib sbin tmp usr var var
/tmp
$libdirs; do
1332 [[ -e "${initdir}${prefix}/$d" ]] && continue
1333 if [ -L "/$d" ]; then
1334 inst_symlink
"/$d" "${prefix}/$d"
1336 mkdir
-m 0755 -p "${initdir}${prefix}/$d"
1340 for d
in dev proc sys sysroot root run
; do
1341 if [ -L "/$d" ]; then
1344 mkdir
-m 0755 -p "$initdir/$d"
1348 ln -sfn ..
/run
"$initdir/var/run"
1349 ln -sfn ..
/run
/lock
"$initdir/var/lock"
1351 for d
in lib
"$libdir"; do
1352 [[ -e "${initdir}${prefix}/$d" ]] && continue
1353 if [ -h "/$d" ]; then
1354 inst
"/$d" "${prefix}/$d"
1356 mkdir
-m 0755 -p "${initdir}${prefix}/$d"
1361 if [[ $kernel_only != yes ]]; then
1362 mkdir
-p "${initdir}/etc/cmdline.d"
1363 for _d
in $hookdirs; do
1364 mkdir
-m 0755 -p ${initdir}/lib
/dracut
/hooks
/$_d
1366 if [[ "$UID" = "0" ]]; then
1367 [ -c ${initdir}/dev
/null
] || mknod
${initdir}/dev
/null c
1 3
1368 [ -c ${initdir}/dev
/kmsg
] || mknod
${initdir}/dev
/kmsg c
1 11
1369 [ -c ${initdir}/dev
/console
] || mknod
${initdir}/dev
/console c
5 1
1373 _isize
=0 #initramfs size
1375 # source our modules.
1376 for moddir
in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1377 _d_mod
=${moddir##*/}; _d_mod
=${_d_mod#[0-9][0-9]}
1378 [[ "$mods_to_load" == *\
$_d_mod\
* ]] ||
continue
1379 if [[ $show_modules = yes ]]; then
1380 printf "%s\n" "$_d_mod"
1382 dinfo
"*** Including module: $_d_mod ***"
1384 if [[ $kernel_only == yes ]]; then
1385 module_installkernel
"$_d_mod" ||
{
1386 dfatal
"installkernel failed in module $_d_mod"
1390 module_install
"$_d_mod"
1391 if [[ $no_kernel != yes ]]; then
1392 module_installkernel
"$_d_mod" ||
{
1393 dfatal
"installkernel failed in module $_d_mod"
1398 mods_to_load
=${mods_to_load// $_d_mod /}
1399 modules_loaded
+="$_d_mod "
1401 #print the module install size
1402 if [ -n "$printsize" ]; then
1403 _isize_new
=$
(du
-sk ${initdir}|cut
-f1)
1404 _isize_delta
=$
((_isize_new
- _isize
))
1405 printf "%s\n" "$_d_mod install size: ${_isize_delta}k"
1411 for i
in $modules_loaded; do
1412 mkdir
-p $initdir/lib
/dracut
1413 printf "%s\n" "$i" >> $initdir/lib
/dracut
/modules.txt
1416 dinfo
"*** Including modules done ***"
1418 ## final stuff that has to happen
1419 if [[ $no_kernel != yes ]]; then
1421 if [[ $drivers ]]; then
1422 hostonly
='' instmods
$drivers
1425 if [[ $add_drivers ]]; then
1426 hostonly
='' instmods
-c $add_drivers
1428 if [[ $force_drivers ]]; then
1429 hostonly
='' instmods
-c $force_drivers
1430 rm -f $initdir/etc
/cmdline.d
/20-force_driver.conf
1431 for mod
in $force_drivers; do
1432 echo "rd.driver.pre=$mod" >>$initdir/etc
/cmdline.d
/20-force_drivers.conf
1435 if [[ $filesystems ]]; then
1436 hostonly
='' instmods
-c $filesystems
1439 dinfo
"*** Installing kernel module dependencies and firmware ***"
1441 dinfo
"*** Installing kernel module dependencies and firmware done ***"
1443 if [[ $noimageifnotneeded == yes ]] && [[ $hostonly ]]; then
1444 if [[ ! -f "$initdir/lib/dracut/need-initqueue" ]] && \
1445 [[ -f ${initdir}/lib
/modules
/$kernel/modules.dep
&& ! -s ${initdir}/lib
/modules
/$kernel/modules.dep
]]; then
1446 for i
in ${initdir}/etc
/cmdline.d
/*.conf
; do
1447 # We need no initramfs image and do not generate one.
1448 [[ $i == "${initdir}/etc/cmdline.d/*.conf" ]] && exit 0
1454 if [[ $kernel_only != yes ]]; then
1455 (( ${#install_items[@]} > 0 )) && inst_multiple
${install_items[@]}
1456 (( ${#install_optional_items[@]} > 0 )) && inst_multiple
-o ${install_optional_items[@]}
1458 [[ $kernel_cmdline ]] && printf "%s\n" "$kernel_cmdline" >> "${initdir}/etc/cmdline.d/01-default.conf"
1460 for line
in "${fstab_lines[@]}"; do
1462 [ -z "${line[3]}" ] && line
[3]="defaults"
1463 [ -z "${line[4]}" ] && line
[4]="0"
1464 [ -z "${line[5]}" ] && line
[5]="2"
1465 strstr
"${line[2]}" "nfs" && line
[5]="0"
1466 echo "${line[@]}" >> "${initdir}/etc/fstab"
1469 for f
in $add_fstab; do
1470 cat "$f" >> "${initdir}/etc/fstab"
1473 if [ -d ${initdir}/$systemdutildir ]; then
1474 mkdir
-p ${initdir}/etc
/conf.d
1476 printf "%s\n" "systemdutildir=\"$systemdutildir\""
1477 printf "%s\n" "systemdsystemunitdir=\"$systemdsystemunitdir\""
1478 printf "%s\n" "systemdsystemconfdir=\"$systemdsystemconfdir\""
1479 } > ${initdir}/etc
/conf.d
/systemd.conf
1482 if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then
1483 dinfo
"*** Resolving executable dependencies ***"
1484 find "$initdir" -type f
-perm /0111 -not -path '*.ko' -print0 \
1485 |
xargs -r -0 $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R ${DRACUT_FIPS_MODE:+-H} --
1486 dinfo
"*** Resolving executable dependencies done***"
1489 # libpthread workaround: pthread_cancel wants to dlopen libgcc_s.so
1490 for _dir
in $libdirs; do
1491 for _f
in "$_dir/libpthread.so"*; do
1492 [[ -e "$_f" ]] ||
continue
1493 inst_libdir_file
"libgcc_s.so*"
1499 for ((i
=0; i
< ${#include_src[@]}; i
++)); do
1500 src
="${include_src[$i]}"
1501 target
="${include_target[$i]}"
1502 if [[ $src && $target ]]; then
1503 if [[ -f $src ]]; then
1506 ddebug
"Including directory: $src"
1507 destdir
="${initdir}/${target}"
1509 # check for preexisting symlinks, so we can cope with the
1510 # symlinks to $prefix
1511 # Objectname is a file or a directory
1512 for objectname
in "$src"/*; do
1513 [[ -e "$objectname" ||
-h "$objectname" ]] ||
continue
1514 if [[ -d "$objectname" ]]; then
1515 # objectname is a directory, let's compute the final directory name
1516 object_destdir
=${destdir}/${objectname#$src/}
1517 if ! [[ -e "$object_destdir" ]]; then
1518 mkdir
-m 0755 -p "$object_destdir"
1519 chmod --reference="$objectname" "$object_destdir"
1521 cp --reflink=auto
--sparse=auto
-fa -t "$object_destdir" "$objectname"/*
1523 cp --reflink=auto
--sparse=auto
-fa -t "$destdir" "$objectname"
1530 if [[ $kernel_only != yes ]]; then
1531 # make sure that library links are correct and up to date
1532 for f
in /etc
/ld.so.conf
/etc
/ld.so.conf.d
/*; do
1533 [[ -f $f ]] && inst_simple
"$f"
1535 if ! ldconfig
-r "$initdir"; then
1536 if [[ $UID = 0 ]]; then
1537 derror
"ldconfig exited ungracefully"
1539 derror
"ldconfig might need uid=0 (root) for chroot()"
1544 PRELINK_BIN
="$(command -v prelink)"
1545 if [[ $UID = 0 ]] && [[ $PRELINK_BIN ]]; then
1546 if [[ $DRACUT_FIPS_MODE ]]; then
1547 dinfo
"*** Installing prelink files ***"
1548 inst_multiple
-o prelink
/etc
/prelink.conf
/etc
/prelink.conf.d
/*.conf
/etc
/prelink.cache
1549 elif [[ $do_prelink == yes ]]; then
1550 dinfo
"*** Pre-linking files ***"
1551 inst_multiple
-o prelink
/etc
/prelink.conf
/etc
/prelink.conf.d
/*.conf
1552 chroot
"$initdir" "$PRELINK_BIN" -a
1553 rm -f -- "$initdir/$PRELINK_BIN"
1554 rm -fr -- "$initdir"/etc
/prelink.
*
1555 dinfo
"*** Pre-linking files done ***"
1559 if [[ $do_hardlink = yes ]] && command -v hardlink
>/dev
/null
; then
1560 dinfo
"*** Hardlinking files ***"
1561 hardlink
"$initdir" 2>&1
1562 dinfo
"*** Hardlinking files done ***"
1566 if [[ $do_strip = yes ]] ; then
1567 for p
in strip
xargs find; do
1568 if ! type -P $p >/dev
/null
; then
1569 dinfo
"Could not find '$p'. Not stripping the initramfs."
1575 if [[ $do_strip = yes ]] && ! [[ $DRACUT_FIPS_MODE ]]; then
1576 dinfo
"*** Stripping files ***"
1577 find "$initdir" -type f \
1578 -executable -not -path '*/lib/modules/*.ko' -print0 \
1579 |
xargs -r -0 strip
-g 2>/dev
/null
1581 # strip kernel modules, but do not touch signed modules
1582 find "$initdir" -type f
-path '*/lib/modules/*.ko' -print0 \
1583 |
while read -r -d $
'\0' f ||
[ -n "$f" ]; do
1584 SIG
=$
(tail -c 28 "$f")
1585 [[ $SIG == '~Module signature appended~' ]] ||
{ printf "%s\000" "$f"; }
1586 done |
xargs -r -0 strip
-g
1588 dinfo
"*** Stripping files done ***"
1590 if [[ $early_microcode = yes ]]; then
1591 dinfo
"*** Generating early-microcode cpio image ***"
1592 ucode_dir
=(amd-ucode intel-ucode
)
1593 ucode_dest
=(AuthenticAMD.bin GenuineIntel.bin
)
1594 _dest_dir
="$early_cpio_dir/d/kernel/x86/microcode"
1597 if [[ $hostonly ]]; then
1598 [[ $
(get_cpu_vendor
) == "AMD" ]] && _dest_idx
="0"
1599 [[ $
(get_cpu_vendor
) == "Intel" ]] && _dest_idx
="1"
1601 for idx
in $_dest_idx; do
1602 _fw
=${ucode_dir[$idx]}
1603 for _fwdir
in $fw_dir; do
1604 if [[ -d $_fwdir && -d $_fwdir/$_fw ]]; then
1606 dinfo
"*** Constructing ${ucode_dest[$idx]} ****"
1607 if [[ $hostonly ]]; then
1608 _src
=$
(get_ucode_file
)
1609 if ! [[ -r $_fwdir/$_fw/$_src ]];then
1613 cat $_fwdir/$_fw/$_src > $_dest_dir/${ucode_dest[$idx]}
1614 create_early_cpio
="yes"
1620 if [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]]; then
1621 dinfo
"*** Packaging ACPI tables to override BIOS provided ones ***"
1622 _dest_dir
="$early_cpio_dir/d/kernel/firmware/acpi"
1624 for table
in $acpi_table_dir/*.aml
; do
1625 dinfo
" Adding ACPI table: $table"
1626 cp -a $table $_dest_dir
1627 create_early_cpio
="yes"
1631 dinfo
"*** Store current command line parameters ***"
1632 if ! ( echo $PARMS_TO_STORE > $initdir/lib
/dracut
/build-parameter.txt
); then
1633 dfatal
"Could not store the current command line parameters"
1637 if [[ $hostonly_cmdline ]] ; then
1638 unset _stored_cmdline
1639 if [ -d $initdir/etc
/cmdline.d
];then
1640 dinfo
"Stored kernel commandline:"
1641 for conf
in $initdir/etc
/cmdline.d
/*.conf
; do
1642 [ -e "$conf" ] ||
continue
1647 if ! [[ $_stored_cmdline ]]; then
1648 dinfo
"No dracut internal kernel commandline stored in initrd"
1652 dinfo
"*** Creating image file '$outfile' ***"
1654 if [[ $uefi = yes ]]; then
1655 uefi_outfile
="$outfile"
1656 readonly uefi_outdir
="$(mktemp -p "$TMPDIR/" -d -t initrd.XXXXXX)"
1657 # redirect initrd output
1658 outfile
="$uefi_outdir/initrd"
1661 if [[ $DRACUT_REPRODUCIBLE ]]; then
1662 find "$initdir" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1663 |
xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1665 [[ "$(cpio --help)" == *--reproducible* ]] && CPIO_REPRODUCIBLE
=1
1668 [[ "$UID" != 0 ]] && cpio_owner_root
="-R 0:0"
1670 if [[ $create_early_cpio = yes ]]; then
1671 echo 1 > "$early_cpio_dir/d/early_cpio"
1673 if [[ $DRACUT_REPRODUCIBLE ]]; then
1674 find "$early_cpio_dir/d" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1675 |
xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1678 # The microcode blob is _before_ the initramfs blob, not after
1680 cd "$early_cpio_dir/d"
1681 find .
-print0 |
sort -z \
1682 |
cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc
-o --quiet > $outfile
1687 umask 077; cd "$initdir"
1688 find .
-print0 |
sort -z \
1689 |
cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc
-o --quiet \
1690 |
$compress >> "$outfile"
1692 dfatal
"dracut: creation of $outfile failed"
1695 dinfo
"*** Creating initrd image file '$outfile' done ***"
1697 if (( maxloglvl
>= 5 )); then
1698 if [[ $allowlocal ]]; then
1699 "$dracutbasedir/lsinitrd.sh" "$outfile"| ddebug
1701 lsinitrd
"$outfile"| ddebug
1705 if [[ $uefi = yes ]]; then
1706 if [[ $kernel_cmdline ]]; then
1707 echo -n "$kernel_cmdline" > "$uefi_outdir/cmdline.txt"
1708 elif [[ $hostonly_cmdline = yes ]] && [ -d $initdir/etc
/cmdline.d
];then
1709 for conf
in $initdir/etc
/cmdline.d
/*.conf
; do
1710 [ -e "$conf" ] ||
continue
1711 printf "%s " "$(< $conf)" >> "$uefi_outdir/cmdline.txt"
1714 do_print_cmdline
> "$uefi_outdir/cmdline.txt"
1716 echo -ne "\x00" >> "$uefi_outdir/cmdline.txt"
1718 dinfo
"Using UEFI kernel cmdline:"
1719 dinfo $
(< "$uefi_outdir/cmdline.txt")
1721 [[ -s /usr
/lib
/os-release
]] && uefi_osrelease
="/usr/lib/os-release"
1722 [[ -s /etc
/os-release
]] && uefi_osrelease
="/etc/os-release"
1725 ${uefi_osrelease:+--add-section .osrel=$uefi_osrelease --change-section-vma .osrel=0x20000} \
1726 --add-section .cmdline
="$uefi_outdir/cmdline.txt" --change-section-vma .cmdline
=0x30000 \
1727 --add-section .linux
="$kernel_image" --change-section-vma .linux
=0x40000 \
1728 --add-section .initrd
="$outfile" --change-section-vma .initrd
=0x3000000 \
1729 "$uefi_stub" "$uefi_outfile"
1730 dinfo
"*** Creating UEFI image file '$uefi_outfile' done ***"