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/>.
30 [[ $dracutbasedir ]] || dracutbasedir
=/usr
/lib
/dracut
31 if [[ -f $dracutbasedir/dracut-version.sh
]]; then
32 .
$dracutbasedir/dracut-version.sh
35 # 80x25 linebreak here ^
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.
49 # dracut --add-drivers "module1 module2" ...
55 [[ $dracutbasedir ]] || dracutbasedir
=/usr
/lib
/dracut
56 if [[ -f $dracutbasedir/dracut-version.sh
]]; then
57 .
$dracutbasedir/dracut-version.sh
60 # 80x25 linebreak here ^
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
91 -k, --kmoddir [DIR] Specify the directory, where to look for kernel
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
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
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
144 --no-hostonly-cmdline Do not store kernel command line arguments needed
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
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
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.
203 # dracut --add-drivers "module1 module2" ...
209 # push values to a stack
210 # $1 = stack variable
213 # push stack 1 2 "3 4"
216 local __stack
=$1; shift
218 eval ${__stack}'[${#'${__stack}'[@]}]="$_i"'
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
232 local __stack=$1; shift
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'"
243 printf "%s" "$_value"
245 eval unset ${__stack}'[${#'${__stack}'[@]}-1]'
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.
256 local rematch
='^[^=]*=(.*)$'
257 if [[ $2 =~
$rematch ]]; then
258 read "$1" <<< "${BASH_REMATCH[1]}"
261 # There is no way to shift our callers args, so
262 # return 1 to indicate they should do it instead.
269 local suffix
=$1; shift
274 for i
in "$d/"*"$suffix"; do
275 if [[ -e "$i" ]]; then
276 printf "%s\n" "${i##*/}"
282 for f
in "${files[@]}"; do
284 if [[ -e "$d/$f" ]]; then
285 printf "%s\n" "$d/$f"
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" \
307 --long add-drivers
: \
308 --long force-drivers
: \
309 --long omit-drivers
: \
313 --long filesystems
: \
315 --long install-optional
: \
336 --long print-cmdline \
337 --long kernel-cmdline
: \
359 --long no-host-only \
360 --long hostonly-cmdline \
361 --long no-hostonly-cmdline \
362 --long persistent-policy
: \
372 --long list-modules \
373 --long show-modules \
376 --long regenerate-all \
377 --long noimageifnotneeded \
378 --long early-microcode \
379 --long no-early-microcode \
380 --long reproducible \
384 if (( $?
!= 0 )); then
394 rearrange_params
"$@"
397 # parse command line args to check if '--rebuild' option is present
402 if [ "$1" == "--" ]; then
405 if [ "$1" == "--rebuild" ]; then
408 if [ ! -e $rebuild_file ]; then
409 echo "Image file '$rebuild_file', for rebuild, does not exist!"
412 abs_rebuild_file
=$
(readlink
-f "$rebuild_file") && rebuild_file
="$abs_rebuild_file"
418 # get output file name and kernel version from command line arguments
424 if ! [[ ${outfile+x} ]]; then
426 elif ! [[ ${kernel+x} ]]; then
429 printf "\nUnknown arguments: %s\n\n" "$*" >&2
437 # extract input image file provided with rebuild option to get previous parameters, if any
438 if [[ $append_args_l == "yes" ]]; then
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"
451 # prepend previous parameters to current command line args
452 if [[ $rebuild_param ]]; then
453 TEMP
="$rebuild_param $TEMP"
455 rearrange_params
"$@"
458 # clean the temporarily used scratch-pad directory
468 if [ $1 != "--" ] && [ $1 != "--rebuild" ]; then
469 PARMS_TO_STORE
+=" $1";
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;;
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
509 -f|
--force) force
=yes;;
510 --kernel-only) kernel_only
="yes"; no_kernel
="no";;
511 --no-kernel) kernel_only
="no"; no_kernel
="yes";;
513 print_cmdline
="yes"; hostonly_l
="yes"; kernel_only
="yes"; no_kernel
="yes";;
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--
));;
537 [[ -f "$(readlink -f "${0%/*}")/dracut-functions.sh" ]] \
538 && dracutbasedir
="$(readlink -f "${0%/*}")"
540 -H|
--hostonly|
--host-only)
542 -N|
--no-hostonly|
--no-host-only)
545 hostonly_cmdline_l
="yes" ;;
546 --no-hostonly-cmdline)
547 hostonly_cmdline_l
="no" ;;
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'";
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";;
566 --printsize) printsize
="yes";;
567 --regenerate-all) regenerate_all
="yes";;
568 --noimageifnotneeded) noimageifnotneeded
="yes";;
569 --reproducible) reproducible_l
="yes";;
572 *) # should not even reach this point
573 printf "\n!Unknown option: '%s'\n\n" "$1" >&2; usage
; exit 1;;
578 # getopt cannot handle multiple arguments, so just handle "-I,--include"
579 # the old fashioned way
582 if [ "${1%%=*}" == "++include" ]; then
583 push include_src
"$2"
584 push include_target
"$3"
585 PARMS_TO_STORE
+=" --include '$2' '$3'"
591 if [[ $regenerate_all == "yes" ]]; then
593 if [[ $kernel ]]; then
594 printf -- "--regenerate-all cannot be called with a kernel version\n" >&2
598 if [[ $outfile ]]; then
599 printf -- "--regenerate-all cannot be called with a image file\n" >&2
603 ((len
=${#dracut_args[@]}))
604 for ((i
=0; i
< len
; i
++)); do
605 [[ ${dracut_args[$i]} == "--regenerate-all" ]] && \
606 unset dracut_args
[$i]
611 [[ -f $i/modules.dep
]] ||
[[ -f $i/modules.dep.bin
]] ||
continue
612 dracut
--kver="$i" "${dracut_args[@]}"
618 if ! [[ $kernel ]]; then
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"
634 outfile
="/boot/initramfs-$kernel.img"
642 unset LD_LIBRARY_PATH
646 export DRACUT_LOG_LEVEL
=warning
648 export DRACUT_LOG_LEVEL
=debug
649 export PS4
='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): ';
654 export PS4
='+ $(date "+%s.%N") ${BASH_SOURCE}@${LINENO}: ';
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"
666 conffile
="/etc/dracut.conf"
670 if [[ ! -d $confdir ]]; then
671 if [[ $allowlocal ]]; then
672 confdir
="$dracutbasedir/dracut.conf.d"
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"
686 DRACUT_PATH
=${DRACUT_PATH:-/sbin /bin /usr/sbin /usr/bin}
688 for i
in $DRACUT_PATH; do
693 if [[ "$NPATH" != *:$rl* ]] ; then
697 export PATH
="${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 "
707 if (( ${#force_add_dracutmodules_l[@]} )); then
708 while pop force_add_dracutmodules_l val
; do
709 force_add_dracutmodules
+=" $val "
713 if (( ${#fscks_l[@]} )); then
714 while pop fscks_l val
; do
719 if (( ${#add_fstab_l[@]} )); then
720 while pop add_fstab_l val
; do
725 if (( ${#fstab_lines_l[@]} )); then
726 while pop fstab_lines_l val
; do
727 push fstab_lines
$val
731 if (( ${#install_items_l[@]} )); then
732 while pop install_items_l val
; do
733 install_items
+=" $val "
737 if (( ${#install_optional_items_l[@]} )); then
738 while pop install_optional_items_l val
; do
739 install_optional_items
+=" $val "
743 # these options override the stuff in the config file
744 if (( ${#dracutmodules_l[@]} )); then
746 while pop dracutmodules_l val
; do
747 dracutmodules
+="$val "
751 if (( ${#omit_dracutmodules_l[@]} )); then
752 omit_dracutmodules
=''
753 while pop omit_dracutmodules_l val
; do
754 omit_dracutmodules
+="$val "
758 if (( ${#filesystems_l[@]} )); then
760 while pop filesystems_l val
; do
765 if (( ${#fw_dir_l[@]} )); then
767 while pop fw_dir_l val
; do
772 if (( ${#libdirs_l[@]} )); then
774 while pop libdirs_l val
; do
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"
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 --rsyncable"; command -v pigz
> /dev
/null
2>&1 && compress="pigz -9 -n -T -R";;
826 lzo
) compress="lzop -9";;
827 lz4
) compress="lz4 -l -9";;
829 if [[ $_no_compress_l = "cat" ]]; then
833 [[ $hostonly = yes ]] && hostonly
="-h"
834 [[ $hostonly != "-h" ]] && unset hostonly
836 [[ $reproducible == yes ]] && DRACUT_REPRODUCIBLE
=1
838 readonly TMPDIR
="$tmpdir"
839 readonly initdir
="$(mktemp --tmpdir="$TMPDIR/" -d -t initramfs.XXXXXX)"
840 [ -d "$initdir" ] ||
{
841 printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t initramfs.XXXXXX failed." >&2
845 if [[ $early_microcode = yes ]] ||
( [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]] ); then
846 readonly early_cpio_dir
="$(mktemp --tmpdir="$TMPDIR/" -d -t early_cpio.XXXXXX)"
847 [ -d "$early_cpio_dir" ] ||
{
848 printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t early_cpio.XXXXXX failed." >&2
852 # clean up after ourselves no matter how we die.
855 [[ $keep ]] && echo "Not removing $initdir." >&2 || { [[ $initdir ]] && rm -rf -- "$initdir"; };
856 [[ $keep ]] && echo "Not removing $early_cpio_dir." >&2 || { [[ $early_cpio_dir ]] && rm -Rf -- "$early_cpio_dir"; };
857 [[ $_dlogdir ]] && rm -Rf -- "$_dlogdir";
861 # clean up after ourselves no matter how we die.
862 trap 'exit 1;' SIGINT
864 export DRACUT_KERNEL_LAZY
="1"
865 export DRACUT_RESOLVE_LAZY
="1"
867 if [[ $print_cmdline ]]; then
874 if [[ -f $dracutbasedir/dracut-version.sh
]]; then
875 .
$dracutbasedir/dracut-version.sh
878 if [[ -f $dracutbasedir/dracut-functions.sh
]]; then
879 .
$dracutbasedir/dracut-functions.sh
881 printf "%s\n" "dracut: Cannot find $dracutbasedir/dracut-functions.sh." >&2
882 printf "%s\n" "dracut: Are you running from a git checkout?" >&2
883 printf "%s\n" "dracut: Try passing -l as an argument to $0" >&2
887 if ! [[ $print_cmdline ]]; then
889 if ! $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R "$initdir/bin/sh" &>/dev
/null
; then
890 unset DRACUT_RESOLVE_LAZY
891 export DRACUT_RESOLVE_DEPS
=1
893 rm -fr -- ${initdir}/*
896 # Verify bash version, current minimum is 3.1
897 if (( BASH_VERSINFO
[0] < 4 )); then
898 dfatal
'You need at least Bash 4 to use dracut, sorry.'
902 dracutfunctions
=$dracutbasedir/dracut-functions.sh
903 export dracutfunctions
905 if (( ${#drivers_l[@]} )); then
907 while pop drivers_l val
; do
911 drivers
=${drivers/-/_}
913 if (( ${#add_drivers_l[@]} )); then
914 while pop add_drivers_l val
; do
915 add_drivers
+=" $val "
918 add_drivers
=${add_drivers/-/_}
920 if (( ${#force_drivers_l[@]} )); then
921 while pop force_drivers_l val
; do
922 force_drivers
+=" $val "
925 force_drivers
=${force_drivers/-/_}
927 if (( ${#omit_drivers_l[@]} )); then
928 while pop omit_drivers_l val
; do
929 omit_drivers
+=" $val "
932 omit_drivers
=${omit_drivers/-/_}
934 if (( ${#kernel_cmdline_l[@]} )); then
935 while pop kernel_cmdline_l val
; do
936 kernel_cmdline
+=" $val "
940 omit_drivers_corrected
=""
941 for d
in $omit_drivers; do
942 [[ " $drivers $add_drivers " == *\
$d\
* ]] && continue
943 [[ " $drivers $force_drivers " == *\
$d\
* ]] && continue
944 omit_drivers_corrected
+="$d|"
946 omit_drivers
="${omit_drivers_corrected%|}"
947 unset omit_drivers_corrected
949 # prepare args for logging
950 for ((i
=0; i
< ${#dracut_args[@]}; i
++)); do
951 [[ "${dracut_args[$i]}" == *\
* ]] && \
952 dracut_args
[$i]="\"${dracut_args[$i]}\""
956 dinfo
"Executing: $0 ${dracut_args[@]}"
958 [[ $do_list = yes ]] && {
959 for mod
in $dracutbasedir/modules.d
/*; do
960 [[ -d $mod ]] ||
continue;
961 [[ -e $mod/install ||
-e $mod/installkernel || \
962 -e $mod/module-setup.sh
]] ||
continue
963 printf "%s\n" "${mod##*/??}"
968 # This is kinda legacy -- eventually it should go away.
969 case $dracutmodules in
970 ""|auto
) dracutmodules
="all" ;;
973 abs_outfile
=$
(readlink
-f "$outfile") && outfile
="$abs_outfile"
975 if [[ -d $srcmods ]]; then
976 [[ -f $srcmods/modules.dep
]] ||
{
977 dwarn
"$srcmods/modules.dep is missing. Did you run depmod?"
981 if [[ ! $print_cmdline ]]; then
982 if [[ -f $outfile && ! $force ]]; then
983 dfatal
"Will not override existing initramfs ($outfile) without --force"
988 [[ $outdir ]] || outdir
="/"
990 if [[ ! -d "$outdir" ]]; then
991 dfatal
"Can't write to $outdir: Directory $outdir does not exist or is not accessible."
993 elif [[ ! -w "$outdir" ]]; then
994 dfatal
"No permission to write to $outdir."
996 elif [[ -f "$outfile" && ! -w "$outfile" ]]; then
997 dfatal
"No permission to write $outfile."
1001 if [[ $loginstall ]]; then
1002 if ! mkdir
-p "$loginstall"; then
1003 dfatal
"Could not create directory to log installed files to '$loginstall'."
1006 loginstall
=$
(readlink
-f "$loginstall")
1010 if [[ $acpi_override = yes ]] && ! check_kernel_config CONFIG_ACPI_INITRD_TABLE_OVERRIDE
; then
1011 dwarn
"Disabling ACPI override, because kernel does not support it. CONFIG_ACPI_INITRD_TABLE_OVERRIDE!=y"
1015 if [[ $early_microcode = yes ]]; then
1016 if [[ $hostonly ]]; then
1017 [[ $
(get_cpu_vendor
) == "AMD" ]] \
1018 && ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
1019 && unset early_microcode
1020 [[ $
(get_cpu_vendor
) == "Intel" ]] \
1021 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
1022 && unset early_microcode
1024 ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
1025 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
1026 && unset early_microcode
1028 [[ $early_microcode != yes ]] \
1029 && dwarn
"Disabling early microcode, because kernel does not support it. CONFIG_MICROCODE_[AMD|INTEL]_EARLY!=y"
1032 # Need to be able to have non-root users read stuff (rpcbind etc)
1033 chmod 755 "$initdir"
1035 if [[ $hostonly ]]; then
1036 for i
in /sys
/proc
/run
/dev
; do
1037 if ! findmnt
--target "$i" &>/dev
/null
; then
1038 dwarning
"Turning off host-only mode: '$i' is not mounted!"
1044 declare -A host_fs_types
1046 for line
in "${fstab_lines[@]}"; do
1050 host_fs_types
["$1"]="$3"
1053 for f
in $add_fstab; do
1054 [[ -e $f ]] ||
continue
1055 while read dev rest
; do
1056 push host_devs
"$dev"
1060 for dev
in $add_device; do
1061 push host_devs
"$dev"
1064 if (( ${#add_device_l[@]} )); then
1065 while pop add_device_l val
; do
1066 add_device
+=" $val "
1067 push host_devs
"$val"
1071 if [[ $hostonly ]]; then
1072 # in hostonly mode, determine all devices, which have to be accessed
1073 # and examine them for filesystem types
1091 mp
=$
(readlink
-f "$mp")
1092 mountpoint
"$mp" >/dev
/null
2>&1 ||
continue
1093 _dev
=$
(find_block_device
"$mp")
1094 _bdev
=$
(readlink
-f "/dev/block/$_dev")
1095 [[ -b $_bdev ]] && _dev
=$_bdev
1096 push host_devs
$_dev
1097 [[ "$mp" == "/" ]] && root_dev
="$_dev"
1098 push host_devs
"$_dev"
1101 if [[ -f /proc
/swaps
]] && [[ -f /etc
/fstab
]]; then
1102 while read dev
type rest
; do
1103 [[ -b $dev ]] ||
continue
1104 [[ "$type" == "partition" ]] ||
continue
1106 while read _d _m _t _o _r
; do
1107 [[ "$_d" == \
#* ]] && continue
1108 [[ $_d ]] ||
continue
1109 [[ $_t != "swap" ]] && continue
1110 [[ $_m != "swap" ]] && [[ $_m != "none" ]] && continue
1111 [[ "$_o" == *noauto
* ]] && continue
1112 _d
=$
(expand_persistent_dev
"$_d")
1113 [[ "$_d" -ef "$dev" ]] ||
continue
1115 if [[ -f /etc
/crypttab
]]; then
1116 while read _mapper _a _p _o
; do
1117 [[ $_mapper = \
#* ]] && continue
1118 [[ "$_d" -ef /dev
/mapper
/"$_mapper" ]] ||
continue
1119 [[ "$_o" ]] || _o
="$_p"
1120 # skip entries with password files
1121 [[ "$_p" == /* ]] && [[ -f $_p ]] && continue 2
1123 [[ $_o == *swap
* ]] && continue 2
1124 done < /etc
/crypttab
1127 push host_devs
"$(readlink -f "$dev")"
1132 # record all host modaliases
1133 declare -A host_modalias
1134 find /sys
/devices
/ -name uevent
-print > "$initdir/.modalias"
1137 [[ "$line" != MODALIAS\
=* ]] && continue
1138 modalias
="${line##MODALIAS=}" && [[ $modalias ]] && host_modalias
["$modalias"]=1
1141 done < "$initdir/.modalias"
1143 rm -f -- "$initdir/.modalias"
1145 while read _k _s _v
; do
1146 [ "$_k" != "name" -a "$_k" != "driver" ] && continue
1147 host_modalias
["$_v"]=1
1150 # check /proc/modules
1151 declare -A host_modules
1152 while read m rest
; do
1153 host_modules
["$m"]=1
1162 if [[ -b /dev
/block
/$1 ]]; then
1163 ID_FS_TYPE
=$
(get_fs_env
"/dev/block/$1") && host_fs_types
["$(readlink -f "/dev
/block
/$1")"]="$ID_FS_TYPE"
1166 if [[ -b $1 ]]; then
1167 ID_FS_TYPE
=$
(get_fs_env
"$1") && host_fs_types
["$(readlink -f "$1")"]="$ID_FS_TYPE"
1170 if fstype
=$
(find_dev_fstype
"$1"); then
1171 host_fs_types
["$1"]="$fstype"
1177 for dev
in ${host_devs[@]}; do
1179 check_block_and_slaves_all _get_fs_type
"$(get_maj_min "$dev")"
1182 for dev
in "${!host_fs_types[@]}"; do
1183 [[ ${host_fs_types[$dev]} = "reiserfs" ]] ||
[[ ${host_fs_types[$dev]} = "xfs" ]] ||
continue
1184 rootopts
=$
(find_dev_fsopts
"$dev")
1185 if [[ ${host_fs_types[$dev]} = "reiserfs" ]]; then
1186 journaldev
=$
(fs_get_option
$rootopts "jdev")
1187 elif [[ ${host_fs_types[$dev]} = "xfs" ]]; then
1188 journaldev
=$
(fs_get_option
$rootopts "logdev")
1190 if [[ $journaldev ]]; then
1191 dev
="$(readlink -f "$dev")"
1192 push host_devs
"$dev"
1194 check_block_and_slaves_all _get_fs_type
"$(get_maj_min "$dev")"
1199 || udevdir
="$(pkg-config udev --variable=udevdir 2>/dev/null)"
1200 if ! [[ -d "$udevdir" ]]; then
1201 [[ -d /lib
/udev
]] && udevdir
=/lib
/udev
1202 [[ -d /usr
/lib
/udev
]] && udevdir
=/usr
/lib
/udev
1205 [[ -d $systemdutildir ]] \
1206 || systemdutildir
=$
(pkg-config systemd
--variable=systemdutildir
2>/dev
/null
)
1208 if ! [[ -d "$systemdutildir" ]]; then
1209 [[ -d /lib
/systemd
]] && systemdutildir
=/lib
/systemd
1210 [[ -d /usr
/lib
/systemd
]] && systemdutildir
=/usr
/lib
/systemd
1213 [[ -d $systemdsystemunitdir ]] \
1214 || systemdsystemunitdir
=$
(pkg-config systemd
--variable=systemdsystemunitdir
2>/dev
/null
)
1216 [[ -d "$systemdsystemunitdir" ]] || systemdsystemunitdir
=${systemdutildir}/system
1218 [[ -d $systemdsystemconfdir ]] \
1219 || systemdsystemconfdir
=$
(pkg-config systemd
--variable=systemdsystemconfdir
2>/dev
/null
)
1221 [[ -d "$systemdsystemconfdir" ]] || systemdsystemconfdir
=/etc
/systemd
/system
1223 export initdir dracutbasedir dracutmodules \
1224 fw_dir drivers_dir debug no_kernel kernel_only \
1225 omit_drivers mdadmconf lvmconf root_dev \
1226 use_fstab fstab_lines libdirs fscks nofscks ro_mnt \
1227 stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
1228 debug host_fs_types host_devs sshkey add_fstab \
1229 DRACUT_VERSION udevdir prefix filesystems drivers \
1230 systemdutildir systemdsystemunitdir systemdsystemconfdir \
1231 host_modalias host_modules hostonly_cmdline loginstall
1234 # check all our modules to see if they should be sourced.
1235 # This builds a list of modules that we will install next.
1236 for_each_module_dir check_module
1237 for_each_module_dir check_mount
1239 dracut_module_included
"fips" && export DRACUT_FIPS_MODE
=1
1241 if [[ $print_cmdline ]]; then
1243 # source our modules.
1244 for moddir
in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1245 _d_mod
=${moddir##*/}; _d_mod
=${_d_mod#[0-9][0-9]}
1246 module_cmdline
"$_d_mod"
1253 # Create some directory structure first
1254 [[ $prefix ]] && mkdir
-m 0755 -p "${initdir}${prefix}"
1256 [[ -h /lib
]] || mkdir
-m 0755 -p "${initdir}${prefix}/lib"
1257 [[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib"
1259 if [[ $prefix ]]; then
1260 for d
in bin etc lib sbin tmp usr var
$libdirs; do
1261 [[ "$d" == */* ]] && continue
1262 ln -sfn "${prefix#/}/${d#/}" "$initdir/$d"
1266 if [[ $kernel_only != yes ]]; then
1267 for d
in usr
/bin usr
/sbin bin etc lib sbin tmp usr var
$libdirs; do
1268 [[ -e "${initdir}${prefix}/$d" ]] && continue
1269 if [ -L "/$d" ]; then
1270 inst_symlink
"/$d" "${prefix}/$d"
1272 mkdir
-m 0755 -p "${initdir}${prefix}/$d"
1276 for d
in dev proc sys sysroot root run
; do
1277 if [ -L "/$d" ]; then
1280 mkdir
-m 0755 -p "$initdir/$d"
1284 ln -sfn ..
/run
"$initdir/var/run"
1285 ln -sfn ..
/run
/lock
"$initdir/var/lock"
1286 ln -sfn ..
/run
/log
"$initdir/var/log"
1288 for d
in lib
"$libdir"; do
1289 [[ -e "${initdir}${prefix}/$d" ]] && continue
1290 if [ -h "/$d" ]; then
1291 inst
"/$d" "${prefix}/$d"
1293 mkdir
-m 0755 -p "${initdir}${prefix}/$d"
1298 if [[ $kernel_only != yes ]]; then
1299 mkdir
-p "${initdir}/etc/cmdline.d"
1300 for _d
in $hookdirs; do
1301 mkdir
-m 0755 -p ${initdir}/lib
/dracut
/hooks
/$_d
1303 if [[ "$UID" = "0" ]]; then
1304 [ -c ${initdir}/dev
/null
] || mknod
${initdir}/dev
/null c
1 3
1305 [ -c ${initdir}/dev
/kmsg
] || mknod
${initdir}/dev
/kmsg c
1 11
1306 [ -c ${initdir}/dev
/console
] || mknod
${initdir}/dev
/console c
5 1
1310 _isize
=0 #initramfs size
1312 # source our modules.
1313 for moddir
in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1314 _d_mod
=${moddir##*/}; _d_mod
=${_d_mod#[0-9][0-9]}
1315 if [[ "$mods_to_load" == *\
$_d_mod\
* ]]; then
1316 if [[ $show_modules = yes ]]; then
1317 printf "%s\n" "$_d_mod"
1319 dinfo
"*** Including module: $_d_mod ***"
1321 if [[ $kernel_only == yes ]]; then
1322 module_installkernel
"$_d_mod" ||
{
1323 dfatal
"installkernel failed in module $_d_mod"
1327 module_install
"$_d_mod"
1328 if [[ $no_kernel != yes ]]; then
1329 module_installkernel
"$_d_mod" ||
{
1330 dfatal
"installkernel failed in module $_d_mod"
1335 mods_to_load
=${mods_to_load// $_d_mod /}
1336 modules_loaded
+="$_d_mod "
1338 #print the module install size
1339 if [ -n "$printsize" ]; then
1340 _isize_new
=$
(du
-sk ${initdir}|cut
-f1)
1341 _isize_delta
=$
((_isize_new
- _isize
))
1342 printf "%s\n" "$_d_mod install size: ${_isize_delta}k"
1349 for i
in $modules_loaded; do
1350 mkdir
-p $initdir/lib
/dracut
1351 printf "%s\n" "$i" >> $initdir/lib
/dracut
/modules.txt
1354 dinfo
"*** Including modules done ***"
1356 ## final stuff that has to happen
1357 if [[ $no_kernel != yes ]]; then
1359 if [[ $drivers ]]; then
1360 hostonly
='' instmods
$drivers
1363 if [[ $add_drivers ]]; then
1364 hostonly
='' instmods
-c $add_drivers
1366 if [[ $force_drivers ]]; then
1367 hostonly
='' instmods
-c $force_drivers
1368 rm -f $initdir/etc
/cmdline.d
/20-force_driver.conf
1369 for mod
in $force_drivers; do
1370 echo "rd.driver.pre=$mod" >>$initdir/etc
/cmdline.d
/20-force_drivers.conf
1373 if [[ $filesystems ]]; then
1374 hostonly
='' instmods
-c $filesystems
1377 dinfo
"*** Installing kernel module dependencies and firmware ***"
1379 dinfo
"*** Installing kernel module dependencies and firmware done ***"
1381 if [[ $noimageifnotneeded == yes ]] && [[ $hostonly ]]; then
1382 if [[ ! -f "$initdir/lib/dracut/need-initqueue" ]] && \
1383 [[ -f ${initdir}/lib
/modules
/$kernel/modules.dep
&& ! -s ${initdir}/lib
/modules
/$kernel/modules.dep
]]; then
1384 for i
in ${initdir}/etc
/cmdline.d
/*.conf
; do
1385 # We need no initramfs image and do not generate one.
1386 [[ $i == "${initdir}/etc/cmdline.d/*.conf" ]] && exit 0
1392 if [[ $kernel_only != yes ]]; then
1393 (( ${#install_items[@]} > 0 )) && inst_multiple
${install_items[@]}
1394 (( ${#install_optional_items[@]} > 0 )) && inst_multiple
-o ${install_optional_items[@]}
1396 [[ $kernel_cmdline ]] && printf "%s\n" "$kernel_cmdline" >> "${initdir}/etc/cmdline.d/01-default.conf"
1398 while pop fstab_lines line
; do
1400 [ -z "${line[3]}" ] && line
[3]="defaults"
1401 [ -z "${line[4]}" ] && line
[4]="0"
1402 [ -z "${line[5]}" ] && line
[5]="2"
1403 echo "${line[@]}" >> "${initdir}/etc/fstab"
1406 for f
in $add_fstab; do
1407 cat "$f" >> "${initdir}/etc/fstab"
1410 if [ -d ${initdir}/$systemdutildir ]; then
1411 mkdir
-p ${initdir}/etc
/conf.d
1413 printf "%s\n" "systemdutildir=\"$systemdutildir\""
1414 printf "%s\n" "systemdsystemunitdir=\"$systemdsystemunitdir\""
1415 printf "%s\n" "systemdsystemconfdir=\"$systemdsystemconfdir\""
1416 } > ${initdir}/etc
/conf.d
/systemd.conf
1419 if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then
1420 dinfo
"*** Resolving executable dependencies ***"
1421 find "$initdir" -type f \
1422 '(' -perm -0100 -or -perm -0010 -or -perm -0001 ')' \
1423 -not -path '*.ko' -print0 \
1424 |
xargs -r -0 $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R ${DRACUT_FIPS_MODE:+-H} --
1425 dinfo
"*** Resolving executable dependencies done***"
1428 # libpthread workaround: pthread_cancel wants to dlopen libgcc_s.so
1429 for _dir
in $libdirs; do
1430 for _f
in "$_dir/libpthread.so"*; do
1431 [[ -e "$_f" ]] ||
continue
1432 inst_libdir_file
"libgcc_s.so*"
1438 while pop include_src src
&& pop include_target tgt
; do
1439 if [[ $src && $tgt ]]; then
1440 if [[ -f $src ]]; then
1443 ddebug
"Including directory: $src"
1444 mkdir
-p "${initdir}/${tgt}"
1445 # check for preexisting symlinks, so we can cope with the
1446 # symlinks to $prefix
1447 for i
in "$src"/*; do
1448 [[ -e "$i" ||
-h "$i" ]] ||
continue
1449 s
=${initdir}/${tgt}/${i#$src/}
1450 if [[ -d "$i" ]]; then
1451 if ! [[ -e "$s" ]]; then
1452 mkdir
-m 0755 -p "$s"
1453 chmod --reference="$i" "$s"
1455 cp --reflink=auto
--sparse=auto
-fa -t "$s" "$i"/*
1457 cp --reflink=auto
--sparse=auto
-fa -t "$s" "$i"
1464 if [[ $kernel_only != yes ]]; then
1465 # make sure that library links are correct and up to date
1466 for f
in /etc
/ld.so.conf
/etc
/ld.so.conf.d
/*; do
1467 [[ -f $f ]] && inst_simple
"$f"
1469 if ! ldconfig
-r "$initdir"; then
1470 if [[ $UID = 0 ]]; then
1471 derror
"ldconfig exited ungracefully"
1473 derror
"ldconfig might need uid=0 (root) for chroot()"
1478 PRELINK_BIN
="$(command -v prelink)"
1479 if [[ $UID = 0 ]] && [[ $PRELINK_BIN ]]; then
1480 if [[ $DRACUT_FIPS_MODE ]]; then
1481 dinfo
"*** Installing prelink files ***"
1482 inst_multiple
-o prelink
/etc
/prelink.conf
/etc
/prelink.conf.d
/*.conf
/etc
/prelink.cache
1483 elif [[ $do_prelink == yes ]]; then
1484 dinfo
"*** Pre-linking files ***"
1485 inst_multiple
-o prelink
/etc
/prelink.conf
/etc
/prelink.conf.d
/*.conf
1486 chroot
"$initdir" "$PRELINK_BIN" -a
1487 rm -f -- "$initdir/$PRELINK_BIN"
1488 rm -fr -- "$initdir"/etc
/prelink.
*
1489 dinfo
"*** Pre-linking files done ***"
1493 if [[ $do_hardlink = yes ]] && command -v hardlink
>/dev
/null
; then
1494 dinfo
"*** Hardlinking files ***"
1495 hardlink
"$initdir" 2>&1
1496 dinfo
"*** Hardlinking files done ***"
1500 if [[ $do_strip = yes ]] ; then
1501 for p
in strip
xargs find; do
1502 if ! type -P $p >/dev
/null
; then
1503 dinfo
"Could not find '$p'. Not stripping the initramfs."
1509 if [[ $do_strip = yes ]] && ! [[ $DRACUT_FIPS_MODE ]]; then
1510 dinfo
"*** Stripping files ***"
1511 find "$initdir" -type f \
1512 -executable -not -path '*/lib/modules/*.ko' -print0 \
1513 |
xargs -r -0 strip
-g 2>/dev
/null
1515 # strip kernel modules, but do not touch signed modules
1516 find "$initdir" -type f
-path '*/lib/modules/*.ko' -print0 \
1517 |
while read -r -d $
'\0' f
; do
1518 SIG
=$
(tail -c 28 "$f")
1519 [[ $SIG == '~Module signature appended~' ]] ||
{ printf "%s\000" "$f"; }
1520 done |
xargs -r -0 strip
-g
1522 dinfo
"*** Stripping files done ***"
1524 if [[ $early_microcode = yes ]]; then
1525 dinfo
"*** Generating early-microcode cpio image ***"
1526 ucode_dir
=(amd-ucode intel-ucode
)
1527 ucode_dest
=(AuthenticAMD.bin GenuineIntel.bin
)
1528 _dest_dir
="$early_cpio_dir/d/kernel/x86/microcode"
1531 if [[ $hostonly ]]; then
1532 [[ $
(get_cpu_vendor
) == "AMD" ]] && _dest_idx
="0"
1533 [[ $
(get_cpu_vendor
) == "Intel" ]] && _dest_idx
="1"
1535 for idx
in $_dest_idx; do
1536 _fw
=${ucode_dir[$idx]}
1537 for _fwdir
in $fw_dir; do
1538 if [[ -d $_fwdir && -d $_fwdir/$_fw ]]; then
1540 dinfo
"*** Constructing ${ucode_dest[$idx]} ****"
1541 if [[ $hostonly ]]; then
1542 _src
=$
(get_ucode_file
)
1543 if ! [[ -r $_fwdir/$_fw/$_src ]];then
1547 cat $_fwdir/$_fw/$_src > $_dest_dir/${ucode_dest[$idx]}
1548 create_early_cpio
="yes"
1554 if [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]]; then
1555 dinfo
"*** Packaging ACPI tables to override BIOS provided ones ***"
1556 _dest_dir
="$early_cpio_dir/d/kernel/firmware/acpi"
1558 for table
in $acpi_table_dir/*.aml
; do
1559 dinfo
" Adding ACPI table: $table"
1560 cp -a $table $_dest_dir
1561 create_early_cpio
="yes"
1565 dinfo
"*** Store current command line parameters ***"
1566 if ! ( echo $PARMS_TO_STORE > $initdir/lib
/dracut
/build-parameter.txt
); then
1567 dfatal
"Could not store the current command line parameters"
1572 dinfo
"*** Creating image file ***"
1574 if [[ $DRACUT_REPRODUCIBLE ]]; then
1575 find "$initdir" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1576 |
xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1578 [[ "$(cpio --help)" == *--reproducible* ]] && CPIO_REPRODUCIBLE
=1
1581 [[ "$UID" != 0 ]] && cpio_owner_root
="-R 0:0"
1583 if [[ $create_early_cpio = yes ]]; then
1584 echo 1 > "$early_cpio_dir/d/early_cpio"
1586 if [[ $DRACUT_REPRODUCIBLE ]]; then
1587 find "$early_cpio_dir/d" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1588 |
xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1591 # The microcode blob is _before_ the initramfs blob, not after
1593 cd "$early_cpio_dir/d"
1594 find .
-print0 |
sort -z \
1595 |
cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc
-o --quiet > $outfile
1600 umask 077; cd "$initdir"
1601 find .
-print0 |
sort -z \
1602 |
cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc
-o --quiet \
1603 |
$compress >> "$outfile"
1605 dfatal
"dracut: creation of $outfile failed"
1608 dinfo
"*** Creating image file done ***"
1610 if (( maxloglvl
>= 5 )); then
1611 if [[ $allowlocal ]]; then
1612 "$dracutbasedir/lsinitrd.sh" "$outfile"| ddebug
1614 lsinitrd
"$outfile"| ddebug