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/>.
32 [[ $dracutbasedir ]] || dracutbasedir
=/usr
/lib
/dracut
33 if [[ -f $dracutbasedir/dracut-version.sh
]]; then
34 .
$dracutbasedir/dracut-version.sh
37 # 80x25 linebreak here ^
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.
51 # dracut --add-drivers "module1 module2" ...
57 [[ $dracutbasedir ]] || dracutbasedir
=/usr
/lib
/dracut
58 if [[ -f $dracutbasedir/dracut-version.sh
]]; then
59 .
$dracutbasedir/dracut-version.sh
62 # 80x25 linebreak here ^
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
89 -k, --kmoddir [DIR] Specify the directory, where to look for kernel
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
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
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
142 --no-hostonly-cmdline Do not store kernel command line arguments needed
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
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
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.
200 # dracut --add-drivers "module1 module2" ...
206 # push values to a stack
207 # $1 = stack variable
210 # push stack 1 2 "3 4"
213 local __stack
=$1; shift
215 eval ${__stack}'[${#'${__stack}'[@]}]="$_i"'
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
229 local __stack=$1; shift
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'"
240 printf "%s" "$_value"
242 eval unset ${__stack}'[${#'${__stack}'[@]}-1]'
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.
253 local rematch
='^[^=]*=(.*)$'
254 if [[ $2 =~
$rematch ]]; then
255 read "$1" <<< "${BASH_REMATCH[1]}"
258 # There is no way to shift our callers args, so
259 # return 1 to indicate they should do it instead.
266 local suffix
=$1; shift
271 for i
in "$d/"*"$suffix"; do
272 if [[ -e "$i" ]]; then
273 printf "%s\n" "${i##*/}"
279 for f
in "${files[@]}"; do
281 if [[ -e "$d/$f" ]]; then
282 printf "%s\n" "$d/$f"
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" \
304 --long add-drivers
: \
305 --long omit-drivers
: \
309 --long filesystems
: \
311 --long install-optional
: \
332 --long print-cmdline \
333 --long kernel-cmdline
: \
355 --long no-host-only \
356 --long hostonly-cmdline \
357 --long no-hostonly-cmdline \
358 --long persistent-policy
: \
368 --long list-modules \
369 --long show-modules \
372 --long regenerate-all \
373 --long noimageifnotneeded \
374 --long early-microcode \
375 --long no-early-microcode \
376 --long reproducible \
379 if (( $?
!= 0 )); then
389 rearrange_params
"$@"
392 # parse command line args to check if '--rebuild' option is present
397 if [ "$1" == "--" ]; then
400 if [ "$1" == "--rebuild" ]; then
403 if [ ! -e $rebuild_file ]; then
404 echo "Image file '$rebuild_file', for rebuild, does not exist!"
407 abs_rebuild_file
=$
(readlink
-f "$rebuild_file") && rebuild_file
="$abs_rebuild_file"
413 # get output file name and kernel version from command line arguments
419 if ! [[ ${outfile+x} ]]; then
421 elif ! [[ ${kernel+x} ]]; then
424 printf "\nUnknown arguments: %s\n\n" "$*" >&2
432 # extract input image file provided with rebuild option to get previous parameters, if any
433 if [[ $append_args_l == "yes" ]]; then
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"
446 # prepend previous parameters to current command line args
447 if [[ $rebuild_param ]]; then
448 TEMP
="$rebuild_param $TEMP"
450 rearrange_params
"$@"
453 # clean the temporarily used scratch-pad directory
463 if [ $1 != "--" ] && [ $1 != "--rebuild" ]; then
464 PARMS_TO_STORE
+=" $1";
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;;
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
502 -f|
--force) force
=yes;;
503 --kernel-only) kernel_only
="yes"; no_kernel
="no";;
504 --no-kernel) kernel_only
="no"; no_kernel
="yes";;
506 print_cmdline
="yes"; hostonly_l
="yes"; kernel_only
="yes"; no_kernel
="yes";;
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--
));;
530 [[ -f "$(readlink -f "${0%/*}")/dracut-functions.sh" ]] \
531 && dracutbasedir
="$(readlink -f "${0%/*}")"
533 -H|
--hostonly|
--host-only)
535 -N|
--no-hostonly|
--no-host-only)
538 hostonly_cmdline_l
="yes" ;;
539 --no-hostonly-cmdline)
540 hostonly_cmdline_l
="no" ;;
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'";
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";;
559 --printsize) printsize
="yes";;
560 --regenerate-all) regenerate_all
="yes";;
561 --noimageifnotneeded) noimageifnotneeded
="yes";;
562 --reproducible) reproducible_l
="yes";;
565 *) # should not even reach this point
566 printf "\n!Unknown option: '%s'\n\n" "$1" >&2; usage
; exit 1;;
571 # getopt cannot handle multiple arguments, so just handle "-I,--include"
572 # the old fashioned way
575 if [ "${1%%=*}" == "++include" ]; then
576 push include_src
"$2"
577 push include_target
"$3"
578 PARMS_TO_STORE
+=" --include '$2' '$3'"
584 if [[ $regenerate_all == "yes" ]]; then
586 if [[ $kernel ]]; then
587 printf -- "--regenerate-all cannot be called with a kernel version\n" >&2
591 if [[ $outfile ]]; then
592 printf -- "--regenerate-all cannot be called with a image file\n" >&2
596 ((len
=${#dracut_args[@]}))
597 for ((i
=0; i
< len
; i
++)); do
598 [[ ${dracut_args[$i]} == "--regenerate-all" ]] && \
599 unset dracut_args
[$i]
604 [[ -f $i/modules.dep
]] ||
[[ -f $i/modules.dep.bin
]] ||
continue
605 dracut
--kver="$i" "${dracut_args[@]}"
611 if ! [[ $kernel ]]; then
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"
627 outfile
="/boot/initramfs-$kernel.img"
635 unset LD_LIBRARY_PATH
639 export DRACUT_LOG_LEVEL
=warning
641 export DRACUT_LOG_LEVEL
=debug
642 export PS4
='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): ';
647 export PS4
='+ $(date "+%s.%N") ${BASH_SOURCE}@${LINENO}: ';
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"
659 conffile
="/etc/dracut.conf"
663 if [[ ! -d $confdir ]]; then
664 if [[ $allowlocal ]]; then
665 confdir
="$dracutbasedir/dracut.conf.d"
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"
679 DRACUT_PATH
=${DRACUT_PATH:-/usr/sbin /sbin /usr/bin /bin}
681 for i
in $DRACUT_PATH; do
686 if [[ "$NPATH" != *:$rl* ]] ; then
690 export PATH
="${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 "
700 if (( ${#force_add_dracutmodules_l[@]} )); then
701 while pop force_add_dracutmodules_l val
; do
702 force_add_dracutmodules
+=" $val "
706 if (( ${#fscks_l[@]} )); then
707 while pop fscks_l val
; do
712 if (( ${#add_fstab_l[@]} )); then
713 while pop add_fstab_l val
; do
718 if (( ${#fstab_lines_l[@]} )); then
719 while pop fstab_lines_l val
; do
720 push fstab_lines
$val
724 if (( ${#install_items_l[@]} )); then
725 while pop install_items_l val
; do
726 install_items
+=" $val "
730 if (( ${#install_optional_items_l[@]} )); then
731 while pop install_optional_items_l val
; do
732 install_optional_items
+=" $val "
736 # these options override the stuff in the config file
737 if (( ${#dracutmodules_l[@]} )); then
739 while pop dracutmodules_l val
; do
740 dracutmodules
+="$val "
744 if (( ${#omit_dracutmodules_l[@]} )); then
745 omit_dracutmodules
=''
746 while pop omit_dracutmodules_l val
; do
747 omit_dracutmodules
+="$val "
751 if (( ${#filesystems_l[@]} )); then
753 while pop filesystems_l val
; do
758 if (( ${#fw_dir_l[@]} )); then
760 while pop fw_dir_l val
; do
765 if (( ${#libdirs_l[@]} )); then
767 while pop libdirs_l val
; do
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"
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";;
821 if [[ $_no_compress_l = "cat" ]]; then
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
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
844 # clean up after ourselves no matter how we die.
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";
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
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
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
879 if ! [[ $print_cmdline ]]; then
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.'
894 dracutfunctions
=$dracutbasedir/dracut-functions.sh
895 export dracutfunctions
897 if (( ${#drivers_l[@]} )); then
899 while pop drivers_l val
; do
903 drivers
=${drivers/-/_}
905 if (( ${#add_drivers_l[@]} )); then
906 while pop add_drivers_l val
; do
907 add_drivers
+=" $val "
910 add_drivers
=${add_drivers/-/_}
912 if (( ${#omit_drivers_l[@]} )); then
913 while pop omit_drivers_l val
; do
914 omit_drivers
+=" $val "
917 omit_drivers
=${omit_drivers/-/_}
919 if (( ${#kernel_cmdline_l[@]} )); then
920 while pop kernel_cmdline_l val
; do
921 kernel_cmdline
+=" $val "
925 omit_drivers_corrected
=""
926 for d
in $omit_drivers; do
927 [[ " $drivers $add_drivers " == *\
$d\
* ]] && continue
928 omit_drivers_corrected
+="$d|"
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]}\""
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##*/??}"
952 # This is kinda legacy -- eventually it should go away.
953 case $dracutmodules in
954 ""|auto
) dracutmodules
="all" ;;
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"
972 [[ $outdir ]] || outdir
="/"
974 if [[ ! -d "$outdir" ]]; then
975 dfatal
"Can't write to $outdir: Directory $outdir does not exist or is not accessible."
977 elif [[ ! -w "$outdir" ]]; then
978 dfatal
"No permission to write to $outdir."
980 elif [[ -f "$outfile" && ! -w "$outfile" ]]; then
981 dfatal
"No permission to write $outfile."
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"
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
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!"
1020 declare -A host_fs_types
1022 for line
in "${fstab_lines[@]}"; do
1026 host_fs_types
["$1"]="$3"
1029 for f
in $add_fstab; do
1030 [[ -e $f ]] ||
continue
1031 while read dev rest
; do
1032 push host_devs
"$dev"
1036 for dev
in $add_device; do
1037 push host_devs
"$dev"
1040 if (( ${#add_device_l[@]} )); then
1041 while pop add_device_l val
; do
1042 add_device
+=" $val "
1043 push host_devs
"$val"
1047 if [[ $hostonly ]]; then
1048 # in hostonly mode, determine all devices, which have to be accessed
1049 # and examine them for filesystem types
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"
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
1099 [[ $_o == *swap
* ]] && continue 2
1100 done < /etc
/crypttab
1103 push host_devs
"$(readlink -f "$dev")"
1108 # record all host modaliases
1109 declare -A host_modalias
1110 find /sys
/devices
/ -name uevent
-print > "$initdir/.modalias"
1113 [[ "$line" != MODALIAS\
=* ]] && continue
1114 modalias
="${line##MODALIAS=}" && [[ $modalias ]] && host_modalias
["$modalias"]=1
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
1126 # check /proc/modules
1127 declare -A host_modules
1128 while read m rest
; do
1129 host_modules
["$m"]=1
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"
1142 if [[ -b $1 ]]; then
1143 ID_FS_TYPE
=$
(get_fs_env
"$1") && host_fs_types
["$(readlink -f "$1")"]="$ID_FS_TYPE"
1146 if fstype
=$
(find_dev_fstype
"$1"); then
1147 host_fs_types
["$1"]="$fstype"
1153 for dev
in ${host_devs[@]}; do
1155 check_block_and_slaves_all _get_fs_type
"$(get_maj_min "$dev")"
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"
1170 check_block_and_slaves_all _get_fs_type
"$(get_maj_min "$dev")"
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
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
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"
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"
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"
1248 mkdir
-m 0755 -p "${initdir}${prefix}/$d"
1252 for d
in dev proc sys sysroot root run
; do
1253 if [ -L "/$d" ]; then
1256 mkdir
-m 0755 -p "$initdir/$d"
1260 ln -sfn ..
/run
"$initdir/var/run"
1261 ln -sfn ..
/run
/lock
"$initdir/var/lock"
1262 ln -sfn ..
/run
/log
"$initdir/var/log"
1264 for d
in lib
"$libdir"; do
1265 [[ -e "${initdir}${prefix}/$d" ]] && continue
1266 if [ -h "/$d" ]; then
1267 inst
"/$d" "${prefix}/$d"
1269 mkdir
-m 0755 -p "${initdir}${prefix}/$d"
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
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
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"
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"
1303 module_install
"$_d_mod"
1304 if [[ $no_kernel != yes ]]; then
1305 module_installkernel
"$_d_mod" ||
{
1306 dfatal
"installkernel failed in module $_d_mod"
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"
1325 for i
in $modules_loaded; do
1326 mkdir
-p $initdir/lib
/dracut
1327 printf "%s\n" "$i" >> $initdir/lib
/dracut
/modules.txt
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 ***"
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
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
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"
1375 for f
in $add_fstab; do
1376 cat "$f" >> "${initdir}/etc/fstab"
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*"
1407 while pop include_src src
&& pop include_target tgt
; do
1408 if [[ $src && $tgt ]]; then
1409 if [[ -f $src ]]; then
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"/*
1426 cp --reflink=auto
--sparse=auto
-fa -t "$s" "$i"
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"
1438 if ! ldconfig
-r "$initdir"; then
1439 if [[ $UID = 0 ]]; then
1440 derror
"ldconfig exited ungracefully"
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 ***"
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."
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"
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
1509 dinfo
"*** Constructing ${ucode_dest[$idx]} ****"
1510 if [[ $hostonly ]]; then
1511 _src
=$
(get_ucode_file
)
1512 if ! [[ -r $_fwdir/$_fw/$_src ]];then
1516 cat $_fwdir/$_fw/$_src > $_dest_dir/${ucode_dest[$idx]}
1517 create_early_cpio
="yes"
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"
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"
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"
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
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"
1574 dfatal
"dracut: creation of $outfile failed"
1577 dinfo
"*** Creating image file done ***"
1579 if (( maxloglvl
>= 5 )); then
1580 if [[ $allowlocal ]]; then
1581 "$dracutbasedir/lsinitrd.sh" "$outfile"| ddebug
1583 lsinitrd
"$outfile"| ddebug