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