dracut.sh: add $tmpfilesdir to install files to /usr/lib/tmpfiles.d
[dracut.git] / dracut.sh
blob2357987cd69f60e6420ceab2196da54bd5946e31
1 #!/bin/bash
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
25 dracut_args=( "$@" )
27 set -o pipefail
29 usage() {
30 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
31 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
32 . $dracutbasedir/dracut-version.sh
35 # 80x25 linebreak here ^
36 cat << EOF
37 Usage: $0 [OPTION]... [<initramfs> [<kernel-version>]]
39 Version: $DRACUT_VERSION
41 Creates initial ramdisk images for preloading modules
43 -h, --help Display all options
45 If a [LIST] has multiple arguments, then you have to put these in quotes.
47 For example:
49 # dracut --add-drivers "module1 module2" ...
51 EOF
54 long_usage() {
55 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
56 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
57 . $dracutbasedir/dracut-version.sh
60 # 80x25 linebreak here ^
61 cat << EOF
62 Usage: $0 [OPTION]... [<initramfs> [<kernel-version>]]
64 Version: $DRACUT_VERSION
66 Creates initial ramdisk images for preloading modules
68 --kver [VERSION] Set kernel version to [VERSION].
69 -f, --force Overwrite existing initramfs file.
70 -a, --add [LIST] Add a space-separated list of dracut modules.
71 --rebuild Append arguments to those of existing image and rebuild
72 -m, --modules [LIST] Specify a space-separated list of dracut modules to
73 call when building the initramfs. Modules are located
74 in /usr/lib/dracut/modules.d.
75 -o, --omit [LIST] Omit a space-separated list of dracut modules.
76 --force-add [LIST] Force to add a space-separated list of dracut modules
77 to the default set of modules, when -H is specified.
78 -d, --drivers [LIST] Specify a space-separated list of kernel modules to
79 exclusively include in the initramfs.
80 --add-drivers [LIST] Specify a space-separated list of kernel
81 modules to add to the initramfs.
82 --force-drivers [LIST] Specify a space-separated list of kernel
83 modules to add to the initramfs and make sure they
84 are tried to be loaded via modprobe same as passing
85 rd.driver.pre=DRIVER kernel parameter.
86 --omit-drivers [LIST] Specify a space-separated list of kernel
87 modules not to add to the initramfs.
88 --filesystems [LIST] Specify a space-separated list of kernel filesystem
89 modules to exclusively include in the generic
90 initramfs.
91 -k, --kmoddir [DIR] Specify the directory, where to look for kernel
92 modules
93 --fwdir [DIR] Specify additional directories, where to look for
94 firmwares, separated by :
95 --kernel-only Only install kernel drivers and firmware files
96 --no-kernel Do not install kernel drivers and firmware files
97 --print-cmdline Print the kernel command line for the given disk layout
98 --early-microcode Combine early microcode with ramdisk
99 --no-early-microcode Do not combine early microcode with ramdisk
100 --kernel-cmdline [PARAMETERS] Specify default kernel command line parameters
101 --strip Strip binaries in the initramfs
102 --nostrip Do not strip binaries in the initramfs
103 --prelink Prelink binaries in the initramfs
104 --noprelink Do not prelink binaries in the initramfs
105 --hardlink Hardlink files in the initramfs
106 --nohardlink Do not hardlink files in the initramfs
107 --prefix [DIR] Prefix initramfs files with [DIR]
108 --noprefix Do not prefix initramfs files
109 --mdadmconf Include local /etc/mdadm.conf
110 --nomdadmconf Do not include local /etc/mdadm.conf
111 --lvmconf Include local /etc/lvm/lvm.conf
112 --nolvmconf Do not include local /etc/lvm/lvm.conf
113 --fscks [LIST] Add a space-separated list of fsck helpers.
114 --nofscks Inhibit installation of any fsck helpers.
115 --ro-mnt Mount / and /usr read-only by default.
116 -h, --help This message
117 --debug Output debug information of the build process
118 --profile Output profile information of the build process
119 -L, --stdlog [0-6] Specify logging level (to standard error)
120 0 - suppress any messages
121 1 - only fatal errors
122 2 - all errors
123 3 - warnings
124 4 - info
125 5 - debug info (here starts lots of output)
126 6 - trace info (and even more)
127 -v, --verbose Increase verbosity level
128 -q, --quiet Decrease verbosity level
129 -c, --conf [FILE] Specify configuration file to use.
130 Default: /etc/dracut.conf
131 --confdir [DIR] Specify configuration directory to use *.conf files
132 from. Default: /etc/dracut.conf.d
133 --tmpdir [DIR] Temporary directory to be used instead of default
134 /var/tmp.
135 -l, --local Local mode. Use modules from the current working
136 directory instead of the system-wide installed in
137 /usr/lib/dracut/modules.d.
138 Useful when running dracut from a git checkout.
139 -H, --hostonly Host-Only mode: Install only what is needed for
140 booting the local host instead of a generic host.
141 -N, --no-hostonly Disables Host-Only mode
142 --hostonly-cmdline Store kernel command line arguments needed
143 in the initramfs
144 --no-hostonly-cmdline Do not store kernel command line arguments needed
145 in the initramfs
146 --persistent-policy [POLICY]
147 Use [POLICY] to address disks and partitions.
148 POLICY can be any directory name found in /dev/disk.
149 E.g. "by-uuid", "by-label"
150 --fstab Use /etc/fstab to determine the root device.
151 --add-fstab [FILE] Add file to the initramfs fstab
152 --mount "[DEV] [MP] [FSTYPE] [FSOPTS]"
153 Mount device [DEV] on mountpoint [MP] with filesystem
154 [FSTYPE] and options [FSOPTS] in the initramfs
155 --add-device "[DEV]" Bring up [DEV] in initramfs
156 -i, --include [SOURCE] [TARGET]
157 Include the files in the SOURCE directory into the
158 Target directory in the final initramfs.
159 If SOURCE is a file, it will be installed to TARGET
160 in the final initramfs.
161 -I, --install [LIST] Install the space separated list of files into the
162 initramfs.
163 --install-optional [LIST] Install the space separated list of files into the
164 initramfs, if they exist.
165 --gzip Compress the generated initramfs using gzip.
166 This will be done by default, unless another
167 compression option or --no-compress is passed.
168 --bzip2 Compress the generated initramfs using bzip2.
169 Make sure your kernel has bzip2 decompression support
170 compiled in, otherwise you will not be able to boot.
171 --lzma Compress the generated initramfs using lzma.
172 Make sure your kernel has lzma support compiled in,
173 otherwise you will not be able to boot.
174 --xz Compress the generated initramfs using xz.
175 Make sure that your kernel has xz support compiled
176 in, otherwise you will not be able to boot.
177 --lzo Compress the generated initramfs using lzop.
178 Make sure that your kernel has lzo support compiled
179 in, otherwise you will not be able to boot.
180 --lz4 Compress the generated initramfs using lz4.
181 Make sure that your kernel has lz4 support compiled
182 in, otherwise you will not be able to boot.
183 --compress [COMPRESSION] Compress the generated initramfs with the
184 passed compression program. Make sure your kernel
185 knows how to decompress the generated initramfs,
186 otherwise you will not be able to boot.
187 --no-compress Do not compress the generated initramfs. This will
188 override any other compression options.
189 --list-modules List all available dracut modules.
190 -M, --show-modules Print included module's name to standard output during
191 build.
192 --keep Keep the temporary initramfs for debugging purposes
193 --printsize Print out the module install size
194 --sshkey [SSHKEY] Add ssh key to initramfs (use with ssh-client module)
195 --logfile [FILE] Logfile to use (overrides configuration setting)
196 --reproducible Create reproducible images
197 --loginstall [DIR] Log all files installed from the host to [DIR]
199 If [LIST] has multiple arguments, then you have to put these in quotes.
201 For example:
203 # dracut --add-drivers "module1 module2" ...
208 # function push()
209 # push values to a stack
210 # $1 = stack variable
211 # $2.. values
212 # example:
213 # push stack 1 2 "3 4"
214 push() {
215 local _i
216 local __stack=$1; shift
217 for _i in "$@"; do
218 eval ${__stack}'[${#'${__stack}'[@]}]="$_i"'
219 done
222 # function pop()
223 # pops the last value from a stack
224 # assigns value to second argument variable
225 # or echo to stdout, if no second argument
226 # $1 = stack variable
227 # $2 = optional variable to store the value
228 # example:
229 # pop stack val
230 # val=$(pop stack)
231 pop() {
232 local __stack=$1; shift
233 local __resultvar=$1
234 local _value;
235 # check for empty stack
236 eval '[[ ${#'${__stack}'[@]} -eq 0 ]] && return 1'
238 eval _value='${'${__stack}'[${#'${__stack}'[@]}-1]}'
240 if [[ "$__resultvar" ]]; then
241 eval $__resultvar="'$_value'"
242 else
243 printf "%s" "$_value"
245 eval unset ${__stack}'[${#'${__stack}'[@]}-1]'
246 return 0
249 # Little helper function for reading args from the commandline.
250 # it automatically handles -a b and -a=b variants, and returns 1 if
251 # we need to shift $3.
252 read_arg() {
253 # $1 = arg name
254 # $2 = arg value
255 # $3 = arg parameter
256 local rematch='^[^=]*=(.*)$'
257 if [[ $2 =~ $rematch ]]; then
258 read "$1" <<< "${BASH_REMATCH[1]}"
259 else
260 read "$1" <<< "$3"
261 # There is no way to shift our callers args, so
262 # return 1 to indicate they should do it instead.
263 return 1
267 dropindirs_sort()
269 local suffix=$1; shift
270 local -a files
271 local f d
273 for d in "$@"; do
274 for i in "$d/"*"$suffix"; do
275 if [[ -e "$i" ]]; then
276 printf "%s\n" "${i##*/}"
278 done
279 done | sort -Vu | {
280 readarray -t files
282 for f in "${files[@]}"; do
283 for d in "$@"; do
284 if [[ -e "$d/$f" ]]; then
285 printf "%s\n" "$d/$f"
286 continue 2
288 done
289 done
293 rearrange_params()
295 # Workaround -i, --include taking 2 arguments
296 set -- "${@/--include/++include}"
298 # This prevents any long argument ending with "-i"
299 # -i, like --opt-i but I think we can just prevent that
300 set -- "${@/%-i/++include}"
302 TEMP=$(unset POSIXLY_CORRECT; getopt \
303 -o "a:m:o:d:I:k:c:L:fvqlHhMN" \
304 --long kver: \
305 --long add: \
306 --long force-add: \
307 --long add-drivers: \
308 --long force-drivers: \
309 --long omit-drivers: \
310 --long modules: \
311 --long omit: \
312 --long drivers: \
313 --long filesystems: \
314 --long install: \
315 --long install-optional: \
316 --long fwdir: \
317 --long libdirs: \
318 --long fscks: \
319 --long add-fstab: \
320 --long mount: \
321 --long device: \
322 --long add-device: \
323 --long nofscks: \
324 --long ro-mnt \
325 --long kmoddir: \
326 --long conf: \
327 --long confdir: \
328 --long tmpdir: \
329 --long stdlog: \
330 --long compress: \
331 --long prefix: \
332 --long rebuild: \
333 --long force \
334 --long kernel-only \
335 --long no-kernel \
336 --long print-cmdline \
337 --long kernel-cmdline: \
338 --long strip \
339 --long nostrip \
340 --long prelink \
341 --long noprelink \
342 --long hardlink \
343 --long nohardlink \
344 --long noprefix \
345 --long mdadmconf \
346 --long nomdadmconf \
347 --long lvmconf \
348 --long nolvmconf \
349 --long debug \
350 --long profile \
351 --long sshkey: \
352 --long logfile: \
353 --long verbose \
354 --long quiet \
355 --long local \
356 --long hostonly \
357 --long host-only \
358 --long no-hostonly \
359 --long no-host-only \
360 --long hostonly-cmdline \
361 --long no-hostonly-cmdline \
362 --long persistent-policy: \
363 --long fstab \
364 --long help \
365 --long bzip2 \
366 --long lzma \
367 --long xz \
368 --long lzo \
369 --long lz4 \
370 --long no-compress \
371 --long gzip \
372 --long list-modules \
373 --long show-modules \
374 --long keep \
375 --long printsize \
376 --long regenerate-all \
377 --long noimageifnotneeded \
378 --long early-microcode \
379 --long no-early-microcode \
380 --long reproducible \
381 --long loginstall: \
382 -- "$@")
384 if (( $? != 0 )); then
385 usage
386 exit 1
390 verbosity_mod_l=0
391 unset kernel
392 unset outfile
394 rearrange_params "$@"
395 eval set -- "$TEMP"
397 # parse command line args to check if '--rebuild' option is present
398 unset append_args_l
399 unset rebuild_file
400 while :
402 if [ "$1" == "--" ]; then
403 shift; break
405 if [ "$1" == "--rebuild" ]; then
406 append_args_l="yes"
407 rebuild_file=$2
408 if [ ! -e $rebuild_file ]; then
409 echo "Image file '$rebuild_file', for rebuild, does not exist!"
410 exit 1
412 abs_rebuild_file=$(readlink -f "$rebuild_file") && rebuild_file="$abs_rebuild_file"
413 shift; continue
415 shift
416 done
418 # get output file name and kernel version from command line arguments
419 while (($# > 0)); do
420 case ${1%%=*} in
421 ++include)
422 shift 2;;
424 if ! [[ ${outfile+x} ]]; then
425 outfile=$1
426 elif ! [[ ${kernel+x} ]]; then
427 kernel=$1
428 else
429 printf "\nUnknown arguments: %s\n\n" "$*" >&2
430 usage; exit 1;
433 esac
434 shift
435 done
437 # extract input image file provided with rebuild option to get previous parameters, if any
438 if [[ $append_args_l == "yes" ]]; then
439 unset rebuild_param
441 # determine resultant file
442 if ! [[ $outfile ]]; then
443 outfile=$rebuild_file
446 if ! rebuild_param=$(lsinitrd $rebuild_file '*lib/dracut/build-parameter.txt'); then
447 echo "Image '$rebuild_file' has no rebuild information stored"
448 exit 1
451 # prepend previous parameters to current command line args
452 if [[ $rebuild_param ]]; then
453 TEMP="$rebuild_param $TEMP"
454 eval set -- "$TEMP"
455 rearrange_params "$@"
458 # clean the temporarily used scratch-pad directory
459 rm -rf $scratch_dir
462 unset PARMS_TO_STORE
463 PARMS_TO_STORE=""
465 eval set -- "$TEMP"
467 while :; do
468 if [ $1 != "--" ] && [ $1 != "--rebuild" ]; then
469 PARMS_TO_STORE+=" $1";
471 case $1 in
472 --kver) kernel="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
473 -a|--add) push add_dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
474 --force-add) push force_add_dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
475 --add-drivers) push add_drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
476 --force-drivers) push force_drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
477 --omit-drivers) push omit_drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
478 -m|--modules) push dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
479 -o|--omit) push omit_dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
480 -d|--drivers) push drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
481 --filesystems) push filesystems_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
482 -I|--install) push install_items_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
483 --install-optional)
484 push install_optional_items_l \
485 "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
486 --fwdir) push fw_dir_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
487 --libdirs) push libdirs_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
488 --fscks) push fscks_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
489 --add-fstab) push add_fstab_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
490 --mount) push fstab_lines "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
491 --add-device|--device)
492 push add_device_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
493 --kernel-cmdline) push kernel_cmdline_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
494 --nofscks) nofscks_l="yes";;
495 --ro-mnt) ro_mnt_l="yes";;
496 -k|--kmoddir) drivers_dir_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
497 -c|--conf) conffile="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
498 --confdir) confdir="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
499 --tmpdir) tmpdir_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
500 -L|--stdlog) stdloglvl_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
501 --compress) compress_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
502 --prefix) prefix_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
503 --loginstall) loginstall_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
504 --rebuild) if [ $rebuild_file == $outfile ]; then
505 force=yes
507 shift
509 -f|--force) force=yes;;
510 --kernel-only) kernel_only="yes"; no_kernel="no";;
511 --no-kernel) kernel_only="no"; no_kernel="yes";;
512 --print-cmdline)
513 print_cmdline="yes"; hostonly_l="yes"; kernel_only="yes"; no_kernel="yes";;
514 --early-microcode)
515 early_microcode_l="yes";;
516 --no-early-microcode)
517 early_microcode_l="no";;
518 --strip) do_strip_l="yes";;
519 --nostrip) do_strip_l="no";;
520 --prelink) do_prelink_l="yes";;
521 --noprelink) do_prelink_l="no";;
522 --hardlink) do_hardlink_l="yes";;
523 --nohardlink) do_hardlink_l="no";;
524 --noprefix) prefix_l="/";;
525 --mdadmconf) mdadmconf_l="yes";;
526 --nomdadmconf) mdadmconf_l="no";;
527 --lvmconf) lvmconf_l="yes";;
528 --nolvmconf) lvmconf_l="no";;
529 --debug) debug="yes";;
530 --profile) profile="yes";;
531 --sshkey) sshkey="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
532 --logfile) logfile_l="$2"; shift;;
533 -v|--verbose) ((verbosity_mod_l++));;
534 -q|--quiet) ((verbosity_mod_l--));;
535 -l|--local)
536 allowlocal="yes"
537 [[ -f "$(readlink -f "${0%/*}")/dracut-functions.sh" ]] \
538 && dracutbasedir="$(readlink -f "${0%/*}")"
540 -H|--hostonly|--host-only)
541 hostonly_l="yes" ;;
542 -N|--no-hostonly|--no-host-only)
543 hostonly_l="no" ;;
544 --hostonly-cmdline)
545 hostonly_cmdline_l="yes" ;;
546 --no-hostonly-cmdline)
547 hostonly_cmdline_l="no" ;;
548 --persistent-policy)
549 persistent_policy_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
550 --fstab) use_fstab_l="yes" ;;
551 -h|--help) long_usage; exit 1 ;;
552 -i|--include) push include_src "$2"; PARMS_TO_STORE+=" '$2'";
553 shift;;
554 --bzip2) compress_l="bzip2";;
555 --lzma) compress_l="lzma";;
556 --xz) compress_l="xz";;
557 --lzo) compress_l="lzo";;
558 --lz4) compress_l="lz4";;
559 --no-compress) _no_compress_l="cat";;
560 --gzip) compress_l="gzip";;
561 --list-modules) do_list="yes";;
562 -M|--show-modules)
563 show_modules_l="yes"
565 --keep) keep="yes";;
566 --printsize) printsize="yes";;
567 --regenerate-all) regenerate_all="yes";;
568 --noimageifnotneeded) noimageifnotneeded="yes";;
569 --reproducible) reproducible_l="yes";;
570 --) shift; break;;
572 *) # should not even reach this point
573 printf "\n!Unknown option: '%s'\n\n" "$1" >&2; usage; exit 1;;
574 esac
575 shift
576 done
578 # getopt cannot handle multiple arguments, so just handle "-I,--include"
579 # the old fashioned way
581 while (($# > 0)); do
582 if [ "${1%%=*}" == "++include" ]; then
583 push include_src "$2"
584 push include_target "$3"
585 PARMS_TO_STORE+=" --include '$2' '$3'"
586 shift 2
588 shift
589 done
591 if [[ $regenerate_all == "yes" ]]; then
592 ret=0
593 if [[ $kernel ]]; then
594 printf -- "--regenerate-all cannot be called with a kernel version\n" >&2
595 exit 1
598 if [[ $outfile ]]; then
599 printf -- "--regenerate-all cannot be called with a image file\n" >&2
600 exit 1
603 ((len=${#dracut_args[@]}))
604 for ((i=0; i < len; i++)); do
605 [[ ${dracut_args[$i]} == "--regenerate-all" ]] && \
606 unset dracut_args[$i]
607 done
609 cd /lib/modules
610 for i in *; do
611 [[ -f $i/modules.dep ]] || [[ -f $i/modules.dep.bin ]] || continue
612 dracut --kver="$i" "${dracut_args[@]}"
613 ((ret+=$?))
614 done
615 exit $ret
618 if ! [[ $kernel ]]; then
619 kernel=$(uname -r)
622 if [[ $kernel ]]; then
623 if ! [[ -d /lib/modules/$kernel ]] && [[ $no_kernel != yes ]]; then
624 printf -- "Kernel version $kernel has no module directory /lib/modules/$kernel\n" >&2
628 if ! [[ $outfile ]]; then
629 [[ -f /etc/machine-id ]] && read MACHINE_ID < /etc/machine-id
631 if [[ $MACHINE_ID ]] && ( [[ -d /boot/${MACHINE_ID} ]] || [[ -L /boot/${MACHINE_ID} ]] ); then
632 outfile="/boot/${MACHINE_ID}/$kernel/initrd"
633 else
634 outfile="/boot/initramfs-$kernel.img"
638 unset LC_MESSAGES
639 unset LC_CTYPE
640 export LC_ALL=C
641 export LANG=C
642 unset LD_LIBRARY_PATH
643 unset LD_PRELOAD
644 unset GREP_OPTIONS
646 export DRACUT_LOG_LEVEL=warning
647 [[ $debug ]] && {
648 export DRACUT_LOG_LEVEL=debug
649 export PS4='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): ';
650 set -x
653 [[ $profile ]] && {
654 export PS4='+ $(date "+%s.%N") ${BASH_SOURCE}@${LINENO}: ';
655 set -x
656 debug=yes
659 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
661 # if we were not passed a config file, try the default one
662 if [[ ! -f $conffile ]]; then
663 if [[ $allowlocal ]]; then
664 conffile="$dracutbasedir/dracut.conf"
665 else
666 conffile="/etc/dracut.conf"
670 if [[ ! -d $confdir ]]; then
671 if [[ $allowlocal ]]; then
672 confdir="$dracutbasedir/dracut.conf.d"
673 else
674 confdir="/etc/dracut.conf.d"
678 # source our config file
679 [[ -f $conffile ]] && . "$conffile"
681 # source our config dir
682 for f in $(dropindirs_sort ".conf" "$confdir" "$dracutbasedir/dracut.conf.d"); do
683 [[ -e $f ]] && . "$f"
684 done
686 DRACUT_PATH=${DRACUT_PATH:-/sbin /bin /usr/sbin /usr/bin}
688 for i in $DRACUT_PATH; do
689 rl=$i
690 if [ -L "$i" ]; then
691 rl=$(readlink -f $i)
693 if [[ "$NPATH" != *:$rl* ]] ; then
694 NPATH+=":$rl"
696 done
697 export PATH="${NPATH#:}"
698 unset NPATH
700 # these optins add to the stuff in the config file
701 if (( ${#add_dracutmodules_l[@]} )); then
702 while pop add_dracutmodules_l val; do
703 add_dracutmodules+=" $val "
704 done
707 if (( ${#force_add_dracutmodules_l[@]} )); then
708 while pop force_add_dracutmodules_l val; do
709 force_add_dracutmodules+=" $val "
710 done
713 if (( ${#fscks_l[@]} )); then
714 while pop fscks_l val; do
715 fscks+=" $val "
716 done
719 if (( ${#add_fstab_l[@]} )); then
720 while pop add_fstab_l val; do
721 add_fstab+=" $val "
722 done
725 if (( ${#fstab_lines_l[@]} )); then
726 while pop fstab_lines_l val; do
727 push fstab_lines $val
728 done
731 if (( ${#install_items_l[@]} )); then
732 while pop install_items_l val; do
733 install_items+=" $val "
734 done
737 if (( ${#install_optional_items_l[@]} )); then
738 while pop install_optional_items_l val; do
739 install_optional_items+=" $val "
740 done
743 # these options override the stuff in the config file
744 if (( ${#dracutmodules_l[@]} )); then
745 dracutmodules=''
746 while pop dracutmodules_l val; do
747 dracutmodules+="$val "
748 done
751 if (( ${#omit_dracutmodules_l[@]} )); then
752 omit_dracutmodules=''
753 while pop omit_dracutmodules_l val; do
754 omit_dracutmodules+="$val "
755 done
758 if (( ${#filesystems_l[@]} )); then
759 filesystems=''
760 while pop filesystems_l val; do
761 filesystems+="$val "
762 done
765 if (( ${#fw_dir_l[@]} )); then
766 fw_dir=''
767 while pop fw_dir_l val; do
768 fw_dir+="$val "
769 done
772 if (( ${#libdirs_l[@]} )); then
773 libdirs=''
774 while pop libdirs_l val; do
775 libdirs+="$val "
776 done
779 [[ $stdloglvl_l ]] && stdloglvl=$stdloglvl_l
780 [[ ! $stdloglvl ]] && stdloglvl=4
781 stdloglvl=$((stdloglvl + verbosity_mod_l))
782 ((stdloglvl > 6)) && stdloglvl=6
783 ((stdloglvl < 0)) && stdloglvl=0
785 [[ $drivers_dir_l ]] && drivers_dir=$drivers_dir_l
786 [[ $do_strip_l ]] && do_strip=$do_strip_l
787 [[ $do_strip ]] || do_strip=yes
788 [[ $do_prelink_l ]] && do_prelink=$do_prelink_l
789 [[ $do_prelink ]] || do_prelink=yes
790 [[ $do_hardlink_l ]] && do_hardlink=$do_hardlink_l
791 [[ $do_hardlink ]] || do_hardlink=yes
792 [[ $prefix_l ]] && prefix=$prefix_l
793 [[ $prefix = "/" ]] && unset prefix
794 [[ $hostonly_l ]] && hostonly=$hostonly_l
795 [[ $hostonly_cmdline_l ]] && hostonly_cmdline=$hostonly_cmdline_l
796 [[ "$hostonly" == "yes" ]] && ! [[ $hostonly_cmdline ]] && hostonly_cmdline="yes"
797 [[ $persistent_policy_l ]] && persistent_policy=$persistent_policy_l
798 [[ $use_fstab_l ]] && use_fstab=$use_fstab_l
799 [[ $mdadmconf_l ]] && mdadmconf=$mdadmconf_l
800 [[ $lvmconf_l ]] && lvmconf=$lvmconf_l
801 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
802 [[ $fw_dir ]] || fw_dir="/lib/firmware/updates /lib/firmware"
803 [[ $tmpdir_l ]] && tmpdir="$tmpdir_l"
804 [[ $tmpdir ]] || tmpdir=/var/tmp
805 [[ $INITRD_COMPRESS ]] && compress=$INITRD_COMPRESS
806 [[ $compress_l ]] && compress=$compress_l
807 [[ $show_modules_l ]] && show_modules=$show_modules_l
808 [[ $nofscks_l ]] && nofscks="yes"
809 [[ $ro_mnt_l ]] && ro_mnt="yes"
810 [[ $early_microcode_l ]] && early_microcode=$early_microcode_l
811 [[ $early_microcode ]] || early_microcode=no
812 [[ $logfile_l ]] && logfile="$logfile_l"
813 [[ $reproducible_l ]] && reproducible="$reproducible_l"
814 [[ $loginstall_l ]] && loginstall="$loginstall_l"
816 # eliminate IFS hackery when messing with fw_dir
817 fw_dir=${fw_dir//:/ }
819 # handle compression options.
820 [[ $compress ]] || compress="gzip"
821 case $compress in
822 bzip2) compress="bzip2 -9";;
823 lzma) compress="lzma -9 -T0";;
824 xz) compress="xz --check=crc32 --lzma2=dict=1MiB -T0";;
825 gzip) compress="gzip -n -9";
826 if command -v pigz > /dev/null 2>&1; then
827 compress="pigz -9 -n -T -R"
828 elif command -v gzip --help 2>&1 | grep -q rsyncable; then
829 compress="gzip -n -9 --rsyncable"
832 lzo) compress="lzop -9";;
833 lz4) compress="lz4 -l -9";;
834 esac
835 if [[ $_no_compress_l = "cat" ]]; then
836 compress="cat"
839 [[ $hostonly = yes ]] && hostonly="-h"
840 [[ $hostonly != "-h" ]] && unset hostonly
842 [[ $reproducible == yes ]] && DRACUT_REPRODUCIBLE=1
844 readonly TMPDIR="$tmpdir"
845 readonly initdir="$(mktemp --tmpdir="$TMPDIR/" -d -t initramfs.XXXXXX)"
846 [ -d "$initdir" ] || {
847 printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t initramfs.XXXXXX failed." >&2
848 exit 1
851 if [[ $early_microcode = yes ]] || ( [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]] ); then
852 readonly early_cpio_dir="$(mktemp --tmpdir="$TMPDIR/" -d -t early_cpio.XXXXXX)"
853 [ -d "$early_cpio_dir" ] || {
854 printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t early_cpio.XXXXXX failed." >&2
855 exit 1
858 # clean up after ourselves no matter how we die.
859 trap '
860 ret=$?;
861 [[ $keep ]] && echo "Not removing $initdir." >&2 || { [[ $initdir ]] && rm -rf -- "$initdir"; };
862 [[ $keep ]] && echo "Not removing $early_cpio_dir." >&2 || { [[ $early_cpio_dir ]] && rm -Rf -- "$early_cpio_dir"; };
863 [[ $_dlogdir ]] && rm -Rf -- "$_dlogdir";
864 exit $ret;
865 ' EXIT
867 # clean up after ourselves no matter how we die.
868 trap 'exit 1;' SIGINT
870 export DRACUT_KERNEL_LAZY="1"
871 export DRACUT_RESOLVE_LAZY="1"
873 if [[ $print_cmdline ]]; then
874 stdloglvl=0
875 sysloglvl=0
876 fileloglvl=0
877 kmsgloglvl=0
880 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
881 . $dracutbasedir/dracut-version.sh
884 if [[ -f $dracutbasedir/dracut-functions.sh ]]; then
885 . $dracutbasedir/dracut-functions.sh
886 else
887 printf "%s\n" "dracut: Cannot find $dracutbasedir/dracut-functions.sh." >&2
888 printf "%s\n" "dracut: Are you running from a git checkout?" >&2
889 printf "%s\n" "dracut: Try passing -l as an argument to $0" >&2
890 exit 1
893 if ! [[ $print_cmdline ]]; then
894 inst /bin/sh
895 if ! $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R "$initdir/bin/sh" &>/dev/null; then
896 unset DRACUT_RESOLVE_LAZY
897 export DRACUT_RESOLVE_DEPS=1
899 rm -fr -- ${initdir}/*
902 # Verify bash version, current minimum is 3.1
903 if (( BASH_VERSINFO[0] < 4 )); then
904 dfatal 'You need at least Bash 4 to use dracut, sorry.'
905 exit 1
908 dracutfunctions=$dracutbasedir/dracut-functions.sh
909 export dracutfunctions
911 if (( ${#drivers_l[@]} )); then
912 drivers=''
913 while pop drivers_l val; do
914 drivers+="$val "
915 done
917 drivers=${drivers/-/_}
919 if (( ${#add_drivers_l[@]} )); then
920 while pop add_drivers_l val; do
921 add_drivers+=" $val "
922 done
924 add_drivers=${add_drivers/-/_}
926 if (( ${#force_drivers_l[@]} )); then
927 while pop force_drivers_l val; do
928 force_drivers+=" $val "
929 done
931 force_drivers=${force_drivers/-/_}
933 if (( ${#omit_drivers_l[@]} )); then
934 while pop omit_drivers_l val; do
935 omit_drivers+=" $val "
936 done
938 omit_drivers=${omit_drivers/-/_}
940 if (( ${#kernel_cmdline_l[@]} )); then
941 while pop kernel_cmdline_l val; do
942 kernel_cmdline+=" $val "
943 done
946 omit_drivers_corrected=""
947 for d in $omit_drivers; do
948 [[ " $drivers $add_drivers " == *\ $d\ * ]] && continue
949 [[ " $drivers $force_drivers " == *\ $d\ * ]] && continue
950 omit_drivers_corrected+="$d|"
951 done
952 omit_drivers="${omit_drivers_corrected%|}"
953 unset omit_drivers_corrected
955 # prepare args for logging
956 for ((i=0; i < ${#dracut_args[@]}; i++)); do
957 [[ "${dracut_args[$i]}" == *\ * ]] && \
958 dracut_args[$i]="\"${dracut_args[$i]}\""
959 #" keep vim happy
960 done
962 dinfo "Executing: $0 ${dracut_args[@]}"
964 [[ $do_list = yes ]] && {
965 for mod in $dracutbasedir/modules.d/*; do
966 [[ -d $mod ]] || continue;
967 [[ -e $mod/install || -e $mod/installkernel || \
968 -e $mod/module-setup.sh ]] || continue
969 printf "%s\n" "${mod##*/??}"
970 done
971 exit 0
974 # This is kinda legacy -- eventually it should go away.
975 case $dracutmodules in
976 ""|auto) dracutmodules="all" ;;
977 esac
979 abs_outfile=$(readlink -f "$outfile") && outfile="$abs_outfile"
981 if [[ -d $srcmods ]]; then
982 [[ -f $srcmods/modules.dep ]] || {
983 dwarn "$srcmods/modules.dep is missing. Did you run depmod?"
987 if [[ ! $print_cmdline ]]; then
988 if [[ -f $outfile && ! $force ]]; then
989 dfatal "Will not override existing initramfs ($outfile) without --force"
990 exit 1
993 outdir=${outfile%/*}
994 [[ $outdir ]] || outdir="/"
996 if [[ ! -d "$outdir" ]]; then
997 dfatal "Can't write to $outdir: Directory $outdir does not exist or is not accessible."
998 exit 1
999 elif [[ ! -w "$outdir" ]]; then
1000 dfatal "No permission to write to $outdir."
1001 exit 1
1002 elif [[ -f "$outfile" && ! -w "$outfile" ]]; then
1003 dfatal "No permission to write $outfile."
1004 exit 1
1007 if [[ $loginstall ]]; then
1008 if ! mkdir -p "$loginstall"; then
1009 dfatal "Could not create directory to log installed files to '$loginstall'."
1010 exit 1
1012 loginstall=$(readlink -f "$loginstall")
1016 if [[ $acpi_override = yes ]] && ! check_kernel_config CONFIG_ACPI_INITRD_TABLE_OVERRIDE; then
1017 dwarn "Disabling ACPI override, because kernel does not support it. CONFIG_ACPI_INITRD_TABLE_OVERRIDE!=y"
1018 unset acpi_override
1021 if [[ $early_microcode = yes ]]; then
1022 if [[ $hostonly ]]; then
1023 [[ $(get_cpu_vendor) == "AMD" ]] \
1024 && ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
1025 && unset early_microcode
1026 [[ $(get_cpu_vendor) == "Intel" ]] \
1027 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
1028 && unset early_microcode
1029 else
1030 ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
1031 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
1032 && unset early_microcode
1034 [[ $early_microcode != yes ]] \
1035 && dwarn "Disabling early microcode, because kernel does not support it. CONFIG_MICROCODE_[AMD|INTEL]_EARLY!=y"
1038 # Need to be able to have non-root users read stuff (rpcbind etc)
1039 chmod 755 "$initdir"
1041 if [[ $hostonly ]]; then
1042 for i in /sys /proc /run /dev; do
1043 if ! findmnt --target "$i" &>/dev/null; then
1044 dwarning "Turning off host-only mode: '$i' is not mounted!"
1045 unset hostonly
1047 done
1050 declare -A host_fs_types
1052 for line in "${fstab_lines[@]}"; do
1053 set -- $line
1054 #dev mp fs fsopts
1055 push host_devs "$1"
1056 host_fs_types["$1"]="$3"
1057 done
1059 for f in $add_fstab; do
1060 [[ -e $f ]] || continue
1061 while read dev rest; do
1062 push host_devs "$dev"
1063 done < "$f"
1064 done
1066 for dev in $add_device; do
1067 push host_devs "$dev"
1068 done
1070 if (( ${#add_device_l[@]} )); then
1071 while pop add_device_l val; do
1072 add_device+=" $val "
1073 push host_devs "$val"
1074 done
1077 if [[ $hostonly ]]; then
1078 # in hostonly mode, determine all devices, which have to be accessed
1079 # and examine them for filesystem types
1081 for mp in \
1082 "/" \
1083 "/etc" \
1084 "/bin" \
1085 "/sbin" \
1086 "/lib" \
1087 "/lib64" \
1088 "/usr" \
1089 "/usr/bin" \
1090 "/usr/sbin" \
1091 "/usr/lib" \
1092 "/usr/lib64" \
1093 "/boot" \
1094 "/boot/efi" \
1097 mp=$(readlink -f "$mp")
1098 mountpoint "$mp" >/dev/null 2>&1 || continue
1099 _dev=$(find_block_device "$mp")
1100 _bdev=$(readlink -f "/dev/block/$_dev")
1101 [[ -b $_bdev ]] && _dev=$_bdev
1102 push host_devs $_dev
1103 [[ "$mp" == "/" ]] && root_dev="$_dev"
1104 push host_devs "$_dev"
1105 done
1107 if [[ -f /proc/swaps ]] && [[ -f /etc/fstab ]]; then
1108 while read dev type rest; do
1109 [[ -b $dev ]] || continue
1110 [[ "$type" == "partition" ]] || continue
1112 while read _d _m _t _o _r; do
1113 [[ "$_d" == \#* ]] && continue
1114 [[ $_d ]] || continue
1115 [[ $_t != "swap" ]] && continue
1116 [[ $_m != "swap" ]] && [[ $_m != "none" ]] && continue
1117 [[ "$_o" == *noauto* ]] && continue
1118 _d=$(expand_persistent_dev "$_d")
1119 [[ "$_d" -ef "$dev" ]] || continue
1121 if [[ -f /etc/crypttab ]]; then
1122 while read _mapper _a _p _o; do
1123 [[ $_mapper = \#* ]] && continue
1124 [[ "$_d" -ef /dev/mapper/"$_mapper" ]] || continue
1125 [[ "$_o" ]] || _o="$_p"
1126 # skip entries with password files
1127 [[ "$_p" == /* ]] && [[ -f $_p ]] && continue 2
1128 # skip mkswap swap
1129 [[ $_o == *swap* ]] && continue 2
1130 done < /etc/crypttab
1133 push host_devs "$(readlink -f "$dev")"
1134 break
1135 done < /etc/fstab
1136 done < /proc/swaps
1138 # record all host modaliases
1139 declare -A host_modalias
1140 find /sys/devices/ -name uevent -print > "$initdir/.modalias"
1141 while read m; do
1142 while read line; do
1143 [[ "$line" != MODALIAS\=* ]] && continue
1144 modalias="${line##MODALIAS=}" && [[ $modalias ]] && host_modalias["$modalias"]=1
1145 break
1146 done < "$m"
1147 done < "$initdir/.modalias"
1149 rm -f -- "$initdir/.modalias"
1151 while read _k _s _v; do
1152 [ "$_k" != "name" -a "$_k" != "driver" ] && continue
1153 host_modalias["$_v"]=1
1154 done </proc/crypto
1156 # check /proc/modules
1157 declare -A host_modules
1158 while read m rest; do
1159 host_modules["$m"]=1
1160 done </proc/modules
1163 unset m
1164 unset rest
1166 _get_fs_type() {
1167 [[ $1 ]] || return
1168 if [[ -b /dev/block/$1 ]]; then
1169 ID_FS_TYPE=$(get_fs_env "/dev/block/$1") && host_fs_types["$(readlink -f "/dev/block/$1")"]="$ID_FS_TYPE"
1170 return 1
1172 if [[ -b $1 ]]; then
1173 ID_FS_TYPE=$(get_fs_env "$1") && host_fs_types["$(readlink -f "$1")"]="$ID_FS_TYPE"
1174 return 1
1176 if fstype=$(find_dev_fstype "$1"); then
1177 host_fs_types["$1"]="$fstype"
1178 return 1
1180 return 1
1183 for dev in ${host_devs[@]}; do
1184 _get_fs_type "$dev"
1185 check_block_and_slaves_all _get_fs_type "$(get_maj_min "$dev")"
1186 done
1188 for dev in "${!host_fs_types[@]}"; do
1189 [[ ${host_fs_types[$dev]} = "reiserfs" ]] || [[ ${host_fs_types[$dev]} = "xfs" ]] || continue
1190 rootopts=$(find_dev_fsopts "$dev")
1191 if [[ ${host_fs_types[$dev]} = "reiserfs" ]]; then
1192 journaldev=$(fs_get_option $rootopts "jdev")
1193 elif [[ ${host_fs_types[$dev]} = "xfs" ]]; then
1194 journaldev=$(fs_get_option $rootopts "logdev")
1196 if [[ $journaldev ]]; then
1197 dev="$(readlink -f "$dev")"
1198 push host_devs "$dev"
1199 _get_fs_type "$dev"
1200 check_block_and_slaves_all _get_fs_type "$(get_maj_min "$dev")"
1202 done
1204 [[ -d $udevdir ]] \
1205 || udevdir="$(pkg-config udev --variable=udevdir 2>/dev/null)"
1206 if ! [[ -d "$udevdir" ]]; then
1207 [[ -d /lib/udev ]] && udevdir=/lib/udev
1208 [[ -d /usr/lib/udev ]] && udevdir=/usr/lib/udev
1211 [[ -d $systemdutildir ]] \
1212 || systemdutildir=$(pkg-config systemd --variable=systemdutildir 2>/dev/null)
1214 if ! [[ -d "$systemdutildir" ]]; then
1215 [[ -d /lib/systemd ]] && systemdutildir=/lib/systemd
1216 [[ -d /usr/lib/systemd ]] && systemdutildir=/usr/lib/systemd
1219 [[ -d $systemdsystemunitdir ]] \
1220 || systemdsystemunitdir=$(pkg-config systemd --variable=systemdsystemunitdir 2>/dev/null)
1222 [[ -d "$systemdsystemunitdir" ]] || systemdsystemunitdir=${systemdutildir}/system
1224 [[ -d $systemdsystemconfdir ]] \
1225 || systemdsystemconfdir=$(pkg-config systemd --variable=systemdsystemconfdir 2>/dev/null)
1227 [[ -d "$systemdsystemconfdir" ]] || systemdsystemconfdir=/etc/systemd/system
1229 [[ -d $tmpfilesdir ]] \
1230 || tmpfilesdir=$(pkg-config systemd --variable=tmpfilesdir 2>/dev/null)
1232 if ! [[ -d "$tmpfilesdir" ]]; then
1233 [[ -f /lib/tmpfiles.d ]] && tmpfilesdir=/lib/tmpfiles.d
1234 [[ -f /usr/lib/tmpfiles.d ]] && tmpfilesdir=/usr/lib/tmpfiles.d
1237 export initdir dracutbasedir \
1238 dracutmodules force_add_dracutmodules add_dracutmodules omit_dracutmodules \
1239 mods_to_load \
1240 fw_dir drivers_dir debug no_kernel kernel_only \
1241 omit_drivers mdadmconf lvmconf root_dev \
1242 use_fstab fstab_lines libdirs fscks nofscks ro_mnt \
1243 stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
1244 debug host_fs_types host_devs sshkey add_fstab \
1245 DRACUT_VERSION udevdir prefix filesystems drivers \
1246 systemdutildir systemdsystemunitdir systemdsystemconfdir \
1247 host_modalias host_modules hostonly_cmdline loginstall \
1248 tmpfilesdir
1250 mods_to_load=""
1251 # check all our modules to see if they should be sourced.
1252 # This builds a list of modules that we will install next.
1253 for_each_module_dir check_module
1254 for_each_module_dir check_mount
1256 dracut_module_included "fips" && export DRACUT_FIPS_MODE=1
1258 if [[ $print_cmdline ]]; then
1259 modules_loaded=" "
1260 # source our modules.
1261 for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1262 _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]}
1263 module_cmdline "$_d_mod"
1264 done
1265 unset moddir
1266 printf "\n"
1267 exit 0
1270 # Create some directory structure first
1271 [[ $prefix ]] && mkdir -m 0755 -p "${initdir}${prefix}"
1273 [[ -h /lib ]] || mkdir -m 0755 -p "${initdir}${prefix}/lib"
1274 [[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib"
1276 if [[ $prefix ]]; then
1277 for d in bin etc lib sbin tmp usr var $libdirs; do
1278 [[ "$d" == */* ]] && continue
1279 ln -sfn "${prefix#/}/${d#/}" "$initdir/$d"
1280 done
1283 if [[ $kernel_only != yes ]]; then
1284 for d in usr/bin usr/sbin bin etc lib sbin tmp usr var $libdirs; do
1285 [[ -e "${initdir}${prefix}/$d" ]] && continue
1286 if [ -L "/$d" ]; then
1287 inst_symlink "/$d" "${prefix}/$d"
1288 else
1289 mkdir -m 0755 -p "${initdir}${prefix}/$d"
1291 done
1293 for d in dev proc sys sysroot root run; do
1294 if [ -L "/$d" ]; then
1295 inst_symlink "/$d"
1296 else
1297 mkdir -m 0755 -p "$initdir/$d"
1299 done
1301 ln -sfn ../run "$initdir/var/run"
1302 ln -sfn ../run/lock "$initdir/var/lock"
1303 ln -sfn ../run/log "$initdir/var/log"
1304 else
1305 for d in lib "$libdir"; do
1306 [[ -e "${initdir}${prefix}/$d" ]] && continue
1307 if [ -h "/$d" ]; then
1308 inst "/$d" "${prefix}/$d"
1309 else
1310 mkdir -m 0755 -p "${initdir}${prefix}/$d"
1312 done
1315 if [[ $kernel_only != yes ]]; then
1316 mkdir -p "${initdir}/etc/cmdline.d"
1317 for _d in $hookdirs; do
1318 mkdir -m 0755 -p ${initdir}/lib/dracut/hooks/$_d
1319 done
1320 if [[ "$UID" = "0" ]]; then
1321 [ -c ${initdir}/dev/null ] || mknod ${initdir}/dev/null c 1 3
1322 [ -c ${initdir}/dev/kmsg ] || mknod ${initdir}/dev/kmsg c 1 11
1323 [ -c ${initdir}/dev/console ] || mknod ${initdir}/dev/console c 5 1
1327 _isize=0 #initramfs size
1328 modules_loaded=" "
1329 # source our modules.
1330 for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1331 _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]}
1332 if [[ "$mods_to_load" == *\ $_d_mod\ * ]]; then
1333 if [[ $show_modules = yes ]]; then
1334 printf "%s\n" "$_d_mod"
1335 else
1336 dinfo "*** Including module: $_d_mod ***"
1338 if [[ $kernel_only == yes ]]; then
1339 module_installkernel "$_d_mod" || {
1340 dfatal "installkernel failed in module $_d_mod"
1341 exit 1
1343 else
1344 module_install "$_d_mod"
1345 if [[ $no_kernel != yes ]]; then
1346 module_installkernel "$_d_mod" || {
1347 dfatal "installkernel failed in module $_d_mod"
1348 exit 1
1352 mods_to_load=${mods_to_load// $_d_mod /}
1353 modules_loaded+="$_d_mod "
1355 #print the module install size
1356 if [ -n "$printsize" ]; then
1357 _isize_new=$(du -sk ${initdir}|cut -f1)
1358 _isize_delta=$((_isize_new - _isize))
1359 printf "%s\n" "$_d_mod install size: ${_isize_delta}k"
1360 _isize=$_isize_new
1363 done
1364 unset moddir
1366 for i in $modules_loaded; do
1367 mkdir -p $initdir/lib/dracut
1368 printf "%s\n" "$i" >> $initdir/lib/dracut/modules.txt
1369 done
1371 dinfo "*** Including modules done ***"
1373 ## final stuff that has to happen
1374 if [[ $no_kernel != yes ]]; then
1376 if [[ $drivers ]]; then
1377 hostonly='' instmods $drivers
1380 if [[ $add_drivers ]]; then
1381 hostonly='' instmods -c $add_drivers
1383 if [[ $force_drivers ]]; then
1384 hostonly='' instmods -c $force_drivers
1385 rm -f $initdir/etc/cmdline.d/20-force_driver.conf
1386 for mod in $force_drivers; do
1387 echo "rd.driver.pre=$mod" >>$initdir/etc/cmdline.d/20-force_drivers.conf
1388 done
1390 if [[ $filesystems ]]; then
1391 hostonly='' instmods -c $filesystems
1394 dinfo "*** Installing kernel module dependencies and firmware ***"
1395 dracut_kernel_post
1396 dinfo "*** Installing kernel module dependencies and firmware done ***"
1398 if [[ $noimageifnotneeded == yes ]] && [[ $hostonly ]]; then
1399 if [[ ! -f "$initdir/lib/dracut/need-initqueue" ]] && \
1400 [[ -f ${initdir}/lib/modules/$kernel/modules.dep && ! -s ${initdir}/lib/modules/$kernel/modules.dep ]]; then
1401 for i in ${initdir}/etc/cmdline.d/*.conf; do
1402 # We need no initramfs image and do not generate one.
1403 [[ $i == "${initdir}/etc/cmdline.d/*.conf" ]] && exit 0
1404 done
1409 if [[ $kernel_only != yes ]]; then
1410 (( ${#install_items[@]} > 0 )) && inst_multiple ${install_items[@]}
1411 (( ${#install_optional_items[@]} > 0 )) && inst_multiple -o ${install_optional_items[@]}
1413 [[ $kernel_cmdline ]] && printf "%s\n" "$kernel_cmdline" >> "${initdir}/etc/cmdline.d/01-default.conf"
1415 while pop fstab_lines line; do
1416 line=($line)
1417 [ -z "${line[3]}" ] && line[3]="defaults"
1418 [ -z "${line[4]}" ] && line[4]="0"
1419 [ -z "${line[5]}" ] && line[5]="2"
1420 echo "${line[@]}" >> "${initdir}/etc/fstab"
1421 done
1423 for f in $add_fstab; do
1424 cat "$f" >> "${initdir}/etc/fstab"
1425 done
1427 if [ -d ${initdir}/$systemdutildir ]; then
1428 mkdir -p ${initdir}/etc/conf.d
1430 printf "%s\n" "systemdutildir=\"$systemdutildir\""
1431 printf "%s\n" "systemdsystemunitdir=\"$systemdsystemunitdir\""
1432 printf "%s\n" "systemdsystemconfdir=\"$systemdsystemconfdir\""
1433 } > ${initdir}/etc/conf.d/systemd.conf
1436 if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then
1437 dinfo "*** Resolving executable dependencies ***"
1438 find "$initdir" -type f \
1439 '(' -perm -0100 -or -perm -0010 -or -perm -0001 ')' \
1440 -not -path '*.ko' -print0 \
1441 | xargs -r -0 $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R ${DRACUT_FIPS_MODE:+-H} --
1442 dinfo "*** Resolving executable dependencies done***"
1445 # libpthread workaround: pthread_cancel wants to dlopen libgcc_s.so
1446 for _dir in $libdirs; do
1447 for _f in "$_dir/libpthread.so"*; do
1448 [[ -e "$_f" ]] || continue
1449 inst_libdir_file "libgcc_s.so*"
1450 break 2
1451 done
1452 done
1455 while pop include_src src && pop include_target tgt; do
1456 if [[ $src && $tgt ]]; then
1457 if [[ -f $src ]]; then
1458 inst $src $tgt
1459 else
1460 ddebug "Including directory: $src"
1461 mkdir -p "${initdir}/${tgt}"
1462 # check for preexisting symlinks, so we can cope with the
1463 # symlinks to $prefix
1464 for i in "$src"/*; do
1465 [[ -e "$i" || -h "$i" ]] || continue
1466 s=${initdir}/${tgt}/${i#$src/}
1467 if [[ -d "$i" ]]; then
1468 if ! [[ -e "$s" ]]; then
1469 mkdir -m 0755 -p "$s"
1470 chmod --reference="$i" "$s"
1472 cp --reflink=auto --sparse=auto -fa -t "$s" "$i"/*
1473 else
1474 cp --reflink=auto --sparse=auto -fa -t "$s" "$i"
1476 done
1479 done
1481 if [[ $kernel_only != yes ]]; then
1482 # make sure that library links are correct and up to date
1483 for f in /etc/ld.so.conf /etc/ld.so.conf.d/*; do
1484 [[ -f $f ]] && inst_simple "$f"
1485 done
1486 if ! ldconfig -r "$initdir"; then
1487 if [[ $UID = 0 ]]; then
1488 derror "ldconfig exited ungracefully"
1489 else
1490 derror "ldconfig might need uid=0 (root) for chroot()"
1495 PRELINK_BIN="$(command -v prelink)"
1496 if [[ $UID = 0 ]] && [[ $PRELINK_BIN ]]; then
1497 if [[ $DRACUT_FIPS_MODE ]]; then
1498 dinfo "*** Installing prelink files ***"
1499 inst_multiple -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf /etc/prelink.cache
1500 elif [[ $do_prelink == yes ]]; then
1501 dinfo "*** Pre-linking files ***"
1502 inst_multiple -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf
1503 chroot "$initdir" "$PRELINK_BIN" -a
1504 rm -f -- "$initdir/$PRELINK_BIN"
1505 rm -fr -- "$initdir"/etc/prelink.*
1506 dinfo "*** Pre-linking files done ***"
1510 if [[ $do_hardlink = yes ]] && command -v hardlink >/dev/null; then
1511 dinfo "*** Hardlinking files ***"
1512 hardlink "$initdir" 2>&1
1513 dinfo "*** Hardlinking files done ***"
1516 # strip binaries
1517 if [[ $do_strip = yes ]] ; then
1518 for p in strip xargs find; do
1519 if ! type -P $p >/dev/null; then
1520 dinfo "Could not find '$p'. Not stripping the initramfs."
1521 do_strip=no
1523 done
1526 if [[ $do_strip = yes ]] && ! [[ $DRACUT_FIPS_MODE ]]; then
1527 dinfo "*** Stripping files ***"
1528 find "$initdir" -type f \
1529 -executable -not -path '*/lib/modules/*.ko' -print0 \
1530 | xargs -r -0 strip -g 2>/dev/null
1532 # strip kernel modules, but do not touch signed modules
1533 find "$initdir" -type f -path '*/lib/modules/*.ko' -print0 \
1534 | while read -r -d $'\0' f; do
1535 SIG=$(tail -c 28 "$f")
1536 [[ $SIG == '~Module signature appended~' ]] || { printf "%s\000" "$f"; }
1537 done | xargs -r -0 strip -g
1539 dinfo "*** Stripping files done ***"
1541 if [[ $early_microcode = yes ]]; then
1542 dinfo "*** Generating early-microcode cpio image ***"
1543 ucode_dir=(amd-ucode intel-ucode)
1544 ucode_dest=(AuthenticAMD.bin GenuineIntel.bin)
1545 _dest_dir="$early_cpio_dir/d/kernel/x86/microcode"
1546 _dest_idx="0 1"
1547 mkdir -p $_dest_dir
1548 if [[ $hostonly ]]; then
1549 [[ $(get_cpu_vendor) == "AMD" ]] && _dest_idx="0"
1550 [[ $(get_cpu_vendor) == "Intel" ]] && _dest_idx="1"
1552 for idx in $_dest_idx; do
1553 _fw=${ucode_dir[$idx]}
1554 for _fwdir in $fw_dir; do
1555 if [[ -d $_fwdir && -d $_fwdir/$_fw ]]; then
1556 _src="*"
1557 dinfo "*** Constructing ${ucode_dest[$idx]} ****"
1558 if [[ $hostonly ]]; then
1559 _src=$(get_ucode_file)
1560 if ! [[ -r $_fwdir/$_fw/$_src ]];then
1561 break;
1564 cat $_fwdir/$_fw/$_src > $_dest_dir/${ucode_dest[$idx]}
1565 create_early_cpio="yes"
1567 done
1568 done
1571 if [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]]; then
1572 dinfo "*** Packaging ACPI tables to override BIOS provided ones ***"
1573 _dest_dir="$early_cpio_dir/d/kernel/firmware/acpi"
1574 mkdir -p $_dest_dir
1575 for table in $acpi_table_dir/*.aml; do
1576 dinfo " Adding ACPI table: $table"
1577 cp -a $table $_dest_dir
1578 create_early_cpio="yes"
1579 done
1582 dinfo "*** Store current command line parameters ***"
1583 if ! ( echo $PARMS_TO_STORE > $initdir/lib/dracut/build-parameter.txt ); then
1584 dfatal "Could not store the current command line parameters"
1585 exit 1
1588 rm -f -- "$outfile"
1589 dinfo "*** Creating image file ***"
1591 if [[ $DRACUT_REPRODUCIBLE ]]; then
1592 find "$initdir" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1593 | xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1595 [[ "$(cpio --help)" == *--reproducible* ]] && CPIO_REPRODUCIBLE=1
1598 [[ "$UID" != 0 ]] && cpio_owner_root="-R 0:0"
1600 if [[ $create_early_cpio = yes ]]; then
1601 echo 1 > "$early_cpio_dir/d/early_cpio"
1603 if [[ $DRACUT_REPRODUCIBLE ]]; then
1604 find "$early_cpio_dir/d" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1605 | xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1608 # The microcode blob is _before_ the initramfs blob, not after
1610 cd "$early_cpio_dir/d"
1611 find . -print0 | sort -z \
1612 | cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc -o --quiet > $outfile
1616 if ! (
1617 umask 077; cd "$initdir"
1618 find . -print0 | sort -z \
1619 | cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc -o --quiet \
1620 | $compress >> "$outfile"
1621 ); then
1622 dfatal "dracut: creation of $outfile failed"
1623 exit 1
1625 dinfo "*** Creating image file done ***"
1627 if (( maxloglvl >= 5 )); then
1628 if [[ $allowlocal ]]; then
1629 "$dracutbasedir/lsinitrd.sh" "$outfile"| ddebug
1630 else
1631 lsinitrd "$outfile"| ddebug
1635 exit 0