3 # Generator script for a dracut initramfs
5 # Copyright 2005-2013 Red Hat, Inc. All rights reserved.
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 2 of the License, or
10 # (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # 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 "%s\n" "dracut[F]: dracut requires at least Bash 4." >&2
33 # shellcheck disable=SC2155
34 readonly dracut_cmd
=$
(readlink
-f "$0")
39 [[ $sysroot_l ]] && dracutsysrootdir
="$sysroot_l"
40 [[ $dracutbasedir ]] || dracutbasedir
="$dracutsysrootdir"/usr
/lib
/dracut
41 if [[ -f $dracutbasedir/dracut-version.sh
]]; then
42 # shellcheck source=./dracut-version.sh
43 .
"$dracutbasedir"/dracut-version.sh
46 # 80x25 linebreak here ^
48 Usage: $dracut_cmd [OPTION]... [<initramfs> [<kernel-version>]]
50 Version: $DRACUT_VERSION
52 Creates initial ramdisk images for preloading modules
54 -h, --help Display all options
56 If a [LIST] has multiple arguments, then you have to put these in quotes.
60 # dracut --add-drivers "module1 module2" ...
66 [[ $dracutbasedir ]] || dracutbasedir
="$dracutsysrootdir"/usr
/lib
/dracut
67 if [[ -f $dracutbasedir/dracut-version.sh
]]; then
68 # shellcheck source=./dracut-version.sh
69 .
"$dracutbasedir"/dracut-version.sh
72 # 80x25 linebreak here ^
74 Usage: $dracut_cmd [OPTION]... [<initramfs> [<kernel-version>]]
76 Version: $DRACUT_VERSION
78 Creates initial ramdisk images for preloading modules
80 --kver [VERSION] Set kernel version to [VERSION].
81 -f, --force Overwrite existing initramfs file.
82 [OUTPUT_FILE] --rebuild
83 Append the current arguments to those with which the
84 input initramfs image was built. This option helps in
85 incrementally building the initramfs for testing.
86 If optional [OUTPUT_FILE] is not provided, the input
87 initramfs provided to rebuild will be used as output
89 -a, --add [LIST] Add a space-separated list of dracut modules.
90 --force-add [LIST] Force to add a space-separated list of dracut modules
91 to the default set of modules, when -H is specified.
92 -o, --omit [LIST] Omit a space-separated list of dracut modules.
93 -m, --modules [LIST] Specify a space-separated list of dracut modules to
94 call when building the initramfs. Modules are located
95 in /usr/lib/dracut/modules.d.
96 This option forces dracut to only include the specified
98 In most cases the --add option is what you want to use.
99 --add-drivers [LIST] Specify a space-separated list of kernel
100 modules to add to the initramfs.
101 --force-drivers [LIST]
102 Specify a space-separated list of kernel
103 modules to add to the initramfs and make sure they
104 are tried to be loaded via modprobe same as passing
105 rd.driver.pre=DRIVER kernel parameter.
106 --omit-drivers [LIST] Specify a space-separated list of kernel
107 modules not to add to the initramfs.
108 -d, --drivers [LIST] Specify a space-separated list of kernel modules to
109 exclusively include in the initramfs.
110 --filesystems [LIST] Specify a space-separated list of kernel filesystem
111 modules to exclusively include in the generic
113 -k, --kmoddir [DIR] Specify the directory where to look for kernel
115 --fwdir [DIR] Specify additional colon-separated list of directories
116 where to look for firmware files.
117 --libdirs [LIST] Specify a space-separated list of directories
118 where to look for libraries.
119 --kernel-only Only install kernel drivers and firmware files.
120 --no-kernel Do not install kernel drivers and firmware files.
121 --print-cmdline Print the kernel command line for the given disk layout.
122 --early-microcode Combine early microcode with ramdisk.
123 --no-early-microcode Do not combine early microcode with ramdisk.
124 --kernel-cmdline [PARAMETERS]
125 Specify default kernel command line parameters.
126 --strip Strip binaries in the initramfs.
127 --aggressive-strip Strip more than just debug symbol and sections,
128 for a smaller initramfs build. The --strip option must
130 --nostrip Do not strip binaries in the initramfs.
131 --hardlink Hardlink files in the initramfs.
132 --nohardlink Do not hardlink files in the initramfs.
133 --prefix [DIR] Prefix initramfs files with [DIR].
134 --noprefix Do not prefix initramfs files.
135 --mdadmconf Include local /etc/mdadm.conf file.
136 --nomdadmconf Do not include local /etc/mdadm.conf file.
137 --lvmconf Include local /etc/lvm/lvm.conf file.
138 --nolvmconf Do not include local /etc/lvm/lvm.conf file.
139 --fscks [LIST] Add a space-separated list of fsck helpers.
140 --nofscks Inhibit installation of any fsck helpers.
141 --ro-mnt Mount / and /usr read-only by default.
142 -h, --help This message.
143 --debug Output debug information of the build process.
144 --profile Output profile information of the build process.
145 -L, --stdlog [0-6] Specify logging level (to standard error)
146 0 - suppress any messages
147 1 - only fatal errors
151 5 - debug info (here starts lots of output)
152 6 - trace info (and even more)
153 -v, --verbose Increase verbosity level.
154 -q, --quiet Decrease verbosity level.
155 -c, --conf [FILE] Specify configuration file to use.
156 Default: /etc/dracut.conf
157 --confdir [DIR] Specify configuration directory to use *.conf files
158 from. Default: /etc/dracut.conf.d
159 --tmpdir [DIR] Temporary directory to be used instead of default
161 -r, --sysroot [DIR] Specify sysroot directory to collect files from.
162 -l, --local Local mode. Use modules from the current working
163 directory instead of the system-wide installed in
164 /usr/lib/dracut/modules.d.
165 Useful when running dracut from a git checkout.
166 -H, --hostonly Host-only mode: Install only what is needed for
167 booting the local host instead of a generic host.
168 -N, --no-hostonly Disables host-only mode.
169 --hostonly-mode [MODE]
170 Specify the host-only mode to use. [MODE] could be
171 one of "sloppy" or "strict". "sloppy" mode is used
173 In "sloppy" host-only mode, extra drivers and modules
174 will be installed, so minor hardware change won't make
175 the image unbootable (e.g. changed keyboard), and the
176 image is still portable among similar hosts.
177 With "strict" mode enabled, anything not necessary
178 for booting the local host in its current state will
179 not be included, and modules may do some extra job
180 to save more space. Minor change of hardware or
181 environment could make the image unbootable.
182 DO NOT use "strict" mode unless you know what you
184 --hostonly-cmdline Store kernel command line arguments needed
186 --no-hostonly-cmdline Do not store kernel command line arguments needed
188 --no-hostonly-default-device
189 Do not generate implicit host devices like root,
190 swap, fstab, etc. Use "--mount" or "--add-device"
191 to explicitly add devices as needed.
192 --hostonly-i18n Install only needed keyboard and font files according
193 to the host configuration (default).
194 --no-hostonly-i18n Install all keyboard and font files available.
195 --hostonly-nics [LIST]
196 Only enable listed NICs in the initramfs. The list can
197 be empty, so other modules can install only the
198 necessary network drivers.
199 --persistent-policy [POLICY]
200 Use [POLICY] to address disks and partitions.
201 POLICY can be any directory name found in /dev/disk
202 (e.g. "by-uuid", "by-label"), or "mapper" to use
203 /dev/mapper device names (default).
204 --fstab Use /etc/fstab to determine the root device.
205 --add-fstab [FILE] Add file to the initramfs fstab.
206 --mount "[DEV] [MP] [FSTYPE] [FSOPTS]"
207 Mount device [DEV] on mountpoint [MP] with filesystem
208 [FSTYPE] and options [FSOPTS] in the initramfs.
209 --mount "[MP]" Same as above, but [DEV], [FSTYPE] and [FSOPTS] are
210 determined by looking at the current mounts.
211 --add-device "[DEV]" Bring up [DEV] in initramfs.
212 -i, --include [SOURCE] [TARGET]
213 Include the files in the SOURCE directory into the
214 Target directory in the final initramfs.
215 If SOURCE is a file, it will be installed to TARGET
216 in the final initramfs.
217 -I, --install [LIST] Install the space separated list of files into the
219 --install-optional [LIST]
220 Install the space separated list of files into the
221 initramfs, if they exist.
222 --gzip Compress the generated initramfs using gzip.
223 This will be done by default, unless another
224 compression option or --no-compress is passed.
225 --bzip2 Compress the generated initramfs using bzip2.
226 Make sure your kernel has bzip2 decompression support
227 compiled in, otherwise you will not be able to boot.
228 --lzma Compress the generated initramfs using lzma.
229 Make sure your kernel has lzma support compiled in,
230 otherwise you will not be able to boot.
231 --xz Compress the generated initramfs using xz.
232 Make sure that your kernel has xz support compiled
233 in, otherwise you will not be able to boot.
234 --lzo Compress the generated initramfs using lzop.
235 Make sure that your kernel has lzo support compiled
236 in, otherwise you will not be able to boot.
237 --lz4 Compress the generated initramfs using lz4.
238 Make sure that your kernel has lz4 support compiled
239 in, otherwise you will not be able to boot.
240 --zstd Compress the generated initramfs using Zstandard.
241 Make sure that your kernel has zstd support compiled
242 in, otherwise you will not be able to boot.
243 --compress [COMPRESSION]
244 Compress the generated initramfs with the
245 passed compression program. Make sure your kernel
246 knows how to decompress the generated initramfs,
247 otherwise you will not be able to boot.
248 --no-compress Do not compress the generated initramfs. This will
249 override any other compression options.
250 --squash-compressor [COMPRESSION]
251 Specify the compressor and compressor specific options
252 used by mksquashfs if squash module is called when
253 building the initramfs.
254 --enhanced-cpio Attempt to reflink cpio file data using dracut-cpio.
255 --list-modules List all available dracut modules.
256 -M, --show-modules Print included module's name to standard output during
258 --keep Keep the temporary initramfs for debugging purposes.
259 --printsize Print out the module install size.
260 --sshkey [SSHKEY] Add SSH key to initramfs (use with ssh-client module).
261 --logfile [FILE] Logfile to use (overrides configuration setting).
262 --reproducible Create reproducible images.
263 --no-reproducible Do not create reproducible images.
264 --loginstall [DIR] Log all files installed from the host to [DIR].
265 --uefi Create an UEFI executable with the kernel cmdline and
267 --no-uefi Disables UEFI mode.
268 --no-machineid Affects the default output filename of the UEFI
269 executable, discarding the <MACHINE_ID> part.
270 --uefi-stub [FILE] Use the UEFI stub [FILE] to create an UEFI executable.
271 --uefi-splash-image [FILE]
272 Use [FILE] as a splash image when creating an UEFI
273 executable. Requires bitmap (.bmp) image format.
274 --kernel-image [FILE] Location of the kernel image.
275 --sbat [PARAMETERS] The SBAT parameters to be added to .sbat.
276 The string "sbat,1,SBAT Version,sbat,1,
277 https://github.com/rhboot/shim/blob/main/SBAT.md" is
278 already added by default.
279 --regenerate-all Regenerate all initramfs images at the default location
280 for the kernel versions found on the system.
281 -p, --parallel Use parallel processing if possible (currently only
282 supported --regenerate-all)
283 images simultaneously.
284 --version Display version.
286 If [LIST] has multiple arguments, then you have to put these in quotes.
290 # dracut --add-drivers "module1 module2" ...
296 [[ $dracutbasedir ]] || dracutbasedir
="$dracutsysrootdir"/usr
/lib
/dracut
297 if [[ -f $dracutbasedir/dracut-version.sh
]]; then
298 # shellcheck source=./dracut-version.sh
299 .
"$dracutbasedir"/dracut-version.sh
301 echo "dracut $DRACUT_VERSION"
304 # Fills up host_devs stack variable and makes sure there are no duplicates
308 [[ " ${host_devs[*]} " == *" $_dev "* ]] && return
313 # Little helper function for reading args from the commandline.
314 # it automatically handles -a b and -a=b variants, and returns 1 if
315 # we need to shift $3.
320 local rematch
='^[^=]*=(.*)$'
321 if [[ $2 =~
$rematch ]]; then
322 read -r "$1" <<< "${BASH_REMATCH[1]}"
324 read -r "$1" <<< "$3"
325 # There is no way to shift our callers args, so
326 # return 1 to indicate they should do it instead.
332 if grep -H -e '^[^#]*[+]=\("[^ ]\|.*[^ ]"\)' "$@"; then
333 printf '\ndracut[W]: <key>+=" <values> ": <values> should have surrounding white spaces!\n' >&2
334 printf 'dracut[W]: This will lead to unwanted side effects! Please fix the configuration file.\n\n' >&2
345 for i
in "$d/"*"$suffix"; do
347 printf "%s\n" "${i##*/}"
353 for f
in "${files[@]}"; do
355 if [[ -e "$d/$f" ]]; then
356 printf "%s\n" "$d/$f"
365 # Workaround -i, --include taking 2 arguments
368 if [[ $i == "-i" ]] ||
[[ $i == "--include" ]]; then
369 newat
+=("++include") # Replace --include by ++include
374 set -- "${newat[@]}" # Set new $@
377 unset POSIXLY_CORRECT
379 -o "a:m:o:d:I:k:c:r:L:fvqlHhMNp" \
383 --long add-drivers
: \
384 --long force-drivers
: \
385 --long omit-drivers
: \
389 --long filesystems
: \
391 --long install-optional
: \
408 --long squash-compressor
: \
414 --long print-cmdline \
415 --long kernel-cmdline
: \
417 --long aggressive-strip \
436 --long no-host-only \
437 --long hostonly-mode
: \
438 --long hostonly-cmdline \
439 --long no-hostonly-cmdline \
440 --long no-hostonly-default-device \
441 --long persistent-policy
: \
452 --long enhanced-cpio \
453 --long list-modules \
454 --long show-modules \
457 --long regenerate-all \
459 --long noimageifnotneeded \
460 --long early-microcode \
461 --long no-early-microcode \
462 --long reproducible \
463 --long no-reproducible \
468 --long uefi-splash-image
: \
469 --long kernel-image
: \
471 --long no-hostonly-i18n \
472 --long hostonly-i18n \
473 --long hostonly-nics
: \
474 --long no-machineid \
479 # shellcheck disable=SC2181
490 rearrange_params
"$@"
493 # parse command line args to check if '--rebuild' option is present
497 if [ "$1" == "--" ]; then
501 if [ "$1" == "--rebuild" ]; then
504 if [ ! -e "$rebuild_file" ]; then
505 echo "Image file '$rebuild_file', for rebuild, does not exist!"
508 abs_rebuild_file
=$
(readlink
-f "$rebuild_file") && rebuild_file
="$abs_rebuild_file"
515 # get output file name and kernel version from command line arguments
522 if ! [[ ${outfile+x} ]]; then
524 elif ! [[ ${kernel+x} ]]; then
527 printf "\nUnknown arguments: %s\n\n" "$*" >&2
536 # extract input image file provided with rebuild option to get previous parameters, if any
537 if [[ $append_args_l == "yes" ]]; then
540 # determine resultant file
541 if ! [[ $outfile ]]; then
542 outfile
=$rebuild_file
545 if ! rebuild_param
=$
(lsinitrd
"$rebuild_file" '*lib/dracut/build-parameter.txt'); then
546 echo "Image '$rebuild_file' has no rebuild information stored"
550 # prepend previous parameters to current command line args
551 if [[ $rebuild_param ]]; then
552 TEMP
="$rebuild_param $TEMP"
554 rearrange_params
"$@"
564 if [[ $1 != "--" ]] && [[ $1 != "--rebuild" ]]; then
565 PARMS_TO_STORE
+=" $1"
570 PARMS_TO_STORE
+=" '$2'"
574 add_dracutmodules_l
+=("$2")
575 PARMS_TO_STORE
+=" '$2'"
579 force_add_dracutmodules_l
+=("$2")
580 PARMS_TO_STORE
+=" '$2'"
584 add_drivers_l
+=("$2")
585 PARMS_TO_STORE
+=" '$2'"
589 force_drivers_l
+=("$2")
590 PARMS_TO_STORE
+=" '$2'"
594 omit_drivers_l
+=("$2")
595 PARMS_TO_STORE
+=" '$2'"
599 dracutmodules_l
+=("$2")
600 PARMS_TO_STORE
+=" '$2'"
604 omit_dracutmodules_l
+=("$2")
605 PARMS_TO_STORE
+=" '$2'"
610 PARMS_TO_STORE
+=" '$2'"
614 filesystems_l
+=("$2")
615 PARMS_TO_STORE
+=" '$2'"
619 install_items_l
+=("$2")
620 PARMS_TO_STORE
+=" '$2'"
624 install_optional_items_l
+=("$2")
625 PARMS_TO_STORE
+=" '$2'"
630 PARMS_TO_STORE
+=" '$2'"
635 PARMS_TO_STORE
+=" '$2'"
640 PARMS_TO_STORE
+=" '$2'"
645 PARMS_TO_STORE
+=" '$2'"
650 PARMS_TO_STORE
+=" '$2'"
653 --add-device |
--device)
655 PARMS_TO_STORE
+=" '$2'"
659 kernel_cmdline_l
+=("$2")
660 PARMS_TO_STORE
+=" '$2'"
663 --nofscks) nofscks_l
="yes" ;;
664 --ro-mnt) ro_mnt_l
="yes" ;;
667 PARMS_TO_STORE
+=" '$2'"
672 PARMS_TO_STORE
+=" '$2'"
677 PARMS_TO_STORE
+=" '$2'"
682 PARMS_TO_STORE
+=" '$2'"
687 PARMS_TO_STORE
+=" '$2'"
692 PARMS_TO_STORE
+=" '$2'"
697 PARMS_TO_STORE
+=" '$2'"
701 squash_compress_l
="$2"
702 PARMS_TO_STORE
+=" '$2'"
707 PARMS_TO_STORE
+=" '$2'"
712 PARMS_TO_STORE
+=" '$2'"
716 if [[ $rebuild_file == "$outfile" ]]; then
721 -f |
--force) force
=yes ;;
737 early_microcode_l
="yes"
739 --no-early-microcode)
740 early_microcode_l
="no"
742 --strip) do_strip_l
="yes" ;;
743 --aggressive-strip) aggressive_strip_l
="yes" ;;
744 --nostrip) do_strip_l
="no" ;;
745 --hardlink) do_hardlink_l
="yes" ;;
746 --nohardlink) do_hardlink_l
="no" ;;
747 --noprefix) prefix_l
="/" ;;
748 --mdadmconf) mdadmconf_l
="yes" ;;
749 --nomdadmconf) mdadmconf_l
="no" ;;
750 --lvmconf) lvmconf_l
="yes" ;;
751 --nolvmconf) lvmconf_l
="no" ;;
752 --debug) debug
="yes" ;;
753 --profile) profile
="yes" ;;
756 PARMS_TO_STORE
+=" '$2'"
763 -v |
--verbose) ((verbosity_mod_l
++)) ;;
764 -q |
--quiet) ((verbosity_mod_l--
)) ;;
767 [[ -f "$(readlink -f "${0%/*}")/dracut-init.sh" ]] \
768 && dracutbasedir
="$(readlink -f "${0%/*}")"
770 -H |
--hostonly |
--host-only)
773 -N |
--no-hostonly |
--no-host-only)
778 PARMS_TO_STORE
+=" '$2'"
782 hostonly_cmdline_l
="yes"
785 i18n_install_all_l
="no"
788 hostonly_nics_l
+=("$2")
789 PARMS_TO_STORE
+=" '$2'"
793 i18n_install_all_l
="yes"
795 --no-hostonly-cmdline)
796 hostonly_cmdline_l
="no"
798 --no-hostonly-default-device)
799 hostonly_default_device
="no"
802 persistent_policy_l
="$2"
803 PARMS_TO_STORE
+=" '$2'"
806 --fstab) use_fstab_l
="yes" ;;
811 --bzip2) compress_l
="bzip2" ;;
812 --lzma) compress_l
="lzma" ;;
813 --xz) compress_l
="xz" ;;
814 --lzo) compress_l
="lzop" ;;
815 --lz4) compress_l
="lz4" ;;
816 --zstd) compress_l
="zstd" ;;
817 --no-compress) _no_compress_l
="cat" ;;
818 --gzip) compress_l
="gzip" ;;
819 --enhanced-cpio) enhanced_cpio_l
="yes" ;;
820 --list-modules) do_list
="yes" ;;
824 --keep) keep
="yes" ;;
825 --printsize) printsize
="yes" ;;
826 --regenerate-all) regenerate_all_l
="yes" ;;
827 -p |
--parallel) parallel_l
="yes" ;;
828 --noimageifnotneeded) noimageifnotneeded
="yes" ;;
829 --reproducible) reproducible_l
="yes" ;;
830 --no-reproducible) reproducible_l
="no" ;;
831 --uefi) uefi_l
="yes" ;;
832 --no-uefi) uefi_l
="no" ;;
835 PARMS_TO_STORE
+=" '$2'"
839 uefi_splash_image_l
="$2"
840 PARMS_TO_STORE
+=" '$2'"
845 PARMS_TO_STORE
+=" '$2'"
850 PARMS_TO_STORE
+=" '$2'"
865 *) # should not even reach this point
866 printf "\n!Unknown option: '%s'\n\n" "$1" >&2
874 # getopt cannot handle multiple arguments, so just handle "-I,--include"
875 # the old fashioned way
878 if [ "${1%%=*}" == "++include" ]; then
880 include_target
+=("$3")
881 PARMS_TO_STORE
+=" --include '$2' '$3'"
887 [[ $sysroot_l ]] && dracutsysrootdir
="$sysroot_l"
893 unset LD_LIBRARY_PATH
897 export DRACUT_LOG_LEVEL
=warning
899 export DRACUT_LOG_LEVEL
=debug
900 export PS4
='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]-}): '
905 export PS4
='+ $(date "+%s.%N") ${BASH_SOURCE}@${LINENO}: '
910 [[ $dracutbasedir ]] || dracutbasedir
="$dracutsysrootdir"/usr
/lib
/dracut
912 # if we were not passed a config file, try the default one
913 if [[ -z $conffile ]]; then
914 if [[ $allowlocal ]]; then
915 conffile
="$dracutbasedir/dracut.conf"
917 conffile
="$dracutsysrootdir/etc/dracut.conf"
919 elif [[ ! -e $conffile ]]; then
920 printf "%s\n" "dracut[F]: Configuration file '$conffile' not found." >&2
924 if [[ -z $confdir ]]; then
925 if [[ $allowlocal ]]; then
926 confdir
="$dracutbasedir/dracut.conf.d"
928 confdir
="$dracutsysrootdir/etc/dracut.conf.d"
930 elif [[ ! -d $confdir ]]; then
931 printf "%s\n" "dracut[F]: Configuration directory '$confdir' not found." >&2
935 # source our config file
936 if [[ -f $conffile ]]; then
937 check_conf_file
"$conffile"
938 # shellcheck disable=SC1090
942 # source our config dir
943 for f
in $
(dropindirs_sort
".conf" "$confdir" "$dracutbasedir/dracut.conf.d"); do
945 # shellcheck disable=SC1090
946 [[ -e $f ]] && .
"$f"
949 # regenerate_all shouldn't be set in conf files
950 regenerate_all
=$regenerate_all_l
951 if [[ $parallel_l == "yes" ]]; then
955 if [[ $regenerate_all == "yes" ]]; then
957 if [[ $kernel ]]; then
958 printf "%s\n" "dracut[F]: --regenerate-all cannot be called with a kernel version." >&2
962 if [[ $outfile ]]; then
963 printf "%s\n" "dracut[F]: --regenerate-all cannot be called with an image file." >&2
967 ((len
= ${#dracut_args[@]}))
968 for ((i
= 0; i
< len
; i
++)); do
969 case ${dracut_args[$i]} in
970 --regenerate-all |
--parallel)
971 # shellcheck disable=SC2184
972 unset dracut_args
["$i"]
977 cd "$dracutsysrootdir"/lib
/modules ||
exit 1
978 if [[ $parallel != "yes" ]]; then
980 [[ -f $i/modules.dep
]] ||
[[ -f $i/modules.dep.bin
]] ||
continue
981 "$dracut_cmd" --kver="$i" "${dracut_args[@]}"
986 [[ -f $i/modules.dep
]] ||
[[ -f $i/modules.dep.bin
]] ||
continue
987 "$dracut_cmd" --kver="$i" "${dracut_args[@]}" &
992 if [[ $wst == 127 ]]; then
1002 if ! [[ $kernel ]]; then
1006 DRACUT_PATH
=${DRACUT_PATH:-/sbin /bin /usr/sbin /usr/bin}
1008 for i
in $DRACUT_PATH; do
1010 if [ -L "$dracutsysrootdir$i" ]; then
1011 rl
=$
(readlink
-f "$dracutsysrootdir$i")
1013 rl
="${rl#"$dracutsysrootdir"}"
1014 if [[ $NPATH != *:$rl* ]]; then
1018 [[ -z $dracutsysrootdir ]] && export PATH
="${NPATH#:}"
1021 export SYSTEMCTL
=${SYSTEMCTL:-systemctl}
1023 # these options add to the stuff in the config file
1024 ((${#add_dracutmodules_l[@]})) && add_dracutmodules
+=" ${add_dracutmodules_l[*]} "
1025 ((${#omit_dracutmodules_l[@]})) && omit_dracutmodules
+=" ${omit_dracutmodules_l[*]} "
1026 ((${#force_add_dracutmodules_l[@]})) && force_add_dracutmodules
+=" ${force_add_dracutmodules_l[*]} "
1027 ((${#fscks_l[@]})) && fscks
+=" ${fscks_l[*]} "
1028 ((${#add_fstab_l[@]})) && add_fstab
+=" ${add_fstab_l[*]} "
1029 ((${#install_items_l[@]})) && install_items
+=" ${install_items_l[*]} "
1030 ((${#install_optional_items_l[@]})) && install_optional_items
+=" ${install_optional_items_l[*]} "
1031 ((${#hostonly_nics_l[@]})) && hostonly_nics
+=" ${hostonly_nics_l[*]} "
1033 # these options override the stuff in the config file
1034 ((${#dracutmodules_l[@]})) && dracutmodules
="${dracutmodules_l[*]}"
1035 ((${#filesystems_l[@]})) && filesystems
="${filesystems_l[*]}"
1036 ((${#fw_dir_l[@]})) && fw_dir
="${fw_dir_l[*]}"
1037 ((${#libdirs_l[@]})) && libdirs
="${libdirs_l[*]}"
1039 [[ $stdloglvl_l ]] && stdloglvl
=$stdloglvl_l
1040 [[ ! $stdloglvl ]] && stdloglvl
=4
1041 stdloglvl
=$
((stdloglvl
+ verbosity_mod_l
))
1042 ((stdloglvl
> 6)) && stdloglvl
=6
1043 ((stdloglvl
< 0)) && stdloglvl
=0
1045 [[ $drivers_dir_l ]] && drivers_dir
=$drivers_dir_l
1046 drivers_dir
="${drivers_dir%"${drivers_dir##*[!/]}"}"
1047 [[ $do_strip_l ]] && do_strip
=$do_strip_l
1048 [[ $do_strip ]] || do_strip
=yes
1049 [[ $aggressive_strip_l ]] && aggressive_strip
=$aggressive_strip_l
1050 [[ $do_hardlink_l ]] && do_hardlink
=$do_hardlink_l
1051 [[ $do_hardlink ]] || do_hardlink
=yes
1052 [[ $prefix_l ]] && prefix
=$prefix_l
1053 [[ $prefix == "/" ]] && unset prefix
1054 [[ $hostonly_l ]] && hostonly
=$hostonly_l
1055 [[ $hostonly_cmdline_l ]] && hostonly_cmdline
=$hostonly_cmdline_l
1056 [[ $hostonly_mode_l ]] && hostonly_mode
=$hostonly_mode_l
1057 [[ $hostonly == "yes" ]] && ! [[ $hostonly_cmdline ]] && hostonly_cmdline
="yes"
1058 # shellcheck disable=SC2034
1059 [[ $i18n_install_all_l ]] && i18n_install_all
=$i18n_install_all_l
1060 # shellcheck disable=SC2034
1061 [[ $persistent_policy_l ]] && persistent_policy
=$persistent_policy_l
1062 [[ $use_fstab_l ]] && use_fstab
=$use_fstab_l
1063 [[ $mdadmconf_l ]] && mdadmconf
=$mdadmconf_l
1064 [[ $lvmconf_l ]] && lvmconf
=$lvmconf_l
1065 [[ $dracutbasedir ]] || dracutbasedir
="$dracutsysrootdir"/usr
/lib
/dracut
1067 fw_path_para
=$
(< /sys
/module
/firmware_class
/parameters
/path
)
1068 fw_dir
="${fw_path_para:+$dracutsysrootdir$fw_path_para:}$dracutsysrootdir/lib/firmware/updates/$kernel:$dracutsysrootdir/lib/firmware/updates:$dracutsysrootdir/lib/firmware/$kernel:$dracutsysrootdir/lib/firmware"
1070 [[ $tmpdir_l ]] && tmpdir
="$tmpdir_l"
1071 [[ $tmpdir ]] || tmpdir
="$TMPDIR"
1072 [[ $tmpdir ]] || tmpdir
="$dracutsysrootdir"/var
/tmp
1073 [[ $INITRD_COMPRESS ]] && compress=$INITRD_COMPRESS
1074 [[ $compress_l ]] && compress=$compress_l
1075 [[ $squash_compress_l ]] && squash_compress
=$squash_compress_l
1076 [[ $enhanced_cpio_l ]] && enhanced_cpio
=$enhanced_cpio_l
1077 [[ $show_modules_l ]] && show_modules
=$show_modules_l
1078 [[ $nofscks_l ]] && nofscks
="yes"
1079 [[ $ro_mnt_l ]] && ro_mnt
="yes"
1080 [[ $early_microcode_l ]] && early_microcode
=$early_microcode_l
1081 [[ $early_microcode ]] || early_microcode
=yes
1082 [[ $early_microcode_image_dir ]] || early_microcode_image_dir
=('/boot')
1083 [[ $early_microcode_image_name ]] \
1084 || early_microcode_image_name
=('intel-uc.img' 'intel-ucode.img' 'amd-uc.img' 'amd-ucode.img' 'early_ucode.cpio' 'microcode.cpio')
1085 [[ $logfile_l ]] && logfile
="$logfile_l"
1086 [[ $reproducible_l ]] && reproducible
="$reproducible_l"
1087 [[ $loginstall_l ]] && loginstall
="$loginstall_l"
1088 [[ $uefi_l ]] && uefi
=$uefi_l
1089 [[ $uefi_stub_l ]] && uefi_stub
="$uefi_stub_l"
1090 [[ $uefi_splash_image_l ]] && uefi_splash_image
="$uefi_splash_image_l"
1091 [[ $kernel_image_l ]] && kernel_image
="$kernel_image_l"
1092 [[ $sbat_l ]] && sbat
="$sbat_l"
1093 [[ $machine_id_l ]] && machine_id
="$machine_id_l"
1095 if ! [[ $outfile ]]; then
1096 if [[ $machine_id != "no" ]]; then
1097 if [[ -d "$dracutsysrootdir"/efi
/Default
]] \
1098 ||
[[ -d "$dracutsysrootdir"/boot
/Default
]] \
1099 ||
[[ -d "$dracutsysrootdir"/boot
/efi
/Default
]]; then
1100 MACHINE_ID
="Default"
1101 elif [[ -s "$dracutsysrootdir"/etc
/machine-id
]]; then
1102 read -r MACHINE_ID
< "$dracutsysrootdir"/etc
/machine-id
1103 [[ $MACHINE_ID == "uninitialized" ]] && MACHINE_ID
="Default"
1105 MACHINE_ID
="Default"
1109 if [[ $uefi == "yes" ]]; then
1110 if [[ -n $uefi_secureboot_key && -z $uefi_secureboot_cert ]] ||
[[ -z $uefi_secureboot_key && -n $uefi_secureboot_cert ]]; then
1111 printf "%s\n" "dracut[F]: Need 'uefi_secureboot_key' and 'uefi_secureboot_cert' both to be set." >&2
1115 if [[ -n $uefi_secureboot_key && -n $uefi_secureboot_cert ]] && ! command -v sbsign
&> /dev
/null
; then
1116 printf "%s\n" "dracut[F]: Need 'sbsign' to create a signed UEFI executable." >&2
1120 BUILD_ID
=$
(cat "$dracutsysrootdir"/etc
/os-release
"$dracutsysrootdir"/usr
/lib
/os-release \
1121 |
while read -r line ||
[[ $line ]]; do
1122 [[ $line =~ BUILD_ID\
=* ]] && eval "$line" && echo "$BUILD_ID" && break
1124 if [[ -z $dracutsysrootdir ]]; then
1125 if [[ -d /efi
]] && mountpoint
-q /efi
; then
1129 if [[ -d /boot
/efi
/EFI
]]; then
1130 efidir
=/boot
/efi
/EFI
1135 if [[ -d $dracutsysrootdir/boot
/efi
/EFI
]]; then
1136 efidir
=/boot
/efi
/EFI
1139 mkdir
-p "$dracutsysrootdir$efidir/Linux"
1140 outfile
="$dracutsysrootdir$efidir/Linux/linux-$kernel${MACHINE_ID:+-${MACHINE_ID}}${BUILD_ID:+-${BUILD_ID}}.efi"
1142 if [[ -d "$dracutsysrootdir"/efi
/loader
/entries ||
-L "$dracutsysrootdir"/efi
/loader
/entries
]] \
1143 && [[ $MACHINE_ID ]] \
1144 && [[ -d "$dracutsysrootdir"/efi
/${MACHINE_ID} ||
-L "$dracutsysrootdir"/efi
/${MACHINE_ID} ]]; then
1145 outfile
="$dracutsysrootdir/efi/${MACHINE_ID}/${kernel}/initrd"
1146 elif [[ -d "$dracutsysrootdir"/boot
/loader
/entries ||
-L "$dracutsysrootdir"/boot
/loader
/entries
]] \
1147 && [[ $MACHINE_ID ]] \
1148 && [[ -d "$dracutsysrootdir"/boot
/${MACHINE_ID} ||
-L "$dracutsysrootdir"/boot
/${MACHINE_ID} ]]; then
1149 outfile
="$dracutsysrootdir/boot/${MACHINE_ID}/${kernel}/initrd"
1150 elif [[ -d "$dracutsysrootdir"/boot
/efi
/loader
/entries ||
-L "$dracutsysrootdir"/boot
/efi
/loader
/entries
]] \
1151 && [[ $MACHINE_ID ]] \
1152 && [[ -d "$dracutsysrootdir"/boot
/efi
/${MACHINE_ID} ||
-L "$dracutsysrootdir"/boot
/efi
/${MACHINE_ID} ]]; then
1153 outfile
="$dracutsysrootdir/boot/efi/${MACHINE_ID}/${kernel}/initrd"
1154 elif [[ -f "$dracutsysrootdir"/lib
/modules
/${kernel}/initrd
]]; then
1155 outfile
="$dracutsysrootdir/lib/modules/${kernel}/initrd"
1156 elif [[ -e $dracutsysrootdir/boot
/vmlinuz-
${kernel} ]]; then
1157 outfile
="$dracutsysrootdir/boot/initramfs-${kernel}.img"
1158 elif [[ -z $dracutsysrootdir ]] \
1159 && [[ $MACHINE_ID ]] \
1160 && mountpoint
-q /efi
; then
1161 outfile
="/efi/${MACHINE_ID}/${kernel}/initrd"
1162 elif [[ -z $dracutsysrootdir ]] \
1163 && [[ $MACHINE_ID ]] \
1164 && mountpoint
-q /boot
/efi
; then
1165 outfile
="/boot/efi/${MACHINE_ID}/${kernel}/initrd"
1167 outfile
="$dracutsysrootdir/boot/initramfs-${kernel}.img"
1172 # eliminate IFS hackery when messing with fw_dir
1173 export DRACUT_FIRMWARE_PATH
=${fw_dir// /:}
1174 fw_dir
=${fw_dir//:/ }
1176 # check for logfile and try to create one if it doesn't exist
1177 if [[ -n $logfile ]]; then
1178 if [[ ! -f $logfile ]]; then
1179 if touch "$logfile"; then
1180 printf "%s\n" "dracut[W]: touch $logfile failed." >&2
1185 # handle compression options.
1186 DRACUT_COMPRESS_BZIP2
=${DRACUT_COMPRESS_BZIP2:-bzip2}
1187 DRACUT_COMPRESS_LBZIP2
=${DRACUT_COMPRESS_LBZIP2:-lbzip2}
1188 DRACUT_COMPRESS_LZMA
=${DRACUT_COMPRESS_LZMA:-lzma}
1189 DRACUT_COMPRESS_XZ
=${DRACUT_COMPRESS_XZ:-xz}
1190 DRACUT_COMPRESS_GZIP
=${DRACUT_COMPRESS_GZIP:-gzip}
1191 DRACUT_COMPRESS_PIGZ
=${DRACUT_COMPRESS_PIGZ:-pigz}
1192 DRACUT_COMPRESS_LZOP
=${DRACUT_COMPRESS_LZOP:-lzop}
1193 DRACUT_COMPRESS_ZSTD
=${DRACUT_COMPRESS_ZSTD:-zstd}
1194 DRACUT_COMPRESS_LZ4
=${DRACUT_COMPRESS_LZ4:-lz4}
1195 DRACUT_COMPRESS_CAT
=${DRACUT_COMPRESS_CAT:-cat}
1197 if [[ $_no_compress_l == "$DRACUT_COMPRESS_CAT" ]]; then
1198 compress="$DRACUT_COMPRESS_CAT"
1201 [[ $hostonly == yes ]] && hostonly
="-h"
1202 [[ $hostonly != "-h" ]] && unset hostonly
1204 case $hostonly_mode in
1206 [[ $hostonly ]] && hostonly_mode
="sloppy"
1209 if [[ ! $hostonly ]]; then
1214 printf "%s\n" "dracut[F]: Invalid hostonly mode '$hostonly_mode'." >&2
1219 [[ $reproducible == yes ]] && DRACUT_REPRODUCIBLE
=1
1221 if [[ -z $DRACUT_KMODDIR_OVERRIDE && -n $drivers_dir ]]; then
1222 drivers_basename
="${drivers_dir##*/}"
1223 if [[ -n $drivers_basename && $drivers_basename != "$kernel" ]]; then
1224 printf "%s\n" "dracut[F]: The provided directory where to look for kernel modules ($drivers_basename)" >&2
1225 printf "%s\n" "dracut[F]: does not match the kernel version set for the initramfs ($kernel)." >&2
1226 printf "%s\n" "dracut[F]: Set DRACUT_KMODDIR_OVERRIDE=1 to ignore this check." >&2
1229 drivers_dirname
="${drivers_dir%/*}/"
1230 if [[ ! $drivers_dirname =~ .
*/lib
/modules
/$
]]; then
1231 printf "%s\n" "dracut[F]: drivers_dir path ${drivers_dir_l:+"set via -k/--kmoddir "}must contain \"/lib/modules/\" as a parent of your kernel module directory," >&2
1232 printf "%s\n" "dracut[F]: or modules may not be placed in the correct location inside the initramfs." >&2
1233 printf "%s\n" "dracut[F]: was given: ${drivers_dir}" >&2
1234 printf "%s\n" "dracut[F]: expected: ${drivers_dirname}lib/modules/${kernel}" >&2
1235 printf "%s\n" "dracut[F]: Please move your modules into the correct directory structure and pass the new location," >&2
1236 printf "%s\n" "dracut[F]: or set DRACUT_KMODDIR_OVERRIDE=1 to ignore this check." >&2
1241 # shellcheck disable=SC2155
1242 readonly TMPDIR
="$(realpath -e "$tmpdir")"
1243 [ -d "$TMPDIR" ] ||
{
1244 printf "%s\n" "dracut[F]: Invalid tmpdir '$tmpdir'." >&2
1248 if findmnt
--raw -n --target "$tmpdir" --output=options |
grep -q noexec
; then
1249 [[ $debug == yes ]] && printf "%s\n" "dracut[D]: Tmpdir '$tmpdir' is mounted with 'noexec'." >&2
1253 # shellcheck disable=SC2155
1254 readonly DRACUT_TMPDIR
="$(mktemp -p "$TMPDIR/" -d -t dracut.XXXXXX)"
1255 [ -d "$DRACUT_TMPDIR" ] ||
{
1256 printf "%s\n" "dracut[F]: mktemp -p '$TMPDIR/' -d -t dracut.XXXXXX failed." >&2
1260 # Cache file used to optimize get_maj_min()
1261 declare -x -r get_maj_min_cache_file
="${DRACUT_TMPDIR}/majmin_cache"
1262 : > "$get_maj_min_cache_file"
1264 # clean up after ourselves no matter how we die.
1267 [[ $keep ]] && echo "Not removing $DRACUT_TMPDIR." >&2 || { [[ $DRACUT_TMPDIR ]] && rm -rf -- "$DRACUT_TMPDIR"; };
1268 if [[ ${FSFROZEN} ]]; then
1269 fsfreeze -u "${FSFROZEN}"
1274 # clean up after ourselves no matter how we die.
1275 trap 'exit 1;' SIGINT
1277 readonly initdir
="${DRACUT_TMPDIR}/initramfs"
1280 if [[ $early_microcode == yes ]] ||
{ [[ $acpi_override == yes ]] && [[ -d $acpi_table_dir ]]; }; then
1281 readonly early_cpio_dir
="${DRACUT_TMPDIR}/earlycpio"
1282 mkdir
"$early_cpio_dir"
1285 [[ "$dracutsysrootdir" ]] ||
[[ "$noexec" ]] ||
export DRACUT_RESOLVE_LAZY
="1"
1287 if [[ $print_cmdline ]]; then
1294 if [[ -f $dracutbasedir/dracut-version.sh
]]; then
1295 # shellcheck source=./dracut-version.sh
1296 .
"$dracutbasedir"/dracut-version.sh
1299 if systemd-detect-virt
-c &> /dev
/null
; then
1300 export DRACUT_NO_MKNOD
=1 DRACUT_NO_XATTR
=1
1301 if [[ $hostonly ]]; then
1302 printf "%s\n" "dracut[W]: Running in hostonly mode in a container!" >&2
1306 if [[ -f $dracutbasedir/dracut-init.sh
]]; then
1307 # shellcheck source=./dracut-init.sh
1308 .
"$dracutbasedir"/dracut-init.sh
1310 printf "%s\n" "dracut[F]: Cannot find $dracutbasedir/dracut-init.sh." >&2
1311 printf "%s\n" "dracut[F]: Are you running from a git checkout?" >&2
1312 printf "%s\n" "dracut[F]: Try passing -l as an argument to $dracut_cmd" >&2
1316 if [[ $persistent_policy == "mapper" ]]; then
1317 unset persistent_policy
1318 elif [[ -n $persistent_policy && ! -d "/dev/disk/${persistent_policy}" ]]; then
1319 dwarn
"Invalid persistent policy, your system does not have a /dev/disk/${persistent_policy} directory."
1320 unset persistent_policy
1323 if [[ $enhanced_cpio == "yes" ]]; then
1324 enhanced_cpio
="$dracutbasedir/dracut-cpio"
1325 if [[ -x $enhanced_cpio ]]; then
1326 # align based on statfs optimal transfer size
1327 cpio_align
=$
(stat
--file-system -c "%s" -- "$initdir")
1329 dinfo
"--enhanced-cpio ignored due to lack of dracut-cpio"
1336 if [[ $no_kernel != yes ]] && ! [[ -d $srcmods ]]; then
1337 dfatal
"Cannot find module directory $srcmods"
1338 dfatal
"and --no-kernel was not specified"
1342 if ! [[ $print_cmdline ]]; then
1343 inst
"$DRACUT_TESTBIN"
1344 if ! $DRACUT_INSTALL ${initdir:+-D "$initdir"} ${dracutsysrootdir:+-r "$dracutsysrootdir"} -R "$DRACUT_TESTBIN" &> /dev
/null
; then
1345 unset DRACUT_RESOLVE_LAZY
1346 export DRACUT_RESOLVE_DEPS
=1
1348 rm -fr -- "${initdir:?}"/*
1351 dracutfunctions
=$dracutbasedir/dracut-functions.sh
1352 export dracutfunctions
1354 ((${#drivers_l[@]})) && drivers
="${drivers_l[*]}"
1355 drivers
=${drivers/-/_}
1357 ((${#add_drivers_l[@]})) && add_drivers
+=" ${add_drivers_l[*]} "
1358 add_drivers
=${add_drivers/-/_}
1360 ((${#force_drivers_l[@]})) && force_drivers
+=" ${force_drivers_l[*]} "
1361 force_drivers
=${force_drivers/-/_}
1363 ((${#omit_drivers_l[@]})) && omit_drivers
+=" ${omit_drivers_l[*]} "
1364 omit_drivers
=${omit_drivers/-/_}
1366 ((${#kernel_cmdline_l[@]})) && kernel_cmdline
+=" ${kernel_cmdline_l[*]} "
1368 omit_drivers_corrected
=""
1369 for d
in $omit_drivers; do
1370 [[ " $drivers $add_drivers " == *\
$d\
* ]] && continue
1371 [[ " $drivers $force_drivers " == *\
$d\
* ]] && continue
1372 omit_drivers_corrected
+="^$d$|"
1374 omit_drivers
="${omit_drivers_corrected%|}"
1375 unset omit_drivers_corrected
1377 # prepare args for logging
1378 for ((i
= 0; i
< ${#dracut_args[@]}; i
++)); do
1379 [[ ${dracut_args[$i]} == *\
* ]] \
1380 && dracut_args
[$i]="\"${dracut_args[$i]}\""
1384 dinfo
"Executing: $dracut_cmd ${dracut_args[*]}"
1386 [[ $do_list == yes ]] && {
1387 for mod
in "$dracutbasedir"/modules.d
/*; do
1388 [[ -e $mod/module-setup.sh
]] ||
continue
1389 printf "%s\n" "${mod##*/??}"
1394 # This is kinda legacy -- eventually it should go away.
1395 case $dracutmodules in
1396 "" | auto
) dracutmodules
="all" ;;
1399 abs_outfile
=$
(readlink
-f "$outfile") && outfile
="$abs_outfile"
1401 # Helper function to set global variables
1402 # set_global_var <pkg_config> <pkg_var[:exported_var]> <value[:check_file]> [<value[:check_file]>] ...
1404 local _pkgconfig
="$1"
1405 local _pkgvar
="${2%:*}"
1406 local _var
="${2#*:}"
1407 [[ -z ${!_var} || ! -d ${dracutsysrootdir}${!_var} ]] \
1408 && export "$_var"="$(pkg-config "$_pkgconfig" --variable="$_pkgvar" 2> /dev/null)"
1409 if [[ -z ${!_var} || ! -d ${dracutsysrootdir}${!_var} ]]; then
1411 if (($# == 1)); then
1415 for _val
in "$@"; do
1418 [[ -e ${dracutsysrootdir}${_check} ]] && export "$_var"="$_val"
1424 # dbus global variables
1425 set_global_var
"dbus" "dbus" "/usr/share/dbus-1"
1426 set_global_var
"dbus" "dbusconfdir" "/etc/dbus-1"
1427 set_global_var
"dbus" "dbusinterfaces" "${dbus}/interfaces"
1428 set_global_var
"dbus" "dbusinterfacesconfdir" "${dbusconfdir}/interfaces"
1429 set_global_var
"dbus" "dbusservices" "${dbus}/services"
1430 set_global_var
"dbus" "dbusservicesconfdir" "${dbusconfdir}/services"
1431 set_global_var
"dbus" "dbussession" "${dbus}/session.d"
1432 set_global_var
"dbus" "dbussessionconfdir" "${dbusconfdir}/session.d"
1433 set_global_var
"dbus" "dbussystem" "${dbus}/system.d"
1434 set_global_var
"dbus" "dbussystemconfdir" "${dbusconfdir}/system.d"
1435 set_global_var
"dbus" "dbussystemservices" "${dbus}/system-services"
1436 set_global_var
"dbus" "dbussystemservicesconfdir" "${dbusconfdir}/system-services"
1438 # udev global variables
1439 set_global_var
"udev" "udevdir" "/lib/udev:/lib/udev/ata_id" "/usr/lib/udev:/usr/lib/udev/ata_id"
1440 set_global_var
"udev" "udevconfdir" "/etc/udev"
1441 set_global_var
"udev" "udevrulesdir" "${udevdir}/rules.d"
1442 set_global_var
"udev" "udevrulesconfdir" "${udevconfdir}/rules.d"
1444 # systemd global variables
1445 set_global_var
"systemd" "prefix:systemdprefix" "/usr"
1446 set_global_var
"systemd" "systemdutildir" "/lib/systemd:/lib/systemd/systemd-udevd" "/usr/lib/systemd:/usr/lib/systemd/systemd-udevd"
1447 set_global_var
"systemd" "systemdutilconfdir" "/etc/systemd"
1448 set_global_var
"systemd" "environment" "/usr/lib/environment.d"
1449 set_global_var
"systemd" "environmentconfdir" "/etc/environment.d"
1450 set_global_var
"systemd" "modulesload" "/usr/lib/modules-load.d"
1451 set_global_var
"systemd" "modulesloadconfdir" "/etc/modules-load.d"
1452 set_global_var
"systemd" "sysctld" "/usr/lib/sysctl.d"
1453 set_global_var
"systemd" "sysctlconfdir" "/etc/sysctl.d"
1454 set_global_var
"systemd" "systemdcatalog" "${systemdutildir}/catalog"
1455 set_global_var
"systemd" "systemdnetwork" "${systemdutildir}/network"
1456 set_global_var
"systemd" "systemdnetworkconfdir" "${systemdutilconfdir}/network"
1457 set_global_var
"systemd" "systemdntpunits" "${systemdutildir}/ntp-units.d"
1458 set_global_var
"systemd" "systemdntpunitsconfdir" "${systemdutilconfdir}/ntp-units.d"
1459 set_global_var
"systemd" "systemdportable" "${systemdutildir}/portable"
1460 set_global_var
"systemd" "systemdportableconfdir" "${systemdutilconfdir}/portable"
1461 set_global_var
"systemd" "systemdsystemunitdir" "${systemdutildir}/system"
1462 set_global_var
"systemd" "systemdsystemconfdir" "${systemdutilconfdir}/system"
1463 set_global_var
"systemd" "systemduser" "${systemdutildir}/user"
1464 set_global_var
"systemd" "systemduserconfdir" "${systemdutilconfdir}/user"
1465 set_global_var
"systemd" "sysusers" "/usr/lib/sysusers.d"
1466 set_global_var
"systemd" "sysusersconfdir" "/etc/sysusers.d"
1467 set_global_var
"systemd" "tmpfilesdir" "/lib/tmpfiles.d" "/usr/lib/tmpfiles.d"
1468 set_global_var
"systemd" "tmpfilesconfdir" "/etc/tmpfiles.d"
1470 # libkmod global variables
1471 set_global_var
"libkmod" "depmodd" "/usr/lib/depmod.d"
1472 set_global_var
"libkmod" "depmodconfdir" "/etc/depmod.d"
1474 if [[ $no_kernel != yes ]] && [[ -d $srcmods ]]; then
1475 if ! [[ -f $srcmods/modules.dep
]]; then
1476 if [[ -n "$(find "$srcmods" -name '*.ko*')" ]]; then
1477 dfatal
"$srcmods/modules.dep is missing. Did you run depmod?"
1480 dwarn
"$srcmods/modules.dep is missing. Did you run depmod?"
1485 if [[ ! $print_cmdline ]]; then
1486 if [[ -f $outfile && ! $force ]]; then
1487 dfatal
"Will not override existing initramfs ($outfile) without --force"
1491 outdir
=${outfile%/*}
1492 [[ $outdir ]] || outdir
="/"
1494 if [[ ! -d $outdir ]]; then
1495 dfatal
"Can't write to $outdir: Directory $outdir does not exist or is not accessible."
1497 elif [[ ! -w $outdir ]]; then
1498 dfatal
"No permission to write to $outdir."
1500 elif [[ -f $outfile && ! -w $outfile ]]; then
1501 dfatal
"No permission to write $outfile."
1505 if [[ $loginstall ]]; then
1506 if ! mkdir
-p "$loginstall"; then
1507 dfatal
"Could not create directory to log installed files to '$loginstall'."
1510 loginstall
=$
(readlink
-f "$loginstall")
1513 if [[ $uefi == yes ]]; then
1514 if ! command -v objcopy
&> /dev
/null
; then
1515 dfatal
"Need 'objcopy' to create a UEFI executable"
1518 unset EFI_MACHINE_TYPE_NAME
1519 case "${DRACUT_ARCH:-$(uname -m)}" in
1521 EFI_MACHINE_TYPE_NAME
=x64
1524 EFI_MACHINE_TYPE_NAME
=ia32
1527 EFI_MACHINE_TYPE_NAME
=aa64
1530 dfatal
"Architecture '${DRACUT_ARCH:-$(uname -m)}' not supported to create a UEFI executable"
1535 if ! [[ -s $uefi_stub ]]; then
1536 uefi_stub
="$dracutsysrootdir${systemdprefix}/lib/systemd/boot/efi/linux${EFI_MACHINE_TYPE_NAME}.efi.stub"
1539 if ! [[ -s $uefi_stub ]]; then
1540 dfatal
"Can't find a uefi stub '$uefi_stub' to create a UEFI executable"
1544 if ! [[ $kernel_image ]]; then
1545 for kernel_image
in "$dracutsysrootdir/lib/modules/$kernel/vmlinuz" "$dracutsysrootdir/boot/vmlinuz-$kernel"; do
1546 [[ -s $kernel_image ]] ||
continue
1550 if ! [[ -s $kernel_image ]]; then
1551 dfatal
"Can't find a kernel image '$kernel_image' to create a UEFI executable"
1557 if [[ $acpi_override == yes ]] && ! (check_kernel_config CONFIG_ACPI_TABLE_UPGRADE || check_kernel_config CONFIG_ACPI_INITRD_TABLE_OVERRIDE
); then
1558 dwarn
"Disabling ACPI override, because kernel does not support it. CONFIG_ACPI_INITRD_TABLE_OVERRIDE!=y or CONFIG_ACPI_TABLE_UPGRADE!=y"
1562 if [[ $early_microcode == yes ]]; then
1563 if [[ $hostonly ]]; then
1564 if [[ $
(get_cpu_vendor
) == "AMD" ]]; then
1565 check_kernel_config CONFIG_MICROCODE_AMD ||
unset early_microcode
1566 elif [[ $
(get_cpu_vendor
) == "Intel" ]]; then
1567 check_kernel_config CONFIG_MICROCODE_INTEL ||
unset early_microcode
1569 unset early_microcode
1572 ! check_kernel_config CONFIG_MICROCODE_AMD \
1573 && ! check_kernel_config CONFIG_MICROCODE_INTEL \
1574 && unset early_microcode
1576 # Do not complain on non-x86 architectures as it makes no sense
1577 case "${DRACUT_ARCH:-$(uname -m)}" in
1579 [[ $early_microcode != yes ]] \
1580 && dwarn
"Disabling early microcode, because kernel does not support it. CONFIG_MICROCODE_[AMD|INTEL]!=y"
1586 # Need to be able to have non-root users read stuff (rpcbind etc)
1587 chmod 755 "$initdir"
1589 if [[ $hostonly ]]; then
1590 for i
in /sys
/proc
/run
/dev
; do
1591 if ! findmnt
--target "$i" &> /dev
/null
; then
1592 dwarning
"Turning off host-only mode: '$i' is not mounted!"
1598 declare -A host_fs_types
1600 for line
in "${fstab_lines[@]}"; do
1601 # shellcheck disable=SC2086
1607 dev
=$
(blkid
-l -t "UUID=${dev#UUID=}" -o device
)
1610 dev
=$
(blkid
-l -t "LABEL=${dev#LABEL=}" -o device
)
1613 dev
=$
(blkid
-l -t "PARTUUID=${dev#PARTUUID=}" -o device
)
1616 dev
=$
(blkid
-l -t "PARTLABEL=${dev#PARTLABEL=}" -o device
)
1619 [ -z "$dev" ] && dwarn
"Bad fstab entry $*" && continue
1620 if [[ $3 == btrfs
]]; then
1621 for mp
in $
(findmnt
--source "$1" -o TARGET
-n); do
1622 for i
in $
(btrfs_devs
"$mp"); do
1626 elif [[ $3 == zfs
]]; then
1627 for mp
in $
(zfs_devs
"$1"); do
1628 push_host_devs
"$mp"
1631 push_host_devs
"$dev"
1632 host_fs_types
["$dev"]="$3"
1635 for f
in $add_fstab; do
1636 [[ -e $f ]] ||
continue
1637 while read -r dev rest ||
[ -n "$dev" ]; do
1638 push_host_devs
"$dev"
1642 for dev
in $add_device; do
1643 push_host_devs
"$dev"
1646 if ((${#add_device_l[@]})); then
1647 add_device
+=" ${add_device_l[*]} "
1648 push_host_devs
"${add_device_l[@]}"
1651 if [[ $hostonly ]] && [[ $hostonly_default_device != "no" ]]; then
1652 # in hostonly mode, determine all devices, which have to be accessed
1653 # and examine them for filesystem types
1670 mp
=$
(readlink
-f "$dracutsysrootdir$mp")
1671 mountpoint
"$mp" > /dev
/null
2>&1 ||
continue
1672 _dev
=$
(find_block_device
"$mp")
1673 _bdev
=$
(readlink
-f "/dev/block/$_dev")
1674 [[ -b $_bdev ]] && _dev
=$_bdev
1675 [[ $mp == "/" ]] && root_devs
+=("$_dev")
1676 push_host_devs
"$_dev"
1677 if [[ $
(find_mp_fstype
"$mp") == btrfs
]]; then
1678 for i
in $
(btrfs_devs
"$mp"); do
1679 [[ $mp == "/" ]] && root_devs
+=("$i")
1682 elif [[ $
(find_mp_fstype
"$mp") == zfs
]]; then
1683 for i
in $
(zfs_devs
"$(findmnt -n -o SOURCE "$mp")"); do
1684 [[ $mp == "/" ]] && root_devs
+=("$i")
1691 # TODO - with sysroot, /proc/swaps is not relevant
1692 if [[ -f /proc
/swaps
]] && [[ -f $dracutsysrootdir/etc
/fstab
]]; then
1693 while read -r dev
type rest ||
[ -n "$dev" ]; do
1694 [[ -b $dev ]] ||
continue
1695 [[ $type == "partition" ]] ||
continue
1697 while read -r _d _m _t _o _ ||
[ -n "$_d" ]; do
1698 [[ $_d == \
#* ]] && continue
1699 [[ $_d ]] ||
continue
1700 [[ $_t != "swap" ]] && continue
1701 [[ $_m != "swap" ]] && [[ $_m != "none" ]] && continue
1702 [[ $_o == *noauto
* ]] && continue
1703 _d
=$
(expand_persistent_dev
"$_d")
1704 [[ $_d -ef $dev ]] ||
continue
1706 if [[ -f $dracutsysrootdir/etc
/crypttab
]]; then
1707 while read -r _mapper _ _p _o ||
[ -n "$_mapper" ]; do
1708 [[ $_mapper == \
#* ]] && continue
1709 [[ $_d -ef /dev
/mapper
/"$_mapper" ]] ||
continue
1710 [[ "$_o" ]] || _o
="$_p"
1711 # skip entries with password files
1712 [[ $_p == /* ]] && [[ -f $_p ]] && continue 2
1714 [[ $_o == *swap
* ]] && continue 2
1715 done < "$dracutsysrootdir"/etc
/crypttab
1718 _dev
="$(readlink -f "$dev")"
1719 push_host_devs
"$_dev"
1720 swap_devs
+=("$_dev")
1722 done < "$dracutsysrootdir"/etc
/fstab
1726 # collect all "x-initrd.mount" entries from /etc/fstab
1727 if [[ -f $dracutsysrootdir/etc
/fstab
]]; then
1728 while read -r _d _m _t _o _ ||
[ -n "$_d" ]; do
1729 [[ $_d == \
#* ]] && continue
1730 [[ $_d ]] ||
continue
1731 [[ $_o != *x-initrd.mount
* ]] && continue
1732 _dev
=$
(expand_persistent_dev
"$_d")
1733 _dev
="$(readlink -f "$_dev")"
1734 [[ -b $_dev ]] ||
continue
1736 push_host_devs
"$_dev"
1737 if [[ $_t == btrfs
]]; then
1738 for i
in $
(btrfs_devs
"$_m"); do
1741 elif [[ $_t == zfs
]]; then
1742 for i
in $
(zfs_devs
"$_d"); do
1746 done < "$dracutsysrootdir"/etc
/fstab
1755 if [[ -b /dev
/block
/$1 ]]; then
1756 ID_FS_TYPE
=$
(get_fs_env
"/dev/block/$1") && host_fs_types
["$(readlink -f "/dev
/block
/$1")"]="$ID_FS_TYPE"
1759 if [[ -b $1 ]]; then
1760 ID_FS_TYPE
=$
(get_fs_env
"$1") && host_fs_types
["$(readlink -f "$1")"]="$ID_FS_TYPE"
1763 if fstype
=$
(find_dev_fstype
"$1"); then
1764 host_fs_types
["$1"]="$fstype"
1770 for dev
in "${host_devs[@]}"; do
1772 check_block_and_slaves_all _get_fs_type
"$(get_maj_min "$dev")"
1775 for dev
in "${!host_fs_types[@]}"; do
1776 [[ ${host_fs_types[$dev]} == "reiserfs" ]] ||
[[ ${host_fs_types[$dev]} == "xfs" ]] ||
continue
1777 rootopts
=$
(find_dev_fsopts
"$dev")
1778 if [[ ${host_fs_types[$dev]} == "reiserfs" ]]; then
1779 journaldev
=$
(fs_get_option
"$rootopts" "jdev")
1780 elif [[ ${host_fs_types[$dev]} == "xfs" ]]; then
1781 journaldev
=$
(fs_get_option
"$rootopts" "logdev")
1783 if [[ $journaldev ]]; then
1784 dev
="$(readlink -f "$dev")"
1785 push_host_devs
"$dev"
1787 check_block_and_slaves_all _get_fs_type
"$(get_maj_min "$dev")"
1791 export initdir dracutbasedir \
1792 dracutmodules force_add_dracutmodules add_dracutmodules omit_dracutmodules \
1794 fw_dir drivers_dir debug no_kernel kernel_only \
1795 omit_drivers mdadmconf lvmconf root_devs \
1796 use_fstab fstab_lines libdirs fscks nofscks ro_mnt \
1797 stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
1798 host_fs_types host_devs swap_devs sshkey add_fstab \
1800 prefix filesystems drivers \
1801 hostonly_cmdline loginstall
1804 # check all our modules to see if they should be sourced.
1805 # This builds a list of modules that we will install next.
1806 for_each_module_dir check_module
1807 for_each_module_dir check_mount
1809 dracut_module_included
"fips" && export DRACUT_FIPS_MODE
=1
1811 do_print_cmdline
() {
1812 local -A _mods_to_print
1813 for i
in $modules_loaded $mods_to_load; do
1814 _mods_to_print
[$i]=1
1817 # source our modules.
1818 for moddir
in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1819 _d_mod
=${moddir##*/}
1820 _d_mod
=${_d_mod#[0-9][0-9]}
1821 [[ ${_mods_to_print[$_d_mod]} ]] ||
continue
1822 module_cmdline
"$_d_mod" "$moddir"
1827 if [[ $print_cmdline ]]; then
1833 # Create some directory structure first
1834 # shellcheck disable=SC2174
1835 [[ $prefix ]] && mkdir
-m 0755 -p "${initdir}${prefix}"
1837 # shellcheck disable=SC2174
1838 [[ -L $dracutsysrootdir/lib
]] || mkdir
-m 0755 -p "${initdir}${prefix}/lib"
1839 [[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib"
1841 if [[ $prefix ]]; then
1842 for d
in bin etc lib sbin tmp usr var
$libdirs; do
1844 [[ $d == */* ]] && continue
1845 ln -sfn "${prefix#/}/${d#/}" "$initdir/$d"
1849 if [[ $kernel_only != yes ]]; then
1850 for d
in usr usr
/bin usr
/sbin bin etc lib sbin tmp var var
/tmp
$libdirs; do
1852 [[ -e "${initdir}${prefix}/$d" ]] && continue
1853 if [ -L "/$d" ]; then
1854 inst_symlink
"/$d" "${prefix}/$d"
1856 # shellcheck disable=SC2174
1857 mkdir
-m 0755 -p "${initdir}${prefix}/$d"
1861 for d
in dev proc sys sysroot root run
; do
1862 if [ -L "/$d" ]; then
1865 # shellcheck disable=SC2174
1866 mkdir
-m 0755 -p "$initdir/$d"
1870 ln -sfn ..
/run
"$initdir/var/run"
1871 ln -sfn ..
/run
/lock
"$initdir/var/lock"
1873 for d
in lib
"$libdirs"; do
1874 [[ -e "${initdir}${prefix}/$d" ]] && continue
1875 if [ -h "/$d" ]; then
1876 inst
"/$d" "${prefix}/$d"
1878 # shellcheck disable=SC2174
1879 mkdir
-m 0755 -p "${initdir}${prefix}/$d"
1884 mkdir
-p "${initdir}"/lib
/dracut
1886 if [[ $kernel_only != yes ]]; then
1887 mkdir
-p "${initdir}/etc/cmdline.d"
1888 mkdir
-m 0755 "${initdir}"/lib
/dracut
/hooks
1889 for _d
in $hookdirs; do
1890 # shellcheck disable=SC2174
1891 mkdir
-m 0755 -p "${initdir}/lib/dracut/hooks/$_d"
1893 if [[ $EUID == "0" ]] && ! [[ $DRACUT_NO_MKNOD ]]; then
1894 [[ -c ${initdir}/dev
/null
]] || mknod
"${initdir}"/dev
/null c
1 3
1895 [[ -c ${initdir}/dev
/kmsg
]] || mknod
"${initdir}"/dev
/kmsg c
1 11
1896 [[ -c ${initdir}/dev
/console
]] || mknod
"${initdir}"/dev
/console c
5 1
1897 [[ -c ${initdir}/dev
/random
]] || mknod
"${initdir}"/dev
/random c
1 8
1898 [[ -c ${initdir}/dev
/urandom
]] || mknod
"${initdir}"/dev
/urandom c
1 9
1902 _isize
=0 #initramfs size
1904 # source our modules.
1905 for moddir
in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1906 _d_mod
=${moddir##*/}
1907 _d_mod
=${_d_mod#[0-9][0-9]}
1908 [[ $mods_to_load == *\
$_d_mod\
* ]] ||
continue
1909 if [[ $show_modules == yes ]]; then
1910 printf "%s\n" "$_d_mod"
1912 dinfo
"*** Including module: $_d_mod ***"
1914 if [[ $kernel_only == yes ]]; then
1915 module_installkernel
"$_d_mod" "$moddir" ||
{
1916 dfatal
"installkernel failed in module $_d_mod"
1920 module_install
"$_d_mod" "$moddir"
1921 if [[ $no_kernel != yes ]]; then
1922 module_installkernel
"$_d_mod" "$moddir" ||
{
1923 dfatal
"installkernel failed in module $_d_mod"
1928 mods_to_load
=${mods_to_load// $_d_mod /}
1929 modules_loaded
+="$_d_mod "
1931 #print the module install size
1932 if [ -n "$printsize" ]; then
1933 _isize_new
=$
(du
-sk "${initdir}" |
{
1937 _isize_delta
=$
((_isize_new
- _isize
))
1938 printf "%s\n" "$_d_mod install size: ${_isize_delta}k"
1944 for i
in $modules_loaded; do
1945 printf "%s\n" "$i" >> "$initdir"/lib
/dracut
/modules.txt
1948 dinfo
"*** Including modules done ***"
1950 ## final stuff that has to happen
1951 if [[ $no_kernel != yes ]]; then
1952 if [[ $hostonly_mode == "strict" ]]; then
1953 cp "$DRACUT_KERNEL_MODALIASES" "$initdir"/lib
/dracut
/hostonly-kernel-modules.txt
1956 if [[ $drivers ]]; then
1957 # shellcheck disable=SC2086
1958 hostonly
='' instmods
$drivers
1961 if [[ -n ${add_drivers// /} ]]; then
1962 # shellcheck disable=SC2086
1963 hostonly
='' instmods
-c $add_drivers
1965 if [[ $force_drivers ]]; then
1966 # shellcheck disable=SC2086
1967 hostonly
='' instmods
-c $force_drivers
1968 rm -f "$initdir"/etc
/cmdline.d
/20-force_driver.conf
1969 for mod
in $force_drivers; do
1970 echo "rd.driver.pre=$mod" >> "$initdir"/etc
/cmdline.d
/20-force_drivers.conf
1973 if [[ $filesystems ]]; then
1974 # shellcheck disable=SC2086
1975 hostonly
='' instmods
-c $filesystems
1978 dinfo
"*** Installing kernel module dependencies ***"
1980 dinfo
"*** Installing kernel module dependencies done ***"
1982 if [[ $noimageifnotneeded == yes ]] && [[ $hostonly ]]; then
1983 if [[ ! -f "$initdir/lib/dracut/need-initqueue" ]] \
1984 && [[ -f ${initdir}/lib
/modules
/$kernel/modules.dep
&& ! -s ${initdir}/lib
/modules
/$kernel/modules.dep
]]; then
1985 for i
in "${initdir}"/etc
/cmdline.d
/*.conf
; do
1986 # We need no initramfs image and do not generate one.
1987 [[ $i == "${initdir}/etc/cmdline.d/*.conf" ]] && exit 0
1993 if [[ $kernel_only != yes ]]; then
1994 # FIXME: handle legacy item split
1995 # shellcheck disable=SC2068
1996 ((${#install_items[@]} > 0)) && inst_multiple
${install_items[@]}
1997 # shellcheck disable=SC2068
1998 ((${#install_optional_items[@]} > 0)) && inst_multiple
-o ${install_optional_items[@]}
2000 if [[ $kernel_cmdline ]] && [[ $uefi != yes ]]; then
2001 printf "%s\n" "$kernel_cmdline" >> "${initdir}/etc/cmdline.d/01-default.conf"
2004 for line
in "${fstab_lines[@]}"; do
2005 read -r -a fstab_field
<<< "$line"
2006 if [ -z "${fstab_field[1]}" ]; then
2007 # Determine device and mount options from current system
2008 mountpoint
-q "${fstab_field[0]}" || derror
"${fstab_field[0]} is not a mount point!"
2009 read -r -a fstab_field
< <(findmnt
--raw -n --target "${fstab_field[0]}" --output=source,target
,fstype
,options
)
2010 dinfo
"Line for ${fstab_field[1]}: ${fstab_field[*]}"
2012 # Use default options
2013 [ -z "${fstab_field[3]}" ] && fstab_field
[3]="defaults"
2016 # Default options for freq and passno
2017 [ -z "${fstab_field[4]}" ] && fstab_field
[4]="0"
2018 [ -z "${fstab_field[5]}" ] && fstab_field
[5]="2"
2020 strstr
"${fstab_field[2]}" "nfs" && fstab_field
[5]="0"
2021 echo "${fstab_field[@]}" >> "${initdir}/etc/fstab"
2024 for f
in $add_fstab; do
2025 cat "$f" >> "${initdir}/etc/fstab"
2028 if [[ $dracutsysrootdir$systemdutildir ]]; then
2029 if [[ -d ${initdir}/$systemdutildir ]]; then
2030 mkdir
-p "${initdir}"/etc
/conf.d
2032 printf "%s\n" "systemdutildir=\"$systemdutildir\""
2033 printf "%s\n" "systemdsystemunitdir=\"$systemdsystemunitdir\""
2034 printf "%s\n" "systemdsystemconfdir=\"$systemdsystemconfdir\""
2035 } > "${initdir}"/etc
/conf.d
/systemd.conf
2039 if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then
2040 dinfo
"*** Resolving executable dependencies ***"
2041 # shellcheck disable=SC2086
2042 find "$initdir" -type f
-perm /0111 -not -path '*.ko' -print0 \
2043 |
xargs -r -0 $DRACUT_INSTALL ${initdir:+-D "$initdir"} ${dracutsysrootdir:+-r "$dracutsysrootdir"} -R ${DRACUT_FIPS_MODE:+-f} --
2044 # shellcheck disable=SC2181
2045 if (($?
== 0)); then
2046 dinfo
"*** Resolving executable dependencies done ***"
2048 dfatal
"Resolving executable dependencies failed"
2053 # Now we are done with lazy resolving, always install dependencies
2054 unset DRACUT_RESOLVE_LAZY
2055 export DRACUT_RESOLVE_DEPS
=1
2058 for ((i
= 0; i
< ${#include_src[@]}; i
++)); do
2059 src
="${include_src[$i]}"
2060 target
="${include_target[$i]}"
2061 if [[ $src && $target ]]; then
2062 if [[ -f $src ]]; then
2063 inst
"$src" "$target"
2064 elif [[ -d $src ]]; then
2065 ddebug
"Including directory: $src"
2066 destdir
="${initdir}/${target}"
2068 # check for preexisting symlinks, so we can cope with the
2069 # symlinks to $prefix
2070 # Objectname is a file or a directory
2071 reset_dotglob
="$(shopt -p dotglob)"
2073 for objectname
in "$src"/*; do
2074 [[ -e $objectname ||
-L $objectname ]] ||
continue
2075 if [[ -d $objectname ]] && [[ ! -L $objectname ]]; then
2076 # objectname is a directory, let's compute the final directory name
2077 object_destdir
=${destdir}/${objectname#"$src"/}
2078 if ! [[ -e $object_destdir ]]; then
2079 # shellcheck disable=SC2174
2080 mkdir
-m 0755 -p "$object_destdir"
2081 chmod --reference="$objectname" "$object_destdir"
2083 $DRACUT_CP -t "$object_destdir" "$dracutsysrootdir$objectname"/.
2085 $DRACUT_CP -t "$destdir" "$dracutsysrootdir$objectname"
2088 eval "$reset_dotglob"
2089 elif [[ -e $src ]]; then
2090 derror
"$src is neither a directory nor a regular file"
2092 derror
"$src doesn't exist"
2097 if [[ $do_hardlink == yes ]] && command -v hardlink
> /dev
/null
; then
2098 dinfo
"*** Hardlinking files ***"
2099 hardlink
"$initdir" 2>&1 | ddebug
2100 dinfo
"*** Hardlinking files done ***"
2104 if [[ $do_strip == yes ]]; then
2105 # Prefer strip from elfutils for package size
2107 strip_cmd
=$
(command -v eu-strip
)
2108 [ -z "$strip_cmd" ] && strip_cmd
="strip"
2110 for p
in $strip_cmd xargs find; do
2111 if ! type -P $p > /dev
/null
; then
2112 dinfo
"Could not find '$p'. Not stripping the initramfs."
2117 if [[ $aggressive_strip == yes ]]; then
2118 # `eu-strip` and `strip` both strips all unneeded parts by default
2125 # cleanup empty ldconfig_paths directories
2126 for d
in $
(ldconfig_paths
); do
2127 rmdir -p --ignore-fail-on-non-empty "$initdir/$d" > /dev
/null
2>&1
2130 if [[ $early_microcode == yes ]]; then
2131 dinfo
"*** Generating early-microcode cpio image ***"
2132 ucode_dir
=(amd-ucode intel-ucode
)
2133 ucode_dest
=(AuthenticAMD.bin GenuineIntel.bin
)
2134 _dest_dir
="$early_cpio_dir/d/kernel/x86/microcode"
2136 mkdir
-p "$_dest_dir"
2137 if [[ $hostonly ]]; then
2138 [[ $
(get_cpu_vendor
) == "AMD" ]] && _dest_idx
="0"
2139 [[ $
(get_cpu_vendor
) == "Intel" ]] && _dest_idx
="1"
2141 for idx
in $_dest_idx; do
2142 _fw
=${ucode_dir[$idx]}
2143 for _fwdir
in $fw_dir; do
2144 if [[ -d $_fwdir && -d $_fwdir/$_fw ]]; then
2146 dinfo
"*** Constructing ${ucode_dest[$idx]} ***"
2147 if [[ $hostonly ]]; then
2148 _src
=$
(get_ucode_file
)
2149 [[ $_src ]] ||
break
2150 [[ -r $_fwdir/$_fw/$_src ]] || _src
="${_src}.early"
2151 [[ -r $_fwdir/$_fw/$_src ]] ||
break
2154 for i
in $_fwdir/$_fw/$_src; do
2155 [ -e "$i" ] && break
2158 for i
in $_fwdir/$_fw/$_src; do
2159 [[ -e $i ]] ||
continue
2161 str_ends
"$i" ".asc" && continue
2162 cat "$i" >> "$_dest_dir/${ucode_dest[$idx]}"
2164 create_early_cpio
="yes"
2167 if [[ ! -e "$_dest_dir/${ucode_dest[$idx]}" ]]; then
2168 if cd "$early_cpio_dir/d"; then
2169 for _ucodedir
in "${early_microcode_image_dir[@]}"; do
2170 for _ucodename
in "${early_microcode_image_name[@]}"; do
2171 [[ -e "$_ucodedir/$_ucodename" ]] \
2172 && cpio --extract --file "$_ucodedir/$_ucodename" --quiet \
2173 "kernel/x86/microcode/${ucode_dest[$idx]}"
2174 if [[ -e "$_dest_dir/${ucode_dest[$idx]}" ]]; then
2175 dinfo
"*** Using microcode found in '$_ucodedir/$_ucodename' ***"
2176 create_early_cpio
="yes"
2186 if [[ $acpi_override == yes ]] && [[ -d $acpi_table_dir ]]; then
2187 dinfo
"*** Packaging ACPI tables to override BIOS provided ones ***"
2188 _dest_dir
="$early_cpio_dir/d/kernel/firmware/acpi"
2189 mkdir
-p "$_dest_dir"
2190 for table
in "$acpi_table_dir"/*.aml
; do
2191 dinfo
" Adding ACPI table: $table"
2192 $DRACUT_CP "$table" "$_dest_dir"
2193 create_early_cpio
="yes"
2197 dinfo
"*** Store current command line parameters ***"
2198 if ! (echo "$PARMS_TO_STORE" > "$initdir"/lib
/dracut
/build-parameter.txt
); then
2199 dfatal
"Could not store the current command line parameters"
2203 if [[ $hostonly_cmdline == "yes" ]]; then
2204 unset _stored_cmdline
2205 if [[ -d $initdir/etc
/cmdline.d
]]; then
2206 dinfo
"Stored kernel commandline:"
2207 for conf
in "$initdir"/etc
/cmdline.d
/*.conf
; do
2208 [ -e "$conf" ] ||
continue
2209 dinfo
"$(< "$conf")"
2213 if ! [[ $_stored_cmdline ]]; then
2214 dinfo
"No dracut internal kernel commandline stored in the initramfs"
2218 if [[ $kernel_only != yes ]]; then
2219 # libpthread workaround: pthread_cancel wants to dlopen libgcc_s.so
2220 for _dir
in $libdirs; do
2221 for _f
in "$dracutsysrootdir$_dir/libpthread.so"*; do
2222 [[ -e $_f ]] ||
continue
2223 inst_libdir_file
"libgcc_s.so*"
2228 # FIPS workaround for Fedora/RHEL: libcrypto needs libssl when FIPS is enabled
2229 if [[ $DRACUT_FIPS_MODE ]]; then
2230 for _dir
in $libdirs; do
2231 for _f
in "$dracutsysrootdir$_dir/libcrypto.so"*; do
2232 [[ -e $_f ]] ||
continue
2233 inst_libdir_file
-o "libssl.so*"
2240 if [[ $kernel_only != yes ]]; then
2241 # make sure that library links are correct and up to date
2245 if dracut_module_included
"squash"; then
2246 readonly squash_dir
="$initdir/squash/root"
2247 readonly squash_img
="$initdir/squash-root.img"
2248 mkdir
-p "$squash_dir"
2249 dinfo
"*** Install squash loader ***"
2250 DRACUT_SQUASH_POST_INST
=1 module_install
"squash"
2253 if [[ $do_strip == yes ]] && ! [[ $DRACUT_FIPS_MODE ]]; then
2254 # stripping files negates (dedup) benefits of using reflink
2255 [[ -n $enhanced_cpio ]] && ddebug
"strip is enabled alongside cpio reflink"
2256 dinfo
"*** Stripping files ***"
2257 find "$initdir" -type f \
2258 -executable -not -path '*/lib/modules/*.ko' -print0 \
2259 |
xargs -r -0 $strip_cmd "${strip_args[@]}" 2> /dev
/null
2261 # strip kernel modules, but do not touch signed modules
2262 find "$initdir" -type f
-path '*/lib/modules/*.ko' -print0 \
2263 |
while read -r -d $
'\0' f ||
[ -n "$f" ]; do
2264 SIG
=$
(tail -c 28 "$f" |
tr -d '\000')
2265 [[ $SIG == '~Module signature appended~' ]] ||
{ printf "%s\000" "$f"; }
2266 done |
xargs -r -0 $strip_cmd "${strip_args[@]}"
2267 dinfo
"*** Stripping files done ***"
2270 if dracut_module_included
"squash"; then
2271 dinfo
"*** Squashing the files inside the initramfs ***"
2272 declare squash_compress_arg
2273 # shellcheck disable=SC2086
2274 if [[ $squash_compress ]]; then
2275 if ! mksquashfs
/dev
/null
"$DRACUT_TMPDIR"/.squash-test.img
-no-progress -comp $squash_compress &> /dev
/null
; then
2276 dwarn
"mksquashfs doesn't support compressor '$squash_compress', failing back to default compressor."
2278 squash_compress_arg
="$squash_compress"
2282 # shellcheck disable=SC2086
2283 if ! mksquashfs
"$squash_dir" "$squash_img" \
2284 -no-xattrs -no-exports -noappend -no-recovery -always-use-fragments \
2285 -no-progress ${squash_compress_arg:+-comp $squash_compress_arg} 1> /dev
/null
; then
2286 dfatal
"Failed making squash image"
2290 rm -rf "$squash_dir"
2291 dinfo
"*** Squashing the files inside the initramfs done ***"
2293 # Skip initramfs compress
2297 dinfo
"*** Creating image file '$outfile' ***"
2299 if [[ $uefi == yes ]]; then
2300 readonly uefi_outdir
="$DRACUT_TMPDIR/uefi"
2301 mkdir
-p "$uefi_outdir"
2304 if [[ $DRACUT_REPRODUCIBLE ]]; then
2305 find "$initdir" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
2306 |
xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
2308 if [[ "$(cpio --help)" == *--reproducible* ]]; then
2311 dinfo
"cpio does not support '--reproducible'. Resulting image will not be reproducible."
2315 [[ $EUID != 0 ]] && cpio_owner
="0:0"
2317 if [[ $create_early_cpio == yes ]]; then
2318 echo 1 > "$early_cpio_dir/d/early_cpio"
2320 if [[ $DRACUT_REPRODUCIBLE ]]; then
2321 find "$early_cpio_dir/d" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
2322 |
xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
2325 # The microcode blob is _before_ the initramfs blob, not after
2326 if [[ -n $enhanced_cpio ]]; then
2329 cd "$early_cpio_dir/d"
2330 find .
-print0 |
sort -z \
2331 |
$enhanced_cpio --null ${cpio_owner:+--owner "$cpio_owner"} \
2332 --mtime 0 --data-align "$cpio_align" --truncate-existing \
2333 "${DRACUT_TMPDIR}/initramfs.img"
2335 dfatal
"dracut-cpio: creation of $outfile failed"
2341 cd "$early_cpio_dir/d"
2342 find .
-print0 |
sort -z \
2343 |
cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null \
2344 ${cpio_owner:+-R "$cpio_owner"} -H newc
-o --quiet > "${DRACUT_TMPDIR}/initramfs.img"
2346 dfatal
"Creation of $outfile failed"
2352 if check_kernel_config CONFIG_RD_ZSTD
; then
2353 DRACUT_KERNEL_RD_ZSTD
=yes
2355 DRACUT_KERNEL_RD_ZSTD
=
2358 if [[ $compress == $DRACUT_COMPRESS_ZSTD* && ! $DRACUT_KERNEL_RD_ZSTD ]]; then
2359 dwarn
"Kernel has no zstd support compiled in."
2363 if [[ $compress && $compress != cat ]]; then
2364 if ! command -v "${compress%% *}" &> /dev
/null
; then
2365 derror
"Cannot execute compression command '$compress', falling back to default"
2370 if ! [[ $compress ]]; then
2371 # check all known compressors, if none specified
2372 for i
in $DRACUT_COMPRESS_PIGZ $DRACUT_COMPRESS_GZIP $DRACUT_COMPRESS_LZ4 $DRACUT_COMPRESS_LZOP $DRACUT_COMPRESS_ZSTD $DRACUT_COMPRESS_LZMA $DRACUT_COMPRESS_XZ $DRACUT_COMPRESS_LBZIP2 $DRACUT_COMPRESS_BZIP2 $DRACUT_COMPRESS_CAT; do
2373 [[ $i != "$DRACUT_COMPRESS_ZSTD" ||
$DRACUT_KERNEL_RD_ZSTD ]] ||
continue
2374 command -v "$i" &> /dev
/null ||
continue
2378 if [[ $compress == cat ]]; then
2379 dwarn
"No compression tool available. Initramfs image is going to be big."
2381 dinfo
"Using auto-determined compression method '$compress'"
2385 # choose the right arguments for the compressor
2388 if [[ $compress == lbzip2
]] ||
command -v "$DRACUT_COMPRESS_LBZIP2" &> /dev
/null
; then
2389 compress="$DRACUT_COMPRESS_LBZIP2 -9"
2391 compress="$DRACUT_COMPRESS_BZIP2 -9"
2395 compress="$DRACUT_COMPRESS_LZMA -9 -T0"
2398 compress="$DRACUT_COMPRESS_XZ --check=crc32 --lzma2=dict=1MiB -T0"
2401 if [[ $compress == pigz
]] ||
command -v "$DRACUT_COMPRESS_PIGZ" &> /dev
/null
; then
2402 compress="$DRACUT_COMPRESS_PIGZ -9 -n -T -R"
2403 elif command -v gzip &> /dev
/null
&& $DRACUT_COMPRESS_GZIP --help 2>&1 |
grep -q rsyncable
; then
2404 compress="$DRACUT_COMPRESS_GZIP -n -9 --rsyncable"
2406 compress="$DRACUT_COMPRESS_GZIP -n -9"
2410 compress="$DRACUT_COMPRESS_LZOP -9"
2413 compress="$DRACUT_COMPRESS_LZ4 -l -9"
2416 compress="$DRACUT_COMPRESS_ZSTD -15 -q -T0"
2420 if [[ -n $enhanced_cpio ]]; then
2421 if [[ $compress == "cat" ]]; then
2422 # dracut-cpio appends by default, so any ucode remains
2423 cpio_outfile
="${DRACUT_TMPDIR}/initramfs.img"
2425 ddebug
"$compress compression enabled alongside cpio reflink"
2426 # dracut-cpio doesn't output to stdout, so stage for compression
2427 cpio_outfile
="${DRACUT_TMPDIR}/initramfs.img.uncompressed"
2433 find .
-print0 |
sort -z \
2434 |
$enhanced_cpio --null ${cpio_owner:+--owner "$cpio_owner"} \
2435 --mtime 0 --data-align "$cpio_align" "$cpio_outfile" ||
exit 1
2436 [[ $compress == "cat" ]] && exit 0
2437 $compress < "$cpio_outfile" >> "${DRACUT_TMPDIR}/initramfs.img" \
2438 && rm "$cpio_outfile"
2440 dfatal
"dracut-cpio: creation of $outfile failed"
2448 find .
-print0 |
sort -z \
2449 |
cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null ${cpio_owner:+-R "$cpio_owner"} -H newc
-o --quiet \
2450 |
$compress >> "${DRACUT_TMPDIR}/initramfs.img"
2452 dfatal
"Creation of $outfile failed"
2457 if ((maxloglvl
>= 5)) && ((verbosity_mod_l
>= 0)); then
2458 if [[ $allowlocal ]]; then
2459 "$dracutbasedir/lsinitrd.sh" "${DRACUT_TMPDIR}/initramfs.img" | ddebug
2461 lsinitrd
"${DRACUT_TMPDIR}/initramfs.img" | ddebug
2467 SBAT_DEFAULT
="sbat,1,SBAT Version,sbat,1,https://github.com/rhboot/shim/blob/main/SBAT.md"
2468 sbat_out
=$uefi_outdir/uki.sbat
2470 clean_sbat_string
() {
2472 local temp
=$uefi_outdir/temp.sbat
2473 sed "/${SBAT_DEFAULT//\//\\/}/d" "$inp" > "$temp"
2474 [[ -s $temp ]] && cat "$temp" >> "$sbat_out"
2480 local out
=$uefi_outdir/$2
2481 objcopy
-O binary
--only-section=.sbat
"$inp" "$out"
2482 clean_sbat_string
"$out"
2485 if [[ $uefi == yes ]]; then
2486 if [[ $kernel_cmdline ]]; then
2487 echo -n "$kernel_cmdline" > "$uefi_outdir/cmdline.txt"
2488 elif [[ $hostonly_cmdline == yes ]]; then
2489 if [ -d "$initdir/etc/cmdline.d" ]; then
2490 for conf
in "$initdir"/etc
/cmdline.d
/*.conf
; do
2491 [ -e "$conf" ] ||
continue
2492 printf "%s " "$(< "$conf")" >> "$uefi_outdir/cmdline.txt"
2494 elif [ -e "/proc/cmdline" ]; then
2495 printf "%s " "$(< "/proc
/cmdline
")" > "$uefi_outdir/cmdline.txt"
2499 offs
=$
(objdump
-h "$uefi_stub" 2> /dev
/null | gawk
'NF==7 {size=strtonum("0x"$3);
2500 offset=strtonum("0x"$4)} END {print size + offset}')
2501 if [[ $offs -eq 0 ]]; then
2502 dfatal
"Failed to get the size of $uefi_stub to create UEFI image file"
2505 align
=$
(pe_get_section_align
"$uefi_stub")
2506 if [[ $?
-eq 1 ]]; then
2507 dfatal
"Failed to get the SectionAlignment of the stub PE header to create the UEFI image file"
2510 offs
=$
((offs
+ "$align" - offs
% "$align"))
2511 [[ -s $dracutsysrootdir/usr
/lib
/os-release
]] && uefi_osrelease
="$dracutsysrootdir/usr/lib/os-release"
2512 [[ -s $dracutsysrootdir/etc
/os-release
]] && uefi_osrelease
="$dracutsysrootdir/etc/os-release"
2513 [[ -s $uefi_osrelease ]] \
2514 && uefi_osrelease_offs
=${offs} \
2515 && offs
=$
((offs
+ $
(stat
-Lc%s
"$uefi_osrelease"))) \
2516 && offs
=$
((offs
+ "$align" - offs
% "$align"))
2518 if [[ $kernel_cmdline ]] ||
[[ $hostonly_cmdline == yes && -e "${uefi_outdir}/cmdline.txt" ]]; then
2519 echo -ne "\x00" >> "$uefi_outdir/cmdline.txt"
2520 dinfo
"Using UEFI kernel cmdline:"
2521 dinfo
"$(tr -d '\000' < "$uefi_outdir/cmdline.txt
")"
2522 uefi_cmdline
="${uefi_outdir}/cmdline.txt"
2523 uefi_cmdline_offs
=${offs}
2524 offs
=$
((offs
+ $
(stat
-Lc%s
"$uefi_cmdline")))
2525 offs
=$
((offs
+ "$align" - offs
% "$align"))
2530 if [[ -s ${dracutsysrootdir}${uefi_splash_image} ]]; then
2531 uefi_splash_image
="${dracutsysrootdir}${uefi_splash_image}"
2532 uefi_splash_offs
=${offs}
2533 offs
=$
((offs
+ $
(stat
-Lc%s
"$uefi_splash_image")))
2534 offs
=$
((offs
+ "$align" - offs
% "$align"))
2536 unset uefi_splash_image
2539 echo "$SBAT_DEFAULT" > "$sbat_out"
2540 if [[ -n $sbat ]]; then
2541 echo "$sbat" |
sed "/${SBAT_DEFAULT//\//\\/}/d" >> "$sbat_out"
2543 get_sbat_string
"$kernel_image" kernel.sbat
2544 get_sbat_string
"$uefi_stub" stub.sbat
2546 uefi_sbat_offs
="${offs}"
2547 offs
=$
((offs
+ $
(stat
-Lc%s
"$sbat_out")))
2548 offs
=$
((offs
+ "$align" - offs
% "$align"))
2549 uefi_linux_offs
="${offs}"
2550 offs
=$
((offs
+ $
(stat
-Lc%s
"$kernel_image")))
2551 offs
=$
((offs
+ "$align" - offs
% "$align"))
2552 uefi_initrd_offs
="${offs}"
2554 base_image
=$
(pe_get_image_base
"$uefi_stub")
2555 if [[ $?
-eq 1 ]]; then
2556 dfatal
"Failed to get ImageBase data of $uefi_stub to create UEFI image file"
2560 tmp_uefi_stub
=$uefi_outdir/elf.stub
2561 cp "$uefi_stub" "$tmp_uefi_stub"
2562 objcopy
--remove-section .sbat
"$tmp_uefi_stub" &> /dev
/null
2565 ${uefi_osrelease:+--add-section .osrel="$uefi_osrelease" --change-section-vma .osrel=$(printf 0x%x "$uefi_osrelease_offs")} \
2566 ${uefi_cmdline:+--add-section .cmdline="$uefi_cmdline" --change-section-vma .cmdline=$(printf 0x%x "$uefi_cmdline_offs")} \
2567 ${uefi_splash_image:+--add-section .splash="$uefi_splash_image" --change-section-vma .splash=$(printf 0x%x "$uefi_splash_offs")} \
2568 --add-section .sbat
="$sbat_out" --change-section-vma .sbat
="$(printf 0x%x "$uefi_sbat_offs")" \
2569 --add-section .linux
="$kernel_image" --change-section-vma .linux
="$(printf 0x%x "$uefi_linux_offs")" \
2570 --add-section .initrd
="${DRACUT_TMPDIR}/initramfs.img" --change-section-vma .initrd
="$(printf 0x%x "$uefi_initrd_offs")" \
2571 --image-base="$(printf 0x%x "$base_image")" \
2572 "$tmp_uefi_stub" "${uefi_outdir}/linux.efi"; then
2573 if [[ -n ${uefi_secureboot_key} && -n ${uefi_secureboot_cert} ]]; then
2575 ${uefi_secureboot_engine:+--engine "$uefi_secureboot_engine"} \
2576 --key "${uefi_secureboot_key}" \
2577 --cert "${uefi_secureboot_cert}" \
2578 --output "$outfile" "${uefi_outdir}/linux.efi" \
2579 && sbverify
--cert "${uefi_secureboot_cert}" "$outfile" > /dev
/null
2>&1; then
2580 dinfo
"*** Creating signed UEFI image file '$outfile' done ***"
2583 dfatal
"*** Creating signed UEFI image file '$outfile' failed ***"
2587 if cp --reflink=auto
"${uefi_outdir}/linux.efi" "$outfile"; then
2588 dinfo
"*** Creating UEFI image file '$outfile' done ***"
2591 dfatal
"Creation of $outfile failed"
2597 dfatal
"*** Creating UEFI image file '$outfile' failed ***"
2601 if cp --reflink=auto
"${DRACUT_TMPDIR}/initramfs.img" "$outfile"; then
2602 dinfo
"*** Creating initramfs image file '$outfile' done ***"
2605 dfatal
"Creation of $outfile failed"
2611 btrfs filesystem show
"$1" |
sed -n '1s/^.*uuid: //p'
2614 freeze_ok_for_btrfs
() {
2615 local mnt uuid1 uuid2
2616 # If the output file is on btrfs, we need to make sure that it's
2617 # not on a subvolume of the same file system as the root FS.
2618 # Otherwise, fsfreeze() might freeze the entire system.
2619 # This is most conveniently checked by comparing the FS uuid.
2621 [[ "$(stat -f -c %T -- "/")" == "btrfs" ]] ||
return 0
2622 mnt
=$
(stat
-c %m
-- "$1")
2623 uuid1
=$
(btrfs_uuid
"$mnt")
2624 uuid2
=$
(btrfs_uuid
"/")
2625 [[ $uuid1 && $uuid2 && $uuid1 != "$uuid2" ]]
2628 freeze_ok_for_fstype
() {
2632 [[ "$(stat -c %m -- "$outfile")" == "/" ]] && return 1
2633 fstype
=$
(stat
-f -c %T
-- "$outfile")
2645 freeze_ok_for_btrfs
"$outfile"
2653 # We sync/fsfreeze only if we're operating on a live booted system.
2654 # It's possible for e.g. `kernel` to be installed as an RPM BuildRequires or equivalent,
2655 # and there's no reason to sync, and *definitely* no reason to fsfreeze.
2656 # Another case where this happens is rpm-ostree, which performs its own sync/fsfreeze
2657 # globally. See e.g. https://github.com/ostreedev/ostree/commit/8642ef5ab3fec3ac8eb8f193054852f83a8bc4d0
2658 if [[ -d $dracutsysrootdir/run
/systemd
/system
]]; then
2659 if ! sync
"$outfile" 2> /dev
/null
; then
2660 dinfo
"sync operation on newly created initramfs $outfile failed"
2664 # use fsfreeze only if we're not writing to /
2665 if [[ "$(stat -c %m -- "$outfile")" != "/" ]] && freeze_ok_for_fstype
"$outfile"; then
2666 FSFROZEN
="$(dirname "$outfile")"
2667 if ! (fsfreeze
-f "${FSFROZEN}" 2> /dev
/null
&& fsfreeze
-u "${FSFROZEN}" 2> /dev
/null
); then
2668 dwarn
"Could not fsfreeze $(dirname "$outfile")"