]> git.ipfire.org Git - thirdparty/dracut.git/blame - dracut.sh
fix: shellcheck for dracut.sh
[thirdparty/dracut.git] / dracut.sh
CommitLineData
c1c78f8a 1#!/bin/bash -p
3b403b32 2#
641cc356
JK
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
6#
70c26b7f 7
7d848c55 8# Copyright 2005-2013 Red Hat, Inc. All rights reserved.
4f18fe82
HH
9#
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.
14#
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.
19#
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/>.
22#
ec9315e5 23
58dad702 24# store for logging
ee44f629 25
c1c78f8a
RM
26unset BASH_ENV
27
ee44f629
HH
28# Verify bash version, current minimum is 4
29if (( BASH_VERSINFO[0] < 4 )); then
30 printf -- 'You need at least Bash 4 to use dracut, sorry.' >&2
31 exit 1
32fi
33
ffa71b4a 34dracut_args=( "$@" )
7310a848 35readonly dracut_cmd=$(readlink -f "$0")
5616feb0 36
7abd4264
HH
37set -o pipefail
38
5616feb0 39usage() {
497916e1 40 [[ $sysroot_l ]] && dracutsysrootdir="$sysroot_l"
7310a848 41 [[ $dracutbasedir ]] || dracutbasedir="$dracutsysrootdir"/usr/lib/dracut
dbf8f6ba 42 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
7310a848
HH
43 # shellcheck source=./dracut-version.sh
44 . "$dracutbasedir"/dracut-version.sh
dbf8f6ba
HH
45 fi
46
5616feb0 47# 80x25 linebreak here ^
cc02093d 48 cat << EOF
e8f19bcf 49Usage: $dracut_cmd [OPTION]... [<initramfs> [<kernel-version>]]
ffa71b4a
HH
50
51Version: $DRACUT_VERSION
52
53Creates initial ramdisk images for preloading modules
54
55 -h, --help Display all options
56
57If a [LIST] has multiple arguments, then you have to put these in quotes.
58
59For example:
60
61 # dracut --add-drivers "module1 module2" ...
62
63EOF
64}
65
66long_usage() {
7310a848 67 [[ $dracutbasedir ]] || dracutbasedir="$dracutsysrootdir"/usr/lib/dracut
ffa71b4a 68 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
7310a848
HH
69 # shellcheck source=./dracut-version.sh
70 . "$dracutbasedir"/dracut-version.sh
ffa71b4a
HH
71 fi
72
73# 80x25 linebreak here ^
74 cat << EOF
e8f19bcf 75Usage: $dracut_cmd [OPTION]... [<initramfs> [<kernel-version>]]
dbf8f6ba
HH
76
77Version: $DRACUT_VERSION
78
5616feb0
AT
79Creates initial ramdisk images for preloading modules
80
e65caf36 81 --kver [VERSION] Set kernel version to [VERSION].
39ff0682 82 -f, --force Overwrite existing initramfs file.
54e7d7c3 83 -a, --add [LIST] Add a space-separated list of dracut modules.
659dc319 84 --rebuild Append arguments to those of existing image and rebuild
5616feb0
AT
85 -m, --modules [LIST] Specify a space-separated list of dracut modules to
86 call when building the initramfs. Modules are located
c5a65990 87 in /usr/lib/dracut/modules.d.
39ff0682 88 -o, --omit [LIST] Omit a space-separated list of dracut modules.
ea3c4e82
HH
89 --force-add [LIST] Force to add a space-separated list of dracut modules
90 to the default set of modules, when -H is specified.
5616feb0 91 -d, --drivers [LIST] Specify a space-separated list of kernel modules to
ea3c4e82
HH
92 exclusively include in the initramfs.
93 --add-drivers [LIST] Specify a space-separated list of kernel
94 modules to add to the initramfs.
cea907f6
TR
95 --force-drivers [LIST] Specify a space-separated list of kernel
96 modules to add to the initramfs and make sure they
97 are tried to be loaded via modprobe same as passing
98 rd.driver.pre=DRIVER kernel parameter.
fcbcb252 99 --omit-drivers [LIST] Specify a space-separated list of kernel
ea3c4e82 100 modules not to add to the initramfs.
8fa510d4 101 --filesystems [LIST] Specify a space-separated list of kernel filesystem
ea3c4e82
HH
102 modules to exclusively include in the generic
103 initramfs.
3b403b32 104 -k, --kmoddir [DIR] Specify the directory, where to look for kernel
ea3c4e82 105 modules
3b403b32 106 --fwdir [DIR] Specify additional directories, where to look for
ea3c4e82 107 firmwares, separated by :
33ee031c
HH
108 --kernel-only Only install kernel drivers and firmware files
109 --no-kernel Do not install kernel drivers and firmware files
1743473b 110 --print-cmdline Print the kernel command line for the given disk layout
5bbfd484 111 --early-microcode Combine early microcode with ramdisk
5f2c30d9 112 --no-early-microcode Do not combine early microcode with ramdisk
d20fb951 113 --kernel-cmdline [PARAMETERS] Specify default kernel command line parameters
54e7d7c3 114 --strip Strip binaries in the initramfs
6c128565 115 --nostrip Do not strip binaries in the initramfs
54e7d7c3 116 --hardlink Hardlink files in the initramfs
04d18f55 117 --nohardlink Do not hardlink files in the initramfs
fd786adc 118 --prefix [DIR] Prefix initramfs files with [DIR]
54e7d7c3 119 --noprefix Do not prefix initramfs files
2f02ae9d
HH
120 --mdadmconf Include local /etc/mdadm.conf
121 --nomdadmconf Do not include local /etc/mdadm.conf
7a34efa5 122 --lvmconf Include local /etc/lvm/lvm.conf
cc02093d 123 --nolvmconf Do not include local /etc/lvm/lvm.conf
25b45979
MS
124 --fscks [LIST] Add a space-separated list of fsck helpers.
125 --nofscks Inhibit installation of any fsck helpers.
ff3953ef 126 --ro-mnt Mount / and /usr read-only by default.
5616feb0 127 -h, --help This message
00531568 128 --debug Output debug information of the build process
57258a2c 129 --profile Output profile information of the build process
e103615b
130 -L, --stdlog [0-6] Specify logging level (to standard error)
131 0 - suppress any messages
132 1 - only fatal errors
133 2 - all errors
134 3 - warnings
54e7d7c3 135 4 - info
e103615b
136 5 - debug info (here starts lots of output)
137 6 - trace info (and even more)
54e7d7c3
HH
138 -v, --verbose Increase verbosity level
139 -q, --quiet Decrease verbosity level
5616feb0
AT
140 -c, --conf [FILE] Specify configuration file to use.
141 Default: /etc/dracut.conf
3b403b32 142 --confdir [DIR] Specify configuration directory to use *.conf files
cc02093d 143 from. Default: /etc/dracut.conf.d
882c4c5a 144 --tmpdir [DIR] Temporary directory to be used instead of default
bc1e69b6 145 ${TMPDIR:-/var/tmp}.
a0120420 146 -r, --sysroot [DIR] Specify sysroot directory to collect files from.
5616feb0
AT
147 -l, --local Local mode. Use modules from the current working
148 directory instead of the system-wide installed in
c5a65990 149 /usr/lib/dracut/modules.d.
5616feb0 150 Useful when running dracut from a git checkout.
7c179686 151 -H, --hostonly Host-Only mode: Install only what is needed for
324ea606 152 booting the local host instead of a generic host.
472189da 153 -N, --no-hostonly Disables Host-Only mode
a695250e
KS
154 --hostonly-mode <mode>
155 Specify the hostonly mode to use. <mode> could be
156 one of "sloppy" or "strict". "sloppy" mode is used
157 by default.
158 In "sloppy" hostonly mode, extra drivers and modules
159 will be installed, so minor hardware change won't make
160 the image unbootable (eg. changed keyboard), and the
161 image is still portable among similar hosts.
162 With "strict" mode enabled, anything not necessary
163 for booting the local host in its current state will
164 not be included, and modules may do some extra job
165 to save more space. Minor change of hardware or
166 environment could make the image unbootable.
167 DO NOT use "strict" mode unless you know what you
168 are doing.
ab9457ef
HH
169 --hostonly-cmdline Store kernel command line arguments needed
170 in the initramfs
171 --no-hostonly-cmdline Do not store kernel command line arguments needed
172 in the initramfs
37f2fe55
XP
173 --no-hostonly-default-device
174 Do not generate implicit host devices like root,
175 swap, fstab, etc. Use "--mount" or "--add-device"
176 to explicitly add devices as needed.
f367b738
HH
177 --hostonly-i18n Install only needed keyboard and font files according
178 to the host configuration (default).
179 --no-hostonly-i18n Install all keyboard and font files available.
1e92f728
KS
180 --hostonly-nics [LIST]
181 Only enable listed NICs in the initramfs.
324ea606
HH
182 --persistent-policy [POLICY]
183 Use [POLICY] to address disks and partitions.
184 POLICY can be any directory name found in /dev/disk.
185 E.g. "by-uuid", "by-label"
7c179686 186 --fstab Use /etc/fstab to determine the root device.
70cb8a68
HH
187 --add-fstab [FILE] Add file to the initramfs fstab
188 --mount "[DEV] [MP] [FSTYPE] [FSOPTS]"
189 Mount device [DEV] on mountpoint [MP] with filesystem
190 [FSTYPE] and options [FSOPTS] in the initramfs
cdc9cd0e
RM
191 --mount "[MP]" Same as above, but [DEV], [FSTYPE] and [FSOPTS] are
192 determined by looking at the current mounts.
c586b033 193 --add-device "[DEV]" Bring up [DEV] in initramfs
5616feb0 194 -i, --include [SOURCE] [TARGET]
39ff0682
AT
195 Include the files in the SOURCE directory into the
196 Target directory in the final initramfs.
3b403b32 197 If SOURCE is a file, it will be installed to TARGET
4fea3ea6 198 in the final initramfs.
39ff0682
AT
199 -I, --install [LIST] Install the space separated list of files into the
200 initramfs.
54b68829
HH
201 --install-optional [LIST] Install the space separated list of files into the
202 initramfs, if they exist.
5b158ad3 203 --gzip Compress the generated initramfs using gzip.
cc02093d
HH
204 This will be done by default, unless another
205 compression option or --no-compress is passed.
5b158ad3 206 --bzip2 Compress the generated initramfs using bzip2.
cc02093d
HH
207 Make sure your kernel has bzip2 decompression support
208 compiled in, otherwise you will not be able to boot.
209 --lzma Compress the generated initramfs using lzma.
3b403b32 210 Make sure your kernel has lzma support compiled in,
cc02093d 211 otherwise you will not be able to boot.
5e6c3b03
VL
212 --xz Compress the generated initramfs using xz.
213 Make sure that your kernel has xz support compiled
214 in, otherwise you will not be able to boot.
37383f71 215 --lzo Compress the generated initramfs using lzop.
871c8e40 216 Make sure that your kernel has lzo support compiled
217 in, otherwise you will not be able to boot.
37383f71 218 --lz4 Compress the generated initramfs using lz4.
871c8e40 219 Make sure that your kernel has lz4 support compiled
220 in, otherwise you will not be able to boot.
7dbadcc7
TPG
221 --zstd Compress the generated initramfs using Zstandard.
222 Make sure that your kernel has zstd support compiled
223 in, otherwise you will not be able to boot.
5e6c3b03
VL
224 --compress [COMPRESSION] Compress the generated initramfs with the
225 passed compression program. Make sure your kernel
3b403b32 226 knows how to decompress the generated initramfs,
5e6c3b03 227 otherwise you will not be able to boot.
5b158ad3 228 --no-compress Do not compress the generated initramfs. This will
cc02093d 229 override any other compression options.
5b11bb73 230 --list-modules List all available dracut modules.
956af8f2
231 -M, --show-modules Print included module's name to standard output during
232 build.
5fe5c7d0 233 --keep Keep the temporary initramfs for debugging purposes
ec3c5951 234 --printsize Print out the module install size
cdfeb278 235 --sshkey [SSHKEY] Add ssh key to initramfs (use with ssh-client module)
ee54b840 236 --logfile [FILE] Logfile to use (overrides configuration setting)
80626ded 237 --reproducible Create reproducible images
10f8df1b 238 --no-reproducible Do not create reproducible images
37383f71 239 --loginstall [DIR] Log all files installed from the host to [DIR]
636d2d46
HH
240 --uefi Create an UEFI executable with the kernel cmdline and
241 kernel combined
f3cbff11 242 --no-uefi Disables UEFI mode
636d2d46 243 --uefi-stub [FILE] Use the UEFI stub [FILE] to create an UEFI executable
4237aeb0
DT
244 --uefi-splash-image [FILE]
245 Use [FILE] as a splash image when creating an UEFI
246 executable
636d2d46 247 --kernel-image [FILE] location of the kernel image
cdc9cd0e
RM
248 --regenerate-all Regenerate all initramfs images at the default location
249 for the kernel versions found on the system
ff2d8bdf 250 --version Display version
ccaa9bee
HH
251
252If [LIST] has multiple arguments, then you have to put these in quotes.
ffa71b4a 253
ccaa9bee 254For example:
ffa71b4a
HH
255
256 # dracut --add-drivers "module1 module2" ...
257
cc02093d 258EOF
5616feb0
AT
259}
260
ff2d8bdf 261long_version() {
7310a848 262 [[ $dracutbasedir ]] || dracutbasedir="$dracutsysrootdir"/usr/lib/dracut
ff2d8bdf 263 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
7310a848
HH
264 # shellcheck source=./dracut-version.sh
265 . "$dracutbasedir"/dracut-version.sh
ff2d8bdf
DM
266 fi
267 echo "dracut $DRACUT_VERSION"
268}
269
118ca9ec
TR
270# Fills up host_devs stack variable and makes sure there are no duplicates
271push_host_devs() {
272 local _dev
694725ab 273 for _dev in "$@"; do
7310a848 274 [[ " ${host_devs[*]} " == *" $_dev "* ]] && return
694725ab
HH
275 host_devs+=( "$_dev" )
276 done
8466db96
HH
277}
278
5bc545ed
VL
279# Little helper function for reading args from the commandline.
280# it automatically handles -a b and -a=b variants, and returns 1 if
281# we need to shift $3.
282read_arg() {
283 # $1 = arg name
284 # $2 = arg value
285 # $3 = arg parameter
286 local rematch='^[^=]*=(.*)$'
287 if [[ $2 =~ $rematch ]]; then
7310a848 288 read -r "$1" <<< "${BASH_REMATCH[1]}"
5bc545ed 289 else
7310a848 290 read -r "$1" <<< "$3"
cc02093d
HH
291 # There is no way to shift our callers args, so
292 # return 1 to indicate they should do it instead.
293 return 1
5bc545ed
VL
294 fi
295}
296
dfe2247a
HH
297check_conf_file()
298{
299 if grep -H -e '^[^#]*[+]=\("[^ ]\|.*[^ ]"\)' "$@"; then
300 printf '\ndracut: WARNING: <key>+=" <values> ": <values> should have surrounding white spaces!\n' >&2
301 printf 'dracut: WARNING: This will lead to unwanted side effects! Please fix the configuration file.\n\n' >&2
302 fi
303}
304
335bc217 305dropindirs_sort()
a42b2b81 306{
b093aa2d
HH
307 local suffix=$1; shift
308 local -a files
309 local f d
310
dba20559
HH
311 for d in "$@"; do
312 for i in "$d/"*"$suffix"; do
313 if [[ -e "$i" ]]; then
314 printf "%s\n" "${i##*/}"
315 fi
316 done
317 done | sort -Vu | {
318 readarray -t files
319
320 for f in "${files[@]}"; do
321 for d in "$@"; do
322 if [[ -e "$d/$f" ]]; then
323 printf "%s\n" "$d/$f"
324 continue 2
b093aa2d 325 fi
a42b2b81 326 done
a42b2b81 327 done
dba20559 328 }
a42b2b81
HH
329}
330
659dc319
HB
331rearrange_params()
332{
333 # Workaround -i, --include taking 2 arguments
dcacd2b0
FV
334 newat=()
335 for i in "$@"; do
336 if [[ $i == "-i" ]] || [[ $i == "--include" ]]; then
337 newat+=("++include") # Replace --include by ++include
338 else
339 newat+=("$i")
340 fi
341 done
342 set -- "${newat[@]}" # Set new $@
659dc319
HB
343
344 TEMP=$(unset POSIXLY_CORRECT; getopt \
b552d364 345 -o "a:m:o:d:I:k:c:r:L:fvqlHhMN" \
659dc319
HB
346 --long kver: \
347 --long add: \
348 --long force-add: \
349 --long add-drivers: \
cea907f6 350 --long force-drivers: \
659dc319
HB
351 --long omit-drivers: \
352 --long modules: \
353 --long omit: \
354 --long drivers: \
355 --long filesystems: \
356 --long install: \
54b68829 357 --long install-optional: \
659dc319
HB
358 --long fwdir: \
359 --long libdirs: \
360 --long fscks: \
361 --long add-fstab: \
362 --long mount: \
363 --long device: \
364 --long add-device: \
ae989390 365 --long nofscks \
659dc319
HB
366 --long ro-mnt \
367 --long kmoddir: \
368 --long conf: \
369 --long confdir: \
370 --long tmpdir: \
b552d364 371 --long sysroot: \
659dc319
HB
372 --long stdlog: \
373 --long compress: \
374 --long prefix: \
375 --long rebuild: \
376 --long force \
377 --long kernel-only \
378 --long no-kernel \
379 --long print-cmdline \
380 --long kernel-cmdline: \
381 --long strip \
382 --long nostrip \
659dc319
HB
383 --long hardlink \
384 --long nohardlink \
385 --long noprefix \
386 --long mdadmconf \
387 --long nomdadmconf \
388 --long lvmconf \
389 --long nolvmconf \
390 --long debug \
391 --long profile \
392 --long sshkey: \
393 --long logfile: \
394 --long verbose \
395 --long quiet \
396 --long local \
397 --long hostonly \
398 --long host-only \
399 --long no-hostonly \
400 --long no-host-only \
a695250e 401 --long hostonly-mode: \
646e0506
WC
402 --long hostonly-cmdline \
403 --long no-hostonly-cmdline \
37f2fe55 404 --long no-hostonly-default-device \
659dc319
HB
405 --long persistent-policy: \
406 --long fstab \
407 --long help \
408 --long bzip2 \
409 --long lzma \
410 --long xz \
411 --long lzo \
412 --long lz4 \
7dbadcc7 413 --long zstd \
659dc319
HB
414 --long no-compress \
415 --long gzip \
416 --long list-modules \
417 --long show-modules \
418 --long keep \
419 --long printsize \
420 --long regenerate-all \
421 --long noimageifnotneeded \
422 --long early-microcode \
423 --long no-early-microcode \
80626ded 424 --long reproducible \
10f8df1b 425 --long no-reproducible \
37383f71 426 --long loginstall: \
636d2d46 427 --long uefi \
f3cbff11 428 --long no-uefi \
636d2d46 429 --long uefi-stub: \
4237aeb0 430 --long uefi-splash-image: \
636d2d46 431 --long kernel-image: \
b73e00af
HH
432 --long no-hostonly-i18n \
433 --long hostonly-i18n \
1e92f728 434 --long hostonly-nics: \
5c57209b 435 --long no-machineid \
ff2d8bdf 436 --long version \
659dc319
HB
437 -- "$@")
438
7310a848 439 # shellcheck disable=SC2181
659dc319
HB
440 if (( $? != 0 )); then
441 usage
442 exit 1
443 fi
444}
445
432196ae 446verbosity_mod_l=0
f79e587c
HH
447unset kernel
448unset outfile
486a1b93 449
659dc319
HB
450rearrange_params "$@"
451eval set -- "$TEMP"
452
453# parse command line args to check if '--rebuild' option is present
454unset append_args_l
455unset rebuild_file
456while :
457do
497916e1
ÉR
458 if [ "$1" == "--" ]; then
459 shift; break
460 fi
461 if [ "$1" == "--rebuild" ]; then
462 append_args_l="yes"
7310a848
HH
463 rebuild_file="$2"
464 if [ ! -e "$rebuild_file" ]; then
659dc319
HB
465 echo "Image file '$rebuild_file', for rebuild, does not exist!"
466 exit 1
467 fi
468 abs_rebuild_file=$(readlink -f "$rebuild_file") && rebuild_file="$abs_rebuild_file"
497916e1
ÉR
469 shift; continue
470 fi
471 shift
659dc319
HB
472done
473
474# get output file name and kernel version from command line arguments
475while (($# > 0)); do
476 case ${1%%=*} in
477 ++include)
478 shift 2;;
479 *)
480 if ! [[ ${outfile+x} ]]; then
481 outfile=$1
482 elif ! [[ ${kernel+x} ]]; then
483 kernel=$1
484 else
485 printf "\nUnknown arguments: %s\n\n" "$*" >&2
486 usage; exit 1;
487 fi
488 ;;
489 esac
490 shift
491done
492
493# extract input image file provided with rebuild option to get previous parameters, if any
494if [[ $append_args_l == "yes" ]]; then
495 unset rebuild_param
496
497 # determine resultant file
498 if ! [[ $outfile ]]; then
499 outfile=$rebuild_file
500 fi
501
7310a848 502 if ! rebuild_param=$(lsinitrd "$rebuild_file" '*lib/dracut/build-parameter.txt'); then
659dc319
HB
503 echo "Image '$rebuild_file' has no rebuild information stored"
504 exit 1
505 fi
506
507 # prepend previous parameters to current command line args
508 if [[ $rebuild_param ]]; then
509 TEMP="$rebuild_param $TEMP"
510 eval set -- "$TEMP"
511 rearrange_params "$@"
512 fi
ffa71b4a
HH
513fi
514
659dc319
HB
515unset PARMS_TO_STORE
516PARMS_TO_STORE=""
517
ffa71b4a
HH
518eval set -- "$TEMP"
519
520while :; do
7310a848 521 if [[ $1 != "--" ]] && [[ $1 != "--rebuild" ]]; then
659dc319
HB
522 PARMS_TO_STORE+=" $1";
523 fi
ffa71b4a 524 case $1 in
5a66d511
HH
525 --kver) kernel="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
526 -a|--add) add_dracutmodules_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
527 --force-add) force_add_dracutmodules_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
528 --add-drivers) add_drivers_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
529 --force-drivers) force_drivers_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
530 --omit-drivers) omit_drivers_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
531 -m|--modules) dracutmodules_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
532 -o|--omit) omit_dracutmodules_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
533 -d|--drivers) drivers_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
534 --filesystems) filesystems_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
535 -I|--install) install_items_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
536 --install-optional) install_optional_items_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
537 --fwdir) fw_dir_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
538 --libdirs) libdirs_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
539 --fscks) fscks_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
540 --add-fstab) add_fstab_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
541 --mount) fstab_lines+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
542 --add-device|--device) add_device_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
543 --kernel-cmdline) kernel_cmdline_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
25b45979 544 --nofscks) nofscks_l="yes";;
ff3953ef 545 --ro-mnt) ro_mnt_l="yes";;
659dc319
HB
546 -k|--kmoddir) drivers_dir_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
547 -c|--conf) conffile="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
548 --confdir) confdir="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
549 --tmpdir) tmpdir_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
b552d364 550 -r|--sysroot) sysroot_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
659dc319
HB
551 -L|--stdlog) stdloglvl_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
552 --compress) compress_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
553 --prefix) prefix_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
37383f71 554 --loginstall) loginstall_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
7310a848 555 --rebuild) if [[ $rebuild_file == "$outfile" ]]; then
659dc319
HB
556 force=yes
557 fi
558 shift
559 ;;
cc02093d
HH
560 -f|--force) force=yes;;
561 --kernel-only) kernel_only="yes"; no_kernel="no";;
562 --no-kernel) kernel_only="no"; no_kernel="yes";;
ab9457ef
HH
563 --print-cmdline)
564 print_cmdline="yes"; hostonly_l="yes"; kernel_only="yes"; no_kernel="yes";;
565 --early-microcode)
566 early_microcode_l="yes";;
567 --no-early-microcode)
568 early_microcode_l="no";;
cc02093d
HH
569 --strip) do_strip_l="yes";;
570 --nostrip) do_strip_l="no";;
04d18f55
HH
571 --hardlink) do_hardlink_l="yes";;
572 --nohardlink) do_hardlink_l="no";;
fd786adc 573 --noprefix) prefix_l="/";;
690396a5
VL
574 --mdadmconf) mdadmconf_l="yes";;
575 --nomdadmconf) mdadmconf_l="no";;
576 --lvmconf) lvmconf_l="yes";;
577 --nolvmconf) lvmconf_l="no";;
cc02093d 578 --debug) debug="yes";;
57258a2c 579 --profile) profile="yes";;
659dc319 580 --sshkey) sshkey="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
ee54b840 581 --logfile) logfile_l="$2"; shift;;
432196ae
582 -v|--verbose) ((verbosity_mod_l++));;
583 -q|--quiet) ((verbosity_mod_l--));;
dbf8f6ba
HH
584 -l|--local)
585 allowlocal="yes"
777f2db0 586 [[ -f "$(readlink -f "${0%/*}")/dracut-init.sh" ]] \
b093aa2d 587 && dracutbasedir="$(readlink -f "${0%/*}")"
dbf8f6ba 588 ;;
ea3c4e82
HH
589 -H|--hostonly|--host-only)
590 hostonly_l="yes" ;;
591 -N|--no-hostonly|--no-host-only)
592 hostonly_l="no" ;;
a695250e
KS
593 --hostonly-mode)
594 hostonly_mode_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
ab9457ef
HH
595 --hostonly-cmdline)
596 hostonly_cmdline_l="yes" ;;
b73e00af
HH
597 --hostonly-i18n)
598 i18n_install_all_l="no" ;;
1e92f728
KS
599 --hostonly-nics)
600 hostonly_nics_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
b73e00af
HH
601 --no-hostonly-i18n)
602 i18n_install_all_l="yes" ;;
ab9457ef
HH
603 --no-hostonly-cmdline)
604 hostonly_cmdline_l="no" ;;
37f2fe55
XP
605 --no-hostonly-default-device)
606 hostonly_default_device="no" ;;
324ea606 607 --persistent-policy)
659dc319 608 persistent_policy_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
cc02093d 609 --fstab) use_fstab_l="yes" ;;
ffa71b4a 610 -h|--help) long_usage; exit 1 ;;
5a66d511 611 -i|--include) include_src+=("$2"); PARMS_TO_STORE+=" '$2'";
ffa71b4a 612 shift;;
3a714439
VL
613 --bzip2) compress_l="bzip2";;
614 --lzma) compress_l="lzma";;
615 --xz) compress_l="xz";;
871c8e40 616 --lzo) compress_l="lzo";;
617 --lz4) compress_l="lz4";;
7dbadcc7 618 --zstd) compress_l="zstd";;
3a714439
VL
619 --no-compress) _no_compress_l="cat";;
620 --gzip) compress_l="gzip";;
ffa71b4a 621 --list-modules) do_list="yes";;
956af8f2
622 -M|--show-modules)
623 show_modules_l="yes"
624 ;;
5fe5c7d0 625 --keep) keep="yes";;
ec3c5951 626 --printsize) printsize="yes";;
7d848c55 627 --regenerate-all) regenerate_all="yes";;
83bb0893 628 --noimageifnotneeded) noimageifnotneeded="yes";;
80626ded 629 --reproducible) reproducible_l="yes";;
10f8df1b 630 --no-reproducible) reproducible_l="no";;
f3cbff11
V
631 --uefi) uefi_l="yes";;
632 --no-uefi) uefi_l="no";;
636d2d46
HH
633 --uefi-stub)
634 uefi_stub_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
4237aeb0
DT
635 --uefi-splash-image)
636 uefi_splash_image_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
636d2d46
HH
637 --kernel-image)
638 kernel_image_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
5c57209b
HH
639 --no-machineid)
640 machine_id_l="no";;
ff2d8bdf 641 --version) long_version; exit 1 ;;
ffa71b4a
HH
642 --) shift; break;;
643
644 *) # should not even reach this point
645 printf "\n!Unknown option: '%s'\n\n" "$1" >&2; usage; exit 1;;
646 esac
647 shift
648done
649
650# getopt cannot handle multiple arguments, so just handle "-I,--include"
651# the old fashioned way
652
653while (($# > 0)); do
4eec1a22 654 if [ "${1%%=*}" == "++include" ]; then
5a66d511
HH
655 include_src+=("$2")
656 include_target+=("$3")
659dc319
HB
657 PARMS_TO_STORE+=" --include '$2' '$3'"
658 shift 2
659 fi
b368a5f3 660 shift
641cc356 661done
ffa71b4a 662
b552d364
BZ
663[[ $sysroot_l ]] && dracutsysrootdir="$sysroot_l"
664
7d848c55
HH
665if [[ $regenerate_all == "yes" ]]; then
666 ret=0
667 if [[ $kernel ]]; then
b093aa2d 668 printf -- "--regenerate-all cannot be called with a kernel version\n" >&2
7d848c55
HH
669 exit 1
670 fi
671
672 if [[ $outfile ]]; then
b093aa2d 673 printf -- "--regenerate-all cannot be called with a image file\n" >&2
7d848c55
HH
674 exit 1
675 fi
676
677 ((len=${#dracut_args[@]}))
678 for ((i=0; i < len; i++)); do
679 [[ ${dracut_args[$i]} == "--regenerate-all" ]] && \
6dc1cd05 680 unset "dracut_args[$i]"
7d848c55
HH
681 done
682
6dc1cd05 683 cd "$dracutsysrootdir"/lib/modules || exit 1
7d848c55 684 for i in *; do
b29cb516 685 [[ -f $i/modules.dep ]] || [[ -f $i/modules.dep.bin ]] || continue
e8f19bcf 686 "$dracut_cmd" --kver="$i" "${dracut_args[@]}"
7d848c55
HH
687 ((ret+=$?))
688 done
6dc1cd05 689 exit "$ret"
7d848c55
HH
690fi
691
8a5354a9 692if ! [[ $kernel ]]; then
486a1b93
HH
693 kernel=$(uname -r)
694fi
ffa71b4a 695
02b5c8e3
HH
696export LC_ALL=C
697export LANG=C
8a32bf61
HH
698unset LC_MESSAGES
699unset LC_CTYPE
d619fb5e 700unset LD_LIBRARY_PATH
45404a2a 701unset LD_PRELOAD
1fcf2d2f 702unset GREP_OPTIONS
a55711cd 703
89d44e72 704export DRACUT_LOG_LEVEL=warning
3b403b32 705[[ $debug ]] && {
89d44e72 706 export DRACUT_LOG_LEVEL=debug
c36ce334
VL
707 export PS4='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): ';
708 set -x
709}
710
57258a2c
HH
711[[ $profile ]] && {
712 export PS4='+ $(date "+%s.%N") ${BASH_SOURCE}@${LINENO}: ';
713 set -x
714 debug=yes
715}
716
6dc1cd05 717[[ $dracutbasedir ]] || dracutbasedir="$dracutsysrootdir"/usr/lib/dracut
5d791c0e 718
f1336ac7 719# if we were not passed a config file, try the default one
42c71947 720if [[ ! -f $conffile ]]; then
b093aa2d
HH
721 if [[ $allowlocal ]]; then
722 conffile="$dracutbasedir/dracut.conf"
723 else
a0120420 724 conffile="$dracutsysrootdir/etc/dracut.conf"
b093aa2d 725 fi
42c71947 726fi
f1336ac7 727
2c2c4580 728if [[ ! -d $confdir ]]; then
b093aa2d
HH
729 if [[ $allowlocal ]]; then
730 confdir="$dracutbasedir/dracut.conf.d"
731 else
a0120420 732 confdir="$dracutsysrootdir/etc/dracut.conf.d"
b093aa2d 733 fi
2c2c4580
HH
734fi
735
2245f372 736# source our config file
dfe2247a
HH
737if [[ -f $conffile ]]; then
738 check_conf_file "$conffile"
6dc1cd05 739 # shellcheck disable=SC1090
dfe2247a
HH
740 . "$conffile"
741fi
2245f372 742
2c2c4580 743# source our config dir
335bc217 744for f in $(dropindirs_sort ".conf" "$confdir" "$dracutbasedir/dracut.conf.d"); do
dfe2247a 745 check_conf_file "$f"
6dc1cd05 746 # shellcheck disable=SC1090
a42b2b81
HH
747 [[ -e $f ]] && . "$f"
748done
2c2c4580 749
5f2baf7d 750DRACUT_PATH=${DRACUT_PATH:-/sbin /bin /usr/sbin /usr/bin}
eab9b75c
HH
751
752for i in $DRACUT_PATH; do
753 rl=$i
a0120420 754 if [ -L "$dracutsysrootdir$i" ]; then
6dc1cd05 755 rl=$(readlink -f "$dracutsysrootdir$i")
eab9b75c 756 fi
bbe1434f 757 rl="${rl#$dracutsysrootdir}"
eab9b75c
HH
758 if [[ "$NPATH" != *:$rl* ]] ; then
759 NPATH+=":$rl"
760 fi
761done
bbe1434f 762[[ -z "$dracutsysrootdir" ]] && export PATH="${NPATH#:}"
eab9b75c
HH
763unset NPATH
764
18d36fab
ZB
765export SYSTEMCTL=${SYSTEMCTL:-systemctl}
766
cb0913db 767# these options add to the stuff in the config file
6dc1cd05
HH
768(( ${#add_dracutmodules_l[@]} )) && add_dracutmodules+=" ${add_dracutmodules_l[*]} "
769(( ${#force_add_dracutmodules_l[@]} )) && force_add_dracutmodules+=" ${force_add_dracutmodules_l[*]} "
770(( ${#fscks_l[@]} )) && fscks+=" ${fscks_l[*]} "
771(( ${#add_fstab_l[@]} )) && add_fstab+=" ${add_fstab_l[*]} "
772# shellcheck disable=SC2154
cb0913db 773(( ${#fstab_lines_l[@]} )) && fstab_lines+=( "${fstab_lines_l[@]}" )
6dc1cd05
HH
774(( ${#install_items_l[@]} )) && install_items+=" ${install_items_l[*]} "
775(( ${#install_optional_items_l[@]} )) && install_optional_items+=" ${install_optional_items_l[*]} "
776(( ${#hostonly_nics_l[@]} )) && hostonly_nics+=" ${hostonly_nics_l[*]} "
54b68829 777
f1336ac7 778# these options override the stuff in the config file
6dc1cd05
HH
779(( ${#dracutmodules_l[@]} )) && dracutmodules="${dracutmodules_l[*]}"
780(( ${#omit_dracutmodules_l[@]} )) && omit_dracutmodules="${omit_dracutmodules_l[*]}"
781(( ${#filesystems_l[@]} )) && filesystems="${filesystems_l[*]}"
782(( ${#fw_dir_l[@]} )) && fw_dir="${fw_dir_l[*]}"
783(( ${#libdirs_l[@]} ))&& libdirs="${libdirs_l[*]}"
c9143a63 784
e103615b 785[[ $stdloglvl_l ]] && stdloglvl=$stdloglvl_l
b991617f 786[[ ! $stdloglvl ]] && stdloglvl=4
432196ae
787stdloglvl=$((stdloglvl + verbosity_mod_l))
788((stdloglvl > 6)) && stdloglvl=6
789((stdloglvl < 0)) && stdloglvl=0
790
26537a5b 791[[ $drivers_dir_l ]] && drivers_dir=$drivers_dir_l
31f7db66 792[[ $do_strip_l ]] && do_strip=$do_strip_l
6c128565 793[[ $do_strip ]] || do_strip=yes
04d18f55
HH
794[[ $do_hardlink_l ]] && do_hardlink=$do_hardlink_l
795[[ $do_hardlink ]] || do_hardlink=yes
fd786adc
HH
796[[ $prefix_l ]] && prefix=$prefix_l
797[[ $prefix = "/" ]] && unset prefix
ba726310 798[[ $hostonly_l ]] && hostonly=$hostonly_l
ab9457ef 799[[ $hostonly_cmdline_l ]] && hostonly_cmdline=$hostonly_cmdline_l
a695250e 800[[ $hostonly_mode_l ]] && hostonly_mode=$hostonly_mode_l
30f6c80d 801[[ "$hostonly" == "yes" ]] && ! [[ $hostonly_cmdline ]] && hostonly_cmdline="yes"
6dc1cd05 802# shellcheck disable=SC2034
b73e00af 803[[ $i18n_install_all_l ]] && i18n_install_all=$i18n_install_all_l
6dc1cd05 804# shellcheck disable=SC2034
3411ad66 805[[ $persistent_policy_l ]] && persistent_policy=$persistent_policy_l
7c179686 806[[ $use_fstab_l ]] && use_fstab=$use_fstab_l
2f02ae9d 807[[ $mdadmconf_l ]] && mdadmconf=$mdadmconf_l
7a34efa5 808[[ $lvmconf_l ]] && lvmconf=$lvmconf_l
6dc1cd05 809[[ $dracutbasedir ]] || dracutbasedir="$dracutsysrootdir"/usr/lib/dracut
a0120420 810[[ $fw_dir ]] || fw_dir="$dracutsysrootdir/lib/firmware/updates:$dracutsysrootdir/lib/firmware:$dracutsysrootdir/lib/firmware/$kernel"
882c4c5a 811[[ $tmpdir_l ]] && tmpdir="$tmpdir_l"
97a931c7 812[[ $tmpdir ]] || tmpdir="$TMPDIR"
6dc1cd05 813[[ $tmpdir ]] || tmpdir="$dracutsysrootdir"/var/tmp
871c8e40 814[[ $INITRD_COMPRESS ]] && compress=$INITRD_COMPRESS
3a714439 815[[ $compress_l ]] && compress=$compress_l
956af8f2 816[[ $show_modules_l ]] && show_modules=$show_modules_l
25b45979 817[[ $nofscks_l ]] && nofscks="yes"
ff3953ef 818[[ $ro_mnt_l ]] && ro_mnt="yes"
b7c770e1 819[[ $early_microcode_l ]] && early_microcode=$early_microcode_l
b25ef46f 820[[ $early_microcode ]] || early_microcode=yes
d613d88d
JW
821[[ $early_microcode_image_dir ]] || early_microcode_image_dir=('/boot')
822[[ $early_microcode_image_name ]] || \
823 early_microcode_image_name=('intel-uc.img' 'intel-ucode.img' 'amd-uc.img' 'amd-ucode.img' 'early_ucode.cpio' 'microcode.cpio')
ee54b840 824[[ $logfile_l ]] && logfile="$logfile_l"
80626ded 825[[ $reproducible_l ]] && reproducible="$reproducible_l"
37383f71 826[[ $loginstall_l ]] && loginstall="$loginstall_l"
f3cbff11 827[[ $uefi_l ]] && uefi=$uefi_l
636d2d46 828[[ $uefi_stub_l ]] && uefi_stub="$uefi_stub_l"
4237aeb0 829[[ $uefi_splash_image_l ]] && uefi_splash_image="$uefi_splash_image_l"
636d2d46 830[[ $kernel_image_l ]] && kernel_image="$kernel_image_l"
5c57209b
HH
831[[ $machine_id_l ]] && machine_id="$machine_id_l"
832
833if ! [[ $outfile ]]; then
834 if [[ $machine_id != "no" ]]; then
6dc1cd05 835 [[ -f "$dracutsysrootdir"/etc/machine-id ]] && read -r MACHINE_ID < "$dracutsysrootdir"/etc/machine-id
5c57209b
HH
836 fi
837
838 if [[ $uefi == "yes" ]]; then
6dc1cd05 839 # shellcheck disable=SC2154
5a962b59
MR
840 if [[ -n "$uefi_secureboot_key" && -z "$uefi_secureboot_cert" ]] || [[ -z $uefi_secureboot_key && -n $uefi_secureboot_cert ]]; then
841 dfatal "Need 'uefi_secureboot_key' and 'uefi_secureboot_cert' both to be set."
842 exit 1
843 fi
844
6dc1cd05 845 if [[ -n "$uefi_secureboot_key" && -n "$uefi_secureboot_cert" ]] && ! command -v sbsign &>/dev/null; then
5a962b59
MR
846 dfatal "Need 'sbsign' to create a signed UEFI executable"
847 exit 1
848 fi
849
6dc1cd05 850 BUILD_ID=$(cat "$dracutsysrootdir"/etc/os-release "$dracutsysrootdir"/usr/lib/os-release \
3a12309c
DM
851 | while read -r line || [[ $line ]]; do \
852 [[ $line =~ BUILD_ID\=* ]] && eval "$line" && echo "$BUILD_ID" && break; \
853 done)
854 if [[ -z $dracutsysrootdir ]]; then
855 if [[ -d /efi ]] && mountpoint -q /efi; then
856 efidir=/efi/EFI
a0120420
BZ
857 else
858 efidir=/boot/EFI
859 if [[ -d $dracutsysrootdir/boot/efi/EFI ]]; then
860 efidir=/boot/efi/EFI
861 fi
862 fi
5c57209b 863 else
3a12309c
DM
864 efidir=/boot/EFI
865 if [[ -d $dracutsysrootdir/boot/efi/EFI ]]; then
866 efidir=/boot/efi/EFI
867 fi
5c57209b 868 fi
3a12309c
DM
869 mkdir -p "$dracutsysrootdir$efidir/Linux"
870 outfile="$dracutsysrootdir$efidir/Linux/linux-$kernel${MACHINE_ID:+-${MACHINE_ID}}${BUILD_ID:+-${BUILD_ID}}.efi"
5c57209b 871 else
6dc1cd05 872 if [[ -e $dracutsysrootdir/boot/vmlinuz-$kernel ]]; then
791d8016 873 outfile="/boot/initramfs-$kernel.img"
6dc1cd05 874 elif [[ $MACHINE_ID ]] && { [[ -d $dracutsysrootdir/boot/${MACHINE_ID} ]] || [[ -L $dracutsysrootdir/boot/${MACHINE_ID} ]] ;}; then
a0120420 875 outfile="$dracutsysrootdir/boot/${MACHINE_ID}/$kernel/initrd"
5c57209b 876 else
a0120420 877 outfile="$dracutsysrootdir/boot/initramfs-$kernel.img"
5c57209b
HH
878 fi
879 fi
880fi
80626ded 881
ddfd1d10 882# eliminate IFS hackery when messing with fw_dir
794b2d2c 883export DRACUT_FIRMWARE_PATH=${fw_dir// /:}
ddfd1d10 884fw_dir=${fw_dir//:/ }
9a8a00cf 885
3838dc47 886# check for logfile and try to create one if it doesn't exist
6dc1cd05
HH
887if [[ -n "$logfile" ]]; then
888 if [[ ! -f "$logfile" ]]; then
889 if touch "$logfile"; then
3838dc47 890 printf "%s\n" "dracut: touch $logfile failed." >&2
891 fi
892 fi
893fi
894
3a714439 895# handle compression options.
a0120420
BZ
896DRACUT_COMPRESS_BZIP2=${DRACUT_COMPRESS_BZIP2:-bzip2}
897DRACUT_COMPRESS_LBZIP2=${DRACUT_COMPRESS_LBZIP2:-lbzip2}
898DRACUT_COMPRESS_LZMA=${DRACUT_COMPRESS_LZMA:-lzma}
899DRACUT_COMPRESS_XZ=${DRACUT_COMPRESS_XZ:-xz}
900DRACUT_COMPRESS_GZIP=${DRACUT_COMPRESS_GZIP:-gzip}
901DRACUT_COMPRESS_PIGZ=${DRACUT_COMPRESS_PIGZ:-pigz}
902DRACUT_COMPRESS_LZOP=${DRACUT_COMPRESS_LZOP:-lzop}
903DRACUT_COMPRESS_ZSTD=${DRACUT_COMPRESS_ZSTD:-zstd}
904DRACUT_COMPRESS_LZ4=${DRACUT_COMPRESS_LZ4:-lz4}
905DRACUT_COMPRESS_CAT=${DRACUT_COMPRESS_CAT:-cat}
906
907if [[ $_no_compress_l = "$DRACUT_COMPRESS_CAT" ]]; then
908 compress="$DRACUT_COMPRESS_CAT"
693b7a32
HH
909fi
910
911if ! [[ $compress ]]; then
912 # check all known compressors, if none specified
a0120420 913 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 $OMPRESS_BZIP2 $DRACUT_COMPRESS_CAT; do
693b7a32
HH
914 command -v "$i" &>/dev/null || continue
915 compress="$i"
916 break
917 done
918 if [[ $compress = cat ]]; then
919 printf "%s\n" "dracut: no compression tool available. Initramfs image is going to be big." >&2
920 fi
921fi
922
923# choose the right arguments for the compressor
3a714439 924case $compress in
693b7a32 925 bzip2|lbzip2)
6dc1cd05 926 if [[ "$compress" = lbzip2 ]] || command -v "$DRACUT_COMPRESS_LBZIP2" &>/dev/null; then
a0120420 927 compress="$DRACUT_COMPRESS_LBZIP2 -9"
693b7a32 928 else
a0120420 929 compress="$DRACUT_COMPRESS_BZIP2 -9"
693b7a32
HH
930 fi
931 ;;
932 lzma)
a0120420 933 compress="$DRACUT_COMPRESS_LZMA -9 -T0"
693b7a32
HH
934 ;;
935 xz)
a0120420 936 compress="$DRACUT_COMPRESS_XZ --check=crc32 --lzma2=dict=1MiB -T0"
693b7a32
HH
937 ;;
938 gzip|pigz)
dd8ff531 939 if [[ "$compress" = pigz ]] || command -v "$DRACUT_COMPRESS_PIGZ" &>/dev/null; then
a0120420
BZ
940 compress="$DRACUT_COMPRESS_PIGZ -9 -n -T -R"
941 elif command -v gzip &>/dev/null && $DRACUT_COMPRESS_GZIP --help 2>&1 | grep -q rsyncable; then
942 compress="$DRACUT_COMPRESS_GZIP -n -9 --rsyncable"
693b7a32 943 else
a0120420 944 compress="$DRACUT_COMPRESS_GZIP -n -9"
66fd7e43
HH
945 fi
946 ;;
693b7a32 947 lzo|lzop)
a0120420 948 compress="$DRACUT_COMPRESS_LZOP -9"
693b7a32
HH
949 ;;
950 lz4)
a0120420 951 compress="$DRACUT_COMPRESS_LZ4 -l -9"
693b7a32 952 ;;
7dbadcc7 953 zstd)
a0120420 954 compress="$DRACUT_COMPRESS_ZSTD -15 -q -T0"
7dbadcc7 955 ;;
3a714439 956esac
3a714439 957
ba726310 958[[ $hostonly = yes ]] && hostonly="-h"
ba67b923 959[[ $hostonly != "-h" ]] && unset hostonly
ba726310 960
a695250e
KS
961case $hostonly_mode in
962 '')
963 [[ $hostonly ]] && hostonly_mode="sloppy" ;;
964 sloppy|strict)
965 if [[ ! $hostonly ]]; then
966 unset hostonly_mode
967 fi
968 ;;
969 *)
970 printf "%s\n" "dracut: Invalid hostonly mode '$hostonly_mode'." >&2
971 exit 1
972esac
973
80626ded
HH
974[[ $reproducible == yes ]] && DRACUT_REPRODUCIBLE=1
975
f668e717
DC
976case "${drivers_dir}" in
977 ''|*lib/modules/${kernel}|*lib/modules/${kernel}/) ;;
978 *)
979 [[ "$DRACUT_KMODDIR_OVERRIDE" ]] || {
497916e1
ÉR
980 printf "%s\n" "dracut: -k/--kmoddir path must contain \"lib/modules\" as a parent of your kernel module directory,"
981 printf "%s\n" "dracut: or modules may not be placed in the correct location inside the initramfs."
982 printf "%s\n" "dracut: was given: ${drivers_dir}"
dd8ff531 983 printf "%s\n" "dracut: expected: $(dirname "${drivers_dir}")/lib/modules/${kernel}"
497916e1
ÉR
984 printf "%s\n" "dracut: Please move your modules into the correct directory structure and pass the new location,"
985 printf "%s\n" "dracut: or set DRACUT_KMODDIR_OVERRIDE=1 to ignore this check."
986 exit 1
987 }
988 ;;
f668e717
DC
989esac
990
bafc82e7
DD
991readonly TMPDIR="$(realpath -e "$tmpdir")"
992[ -d "$TMPDIR" ] || {
993 printf "%s\n" "dracut: Invalid tmpdir '$tmpdir'." >&2
994 exit 1
995}
ecbdff68
TM
996
997if findmnt --raw -n --target "$tmpdir" --output=options | grep -q noexec; then
998 [[ $debug == yes ]] && printf "%s\n" "dracut: Tmpdir '$tmpdir' is mounted with 'noexec'."
999 noexec=1
1000fi
1001
62c00a88
HH
1002readonly DRACUT_TMPDIR="$(mktemp -p "$TMPDIR/" -d -t dracut.XXXXXX)"
1003[ -d "$DRACUT_TMPDIR" ] || {
1004 printf "%s\n" "dracut: mktemp -p '$TMPDIR/' -d -t dracut.XXXXXX failed." >&2
26c231f1
HH
1005 exit 1
1006}
1007
d008b6b8 1008# clean up after ourselves no matter how we die.
bbaa0d59
HH
1009trap '
1010 ret=$?;
62c00a88 1011 [[ $keep ]] && echo "Not removing $DRACUT_TMPDIR." >&2 || { [[ $DRACUT_TMPDIR ]] && rm -rf -- "$DRACUT_TMPDIR"; };
bbaa0d59
HH
1012 exit $ret;
1013 ' EXIT
1014
d008b6b8
HH
1015# clean up after ourselves no matter how we die.
1016trap 'exit 1;' SIGINT
1017
3889234f
HH
1018readonly initdir="${DRACUT_TMPDIR}/initramfs"
1019mkdir "$initdir"
1020
dd8ff531
HH
1021# shellcheck disable=SC2154
1022if [[ $early_microcode = yes ]] || { [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]] ;}; then
3889234f
HH
1023 readonly early_cpio_dir="${DRACUT_TMPDIR}/earlycpio"
1024 mkdir "$early_cpio_dir"
1025fi
1026
dd8ff531 1027[[ "$dracutsysrootdir" ]] || [[ "$noexec" ]] || export DRACUT_RESOLVE_LAZY="1"
89d44e72 1028
535f61ca
HH
1029if [[ $print_cmdline ]]; then
1030 stdloglvl=0
1031 sysloglvl=0
1032 fileloglvl=0
1033 kmsgloglvl=0
1034fi
1035
e27ecc9a 1036if [[ -f $dracutbasedir/dracut-version.sh ]]; then
dd8ff531
HH
1037 # shellcheck source=./dracut-version.sh
1038 . "$dracutbasedir"/dracut-version.sh
e27ecc9a
HH
1039fi
1040
777f2db0 1041if [[ -f $dracutbasedir/dracut-init.sh ]]; then
dd8ff531
HH
1042 # shellcheck source=./dracut-init.sh
1043 . "$dracutbasedir"/dracut-init.sh
adbc8a42 1044else
777f2db0 1045 printf "%s\n" "dracut: Cannot find $dracutbasedir/dracut-init.sh." >&2
b093aa2d 1046 printf "%s\n" "dracut: Are you running from a git checkout?" >&2
e8f19bcf 1047 printf "%s\n" "dracut: Try passing -l as an argument to $dracut_cmd" >&2
cc02093d 1048 exit 1
adbc8a42 1049fi
22fd1627 1050
dd8ff531 1051# shellcheck disable=SC2154
106255af
HH
1052if [[ $no_kernel != yes ]] && ! [[ -d $srcmods ]]; then
1053 printf "%s\n" "dracut: Cannot find module directory $srcmods" >&2
1054 printf "%s\n" "dracut: and --no-kernel was not specified" >&2
1055 exit 1
1056fi
1057
1743473b 1058if ! [[ $print_cmdline ]]; then
dd8ff531 1059 inst "$DRACUT_TESTBIN"
a0120420 1060 if ! $DRACUT_INSTALL ${initdir:+-D "$initdir"} ${dracutsysrootdir:+-r "$dracutsysrootdir"} -R "$DRACUT_TESTBIN" &>/dev/null; then
1743473b
HH
1061 unset DRACUT_RESOLVE_LAZY
1062 export DRACUT_RESOLVE_DEPS=1
1063 fi
dd8ff531 1064 rm -fr -- "${initdir:?}"/*
bfd2e8c2 1065fi
bfd2e8c2 1066
552ecca6 1067dracutfunctions=$dracutbasedir/dracut-functions.sh
5cad5bb5 1068export dracutfunctions
9a8a00cf 1069
dd8ff531 1070(( ${#drivers_l[@]} )) && drivers="${drivers_l[*]}"
fcbcb252
HH
1071drivers=${drivers/-/_}
1072
dd8ff531 1073(( ${#add_drivers_l[@]} )) && add_drivers+=" ${add_drivers_l[*]} "
fcbcb252
HH
1074add_drivers=${add_drivers/-/_}
1075
dd8ff531 1076(( ${#force_drivers_l[@]} )) && force_drivers+=" ${force_drivers_l[*]} "
cea907f6
TR
1077force_drivers=${force_drivers/-/_}
1078
dd8ff531 1079(( ${#omit_drivers_l[@]} )) && omit_drivers+=" ${omit_drivers_l[*]} "
fcbcb252
HH
1080omit_drivers=${omit_drivers/-/_}
1081
dd8ff531 1082(( ${#kernel_cmdline_l[@]} )) && kernel_cmdline+=" ${kernel_cmdline_l[*]} "
d20fb951 1083
34248c92 1084omit_drivers_corrected=""
fcbcb252 1085for d in $omit_drivers; do
b093aa2d 1086 [[ " $drivers $add_drivers " == *\ $d\ * ]] && continue
cea907f6 1087 [[ " $drivers $force_drivers " == *\ $d\ * ]] && continue
34248c92 1088 omit_drivers_corrected+="$d|"
fcbcb252 1089done
34248c92 1090omit_drivers="${omit_drivers_corrected%|}"
fcbcb252
HH
1091unset omit_drivers_corrected
1092
ffa71b4a
HH
1093# prepare args for logging
1094for ((i=0; i < ${#dracut_args[@]}; i++)); do
b093aa2d 1095 [[ "${dracut_args[$i]}" == *\ * ]] && \
ffa71b4a 1096 dracut_args[$i]="\"${dracut_args[$i]}\""
a4210166 1097 #" keep vim happy
ffa71b4a 1098done
535f61ca 1099
dd8ff531 1100dinfo "Executing: $dracut_cmd ${dracut_args[*]}"
58dad702 1101
5b11bb73 1102[[ $do_list = yes ]] && {
dd8ff531 1103 for mod in "$dracutbasedir"/modules.d/*; do
5b11bb73 1104 [[ -d $mod ]] || continue;
d8e8e14e
1105 [[ -e $mod/install || -e $mod/installkernel || \
1106 -e $mod/module-setup.sh ]] || continue
b093aa2d 1107 printf "%s\n" "${mod##*/??}"
5b11bb73
HH
1108 done
1109 exit 0
1110}
1111
66ac3cd1 1112# This is kinda legacy -- eventually it should go away.
f1336ac7 1113case $dracutmodules in
66ac3cd1 1114 ""|auto) dracutmodules="all" ;;
f1336ac7 1115esac
e12aac5e 1116
454771cd 1117abs_outfile=$(readlink -f "$outfile") && outfile="$abs_outfile"
ec9315e5 1118
c8b35bf9 1119
9d88e893 1120[[ -d $dracutsysrootdir$systemdutildir ]] \
c8b35bf9
ДГ
1121 || systemdutildir=$(pkg-config systemd --variable=systemdutildir 2>/dev/null)
1122
dd8ff531 1123if ! [[ -d $dracutsysrootdir$systemdutildir ]]; then
9d88e893
BZ
1124 [[ -e $dracutsysrootdir/lib/systemd/systemd-udevd ]] && systemdutildir=/lib/systemd
1125 [[ -e $dracutsysrootdir/usr/lib/systemd/systemd-udevd ]] && systemdutildir=/usr/lib/systemd
c8b35bf9
ДГ
1126fi
1127
939b7e11
JG
1128[[ -d $dracutsysrootdir$systemdutilconfdir ]] \
1129 || systemdutilconfdir=$(pkg-config systemd --variable=systemdutilconfdir 2>/dev/null)
1130
dd8ff531 1131[[ -d $dracutsysrootdir$systemdutilconfdir ]] || systemdutilconfdir=/etc/systemd
c8b35bf9 1132
693b7a32
HH
1133if [[ $no_kernel != yes ]] && [[ -d $srcmods ]]; then
1134 if ! [[ -f $srcmods/modules.dep ]]; then
b019952f
HH
1135 if [[ -n "$(find "$srcmods" -name '*.ko*')" ]]; then
1136 dfatal "$srcmods/modules.dep is missing. Did you run depmod?"
1137 exit 1
1138 else
1139 dwarn "$srcmods/modules.dep is missing. Did you run depmod?"
1140 fi
693b7a32 1141 elif ! ( command -v gzip &>/dev/null && command -v xz &>/dev/null); then
dd8ff531 1142 read -r _mod < "$srcmods"/modules.dep
693b7a32
HH
1143 _mod=${_mod%%:*}
1144 if [[ -f $srcmods/"$_mod" ]]; then
1145 # Check, if kernel modules are compressed, and if we can uncompress them
1146 case "$_mod" in
1147 *.ko.gz) kcompress=gzip;;
1148 *.ko.xz) kcompress=xz;;
1149 esac
1150 if [[ $kcompress ]]; then
1151 if ! command -v "$kcompress" &>/dev/null; then
1152 dfatal "Kernel modules are compressed with $kcompress, but $kcompress is not available."
1153 exit 1
1154 fi
1155 fi
1156 fi
1157 fi
5db6ca5a 1158fi
fe1484f3 1159
96cf7270
HH
1160if [[ ! $print_cmdline ]]; then
1161 if [[ -f $outfile && ! $force ]]; then
1162 dfatal "Will not override existing initramfs ($outfile) without --force"
1163 exit 1
1164 fi
1165
1166 outdir=${outfile%/*}
1167 [[ $outdir ]] || outdir="/"
1168
1169 if [[ ! -d "$outdir" ]]; then
1170 dfatal "Can't write to $outdir: Directory $outdir does not exist or is not accessible."
1171 exit 1
1172 elif [[ ! -w "$outdir" ]]; then
1173 dfatal "No permission to write to $outdir."
1174 exit 1
1175 elif [[ -f "$outfile" && ! -w "$outfile" ]]; then
1176 dfatal "No permission to write $outfile."
1177 exit 1
1178 fi
37383f71
HH
1179
1180 if [[ $loginstall ]]; then
1181 if ! mkdir -p "$loginstall"; then
1182 dfatal "Could not create directory to log installed files to '$loginstall'."
1183 exit 1
1184 fi
1185 loginstall=$(readlink -f "$loginstall")
1186 fi
636d2d46
HH
1187
1188 if [[ $uefi = yes ]]; then
1189 if ! command -v objcopy &>/dev/null; then
1190 dfatal "Need 'objcopy' to create a UEFI executable"
1191 exit 1
1192 fi
1193 unset EFI_MACHINE_TYPE_NAME
12f023ab 1194 case $(uname -m) in
636d2d46
HH
1195 x86_64)
1196 EFI_MACHINE_TYPE_NAME=x64;;
63b05a8e 1197 i?86)
636d2d46
HH
1198 EFI_MACHINE_TYPE_NAME=ia32;;
1199 *)
12f023ab 1200 dfatal "Architecture '$(uname -m)' not supported to create a UEFI executable"
636d2d46
HH
1201 exit 1
1202 ;;
1203 esac
1204
1205 if ! [[ -s $uefi_stub ]]; then
1206 for uefi_stub in \
7b59d15d 1207 "$dracutsysrootdir${systemdutildir}/boot/efi/linux${EFI_MACHINE_TYPE_NAME}.efi.stub" \
a0120420 1208 "$dracutsysrootdir/usr/lib/gummiboot/linux${EFI_MACHINE_TYPE_NAME}.efi.stub"; do
636d2d46
HH
1209 [[ -s $uefi_stub ]] || continue
1210 break
1211 done
1212 fi
1213 if ! [[ -s $uefi_stub ]]; then
1214 dfatal "Can't find a uefi stub '$uefi_stub' to create a UEFI executable"
1215 exit 1
1216 fi
1217
1218 if ! [[ $kernel_image ]]; then
a0120420 1219 for kernel_image in "$dracutsysrootdir/lib/modules/$kernel/vmlinuz" "$dracutsysrootdir/boot/vmlinuz-$kernel"; do
636d2d46
HH
1220 [[ -s "$kernel_image" ]] || continue
1221 break
1222 done
1223 fi
1224 if ! [[ -s $kernel_image ]]; then
1225 dfatal "Can't find a kernel image '$kernel_image' to create a UEFI executable"
1226 exit 1
1227 fi
1228 fi
ec9315e5
JK
1229fi
1230
940169e8
HH
1231if [[ $acpi_override = yes ]] && ! ( check_kernel_config CONFIG_ACPI_TABLE_UPGRADE || check_kernel_config CONFIG_ACPI_INITRD_TABLE_OVERRIDE ); then
1232 dwarn "Disabling ACPI override, because kernel does not support it. CONFIG_ACPI_INITRD_TABLE_OVERRIDE!=y or CONFIG_ACPI_TABLE_UPGRADE!=y"
8e3f6537
HH
1233 unset acpi_override
1234fi
1235
1236if [[ $early_microcode = yes ]]; then
1237 if [[ $hostonly ]]; then
d8d5cb83 1238 if [[ $(get_cpu_vendor) == "AMD" ]]; then
1239 check_kernel_config CONFIG_MICROCODE_AMD || unset early_microcode
1240 elif [[ $(get_cpu_vendor) == "Intel" ]]; then
1241 check_kernel_config CONFIG_MICROCODE_INTEL || unset early_microcode
1242 else
1243 unset early_microcode
1244 fi
8e3f6537 1245 else
875426f2
HH
1246 ! check_kernel_config CONFIG_MICROCODE_AMD \
1247 && ! check_kernel_config CONFIG_MICROCODE_INTEL \
8e3f6537
HH
1248 && unset early_microcode
1249 fi
d8d5cb83 1250 # Do not complain on non-x86 architectures as it makes no sense
1251 case $(uname -m) in
1252 x86_64|i?86)
1253 [[ $early_microcode != yes ]] \
1254 && dwarn "Disabling early microcode, because kernel does not support it. CONFIG_MICROCODE_[AMD|INTEL]!=y"
1255 ;;
1256 *) ;;
1257 esac
8e3f6537
HH
1258fi
1259
f6f74096
DD
1260# Need to be able to have non-root users read stuff (rpcbind etc)
1261chmod 755 "$initdir"
1262
5bfa3b36
HH
1263if [[ $hostonly ]]; then
1264 for i in /sys /proc /run /dev; do
5e601454 1265 if ! findmnt --target "$i" &>/dev/null; then
5bfa3b36
HH
1266 dwarning "Turning off host-only mode: '$i' is not mounted!"
1267 unset hostonly
1268 fi
1269 done
1270fi
1271
d351541e
HH
1272declare -A host_fs_types
1273
cd7ff122 1274for line in "${fstab_lines[@]}"; do
7b59d15d 1275 # shellcheck disable=SC2086
cd7ff122 1276 set -- $line
6df52351 1277 dev="$1"
cd7ff122 1278 #dev mp fs fsopts
6df52351
TR
1279 case "$dev" in
1280 UUID=*)
7b59d15d 1281 dev=$(blkid -l -t "UUID=${dev#UUID=}" -o device)
6df52351
TR
1282 ;;
1283 LABEL=*)
7b59d15d 1284 dev=$(blkid -l -t "LABEL=${dev#LABEL=}" -o device)
6df52351
TR
1285 ;;
1286 PARTUUID=*)
7b59d15d 1287 dev=$(blkid -l -t "PARTUUID=${dev#PARTUUID=}" -o device)
6df52351
TR
1288 ;;
1289 PARTLABEL=*)
7b59d15d 1290 dev=$(blkid -l -t "PARTLABEL=${dev#PARTLABEL=}" -o device)
6df52351
TR
1291 ;;
1292 esac
7b59d15d 1293 [ -z "$dev" ] && dwarn "Bad fstab entry $*" && continue
1cadc26f
HH
1294 if [[ "$3" == btrfs ]]; then
1295 for i in $(btrfs_devs "$2"); do
1296 push_host_devs "$i"
1297 done
1298 fi
6df52351
TR
1299 push_host_devs "$dev"
1300 host_fs_types["$dev"]="$3"
cd7ff122
AW
1301done
1302
1303for f in $add_fstab; do
b093aa2d 1304 [[ -e $f ]] || continue
7b59d15d 1305 while read -r dev rest || [ -n "$dev" ]; do
118ca9ec 1306 push_host_devs "$dev"
b093aa2d
HH
1307 done < "$f"
1308done
1309
1310for dev in $add_device; do
118ca9ec 1311 push_host_devs "$dev"
cd7ff122
AW
1312done
1313
c586b033 1314if (( ${#add_device_l[@]} )); then
7b59d15d 1315 add_device+=" ${add_device_l[*]} "
694725ab 1316 push_host_devs "${add_device_l[@]}"
c586b033
CG
1317fi
1318
37f2fe55 1319if [[ $hostonly ]] && [[ "$hostonly_default_device" != "no" ]]; then
480d772f
HH
1320 # in hostonly mode, determine all devices, which have to be accessed
1321 # and examine them for filesystem types
1322
bcfbddef 1323 for mp in \
7ae5d9d1
HH
1324 "/" \
1325 "/etc" \
d624f606
HH
1326 "/bin" \
1327 "/sbin" \
1328 "/lib" \
1329 "/lib64" \
af75a298 1330 "/usr" \
9fc14445
HH
1331 "/usr/bin" \
1332 "/usr/sbin" \
1333 "/usr/lib" \
1334 "/usr/lib64" \
a956a464
HH
1335 "/boot" \
1336 "/boot/efi" \
33260dac 1337 "/boot/zipl" \
a956a464 1338 ;
bcfbddef 1339 do
a0120420 1340 mp=$(readlink -f "$dracutsysrootdir$mp")
7ae5d9d1 1341 mountpoint "$mp" >/dev/null 2>&1 || continue
a4f7b504 1342 _dev=$(find_block_device "$mp")
e95b6723 1343 _bdev=$(readlink -f "/dev/block/$_dev")
a4f7b504 1344 [[ -b $_bdev ]] && _dev=$_bdev
5a66d511 1345 [[ "$mp" == "/" ]] && root_devs+=("$_dev")
118ca9ec 1346 push_host_devs "$_dev"
1cadc26f
HH
1347 if [[ $(find_mp_fstype "$mp") == btrfs ]]; then
1348 for i in $(btrfs_devs "$mp"); do
5a66d511 1349 [[ "$mp" == "/" ]] && root_devs+=("$i")
1cadc26f
HH
1350 push_host_devs "$i"
1351 done
1352 fi
7ae5d9d1 1353 done
dd587549 1354
a0120420
BZ
1355 # TODO - with sysroot, /proc/swaps is not relevant
1356 if [[ -f /proc/swaps ]] && [[ -f $dracutsysrootdir/etc/fstab ]]; then
7b59d15d 1357 while read -r dev type rest || [ -n "$dev" ]; do
7fd850d5
HH
1358 [[ -b $dev ]] || continue
1359 [[ "$type" == "partition" ]] || continue
1360
7b59d15d 1361 while read -r _d _m _t _o _ || [ -n "$_d" ]; do
7fd850d5
HH
1362 [[ "$_d" == \#* ]] && continue
1363 [[ $_d ]] || continue
546d5dac
HH
1364 [[ $_t != "swap" ]] && continue
1365 [[ $_m != "swap" ]] && [[ $_m != "none" ]] && continue
7fd850d5 1366 [[ "$_o" == *noauto* ]] && continue
c82a1133 1367 _d=$(expand_persistent_dev "$_d")
7fd850d5
HH
1368 [[ "$_d" -ef "$dev" ]] || continue
1369
a0120420 1370 if [[ -f $dracutsysrootdir/etc/crypttab ]]; then
7b59d15d 1371 while read -r _mapper _ _p _o || [ -n "$_mapper" ]; do
7fd850d5
HH
1372 [[ $_mapper = \#* ]] && continue
1373 [[ "$_d" -ef /dev/mapper/"$_mapper" ]] || continue
1374 [[ "$_o" ]] || _o="$_p"
64ae4e07
HH
1375 # skip entries with password files
1376 [[ "$_p" == /* ]] && [[ -f $_p ]] && continue 2
1743473b 1377 # skip mkswap swap
7fd850d5 1378 [[ $_o == *swap* ]] && continue 2
7b59d15d 1379 done < "$dracutsysrootdir"/etc/crypttab
7fd850d5 1380 fi
bcfbddef 1381
3e3ed34f
CG
1382 _dev="$(readlink -f "$dev")"
1383 push_host_devs "$_dev"
5a66d511 1384 swap_devs+=("$_dev")
7fd850d5 1385 break
7b59d15d 1386 done < "$dracutsysrootdir"/etc/fstab
7fd850d5
HH
1387 done < /proc/swaps
1388 fi
916559e0
HH
1389
1390 # collect all "x-initrd.mount" entries from /etc/fstab
a0120420 1391 if [[ -f $dracutsysrootdir/etc/fstab ]]; then
7b59d15d 1392 while read -r _d _m _t _o _ || [ -n "$_d" ]; do
916559e0
HH
1393 [[ "$_d" == \#* ]] && continue
1394 [[ $_d ]] || continue
1395 [[ "$_o" != *x-initrd.mount* ]] && continue
1396 _dev=$(expand_persistent_dev "$_d")
1397 _dev="$(readlink -f "$_dev")"
1cadc26f
HH
1398 [[ -b $_dev ]] || continue
1399
1400 push_host_devs "$_dev"
1401 if [[ "$_t" == btrfs ]]; then
bfa4e45f 1402 for i in $(btrfs_devs "$_m"); do
1cadc26f
HH
1403 push_host_devs "$i"
1404 done
1405 fi
7b59d15d 1406 done < "$dracutsysrootdir"/etc/fstab
916559e0 1407 fi
7ae5d9d1 1408fi
7ae5d9d1 1409
3c4315fa
HH
1410unset m
1411unset rest
1412
dba20559 1413_get_fs_type() {
19bab59c 1414 [[ $1 ]] || return
e41f3f90
HH
1415 if [[ -b /dev/block/$1 ]]; then
1416 ID_FS_TYPE=$(get_fs_env "/dev/block/$1") && host_fs_types["$(readlink -f "/dev/block/$1")"]="$ID_FS_TYPE"
19bab59c 1417 return 1
cd7ff122 1418 fi
e41f3f90
HH
1419 if [[ -b $1 ]]; then
1420 ID_FS_TYPE=$(get_fs_env "$1") && host_fs_types["$(readlink -f "$1")"]="$ID_FS_TYPE"
19bab59c 1421 return 1
4f10ae2b 1422 fi
b093aa2d 1423 if fstype=$(find_dev_fstype "$1"); then
dba20559 1424 host_fs_types["$1"]="$fstype"
19bab59c 1425 return 1
cd7ff122
AW
1426 fi
1427 return 1
dba20559
HH
1428}
1429
3721635b 1430for dev in "${host_devs[@]}"; do
dba20559
HH
1431 _get_fs_type "$dev"
1432 check_block_and_slaves_all _get_fs_type "$(get_maj_min "$dev")"
cd7ff122
AW
1433done
1434
8df0b654
HH
1435for dev in "${!host_fs_types[@]}"; do
1436 [[ ${host_fs_types[$dev]} = "reiserfs" ]] || [[ ${host_fs_types[$dev]} = "xfs" ]] || continue
1437 rootopts=$(find_dev_fsopts "$dev")
1438 if [[ ${host_fs_types[$dev]} = "reiserfs" ]]; then
7b59d15d 1439 journaldev=$(fs_get_option "$rootopts" "jdev")
8df0b654 1440 elif [[ ${host_fs_types[$dev]} = "xfs" ]]; then
7b59d15d 1441 journaldev=$(fs_get_option "$rootopts" "logdev")
8df0b654
HH
1442 fi
1443 if [[ $journaldev ]]; then
1444 dev="$(readlink -f "$dev")"
118ca9ec 1445 push_host_devs "$dev"
8df0b654
HH
1446 _get_fs_type "$dev"
1447 check_block_and_slaves_all _get_fs_type "$(get_maj_min "$dev")"
1448 fi
1449done
1450
1acf52b6
JG
1451[[ -d $dracutsysrootdir$dbus ]] \
1452 || dbus=$(pkg-config dbus --variable=dbus 2>/dev/null)
1453
7b59d15d 1454[[ -d $dracutsysrootdir$dbus ]] || dbus=/usr/share/dbus-1
1acf52b6 1455
db363380
JG
1456[[ -d $dracutsysrootdir$dbusconfdir ]] \
1457 || dbusconfdir=$(pkg-config dbus --variable=dbusconfdir 2>/dev/null)
1458
7b59d15d 1459[[ -d $dracutsysrootdir$dbusconfdir ]] || dbusconfdir=/etc/dbus-1
db363380 1460
1acf52b6
JG
1461[[ -d $dracutsysrootdir$dbusinterfaces ]] \
1462 || dbusinterfaces=$(pkg-config dbus --variable=dbusinterfaces 2>/dev/null)
1463
7b59d15d 1464[[ -d $dracutsysrootdir$dbusinterfaces ]] || dbusinterfaces=${dbus}/interfaces
1acf52b6 1465
db363380
JG
1466[[ -d $dracutsysrootdir$dbusinterfacesconfdir ]] \
1467 || dbusinterfacesconfdir=$(pkg-config dbus --variable=dbusinterfacesconfdir 2>/dev/null)
1468
7b59d15d 1469[[ -d $dracutsysrootdir$dbusinterfacesconfdir ]] || dbusinterfacesconfdir=${dbusconfdir}/interfaces
db363380 1470
1acf52b6
JG
1471[[ -d $dracutsysrootdir$dbusservices ]] \
1472 || dbusservices=$(pkg-config dbus --variable=dbusservices 2>/dev/null)
1473
7b59d15d 1474[[ -d $dracutsysrootdir$dbusservices ]] || dbusservices=${dbus}/services
1acf52b6 1475
db363380
JG
1476[[ -d $dracutsysrootdir$dbusservicesconfdir ]] \
1477 || dbusservicesconfdir=$(pkg-config dbus --variable=dbusservicesconfdir 2>/dev/null)
1478
7b59d15d 1479[[ -d $dracutsysrootdir$dbusservicesconfdir ]] || dbusservicesconfdir=${dbusconfdir}/services
db363380 1480
1acf52b6
JG
1481[[ -d $dracutsysrootdir$dbussession ]] \
1482 || dbussession=$(pkg-config dbus --variable=dbussession 2>/dev/null)
1483
7b59d15d 1484[[ -d $dracutsysrootdir$dbussession ]] || dbussession=${dbus}/session.d
1acf52b6 1485
db363380
JG
1486[[ -d $dracutsysrootdir$dbussessionconfdir ]] \
1487 || dbussessionconfdir=$(pkg-config dbus --variable=dbussessionconfdir 2>/dev/null)
1488
7b59d15d 1489[[ -d $dracutsysrootdir$dbussessionconfdir ]] || dbussessionconfdir=${dbusconfdir}/session.d
db363380 1490
1acf52b6
JG
1491[[ -d $dracutsysrootdir$dbussystem ]] \
1492 || dbussystem=$(pkg-config dbus --variable=dbussystem 2>/dev/null)
1493
7b59d15d 1494[[ -d $dracutsysrootdir$dbussystem ]] || dbussystem=${dbus}/system.d
1acf52b6 1495
db363380
JG
1496[[ -d $dracutsysrootdir$dbussystemconfdir ]] \
1497 || dbussystemconfdir=$(pkg-config dbus --variable=dbussystemconfdir 2>/dev/null)
1498
7b59d15d 1499[[ -d $dracutsysrootdir$dbussystemconfdir ]] || dbussystemconfdir=${dbusconfdir}/system.d
db363380 1500
1acf52b6
JG
1501[[ -d $dracutsysrootdir$dbussystemservices ]] \
1502 || dbussystemservices=$(pkg-config dbus --variable=dbussystemservices 2>/dev/null)
1503
7b59d15d 1504[[ -d $dracutsysrootdir$dbussystemservices ]] || dbussystemservices=${dbus}/system-services
1acf52b6 1505
db363380
JG
1506[[ -d $dracutsysrootdir$dbussystemservicesconfdir ]] \
1507 || dbussystemservicesconfdir=$(pkg-config dbus --variable=dbussystemservicesconfdir 2>/dev/null)
1508
7b59d15d 1509[[ -d $dracutsysrootdir$dbussystemservicesconfdir ]] || dbussystemservicesconfdir=${dbusconfdir}/system-services
db363380 1510
a0120420 1511[[ -d $dracutsysrootdir$udevdir ]] \
b093aa2d 1512 || udevdir="$(pkg-config udev --variable=udevdir 2>/dev/null)"
7b59d15d 1513if ! [[ -d $dracutsysrootdir$udevdir ]]; then
a0120420
BZ
1514 [[ -e $dracutsysrootdir/lib/udev/ata_id ]] && udevdir=/lib/udev
1515 [[ -e $dracutsysrootdir/usr/lib/udev/ata_id ]] && udevdir=/usr/lib/udev
d1615612
HH
1516fi
1517
1acf52b6 1518[[ -d $dracutsysrootdir$sysctl ]] \
db363380
JG
1519 || sysctl=$(pkg-config systemd --variable=sysctl 2>/dev/null)
1520
1521[[ -d "$dracutsysrootdir$sysctl" ]] || sysctl=/usr/lib/sysctl.d
1acf52b6 1522
db363380
JG
1523[[ -d $dracutsysrootdir$sysctlconfdir ]] \
1524 || sysctlconfdir=$(pkg-config systemd --variable=sysctlconfdir 2>/dev/null)
1525
1526[[ -d "$dracutsysrootdir$sysctlconfdir" ]] || sysctlconfdir=/etc/sysctl.d
1acf52b6
JG
1527
1528[[ -d $dracutsysrootdir$environment ]] \
1529 || environment=$(pkg-config systemd --variable=environment 2>/dev/null)
1530
1531[[ -d "$dracutsysrootdir$environment" ]] || environment=/usr/lib/environment.d
1532
db363380
JG
1533[[ -d $dracutsysrootdir$environmentconfdir ]] \
1534 || environmentconfdir=$(pkg-config systemd --variable=environmentconfdir 2>/dev/null)
1535
1536[[ -d "$dracutsysrootdir$environmentconfdir" ]] || environmentconfdir=/etc/environment.d
1537
1acf52b6
JG
1538[[ -d $dracutsysrootdir$systemdcatalog ]] \
1539 || systemdcatalog=$(pkg-config systemd --variable=systemdcatalog 2>/dev/null)
1540
1541[[ -d "$dracutsysrootdir$systemdcatalog" ]] || systemdcatalog=${systemdutildir}/catalog
1542
1543[[ -d $dracutsysrootdir$systemdnetwork ]] \
1544 || systemdnetwork=$(pkg-config systemd --variable=systemdnetwork 2>/dev/null)
1545
1546[[ -d "$dracutsysrootdir$systemdnetwork" ]] || systemdnetwork=${systemdutildir}/network
1547
db363380
JG
1548[[ -d $dracutsysrootdir$systemdnetworkconfdir ]] \
1549 || systemdnetworkconfdir=$(pkg-config systemd --variable=systemdnetworkconfdir 2>/dev/null)
1550
1551[[ -d "$dracutsysrootdir$systemdnetworkconfdir" ]] || systemdnetworkconfdir=${systemdsystemconfdir}/network
1552
1acf52b6
JG
1553[[ -d $dracutsysrootdir$systemdntpunits ]] \
1554 || systemdntpunits=$(pkg-config systemd --variable=systemdntpunits 2>/dev/null)
1555
1556[[ -d "$dracutsysrootdir$systemdntpunits" ]] || systemdntpunits=${systemdutildir}/ntp-units.d
1557
db363380
JG
1558[[ -d $dracutsysrootdir$systemdntpunitsconfdir ]] \
1559 || systemdntpunitsconfdir=$(pkg-config systemd --variable=systemdntpunitsconfdir 2>/dev/null)
1560
1561[[ -d "$dracutsysrootdir$systemdntpunitsconfdir" ]] || systemdntpunitsconfdir=${systemdsystemconfdir}/ntp-units.d
1562
1acf52b6
JG
1563[[ -d $dracutsysrootdir$systemdportable ]] \
1564 || systemdportable=$(pkg-config systemd --variable=systemdportable 2>/dev/null)
1565
1566[[ -d "$dracutsysrootdir$systemdportable" ]] || systemdportable=${systemdutildir}/portable
1567
db363380
JG
1568[[ -d $dracutsysrootdir$systemdportableconfdir ]] \
1569 || systemdportableconfdir=$(pkg-config systemd --variable=systemdportableconfdir 2>/dev/null)
1570
1571[[ -d "$dracutsysrootdir$systemdportableconfdir" ]] || systemdportableconfdir=${systemdsystemconfdir}/portable
1572
a0120420 1573[[ -d $dracutsysrootdir$systemdsystemunitdir ]] \
cb8def95
HH
1574 || systemdsystemunitdir=$(pkg-config systemd --variable=systemdsystemunitdir 2>/dev/null)
1575
a0120420 1576[[ -d "$dracutsysrootdir$systemdsystemunitdir" ]] || systemdsystemunitdir=${systemdutildir}/system
d1615612 1577
1acf52b6
JG
1578[[ -d $dracutsysrootdir$systemduser ]] \
1579 || systemduser=$(pkg-config systemd --variable=systemduser 2>/dev/null)
1580
1581[[ -d "$dracutsysrootdir$systemduser" ]] || systemduser=${systemdutildir}/user
1582
db363380
JG
1583[[ -d $dracutsysrootdir$systemduserconfdir ]] \
1584 || systemduserconfdir=$(pkg-config systemd --variable=systemduserconfdir 2>/dev/null)
1585
1586[[ -d "$dracutsysrootdir$systemduserconfdir" ]] || systemduserconfdir=${systemdsystemconfdir}/user
1587
a0120420 1588[[ -d $dracutsysrootdir$systemdsystemconfdir ]] \
cb8def95
HH
1589 || systemdsystemconfdir=$(pkg-config systemd --variable=systemdsystemconfdir 2>/dev/null)
1590
a0120420 1591[[ -d "$dracutsysrootdir$systemdsystemconfdir" ]] || systemdsystemconfdir=/etc/systemd/system
cb8def95 1592
1acf52b6
JG
1593[[ -d $dracutsysrootdir$sysusers ]] \
1594 || sysusers=$(pkg-config systemd --variable=sysusers 2>/dev/null)
1595
1596[[ -d "$dracutsysrootdir$sysusers" ]] || sysusers=/usr/lib/sysusers.d
1597
db363380
JG
1598[[ -d $dracutsysrootdir$sysusersconfdir ]] \
1599 || sysusersconfdir=$(pkg-config systemd --variable=sysusersconfdir 2>/dev/null)
1600
1601[[ -d "$dracutsysrootdir$sysusersconfdir" ]] || sysusersconfdir=/etc/sysusers.d
1602
a0120420 1603[[ -d $dracutsysrootdir$tmpfilesdir ]] \
3a04bdde
HH
1604 || tmpfilesdir=$(pkg-config systemd --variable=tmpfilesdir 2>/dev/null)
1605
a0120420
BZ
1606if ! [[ -d "$dracutsysrootdir$tmpfilesdir" ]]; then
1607 [[ -d $dracutsysrootdir/lib/tmpfiles.d ]] && tmpfilesdir=/lib/tmpfiles.d
1608 [[ -d $dracutsysrootdir/usr/lib/tmpfiles.d ]] && tmpfilesdir=/usr/lib/tmpfiles.d
3a04bdde
HH
1609fi
1610
ab2f95e4
HH
1611export initdir dracutbasedir \
1612 dracutmodules force_add_dracutmodules add_dracutmodules omit_dracutmodules \
1613 mods_to_load \
e103615b 1614 fw_dir drivers_dir debug no_kernel kernel_only \
5634a311 1615 omit_drivers mdadmconf lvmconf root_devs \
ff3953ef 1616 use_fstab fstab_lines libdirs fscks nofscks ro_mnt \
1e64e493 1617 stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
3e3ed34f 1618 debug host_fs_types host_devs swap_devs sshkey add_fstab \
cb8def95 1619 DRACUT_VERSION udevdir prefix filesystems drivers \
a47c3f50
JG
1620 dbus dbusconfdir dbusinterfaces dbusinterfacesconfdir \
1621 dbusservices dbusservicesconfdir dbussession dbussessionconfdir \
1622 dbussystem dbussystemconfdir dbussystemservices dbussystemservicesconfdir \
1623 environment environmentconfdir sysctl sysctlconfdir sysusers sysusersconfdir \
939b7e11
JG
1624 systemdutildir systemdutilconfdir systemdcatalog systemdntpunits \
1625 systemdntpunitsconfdir systemdsystemunitdir systemdsystemconfdir \
3f60444e 1626 hostonly_cmdline loginstall \
3a04bdde 1627 tmpfilesdir
f4fff04e 1628
1743473b
HH
1629mods_to_load=""
1630# check all our modules to see if they should be sourced.
1631# This builds a list of modules that we will install next.
1632for_each_module_dir check_module
1633for_each_module_dir check_mount
1634
88c86ac7 1635dracut_module_included "fips" && export DRACUT_FIPS_MODE=1
1743473b 1636
91190597
HH
1637do_print_cmdline()
1638{
21a20973
HH
1639 local -A _mods_to_print
1640 for i in $modules_loaded $mods_to_load; do
1641 _mods_to_print[$i]=1
1642 done
1643
1743473b
HH
1644 # source our modules.
1645 for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1646 _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]}
21a20973 1647 [[ ${_mods_to_print[$_d_mod]} ]] || continue
5916d31b 1648 module_cmdline "$_d_mod" "$moddir"
1743473b
HH
1649 done
1650 unset moddir
91190597
HH
1651}
1652
1653if [[ $print_cmdline ]]; then
1654 do_print_cmdline
a17d5cf4 1655 printf "\n"
1743473b
HH
1656 exit 0
1657fi
1658
dbad9f46 1659# Create some directory structure first
fd786adc 1660[[ $prefix ]] && mkdir -m 0755 -p "${initdir}${prefix}"
dbad9f46 1661
a0120420 1662[[ -h $dracutsysrootdir/lib ]] || mkdir -m 0755 -p "${initdir}${prefix}/lib"
fd786adc 1663[[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib"
dbad9f46 1664
785a6cd2 1665if [[ $prefix ]]; then
d2a9c4a8 1666 for d in bin etc lib sbin tmp usr var $libdirs; do
b093aa2d 1667 [[ "$d" == */* ]] && continue
785a6cd2
HH
1668 ln -sfn "${prefix#/}/${d#/}" "$initdir/$d"
1669 done
1670fi
1671
1672if [[ $kernel_only != yes ]]; then
6f92423c 1673 for d in usr/bin usr/sbin bin etc lib sbin tmp usr var var/tmp $libdirs; do
fd786adc 1674 [[ -e "${initdir}${prefix}/$d" ]] && continue
d433da44
HH
1675 if [ -L "/$d" ]; then
1676 inst_symlink "/$d" "${prefix}/$d"
785a6cd2
HH
1677 else
1678 mkdir -m 0755 -p "${initdir}${prefix}/$d"
1679 fi
3b403b32 1680 done
dbad9f46 1681
8d89fc6b 1682 for d in dev proc sys sysroot root run; do
d433da44
HH
1683 if [ -L "/$d" ]; then
1684 inst_symlink "/$d"
785a6cd2
HH
1685 else
1686 mkdir -m 0755 -p "$initdir/$d"
1687 fi
33ee031c 1688 done
dbad9f46 1689
506b2192
HH
1690 ln -sfn ../run "$initdir/var/run"
1691 ln -sfn ../run/lock "$initdir/var/lock"
6f09acf8
HH
1692else
1693 for d in lib "$libdir"; do
1694 [[ -e "${initdir}${prefix}/$d" ]] && continue
1695 if [ -h "/$d" ]; then
1696 inst "/$d" "${prefix}/$d"
1697 else
1698 mkdir -m 0755 -p "${initdir}${prefix}/$d"
1699 fi
1700 done
33ee031c 1701fi
0f86847d 1702
14c47b0e
HH
1703if [[ $kernel_only != yes ]]; then
1704 mkdir -p "${initdir}/etc/cmdline.d"
4fed3ddf
HH
1705 for _d in $hookdirs; do
1706 mkdir -m 0755 -p ${initdir}/lib/dracut/hooks/$_d
1707 done
647b521f 1708 if [[ "$EUID" = "0" ]]; then
ad200fbc
HH
1709 [ -c ${initdir}/dev/null ] || mknod ${initdir}/dev/null c 1 3
1710 [ -c ${initdir}/dev/kmsg ] || mknod ${initdir}/dev/kmsg c 1 11
1711 [ -c ${initdir}/dev/console ] || mknod ${initdir}/dev/console c 5 1
83a6d6f9
HH
1712 [ -c ${initdir}/dev/random ] || mknod ${initdir}/dev/random c 1 8
1713 [ -c ${initdir}/dev/urandom ] || mknod ${initdir}/dev/urandom c 1 9
26144216 1714 fi
14c47b0e 1715fi
96b8d60a 1716
ec3c5951 1717_isize=0 #initramfs size
979c4a93 1718modules_loaded=" "
95bde758 1719# source our modules.
5d791c0e 1720for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
979c4a93 1721 _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]}
bee08653
HH
1722 [[ "$mods_to_load" == *\ $_d_mod\ * ]] || continue
1723 if [[ $show_modules = yes ]]; then
1724 printf "%s\n" "$_d_mod"
1725 else
1726 dinfo "*** Including module: $_d_mod ***"
1727 fi
1728 if [[ $kernel_only == yes ]]; then
5916d31b 1729 module_installkernel "$_d_mod" "$moddir" || {
bee08653
HH
1730 dfatal "installkernel failed in module $_d_mod"
1731 exit 1
1732 }
1733 else
5916d31b 1734 module_install "$_d_mod" "$moddir"
bee08653 1735 if [[ $no_kernel != yes ]]; then
5916d31b 1736 module_installkernel "$_d_mod" "$moddir" || {
a6d3be9d
AW
1737 dfatal "installkernel failed in module $_d_mod"
1738 exit 1
1739 }
ec3c5951 1740 fi
66ac3cd1 1741 fi
bee08653
HH
1742 mods_to_load=${mods_to_load// $_d_mod /}
1743 modules_loaded+="$_d_mod "
1744
1745 #print the module install size
1746 if [ -n "$printsize" ]; then
1747 _isize_new=$(du -sk ${initdir}|cut -f1)
1748 _isize_delta=$((_isize_new - _isize))
1749 printf "%s\n" "$_d_mod install size: ${_isize_delta}k"
1750 _isize=$_isize_new
1751 fi
15136762 1752done
20abd914 1753unset moddir
0a35a80b
HH
1754
1755for i in $modules_loaded; do
43fed151 1756 mkdir -p $initdir/lib/dracut
b093aa2d 1757 printf "%s\n" "$i" >> $initdir/lib/dracut/modules.txt
0a35a80b
HH
1758done
1759
ea216a65 1760dinfo "*** Including modules done ***"
aabc0553 1761
0f86847d 1762## final stuff that has to happen
89d44e72 1763if [[ $no_kernel != yes ]]; then
a69e6c4e 1764 if [[ $hostonly_mode = "strict" ]]; then
a0d9ad6f 1765 cp "$DRACUT_KERNEL_MODALIASES" $initdir/lib/dracut/hostonly-kernel-modules.txt
70472946 1766 fi
aec9f902
HH
1767
1768 if [[ $drivers ]]; then
1769 hostonly='' instmods $drivers
1770 fi
1771
d53bb5c0 1772 if [[ -n "${add_drivers// }" ]]; then
aec9f902
HH
1773 hostonly='' instmods -c $add_drivers
1774 fi
cea907f6
TR
1775 if [[ $force_drivers ]]; then
1776 hostonly='' instmods -c $force_drivers
1777 rm -f $initdir/etc/cmdline.d/20-force_driver.conf
1778 for mod in $force_drivers; do
1779 echo "rd.driver.pre=$mod" >>$initdir/etc/cmdline.d/20-force_drivers.conf
1780 done
1781 fi
aec9f902
HH
1782 if [[ $filesystems ]]; then
1783 hostonly='' instmods -c $filesystems
1784 fi
1785
794b2d2c 1786 dinfo "*** Installing kernel module dependencies ***"
89d44e72 1787 dracut_kernel_post
794b2d2c 1788 dinfo "*** Installing kernel module dependencies done ***"
83bb0893
HH
1789
1790 if [[ $noimageifnotneeded == yes ]] && [[ $hostonly ]]; then
1791 if [[ ! -f "$initdir/lib/dracut/need-initqueue" ]] && \
1792 [[ -f ${initdir}/lib/modules/$kernel/modules.dep && ! -s ${initdir}/lib/modules/$kernel/modules.dep ]]; then
1793 for i in ${initdir}/etc/cmdline.d/*.conf; do
1794 # We need no initramfs image and do not generate one.
1795 [[ $i == "${initdir}/etc/cmdline.d/*.conf" ]] && exit 0
1796 done
1797 fi
1798 fi
89d44e72 1799fi
d8aeb3a7 1800
998bf6e0 1801if [[ $kernel_only != yes ]]; then
3c001899
HH
1802 (( ${#install_items[@]} > 0 )) && inst_multiple ${install_items[@]}
1803 (( ${#install_optional_items[@]} > 0 )) && inst_multiple -o ${install_optional_items[@]}
998bf6e0 1804
fea53784 1805 if [[ $kernel_cmdline ]] && [[ $uefi != yes ]]; then
1806 printf "%s\n" "$kernel_cmdline" >> "${initdir}/etc/cmdline.d/01-default.conf"
1807 fi
d20fb951 1808
694725ab 1809 for line in "${fstab_lines[@]}"; do
5f6a495b 1810 line=($line)
edbd9ca0
FV
1811
1812 if [ -z "${line[1]}" ]; then
1813 # Determine device and mount options from current system
1814 mountpoint -q "${line[0]}" || derror "${line[0]} is not a mount point!"
1815 line=($(findmnt --raw -n --target "${line[0]}" --output=source,target,fstype,options))
1816 dinfo "Line for ${line[1]}: ${line[@]}"
1817 else
1818 # Use default options
1819 [ -z "${line[3]}" ] && line[3]="defaults"
1820 fi
1821
1822 # Default options for freq and passno
5f6a495b
DY
1823 [ -z "${line[4]}" ] && line[4]="0"
1824 [ -z "${line[5]}" ] && line[5]="2"
edbd9ca0 1825
3586a7aa 1826 strstr "${line[2]}" "nfs" && line[5]="0"
5f6a495b 1827 echo "${line[@]}" >> "${initdir}/etc/fstab"
998bf6e0
HH
1828 done
1829
1830 for f in $add_fstab; do
b093aa2d 1831 cat "$f" >> "${initdir}/etc/fstab"
998bf6e0
HH
1832 done
1833
a0120420 1834 if [[ $dracutsysrootdir$systemdutildir ]]; then
2da041d6
HH
1835 if [ -d ${initdir}/$systemdutildir ]; then
1836 mkdir -p ${initdir}/etc/conf.d
1837 {
1838 printf "%s\n" "systemdutildir=\"$systemdutildir\""
1839 printf "%s\n" "systemdsystemunitdir=\"$systemdsystemunitdir\""
1840 printf "%s\n" "systemdsystemconfdir=\"$systemdsystemconfdir\""
1841 } > ${initdir}/etc/conf.d/systemd.conf
1842 fi
6c6d8057
HH
1843 fi
1844
998bf6e0
HH
1845 if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then
1846 dinfo "*** Resolving executable dependencies ***"
f182cb95 1847 find "$initdir" -type f -perm /0111 -not -path '*.ko' -print0 \
a0120420 1848 | xargs -r -0 $DRACUT_INSTALL ${initdir:+-D "$initdir"} ${dracutsysrootdir:+-r "$dracutsysrootdir"} -R ${DRACUT_FIPS_MODE:+-f} --
db4d6bb4 1849 dinfo "*** Resolving executable dependencies done ***"
998bf6e0 1850 fi
8dcc4830 1851
ed9281d6
HH
1852 # Now we are done with lazy resolving, always install dependencies
1853 unset DRACUT_RESOLVE_LAZY
1854 export DRACUT_RESOLVE_DEPS=1
998bf6e0
HH
1855fi
1856
694725ab
HH
1857for ((i=0; i < ${#include_src[@]}; i++)); do
1858 src="${include_src[$i]}"
1859 target="${include_target[$i]}"
c9364f6e 1860 if [[ $src && $target ]]; then
661f9a34 1861 if [[ -f $src ]]; then
c9364f6e 1862 inst $src $target
7a3d6619 1863 elif [[ -d $src ]]; then
3b403b32 1864 ddebug "Including directory: $src"
c9364f6e 1865 destdir="${initdir}/${target}"
332ecaa9 1866 mkdir -p "$destdir"
dbad9f46 1867 # check for preexisting symlinks, so we can cope with the
fd786adc 1868 # symlinks to $prefix
c9364f6e
EV
1869 # Objectname is a file or a directory
1870 for objectname in "$src"/*; do
1871 [[ -e "$objectname" || -h "$objectname" ]] || continue
1872 if [[ -d "$objectname" ]]; then
1873 # objectname is a directory, let's compute the final directory name
1874 object_destdir=${destdir}/${objectname#$src/}
1875 if ! [[ -e "$object_destdir" ]]; then
1876 mkdir -m 0755 -p "$object_destdir"
1877 chmod --reference="$objectname" "$object_destdir"
dbad9f46 1878 fi
a0120420 1879 $DRACUT_CP -t "$object_destdir" "$dracutsysrootdir$objectname"/*
dbad9f46 1880 else
a0120420 1881 $DRACUT_CP -t "$destdir" "$dracutsysrootdir$objectname"
3b403b32 1882 fi
dbad9f46 1883 done
7a3d6619
RM
1884 elif [[ -e $src ]]; then
1885 derror "$src is neither a directory nor a regular file"
1886 else
1887 derror "$src doesn't exist"
661f9a34 1888 fi
4fea3ea6 1889 fi
661f9a34 1890done
88ffd2df 1891
404815ea
HH
1892if [[ $do_hardlink = yes ]] && command -v hardlink >/dev/null; then
1893 dinfo "*** Hardlinking files ***"
1894 hardlink "$initdir" 2>&1
1895 dinfo "*** Hardlinking files done ***"
1896fi
1897
3b403b32 1898# strip binaries
98adb06e 1899if [[ $do_strip = yes ]] ; then
8b6d136e
DM
1900 # Prefer strip from elfutils for package size
1901 declare strip_cmd=$(command -v eu-strip)
3b92d8bf 1902 [ -z "$strip_cmd" ] && strip_cmd="strip"
8b6d136e
DM
1903
1904 for p in $strip_cmd xargs find; do
cc02093d 1905 if ! type -P $p >/dev/null; then
fefd3f66 1906 dinfo "Could not find '$p'. Not stripping the initramfs."
cc02093d
HH
1907 do_strip=no
1908 fi
31f7db66
HH
1909 done
1910fi
1911
f6e777ec
HH
1912# cleanup empty ldconfig_paths directories
1913for d in $(ldconfig_paths); do
1914 rmdir -p --ignore-fail-on-non-empty "$initdir/$d" >/dev/null 2>&1
1915done
1916
5f2c30d9
KRW
1917if [[ $early_microcode = yes ]]; then
1918 dinfo "*** Generating early-microcode cpio image ***"
1919 ucode_dir=(amd-ucode intel-ucode)
1920 ucode_dest=(AuthenticAMD.bin GenuineIntel.bin)
b5b608e4 1921 _dest_dir="$early_cpio_dir/d/kernel/x86/microcode"
5f2c30d9
KRW
1922 _dest_idx="0 1"
1923 mkdir -p $_dest_dir
1924 if [[ $hostonly ]]; then
1925 [[ $(get_cpu_vendor) == "AMD" ]] && _dest_idx="0"
1926 [[ $(get_cpu_vendor) == "Intel" ]] && _dest_idx="1"
1927 fi
1928 for idx in $_dest_idx; do
1929 _fw=${ucode_dir[$idx]}
1930 for _fwdir in $fw_dir; do
1931 if [[ -d $_fwdir && -d $_fwdir/$_fw ]]; then
1932 _src="*"
f18d069d 1933 dinfo "*** Constructing ${ucode_dest[$idx]} ***"
5f2c30d9
KRW
1934 if [[ $hostonly ]]; then
1935 _src=$(get_ucode_file)
b44156c6 1936 [[ $_src ]] || break
feebf171 1937 [[ -r $_fwdir/$_fw/$_src ]] || _src="${_src}.early"
efba549a 1938 [[ -r $_fwdir/$_fw/$_src ]] || break
5f2c30d9 1939 fi
efba549a 1940
583fb231 1941 for i in $_fwdir/$_fw/$_src; do
efba549a 1942 [ -e "$i" ] && break
583fb231
HH
1943 break 2
1944 done
c44d2252
HH
1945 for i in $_fwdir/$_fw/$_src; do
1946 [[ -e "$i" ]] || continue
1947 # skip gpg files
1948 str_ends "$i" ".asc" && continue
1949 cat "$i" >> $_dest_dir/${ucode_dest[$idx]}
1950 done
d8b04dc1 1951 create_early_cpio="yes"
5f2c30d9
KRW
1952 fi
1953 done
d613d88d
JW
1954 if [[ ! -e "$_dest_dir/${ucode_dest[$idx]}" ]]; then
1955 cd "$early_cpio_dir/d"
1956 for _ucodedir in "${early_microcode_image_dir[@]}"; do
1957 for _ucodename in "${early_microcode_image_name[@]}"; do
1958 [[ -e "$_ucodedir/$_ucodename" ]] && \
1959 cpio --extract --file "$_ucodedir/$_ucodename" --quiet \
1960 "kernel/x86/microcode/${ucode_dest[$idx]}"
1961 if [[ -e "$_dest_dir/${ucode_dest[$idx]}" ]]; then
1962 dinfo "*** Using microcode found in '$_ucodedir/$_ucodename' ***"
1963 create_early_cpio="yes"
1964 break 2
1965 fi
1966 done
1967 done
1968 fi
5f2c30d9 1969 done
5f2c30d9 1970fi
bbaa0d59 1971
f3b14c2b
TR
1972if [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]]; then
1973 dinfo "*** Packaging ACPI tables to override BIOS provided ones ***"
1974 _dest_dir="$early_cpio_dir/d/kernel/firmware/acpi"
1975 mkdir -p $_dest_dir
1976 for table in $acpi_table_dir/*.aml; do
1977 dinfo " Adding ACPI table: $table"
7e51a94f 1978 $DRACUT_CP $table $_dest_dir
f3b14c2b
TR
1979 create_early_cpio="yes"
1980 done
1981fi
1982
659dc319
HB
1983dinfo "*** Store current command line parameters ***"
1984if ! ( echo $PARMS_TO_STORE > $initdir/lib/dracut/build-parameter.txt ); then
1985 dfatal "Could not store the current command line parameters"
1986 exit 1
1987fi
1988
76dd870b 1989if [[ $hostonly_cmdline == "yes" ]] ; then
496e3d96 1990 unset _stored_cmdline
fe273e39
HR
1991 if [ -d $initdir/etc/cmdline.d ];then
1992 dinfo "Stored kernel commandline:"
1993 for conf in $initdir/etc/cmdline.d/*.conf ; do
496e3d96 1994 [ -e "$conf" ] || continue
3b92d8bf 1995 dinfo "$(< "$conf")"
496e3d96 1996 _stored_cmdline=1
fe273e39 1997 done
496e3d96
HH
1998 fi
1999 if ! [[ $_stored_cmdline ]]; then
62c00a88 2000 dinfo "No dracut internal kernel commandline stored in the initramfs"
fe273e39
HR
2001 fi
2002fi
62c00a88 2003
095e1f37 2004if dracut_module_included "squash"; then
6a74c03b 2005 dinfo "*** Install squash loader ***"
6a74c03b 2006 readonly squash_dir="$initdir/squash/root"
4159819f 2007 readonly squash_img="$initdir/squash/root.img"
095e1f37
KS
2008 readonly squash_candidate=( "usr" "etc" )
2009
2010 mkdir -m 0755 -p $squash_dir
2011 for folder in "${squash_candidate[@]}"; do
2012 mv $initdir/$folder $squash_dir/$folder
2013 done
2014
095e1f37
KS
2015 # Move some files out side of the squash image, including:
2016 # - Files required to boot and mount the squashfs image
f18d069d 2017 # - Files need to be accessible without mounting the squash image
4159819f
KS
2018 # - Initramfs marker
2019 for file in \
2020 $squash_dir/usr/lib/modules/*/modules.* \
2021 $squash_dir/usr/lib/dracut/* \
2022 $squash_dir/etc/initrd-release
095e1f37 2023 do
1ebf4548 2024 [[ -f $file ]] || continue
4159819f
KS
2025 DRACUT_RESOLVE_DEPS=1 dracutsysrootdir=$squash_dir inst ${file#$squash_dir}
2026 rm $file
095e1f37
KS
2027 done
2028
2029 mv $initdir/init $initdir/init.stock
095e1f37 2030 ln -s squash/init.sh $initdir/init
095e1f37 2031
19e57585
KS
2032 # Reinstall required files for the squash image setup script.
2033 # We have moved them inside the squashed image, but they need to be
2034 # accessible before mounting the image.
2035 inst_multiple "echo" "sh" "mount" "modprobe" "mkdir"
2036 hostonly="" instmods "loop" "squashfs" "overlay"
19e57585
KS
2037 # Only keep systemctl outsite if we need switch root
2038 if [[ ! -f "$initdir/lib/dracut/no-switch-root" ]]; then
2039 inst "systemctl"
2040 fi
2041
4159819f 2042 # Remove duplicated files
19e57585 2043 for folder in "${squash_candidate[@]}"; do
4159819f 2044 for file in $(find $initdir/$folder/ -not -type d); do
19e57585 2045 if [[ -e $squash_dir${file#$initdir} ]]; then
1ebf4548 2046 mv -f $squash_dir${file#$initdir} $file
19e57585
KS
2047 fi
2048 done
2049 done
6a74c03b 2050fi
19e57585 2051
de3cb0e3
KS
2052if [[ $kernel_only != yes ]]; then
2053 # libpthread workaround: pthread_cancel wants to dlopen libgcc_s.so
2054 for _dir in $libdirs; do
2055 for _f in "$dracutsysrootdir$_dir/libpthread.so"*; do
2056 [[ -e "$_f" ]] || continue
2057 inst_libdir_file "libgcc_s.so*"
2058 break 2
2059 done
2060 done
5a4c3469
KS
2061
2062 # FIPS workaround for Fedora/RHEL: libcrypto needs libssl when FIPS is enabled
2063 if [[ $DRACUT_FIPS_MODE ]]; then
2064 for _dir in $libdirs; do
2065 for _f in "$dracutsysrootdir$_dir/libcrypto.so"*; do
2066 [[ -e "$_f" ]] || continue
2067 inst_libdir_file -o "libssl.so*"
2068 break 2
2069 done
2070 done
2071 fi
de3cb0e3
KS
2072fi
2073
6eff0ebc
AT
2074if [[ $kernel_only != yes ]]; then
2075 # make sure that library links are correct and up to date
2076 for f in $dracutsysrootdir/etc/ld.so.conf $dracutsysrootdir/etc/ld.so.conf.d/*; do
2077 [[ -f $f ]] && inst_simple "${f#$dracutsysrootdir}"
2078 done
2079 if ! $DRACUT_LDCONFIG -r "$initdir" -f /etc/ld.so.conf; then
2080 if [[ $EUID = 0 ]]; then
2081 derror "ldconfig exited ungracefully"
2082 else
2083 derror "ldconfig might need uid=0 (root) for chroot()"
2084 fi
2085 fi
2086fi
2087
6a74c03b
KS
2088if [[ $do_strip = yes ]] && ! [[ $DRACUT_FIPS_MODE ]]; then
2089 dinfo "*** Stripping files ***"
2090 find "$initdir" -type f \
2091 -executable -not -path '*/lib/modules/*.ko' -print0 \
2092 | xargs -r -0 $strip_cmd -g -p 2>/dev/null
2093
2094 # strip kernel modules, but do not touch signed modules
2095 find "$initdir" -type f -path '*/lib/modules/*.ko' -print0 \
2096 | while read -r -d $'\0' f || [ -n "$f" ]; do
2097 SIG=$(tail -c 28 "$f" | tr -d '\000')
2098 [[ $SIG == '~Module signature appended~' ]] || { printf "%s\000" "$f"; }
2099 done | xargs -r -0 $strip_cmd -g -p
2100 dinfo "*** Stripping files done ***"
2101fi
2102
2103if dracut_module_included "squash"; then
2104 dinfo "*** Squashing the files inside the initramfs ***"
89bc1aa3 2105 mksquashfs $squash_dir $squash_img -no-xattrs -no-exports -noappend -always-use-fragments -comp xz -Xdict-size 100% -no-progress 1> /dev/null
095e1f37
KS
2106
2107 if [[ $? != 0 ]]; then
2108 dfatal "dracut: Failed making squash image"
2109 exit 1
2110 fi
6a74c03b
KS
2111
2112 rm -rf $squash_dir
2113 dinfo "*** Squashing the files inside the initramfs done ***"
095e1f37
KS
2114fi
2115
6a74c03b
KS
2116dinfo "*** Creating image file '$outfile' ***"
2117
636d2d46 2118if [[ $uefi = yes ]]; then
62c00a88
HH
2119 readonly uefi_outdir="$DRACUT_TMPDIR/uefi"
2120 mkdir "$uefi_outdir"
636d2d46 2121fi
c8a9a6b4 2122
80626ded
HH
2123if [[ $DRACUT_REPRODUCIBLE ]]; then
2124 find "$initdir" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
2125 | xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
2126
10f8df1b
HH
2127 if [[ "$(cpio --help)" == *--reproducible* ]]; then
2128 CPIO_REPRODUCIBLE=1
2129 else
2130 dinfo "cpio does not support '--reproducible'. Resulting image will not be reproducible."
2131 fi
80626ded
HH
2132fi
2133
647b521f 2134[[ "$EUID" != 0 ]] && cpio_owner_root="-R 0:0"
c8a9a6b4 2135
b5b608e4 2136if [[ $create_early_cpio = yes ]]; then
b9909e33 2137 echo 1 > "$early_cpio_dir/d/early_cpio"
80626ded
HH
2138
2139 if [[ $DRACUT_REPRODUCIBLE ]]; then
2140 find "$early_cpio_dir/d" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
2141 | xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
2142 fi
2143
5f2c30d9 2144 # The microcode blob is _before_ the initramfs blob, not after
62c00a88 2145 if ! (
0db98910 2146 umask 077; cd "$early_cpio_dir/d"
62c00a88
HH
2147 find . -print0 | sort -z \
2148 | cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc -o --quiet > "${DRACUT_TMPDIR}/initramfs.img"
2149 ); then
2150 dfatal "dracut: creation of $outfile failed"
2151 exit 1
2152 fi
5f2c30d9 2153fi
80626ded
HH
2154
2155if ! (
2156 umask 077; cd "$initdir"
2157 find . -print0 | sort -z \
2158 | cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc -o --quiet \
62c00a88 2159 | $compress >> "${DRACUT_TMPDIR}/initramfs.img"
80626ded 2160 ); then
dc4c1ee3 2161 dfatal "dracut: creation of $outfile failed"
734a0d9e 2162 exit 1
3b403b32 2163fi
2cc5e92e 2164
bd93e928 2165if (( maxloglvl >= 5 )) && (( verbosity_mod_l >= 0 )); then
dadd2b69 2166 if [[ $allowlocal ]]; then
497916e1 2167 "$dracutbasedir/lsinitrd.sh" "${DRACUT_TMPDIR}/initramfs.img"| ddebug
dadd2b69 2168 else
62c00a88 2169 lsinitrd "${DRACUT_TMPDIR}/initramfs.img"| ddebug
dadd2b69 2170 fi
bbaa0d59 2171fi
1faecdc1 2172
60928f36
HH
2173umask 077
2174
636d2d46
HH
2175if [[ $uefi = yes ]]; then
2176 if [[ $kernel_cmdline ]]; then
2177 echo -n "$kernel_cmdline" > "$uefi_outdir/cmdline.txt"
3b92d8bf
ÉR
2178 elif [[ $hostonly_cmdline = yes ]] && [ -d "$initdir/etc/cmdline.d" ];then
2179 for conf in "$initdir"/etc/cmdline.d/*.conf ; do
636d2d46 2180 [ -e "$conf" ] || continue
3b92d8bf 2181 printf "%s " "$(< "$conf")" >> "$uefi_outdir/cmdline.txt"
636d2d46 2182 done
636d2d46 2183 fi
636d2d46 2184
8a2edb1e
MT
2185 if [[ $kernel_cmdline ]] || [[ $hostonly_cmdline = yes && -d "$initdir/etc/cmdline.d" ]]; then
2186 echo -ne "\x00" >> "$uefi_outdir/cmdline.txt"
2187 dinfo "Using UEFI kernel cmdline:"
2188 dinfo $(tr -d '\000' < "$uefi_outdir/cmdline.txt")
2189 uefi_cmdline="--add-section .cmdline="${uefi_outdir}/cmdline.txt" --change-section-vma .cmdline=0x30000"
2190 else
2191 uefi_cmdline=""
2192 fi
636d2d46 2193
a0120420
BZ
2194 [[ -s $dracutsysrootdir/usr/lib/os-release ]] && uefi_osrelease="$dracutsysrootdir/usr/lib/os-release"
2195 [[ -s $dracutsysrootdir/etc/os-release ]] && uefi_osrelease="$dracutsysrootdir/etc/os-release"
4237aeb0 2196 [[ -s "${dracutsysrootdir}${uefi_splash_image}" ]] && \
3b92d8bf 2197 uefi_splash_image="${dracutsysrootdir}${uefi_splash_image}" || unset uefi_splash_image
636d2d46 2198
62c00a88
HH
2199 if objcopy \
2200 ${uefi_osrelease:+--add-section .osrel=$uefi_osrelease --change-section-vma .osrel=0x20000} \
8a2edb1e 2201 ${uefi_cmdline} \
4237aeb0
DT
2202 ${uefi_splash_image:+--add-section .splash="$uefi_splash_image" --change-section-vma .splash=0x40000} \
2203 --add-section .linux="$kernel_image" --change-section-vma .linux=0x2000000 \
62c00a88 2204 --add-section .initrd="${DRACUT_TMPDIR}/initramfs.img" --change-section-vma .initrd=0x3000000 \
5a962b59
MR
2205 "$uefi_stub" "${uefi_outdir}/linux.efi"; then
2206 if [[ -n "${uefi_secureboot_key}" && -n "${uefi_secureboot_cert}" ]]; then \
2207 if sbsign \
2208 --key "${uefi_secureboot_key}" \
2209 --cert "${uefi_secureboot_cert}" \
2210 --output "$outfile" "${uefi_outdir}/linux.efi"; then
2211 dinfo "*** Creating signed UEFI image file '$outfile' done ***"
2212 else
2213 dfatal "*** Creating signed UEFI image file '$outfile' failed ***"
2214 exit 1
2215 fi
2216 else
2217 if cp --reflink=auto "${uefi_outdir}/linux.efi" "$outfile"; then
2218 dinfo "*** Creating UEFI image file '$outfile' done ***"
2219 fi
2220 fi
62c00a88
HH
2221 else
2222 rm -f -- "$outfile"
2223 dfatal "*** Creating UEFI image file '$outfile' failed ***"
2224 exit 1
2225 fi
2226else
60928f36 2227 if cp --reflink=auto "${DRACUT_TMPDIR}/initramfs.img" "$outfile"; then
62c00a88
HH
2228 dinfo "*** Creating initramfs image file '$outfile' done ***"
2229 else
2230 rm -f -- "$outfile"
2231 dfatal "dracut: creation of $outfile failed"
2232 exit 1
2233 fi
636d2d46
HH
2234fi
2235
60928f36 2236command -v restorecon &>/dev/null && restorecon -- "$outfile"
62c00a88 2237
0386e462
MW
2238btrfs_uuid() {
2239 btrfs filesystem show "$1" | sed -n '1s/^.*uuid: //p'
2240}
2241
2242freeze_ok_for_btrfs() {
2243 local mnt uuid1 uuid2
2244 # If the output file is on btrfs, we need to make sure that it's
2245 # not on a subvolume of the same file system as the root FS.
2246 # Otherwise, fsfreeze() might freeze the entire system.
2247 # This is most conveniently checked by comparing the FS uuid.
2248
2249 [[ "$(stat -f -c %T -- "/")" == "btrfs" ]] || return 0
2250 mnt=$(stat -c %m -- "$1")
2251 uuid1=$(btrfs_uuid "$mnt")
2252 uuid2=$(btrfs_uuid "/")
2253 [[ "$uuid1" && "$uuid2" && "$uuid1" != "$uuid2" ]]
2254}
2255
2256freeze_ok_for_fstype() {
2257 local outfile=$1
2258 local fstype
2259
2260 [[ "$(stat -c %m -- "$outfile")" == "/" ]] && return 1
2261 fstype=$(stat -f -c %T -- "$outfile")
2262 case $fstype in
2263 msdos)
2264 return 1;;
2265 btrfs)
2266 freeze_ok_for_btrfs "$outfile";;
2267 *)
2268 return 0;;
2269 esac
2270}
2271
740e41b8
CW
2272# We sync/fsfreeze only if we're operating on a live booted system.
2273# It's possible for e.g. `kernel` to be installed as an RPM BuildRequires or equivalent,
2274# and there's no reason to sync, and *definitely* no reason to fsfreeze.
2275# Another case where this happens is rpm-ostree, which performs its own sync/fsfreeze
2276# globally. See e.g. https://github.com/ostreedev/ostree/commit/8642ef5ab3fec3ac8eb8f193054852f83a8bc4d0
3b92d8bf 2277if [ -d "$dracutsysrootdir/run/systemd/system" ]; then
740e41b8
CW
2278 if ! sync "$outfile" 2> /dev/null; then
2279 dinfo "dracut: sync operation on newly created initramfs $outfile failed"
2280 exit 1
2281 fi
7bc681fd 2282
740e41b8 2283 # use fsfreeze only if we're not writing to /
0386e462 2284 if [[ "$(stat -c %m -- "$outfile")" != "/" ]] && freeze_ok_for_fstype "$outfile"; then
3b92d8bf 2285 if ! (fsfreeze -f "$(dirname "$outfile")" 2>/dev/null && fsfreeze -u "$(dirname "$outfile")" 2>/dev/null); then
740e41b8
CW
2286 dinfo "dracut: warning: could not fsfreeze $(dirname "$outfile")"
2287 fi
de576db3 2288 fi
e316ae0e
AK
2289fi
2290
3da58569 2291exit 0