skipcpio: limit the local var scope
[dracut.git] / dracut.sh
blobcbccb7432aaddfa62ce8bc74619d5a84669e87fa
1 #!/bin/bash
2 # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
3 # ex: ts=8 sw=4 sts=4 et filetype=sh
5 # Generator script for a dracut initramfs
6 # Tries to retain some degree of compatibility with the command line
7 # of the various mkinitrd implementations out there
10 # Copyright 2005-2013 Red Hat, Inc. All rights reserved.
12 # This program is free software; you can redistribute it and/or modify
13 # it under the terms of the GNU General Public License as published by
14 # the Free Software Foundation; either version 2 of the License, or
15 # (at your option) any later version.
17 # This program is distributed in the hope that it will be useful,
18 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 # GNU General Public License for more details.
22 # You should have received a copy of the GNU General Public License
23 # along with this program. If not, see <http://www.gnu.org/licenses/>.
26 # store for logging
27 dracut_args=( "$@" )
29 set -o pipefail
31 usage() {
32 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
33 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
34 . $dracutbasedir/dracut-version.sh
37 # 80x25 linebreak here ^
38 cat << EOF
39 Usage: $0 [OPTION]... [<initramfs> [<kernel-version>]]
41 Version: $DRACUT_VERSION
43 Creates initial ramdisk images for preloading modules
45 -h, --help Display all options
47 If a [LIST] has multiple arguments, then you have to put these in quotes.
49 For example:
51 # dracut --add-drivers "module1 module2" ...
53 EOF
56 long_usage() {
57 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
58 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
59 . $dracutbasedir/dracut-version.sh
62 # 80x25 linebreak here ^
63 cat << EOF
64 Usage: $0 [OPTION]... [<initramfs> [<kernel-version>]]
66 Version: $DRACUT_VERSION
68 Creates initial ramdisk images for preloading modules
70 --kver [VERSION] Set kernel version to [VERSION].
71 -f, --force Overwrite existing initramfs file.
72 -a, --add [LIST] Add a space-separated list of dracut modules.
73 --rebuild Append arguments to those of existing image and rebuild
74 -m, --modules [LIST] Specify a space-separated list of dracut modules to
75 call when building the initramfs. Modules are located
76 in /usr/lib/dracut/modules.d.
77 -o, --omit [LIST] Omit a space-separated list of dracut modules.
78 --force-add [LIST] Force to add a space-separated list of dracut modules
79 to the default set of modules, when -H is specified.
80 -d, --drivers [LIST] Specify a space-separated list of kernel modules to
81 exclusively include in the initramfs.
82 --add-drivers [LIST] Specify a space-separated list of kernel
83 modules to add to the initramfs.
84 --omit-drivers [LIST] Specify a space-separated list of kernel
85 modules not to add to the initramfs.
86 --filesystems [LIST] Specify a space-separated list of kernel filesystem
87 modules to exclusively include in the generic
88 initramfs.
89 -k, --kmoddir [DIR] Specify the directory, where to look for kernel
90 modules
91 --fwdir [DIR] Specify additional directories, where to look for
92 firmwares, separated by :
93 --kernel-only Only install kernel drivers and firmware files
94 --no-kernel Do not install kernel drivers and firmware files
95 --print-cmdline Print the kernel command line for the given disk layout
96 --early-microcode Combine early microcode with ramdisk
97 --no-early-microcode Do not combine early microcode with ramdisk
98 --kernel-cmdline [PARAMETERS] Specify default kernel command line parameters
99 --strip Strip binaries in the initramfs
100 --nostrip Do not strip binaries in the initramfs
101 --prelink Prelink binaries in the initramfs
102 --noprelink Do not prelink binaries in the initramfs
103 --hardlink Hardlink files in the initramfs
104 --nohardlink Do not hardlink files in the initramfs
105 --prefix [DIR] Prefix initramfs files with [DIR]
106 --noprefix Do not prefix initramfs files
107 --mdadmconf Include local /etc/mdadm.conf
108 --nomdadmconf Do not include local /etc/mdadm.conf
109 --lvmconf Include local /etc/lvm/lvm.conf
110 --nolvmconf Do not include local /etc/lvm/lvm.conf
111 --fscks [LIST] Add a space-separated list of fsck helpers.
112 --nofscks Inhibit installation of any fsck helpers.
113 --ro-mnt Mount / and /usr read-only by default.
114 -h, --help This message
115 --debug Output debug information of the build process
116 --profile Output profile information of the build process
117 -L, --stdlog [0-6] Specify logging level (to standard error)
118 0 - suppress any messages
119 1 - only fatal errors
120 2 - all errors
121 3 - warnings
122 4 - info
123 5 - debug info (here starts lots of output)
124 6 - trace info (and even more)
125 -v, --verbose Increase verbosity level
126 -q, --quiet Decrease verbosity level
127 -c, --conf [FILE] Specify configuration file to use.
128 Default: /etc/dracut.conf
129 --confdir [DIR] Specify configuration directory to use *.conf files
130 from. Default: /etc/dracut.conf.d
131 --tmpdir [DIR] Temporary directory to be used instead of default
132 /var/tmp.
133 -l, --local Local mode. Use modules from the current working
134 directory instead of the system-wide installed in
135 /usr/lib/dracut/modules.d.
136 Useful when running dracut from a git checkout.
137 -H, --hostonly Host-Only mode: Install only what is needed for
138 booting the local host instead of a generic host.
139 -N, --no-hostonly Disables Host-Only mode
140 --hostonly-cmdline Store kernel command line arguments needed
141 in the initramfs
142 --no-hostonly-cmdline Do not store kernel command line arguments needed
143 in the initramfs
144 --persistent-policy [POLICY]
145 Use [POLICY] to address disks and partitions.
146 POLICY can be any directory name found in /dev/disk.
147 E.g. "by-uuid", "by-label"
148 --fstab Use /etc/fstab to determine the root device.
149 --add-fstab [FILE] Add file to the initramfs fstab
150 --mount "[DEV] [MP] [FSTYPE] [FSOPTS]"
151 Mount device [DEV] on mountpoint [MP] with filesystem
152 [FSTYPE] and options [FSOPTS] in the initramfs
153 --add-device "[DEV]" Bring up [DEV] in initramfs
154 -i, --include [SOURCE] [TARGET]
155 Include the files in the SOURCE directory into the
156 Target directory in the final initramfs.
157 If SOURCE is a file, it will be installed to TARGET
158 in the final initramfs.
159 -I, --install [LIST] Install the space separated list of files into the
160 initramfs.
161 --install-optional [LIST] Install the space separated list of files into the
162 initramfs, if they exist.
163 --gzip Compress the generated initramfs using gzip.
164 This will be done by default, unless another
165 compression option or --no-compress is passed.
166 --bzip2 Compress the generated initramfs using bzip2.
167 Make sure your kernel has bzip2 decompression support
168 compiled in, otherwise you will not be able to boot.
169 --lzma Compress the generated initramfs using lzma.
170 Make sure your kernel has lzma support compiled in,
171 otherwise you will not be able to boot.
172 --xz Compress the generated initramfs using xz.
173 Make sure that your kernel has xz support compiled
174 in, otherwise you will not be able to boot.
175 --lzo Compress the generated initramfs using lzop.
176 Make sure that your kernel has lzo support compiled
177 in, otherwise you will not be able to boot.
178 --lz4 Compress the generated initramfs using lz4.
179 Make sure that your kernel has lz4 support compiled
180 in, otherwise you will not be able to boot.
181 --compress [COMPRESSION] Compress the generated initramfs with the
182 passed compression program. Make sure your kernel
183 knows how to decompress the generated initramfs,
184 otherwise you will not be able to boot.
185 --no-compress Do not compress the generated initramfs. This will
186 override any other compression options.
187 --list-modules List all available dracut modules.
188 -M, --show-modules Print included module's name to standard output during
189 build.
190 --keep Keep the temporary initramfs for debugging purposes
191 --printsize Print out the module install size
192 --sshkey [SSHKEY] Add ssh key to initramfs (use with ssh-client module)
193 --logfile [FILE] Logfile to use (overrides configuration setting)
194 --reproducible Create reproducible images
196 If [LIST] has multiple arguments, then you have to put these in quotes.
198 For example:
200 # dracut --add-drivers "module1 module2" ...
205 # function push()
206 # push values to a stack
207 # $1 = stack variable
208 # $2.. values
209 # example:
210 # push stack 1 2 "3 4"
211 push() {
212 local _i
213 local __stack=$1; shift
214 for _i in "$@"; do
215 eval ${__stack}'[${#'${__stack}'[@]}]="$_i"'
216 done
219 # function pop()
220 # pops the last value from a stack
221 # assigns value to second argument variable
222 # or echo to stdout, if no second argument
223 # $1 = stack variable
224 # $2 = optional variable to store the value
225 # example:
226 # pop stack val
227 # val=$(pop stack)
228 pop() {
229 local __stack=$1; shift
230 local __resultvar=$1
231 local _value;
232 # check for empty stack
233 eval '[[ ${#'${__stack}'[@]} -eq 0 ]] && return 1'
235 eval _value='${'${__stack}'[${#'${__stack}'[@]}-1]}'
237 if [[ "$__resultvar" ]]; then
238 eval $__resultvar="'$_value'"
239 else
240 printf "%s" "$_value"
242 eval unset ${__stack}'[${#'${__stack}'[@]}-1]'
243 return 0
246 # Little helper function for reading args from the commandline.
247 # it automatically handles -a b and -a=b variants, and returns 1 if
248 # we need to shift $3.
249 read_arg() {
250 # $1 = arg name
251 # $2 = arg value
252 # $3 = arg parameter
253 local rematch='^[^=]*=(.*)$'
254 if [[ $2 =~ $rematch ]]; then
255 read "$1" <<< "${BASH_REMATCH[1]}"
256 else
257 read "$1" <<< "$3"
258 # There is no way to shift our callers args, so
259 # return 1 to indicate they should do it instead.
260 return 1
264 dropindirs_sort()
266 local suffix=$1; shift
267 local -a files
268 local f d
270 for d in "$@"; do
271 for i in "$d/"*"$suffix"; do
272 if [[ -e "$i" ]]; then
273 printf "%s\n" "${i##*/}"
275 done
276 done | sort -Vu | {
277 readarray -t files
279 for f in "${files[@]}"; do
280 for d in "$@"; do
281 if [[ -e "$d/$f" ]]; then
282 printf "%s\n" "$d/$f"
283 continue 2
285 done
286 done
290 rearrange_params()
292 # Workaround -i, --include taking 2 arguments
293 set -- "${@/--include/++include}"
295 # This prevents any long argument ending with "-i"
296 # -i, like --opt-i but I think we can just prevent that
297 set -- "${@/%-i/++include}"
299 TEMP=$(unset POSIXLY_CORRECT; getopt \
300 -o "a:m:o:d:I:k:c:L:fvqlHhMN" \
301 --long kver: \
302 --long add: \
303 --long force-add: \
304 --long add-drivers: \
305 --long omit-drivers: \
306 --long modules: \
307 --long omit: \
308 --long drivers: \
309 --long filesystems: \
310 --long install: \
311 --long install-optional: \
312 --long fwdir: \
313 --long libdirs: \
314 --long fscks: \
315 --long add-fstab: \
316 --long mount: \
317 --long device: \
318 --long add-device: \
319 --long nofscks: \
320 --long ro-mnt \
321 --long kmoddir: \
322 --long conf: \
323 --long confdir: \
324 --long tmpdir: \
325 --long stdlog: \
326 --long compress: \
327 --long prefix: \
328 --long rebuild: \
329 --long force \
330 --long kernel-only \
331 --long no-kernel \
332 --long print-cmdline \
333 --long kernel-cmdline: \
334 --long strip \
335 --long nostrip \
336 --long prelink \
337 --long noprelink \
338 --long hardlink \
339 --long nohardlink \
340 --long noprefix \
341 --long mdadmconf \
342 --long nomdadmconf \
343 --long lvmconf \
344 --long nolvmconf \
345 --long debug \
346 --long profile \
347 --long sshkey: \
348 --long logfile: \
349 --long verbose \
350 --long quiet \
351 --long local \
352 --long hostonly \
353 --long host-only \
354 --long no-hostonly \
355 --long no-host-only \
356 --long hostonly-cmdline \
357 --long no-hostonly-cmdline \
358 --long persistent-policy: \
359 --long fstab \
360 --long help \
361 --long bzip2 \
362 --long lzma \
363 --long xz \
364 --long lzo \
365 --long lz4 \
366 --long no-compress \
367 --long gzip \
368 --long list-modules \
369 --long show-modules \
370 --long keep \
371 --long printsize \
372 --long regenerate-all \
373 --long noimageifnotneeded \
374 --long early-microcode \
375 --long no-early-microcode \
376 --long reproducible \
377 -- "$@")
379 if (( $? != 0 )); then
380 usage
381 exit 1
385 verbosity_mod_l=0
386 unset kernel
387 unset outfile
389 rearrange_params "$@"
390 eval set -- "$TEMP"
392 # parse command line args to check if '--rebuild' option is present
393 unset append_args_l
394 unset rebuild_file
395 while :
397 if [ "$1" == "--" ]; then
398 shift; break
400 if [ "$1" == "--rebuild" ]; then
401 append_args_l="yes"
402 rebuild_file=$2
403 if [ ! -e $rebuild_file ]; then
404 echo "Image file '$rebuild_file', for rebuild, does not exist!"
405 exit 1
407 abs_rebuild_file=$(readlink -f "$rebuild_file") && rebuild_file="$abs_rebuild_file"
408 shift; continue
410 shift
411 done
413 # get output file name and kernel version from command line arguments
414 while (($# > 0)); do
415 case ${1%%=*} in
416 ++include)
417 shift 2;;
419 if ! [[ ${outfile+x} ]]; then
420 outfile=$1
421 elif ! [[ ${kernel+x} ]]; then
422 kernel=$1
423 else
424 printf "\nUnknown arguments: %s\n\n" "$*" >&2
425 usage; exit 1;
428 esac
429 shift
430 done
432 # extract input image file provided with rebuild option to get previous parameters, if any
433 if [[ $append_args_l == "yes" ]]; then
434 unset rebuild_param
436 # determine resultant file
437 if ! [[ $outfile ]]; then
438 outfile=$rebuild_file
441 if ! rebuild_param=$(lsinitrd $rebuild_file '*lib/dracut/build-parameter.txt'); then
442 echo "Image '$rebuild_file' has no rebuild information stored"
443 exit 1
446 # prepend previous parameters to current command line args
447 if [[ $rebuild_param ]]; then
448 TEMP="$rebuild_param $TEMP"
449 eval set -- "$TEMP"
450 rearrange_params "$@"
453 # clean the temporarily used scratch-pad directory
454 rm -rf $scratch_dir
457 unset PARMS_TO_STORE
458 PARMS_TO_STORE=""
460 eval set -- "$TEMP"
462 while :; do
463 if [ $1 != "--" ] && [ $1 != "--rebuild" ]; then
464 PARMS_TO_STORE+=" $1";
466 case $1 in
467 --kver) kernel="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
468 -a|--add) push add_dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
469 --force-add) push force_add_dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
470 --add-drivers) push add_drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
471 --omit-drivers) push omit_drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
472 -m|--modules) push dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
473 -o|--omit) push omit_dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
474 -d|--drivers) push drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
475 --filesystems) push filesystems_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
476 -I|--install) push install_items_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
477 --install-optional)
478 push install_optional_items_l \
479 "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
480 --fwdir) push fw_dir_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
481 --libdirs) push libdirs_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
482 --fscks) push fscks_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
483 --add-fstab) push add_fstab_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
484 --mount) push fstab_lines "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
485 --add-device|--device)
486 push add_device_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
487 --kernel-cmdline) push kernel_cmdline_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
488 --nofscks) nofscks_l="yes";;
489 --ro-mnt) ro_mnt_l="yes";;
490 -k|--kmoddir) drivers_dir_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
491 -c|--conf) conffile="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
492 --confdir) confdir="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
493 --tmpdir) tmpdir_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
494 -L|--stdlog) stdloglvl_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
495 --compress) compress_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
496 --prefix) prefix_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
497 --rebuild) if [ $rebuild_file == $outfile ]; then
498 force=yes
500 shift
502 -f|--force) force=yes;;
503 --kernel-only) kernel_only="yes"; no_kernel="no";;
504 --no-kernel) kernel_only="no"; no_kernel="yes";;
505 --print-cmdline)
506 print_cmdline="yes"; hostonly_l="yes"; kernel_only="yes"; no_kernel="yes";;
507 --early-microcode)
508 early_microcode_l="yes";;
509 --no-early-microcode)
510 early_microcode_l="no";;
511 --strip) do_strip_l="yes";;
512 --nostrip) do_strip_l="no";;
513 --prelink) do_prelink_l="yes";;
514 --noprelink) do_prelink_l="no";;
515 --hardlink) do_hardlink_l="yes";;
516 --nohardlink) do_hardlink_l="no";;
517 --noprefix) prefix_l="/";;
518 --mdadmconf) mdadmconf_l="yes";;
519 --nomdadmconf) mdadmconf_l="no";;
520 --lvmconf) lvmconf_l="yes";;
521 --nolvmconf) lvmconf_l="no";;
522 --debug) debug="yes";;
523 --profile) profile="yes";;
524 --sshkey) sshkey="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
525 --logfile) logfile_l="$2"; shift;;
526 -v|--verbose) ((verbosity_mod_l++));;
527 -q|--quiet) ((verbosity_mod_l--));;
528 -l|--local)
529 allowlocal="yes"
530 [[ -f "$(readlink -f "${0%/*}")/dracut-functions.sh" ]] \
531 && dracutbasedir="$(readlink -f "${0%/*}")"
533 -H|--hostonly|--host-only)
534 hostonly_l="yes" ;;
535 -N|--no-hostonly|--no-host-only)
536 hostonly_l="no" ;;
537 --hostonly-cmdline)
538 hostonly_cmdline_l="yes" ;;
539 --no-hostonly-cmdline)
540 hostonly_cmdline_l="no" ;;
541 --persistent-policy)
542 persistent_policy_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
543 --fstab) use_fstab_l="yes" ;;
544 -h|--help) long_usage; exit 1 ;;
545 -i|--include) push include_src "$2"; PARMS_TO_STORE+=" '$2'";
546 shift;;
547 --bzip2) compress_l="bzip2";;
548 --lzma) compress_l="lzma";;
549 --xz) compress_l="xz";;
550 --lzo) compress_l="lzo";;
551 --lz4) compress_l="lz4";;
552 --no-compress) _no_compress_l="cat";;
553 --gzip) compress_l="gzip";;
554 --list-modules) do_list="yes";;
555 -M|--show-modules)
556 show_modules_l="yes"
558 --keep) keep="yes";;
559 --printsize) printsize="yes";;
560 --regenerate-all) regenerate_all="yes";;
561 --noimageifnotneeded) noimageifnotneeded="yes";;
562 --reproducible) reproducible_l="yes";;
563 --) shift; break;;
565 *) # should not even reach this point
566 printf "\n!Unknown option: '%s'\n\n" "$1" >&2; usage; exit 1;;
567 esac
568 shift
569 done
571 # getopt cannot handle multiple arguments, so just handle "-I,--include"
572 # the old fashioned way
574 while (($# > 0)); do
575 if [ "${1%%=*}" == "++include" ]; then
576 push include_src "$2"
577 push include_target "$3"
578 PARMS_TO_STORE+=" --include '$2' '$3'"
579 shift 2
581 shift
582 done
584 if [[ $regenerate_all == "yes" ]]; then
585 ret=0
586 if [[ $kernel ]]; then
587 printf -- "--regenerate-all cannot be called with a kernel version\n" >&2
588 exit 1
591 if [[ $outfile ]]; then
592 printf -- "--regenerate-all cannot be called with a image file\n" >&2
593 exit 1
596 ((len=${#dracut_args[@]}))
597 for ((i=0; i < len; i++)); do
598 [[ ${dracut_args[$i]} == "--regenerate-all" ]] && \
599 unset dracut_args[$i]
600 done
602 cd /lib/modules
603 for i in *; do
604 [[ -f $i/modules.dep ]] || [[ -f $i/modules.dep.bin ]] || continue
605 dracut --kver="$i" "${dracut_args[@]}"
606 ((ret+=$?))
607 done
608 exit $ret
611 if ! [[ $kernel ]]; then
612 kernel=$(uname -r)
615 if [[ $kernel ]]; then
616 if ! [[ -d /lib/modules/$kernel ]] && [[ $no_kernel != yes ]]; then
617 printf -- "Kernel version $kernel has no module directory /lib/modules/$kernel\n" >&2
621 if ! [[ $outfile ]]; then
622 [[ -f /etc/machine-id ]] && read MACHINE_ID < /etc/machine-id
624 if [[ $MACHINE_ID ]] && ( [[ -d /boot/${MACHINE_ID} ]] || [[ -L /boot/${MACHINE_ID} ]] ); then
625 outfile="/boot/${MACHINE_ID}/$kernel/initrd"
626 else
627 outfile="/boot/initramfs-$kernel.img"
631 unset LC_MESSAGES
632 unset LC_CTYPE
633 export LC_ALL=C
634 export LANG=C
635 unset LD_LIBRARY_PATH
636 unset LD_PRELOAD
637 unset GREP_OPTIONS
639 export DRACUT_LOG_LEVEL=warning
640 [[ $debug ]] && {
641 export DRACUT_LOG_LEVEL=debug
642 export PS4='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): ';
643 set -x
646 [[ $profile ]] && {
647 export PS4='+ $(date "+%s.%N") ${BASH_SOURCE}@${LINENO}: ';
648 set -x
649 debug=yes
652 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
654 # if we were not passed a config file, try the default one
655 if [[ ! -f $conffile ]]; then
656 if [[ $allowlocal ]]; then
657 conffile="$dracutbasedir/dracut.conf"
658 else
659 conffile="/etc/dracut.conf"
663 if [[ ! -d $confdir ]]; then
664 if [[ $allowlocal ]]; then
665 confdir="$dracutbasedir/dracut.conf.d"
666 else
667 confdir="/etc/dracut.conf.d"
671 # source our config file
672 [[ -f $conffile ]] && . "$conffile"
674 # source our config dir
675 for f in $(dropindirs_sort ".conf" "$confdir" "$dracutbasedir/dracut.conf.d"); do
676 [[ -e $f ]] && . "$f"
677 done
679 DRACUT_PATH=${DRACUT_PATH:-/usr/sbin /sbin /usr/bin /bin}
681 for i in $DRACUT_PATH; do
682 rl=$i
683 if [ -L "$i" ]; then
684 rl=$(readlink -f $i)
686 if [[ "$NPATH" != *:$rl* ]] ; then
687 NPATH+=":$rl"
689 done
690 export PATH="${NPATH#:}"
691 unset NPATH
693 # these optins add to the stuff in the config file
694 if (( ${#add_dracutmodules_l[@]} )); then
695 while pop add_dracutmodules_l val; do
696 add_dracutmodules+=" $val "
697 done
700 if (( ${#force_add_dracutmodules_l[@]} )); then
701 while pop force_add_dracutmodules_l val; do
702 force_add_dracutmodules+=" $val "
703 done
706 if (( ${#fscks_l[@]} )); then
707 while pop fscks_l val; do
708 fscks+=" $val "
709 done
712 if (( ${#add_fstab_l[@]} )); then
713 while pop add_fstab_l val; do
714 add_fstab+=" $val "
715 done
718 if (( ${#fstab_lines_l[@]} )); then
719 while pop fstab_lines_l val; do
720 push fstab_lines $val
721 done
724 if (( ${#install_items_l[@]} )); then
725 while pop install_items_l val; do
726 install_items+=" $val "
727 done
730 if (( ${#install_optional_items_l[@]} )); then
731 while pop install_optional_items_l val; do
732 install_optional_items+=" $val "
733 done
736 # these options override the stuff in the config file
737 if (( ${#dracutmodules_l[@]} )); then
738 dracutmodules=''
739 while pop dracutmodules_l val; do
740 dracutmodules+="$val "
741 done
744 if (( ${#omit_dracutmodules_l[@]} )); then
745 omit_dracutmodules=''
746 while pop omit_dracutmodules_l val; do
747 omit_dracutmodules+="$val "
748 done
751 if (( ${#filesystems_l[@]} )); then
752 filesystems=''
753 while pop filesystems_l val; do
754 filesystems+="$val "
755 done
758 if (( ${#fw_dir_l[@]} )); then
759 fw_dir=''
760 while pop fw_dir_l val; do
761 fw_dir+="$val "
762 done
765 if (( ${#libdirs_l[@]} )); then
766 libdirs=''
767 while pop libdirs_l val; do
768 libdirs+="$val "
769 done
772 [[ $stdloglvl_l ]] && stdloglvl=$stdloglvl_l
773 [[ ! $stdloglvl ]] && stdloglvl=4
774 stdloglvl=$((stdloglvl + verbosity_mod_l))
775 ((stdloglvl > 6)) && stdloglvl=6
776 ((stdloglvl < 0)) && stdloglvl=0
778 [[ $drivers_dir_l ]] && drivers_dir=$drivers_dir_l
779 [[ $do_strip_l ]] && do_strip=$do_strip_l
780 [[ $do_strip ]] || do_strip=yes
781 [[ $do_prelink_l ]] && do_prelink=$do_prelink_l
782 [[ $do_prelink ]] || do_prelink=yes
783 [[ $do_hardlink_l ]] && do_hardlink=$do_hardlink_l
784 [[ $do_hardlink ]] || do_hardlink=yes
785 [[ $prefix_l ]] && prefix=$prefix_l
786 [[ $prefix = "/" ]] && unset prefix
787 [[ $hostonly_l ]] && hostonly=$hostonly_l
788 [[ $hostonly_cmdline_l ]] && hostonly_cmdline=$hostonly_cmdline_l
789 [[ "$hostonly" == "yes" ]] && ! [[ $hostonly_cmdline ]] && hostonly_cmdline="yes"
790 [[ $persistent_policy_l ]] && persistent_policy=$persistent_policy_l
791 [[ $use_fstab_l ]] && use_fstab=$use_fstab_l
792 [[ $mdadmconf_l ]] && mdadmconf=$mdadmconf_l
793 [[ $lvmconf_l ]] && lvmconf=$lvmconf_l
794 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
795 [[ $fw_dir ]] || fw_dir="/lib/firmware/updates /lib/firmware"
796 [[ $tmpdir_l ]] && tmpdir="$tmpdir_l"
797 [[ $tmpdir ]] || tmpdir=/var/tmp
798 [[ $INITRD_COMPRESS ]] && compress=$INITRD_COMPRESS
799 [[ $compress_l ]] && compress=$compress_l
800 [[ $show_modules_l ]] && show_modules=$show_modules_l
801 [[ $nofscks_l ]] && nofscks="yes"
802 [[ $ro_mnt_l ]] && ro_mnt="yes"
803 [[ $early_microcode_l ]] && early_microcode=$early_microcode_l
804 [[ $early_microcode ]] || early_microcode=no
805 [[ $logfile_l ]] && logfile="$logfile_l"
806 [[ $reproducible_l ]] && reproducible="$reproducible_l"
808 # eliminate IFS hackery when messing with fw_dir
809 fw_dir=${fw_dir//:/ }
811 # handle compression options.
812 [[ $compress ]] || compress="gzip"
813 case $compress in
814 bzip2) compress="bzip2 -9";;
815 lzma) compress="lzma -9 -T0";;
816 xz) compress="xz --check=crc32 --lzma2=dict=1MiB -T0";;
817 gzip) compress="gzip -n -9 --rsyncable"; command -v pigz > /dev/null 2>&1 && compress="pigz -9 -n -T -R";;
818 lzo) compress="lzop -9";;
819 lz4) compress="lz4 -l -9";;
820 esac
821 if [[ $_no_compress_l = "cat" ]]; then
822 compress="cat"
825 [[ $hostonly = yes ]] && hostonly="-h"
826 [[ $hostonly != "-h" ]] && unset hostonly
828 [[ $reproducible == yes ]] && DRACUT_REPRODUCIBLE=1
830 readonly TMPDIR="$tmpdir"
831 readonly initdir="$(mktemp --tmpdir="$TMPDIR/" -d -t initramfs.XXXXXX)"
832 [ -d "$initdir" ] || {
833 printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t initramfs.XXXXXX failed." >&2
834 exit 1
837 if [[ $early_microcode = yes ]] || ( [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]] ); then
838 readonly early_cpio_dir="$(mktemp --tmpdir="$TMPDIR/" -d -t early_cpio.XXXXXX)"
839 [ -d "$early_cpio_dir" ] || {
840 printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t early_cpio.XXXXXX failed." >&2
841 exit 1
844 # clean up after ourselves no matter how we die.
845 trap '
846 ret=$?;
847 [[ $keep ]] && echo "Not removing $initdir." >&2 || { [[ $initdir ]] && rm -rf -- "$initdir"; };
848 [[ $keep ]] && echo "Not removing $early_cpio_dir." >&2 || { [[ $early_cpio_dir ]] && rm -Rf -- "$early_cpio_dir"; };
849 [[ $_dlogdir ]] && rm -Rf -- "$_dlogdir";
850 exit $ret;
851 ' EXIT
853 # clean up after ourselves no matter how we die.
854 trap 'exit 1;' SIGINT
856 export DRACUT_KERNEL_LAZY="1"
857 export DRACUT_RESOLVE_LAZY="1"
859 if [[ $print_cmdline ]]; then
860 stdloglvl=0
861 sysloglvl=0
862 fileloglvl=0
863 kmsgloglvl=0
866 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
867 . $dracutbasedir/dracut-version.sh
870 if [[ -f $dracutbasedir/dracut-functions.sh ]]; then
871 . $dracutbasedir/dracut-functions.sh
872 else
873 printf "%s\n" "dracut: Cannot find $dracutbasedir/dracut-functions.sh." >&2
874 printf "%s\n" "dracut: Are you running from a git checkout?" >&2
875 printf "%s\n" "dracut: Try passing -l as an argument to $0" >&2
876 exit 1
879 if ! [[ $print_cmdline ]]; then
880 inst /bin/sh
881 if ! $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R "$initdir/bin/sh" &>/dev/null; then
882 unset DRACUT_RESOLVE_LAZY
883 export DRACUT_RESOLVE_DEPS=1
885 rm -fr -- ${initdir}/*
888 # Verify bash version, current minimum is 3.1
889 if (( BASH_VERSINFO[0] < 4 )); then
890 dfatal 'You need at least Bash 4 to use dracut, sorry.'
891 exit 1
894 dracutfunctions=$dracutbasedir/dracut-functions.sh
895 export dracutfunctions
897 if (( ${#drivers_l[@]} )); then
898 drivers=''
899 while pop drivers_l val; do
900 drivers+="$val "
901 done
903 drivers=${drivers/-/_}
905 if (( ${#add_drivers_l[@]} )); then
906 while pop add_drivers_l val; do
907 add_drivers+=" $val "
908 done
910 add_drivers=${add_drivers/-/_}
912 if (( ${#omit_drivers_l[@]} )); then
913 while pop omit_drivers_l val; do
914 omit_drivers+=" $val "
915 done
917 omit_drivers=${omit_drivers/-/_}
919 if (( ${#kernel_cmdline_l[@]} )); then
920 while pop kernel_cmdline_l val; do
921 kernel_cmdline+=" $val "
922 done
925 omit_drivers_corrected=""
926 for d in $omit_drivers; do
927 [[ " $drivers $add_drivers " == *\ $d\ * ]] && continue
928 omit_drivers_corrected+="$d|"
929 done
930 omit_drivers="${omit_drivers_corrected%|}"
931 unset omit_drivers_corrected
933 # prepare args for logging
934 for ((i=0; i < ${#dracut_args[@]}; i++)); do
935 [[ "${dracut_args[$i]}" == *\ * ]] && \
936 dracut_args[$i]="\"${dracut_args[$i]}\""
937 #" keep vim happy
938 done
940 dinfo "Executing: $0 ${dracut_args[@]}"
942 [[ $do_list = yes ]] && {
943 for mod in $dracutbasedir/modules.d/*; do
944 [[ -d $mod ]] || continue;
945 [[ -e $mod/install || -e $mod/installkernel || \
946 -e $mod/module-setup.sh ]] || continue
947 printf "%s\n" "${mod##*/??}"
948 done
949 exit 0
952 # This is kinda legacy -- eventually it should go away.
953 case $dracutmodules in
954 ""|auto) dracutmodules="all" ;;
955 esac
957 abs_outfile=$(readlink -f "$outfile") && outfile="$abs_outfile"
959 if [[ -d $srcmods ]]; then
960 [[ -f $srcmods/modules.dep ]] || {
961 dwarn "$srcmods/modules.dep is missing. Did you run depmod?"
965 if [[ ! $print_cmdline ]]; then
966 if [[ -f $outfile && ! $force ]]; then
967 dfatal "Will not override existing initramfs ($outfile) without --force"
968 exit 1
971 outdir=${outfile%/*}
972 [[ $outdir ]] || outdir="/"
974 if [[ ! -d "$outdir" ]]; then
975 dfatal "Can't write to $outdir: Directory $outdir does not exist or is not accessible."
976 exit 1
977 elif [[ ! -w "$outdir" ]]; then
978 dfatal "No permission to write to $outdir."
979 exit 1
980 elif [[ -f "$outfile" && ! -w "$outfile" ]]; then
981 dfatal "No permission to write $outfile."
982 exit 1
986 if [[ $acpi_override = yes ]] && ! check_kernel_config CONFIG_ACPI_INITRD_TABLE_OVERRIDE; then
987 dwarn "Disabling ACPI override, because kernel does not support it. CONFIG_ACPI_INITRD_TABLE_OVERRIDE!=y"
988 unset acpi_override
991 if [[ $early_microcode = yes ]]; then
992 if [[ $hostonly ]]; then
993 [[ $(get_cpu_vendor) == "AMD" ]] \
994 && ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
995 && unset early_microcode
996 [[ $(get_cpu_vendor) == "Intel" ]] \
997 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
998 && unset early_microcode
999 else
1000 ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
1001 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
1002 && unset early_microcode
1004 [[ $early_microcode != yes ]] \
1005 && dwarn "Disabling early microcode, because kernel does not support it. CONFIG_MICROCODE_[AMD|INTEL]_EARLY!=y"
1008 # Need to be able to have non-root users read stuff (rpcbind etc)
1009 chmod 755 "$initdir"
1011 if [[ $hostonly ]]; then
1012 for i in /sys /proc /run /dev; do
1013 if ! findmnt --target "$i" &>/dev/null; then
1014 dwarning "Turning off host-only mode: '$i' is not mounted!"
1015 unset hostonly
1017 done
1020 declare -A host_fs_types
1022 for line in "${fstab_lines[@]}"; do
1023 set -- $line
1024 #dev mp fs fsopts
1025 push host_devs "$1"
1026 host_fs_types["$1"]="$3"
1027 done
1029 for f in $add_fstab; do
1030 [[ -e $f ]] || continue
1031 while read dev rest; do
1032 push host_devs "$dev"
1033 done < "$f"
1034 done
1036 for dev in $add_device; do
1037 push host_devs "$dev"
1038 done
1040 if (( ${#add_device_l[@]} )); then
1041 while pop add_device_l val; do
1042 add_device+=" $val "
1043 push host_devs "$val"
1044 done
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_dev="$_dev"
1074 push host_devs "$_dev"
1075 done
1077 if [[ -f /proc/swaps ]] && [[ -f /etc/fstab ]]; then
1078 while read dev type rest; do
1079 [[ -b $dev ]] || continue
1080 [[ "$type" == "partition" ]] || continue
1082 while read _d _m _t _o _r; do
1083 [[ "$_d" == \#* ]] && continue
1084 [[ $_d ]] || continue
1085 [[ $_t != "swap" ]] && continue
1086 [[ $_m != "swap" ]] && [[ $_m != "none" ]] && continue
1087 [[ "$_o" == *noauto* ]] && continue
1088 _d=$(expand_persistent_dev "$_d")
1089 [[ "$_d" -ef "$dev" ]] || continue
1091 if [[ -f /etc/crypttab ]]; then
1092 while read _mapper _a _p _o; do
1093 [[ $_mapper = \#* ]] && continue
1094 [[ "$_d" -ef /dev/mapper/"$_mapper" ]] || continue
1095 [[ "$_o" ]] || _o="$_p"
1096 # skip entries with password files
1097 [[ "$_p" == /* ]] && [[ -f $_p ]] && continue 2
1098 # skip mkswap swap
1099 [[ $_o == *swap* ]] && continue 2
1100 done < /etc/crypttab
1103 push host_devs "$(readlink -f "$dev")"
1104 break
1105 done < /etc/fstab
1106 done < /proc/swaps
1108 # record all host modaliases
1109 declare -A host_modalias
1110 find /sys/devices/ -name uevent -print > "$initdir/.modalias"
1111 while read m; do
1112 while read line; do
1113 [[ "$line" != MODALIAS\=* ]] && continue
1114 modalias="${line##MODALIAS=}" && [[ $modalias ]] && host_modalias["$modalias"]=1
1115 break
1116 done < "$m"
1117 done < "$initdir/.modalias"
1119 rm -f -- "$initdir/.modalias"
1121 while read _k _s _v; do
1122 [ "$_k" != "name" -a "$_k" != "driver" ] && continue
1123 host_modalias["$_v"]=1
1124 done </proc/crypto
1126 # check /proc/modules
1127 declare -A host_modules
1128 while read m rest; do
1129 host_modules["$m"]=1
1130 done </proc/modules
1133 unset m
1134 unset rest
1136 _get_fs_type() {
1137 [[ $1 ]] || return
1138 if [[ -b /dev/block/$1 ]]; then
1139 ID_FS_TYPE=$(get_fs_env "/dev/block/$1") && host_fs_types["$(readlink -f "/dev/block/$1")"]="$ID_FS_TYPE"
1140 return 1
1142 if [[ -b $1 ]]; then
1143 ID_FS_TYPE=$(get_fs_env "$1") && host_fs_types["$(readlink -f "$1")"]="$ID_FS_TYPE"
1144 return 1
1146 if fstype=$(find_dev_fstype "$1"); then
1147 host_fs_types["$1"]="$fstype"
1148 return 1
1150 return 1
1153 for dev in ${host_devs[@]}; do
1154 _get_fs_type "$dev"
1155 check_block_and_slaves_all _get_fs_type "$(get_maj_min "$dev")"
1156 done
1158 for dev in "${!host_fs_types[@]}"; do
1159 [[ ${host_fs_types[$dev]} = "reiserfs" ]] || [[ ${host_fs_types[$dev]} = "xfs" ]] || continue
1160 rootopts=$(find_dev_fsopts "$dev")
1161 if [[ ${host_fs_types[$dev]} = "reiserfs" ]]; then
1162 journaldev=$(fs_get_option $rootopts "jdev")
1163 elif [[ ${host_fs_types[$dev]} = "xfs" ]]; then
1164 journaldev=$(fs_get_option $rootopts "logdev")
1166 if [[ $journaldev ]]; then
1167 dev="$(readlink -f "$dev")"
1168 push host_devs "$dev"
1169 _get_fs_type "$dev"
1170 check_block_and_slaves_all _get_fs_type "$(get_maj_min "$dev")"
1172 done
1174 [[ -d $udevdir ]] \
1175 || udevdir="$(pkg-config udev --variable=udevdir 2>/dev/null)"
1176 if ! [[ -d "$udevdir" ]]; then
1177 [[ -d /lib/udev ]] && udevdir=/lib/udev
1178 [[ -d /usr/lib/udev ]] && udevdir=/usr/lib/udev
1181 [[ -d $systemdutildir ]] \
1182 || systemdutildir=$(pkg-config systemd --variable=systemdutildir 2>/dev/null)
1184 if ! [[ -d "$systemdutildir" ]]; then
1185 [[ -d /lib/systemd ]] && systemdutildir=/lib/systemd
1186 [[ -d /usr/lib/systemd ]] && systemdutildir=/usr/lib/systemd
1189 [[ -d $systemdsystemunitdir ]] \
1190 || systemdsystemunitdir=$(pkg-config systemd --variable=systemdsystemunitdir 2>/dev/null)
1192 [[ -d "$systemdsystemunitdir" ]] || systemdsystemunitdir=${systemdutildir}/system
1194 [[ -d $systemdsystemconfdir ]] \
1195 || systemdsystemconfdir=$(pkg-config systemd --variable=systemdsystemconfdir 2>/dev/null)
1197 [[ -d "$systemdsystemconfdir" ]] || systemdsystemconfdir=/etc/systemd/system
1199 export initdir dracutbasedir dracutmodules \
1200 fw_dir drivers_dir debug no_kernel kernel_only \
1201 omit_drivers mdadmconf lvmconf root_dev \
1202 use_fstab fstab_lines libdirs fscks nofscks ro_mnt \
1203 stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
1204 debug host_fs_types host_devs sshkey add_fstab \
1205 DRACUT_VERSION udevdir prefix filesystems drivers \
1206 systemdutildir systemdsystemunitdir systemdsystemconfdir \
1207 host_modalias host_modules hostonly_cmdline
1209 mods_to_load=""
1210 # check all our modules to see if they should be sourced.
1211 # This builds a list of modules that we will install next.
1212 for_each_module_dir check_module
1213 for_each_module_dir check_mount
1215 dracut_module_included "fips" && export DRACUT_FIPS_MODE=1
1217 if [[ $print_cmdline ]]; then
1218 modules_loaded=" "
1219 # source our modules.
1220 for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1221 _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]}
1222 module_cmdline "$_d_mod"
1223 done
1224 unset moddir
1225 printf "\n"
1226 exit 0
1229 # Create some directory structure first
1230 [[ $prefix ]] && mkdir -m 0755 -p "${initdir}${prefix}"
1232 [[ -h /lib ]] || mkdir -m 0755 -p "${initdir}${prefix}/lib"
1233 [[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib"
1235 if [[ $prefix ]]; then
1236 for d in bin etc lib sbin tmp usr var $libdirs; do
1237 [[ "$d" == */* ]] && continue
1238 ln -sfn "${prefix#/}/${d#/}" "$initdir/$d"
1239 done
1242 if [[ $kernel_only != yes ]]; then
1243 for d in usr/bin usr/sbin bin etc lib sbin tmp usr var $libdirs; do
1244 [[ -e "${initdir}${prefix}/$d" ]] && continue
1245 if [ -L "/$d" ]; then
1246 inst_symlink "/$d" "${prefix}/$d"
1247 else
1248 mkdir -m 0755 -p "${initdir}${prefix}/$d"
1250 done
1252 for d in dev proc sys sysroot root run; do
1253 if [ -L "/$d" ]; then
1254 inst_symlink "/$d"
1255 else
1256 mkdir -m 0755 -p "$initdir/$d"
1258 done
1260 ln -sfn ../run "$initdir/var/run"
1261 ln -sfn ../run/lock "$initdir/var/lock"
1262 ln -sfn ../run/log "$initdir/var/log"
1263 else
1264 for d in lib "$libdir"; do
1265 [[ -e "${initdir}${prefix}/$d" ]] && continue
1266 if [ -h "/$d" ]; then
1267 inst "/$d" "${prefix}/$d"
1268 else
1269 mkdir -m 0755 -p "${initdir}${prefix}/$d"
1271 done
1274 if [[ $kernel_only != yes ]]; then
1275 mkdir -p "${initdir}/etc/cmdline.d"
1276 for _d in $hookdirs; do
1277 mkdir -m 0755 -p ${initdir}/lib/dracut/hooks/$_d
1278 done
1279 if [[ "$UID" = "0" ]]; then
1280 [ -c ${initdir}/dev/null ] || mknod ${initdir}/dev/null c 1 3
1281 [ -c ${initdir}/dev/kmsg ] || mknod ${initdir}/dev/kmsg c 1 11
1282 [ -c ${initdir}/dev/console ] || mknod ${initdir}/dev/console c 5 1
1286 _isize=0 #initramfs size
1287 modules_loaded=" "
1288 # source our modules.
1289 for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1290 _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]}
1291 if [[ "$mods_to_load" == *\ $_d_mod\ * ]]; then
1292 if [[ $show_modules = yes ]]; then
1293 printf "%s\n" "$_d_mod"
1294 else
1295 dinfo "*** Including module: $_d_mod ***"
1297 if [[ $kernel_only == yes ]]; then
1298 module_installkernel "$_d_mod" || {
1299 dfatal "installkernel failed in module $_d_mod"
1300 exit 1
1302 else
1303 module_install "$_d_mod"
1304 if [[ $no_kernel != yes ]]; then
1305 module_installkernel "$_d_mod" || {
1306 dfatal "installkernel failed in module $_d_mod"
1307 exit 1
1311 mods_to_load=${mods_to_load// $_d_mod /}
1312 modules_loaded+="$_d_mod "
1314 #print the module install size
1315 if [ -n "$printsize" ]; then
1316 _isize_new=$(du -sk ${initdir}|cut -f1)
1317 _isize_delta=$((_isize_new - _isize))
1318 printf "%s\n" "$_d_mod install size: ${_isize_delta}k"
1319 _isize=$_isize_new
1322 done
1323 unset moddir
1325 for i in $modules_loaded; do
1326 mkdir -p $initdir/lib/dracut
1327 printf "%s\n" "$i" >> $initdir/lib/dracut/modules.txt
1328 done
1330 dinfo "*** Including modules done ***"
1332 ## final stuff that has to happen
1333 if [[ $no_kernel != yes ]]; then
1335 if [[ $drivers ]]; then
1336 hostonly='' instmods $drivers
1339 if [[ $add_drivers ]]; then
1340 hostonly='' instmods -c $add_drivers
1342 if [[ $filesystems ]]; then
1343 hostonly='' instmods -c $filesystems
1346 dinfo "*** Installing kernel module dependencies and firmware ***"
1347 dracut_kernel_post
1348 dinfo "*** Installing kernel module dependencies and firmware done ***"
1350 if [[ $noimageifnotneeded == yes ]] && [[ $hostonly ]]; then
1351 if [[ ! -f "$initdir/lib/dracut/need-initqueue" ]] && \
1352 [[ -f ${initdir}/lib/modules/$kernel/modules.dep && ! -s ${initdir}/lib/modules/$kernel/modules.dep ]]; then
1353 for i in ${initdir}/etc/cmdline.d/*.conf; do
1354 # We need no initramfs image and do not generate one.
1355 [[ $i == "${initdir}/etc/cmdline.d/*.conf" ]] && exit 0
1356 done
1361 if [[ $kernel_only != yes ]]; then
1362 (( ${#install_items[@]} > 0 )) && inst_multiple ${install_items[@]}
1363 (( ${#install_optional_items[@]} > 0 )) && inst_multiple -o ${install_optional_items[@]}
1365 [[ $kernel_cmdline ]] && printf "%s\n" "$kernel_cmdline" >> "${initdir}/etc/cmdline.d/01-default.conf"
1367 while pop fstab_lines line; do
1368 line=($line)
1369 [ -z "${line[3]}" ] && line[3]="defaults"
1370 [ -z "${line[4]}" ] && line[4]="0"
1371 [ -z "${line[5]}" ] && line[5]="2"
1372 echo "${line[@]}" >> "${initdir}/etc/fstab"
1373 done
1375 for f in $add_fstab; do
1376 cat "$f" >> "${initdir}/etc/fstab"
1377 done
1379 if [ -d ${initdir}/$systemdutildir ]; then
1380 mkdir -p ${initdir}/etc/conf.d
1382 printf "%s\n" "systemdutildir=\"$systemdutildir\""
1383 printf "%s\n" "systemdsystemunitdir=\"$systemdsystemunitdir\""
1384 printf "%s\n" "systemdsystemconfdir=\"$systemdsystemconfdir\""
1385 } > ${initdir}/etc/conf.d/systemd.conf
1388 if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then
1389 dinfo "*** Resolving executable dependencies ***"
1390 find "$initdir" -type f \
1391 '(' -perm -0100 -or -perm -0010 -or -perm -0001 ')' \
1392 -not -path '*.ko' -print0 \
1393 | xargs -r -0 $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R ${DRACUT_FIPS_MODE:+-H} --
1394 dinfo "*** Resolving executable dependencies done***"
1397 # libpthread workaround: pthread_cancel wants to dlopen libgcc_s.so
1398 for _dir in $libdirs; do
1399 for _f in "$_dir/libpthread.so"*; do
1400 [[ -e "$_f" ]] || continue
1401 inst_libdir_file "libgcc_s.so*"
1402 break 2
1403 done
1404 done
1407 while pop include_src src && pop include_target tgt; do
1408 if [[ $src && $tgt ]]; then
1409 if [[ -f $src ]]; then
1410 inst $src $tgt
1411 else
1412 ddebug "Including directory: $src"
1413 mkdir -p "${initdir}/${tgt}"
1414 # check for preexisting symlinks, so we can cope with the
1415 # symlinks to $prefix
1416 for i in "$src"/*; do
1417 [[ -e "$i" || -h "$i" ]] || continue
1418 s=${initdir}/${tgt}/${i#$src/}
1419 if [[ -d "$i" ]]; then
1420 if ! [[ -e "$s" ]]; then
1421 mkdir -m 0755 -p "$s"
1422 chmod --reference="$i" "$s"
1424 cp --reflink=auto --sparse=auto -fa -t "$s" "$i"/*
1425 else
1426 cp --reflink=auto --sparse=auto -fa -t "$s" "$i"
1428 done
1431 done
1433 if [[ $kernel_only != yes ]]; then
1434 # make sure that library links are correct and up to date
1435 for f in /etc/ld.so.conf /etc/ld.so.conf.d/*; do
1436 [[ -f $f ]] && inst_simple "$f"
1437 done
1438 if ! ldconfig -r "$initdir"; then
1439 if [[ $UID = 0 ]]; then
1440 derror "ldconfig exited ungracefully"
1441 else
1442 derror "ldconfig might need uid=0 (root) for chroot()"
1447 PRELINK_BIN="$(command -v prelink)"
1448 if [[ $UID = 0 ]] && [[ $PRELINK_BIN ]]; then
1449 if [[ $DRACUT_FIPS_MODE ]]; then
1450 dinfo "*** Installing prelink files ***"
1451 inst_multiple -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf /etc/prelink.cache
1452 elif [[ $do_prelink == yes ]]; then
1453 dinfo "*** Pre-linking files ***"
1454 inst_multiple -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf
1455 chroot "$initdir" "$PRELINK_BIN" -a
1456 rm -f -- "$initdir/$PRELINK_BIN"
1457 rm -fr -- "$initdir"/etc/prelink.*
1458 dinfo "*** Pre-linking files done ***"
1462 if [[ $do_hardlink = yes ]] && command -v hardlink >/dev/null; then
1463 dinfo "*** Hardlinking files ***"
1464 hardlink "$initdir" 2>&1
1465 dinfo "*** Hardlinking files done ***"
1468 # strip binaries
1469 if [[ $do_strip = yes ]] ; then
1470 for p in strip xargs find; do
1471 if ! type -P $p >/dev/null; then
1472 dinfo "Could not find '$p'. Not stripping the initramfs."
1473 do_strip=no
1475 done
1478 if [[ $do_strip = yes ]] && ! [[ $DRACUT_FIPS_MODE ]]; then
1479 dinfo "*** Stripping files ***"
1480 find "$initdir" -type f \
1481 -executable -not -path '*/lib/modules/*.ko' -print0 \
1482 | xargs -r -0 strip -g 2>/dev/null
1484 # strip kernel modules, but do not touch signed modules
1485 find "$initdir" -type f -path '*/lib/modules/*.ko' -print0 \
1486 | while read -r -d $'\0' f; do
1487 SIG=$(tail -c 28 "$f")
1488 [[ $SIG == '~Module signature appended~' ]] || { printf "%s\000" "$f"; }
1489 done | xargs -r -0 strip -g
1491 dinfo "*** Stripping files done ***"
1493 if [[ $early_microcode = yes ]]; then
1494 dinfo "*** Generating early-microcode cpio image ***"
1495 ucode_dir=(amd-ucode intel-ucode)
1496 ucode_dest=(AuthenticAMD.bin GenuineIntel.bin)
1497 _dest_dir="$early_cpio_dir/d/kernel/x86/microcode"
1498 _dest_idx="0 1"
1499 mkdir -p $_dest_dir
1500 if [[ $hostonly ]]; then
1501 [[ $(get_cpu_vendor) == "AMD" ]] && _dest_idx="0"
1502 [[ $(get_cpu_vendor) == "Intel" ]] && _dest_idx="1"
1504 for idx in $_dest_idx; do
1505 _fw=${ucode_dir[$idx]}
1506 for _fwdir in $fw_dir; do
1507 if [[ -d $_fwdir && -d $_fwdir/$_fw ]]; then
1508 _src="*"
1509 dinfo "*** Constructing ${ucode_dest[$idx]} ****"
1510 if [[ $hostonly ]]; then
1511 _src=$(get_ucode_file)
1512 if ! [[ -r $_fwdir/$_fw/$_src ]];then
1513 break;
1516 cat $_fwdir/$_fw/$_src > $_dest_dir/${ucode_dest[$idx]}
1517 create_early_cpio="yes"
1519 done
1520 done
1523 if [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]]; then
1524 dinfo "*** Packaging ACPI tables to override BIOS provided ones ***"
1525 _dest_dir="$early_cpio_dir/d/kernel/firmware/acpi"
1526 mkdir -p $_dest_dir
1527 for table in $acpi_table_dir/*.aml; do
1528 dinfo " Adding ACPI table: $table"
1529 cp -a $table $_dest_dir
1530 create_early_cpio="yes"
1531 done
1534 dinfo "*** Store current command line parameters ***"
1535 if ! ( echo $PARMS_TO_STORE > $initdir/lib/dracut/build-parameter.txt ); then
1536 dfatal "Could not store the current command line parameters"
1537 exit 1
1540 rm -f -- "$outfile"
1541 dinfo "*** Creating image file ***"
1543 if [[ $DRACUT_REPRODUCIBLE ]]; then
1544 find "$initdir" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1545 | xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1547 [[ "$(cpio --help)" == *--reproducible* ]] && CPIO_REPRODUCIBLE=1
1550 [[ "$UID" != 0 ]] && cpio_owner_root="-R 0:0"
1552 if [[ $create_early_cpio = yes ]]; then
1553 echo 1 > "$early_cpio_dir/d/early_cpio"
1555 if [[ $DRACUT_REPRODUCIBLE ]]; then
1556 find "$early_cpio_dir/d" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1557 | xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1560 # The microcode blob is _before_ the initramfs blob, not after
1562 cd "$early_cpio_dir/d"
1563 find . -print0 | sort -z \
1564 | cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc -o --quiet > $outfile
1568 if ! (
1569 umask 077; cd "$initdir"
1570 find . -print0 | sort -z \
1571 | cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc -o --quiet \
1572 | $compress >> "$outfile"
1573 ); then
1574 dfatal "dracut: creation of $outfile failed"
1575 exit 1
1577 dinfo "*** Creating image file done ***"
1579 if (( maxloglvl >= 5 )); then
1580 if [[ $allowlocal ]]; then
1581 "$dracutbasedir/lsinitrd.sh" "$outfile"| ddebug
1582 else
1583 lsinitrd "$outfile"| ddebug
1587 exit 0