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