dracut-systemd/dracut-initqueue: only start service if really needed
[dracut.git] / dracut.sh
blobb7456dc0747f2f9deb06141c9d4761acbd471447
1 #!/bin/bash --norc
3 # Generator script for a dracut initramfs
4 # Tries to retain some degree of compatibility with the command line
5 # of the various mkinitrd implementations out there
8 # Copyright 2005-2013 Red Hat, Inc. All rights reserved.
10 # This program is free software; you can redistribute it and/or modify
11 # it under the terms of the GNU General Public License as published by
12 # the Free Software Foundation; either version 2 of the License, or
13 # (at your option) any later version.
15 # This program is distributed in the hope that it will be useful,
16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 # GNU General Public License for more details.
20 # You should have received a copy of the GNU General Public License
21 # along with this program. If not, see <http://www.gnu.org/licenses/>.
24 # store for logging
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
32 dracut_args=( "$@" )
33 readonly dracut_cmd="$(readlink -f $0)"
35 set -o pipefail
37 usage() {
38 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
39 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
40 . $dracutbasedir/dracut-version.sh
43 # 80x25 linebreak here ^
44 cat << EOF
45 Usage: $dracut_cmd [OPTION]... [<initramfs> [<kernel-version>]]
47 Version: $DRACUT_VERSION
49 Creates initial ramdisk images for preloading modules
51 -h, --help Display all options
53 If a [LIST] has multiple arguments, then you have to put these in quotes.
55 For example:
57 # dracut --add-drivers "module1 module2" ...
59 EOF
62 long_usage() {
63 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
64 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
65 . $dracutbasedir/dracut-version.sh
68 # 80x25 linebreak here ^
69 cat << EOF
70 Usage: $dracut_cmd [OPTION]... [<initramfs> [<kernel-version>]]
72 Version: $DRACUT_VERSION
74 Creates initial ramdisk images for preloading modules
76 --kver [VERSION] Set kernel version to [VERSION].
77 -f, --force Overwrite existing initramfs file.
78 -a, --add [LIST] Add a space-separated list of dracut modules.
79 --rebuild Append arguments to those of existing image and rebuild
80 -m, --modules [LIST] Specify a space-separated list of dracut modules to
81 call when building the initramfs. Modules are located
82 in /usr/lib/dracut/modules.d.
83 -o, --omit [LIST] Omit a space-separated list of dracut modules.
84 --force-add [LIST] Force to add a space-separated list of dracut modules
85 to the default set of modules, when -H is specified.
86 -d, --drivers [LIST] Specify a space-separated list of kernel modules to
87 exclusively include in the initramfs.
88 --add-drivers [LIST] Specify a space-separated list of kernel
89 modules to add to the initramfs.
90 --force-drivers [LIST] Specify a space-separated list of kernel
91 modules to add to the initramfs and make sure they
92 are tried to be loaded via modprobe same as passing
93 rd.driver.pre=DRIVER kernel parameter.
94 --omit-drivers [LIST] Specify a space-separated list of kernel
95 modules not to add to the initramfs.
96 --filesystems [LIST] Specify a space-separated list of kernel filesystem
97 modules to exclusively include in the generic
98 initramfs.
99 -k, --kmoddir [DIR] Specify the directory, where to look for kernel
100 modules
101 --fwdir [DIR] Specify additional directories, where to look for
102 firmwares, separated by :
103 --kernel-only Only install kernel drivers and firmware files
104 --no-kernel Do not install kernel drivers and firmware files
105 --print-cmdline Print the kernel command line for the given disk layout
106 --early-microcode Combine early microcode with ramdisk
107 --no-early-microcode Do not combine early microcode with ramdisk
108 --kernel-cmdline [PARAMETERS] Specify default kernel command line parameters
109 --strip Strip binaries in the initramfs
110 --nostrip Do not strip binaries in the initramfs
111 --prelink Prelink binaries in the initramfs
112 --noprelink Do not prelink binaries in the initramfs
113 --hardlink Hardlink files in the initramfs
114 --nohardlink Do not hardlink files in the initramfs
115 --prefix [DIR] Prefix initramfs files with [DIR]
116 --noprefix Do not prefix initramfs files
117 --mdadmconf Include local /etc/mdadm.conf
118 --nomdadmconf Do not include local /etc/mdadm.conf
119 --lvmconf Include local /etc/lvm/lvm.conf
120 --nolvmconf Do not include local /etc/lvm/lvm.conf
121 --fscks [LIST] Add a space-separated list of fsck helpers.
122 --nofscks Inhibit installation of any fsck helpers.
123 --ro-mnt Mount / and /usr read-only by default.
124 -h, --help This message
125 --debug Output debug information of the build process
126 --profile Output profile information of the build process
127 -L, --stdlog [0-6] Specify logging level (to standard error)
128 0 - suppress any messages
129 1 - only fatal errors
130 2 - all errors
131 3 - warnings
132 4 - info
133 5 - debug info (here starts lots of output)
134 6 - trace info (and even more)
135 -v, --verbose Increase verbosity level
136 -q, --quiet Decrease verbosity level
137 -c, --conf [FILE] Specify configuration file to use.
138 Default: /etc/dracut.conf
139 --confdir [DIR] Specify configuration directory to use *.conf files
140 from. Default: /etc/dracut.conf.d
141 --tmpdir [DIR] Temporary directory to be used instead of default
142 /var/tmp.
143 -l, --local Local mode. Use modules from the current working
144 directory instead of the system-wide installed in
145 /usr/lib/dracut/modules.d.
146 Useful when running dracut from a git checkout.
147 -H, --hostonly Host-Only mode: Install only what is needed for
148 booting the local host instead of a generic host.
149 -N, --no-hostonly Disables Host-Only mode
150 --hostonly-cmdline Store kernel command line arguments needed
151 in the initramfs
152 --no-hostonly-cmdline Do not store kernel command line arguments needed
153 in the initramfs
154 --persistent-policy [POLICY]
155 Use [POLICY] to address disks and partitions.
156 POLICY can be any directory name found in /dev/disk.
157 E.g. "by-uuid", "by-label"
158 --fstab Use /etc/fstab to determine the root device.
159 --add-fstab [FILE] Add file to the initramfs fstab
160 --mount "[DEV] [MP] [FSTYPE] [FSOPTS]"
161 Mount device [DEV] on mountpoint [MP] with filesystem
162 [FSTYPE] and options [FSOPTS] in the initramfs
163 --add-device "[DEV]" Bring up [DEV] in initramfs
164 -i, --include [SOURCE] [TARGET]
165 Include the files in the SOURCE directory into the
166 Target directory in the final initramfs.
167 If SOURCE is a file, it will be installed to TARGET
168 in the final initramfs.
169 -I, --install [LIST] Install the space separated list of files into the
170 initramfs.
171 --install-optional [LIST] Install the space separated list of files into the
172 initramfs, if they exist.
173 --gzip Compress the generated initramfs using gzip.
174 This will be done by default, unless another
175 compression option or --no-compress is passed.
176 --bzip2 Compress the generated initramfs using bzip2.
177 Make sure your kernel has bzip2 decompression support
178 compiled in, otherwise you will not be able to boot.
179 --lzma Compress the generated initramfs using lzma.
180 Make sure your kernel has lzma support compiled in,
181 otherwise you will not be able to boot.
182 --xz Compress the generated initramfs using xz.
183 Make sure that your kernel has xz support compiled
184 in, otherwise you will not be able to boot.
185 --lzo Compress the generated initramfs using lzop.
186 Make sure that your kernel has lzo support compiled
187 in, otherwise you will not be able to boot.
188 --lz4 Compress the generated initramfs using lz4.
189 Make sure that your kernel has lz4 support compiled
190 in, otherwise you will not be able to boot.
191 --compress [COMPRESSION] Compress the generated initramfs with the
192 passed compression program. Make sure your kernel
193 knows how to decompress the generated initramfs,
194 otherwise you will not be able to boot.
195 --no-compress Do not compress the generated initramfs. This will
196 override any other compression options.
197 --list-modules List all available dracut modules.
198 -M, --show-modules Print included module's name to standard output during
199 build.
200 --keep Keep the temporary initramfs for debugging purposes
201 --printsize Print out the module install size
202 --sshkey [SSHKEY] Add ssh key to initramfs (use with ssh-client module)
203 --logfile [FILE] Logfile to use (overrides configuration setting)
204 --reproducible Create reproducible images
205 --loginstall [DIR] Log all files installed from the host to [DIR]
206 --uefi Create an UEFI executable with the kernel cmdline and
207 kernel combined
208 --uefi-stub [FILE] Use the UEFI stub [FILE] to create an UEFI executable
209 --kernel-image [FILE] location of the kernel image
211 If [LIST] has multiple arguments, then you have to put these in quotes.
213 For example:
215 # dracut --add-drivers "module1 module2" ...
220 # Fills up host_devs stack variable and makes sure there are no duplicates
221 push_host_devs() {
222 local _dev
223 for _dev in "$@"; do
224 [[ " ${host_devs[@]} " == *" $_dev "* ]] && return
225 host_devs+=( "$_dev" )
226 done
229 # Little helper function for reading args from the commandline.
230 # it automatically handles -a b and -a=b variants, and returns 1 if
231 # we need to shift $3.
232 read_arg() {
233 # $1 = arg name
234 # $2 = arg value
235 # $3 = arg parameter
236 local rematch='^[^=]*=(.*)$'
237 if [[ $2 =~ $rematch ]]; then
238 read "$1" <<< "${BASH_REMATCH[1]}"
239 else
240 read "$1" <<< "$3"
241 # There is no way to shift our callers args, so
242 # return 1 to indicate they should do it instead.
243 return 1
247 dropindirs_sort()
249 local suffix=$1; shift
250 local -a files
251 local f d
253 for d in "$@"; do
254 for i in "$d/"*"$suffix"; do
255 if [[ -e "$i" ]]; then
256 printf "%s\n" "${i##*/}"
258 done
259 done | sort -Vu | {
260 readarray -t files
262 for f in "${files[@]}"; do
263 for d in "$@"; do
264 if [[ -e "$d/$f" ]]; then
265 printf "%s\n" "$d/$f"
266 continue 2
268 done
269 done
273 rearrange_params()
275 # Workaround -i, --include taking 2 arguments
276 set -- "${@/--include/++include}"
278 # This prevents any long argument ending with "-i"
279 # -i, like --opt-i but I think we can just prevent that
280 set -- "${@/%-i/++include}"
282 TEMP=$(unset POSIXLY_CORRECT; getopt \
283 -o "a:m:o:d:I:k:c:L:fvqlHhMN" \
284 --long kver: \
285 --long add: \
286 --long force-add: \
287 --long add-drivers: \
288 --long force-drivers: \
289 --long omit-drivers: \
290 --long modules: \
291 --long omit: \
292 --long drivers: \
293 --long filesystems: \
294 --long install: \
295 --long install-optional: \
296 --long fwdir: \
297 --long libdirs: \
298 --long fscks: \
299 --long add-fstab: \
300 --long mount: \
301 --long device: \
302 --long add-device: \
303 --long nofscks: \
304 --long ro-mnt \
305 --long kmoddir: \
306 --long conf: \
307 --long confdir: \
308 --long tmpdir: \
309 --long stdlog: \
310 --long compress: \
311 --long prefix: \
312 --long rebuild: \
313 --long force \
314 --long kernel-only \
315 --long no-kernel \
316 --long print-cmdline \
317 --long kernel-cmdline: \
318 --long strip \
319 --long nostrip \
320 --long prelink \
321 --long noprelink \
322 --long hardlink \
323 --long nohardlink \
324 --long noprefix \
325 --long mdadmconf \
326 --long nomdadmconf \
327 --long lvmconf \
328 --long nolvmconf \
329 --long debug \
330 --long profile \
331 --long sshkey: \
332 --long logfile: \
333 --long verbose \
334 --long quiet \
335 --long local \
336 --long hostonly \
337 --long host-only \
338 --long no-hostonly \
339 --long no-host-only \
340 --long hostonly-cmdline \
341 --long no-hostonly-cmdline \
342 --long persistent-policy: \
343 --long fstab \
344 --long help \
345 --long bzip2 \
346 --long lzma \
347 --long xz \
348 --long lzo \
349 --long lz4 \
350 --long no-compress \
351 --long gzip \
352 --long list-modules \
353 --long show-modules \
354 --long keep \
355 --long printsize \
356 --long regenerate-all \
357 --long noimageifnotneeded \
358 --long early-microcode \
359 --long no-early-microcode \
360 --long reproducible \
361 --long loginstall: \
362 --long uefi \
363 --long uefi-stub: \
364 --long kernel-image: \
365 -- "$@")
367 if (( $? != 0 )); then
368 usage
369 exit 1
373 verbosity_mod_l=0
374 unset kernel
375 unset outfile
377 rearrange_params "$@"
378 eval set -- "$TEMP"
380 # parse command line args to check if '--rebuild' option is present
381 unset append_args_l
382 unset rebuild_file
383 while :
385 if [ "$1" == "--" ]; then
386 shift; break
388 if [ "$1" == "--rebuild" ]; then
389 append_args_l="yes"
390 rebuild_file=$2
391 if [ ! -e $rebuild_file ]; then
392 echo "Image file '$rebuild_file', for rebuild, does not exist!"
393 exit 1
395 abs_rebuild_file=$(readlink -f "$rebuild_file") && rebuild_file="$abs_rebuild_file"
396 shift; continue
398 shift
399 done
401 # get output file name and kernel version from command line arguments
402 while (($# > 0)); do
403 case ${1%%=*} in
404 ++include)
405 shift 2;;
407 if ! [[ ${outfile+x} ]]; then
408 outfile=$1
409 elif ! [[ ${kernel+x} ]]; then
410 kernel=$1
411 else
412 printf "\nUnknown arguments: %s\n\n" "$*" >&2
413 usage; exit 1;
416 esac
417 shift
418 done
420 # extract input image file provided with rebuild option to get previous parameters, if any
421 if [[ $append_args_l == "yes" ]]; then
422 unset rebuild_param
424 # determine resultant file
425 if ! [[ $outfile ]]; then
426 outfile=$rebuild_file
429 if ! rebuild_param=$(lsinitrd $rebuild_file '*lib/dracut/build-parameter.txt'); then
430 echo "Image '$rebuild_file' has no rebuild information stored"
431 exit 1
434 # prepend previous parameters to current command line args
435 if [[ $rebuild_param ]]; then
436 TEMP="$rebuild_param $TEMP"
437 eval set -- "$TEMP"
438 rearrange_params "$@"
441 # clean the temporarily used scratch-pad directory
442 rm -rf $scratch_dir
445 unset PARMS_TO_STORE
446 PARMS_TO_STORE=""
448 eval set -- "$TEMP"
450 while :; do
451 if [ $1 != "--" ] && [ $1 != "--rebuild" ]; then
452 PARMS_TO_STORE+=" $1";
454 case $1 in
455 --kver) kernel="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
456 -a|--add) add_dracutmodules_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
457 --force-add) force_add_dracutmodules_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
458 --add-drivers) add_drivers_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
459 --force-drivers) force_drivers_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
460 --omit-drivers) omit_drivers_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
461 -m|--modules) dracutmodules_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
462 -o|--omit) omit_dracutmodules_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
463 -d|--drivers) drivers_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
464 --filesystems) filesystems_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
465 -I|--install) install_items_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
466 --install-optional) install_optional_items_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
467 --fwdir) fw_dir_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
468 --libdirs) libdirs_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
469 --fscks) fscks_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
470 --add-fstab) add_fstab_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
471 --mount) fstab_lines+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
472 --add-device|--device) add_device_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
473 --kernel-cmdline) kernel_cmdline_l+=("$2"); PARMS_TO_STORE+=" '$2'"; shift;;
474 --nofscks) nofscks_l="yes";;
475 --ro-mnt) ro_mnt_l="yes";;
476 -k|--kmoddir) drivers_dir_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
477 -c|--conf) conffile="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
478 --confdir) confdir="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
479 --tmpdir) tmpdir_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
480 -L|--stdlog) stdloglvl_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
481 --compress) compress_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
482 --prefix) prefix_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
483 --loginstall) loginstall_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
484 --rebuild) if [ $rebuild_file == $outfile ]; then
485 force=yes
487 shift
489 -f|--force) force=yes;;
490 --kernel-only) kernel_only="yes"; no_kernel="no";;
491 --no-kernel) kernel_only="no"; no_kernel="yes";;
492 --print-cmdline)
493 print_cmdline="yes"; hostonly_l="yes"; kernel_only="yes"; no_kernel="yes";;
494 --early-microcode)
495 early_microcode_l="yes";;
496 --no-early-microcode)
497 early_microcode_l="no";;
498 --strip) do_strip_l="yes";;
499 --nostrip) do_strip_l="no";;
500 --prelink) do_prelink_l="yes";;
501 --noprelink) do_prelink_l="no";;
502 --hardlink) do_hardlink_l="yes";;
503 --nohardlink) do_hardlink_l="no";;
504 --noprefix) prefix_l="/";;
505 --mdadmconf) mdadmconf_l="yes";;
506 --nomdadmconf) mdadmconf_l="no";;
507 --lvmconf) lvmconf_l="yes";;
508 --nolvmconf) lvmconf_l="no";;
509 --debug) debug="yes";;
510 --profile) profile="yes";;
511 --sshkey) sshkey="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
512 --logfile) logfile_l="$2"; shift;;
513 -v|--verbose) ((verbosity_mod_l++));;
514 -q|--quiet) ((verbosity_mod_l--));;
515 -l|--local)
516 allowlocal="yes"
517 [[ -f "$(readlink -f "${0%/*}")/dracut-init.sh" ]] \
518 && dracutbasedir="$(readlink -f "${0%/*}")"
520 -H|--hostonly|--host-only)
521 hostonly_l="yes" ;;
522 -N|--no-hostonly|--no-host-only)
523 hostonly_l="no" ;;
524 --hostonly-cmdline)
525 hostonly_cmdline_l="yes" ;;
526 --no-hostonly-cmdline)
527 hostonly_cmdline_l="no" ;;
528 --persistent-policy)
529 persistent_policy_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
530 --fstab) use_fstab_l="yes" ;;
531 -h|--help) long_usage; exit 1 ;;
532 -i|--include) include_src+=("$2"); PARMS_TO_STORE+=" '$2'";
533 shift;;
534 --bzip2) compress_l="bzip2";;
535 --lzma) compress_l="lzma";;
536 --xz) compress_l="xz";;
537 --lzo) compress_l="lzo";;
538 --lz4) compress_l="lz4";;
539 --no-compress) _no_compress_l="cat";;
540 --gzip) compress_l="gzip";;
541 --list-modules) do_list="yes";;
542 -M|--show-modules)
543 show_modules_l="yes"
545 --keep) keep="yes";;
546 --printsize) printsize="yes";;
547 --regenerate-all) regenerate_all="yes";;
548 --noimageifnotneeded) noimageifnotneeded="yes";;
549 --reproducible) reproducible_l="yes";;
550 --uefi) uefi="yes";;
551 --uefi-stub)
552 uefi_stub_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
553 --kernel-image)
554 kernel_image_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
555 --) shift; break;;
557 *) # should not even reach this point
558 printf "\n!Unknown option: '%s'\n\n" "$1" >&2; usage; exit 1;;
559 esac
560 shift
561 done
563 # getopt cannot handle multiple arguments, so just handle "-I,--include"
564 # the old fashioned way
566 while (($# > 0)); do
567 if [ "${1%%=*}" == "++include" ]; then
568 include_src+=("$2")
569 include_target+=("$3")
570 PARMS_TO_STORE+=" --include '$2' '$3'"
571 shift 2
573 shift
574 done
576 if [[ $regenerate_all == "yes" ]]; then
577 ret=0
578 if [[ $kernel ]]; then
579 printf -- "--regenerate-all cannot be called with a kernel version\n" >&2
580 exit 1
583 if [[ $outfile ]]; then
584 printf -- "--regenerate-all cannot be called with a image file\n" >&2
585 exit 1
588 ((len=${#dracut_args[@]}))
589 for ((i=0; i < len; i++)); do
590 [[ ${dracut_args[$i]} == "--regenerate-all" ]] && \
591 unset dracut_args[$i]
592 done
594 cd /lib/modules
595 for i in *; do
596 [[ -f $i/modules.dep ]] || [[ -f $i/modules.dep.bin ]] || continue
597 "$dracut_cmd" --kver="$i" "${dracut_args[@]}"
598 ((ret+=$?))
599 done
600 exit $ret
603 if ! [[ $kernel ]]; then
604 kernel=$(uname -r)
607 if [[ $kernel ]]; then
608 if ! [[ -d /lib/modules/$kernel ]] && [[ $no_kernel != yes ]]; then
609 printf -- "Kernel version $kernel has no module directory /lib/modules/$kernel\n" >&2
613 if ! [[ $outfile ]]; then
614 [[ -f /etc/machine-id ]] && read MACHINE_ID < /etc/machine-id
616 if [[ $MACHINE_ID ]] && ( [[ -d /boot/${MACHINE_ID} ]] || [[ -L /boot/${MACHINE_ID} ]] ); then
617 outfile="/boot/${MACHINE_ID}/$kernel/initrd"
618 else
619 outfile="/boot/initramfs-$kernel.img"
623 unset LC_MESSAGES
624 unset LC_CTYPE
625 export LC_ALL=C
626 export LANG=C
627 unset LD_LIBRARY_PATH
628 unset LD_PRELOAD
629 unset GREP_OPTIONS
631 export DRACUT_LOG_LEVEL=warning
632 [[ $debug ]] && {
633 export DRACUT_LOG_LEVEL=debug
634 export PS4='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): ';
635 set -x
638 [[ $profile ]] && {
639 export PS4='+ $(date "+%s.%N") ${BASH_SOURCE}@${LINENO}: ';
640 set -x
641 debug=yes
644 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
646 # if we were not passed a config file, try the default one
647 if [[ ! -f $conffile ]]; then
648 if [[ $allowlocal ]]; then
649 conffile="$dracutbasedir/dracut.conf"
650 else
651 conffile="/etc/dracut.conf"
655 if [[ ! -d $confdir ]]; then
656 if [[ $allowlocal ]]; then
657 confdir="$dracutbasedir/dracut.conf.d"
658 else
659 confdir="/etc/dracut.conf.d"
663 # source our config file
664 [[ -f $conffile ]] && . "$conffile"
666 # source our config dir
667 for f in $(dropindirs_sort ".conf" "$confdir" "$dracutbasedir/dracut.conf.d"); do
668 [[ -e $f ]] && . "$f"
669 done
671 DRACUT_PATH=${DRACUT_PATH:-/sbin /bin /usr/sbin /usr/bin}
673 for i in $DRACUT_PATH; do
674 rl=$i
675 if [ -L "$i" ]; then
676 rl=$(readlink -f $i)
678 if [[ "$NPATH" != *:$rl* ]] ; then
679 NPATH+=":$rl"
681 done
682 export PATH="${NPATH#:}"
683 unset NPATH
685 # these options add to the stuff in the config file
686 (( ${#add_dracutmodules_l[@]} )) && add_dracutmodules+=" ${add_dracutmodules_l[@]} "
687 (( ${#force_add_dracutmodules_l[@]} )) && force_add_dracutmodules+=" ${force_add_dracutmodules_l[@]} "
688 (( ${#fscks_l[@]} )) && fscks+=" ${fscks_l[@]} "
689 (( ${#add_fstab_l[@]} )) && add_fstab+=" ${add_fstab_l[@]} "
690 (( ${#fstab_lines_l[@]} )) && fstab_lines+=( "${fstab_lines_l[@]}" )
691 (( ${#install_items_l[@]} )) && install_items+=" ${install_items_l[@]} "
692 (( ${#install_optional_items_l[@]} )) && install_optional_items+=" ${install_optional_items_l[@]} "
694 # these options override the stuff in the config file
695 (( ${#dracutmodules_l[@]} )) && dracutmodules="${dracutmodules_l[@]}"
696 (( ${#omit_dracutmodules_l[@]} )) && omit_dracutmodules="${omit_dracutmodules_l[@]}"
697 (( ${#filesystems_l[@]} )) && filesystems="${filesystems_l[@]}"
698 (( ${#fw_dir_l[@]} )) && fw_dir="${fw_dir_l[@]}"
699 (( ${#libdirs_l[@]} ))&& libdirs="${libdirs_l[@]}"
701 [[ $stdloglvl_l ]] && stdloglvl=$stdloglvl_l
702 [[ ! $stdloglvl ]] && stdloglvl=4
703 stdloglvl=$((stdloglvl + verbosity_mod_l))
704 ((stdloglvl > 6)) && stdloglvl=6
705 ((stdloglvl < 0)) && stdloglvl=0
707 [[ $drivers_dir_l ]] && drivers_dir=$drivers_dir_l
708 [[ $do_strip_l ]] && do_strip=$do_strip_l
709 [[ $do_strip ]] || do_strip=yes
710 [[ $do_prelink_l ]] && do_prelink=$do_prelink_l
711 [[ $do_prelink ]] || do_prelink=yes
712 [[ $do_hardlink_l ]] && do_hardlink=$do_hardlink_l
713 [[ $do_hardlink ]] || do_hardlink=yes
714 [[ $prefix_l ]] && prefix=$prefix_l
715 [[ $prefix = "/" ]] && unset prefix
716 [[ $hostonly_l ]] && hostonly=$hostonly_l
717 [[ $hostonly_cmdline_l ]] && hostonly_cmdline=$hostonly_cmdline_l
718 [[ "$hostonly" == "yes" ]] && ! [[ $hostonly_cmdline ]] && hostonly_cmdline="yes"
719 [[ $persistent_policy_l ]] && persistent_policy=$persistent_policy_l
720 [[ $use_fstab_l ]] && use_fstab=$use_fstab_l
721 [[ $mdadmconf_l ]] && mdadmconf=$mdadmconf_l
722 [[ $lvmconf_l ]] && lvmconf=$lvmconf_l
723 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
724 [[ $fw_dir ]] || fw_dir="/lib/firmware/updates /lib/firmware /lib/firmware/$kernel"
725 [[ $tmpdir_l ]] && tmpdir="$tmpdir_l"
726 [[ $tmpdir ]] || tmpdir=/var/tmp
727 [[ $INITRD_COMPRESS ]] && compress=$INITRD_COMPRESS
728 [[ $compress_l ]] && compress=$compress_l
729 [[ $show_modules_l ]] && show_modules=$show_modules_l
730 [[ $nofscks_l ]] && nofscks="yes"
731 [[ $ro_mnt_l ]] && ro_mnt="yes"
732 [[ $early_microcode_l ]] && early_microcode=$early_microcode_l
733 [[ $early_microcode ]] || early_microcode=no
734 [[ $logfile_l ]] && logfile="$logfile_l"
735 [[ $reproducible_l ]] && reproducible="$reproducible_l"
736 [[ $loginstall_l ]] && loginstall="$loginstall_l"
737 [[ $uefi_stub_l ]] && uefi_stub="$uefi_stub_l"
738 [[ $kernel_image_l ]] && kernel_image="$kernel_image_l"
740 # eliminate IFS hackery when messing with fw_dir
741 fw_dir=${fw_dir//:/ }
743 # check for logfile and try to create one if it doesn't exist
744 if [[ -n "$logfile" ]];then
745 if [[ ! -f "$logfile" ]];then
746 touch "$logfile"
747 if [ ! $? -eq 0 ] ;then
748 printf "%s\n" "dracut: touch $logfile failed." >&2
753 # handle compression options.
754 [[ $compress ]] || compress="gzip"
755 case $compress in
756 bzip2) compress="bzip2 -9";
757 command -v lbzip2 > /dev/null 2>&1 && compress="lbzip2 -9";;
758 lzma) compress="lzma -9 -T0";;
759 xz) compress="xz --check=crc32 --lzma2=dict=1MiB -T0";;
760 gzip) compress="gzip -n -9";
761 if command -v pigz > /dev/null 2>&1; then
762 compress="pigz -9 -n -T -R"
763 elif command -v gzip --help 2>&1 | grep -q rsyncable; then
764 compress="gzip -n -9 --rsyncable"
767 lzo) compress="lzop -9";;
768 lz4) compress="lz4 -l -9";;
769 esac
770 if [[ $_no_compress_l = "cat" ]]; then
771 compress="cat"
774 [[ $hostonly = yes ]] && hostonly="-h"
775 [[ $hostonly != "-h" ]] && unset hostonly
777 [[ $reproducible == yes ]] && DRACUT_REPRODUCIBLE=1
779 readonly TMPDIR="$tmpdir"
780 readonly initdir="$(mktemp --tmpdir="$TMPDIR/" -d -t initramfs.XXXXXX)"
781 [ -d "$initdir" ] || {
782 printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t initramfs.XXXXXX failed." >&2
783 exit 1
786 if [[ $early_microcode = yes ]] || ( [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]] ); then
787 readonly early_cpio_dir="$(mktemp --tmpdir="$TMPDIR/" -d -t early_cpio.XXXXXX)"
788 [ -d "$early_cpio_dir" ] || {
789 printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t early_cpio.XXXXXX failed." >&2
790 exit 1
793 # clean up after ourselves no matter how we die.
794 trap '
795 ret=$?;
796 [[ $keep ]] && echo "Not removing $initdir." >&2 || { [[ $initdir ]] && rm -rf -- "$initdir"; };
797 [[ $keep ]] && echo "Not removing $early_cpio_dir." >&2 || { [[ $early_cpio_dir ]] && rm -Rf -- "$early_cpio_dir"; };
798 [[ $keep ]] && echo "Not removing $uefi_outdir." >&2 || { [[ $uefi_outdir ]] && rm -Rf -- "$uefi_outdir"; };
799 [[ $_dlogdir ]] && rm -Rf -- "$_dlogdir";
800 exit $ret;
801 ' EXIT
803 # clean up after ourselves no matter how we die.
804 trap 'exit 1;' SIGINT
806 export DRACUT_KERNEL_LAZY="1"
807 export DRACUT_RESOLVE_LAZY="1"
809 if [[ $print_cmdline ]]; then
810 stdloglvl=0
811 sysloglvl=0
812 fileloglvl=0
813 kmsgloglvl=0
816 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
817 . $dracutbasedir/dracut-version.sh
820 if [[ -f $dracutbasedir/dracut-init.sh ]]; then
821 . $dracutbasedir/dracut-init.sh
822 else
823 printf "%s\n" "dracut: Cannot find $dracutbasedir/dracut-init.sh." >&2
824 printf "%s\n" "dracut: Are you running from a git checkout?" >&2
825 printf "%s\n" "dracut: Try passing -l as an argument to $dracut_cmd" >&2
826 exit 1
829 if ! [[ $print_cmdline ]]; then
830 inst /bin/sh
831 if ! $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R "$initdir/bin/sh" &>/dev/null; then
832 unset DRACUT_RESOLVE_LAZY
833 export DRACUT_RESOLVE_DEPS=1
835 rm -fr -- ${initdir}/*
838 dracutfunctions=$dracutbasedir/dracut-functions.sh
839 export dracutfunctions
841 (( ${#drivers_l[@]} )) && drivers="${drivers_l[@]}"
842 drivers=${drivers/-/_}
844 (( ${#add_drivers_l[@]} )) && add_drivers+=" ${add_drivers_l[@]} "
845 add_drivers=${add_drivers/-/_}
847 (( ${#force_drivers_l[@]} )) && force_drivers+=" ${force_drivers_l[@]} "
848 force_drivers=${force_drivers/-/_}
850 (( ${#omit_drivers_l[@]} )) && omit_drivers+=" ${omit_drivers_l[@]} "
851 omit_drivers=${omit_drivers/-/_}
853 (( ${#kernel_cmdline_l[@]} )) && kernel_cmdline+=" ${kernel_cmdline_l[@]} "
855 omit_drivers_corrected=""
856 for d in $omit_drivers; do
857 [[ " $drivers $add_drivers " == *\ $d\ * ]] && continue
858 [[ " $drivers $force_drivers " == *\ $d\ * ]] && continue
859 omit_drivers_corrected+="$d|"
860 done
861 omit_drivers="${omit_drivers_corrected%|}"
862 unset omit_drivers_corrected
864 # prepare args for logging
865 for ((i=0; i < ${#dracut_args[@]}; i++)); do
866 [[ "${dracut_args[$i]}" == *\ * ]] && \
867 dracut_args[$i]="\"${dracut_args[$i]}\""
868 #" keep vim happy
869 done
871 dinfo "Executing: $dracut_cmd ${dracut_args[@]}"
873 [[ $do_list = yes ]] && {
874 for mod in $dracutbasedir/modules.d/*; do
875 [[ -d $mod ]] || continue;
876 [[ -e $mod/install || -e $mod/installkernel || \
877 -e $mod/module-setup.sh ]] || continue
878 printf "%s\n" "${mod##*/??}"
879 done
880 exit 0
883 # This is kinda legacy -- eventually it should go away.
884 case $dracutmodules in
885 ""|auto) dracutmodules="all" ;;
886 esac
888 abs_outfile=$(readlink -f "$outfile") && outfile="$abs_outfile"
890 if [[ -d $srcmods ]]; then
891 [[ -f $srcmods/modules.dep ]] || {
892 dwarn "$srcmods/modules.dep is missing. Did you run depmod?"
896 if [[ ! $print_cmdline ]]; then
897 if [[ -f $outfile && ! $force ]]; then
898 dfatal "Will not override existing initramfs ($outfile) without --force"
899 exit 1
902 outdir=${outfile%/*}
903 [[ $outdir ]] || outdir="/"
905 if [[ ! -d "$outdir" ]]; then
906 dfatal "Can't write to $outdir: Directory $outdir does not exist or is not accessible."
907 exit 1
908 elif [[ ! -w "$outdir" ]]; then
909 dfatal "No permission to write to $outdir."
910 exit 1
911 elif [[ -f "$outfile" && ! -w "$outfile" ]]; then
912 dfatal "No permission to write $outfile."
913 exit 1
916 if [[ $loginstall ]]; then
917 if ! mkdir -p "$loginstall"; then
918 dfatal "Could not create directory to log installed files to '$loginstall'."
919 exit 1
921 loginstall=$(readlink -f "$loginstall")
924 if [[ $uefi = yes ]]; then
925 if ! command -v objcopy &>/dev/null; then
926 dfatal "Need 'objcopy' to create a UEFI executable"
927 exit 1
929 unset EFI_MACHINE_TYPE_NAME
930 case $(arch) in
931 x86_64)
932 EFI_MACHINE_TYPE_NAME=x64;;
933 ia32)
934 EFI_MACHINE_TYPE_NAME=ia32;;
936 dfatal "Architecture '$(arch)' not supported to create a UEFI executable"
937 exit 1
939 esac
941 if ! [[ -s $uefi_stub ]]; then
942 for uefi_stub in \
943 "/lib/systemd/boot/efi/linux${EFI_MACHINE_TYPE_NAME}.efi.stub" \
944 "/usr/lib/gummiboot/linux${EFI_MACHINE_TYPE_NAME}.efi.stub"; do
945 [[ -s $uefi_stub ]] || continue
946 break
947 done
949 if ! [[ -s $uefi_stub ]]; then
950 dfatal "Can't find a uefi stub '$uefi_stub' to create a UEFI executable"
951 exit 1
954 if ! [[ $kernel_image ]]; then
955 for kernel_image in "/lib/modules/$kernel/vmlinuz" "/boot/vmlinuz-$kernel"; do
956 [[ -s "$kernel_image" ]] || continue
957 break
958 done
960 if ! [[ -s $kernel_image ]]; then
961 dfatal "Can't find a kernel image '$kernel_image' to create a UEFI executable"
962 exit 1
967 if [[ $acpi_override = yes ]] && ! check_kernel_config CONFIG_ACPI_INITRD_TABLE_OVERRIDE; then
968 dwarn "Disabling ACPI override, because kernel does not support it. CONFIG_ACPI_INITRD_TABLE_OVERRIDE!=y"
969 unset acpi_override
972 if [[ $early_microcode = yes ]]; then
973 if [[ $hostonly ]]; then
974 [[ $(get_cpu_vendor) == "AMD" ]] \
975 && ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
976 && unset early_microcode
977 [[ $(get_cpu_vendor) == "Intel" ]] \
978 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
979 && unset early_microcode
980 else
981 ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
982 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
983 && unset early_microcode
985 [[ $early_microcode != yes ]] \
986 && dwarn "Disabling early microcode, because kernel does not support it. CONFIG_MICROCODE_[AMD|INTEL]_EARLY!=y"
989 # Need to be able to have non-root users read stuff (rpcbind etc)
990 chmod 755 "$initdir"
992 if [[ $hostonly ]]; then
993 for i in /sys /proc /run /dev; do
994 if ! findmnt --target "$i" &>/dev/null; then
995 dwarning "Turning off host-only mode: '$i' is not mounted!"
996 unset hostonly
998 done
1001 declare -A host_fs_types
1003 for line in "${fstab_lines[@]}"; do
1004 set -- $line
1005 dev="$1"
1006 #dev mp fs fsopts
1007 case "$dev" in
1008 UUID=*)
1009 dev=$(blkid -l -t UUID=${dev#UUID=} -o device)
1011 LABEL=*)
1012 dev=$(blkid -l -t LABEL=${dev#LABEL=} -o device)
1014 PARTUUID=*)
1015 dev=$(blkid -l -t PARTUUID=${dev#PARTUUID=} -o device)
1017 PARTLABEL=*)
1018 dev=$(blkid -l -t PARTLABEL=${dev#PARTLABEL=} -o device)
1020 esac
1021 [ -z "$dev" ] && dwarn "Bad fstab entry $@" && continue
1022 if [[ "$3" == btrfs ]]; then
1023 for i in $(btrfs_devs "$2"); do
1024 push_host_devs "$i"
1025 done
1027 push_host_devs "$dev"
1028 host_fs_types["$dev"]="$3"
1029 done
1031 for f in $add_fstab; do
1032 [[ -e $f ]] || continue
1033 while read dev rest || [ -n "$dev" ]; do
1034 push_host_devs "$dev"
1035 done < "$f"
1036 done
1038 for dev in $add_device; do
1039 push_host_devs "$dev"
1040 done
1042 if (( ${#add_device_l[@]} )); then
1043 add_device+=" ${add_device_l[@]} "
1044 push_host_devs "${add_device_l[@]}"
1047 if [[ $hostonly ]]; then
1048 # in hostonly mode, determine all devices, which have to be accessed
1049 # and examine them for filesystem types
1051 for mp in \
1052 "/" \
1053 "/etc" \
1054 "/bin" \
1055 "/sbin" \
1056 "/lib" \
1057 "/lib64" \
1058 "/usr" \
1059 "/usr/bin" \
1060 "/usr/sbin" \
1061 "/usr/lib" \
1062 "/usr/lib64" \
1063 "/boot" \
1064 "/boot/efi" \
1067 mp=$(readlink -f "$mp")
1068 mountpoint "$mp" >/dev/null 2>&1 || continue
1069 _dev=$(find_block_device "$mp")
1070 _bdev=$(readlink -f "/dev/block/$_dev")
1071 [[ -b $_bdev ]] && _dev=$_bdev
1072 push_host_devs $_dev
1073 [[ "$mp" == "/" ]] && root_devs+=("$_dev")
1074 push_host_devs "$_dev"
1075 if [[ $(find_mp_fstype "$mp") == btrfs ]]; then
1076 for i in $(btrfs_devs "$mp"); do
1077 [[ "$mp" == "/" ]] && root_devs+=("$i")
1078 push_host_devs "$i"
1079 done
1081 done
1083 if [[ -f /proc/swaps ]] && [[ -f /etc/fstab ]]; then
1084 while read dev type rest || [ -n "$dev" ]; do
1085 [[ -b $dev ]] || continue
1086 [[ "$type" == "partition" ]] || continue
1088 while read _d _m _t _o _r || [ -n "$_d" ]; do
1089 [[ "$_d" == \#* ]] && continue
1090 [[ $_d ]] || continue
1091 [[ $_t != "swap" ]] && continue
1092 [[ $_m != "swap" ]] && [[ $_m != "none" ]] && continue
1093 [[ "$_o" == *noauto* ]] && continue
1094 _d=$(expand_persistent_dev "$_d")
1095 [[ "$_d" -ef "$dev" ]] || continue
1097 if [[ -f /etc/crypttab ]]; then
1098 while read _mapper _a _p _o || [ -n "$_mapper" ]; do
1099 [[ $_mapper = \#* ]] && continue
1100 [[ "$_d" -ef /dev/mapper/"$_mapper" ]] || continue
1101 [[ "$_o" ]] || _o="$_p"
1102 # skip entries with password files
1103 [[ "$_p" == /* ]] && [[ -f $_p ]] && continue 2
1104 # skip mkswap swap
1105 [[ $_o == *swap* ]] && continue 2
1106 done < /etc/crypttab
1109 _dev="$(readlink -f "$dev")"
1110 push_host_devs "$_dev"
1111 swap_devs+=("$_dev")
1112 break
1113 done < /etc/fstab
1114 done < /proc/swaps
1117 # collect all "x-initrd.mount" entries from /etc/fstab
1118 if [[ -f /etc/fstab ]]; then
1119 while read _d _m _t _o _r || [ -n "$_d" ]; do
1120 [[ "$_d" == \#* ]] && continue
1121 [[ $_d ]] || continue
1122 [[ "$_o" != *x-initrd.mount* ]] && continue
1123 _dev=$(expand_persistent_dev "$_d")
1124 _dev="$(readlink -f "$_dev")"
1125 [[ -b $_dev ]] || continue
1127 push_host_devs "$_dev"
1128 if [[ "$_t" == btrfs ]]; then
1129 for i in $(find_btrfs_devs "$_m"); do
1130 push_host_devs "$i"
1131 done
1133 done < /etc/fstab
1136 # record all host modaliases
1137 declare -A host_modalias
1138 find /sys/devices/ -name uevent -print > "$initdir/.modalias"
1139 while read m || [ -n "$m" ]; do
1140 while read line || [ -n "$line" ]; do
1141 [[ "$line" != MODALIAS\=* ]] && continue
1142 modalias="${line##MODALIAS=}" && [[ $modalias ]] && host_modalias["$modalias"]=1
1143 break
1144 done < "$m"
1145 done < "$initdir/.modalias"
1147 rm -f -- "$initdir/.modalias"
1149 while read _k _s _v || [ -n "$_k" ]; do
1150 [ "$_k" != "name" -a "$_k" != "driver" ] && continue
1151 host_modalias["$_v"]=1
1152 done </proc/crypto
1154 # check /proc/modules
1155 declare -A host_modules
1156 while read m rest || [ -n "$m" ]; do
1157 host_modules["$m"]=1
1158 done </proc/modules
1161 unset m
1162 unset rest
1164 _get_fs_type() {
1165 [[ $1 ]] || return
1166 if [[ -b /dev/block/$1 ]]; then
1167 ID_FS_TYPE=$(get_fs_env "/dev/block/$1") && host_fs_types["$(readlink -f "/dev/block/$1")"]="$ID_FS_TYPE"
1168 return 1
1170 if [[ -b $1 ]]; then
1171 ID_FS_TYPE=$(get_fs_env "$1") && host_fs_types["$(readlink -f "$1")"]="$ID_FS_TYPE"
1172 return 1
1174 if fstype=$(find_dev_fstype "$1"); then
1175 host_fs_types["$1"]="$fstype"
1176 return 1
1178 return 1
1181 for dev in "${host_devs[@]}"; do
1182 _get_fs_type "$dev"
1183 check_block_and_slaves_all _get_fs_type "$(get_maj_min "$dev")"
1184 done
1186 for dev in "${!host_fs_types[@]}"; do
1187 [[ ${host_fs_types[$dev]} = "reiserfs" ]] || [[ ${host_fs_types[$dev]} = "xfs" ]] || continue
1188 rootopts=$(find_dev_fsopts "$dev")
1189 if [[ ${host_fs_types[$dev]} = "reiserfs" ]]; then
1190 journaldev=$(fs_get_option $rootopts "jdev")
1191 elif [[ ${host_fs_types[$dev]} = "xfs" ]]; then
1192 journaldev=$(fs_get_option $rootopts "logdev")
1194 if [[ $journaldev ]]; then
1195 dev="$(readlink -f "$dev")"
1196 push_host_devs "$dev"
1197 _get_fs_type "$dev"
1198 check_block_and_slaves_all _get_fs_type "$(get_maj_min "$dev")"
1200 done
1202 [[ -d $udevdir ]] \
1203 || udevdir="$(pkg-config udev --variable=udevdir 2>/dev/null)"
1204 if ! [[ -d "$udevdir" ]]; then
1205 [[ ! -h /lib ]] && [[ -d /lib/udev ]] && udevdir=/lib/udev
1206 [[ -d /usr/lib/udev ]] && udevdir=/usr/lib/udev
1209 [[ -d $systemdutildir ]] \
1210 || systemdutildir=$(pkg-config systemd --variable=systemdutildir 2>/dev/null)
1212 if ! [[ -d "$systemdutildir" ]]; then
1213 [[ ! -h /lib ]] && [[ -d /lib/systemd ]] && systemdutildir=/lib/systemd
1214 [[ -d /usr/lib/systemd ]] && systemdutildir=/usr/lib/systemd
1217 [[ -d $systemdsystemunitdir ]] \
1218 || systemdsystemunitdir=$(pkg-config systemd --variable=systemdsystemunitdir 2>/dev/null)
1220 [[ -d "$systemdsystemunitdir" ]] || systemdsystemunitdir=${systemdutildir}/system
1222 [[ -d $systemdsystemconfdir ]] \
1223 || systemdsystemconfdir=$(pkg-config systemd --variable=systemdsystemconfdir 2>/dev/null)
1225 [[ -d "$systemdsystemconfdir" ]] || systemdsystemconfdir=/etc/systemd/system
1227 [[ -d $tmpfilesdir ]] \
1228 || tmpfilesdir=$(pkg-config systemd --variable=tmpfilesdir 2>/dev/null)
1230 if ! [[ -d "$tmpfilesdir" ]]; then
1231 [[ -f /lib/tmpfiles.d ]] && tmpfilesdir=/lib/tmpfiles.d
1232 [[ -f /usr/lib/tmpfiles.d ]] && tmpfilesdir=/usr/lib/tmpfiles.d
1235 export initdir dracutbasedir \
1236 dracutmodules force_add_dracutmodules add_dracutmodules omit_dracutmodules \
1237 mods_to_load \
1238 fw_dir drivers_dir debug no_kernel kernel_only \
1239 omit_drivers mdadmconf lvmconf root_dev \
1240 use_fstab fstab_lines libdirs fscks nofscks ro_mnt \
1241 stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
1242 debug host_fs_types host_devs swap_devs sshkey add_fstab \
1243 DRACUT_VERSION udevdir prefix filesystems drivers \
1244 systemdutildir systemdsystemunitdir systemdsystemconfdir \
1245 host_modalias host_modules hostonly_cmdline loginstall \
1246 tmpfilesdir
1248 mods_to_load=""
1249 # check all our modules to see if they should be sourced.
1250 # This builds a list of modules that we will install next.
1251 for_each_module_dir check_module
1252 for_each_module_dir check_mount
1254 dracut_module_included "fips" && export DRACUT_FIPS_MODE=1
1256 do_print_cmdline()
1258 local -A _mods_to_print
1259 for i in $modules_loaded $mods_to_load; do
1260 _mods_to_print[$i]=1
1261 done
1263 # source our modules.
1264 for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1265 _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]}
1266 [[ ${_mods_to_print[$_d_mod]} ]] || continue
1267 module_cmdline "$_d_mod"
1268 done
1269 unset moddir
1272 if [[ $print_cmdline ]]; then
1273 do_print_cmdline
1274 printf "\n"
1275 exit 0
1278 # Create some directory structure first
1279 [[ $prefix ]] && mkdir -m 0755 -p "${initdir}${prefix}"
1281 [[ -h /lib ]] || mkdir -m 0755 -p "${initdir}${prefix}/lib"
1282 [[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib"
1284 if [[ $prefix ]]; then
1285 for d in bin etc lib sbin tmp usr var $libdirs; do
1286 [[ "$d" == */* ]] && continue
1287 ln -sfn "${prefix#/}/${d#/}" "$initdir/$d"
1288 done
1291 if [[ $kernel_only != yes ]]; then
1292 for d in usr/bin usr/sbin bin etc lib sbin tmp usr var var/tmp $libdirs; do
1293 [[ -e "${initdir}${prefix}/$d" ]] && continue
1294 if [ -L "/$d" ]; then
1295 inst_symlink "/$d" "${prefix}/$d"
1296 else
1297 mkdir -m 0755 -p "${initdir}${prefix}/$d"
1299 done
1301 for d in dev proc sys sysroot root run; do
1302 if [ -L "/$d" ]; then
1303 inst_symlink "/$d"
1304 else
1305 mkdir -m 0755 -p "$initdir/$d"
1307 done
1309 ln -sfn ../run "$initdir/var/run"
1310 ln -sfn ../run/lock "$initdir/var/lock"
1311 else
1312 for d in lib "$libdir"; do
1313 [[ -e "${initdir}${prefix}/$d" ]] && continue
1314 if [ -h "/$d" ]; then
1315 inst "/$d" "${prefix}/$d"
1316 else
1317 mkdir -m 0755 -p "${initdir}${prefix}/$d"
1319 done
1322 if [[ $kernel_only != yes ]]; then
1323 mkdir -p "${initdir}/etc/cmdline.d"
1324 for _d in $hookdirs; do
1325 mkdir -m 0755 -p ${initdir}/lib/dracut/hooks/$_d
1326 done
1327 if [[ "$UID" = "0" ]]; then
1328 [ -c ${initdir}/dev/null ] || mknod ${initdir}/dev/null c 1 3
1329 [ -c ${initdir}/dev/kmsg ] || mknod ${initdir}/dev/kmsg c 1 11
1330 [ -c ${initdir}/dev/console ] || mknod ${initdir}/dev/console c 5 1
1334 _isize=0 #initramfs size
1335 modules_loaded=" "
1336 # source our modules.
1337 for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1338 _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]}
1339 [[ "$mods_to_load" == *\ $_d_mod\ * ]] || continue
1340 if [[ $show_modules = yes ]]; then
1341 printf "%s\n" "$_d_mod"
1342 else
1343 dinfo "*** Including module: $_d_mod ***"
1345 if [[ $kernel_only == yes ]]; then
1346 module_installkernel "$_d_mod" || {
1347 dfatal "installkernel failed in module $_d_mod"
1348 exit 1
1350 else
1351 module_install "$_d_mod"
1352 if [[ $no_kernel != yes ]]; then
1353 module_installkernel "$_d_mod" || {
1354 dfatal "installkernel failed in module $_d_mod"
1355 exit 1
1359 mods_to_load=${mods_to_load// $_d_mod /}
1360 modules_loaded+="$_d_mod "
1362 #print the module install size
1363 if [ -n "$printsize" ]; then
1364 _isize_new=$(du -sk ${initdir}|cut -f1)
1365 _isize_delta=$((_isize_new - _isize))
1366 printf "%s\n" "$_d_mod install size: ${_isize_delta}k"
1367 _isize=$_isize_new
1369 done
1370 unset moddir
1372 for i in $modules_loaded; do
1373 mkdir -p $initdir/lib/dracut
1374 printf "%s\n" "$i" >> $initdir/lib/dracut/modules.txt
1375 done
1377 dinfo "*** Including modules done ***"
1379 ## final stuff that has to happen
1380 if [[ $no_kernel != yes ]]; then
1382 if [[ $drivers ]]; then
1383 hostonly='' instmods $drivers
1386 if [[ $add_drivers ]]; then
1387 hostonly='' instmods -c $add_drivers
1389 if [[ $force_drivers ]]; then
1390 hostonly='' instmods -c $force_drivers
1391 rm -f $initdir/etc/cmdline.d/20-force_driver.conf
1392 for mod in $force_drivers; do
1393 echo "rd.driver.pre=$mod" >>$initdir/etc/cmdline.d/20-force_drivers.conf
1394 done
1396 if [[ $filesystems ]]; then
1397 hostonly='' instmods -c $filesystems
1400 dinfo "*** Installing kernel module dependencies and firmware ***"
1401 dracut_kernel_post
1402 dinfo "*** Installing kernel module dependencies and firmware done ***"
1404 if [[ $noimageifnotneeded == yes ]] && [[ $hostonly ]]; then
1405 if [[ ! -f "$initdir/lib/dracut/need-initqueue" ]] && \
1406 [[ -f ${initdir}/lib/modules/$kernel/modules.dep && ! -s ${initdir}/lib/modules/$kernel/modules.dep ]]; then
1407 for i in ${initdir}/etc/cmdline.d/*.conf; do
1408 # We need no initramfs image and do not generate one.
1409 [[ $i == "${initdir}/etc/cmdline.d/*.conf" ]] && exit 0
1410 done
1415 if [[ $kernel_only != yes ]]; then
1416 (( ${#install_items[@]} > 0 )) && inst_multiple "${install_items[@]}"
1417 (( ${#install_optional_items[@]} > 0 )) && inst_multiple -o "${install_optional_items[@]}"
1419 [[ $kernel_cmdline ]] && printf "%s\n" "$kernel_cmdline" >> "${initdir}/etc/cmdline.d/01-default.conf"
1421 for line in "${fstab_lines[@]}"; do
1422 line=($line)
1423 [ -z "${line[3]}" ] && line[3]="defaults"
1424 [ -z "${line[4]}" ] && line[4]="0"
1425 [ -z "${line[5]}" ] && line[5]="2"
1426 strstr "${line[2]}" "nfs" && line[5]="0"
1427 echo "${line[@]}" >> "${initdir}/etc/fstab"
1428 done
1430 for f in $add_fstab; do
1431 cat "$f" >> "${initdir}/etc/fstab"
1432 done
1434 if [ -d ${initdir}/$systemdutildir ]; then
1435 mkdir -p ${initdir}/etc/conf.d
1437 printf "%s\n" "systemdutildir=\"$systemdutildir\""
1438 printf "%s\n" "systemdsystemunitdir=\"$systemdsystemunitdir\""
1439 printf "%s\n" "systemdsystemconfdir=\"$systemdsystemconfdir\""
1440 } > ${initdir}/etc/conf.d/systemd.conf
1443 if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then
1444 dinfo "*** Resolving executable dependencies ***"
1445 find "$initdir" -type f -perm /0111 -not -path '*.ko' -print0 \
1446 | xargs -r -0 $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R ${DRACUT_FIPS_MODE:+-H} --
1447 dinfo "*** Resolving executable dependencies done***"
1450 # libpthread workaround: pthread_cancel wants to dlopen libgcc_s.so
1451 for _dir in $libdirs; do
1452 for _f in "$_dir/libpthread.so"*; do
1453 [[ -e "$_f" ]] || continue
1454 inst_libdir_file "libgcc_s.so*"
1455 break 2
1456 done
1457 done
1460 for ((i=0; i < ${#include_src[@]}; i++)); do
1461 src="${include_src[$i]}"
1462 target="${include_target[$i]}"
1463 if [[ $src && $target ]]; then
1464 if [[ -f $src ]]; then
1465 inst $src $target
1466 else
1467 ddebug "Including directory: $src"
1468 destdir="${initdir}/${target}"
1469 mkdir -p "$destdir"
1470 # check for preexisting symlinks, so we can cope with the
1471 # symlinks to $prefix
1472 # Objectname is a file or a directory
1473 for objectname in "$src"/*; do
1474 [[ -e "$objectname" || -h "$objectname" ]] || continue
1475 if [[ -d "$objectname" ]]; then
1476 # objectname is a directory, let's compute the final directory name
1477 object_destdir=${destdir}/${objectname#$src/}
1478 if ! [[ -e "$object_destdir" ]]; then
1479 mkdir -m 0755 -p "$object_destdir"
1480 chmod --reference="$objectname" "$object_destdir"
1482 cp --reflink=auto --sparse=auto -fa -t "$object_destdir" "$objectname"/*
1483 else
1484 cp --reflink=auto --sparse=auto -fa -t "$destdir" "$objectname"
1486 done
1489 done
1491 if [[ $kernel_only != yes ]]; then
1492 # make sure that library links are correct and up to date
1493 for f in /etc/ld.so.conf /etc/ld.so.conf.d/*; do
1494 [[ -f $f ]] && inst_simple "$f"
1495 done
1496 if ! ldconfig -r "$initdir"; then
1497 if [[ $UID = 0 ]]; then
1498 derror "ldconfig exited ungracefully"
1499 else
1500 derror "ldconfig might need uid=0 (root) for chroot()"
1505 PRELINK_BIN="$(command -v prelink)"
1506 if [[ $UID = 0 ]] && [[ $PRELINK_BIN ]]; then
1507 if [[ $DRACUT_FIPS_MODE ]]; then
1508 dinfo "*** Installing prelink files ***"
1509 inst_multiple -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf /etc/prelink.cache
1510 elif [[ $do_prelink == yes ]]; then
1511 dinfo "*** Pre-linking files ***"
1512 inst_multiple -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf
1513 chroot "$initdir" "$PRELINK_BIN" -a
1514 rm -f -- "$initdir/$PRELINK_BIN"
1515 rm -fr -- "$initdir"/etc/prelink.*
1516 dinfo "*** Pre-linking files done ***"
1520 if [[ $do_hardlink = yes ]] && command -v hardlink >/dev/null; then
1521 dinfo "*** Hardlinking files ***"
1522 hardlink "$initdir" 2>&1
1523 dinfo "*** Hardlinking files done ***"
1526 # strip binaries
1527 if [[ $do_strip = yes ]] ; then
1528 for p in strip xargs find; do
1529 if ! type -P $p >/dev/null; then
1530 dinfo "Could not find '$p'. Not stripping the initramfs."
1531 do_strip=no
1533 done
1536 if [[ $do_strip = yes ]] && ! [[ $DRACUT_FIPS_MODE ]]; then
1537 dinfo "*** Stripping files ***"
1538 find "$initdir" -type f \
1539 -executable -not -path '*/lib/modules/*.ko' -print0 \
1540 | xargs -r -0 strip -g 2>/dev/null
1542 # strip kernel modules, but do not touch signed modules
1543 find "$initdir" -type f -path '*/lib/modules/*.ko' -print0 \
1544 | while read -r -d $'\0' f || [ -n "$f" ]; do
1545 SIG=$(tail -c 28 "$f")
1546 [[ $SIG == '~Module signature appended~' ]] || { printf "%s\000" "$f"; }
1547 done | xargs -r -0 strip -g
1549 dinfo "*** Stripping files done ***"
1551 if [[ $early_microcode = yes ]]; then
1552 dinfo "*** Generating early-microcode cpio image ***"
1553 ucode_dir=(amd-ucode intel-ucode)
1554 ucode_dest=(AuthenticAMD.bin GenuineIntel.bin)
1555 _dest_dir="$early_cpio_dir/d/kernel/x86/microcode"
1556 _dest_idx="0 1"
1557 mkdir -p $_dest_dir
1558 if [[ $hostonly ]]; then
1559 [[ $(get_cpu_vendor) == "AMD" ]] && _dest_idx="0"
1560 [[ $(get_cpu_vendor) == "Intel" ]] && _dest_idx="1"
1562 for idx in $_dest_idx; do
1563 _fw=${ucode_dir[$idx]}
1564 for _fwdir in $fw_dir; do
1565 if [[ -d $_fwdir && -d $_fwdir/$_fw ]]; then
1566 _src="*"
1567 dinfo "*** Constructing ${ucode_dest[$idx]} ****"
1568 if [[ $hostonly ]]; then
1569 _src=$(get_ucode_file)
1570 if ! [[ -r $_fwdir/$_fw/$_src ]];then
1571 break;
1574 cat $_fwdir/$_fw/$_src > $_dest_dir/${ucode_dest[$idx]}
1575 create_early_cpio="yes"
1577 done
1578 done
1581 if [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]]; then
1582 dinfo "*** Packaging ACPI tables to override BIOS provided ones ***"
1583 _dest_dir="$early_cpio_dir/d/kernel/firmware/acpi"
1584 mkdir -p $_dest_dir
1585 for table in $acpi_table_dir/*.aml; do
1586 dinfo " Adding ACPI table: $table"
1587 cp -a $table $_dest_dir
1588 create_early_cpio="yes"
1589 done
1592 dinfo "*** Store current command line parameters ***"
1593 if ! ( echo $PARMS_TO_STORE > $initdir/lib/dracut/build-parameter.txt ); then
1594 dfatal "Could not store the current command line parameters"
1595 exit 1
1598 if [[ $hostonly_cmdline ]] ; then
1599 unset _stored_cmdline
1600 if [ -d $initdir/etc/cmdline.d ];then
1601 dinfo "Stored kernel commandline:"
1602 for conf in $initdir/etc/cmdline.d/*.conf ; do
1603 [ -e "$conf" ] || continue
1604 dinfo "$(< $conf)"
1605 _stored_cmdline=1
1606 done
1608 if ! [[ $_stored_cmdline ]]; then
1609 dinfo "No dracut internal kernel commandline stored in initrd"
1612 rm -f -- "$outfile"
1613 dinfo "*** Creating image file '$outfile' ***"
1615 if [[ $uefi = yes ]]; then
1616 uefi_outfile="$outfile"
1617 readonly uefi_outdir="$(mktemp --tmpdir="$TMPDIR/" -d -t initrd.XXXXXX)"
1618 # redirect initrd output
1619 outfile="$uefi_outdir/initrd"
1622 if [[ $DRACUT_REPRODUCIBLE ]]; then
1623 find "$initdir" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1624 | xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1626 [[ "$(cpio --help)" == *--reproducible* ]] && CPIO_REPRODUCIBLE=1
1629 [[ "$UID" != 0 ]] && cpio_owner_root="-R 0:0"
1631 if [[ $create_early_cpio = yes ]]; then
1632 echo 1 > "$early_cpio_dir/d/early_cpio"
1634 if [[ $DRACUT_REPRODUCIBLE ]]; then
1635 find "$early_cpio_dir/d" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1636 | xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1639 # The microcode blob is _before_ the initramfs blob, not after
1641 cd "$early_cpio_dir/d"
1642 find . -print0 | sort -z \
1643 | cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc -o --quiet > $outfile
1647 if ! (
1648 umask 077; cd "$initdir"
1649 find . -print0 | sort -z \
1650 | cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc -o --quiet \
1651 | $compress >> "$outfile"
1652 ); then
1653 dfatal "dracut: creation of $outfile failed"
1654 exit 1
1656 dinfo "*** Creating initrd image file '$outfile' done ***"
1658 if (( maxloglvl >= 5 )); then
1659 if [[ $allowlocal ]]; then
1660 "$dracutbasedir/lsinitrd.sh" "$outfile"| ddebug
1661 else
1662 lsinitrd "$outfile"| ddebug
1666 if [[ $uefi = yes ]]; then
1667 if [[ $kernel_cmdline ]]; then
1668 echo -n "$kernel_cmdline" > "$uefi_outdir/cmdline.txt"
1669 elif [[ $hostonly_cmdline = yes ]] && [ -d $initdir/etc/cmdline.d ];then
1670 for conf in $initdir/etc/cmdline.d/*.conf ; do
1671 [ -e "$conf" ] || continue
1672 printf "%s " "$(< $conf)" >> "$uefi_outdir/cmdline.txt"
1673 done
1674 else
1675 do_print_cmdline > "$uefi_outdir/cmdline.txt"
1677 echo -ne "\x00" >> "$uefi_outdir/cmdline.txt"
1679 dinfo "Using UEFI kernel cmdline:"
1680 dinfo $(< "$uefi_outdir/cmdline.txt")
1682 [[ -s /usr/lib/os-release ]] && uefi_osrelease="/usr/lib/os-release"
1683 [[ -s /etc/os-release ]] && uefi_osrelease="/etc/os-release"
1685 objcopy \
1686 ${uefi_osrelease:+--add-section .osrel=$uefi_osrelease --change-section-vma .osrel=0x20000} \
1687 --add-section .cmdline="$uefi_outdir/cmdline.txt" --change-section-vma .cmdline=0x30000 \
1688 --add-section .linux="$kernel_image" --change-section-vma .linux=0x40000 \
1689 --add-section .initrd="$outfile" --change-section-vma .initrd=0x3000000 \
1690 "$uefi_stub" "$uefi_outfile"
1691 dinfo "*** Creating UEFI image file '$uefi_outfile' done ***"
1694 exit 0