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-2010 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 -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 -a, --add [LIST] Add a space-separated list of dracut modules.
77 -d, --drivers [LIST] Specify a space-separated list of kernel modules to
78 exclusively include in the initramfs.
79 --add-drivers [LIST] Specify a space-separated list of kernel
80 modules to add to the initramfs.
81 --omit-drivers [LIST] Specify a space-separated list of kernel
82 modules not to add to the initramfs.
83 --filesystems [LIST] Specify a space-separated list of kernel filesystem
84 modules to exclusively include in the generic
86 -k, --kmoddir [DIR] Specify the directory, where to look for kernel
88 --fwdir [DIR] Specify additional directories, where to look for
89 firmwares, separated by :
90 --kernel-only Only install kernel drivers and firmware files
91 --no-kernel Do not install kernel drivers and firmware files
92 --kernel-cmdline [PARAMETERS] Specify default kernel command line parameters
93 --strip Strip binaries in the initramfs (default)
94 --nostrip Do not strip binaries in the initramfs
95 --hardlink Hardlink files in the initramfs (default)
96 --nohardlink Do not hardlink files in the initramfs
97 --prefix [DIR] Prefix initramfs files with [DIR]
98 --noprefix Do not prefix initramfs files (default)
99 --mdadmconf Include local /etc/mdadm.conf
100 --nomdadmconf Do not include local /etc/mdadm.conf
101 --lvmconf Include local /etc/lvm/lvm.conf
102 --nolvmconf Do not include local /etc/lvm/lvm.conf
103 --fscks [LIST] Add a space-separated list of fsck helpers.
104 --nofscks Inhibit installation of any fsck helpers.
105 --ro-mnt Mount / and /usr read-only by default.
106 -h, --help This message
107 --debug Output debug information of the build process
108 --profile Output profile information of the build process
109 -L, --stdlog [0-6] Specify logging level (to standard error)
110 0 - suppress any messages
111 1 - only fatal errors
115 5 - debug info (here starts lots of output)
116 6 - trace info (and even more)
117 -v, --verbose Increase verbosity level (default is info(4))
118 -q, --quiet Decrease verbosity level (default is info(4))
119 -c, --conf [FILE] Specify configuration file to use.
120 Default: /etc/dracut.conf
121 --confdir [DIR] Specify configuration directory to use *.conf files
122 from. Default: /etc/dracut.conf.d
123 --tmpdir [DIR] Temporary directory to be used instead of default
125 -l, --local Local mode. Use modules from the current working
126 directory instead of the system-wide installed in
127 /usr/lib/dracut/modules.d.
128 Useful when running dracut from a git checkout.
129 -H, --hostonly Host-Only mode: Install only what is needed for
130 booting the local host instead of a generic host.
131 -N, --no-hostonly Disables Host-Only mode
132 --fstab Use /etc/fstab to determine the root device.
133 --add-fstab [FILE] Add file to the initramfs fstab
134 --mount "[DEV] [MP] [FSTYPE] [FSOPTS]"
135 Mount device [DEV] on mountpoint [MP] with filesystem
136 [FSTYPE] and options [FSOPTS] in the initramfs
137 --device "[DEV]" Bring up [DEV] in initramfs
138 -i, --include [SOURCE] [TARGET]
139 Include the files in the SOURCE directory into the
140 Target directory in the final initramfs.
141 If SOURCE is a file, it will be installed to TARGET
142 in the final initramfs.
143 -I, --install [LIST] Install the space separated list of files into the
145 --gzip Compress the generated initramfs using gzip.
146 This will be done by default, unless another
147 compression option or --no-compress is passed.
148 --bzip2 Compress the generated initramfs using bzip2.
149 Make sure your kernel has bzip2 decompression support
150 compiled in, otherwise you will not be able to boot.
151 --lzma Compress the generated initramfs using lzma.
152 Make sure your kernel has lzma support compiled in,
153 otherwise you will not be able to boot.
154 --xz Compress the generated initramfs using xz.
155 Make sure that your kernel has xz support compiled
156 in, otherwise you will not be able to boot.
157 --compress [COMPRESSION] Compress the generated initramfs with the
158 passed compression program. Make sure your kernel
159 knows how to decompress the generated initramfs,
160 otherwise you will not be able to boot.
161 --no-compress Do not compress the generated initramfs. This will
162 override any other compression options.
163 --list-modules List all available dracut modules.
164 -M, --show-modules Print included module's name to standard output during
166 --keep Keep the temporary initramfs for debugging purposes
167 --printsize Print out the module install size
168 --sshkey [SSHKEY] Add ssh key to initramfs (use with ssh-client module)
170 If [LIST] has multiple arguments, then you have to put these in quotes.
174 # dracut --add-drivers "module1 module2" ...
180 # push values to a stack
181 # $1 = stack variable
184 # push stack 1 2 "3 4"
187 local __stack=$1; shift
189 eval ${__stack}'[${#'${__stack}'[@]}]="$_i"'
194 # pops the last value from a stack
195 # assigns value to second argument variable
196 # or echo to stdout, if no second argument
197 # $1 = stack variable
198 # $2 = optional variable to store the value
203 local __stack=$1; shift
206 # check for empty stack
207 eval '[[ ${#'${__stack}'[@]} -eq 0 ]] && return 1'
209 eval _value='${'${__stack}'[${#'${__stack}'[@]}-1]}'
211 if [[ "$__resultvar" ]]; then
212 eval $__resultvar="'$_value'"
216 eval unset ${__stack}'[${#'${__stack}'[@]}-1]'
220 # Little helper function for reading args from the commandline.
221 # it automatically handles -a b and -a=b variants, and returns 1 if
222 # we need to shift $3.
227 local rematch='^[^=]*=(.*)$'
228 if [[ $2 =~ $rematch ]]; then
229 read "$1" <<< "${BASH_REMATCH[1]}"
232 # There is no way to shift our callers args, so
233 # return 1 to indicate they should do it instead.
242 # Workaround -i, --include taking 2 arguments
243 set -- "${@/--include/++include}"
245 # This prevents any long argument ending with "-i"
246 # -i, like --opt-i but I think we can just prevent that
247 set -- "${@/%-i/++include}"
249 TEMP=$(unset POSIXLY_CORRECT; getopt \
250 -o "a:m:o:d:I:k:c:L:fvqlHhMN" \
254 --long add-drivers: \
255 --long omit-drivers: \
259 --long filesystems: \
279 --long kernel-cmdline: \
304 --long list-modules \
305 --long show-modules \
310 if (( $? != 0 )); then
319 --kver) kernel="$2"; shift;;
320 -a|--add) push add_dracutmodules_l "$2"; shift;;
321 --force-add) push force_add_dracutmodules_l "$2"; shift;;
322 --add-drivers) push add_drivers_l "$2"; shift;;
323 --omit-drivers) push omit_drivers_l "$2"; shift;;
324 -m|--modules) push dracutmodules_l "$2"; shift;;
325 -o|--omit) push omit_dracutmodules_l "$2"; shift;;
326 -d|--drivers) push drivers_l "$2"; shift;;
327 --filesystems) push filesystems_l "$2"; shift;;
328 -I|--install) push install_items_l "$2"; shift;;
329 --fwdir) push fw_dir_l "$2"; shift;;
330 --libdirs) push libdirs_l "$2"; shift;;
331 --fscks) push fscks_l "$2"; shift;;
332 --add-fstab) push add_fstab_l "$2"; shift;;
333 --mount) push fstab_lines "$2"; shift;;
334 --device) push host_devs "$2"; shift;;
335 --kernel-cmdline) push kernel_cmdline_l "$2"; shift;;
336 --nofscks) nofscks_l="yes";;
337 --ro-mnt) ro_mnt_l="yes";;
338 -k|--kmoddir) drivers_dir_l="$2"; shift;;
339 -c|--conf) conffile="$2"; shift;;
340 --confdir) confdir="$2"; shift;;
341 --tmpdir) tmpdir_l="$2"; shift;;
342 -L|--stdlog) stdloglvl_l="$2"; shift;;
343 --compress) compress_l="$2"; shift;;
344 --prefix) prefix_l="$2"; shift;;
345 -f|--force) force=yes;;
346 --kernel-only) kernel_only="yes"; no_kernel="no";;
347 --no-kernel) kernel_only="no"; no_kernel="yes";;
348 --strip) do_strip_l="yes";;
349 --nostrip) do_strip_l="no";;
350 --hardlink) do_hardlink_l="yes";;
351 --nohardlink) do_hardlink_l="no";;
352 --noprefix) prefix_l="/";;
353 --mdadmconf) mdadmconf_l="yes";;
354 --nomdadmconf) mdadmconf_l="no";;
355 --lvmconf) lvmconf_l="yes";;
356 --nolvmconf) lvmconf_l="no";;
357 --debug) debug="yes";;
358 --profile) profile="yes";;
359 --sshkey) sshkey="$2"; shift;;
360 -v|--verbose) ((verbosity_mod_l++));;
361 -q|--quiet) ((verbosity_mod_l--));;
364 [[ -f "$(readlink -f ${0%/*})/dracut-functions.sh" ]] \
365 && dracutbasedir="$(readlink -f ${0%/*})"
367 -H|--hostonly) hostonly_l="yes" ;;
368 -N|--no-hostonly) hostonly_l="no" ;;
369 --fstab) use_fstab_l="yes" ;;
370 -h|--help) long_usage; exit 1 ;;
371 -i|--include) push include_src "$2"
373 --bzip2) compress_l="bzip2";;
374 --lzma) compress_l="lzma";;
375 --xz) compress_l="xz";;
376 --no-compress) _no_compress_l="cat";;
377 --gzip) compress_l="gzip";;
378 --list-modules) do_list="yes";;
383 --printsize) printsize="yes";;
387 *) # should not even reach this point
388 printf "\n!Unknown option: '%s'\n\n" "$1" >&2; usage; exit 1;;
393 # getopt cannot handle multiple arguments, so just handle "-I,--include"
394 # the old fashioned way
398 ++include) push include_src "$2"
399 push include_target "$3"
402 if ! [[ ${outfile+x} ]]; then
404 elif ! [[ ${kernel+x} ]]; then
407 printf "\nUnknown arguments: %s\n\n" "$*" >&2
415 if ! [[ $kernel ]]; then
419 if ! [[ $outfile ]]; then
420 outfile="/boot/initramfs-$kernel.img"
423 for i in /usr/sbin /sbin /usr/bin /bin; do
428 if [[ "$NPATH" != "*:$rl*" ]] ; then
432 export PATH="${NPATH#:}"
434 unset LD_LIBRARY_PATH
437 export DRACUT_LOG_LEVEL=warning
439 export DRACUT_LOG_LEVEL=debug
440 export PS4='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): ';
445 export PS4='+ $(date "+%s.%N") ${BASH_SOURCE}@${LINENO}: ';
450 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
452 # if we were not passed a config file, try the default one
453 if [[ ! -f $conffile ]]; then
454 [[ $allowlocal ]] && conffile="$dracutbasedir/dracut.conf" || \
455 conffile="/etc/dracut.conf"
458 if [[ ! -d $confdir ]]; then
459 [[ $allowlocal ]] && confdir="$dracutbasedir/dracut.conf.d" || \
460 confdir="/etc/dracut.conf.d"
463 # source our config file
464 [[ -f $conffile ]] && . "$conffile"
466 # source our config dir
467 if [[ $confdir && -d $confdir ]]; then
468 for f in "$confdir"/*.conf; do
469 [[ -e $f ]] && . "$f"
473 # these optins add to the stuff in the config file
474 if (( ${#add_dracutmodules_l[@]} )); then
475 while pop add_dracutmodules_l val; do
476 add_dracutmodules+=" $val "
480 if (( ${#force_add_dracutmodules_l[@]} )); then
481 while pop force_add_dracutmodules_l val; do
482 force_add_dracutmodules+=" $val "
486 if (( ${#fscks_l[@]} )); then
487 while pop fscks_l val; do
492 if (( ${#add_fstab_l[@]} )); then
493 while pop add_fstab_l val; do
498 if (( ${#fstab_lines_l[@]} )); then
499 while pop fstab_lines_l val; do
500 push fstab_lines $val
504 if (( ${#install_items_l[@]} )); then
505 while pop install_items_l val; do
506 install_items+=" $val "
510 # these options override the stuff in the config file
511 if (( ${#dracutmodules_l[@]} )); then
513 while pop dracutmodules_l val; do
514 dracutmodules+="$val "
518 if (( ${#omit_dracutmodules_l[@]} )); then
519 omit_dracutmodules=''
520 while pop omit_dracutmodules_l val; do
521 omit_dracutmodules+="$val "
525 if (( ${#filesystems_l[@]} )); then
527 while pop filesystems_l val; do
532 if (( ${#fw_dir_l[@]} )); then
534 while pop fw_dir_l val; do
539 if (( ${#libdirs_l[@]} )); then
541 while pop libdirs_l val; do
546 [[ $stdloglvl_l ]] && stdloglvl=$stdloglvl_l
547 [[ ! $stdloglvl ]] && stdloglvl=4
548 stdloglvl=$((stdloglvl + verbosity_mod_l))
549 ((stdloglvl > 6)) && stdloglvl=6
550 ((stdloglvl < 0)) && stdloglvl=0
552 [[ $drivers_dir_l ]] && drivers_dir=$drivers_dir_l
553 [[ $do_strip_l ]] && do_strip=$do_strip_l
554 [[ $do_strip ]] || do_strip=yes
555 [[ $do_hardlink_l ]] && do_hardlink=$do_hardlink_l
556 [[ $do_hardlink ]] || do_hardlink=yes
557 [[ $prefix_l ]] && prefix=$prefix_l
558 [[ $prefix = "/" ]] && unset prefix
559 [[ $hostonly_l ]] && hostonly=$hostonly_l
560 [[ $use_fstab_l ]] && use_fstab=$use_fstab_l
561 [[ $mdadmconf_l ]] && mdadmconf=$mdadmconf_l
562 [[ $lvmconf_l ]] && lvmconf=$lvmconf_l
563 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
564 [[ $fw_dir ]] || fw_dir="/lib/firmware/updates /lib/firmware"
565 [[ $tmpdir_l ]] && tmpdir="$tmpdir_l"
566 [[ $tmpdir ]] || tmpdir=/var/tmp
567 [[ $compress_l ]] && compress=$compress_l
568 [[ $show_modules_l ]] && show_modules=$show_modules_l
569 [[ $nofscks_l ]] && nofscks="yes"
570 [[ $ro_mnt_l ]] && ro_mnt="yes"
571 # eliminate IFS hackery when messing with fw_dir
572 fw_dir=${fw_dir//:/ }
574 # handle compression options.
575 [[ $compress ]] || compress="gzip"
577 bzip2) compress="bzip2 -9";;
578 lzma) compress="lzma -9";;
579 xz) compress="xz --check=crc32 --lzma2=dict=1MiB";;
580 gzip) command -v pigz > /dev/null 2>&1 && compress="pigz -9" || \
583 if [[ $_no_compress_l = "cat" ]]; then
587 [[ $hostonly = yes ]] && hostonly="-h"
588 [[ $hostonly != "-h" ]] && unset hostonly
590 readonly TMPDIR="$tmpdir"
591 readonly initdir=$(mktemp --tmpdir="$TMPDIR/" -d -t initramfs.XXXXXX)
592 [ -d "$initdir" ] || {
593 echo "dracut: mktemp --tmpdir=\"$TMPDIR/\" -d -t initramfs.XXXXXX failed." >&2
597 export DRACUT_KERNEL_LAZY="1"
598 export DRACUT_RESOLVE_LAZY="1"
600 if [[ -f $dracutbasedir/dracut-functions.sh ]]; then
601 . $dracutbasedir/dracut-functions.sh
603 echo "dracut: Cannot find $dracutbasedir/dracut-functions.sh." >&2
604 echo "dracut: Are you running from a git checkout?" >&2
605 echo "dracut: Try passing -l as an argument to $0" >&2
610 if ! $DRACUT_INSTALL ${initdir+-D "$initdir"} -R "$initdir/bin/sh" &>/dev/null; then
611 unset DRACUT_RESOLVE_LAZY
612 export DRACUT_RESOLVE_DEPS=1
616 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
617 . $dracutbasedir/dracut-version.sh
620 # Verify bash version, current minimum is 3.1
621 if (( ${BASH_VERSINFO[0]} < 3 ||
622 ( ${BASH_VERSINFO[0]} == 3 && ${BASH_VERSINFO[1]} < 1 ) )); then
623 dfatal 'You need at least Bash 3.1 to use dracut, sorry.'
627 dracutfunctions=$dracutbasedir/dracut-functions.sh
628 export dracutfunctions
630 if (( ${#drivers_l[@]} )); then
632 while pop drivers_l val; do
636 drivers=${drivers/-/_}
638 if (( ${#add_drivers_l[@]} )); then
639 while pop add_drivers_l val; do
640 add_drivers+=" $val "
643 add_drivers=${add_drivers/-/_}
645 if (( ${#omit_drivers_l[@]} )); then
646 while pop omit_drivers_l val; do
647 omit_drivers+=" $val "
650 omit_drivers=${omit_drivers/-/_}
652 if (( ${#kernel_cmdline_l[@]} )); then
653 while pop kernel_cmdline_l val; do
654 kernel_cmdline+=" $val "
658 omit_drivers_corrected=""
659 for d in $omit_drivers; do
660 strstr " $drivers $add_drivers " " $d " && continue
661 omit_drivers_corrected+="$d|"
663 omit_drivers="${omit_drivers_corrected%|}"
664 unset omit_drivers_corrected
666 # prepare args for logging
667 for ((i=0; i < ${#dracut_args[@]}; i++)); do
668 strstr "${dracut_args[$i]}" " " && \
669 dracut_args[$i]="\"${dracut_args[$i]}\""
672 ddebug "Executing: $0 ${dracut_args[@]}"
674 [[ $do_list = yes ]] && {
675 for mod in $dracutbasedir/modules.d/*; do
676 [[ -d $mod ]] || continue;
677 [[ -e $mod/install || -e $mod/installkernel || \
678 -e $mod/module-setup.sh ]] || continue
684 # This is kinda legacy -- eventually it should go away.
685 case $dracutmodules in
686 ""|auto) dracutmodules="all" ;;
689 abs_outfile=$(readlink -f "$outfile") && outfile="$abs_outfile"
691 [[ -f $srcmods/modules.dep ]] || {
692 dfatal "$srcmods/modules.dep is missing. Did you run depmod?"
696 if [[ -f $outfile && ! $force ]]; then
697 dfatal "Will not override existing initramfs ($outfile) without --force"
702 [[ $outdir ]] || outdir="/"
704 if [[ ! -d "$outdir" ]]; then
705 dfatal "Can't write $outfile: Directory $outdir does not exist."
707 elif [[ ! -w "$outdir" ]]; then
708 dfatal "No permission to write to $outdir."
710 elif [[ -f "$outfile" && ! -w "$outfile" ]]; then
711 dfatal "No permission to write $outfile."
715 # clean up after ourselves no matter how we die.
716 trap 'ret=$?;[[ $keep ]] && echo "Not removing $initdir." >&2 || rm -rf "$initdir";exit $ret;' EXIT
717 # clean up after ourselves no matter how we die.
718 trap 'exit 1;' SIGINT
720 # Need to be able to have non-root users read stuff (rpcbind etc)
723 for line in "${fstab_lines[@]}"; do
727 push host_fs_types "$1|$3"
730 for f in $add_fstab; do
731 [ -e $f ] || continue
732 while read dev rest; do
737 if [[ $hostonly ]]; then
738 # in hostonly mode, determine all devices, which have to be accessed
739 # and examine them for filesystem types
751 for mp in "${host_mp[@]}"; do
752 mountpoint "$mp" >/dev/null 2>&1 || continue
753 push host_devs $(readlink -f "/dev/block/$(find_block_device "$mp")")
759 if [[ -b $1 ]] && get_fs_env $1; then
760 echo "$(readlink -f $1)|$ID_FS_TYPE"
763 if [[ -b /dev/block/$1 ]] && get_fs_env /dev/block/$1; then
764 echo "$(readlink -f /dev/block/$1)|$ID_FS_TYPE"
767 if fstype=$(find_dev_fstype $1); then
774 for dev in "${host_devs[@]}"; do
776 for fstype in $(_get_fs_type $dev) \
777 $(check_block_and_slaves _get_fs_type $(get_maj_min $dev)); do
778 if ! strstr " ${host_fs_types[*]} " " $fstype ";then
779 push host_fs_types "$fstype"
785 || udevdir=$(pkg-config udev --variable=udevdir 2>/dev/null)
786 if ! [[ -d "$udevdir" ]]; then
787 [[ -d /lib/udev ]] && udevdir=/lib/udev
788 [[ -d /usr/lib/udev ]] && udevdir=/usr/lib/udev
791 [[ -d $systemdutildir ]] \
792 || systemdutildir=$(pkg-config systemd --variable=systemdutildir 2>/dev/null)
793 [[ -d $systemdsystemunitdir ]] \
794 || systemdsystemunitdir=$(pkg-config systemd --variable=systemdsystemunitdir 2>/dev/null)
796 if ! [[ -d "$systemdutildir" ]]; then
797 [[ -d /lib/systemd ]] && systemdutildir=/lib/systemd
798 [[ -d /usr/lib/systemd ]] && systemdutildir=/usr/lib/systemd
800 [[ -d "$systemdsystemunitdir" ]] || systemdsystemunitdir=${systemdutildir}/system
802 export initdir dracutbasedir dracutmodules \
803 fw_dir drivers_dir debug no_kernel kernel_only \
804 omit_drivers mdadmconf lvmconf \
805 use_fstab fstab_lines libdirs fscks nofscks ro_mnt \
806 stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
807 debug host_fs_types host_devs sshkey add_fstab \
808 DRACUT_VERSION udevdir systemdutildir systemdsystemunitdir \
809 prefix filesystems drivers
811 # Create some directory structure first
812 [[ $prefix ]] && mkdir -m 0755 -p "${initdir}${prefix}"
814 [[ -h /lib ]] || mkdir -m 0755 -p "${initdir}${prefix}/lib"
815 [[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib"
817 if [[ $prefix ]]; then
818 for d in bin etc lib sbin tmp usr var $libdirs; do
819 strstr "$d" "/" && continue
820 ln -sfn "${prefix#/}/${d#/}" "$initdir/$d"
824 if [[ $kernel_only != yes ]]; then
825 for d in usr/bin usr/sbin bin etc lib sbin tmp usr var var/log $libdirs; do
826 [[ -e "${initdir}${prefix}/$d" ]] && continue
827 if [ -L "/$d" ]; then
828 inst_symlink "/$d" "${prefix}/$d"
830 mkdir -m 0755 -p "${initdir}${prefix}/$d"
834 for d in dev proc sys sysroot root run run/lock run/initramfs; do
835 if [ -L "/$d" ]; then
838 mkdir -m 0755 -p "$initdir/$d"
842 ln -sfn ../run "$initdir/var/run"
843 ln -sfn ../run/lock "$initdir/var/lock"
845 for d in lib "$libdir"; do
846 [[ -e "${initdir}${prefix}/$d" ]] && continue
847 if [ -h "/$d" ]; then
848 inst "/$d" "${prefix}/$d"
850 mkdir -m 0755 -p "${initdir}${prefix}/$d"
855 if [[ $kernel_only != yes ]]; then
856 mkdir -p "${initdir}/etc/cmdline.d"
857 for _d in $hookdirs; do
858 mkdir -m 0755 -p ${initdir}/lib/dracut/hooks/$_d
860 if [[ "$UID" = "0" ]]; then
861 [ -c ${initdir}/dev/null ] || mknod ${initdir}/dev/null c 1 3
862 [ -c ${initdir}/dev/kmsg ] || mknod ${initdir}/dev/kmsg c 1 11
863 [ -c ${initdir}/dev/console ] || mknod ${initdir}/dev/console c 5 1
868 # check all our modules to see if they should be sourced.
869 # This builds a list of modules that we will install next.
870 for_each_module_dir check_module
871 for_each_module_dir check_mount
873 strstr "$mods_to_load" "fips" && export DRACUT_FIPS_MODE=1
875 _isize=0 #initramfs size
877 # source our modules.
878 for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
879 _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]}
880 if strstr "$mods_to_load" " $_d_mod "; then
881 [[ $show_modules = yes ]] && echo "$_d_mod" || \
882 dinfo "*** Including module: $_d_mod ***"
883 if [[ $kernel_only = yes ]]; then
884 module_installkernel $_d_mod || {
885 dfatal "installkernel failed in module $_d_mod"
889 module_install $_d_mod
890 if [[ $no_kernel != yes ]]; then
891 module_installkernel $_d_mod || {
892 dfatal "installkernel failed in module $_d_mod"
897 mods_to_load=${mods_to_load// $_d_mod /}
898 modules_loaded+="$_d_mod "
900 #print the module install size
901 if [ -n "$printsize" ]; then
902 _isize_new=$(du -sk ${initdir}|cut -f1)
903 _isize_delta=$(($_isize_new - $_isize))
904 echo "$_d_mod install size: ${_isize_delta}k"
911 for i in $modules_loaded; do
912 mkdir -p $initdir/lib/dracut
913 echo "$i" >> $initdir/lib/dracut/modules.txt
916 dinfo "*** Including modules done ***"
918 ## final stuff that has to happen
919 if [[ $no_kernel != yes ]]; then
921 if [[ $drivers ]]; then
922 hostonly='' instmods $drivers
925 if [[ $add_drivers ]]; then
926 hostonly='' instmods -c $add_drivers
928 if [[ $filesystems ]]; then
929 hostonly='' instmods -c $filesystems
932 dinfo "*** Installing kernel module dependencies and firmware ***"
934 dinfo "*** Installing kernel module dependencies and firmware done ***"
937 if [[ $kernel_only != yes ]]; then
938 (( ${#install_items[@]} > 0 )) && dracut_install ${install_items[@]}
940 echo "$kernel_cmdline" >> "${initdir}/etc/cmdline.d/01-default.conf"
942 while pop fstab_lines line; do
943 echo "$line 0 0" >> "${initdir}/etc/fstab"
946 for f in $add_fstab; do
947 cat $f >> "${initdir}/etc/fstab"
950 if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then
951 dinfo "*** Resolving executable dependencies ***"
952 find "$initdir" -type f \
953 '(' -perm -0100 -or -perm -0010 -or -perm -0001 ')' \
954 -not -path '*.ko' -print0 \
955 | xargs -r -0 $DRACUT_INSTALL ${initdir+-D "$initdir"} -R ${DRACUT_FIPS_MODE+-H}
956 dinfo "*** Resolving executable dependencies done***"
960 while pop include_src src && pop include_target tgt; do
961 if [[ $src && $tgt ]]; then
962 if [[ -f $src ]]; then
965 ddebug "Including directory: $src"
966 mkdir -p "${initdir}/${tgt}"
967 # check for preexisting symlinks, so we can cope with the
968 # symlinks to $prefix
969 for i in "$src"/*; do
970 [[ -e "$i" || -h "$i" ]] || continue
971 s=${initdir}/${tgt}/${i#$src/}
972 if [[ -d "$i" ]]; then
973 if ! [[ -e "$s" ]]; then
974 mkdir -m 0755 -p "$s"
975 chmod --reference="$i" "$s"
977 cp --reflink=auto --sparse=auto -fa -t "$s" "$i"/*
979 cp --reflink=auto --sparse=auto -fa -t "$s" "$i"
986 if [[ $kernel_only != yes ]]; then
987 # make sure that library links are correct and up to date
988 for f in /etc/ld.so.conf /etc/ld.so.conf.d/*; do
989 [[ -f $f ]] && inst_simple "$f"
991 if ! ldconfig -r "$initdir"; then
992 if [[ $UID = 0 ]]; then
993 derror "ldconfig exited ungracefully"
995 derror "ldconfig might need uid=0 (root) for chroot()"
1000 if (($maxloglvl >= 5)); then
1001 ddebug "Listing sizes of included files:"
1002 du -c "$initdir" | sort -n | ddebug
1005 PRELINK_BIN=$(command -v prelink)
1006 if [[ $UID = 0 ]] && [[ $PRELINK_BIN ]]; then
1007 if [[ $DRACUT_FIPS_MODE ]]; then
1008 dinfo "*** Pre-unlinking files ***"
1009 dracut_install -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf /etc/prelink.cache
1010 chroot "$initdir" $PRELINK_BIN -u -a
1011 rm -f "$initdir"/$PRELINK_BIN
1012 rm -fr "$initdir"/etc/prelink.*
1013 dinfo "*** Pre-unlinking files done ***"
1015 dinfo "*** Pre-linking files ***"
1016 dracut_install -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf
1017 chroot "$initdir" $PRELINK_BIN -a
1018 rm -f "$initdir"/$PRELINK_BIN
1019 rm -fr "$initdir"/etc/prelink.*
1020 dinfo "*** Pre-linking files done ***"
1024 if [[ $do_hardlink = yes ]] && command -v hardlink >/dev/null; then
1025 dinfo "*** Hardlinking files ***"
1026 hardlink "$initdir" 2>&1
1027 dinfo "*** Hardlinking files done ***"
1031 if [[ $do_strip = yes ]] ; then
1032 for p in strip xargs find; do
1033 if ! type -P $p >/dev/null; then
1034 derror "Could not find '$p'. You should run $0 with '--nostrip'."
1040 if [[ $do_strip = yes ]] ; then
1041 dinfo "*** Stripping files ***"
1042 if [[ $DRACUT_FIPS_MODE ]]; then
1043 find "$initdir" -type f \
1044 '(' -perm -0100 -or -perm -0010 -or -perm -0001 \
1045 -or -path '*/lib/modules/*.ko' ')' -print0 \
1046 | while read -r -d $'\0' f; do
1047 if ! [[ -e "${f%/*}/.${f##*/}.hmac" ]] \
1048 && ! [[ -e "/lib/fipscheck/${f##*/}.hmac" ]] \
1049 && ! [[ -e "/lib64/fipscheck/${f##*/}.hmac" ]]; then
1050 echo -n "$f"; echo -n -e "\000"
1052 done |xargs -r -0 strip -g 2>/dev/null
1054 find "$initdir" -type f \
1055 '(' -perm -0100 -or -perm -0010 -or -perm -0001 \
1056 -or -path '*/lib/modules/*.ko' ')' -print0 \
1057 | xargs -r -0 strip -g 2>/dev/null
1059 dinfo "*** Stripping files done ***"
1063 dinfo "*** Creating image file ***"
1064 if ! ( umask 077; cd "$initdir"; find . |cpio -R 0:0 -H newc -o --quiet| \
1065 $compress > "$outfile"; ); then
1066 dfatal "dracut: creation of $outfile failed"
1069 dinfo "*** Creating image file done ***"
1071 dinfo "Wrote $outfile:"
1072 dinfo "$(ls -l "$outfile")"