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