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