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