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