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