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