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 "${systemdutildir}/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 [[ "$EUID" = "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
1395 [ -c ${initdir}/dev
/random
] || mknod
${initdir}/dev
/random c
1 8
1396 [ -c ${initdir}/dev
/urandom
] || mknod
${initdir}/dev
/urandom c
1 9
1400 _isize
=0 #initramfs size
1402 # source our modules.
1403 for moddir
in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1404 _d_mod
=${moddir##*/}; _d_mod
=${_d_mod#[0-9][0-9]}
1405 [[ "$mods_to_load" == *\
$_d_mod\
* ]] ||
continue
1406 if [[ $show_modules = yes ]]; then
1407 printf "%s\n" "$_d_mod"
1409 dinfo
"*** Including module: $_d_mod ***"
1411 if [[ $kernel_only == yes ]]; then
1412 module_installkernel
"$_d_mod" ||
{
1413 dfatal
"installkernel failed in module $_d_mod"
1417 module_install
"$_d_mod"
1418 if [[ $no_kernel != yes ]]; then
1419 module_installkernel
"$_d_mod" ||
{
1420 dfatal
"installkernel failed in module $_d_mod"
1425 mods_to_load
=${mods_to_load// $_d_mod /}
1426 modules_loaded
+="$_d_mod "
1428 #print the module install size
1429 if [ -n "$printsize" ]; then
1430 _isize_new
=$
(du
-sk ${initdir}|cut
-f1)
1431 _isize_delta
=$
((_isize_new
- _isize
))
1432 printf "%s\n" "$_d_mod install size: ${_isize_delta}k"
1438 for i
in $modules_loaded; do
1439 mkdir
-p $initdir/lib
/dracut
1440 printf "%s\n" "$i" >> $initdir/lib
/dracut
/modules.txt
1443 dinfo
"*** Including modules done ***"
1445 ## final stuff that has to happen
1446 if [[ $no_kernel != yes ]]; then
1448 if [[ $drivers ]]; then
1449 hostonly
='' instmods
$drivers
1452 if [[ $add_drivers ]]; then
1453 hostonly
='' instmods
-c $add_drivers
1455 if [[ $force_drivers ]]; then
1456 hostonly
='' instmods
-c $force_drivers
1457 rm -f $initdir/etc
/cmdline.d
/20-force_driver.conf
1458 for mod
in $force_drivers; do
1459 echo "rd.driver.pre=$mod" >>$initdir/etc
/cmdline.d
/20-force_drivers.conf
1462 if [[ $filesystems ]]; then
1463 hostonly
='' instmods
-c $filesystems
1466 dinfo
"*** Installing kernel module dependencies ***"
1468 dinfo
"*** Installing kernel module dependencies done ***"
1470 if [[ $noimageifnotneeded == yes ]] && [[ $hostonly ]]; then
1471 if [[ ! -f "$initdir/lib/dracut/need-initqueue" ]] && \
1472 [[ -f ${initdir}/lib
/modules
/$kernel/modules.dep
&& ! -s ${initdir}/lib
/modules
/$kernel/modules.dep
]]; then
1473 for i
in ${initdir}/etc
/cmdline.d
/*.conf
; do
1474 # We need no initramfs image and do not generate one.
1475 [[ $i == "${initdir}/etc/cmdline.d/*.conf" ]] && exit 0
1481 if [[ $kernel_only != yes ]]; then
1482 (( ${#install_items[@]} > 0 )) && inst_multiple
${install_items[@]}
1483 (( ${#install_optional_items[@]} > 0 )) && inst_multiple
-o ${install_optional_items[@]}
1485 [[ $kernel_cmdline ]] && printf "%s\n" "$kernel_cmdline" >> "${initdir}/etc/cmdline.d/01-default.conf"
1487 for line
in "${fstab_lines[@]}"; do
1490 if [ -z "${line[1]}" ]; then
1491 # Determine device and mount options from current system
1492 mountpoint
-q "${line[0]}" || derror
"${line[0]} is not a mount point!"
1493 line
=($
(findmnt
--raw -n --target "${line[0]}" --output=source,target
,fstype
,options
))
1494 dinfo
"Line for ${line[1]}: ${line[@]}"
1496 # Use default options
1497 [ -z "${line[3]}" ] && line
[3]="defaults"
1500 # Default options for freq and passno
1501 [ -z "${line[4]}" ] && line
[4]="0"
1502 [ -z "${line[5]}" ] && line
[5]="2"
1504 strstr
"${line[2]}" "nfs" && line
[5]="0"
1505 echo "${line[@]}" >> "${initdir}/etc/fstab"
1508 for f
in $add_fstab; do
1509 cat "$f" >> "${initdir}/etc/fstab"
1512 if [[ $systemdutildir ]]; then
1513 if [ -d ${initdir}/$systemdutildir ]; then
1514 mkdir
-p ${initdir}/etc
/conf.d
1516 printf "%s\n" "systemdutildir=\"$systemdutildir\""
1517 printf "%s\n" "systemdsystemunitdir=\"$systemdsystemunitdir\""
1518 printf "%s\n" "systemdsystemconfdir=\"$systemdsystemconfdir\""
1519 } > ${initdir}/etc
/conf.d
/systemd.conf
1523 if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then
1524 dinfo
"*** Resolving executable dependencies ***"
1525 find "$initdir" -type f
-perm /0111 -not -path '*.ko' -print0 \
1526 |
xargs -r -0 $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R ${DRACUT_FIPS_MODE:+-f} --
1527 dinfo
"*** Resolving executable dependencies done***"
1530 # libpthread workaround: pthread_cancel wants to dlopen libgcc_s.so
1531 for _dir
in $libdirs; do
1532 for _f
in "$_dir/libpthread.so"*; do
1533 [[ -e "$_f" ]] ||
continue
1534 inst_libdir_file
"libgcc_s.so*"
1540 for ((i
=0; i
< ${#include_src[@]}; i
++)); do
1541 src
="${include_src[$i]}"
1542 target
="${include_target[$i]}"
1543 if [[ $src && $target ]]; then
1544 if [[ -f $src ]]; then
1547 ddebug
"Including directory: $src"
1548 destdir
="${initdir}/${target}"
1550 # check for preexisting symlinks, so we can cope with the
1551 # symlinks to $prefix
1552 # Objectname is a file or a directory
1553 for objectname
in "$src"/*; do
1554 [[ -e "$objectname" ||
-h "$objectname" ]] ||
continue
1555 if [[ -d "$objectname" ]]; then
1556 # objectname is a directory, let's compute the final directory name
1557 object_destdir
=${destdir}/${objectname#$src/}
1558 if ! [[ -e "$object_destdir" ]]; then
1559 mkdir
-m 0755 -p "$object_destdir"
1560 chmod --reference="$objectname" "$object_destdir"
1562 $DRACUT_CP -t "$object_destdir" "$objectname"/*
1564 $DRACUT_CP -t "$destdir" "$objectname"
1571 if [[ $kernel_only != yes ]]; then
1572 # make sure that library links are correct and up to date
1573 for f
in /etc
/ld.so.conf
/etc
/ld.so.conf.d
/*; do
1574 [[ -f $f ]] && inst_simple
"$f"
1576 if ! ldconfig
-r "$initdir"; then
1577 if [[ $EUID = 0 ]]; then
1578 derror
"ldconfig exited ungracefully"
1580 derror
"ldconfig might need uid=0 (root) for chroot()"
1585 PRELINK_BIN
="$(command -v prelink)"
1586 if [[ $EUID = 0 ]] && [[ $PRELINK_BIN ]]; then
1587 if [[ $DRACUT_FIPS_MODE ]]; then
1588 dinfo
"*** Installing prelink files ***"
1589 inst_multiple
-o prelink
/etc
/prelink.conf
/etc
/prelink.conf.d
/*.conf
/etc
/prelink.cache
1590 elif [[ $do_prelink == yes ]]; then
1591 dinfo
"*** Pre-linking files ***"
1592 inst_multiple
-o prelink
/etc
/prelink.conf
/etc
/prelink.conf.d
/*.conf
1593 chroot
"$initdir" "$PRELINK_BIN" -a
1594 rm -f -- "$initdir/$PRELINK_BIN"
1595 rm -fr -- "$initdir"/etc
/prelink.
*
1596 dinfo
"*** Pre-linking files done ***"
1600 if [[ $do_hardlink = yes ]] && command -v hardlink
>/dev
/null
; then
1601 dinfo
"*** Hardlinking files ***"
1602 hardlink
"$initdir" 2>&1
1603 dinfo
"*** Hardlinking files done ***"
1607 if [[ $do_strip = yes ]] ; then
1608 # Prefer strip from elfutils for package size
1609 declare strip_cmd
=$
(command -v eu-strip
)
1610 test -z "$strip_cmd" && strip_cmd
="strip"
1612 for p
in $strip_cmd xargs find; do
1613 if ! type -P $p >/dev
/null
; then
1614 dinfo
"Could not find '$p'. Not stripping the initramfs."
1620 if [[ $do_strip = yes ]] && ! [[ $DRACUT_FIPS_MODE ]]; then
1621 dinfo
"*** Stripping files ***"
1622 find "$initdir" -type f \
1623 -executable -not -path '*/lib/modules/*.ko' -print0 \
1624 |
xargs -r -0 $strip_cmd -g 2>/dev
/null
1626 # strip kernel modules, but do not touch signed modules
1627 find "$initdir" -type f
-path '*/lib/modules/*.ko' -print0 \
1628 |
while read -r -d $
'\0' f ||
[ -n "$f" ]; do
1629 SIG
=$
(tail -c 28 "$f" |
tr -d '\000')
1630 [[ $SIG == '~Module signature appended~' ]] ||
{ printf "%s\000" "$f"; }
1631 done |
xargs -r -0 $strip_cmd -g
1633 dinfo
"*** Stripping files done ***"
1635 if [[ $early_microcode = yes ]]; then
1636 dinfo
"*** Generating early-microcode cpio image ***"
1637 ucode_dir
=(amd-ucode intel-ucode
)
1638 ucode_dest
=(AuthenticAMD.bin GenuineIntel.bin
)
1639 _dest_dir
="$early_cpio_dir/d/kernel/x86/microcode"
1642 if [[ $hostonly ]]; then
1643 [[ $
(get_cpu_vendor
) == "AMD" ]] && _dest_idx
="0"
1644 [[ $
(get_cpu_vendor
) == "Intel" ]] && _dest_idx
="1"
1646 for idx
in $_dest_idx; do
1647 _fw
=${ucode_dir[$idx]}
1648 for _fwdir
in $fw_dir; do
1649 if [[ -d $_fwdir && -d $_fwdir/$_fw ]]; then
1651 dinfo
"*** Constructing ${ucode_dest[$idx]} ****"
1652 if [[ $hostonly ]]; then
1653 _src
=$
(get_ucode_file
)
1654 [[ $_src ]] ||
break
1655 [[ -r $_fwdir/$_fw/$_src ]] ||
break
1658 for i
in $_fwdir/$_fw/$_src; do
1659 [ -e "$i" ] && break
1662 for i
in $_fwdir/$_fw/$_src; do
1663 [[ -e "$i" ]] ||
continue
1665 str_ends
"$i" ".asc" && continue
1666 cat "$i" >> $_dest_dir/${ucode_dest[$idx]}
1668 create_early_cpio
="yes"
1674 if [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]]; then
1675 dinfo
"*** Packaging ACPI tables to override BIOS provided ones ***"
1676 _dest_dir
="$early_cpio_dir/d/kernel/firmware/acpi"
1678 for table
in $acpi_table_dir/*.aml
; do
1679 dinfo
" Adding ACPI table: $table"
1680 $DRACUT_CP $table $_dest_dir
1681 create_early_cpio
="yes"
1685 dinfo
"*** Store current command line parameters ***"
1686 if ! ( echo $PARMS_TO_STORE > $initdir/lib
/dracut
/build-parameter.txt
); then
1687 dfatal
"Could not store the current command line parameters"
1691 if [[ $hostonly_cmdline ]] ; then
1692 unset _stored_cmdline
1693 if [ -d $initdir/etc
/cmdline.d
];then
1694 dinfo
"Stored kernel commandline:"
1695 for conf
in $initdir/etc
/cmdline.d
/*.conf
; do
1696 [ -e "$conf" ] ||
continue
1701 if ! [[ $_stored_cmdline ]]; then
1702 dinfo
"No dracut internal kernel commandline stored in the initramfs"
1706 dinfo
"*** Creating image file '$outfile' ***"
1708 if [[ $uefi = yes ]]; then
1709 readonly uefi_outdir
="$DRACUT_TMPDIR/uefi"
1710 mkdir
"$uefi_outdir"
1713 if [[ $DRACUT_REPRODUCIBLE ]]; then
1714 find "$initdir" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1715 |
xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1717 if [[ "$(cpio --help)" == *--reproducible* ]]; then
1720 dinfo
"cpio does not support '--reproducible'. Resulting image will not be reproducible."
1724 [[ "$EUID" != 0 ]] && cpio_owner_root
="-R 0:0"
1726 if [[ $create_early_cpio = yes ]]; then
1727 echo 1 > "$early_cpio_dir/d/early_cpio"
1729 if [[ $DRACUT_REPRODUCIBLE ]]; then
1730 find "$early_cpio_dir/d" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1731 |
xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1734 # The microcode blob is _before_ the initramfs blob, not after
1736 umask 077; cd "$early_cpio_dir/d"
1737 find .
-print0 |
sort -z \
1738 |
cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc
-o --quiet > "${DRACUT_TMPDIR}/initramfs.img"
1740 dfatal
"dracut: creation of $outfile failed"
1746 umask 077; cd "$initdir"
1747 find .
-print0 |
sort -z \
1748 |
cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc
-o --quiet \
1749 |
$compress >> "${DRACUT_TMPDIR}/initramfs.img"
1751 dfatal
"dracut: creation of $outfile failed"
1755 if (( maxloglvl
>= 5 )); then
1756 if [[ $allowlocal ]]; then
1757 "$dracutbasedir/lsinitrd.sh" "${DRACUT_TMPDIR}/initramfs.img"| ddebug
1759 lsinitrd
"${DRACUT_TMPDIR}/initramfs.img"| ddebug
1765 if [[ $uefi = yes ]]; then
1766 if [[ $kernel_cmdline ]]; then
1767 echo -n "$kernel_cmdline" > "$uefi_outdir/cmdline.txt"
1768 elif [[ $hostonly_cmdline = yes ]] && [ -d $initdir/etc
/cmdline.d
];then
1769 for conf
in $initdir/etc
/cmdline.d
/*.conf
; do
1770 [ -e "$conf" ] ||
continue
1771 printf "%s " "$(< $conf)" >> "$uefi_outdir/cmdline.txt"
1774 do_print_cmdline
> "$uefi_outdir/cmdline.txt"
1776 echo -ne "\x00" >> "$uefi_outdir/cmdline.txt"
1778 dinfo
"Using UEFI kernel cmdline:"
1779 dinfo $
(< "$uefi_outdir/cmdline.txt")
1781 [[ -s /usr
/lib
/os-release
]] && uefi_osrelease
="/usr/lib/os-release"
1782 [[ -s /etc
/os-release
]] && uefi_osrelease
="/etc/os-release"
1785 ${uefi_osrelease:+--add-section .osrel=$uefi_osrelease --change-section-vma .osrel=0x20000} \
1786 --add-section .cmdline
="${uefi_outdir}/cmdline.txt" --change-section-vma .cmdline
=0x30000 \
1787 --add-section .linux
="$kernel_image" --change-section-vma .linux
=0x40000 \
1788 --add-section .initrd
="${DRACUT_TMPDIR}/initramfs.img" --change-section-vma .initrd
=0x3000000 \
1789 "$uefi_stub" "${uefi_outdir}/linux.efi" \
1790 && cp --reflink=auto
"${uefi_outdir}/linux.efi" "$outfile"; then
1791 dinfo
"*** Creating UEFI image file '$outfile' done ***"
1794 dfatal
"*** Creating UEFI image file '$outfile' failed ***"
1798 if cp --reflink=auto
"${DRACUT_TMPDIR}/initramfs.img" "$outfile"; then
1799 dinfo
"*** Creating initramfs image file '$outfile' done ***"
1802 dfatal
"dracut: creation of $outfile failed"
1807 command -v restorecon
&>/dev
/null
&& restorecon
-- "$outfile"