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";
826 if command -v pigz
> /dev
/null
2>&1; then
827 compress="pigz -9 -n -T -R"
828 elif command -v gzip --help 2>&1 |
grep -q rsyncable
; then
829 compress="gzip -n -9 --rsyncable"
832 lzo
) compress="lzop -9";;
833 lz4
) compress="lz4 -l -9";;
835 if [[ $_no_compress_l = "cat" ]]; then
839 [[ $hostonly = yes ]] && hostonly
="-h"
840 [[ $hostonly != "-h" ]] && unset hostonly
842 [[ $reproducible == yes ]] && DRACUT_REPRODUCIBLE
=1
844 readonly TMPDIR
="$tmpdir"
845 readonly initdir
="$(mktemp --tmpdir="$TMPDIR/" -d -t initramfs.XXXXXX)"
846 [ -d "$initdir" ] ||
{
847 printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t initramfs.XXXXXX failed." >&2
851 if [[ $early_microcode = yes ]] ||
( [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]] ); then
852 readonly early_cpio_dir
="$(mktemp --tmpdir="$TMPDIR/" -d -t early_cpio.XXXXXX)"
853 [ -d "$early_cpio_dir" ] ||
{
854 printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t early_cpio.XXXXXX failed." >&2
858 # clean up after ourselves no matter how we die.
861 [[ $keep ]] && echo "Not removing $initdir." >&2 || { [[ $initdir ]] && rm -rf -- "$initdir"; };
862 [[ $keep ]] && echo "Not removing $early_cpio_dir." >&2 || { [[ $early_cpio_dir ]] && rm -Rf -- "$early_cpio_dir"; };
863 [[ $_dlogdir ]] && rm -Rf -- "$_dlogdir";
867 # clean up after ourselves no matter how we die.
868 trap 'exit 1;' SIGINT
870 export DRACUT_KERNEL_LAZY
="1"
871 export DRACUT_RESOLVE_LAZY
="1"
873 if [[ $print_cmdline ]]; then
880 if [[ -f $dracutbasedir/dracut-version.sh
]]; then
881 .
$dracutbasedir/dracut-version.sh
884 if [[ -f $dracutbasedir/dracut-functions.sh
]]; then
885 .
$dracutbasedir/dracut-functions.sh
887 printf "%s\n" "dracut: Cannot find $dracutbasedir/dracut-functions.sh." >&2
888 printf "%s\n" "dracut: Are you running from a git checkout?" >&2
889 printf "%s\n" "dracut: Try passing -l as an argument to $0" >&2
893 if ! [[ $print_cmdline ]]; then
895 if ! $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R "$initdir/bin/sh" &>/dev
/null
; then
896 unset DRACUT_RESOLVE_LAZY
897 export DRACUT_RESOLVE_DEPS
=1
899 rm -fr -- ${initdir}/*
902 # Verify bash version, current minimum is 3.1
903 if (( BASH_VERSINFO
[0] < 4 )); then
904 dfatal
'You need at least Bash 4 to use dracut, sorry.'
908 dracutfunctions
=$dracutbasedir/dracut-functions.sh
909 export dracutfunctions
911 if (( ${#drivers_l[@]} )); then
913 while pop drivers_l val
; do
917 drivers
=${drivers/-/_}
919 if (( ${#add_drivers_l[@]} )); then
920 while pop add_drivers_l val
; do
921 add_drivers
+=" $val "
924 add_drivers
=${add_drivers/-/_}
926 if (( ${#force_drivers_l[@]} )); then
927 while pop force_drivers_l val
; do
928 force_drivers
+=" $val "
931 force_drivers
=${force_drivers/-/_}
933 if (( ${#omit_drivers_l[@]} )); then
934 while pop omit_drivers_l val
; do
935 omit_drivers
+=" $val "
938 omit_drivers
=${omit_drivers/-/_}
940 if (( ${#kernel_cmdline_l[@]} )); then
941 while pop kernel_cmdline_l val
; do
942 kernel_cmdline
+=" $val "
946 omit_drivers_corrected
=""
947 for d
in $omit_drivers; do
948 [[ " $drivers $add_drivers " == *\
$d\
* ]] && continue
949 [[ " $drivers $force_drivers " == *\
$d\
* ]] && continue
950 omit_drivers_corrected
+="$d|"
952 omit_drivers
="${omit_drivers_corrected%|}"
953 unset omit_drivers_corrected
955 # prepare args for logging
956 for ((i
=0; i
< ${#dracut_args[@]}; i
++)); do
957 [[ "${dracut_args[$i]}" == *\
* ]] && \
958 dracut_args
[$i]="\"${dracut_args[$i]}\""
962 dinfo
"Executing: $0 ${dracut_args[@]}"
964 [[ $do_list = yes ]] && {
965 for mod
in $dracutbasedir/modules.d
/*; do
966 [[ -d $mod ]] ||
continue;
967 [[ -e $mod/install ||
-e $mod/installkernel || \
968 -e $mod/module-setup.sh
]] ||
continue
969 printf "%s\n" "${mod##*/??}"
974 # This is kinda legacy -- eventually it should go away.
975 case $dracutmodules in
976 ""|auto
) dracutmodules
="all" ;;
979 abs_outfile
=$
(readlink
-f "$outfile") && outfile
="$abs_outfile"
981 if [[ -d $srcmods ]]; then
982 [[ -f $srcmods/modules.dep
]] ||
{
983 dwarn
"$srcmods/modules.dep is missing. Did you run depmod?"
987 if [[ ! $print_cmdline ]]; then
988 if [[ -f $outfile && ! $force ]]; then
989 dfatal
"Will not override existing initramfs ($outfile) without --force"
994 [[ $outdir ]] || outdir
="/"
996 if [[ ! -d "$outdir" ]]; then
997 dfatal
"Can't write to $outdir: Directory $outdir does not exist or is not accessible."
999 elif [[ ! -w "$outdir" ]]; then
1000 dfatal
"No permission to write to $outdir."
1002 elif [[ -f "$outfile" && ! -w "$outfile" ]]; then
1003 dfatal
"No permission to write $outfile."
1007 if [[ $loginstall ]]; then
1008 if ! mkdir
-p "$loginstall"; then
1009 dfatal
"Could not create directory to log installed files to '$loginstall'."
1012 loginstall
=$
(readlink
-f "$loginstall")
1016 if [[ $acpi_override = yes ]] && ! check_kernel_config CONFIG_ACPI_INITRD_TABLE_OVERRIDE
; then
1017 dwarn
"Disabling ACPI override, because kernel does not support it. CONFIG_ACPI_INITRD_TABLE_OVERRIDE!=y"
1021 if [[ $early_microcode = yes ]]; then
1022 if [[ $hostonly ]]; then
1023 [[ $
(get_cpu_vendor
) == "AMD" ]] \
1024 && ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
1025 && unset early_microcode
1026 [[ $
(get_cpu_vendor
) == "Intel" ]] \
1027 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
1028 && unset early_microcode
1030 ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
1031 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
1032 && unset early_microcode
1034 [[ $early_microcode != yes ]] \
1035 && dwarn
"Disabling early microcode, because kernel does not support it. CONFIG_MICROCODE_[AMD|INTEL]_EARLY!=y"
1038 # Need to be able to have non-root users read stuff (rpcbind etc)
1039 chmod 755 "$initdir"
1041 if [[ $hostonly ]]; then
1042 for i
in /sys
/proc
/run
/dev
; do
1043 if ! findmnt
--target "$i" &>/dev
/null
; then
1044 dwarning
"Turning off host-only mode: '$i' is not mounted!"
1050 declare -A host_fs_types
1052 for line
in "${fstab_lines[@]}"; do
1056 host_fs_types
["$1"]="$3"
1059 for f
in $add_fstab; do
1060 [[ -e $f ]] ||
continue
1061 while read dev rest
; do
1062 push host_devs
"$dev"
1066 for dev
in $add_device; do
1067 push host_devs
"$dev"
1070 if (( ${#add_device_l[@]} )); then
1071 while pop add_device_l val
; do
1072 add_device
+=" $val "
1073 push host_devs
"$val"
1077 if [[ $hostonly ]]; then
1078 # in hostonly mode, determine all devices, which have to be accessed
1079 # and examine them for filesystem types
1097 mp
=$
(readlink
-f "$mp")
1098 mountpoint
"$mp" >/dev
/null
2>&1 ||
continue
1099 _dev
=$
(find_block_device
"$mp")
1100 _bdev
=$
(readlink
-f "/dev/block/$_dev")
1101 [[ -b $_bdev ]] && _dev
=$_bdev
1102 push host_devs
$_dev
1103 [[ "$mp" == "/" ]] && root_dev
="$_dev"
1104 push host_devs
"$_dev"
1107 if [[ -f /proc
/swaps
]] && [[ -f /etc
/fstab
]]; then
1108 while read dev
type rest
; do
1109 [[ -b $dev ]] ||
continue
1110 [[ "$type" == "partition" ]] ||
continue
1112 while read _d _m _t _o _r
; do
1113 [[ "$_d" == \
#* ]] && continue
1114 [[ $_d ]] ||
continue
1115 [[ $_t != "swap" ]] && continue
1116 [[ $_m != "swap" ]] && [[ $_m != "none" ]] && continue
1117 [[ "$_o" == *noauto
* ]] && continue
1118 _d
=$
(expand_persistent_dev
"$_d")
1119 [[ "$_d" -ef "$dev" ]] ||
continue
1121 if [[ -f /etc
/crypttab
]]; then
1122 while read _mapper _a _p _o
; do
1123 [[ $_mapper = \
#* ]] && continue
1124 [[ "$_d" -ef /dev
/mapper
/"$_mapper" ]] ||
continue
1125 [[ "$_o" ]] || _o
="$_p"
1126 # skip entries with password files
1127 [[ "$_p" == /* ]] && [[ -f $_p ]] && continue 2
1129 [[ $_o == *swap
* ]] && continue 2
1130 done < /etc
/crypttab
1133 push host_devs
"$(readlink -f "$dev")"
1138 # record all host modaliases
1139 declare -A host_modalias
1140 find /sys
/devices
/ -name uevent
-print > "$initdir/.modalias"
1143 [[ "$line" != MODALIAS\
=* ]] && continue
1144 modalias
="${line##MODALIAS=}" && [[ $modalias ]] && host_modalias
["$modalias"]=1
1147 done < "$initdir/.modalias"
1149 rm -f -- "$initdir/.modalias"
1151 while read _k _s _v
; do
1152 [ "$_k" != "name" -a "$_k" != "driver" ] && continue
1153 host_modalias
["$_v"]=1
1156 # check /proc/modules
1157 declare -A host_modules
1158 while read m rest
; do
1159 host_modules
["$m"]=1
1168 if [[ -b /dev
/block
/$1 ]]; then
1169 ID_FS_TYPE
=$
(get_fs_env
"/dev/block/$1") && host_fs_types
["$(readlink -f "/dev
/block
/$1")"]="$ID_FS_TYPE"
1172 if [[ -b $1 ]]; then
1173 ID_FS_TYPE
=$
(get_fs_env
"$1") && host_fs_types
["$(readlink -f "$1")"]="$ID_FS_TYPE"
1176 if fstype
=$
(find_dev_fstype
"$1"); then
1177 host_fs_types
["$1"]="$fstype"
1183 for dev
in ${host_devs[@]}; do
1185 check_block_and_slaves_all _get_fs_type
"$(get_maj_min "$dev")"
1188 for dev
in "${!host_fs_types[@]}"; do
1189 [[ ${host_fs_types[$dev]} = "reiserfs" ]] ||
[[ ${host_fs_types[$dev]} = "xfs" ]] ||
continue
1190 rootopts
=$
(find_dev_fsopts
"$dev")
1191 if [[ ${host_fs_types[$dev]} = "reiserfs" ]]; then
1192 journaldev
=$
(fs_get_option
$rootopts "jdev")
1193 elif [[ ${host_fs_types[$dev]} = "xfs" ]]; then
1194 journaldev
=$
(fs_get_option
$rootopts "logdev")
1196 if [[ $journaldev ]]; then
1197 dev
="$(readlink -f "$dev")"
1198 push host_devs
"$dev"
1200 check_block_and_slaves_all _get_fs_type
"$(get_maj_min "$dev")"
1205 || udevdir
="$(pkg-config udev --variable=udevdir 2>/dev/null)"
1206 if ! [[ -d "$udevdir" ]]; then
1207 [[ -d /lib
/udev
]] && udevdir
=/lib
/udev
1208 [[ -d /usr
/lib
/udev
]] && udevdir
=/usr
/lib
/udev
1211 [[ -d $systemdutildir ]] \
1212 || systemdutildir
=$
(pkg-config systemd
--variable=systemdutildir
2>/dev
/null
)
1214 if ! [[ -d "$systemdutildir" ]]; then
1215 [[ -d /lib
/systemd
]] && systemdutildir
=/lib
/systemd
1216 [[ -d /usr
/lib
/systemd
]] && systemdutildir
=/usr
/lib
/systemd
1219 [[ -d $systemdsystemunitdir ]] \
1220 || systemdsystemunitdir
=$
(pkg-config systemd
--variable=systemdsystemunitdir
2>/dev
/null
)
1222 [[ -d "$systemdsystemunitdir" ]] || systemdsystemunitdir
=${systemdutildir}/system
1224 [[ -d $systemdsystemconfdir ]] \
1225 || systemdsystemconfdir
=$
(pkg-config systemd
--variable=systemdsystemconfdir
2>/dev
/null
)
1227 [[ -d "$systemdsystemconfdir" ]] || systemdsystemconfdir
=/etc
/systemd
/system
1229 [[ -d $tmpfilesdir ]] \
1230 || tmpfilesdir
=$
(pkg-config systemd
--variable=tmpfilesdir
2>/dev
/null
)
1232 if ! [[ -d "$tmpfilesdir" ]]; then
1233 [[ -f /lib
/tmpfiles.d
]] && tmpfilesdir
=/lib
/tmpfiles.d
1234 [[ -f /usr
/lib
/tmpfiles.d
]] && tmpfilesdir
=/usr
/lib
/tmpfiles.d
1237 export initdir dracutbasedir \
1238 dracutmodules force_add_dracutmodules add_dracutmodules omit_dracutmodules \
1240 fw_dir drivers_dir debug no_kernel kernel_only \
1241 omit_drivers mdadmconf lvmconf root_dev \
1242 use_fstab fstab_lines libdirs fscks nofscks ro_mnt \
1243 stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
1244 debug host_fs_types host_devs sshkey add_fstab \
1245 DRACUT_VERSION udevdir prefix filesystems drivers \
1246 systemdutildir systemdsystemunitdir systemdsystemconfdir \
1247 host_modalias host_modules hostonly_cmdline loginstall \
1251 # check all our modules to see if they should be sourced.
1252 # This builds a list of modules that we will install next.
1253 for_each_module_dir check_module
1254 for_each_module_dir check_mount
1256 dracut_module_included
"fips" && export DRACUT_FIPS_MODE
=1
1258 if [[ $print_cmdline ]]; then
1260 # source our modules.
1261 for moddir
in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1262 _d_mod
=${moddir##*/}; _d_mod
=${_d_mod#[0-9][0-9]}
1263 module_cmdline
"$_d_mod"
1270 # Create some directory structure first
1271 [[ $prefix ]] && mkdir
-m 0755 -p "${initdir}${prefix}"
1273 [[ -h /lib
]] || mkdir
-m 0755 -p "${initdir}${prefix}/lib"
1274 [[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib"
1276 if [[ $prefix ]]; then
1277 for d
in bin etc lib sbin tmp usr var
$libdirs; do
1278 [[ "$d" == */* ]] && continue
1279 ln -sfn "${prefix#/}/${d#/}" "$initdir/$d"
1283 if [[ $kernel_only != yes ]]; then
1284 for d
in usr
/bin usr
/sbin bin etc lib sbin tmp usr var
$libdirs; do
1285 [[ -e "${initdir}${prefix}/$d" ]] && continue
1286 if [ -L "/$d" ]; then
1287 inst_symlink
"/$d" "${prefix}/$d"
1289 mkdir
-m 0755 -p "${initdir}${prefix}/$d"
1293 for d
in dev proc sys sysroot root run
; do
1294 if [ -L "/$d" ]; then
1297 mkdir
-m 0755 -p "$initdir/$d"
1301 ln -sfn ..
/run
"$initdir/var/run"
1302 ln -sfn ..
/run
/lock
"$initdir/var/lock"
1303 ln -sfn ..
/run
/log
"$initdir/var/log"
1305 for d
in lib
"$libdir"; do
1306 [[ -e "${initdir}${prefix}/$d" ]] && continue
1307 if [ -h "/$d" ]; then
1308 inst
"/$d" "${prefix}/$d"
1310 mkdir
-m 0755 -p "${initdir}${prefix}/$d"
1315 if [[ $kernel_only != yes ]]; then
1316 mkdir
-p "${initdir}/etc/cmdline.d"
1317 for _d
in $hookdirs; do
1318 mkdir
-m 0755 -p ${initdir}/lib
/dracut
/hooks
/$_d
1320 if [[ "$UID" = "0" ]]; then
1321 [ -c ${initdir}/dev
/null
] || mknod
${initdir}/dev
/null c
1 3
1322 [ -c ${initdir}/dev
/kmsg
] || mknod
${initdir}/dev
/kmsg c
1 11
1323 [ -c ${initdir}/dev
/console
] || mknod
${initdir}/dev
/console c
5 1
1327 _isize
=0 #initramfs size
1329 # source our modules.
1330 for moddir
in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1331 _d_mod
=${moddir##*/}; _d_mod
=${_d_mod#[0-9][0-9]}
1332 if [[ "$mods_to_load" == *\
$_d_mod\
* ]]; then
1333 if [[ $show_modules = yes ]]; then
1334 printf "%s\n" "$_d_mod"
1336 dinfo
"*** Including module: $_d_mod ***"
1338 if [[ $kernel_only == yes ]]; then
1339 module_installkernel
"$_d_mod" ||
{
1340 dfatal
"installkernel failed in module $_d_mod"
1344 module_install
"$_d_mod"
1345 if [[ $no_kernel != yes ]]; then
1346 module_installkernel
"$_d_mod" ||
{
1347 dfatal
"installkernel failed in module $_d_mod"
1352 mods_to_load
=${mods_to_load// $_d_mod /}
1353 modules_loaded
+="$_d_mod "
1355 #print the module install size
1356 if [ -n "$printsize" ]; then
1357 _isize_new
=$
(du
-sk ${initdir}|cut
-f1)
1358 _isize_delta
=$
((_isize_new
- _isize
))
1359 printf "%s\n" "$_d_mod install size: ${_isize_delta}k"
1366 for i
in $modules_loaded; do
1367 mkdir
-p $initdir/lib
/dracut
1368 printf "%s\n" "$i" >> $initdir/lib
/dracut
/modules.txt
1371 dinfo
"*** Including modules done ***"
1373 ## final stuff that has to happen
1374 if [[ $no_kernel != yes ]]; then
1376 if [[ $drivers ]]; then
1377 hostonly
='' instmods
$drivers
1380 if [[ $add_drivers ]]; then
1381 hostonly
='' instmods
-c $add_drivers
1383 if [[ $force_drivers ]]; then
1384 hostonly
='' instmods
-c $force_drivers
1385 rm -f $initdir/etc
/cmdline.d
/20-force_driver.conf
1386 for mod
in $force_drivers; do
1387 echo "rd.driver.pre=$mod" >>$initdir/etc
/cmdline.d
/20-force_drivers.conf
1390 if [[ $filesystems ]]; then
1391 hostonly
='' instmods
-c $filesystems
1394 dinfo
"*** Installing kernel module dependencies and firmware ***"
1396 dinfo
"*** Installing kernel module dependencies and firmware done ***"
1398 if [[ $noimageifnotneeded == yes ]] && [[ $hostonly ]]; then
1399 if [[ ! -f "$initdir/lib/dracut/need-initqueue" ]] && \
1400 [[ -f ${initdir}/lib
/modules
/$kernel/modules.dep
&& ! -s ${initdir}/lib
/modules
/$kernel/modules.dep
]]; then
1401 for i
in ${initdir}/etc
/cmdline.d
/*.conf
; do
1402 # We need no initramfs image and do not generate one.
1403 [[ $i == "${initdir}/etc/cmdline.d/*.conf" ]] && exit 0
1409 if [[ $kernel_only != yes ]]; then
1410 (( ${#install_items[@]} > 0 )) && inst_multiple
${install_items[@]}
1411 (( ${#install_optional_items[@]} > 0 )) && inst_multiple
-o ${install_optional_items[@]}
1413 [[ $kernel_cmdline ]] && printf "%s\n" "$kernel_cmdline" >> "${initdir}/etc/cmdline.d/01-default.conf"
1415 while pop fstab_lines line
; do
1417 [ -z "${line[3]}" ] && line
[3]="defaults"
1418 [ -z "${line[4]}" ] && line
[4]="0"
1419 [ -z "${line[5]}" ] && line
[5]="2"
1420 echo "${line[@]}" >> "${initdir}/etc/fstab"
1423 for f
in $add_fstab; do
1424 cat "$f" >> "${initdir}/etc/fstab"
1427 if [ -d ${initdir}/$systemdutildir ]; then
1428 mkdir
-p ${initdir}/etc
/conf.d
1430 printf "%s\n" "systemdutildir=\"$systemdutildir\""
1431 printf "%s\n" "systemdsystemunitdir=\"$systemdsystemunitdir\""
1432 printf "%s\n" "systemdsystemconfdir=\"$systemdsystemconfdir\""
1433 } > ${initdir}/etc
/conf.d
/systemd.conf
1436 if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then
1437 dinfo
"*** Resolving executable dependencies ***"
1438 find "$initdir" -type f \
1439 '(' -perm -0100 -or -perm -0010 -or -perm -0001 ')' \
1440 -not -path '*.ko' -print0 \
1441 |
xargs -r -0 $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R ${DRACUT_FIPS_MODE:+-H} --
1442 dinfo
"*** Resolving executable dependencies done***"
1445 # libpthread workaround: pthread_cancel wants to dlopen libgcc_s.so
1446 for _dir
in $libdirs; do
1447 for _f
in "$_dir/libpthread.so"*; do
1448 [[ -e "$_f" ]] ||
continue
1449 inst_libdir_file
"libgcc_s.so*"
1455 while pop include_src src
&& pop include_target tgt
; do
1456 if [[ $src && $tgt ]]; then
1457 if [[ -f $src ]]; then
1460 ddebug
"Including directory: $src"
1461 mkdir
-p "${initdir}/${tgt}"
1462 # check for preexisting symlinks, so we can cope with the
1463 # symlinks to $prefix
1464 for i
in "$src"/*; do
1465 [[ -e "$i" ||
-h "$i" ]] ||
continue
1466 s
=${initdir}/${tgt}/${i#$src/}
1467 if [[ -d "$i" ]]; then
1468 if ! [[ -e "$s" ]]; then
1469 mkdir
-m 0755 -p "$s"
1470 chmod --reference="$i" "$s"
1472 cp --reflink=auto
--sparse=auto
-fa -t "$s" "$i"/*
1474 cp --reflink=auto
--sparse=auto
-fa -t "$s" "$i"
1481 if [[ $kernel_only != yes ]]; then
1482 # make sure that library links are correct and up to date
1483 for f
in /etc
/ld.so.conf
/etc
/ld.so.conf.d
/*; do
1484 [[ -f $f ]] && inst_simple
"$f"
1486 if ! ldconfig
-r "$initdir"; then
1487 if [[ $UID = 0 ]]; then
1488 derror
"ldconfig exited ungracefully"
1490 derror
"ldconfig might need uid=0 (root) for chroot()"
1495 PRELINK_BIN
="$(command -v prelink)"
1496 if [[ $UID = 0 ]] && [[ $PRELINK_BIN ]]; then
1497 if [[ $DRACUT_FIPS_MODE ]]; then
1498 dinfo
"*** Installing prelink files ***"
1499 inst_multiple
-o prelink
/etc
/prelink.conf
/etc
/prelink.conf.d
/*.conf
/etc
/prelink.cache
1500 elif [[ $do_prelink == yes ]]; then
1501 dinfo
"*** Pre-linking files ***"
1502 inst_multiple
-o prelink
/etc
/prelink.conf
/etc
/prelink.conf.d
/*.conf
1503 chroot
"$initdir" "$PRELINK_BIN" -a
1504 rm -f -- "$initdir/$PRELINK_BIN"
1505 rm -fr -- "$initdir"/etc
/prelink.
*
1506 dinfo
"*** Pre-linking files done ***"
1510 if [[ $do_hardlink = yes ]] && command -v hardlink
>/dev
/null
; then
1511 dinfo
"*** Hardlinking files ***"
1512 hardlink
"$initdir" 2>&1
1513 dinfo
"*** Hardlinking files done ***"
1517 if [[ $do_strip = yes ]] ; then
1518 for p
in strip
xargs find; do
1519 if ! type -P $p >/dev
/null
; then
1520 dinfo
"Could not find '$p'. Not stripping the initramfs."
1526 if [[ $do_strip = yes ]] && ! [[ $DRACUT_FIPS_MODE ]]; then
1527 dinfo
"*** Stripping files ***"
1528 find "$initdir" -type f \
1529 -executable -not -path '*/lib/modules/*.ko' -print0 \
1530 |
xargs -r -0 strip
-g 2>/dev
/null
1532 # strip kernel modules, but do not touch signed modules
1533 find "$initdir" -type f
-path '*/lib/modules/*.ko' -print0 \
1534 |
while read -r -d $
'\0' f
; do
1535 SIG
=$
(tail -c 28 "$f")
1536 [[ $SIG == '~Module signature appended~' ]] ||
{ printf "%s\000" "$f"; }
1537 done |
xargs -r -0 strip
-g
1539 dinfo
"*** Stripping files done ***"
1541 if [[ $early_microcode = yes ]]; then
1542 dinfo
"*** Generating early-microcode cpio image ***"
1543 ucode_dir
=(amd-ucode intel-ucode
)
1544 ucode_dest
=(AuthenticAMD.bin GenuineIntel.bin
)
1545 _dest_dir
="$early_cpio_dir/d/kernel/x86/microcode"
1548 if [[ $hostonly ]]; then
1549 [[ $
(get_cpu_vendor
) == "AMD" ]] && _dest_idx
="0"
1550 [[ $
(get_cpu_vendor
) == "Intel" ]] && _dest_idx
="1"
1552 for idx
in $_dest_idx; do
1553 _fw
=${ucode_dir[$idx]}
1554 for _fwdir
in $fw_dir; do
1555 if [[ -d $_fwdir && -d $_fwdir/$_fw ]]; then
1557 dinfo
"*** Constructing ${ucode_dest[$idx]} ****"
1558 if [[ $hostonly ]]; then
1559 _src
=$
(get_ucode_file
)
1560 if ! [[ -r $_fwdir/$_fw/$_src ]];then
1564 cat $_fwdir/$_fw/$_src > $_dest_dir/${ucode_dest[$idx]}
1565 create_early_cpio
="yes"
1571 if [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]]; then
1572 dinfo
"*** Packaging ACPI tables to override BIOS provided ones ***"
1573 _dest_dir
="$early_cpio_dir/d/kernel/firmware/acpi"
1575 for table
in $acpi_table_dir/*.aml
; do
1576 dinfo
" Adding ACPI table: $table"
1577 cp -a $table $_dest_dir
1578 create_early_cpio
="yes"
1582 dinfo
"*** Store current command line parameters ***"
1583 if ! ( echo $PARMS_TO_STORE > $initdir/lib
/dracut
/build-parameter.txt
); then
1584 dfatal
"Could not store the current command line parameters"
1589 dinfo
"*** Creating image file ***"
1591 if [[ $DRACUT_REPRODUCIBLE ]]; then
1592 find "$initdir" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1593 |
xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1595 [[ "$(cpio --help)" == *--reproducible* ]] && CPIO_REPRODUCIBLE
=1
1598 [[ "$UID" != 0 ]] && cpio_owner_root
="-R 0:0"
1600 if [[ $create_early_cpio = yes ]]; then
1601 echo 1 > "$early_cpio_dir/d/early_cpio"
1603 if [[ $DRACUT_REPRODUCIBLE ]]; then
1604 find "$early_cpio_dir/d" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1605 |
xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1608 # The microcode blob is _before_ the initramfs blob, not after
1610 cd "$early_cpio_dir/d"
1611 find .
-print0 |
sort -z \
1612 |
cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc
-o --quiet > $outfile
1617 umask 077; cd "$initdir"
1618 find .
-print0 |
sort -z \
1619 |
cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc
-o --quiet \
1620 |
$compress >> "$outfile"
1622 dfatal
"dracut: creation of $outfile failed"
1625 dinfo
"*** Creating image file done ***"
1627 if (( maxloglvl
>= 5 )); then
1628 if [[ $allowlocal ]]; then
1629 "$dracutbasedir/lsinitrd.sh" "$outfile"| ddebug
1631 lsinitrd
"$outfile"| ddebug