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