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 --strip Strip binaries in the initramfs
93 --nostrip Do not strip binaries in the initramfs (default)
94 --hardlink Hardlink files in the initramfs (default)
95 --nohardlink Do not hardlink files in the initramfs
96 --prefix [DIR] Prefix initramfs files with [DIR]
97 --noprefix Do not prefix initramfs files (default)
98 --mdadmconf Include local /etc/mdadm.conf
99 --nomdadmconf Do not include local /etc/mdadm.conf
100 --lvmconf Include local /etc/lvm/lvm.conf
101 --nolvmconf Do not include local /etc/lvm/lvm.conf
102 --fscks [LIST] Add a space-separated list of fsck helpers.
103 --nofscks Inhibit installation of any fsck helpers.
104 --ro-mnt Mount / and /usr read-only by default.
105 -h, --help This message
106 --debug Output debug information of the build process
107 --profile Output profile information of the build process
108 -L, --stdlog [0-6] Specify logging level (to standard error)
109 0 - suppress any messages
110 1 - only fatal errors
114 5 - debug info (here starts lots of output)
115 6 - trace info (and even more)
116 -v, --verbose Increase verbosity level (default is info(4))
117 -q, --quiet Decrease verbosity level (default is info(4))
118 -c, --conf [FILE] Specify configuration file to use.
119 Default: /etc/dracut.conf
120 --confdir [DIR] Specify configuration directory to use *.conf files
121 from. Default: /etc/dracut.conf.d
122 --tmpdir [DIR] Temporary directory to be used instead of default
124 -l, --local Local mode. Use modules from the current working
125 directory instead of the system-wide installed in
126 /usr/lib/dracut/modules.d.
127 Useful when running dracut from a git checkout.
128 -H, --hostonly Host-Only mode: Install only what is needed for
129 booting the local host instead of a generic host.
130 -N, --no-hostonly Disables Host-Only mode
131 --fstab Use /etc/fstab to determine the root device.
132 --add-fstab [FILE] Add file to the initramfs fstab
133 --mount "[DEV] [MP] [FSTYPE] [FSOPTS]"
134 Mount device [DEV] on mountpoint [MP] with filesystem
135 [FSTYPE] and options [FSOPTS] in the initramfs
136 -i, --include [SOURCE] [TARGET]
137 Include the files in the SOURCE directory into the
138 Target directory in the final initramfs.
139 If SOURCE is a file, it will be installed to TARGET
140 in the final initramfs.
141 -I, --install [LIST] Install the space separated list of files into the
143 --gzip Compress the generated initramfs using gzip.
144 This will be done by default, unless another
145 compression option or --no-compress is passed.
146 --bzip2 Compress the generated initramfs using bzip2.
147 Make sure your kernel has bzip2 decompression support
148 compiled in, otherwise you will not be able to boot.
149 --lzma Compress the generated initramfs using lzma.
150 Make sure your kernel has lzma support compiled in,
151 otherwise you will not be able to boot.
152 --xz Compress the generated initramfs using xz.
153 Make sure that your kernel has xz support compiled
154 in, otherwise you will not be able to boot.
155 --compress [COMPRESSION] Compress the generated initramfs with the
156 passed compression program. Make sure your kernel
157 knows how to decompress the generated initramfs,
158 otherwise you will not be able to boot.
159 --no-compress Do not compress the generated initramfs. This will
160 override any other compression options.
161 --list-modules List all available dracut modules.
162 -M, --show-modules Print included module's name to standard output during
164 --keep Keep the temporary initramfs for debugging purposes
165 --printsize Print out the module install size
166 --sshkey [SSHKEY] Add ssh key to initramfs (use with ssh-client module)
168 If [LIST] has multiple arguments, then you have to put these in quotes.
172 # dracut --add-drivers "module1 module2" ...
178 # push values to a stack
179 # $1 = stack variable
182 # push stack 1 2 "3 4"
185 local __stack=$1; shift
187 eval ${__stack}'[${#'${__stack}'[@]}]="$_i"'
192 # pops the last value from a stack
193 # assigns value to second argument variable
194 # or echo to stdout, if no second argument
195 # $1 = stack variable
196 # $2 = optional variable to store the value
201 local __stack=$1; shift
204 # check for empty stack
205 eval '[[ ${#'${__stack}'[@]} -eq 0 ]] && return 1'
207 eval _value='${'${__stack}'[${#'${__stack}'[@]}-1]}'
209 if [[ "$__resultvar" ]]; then
210 eval $__resultvar="'$_value'"
214 eval unset ${__stack}'[${#'${__stack}'[@]}-1]'
218 # Little helper function for reading args from the commandline.
219 # it automatically handles -a b and -a=b variants, and returns 1 if
220 # we need to shift $3.
225 local rematch='^[^=]*=(.*)$'
226 if [[ $2 =~ $rematch ]]; then
227 read "$1" <<< "${BASH_REMATCH[1]}"
230 # There is no way to shift our callers args, so
231 # return 1 to indicate they should do it instead.
240 # Workaround -i, --include taking 2 arguments
241 set -- "${@/--include/++include}"
243 # This prevents any long argument ending with "-i"
244 # -i, like --opt-i but I think we can just prevent that
245 set -- "${@/%-i/++include}"
247 TEMP=$(unset POSIXLY_CORRECT; getopt \
248 -o "a:m:o:d:I:k:c:L:fvqlHhMN" \
252 --long add-drivers: \
253 --long omit-drivers: \
257 --long filesystems: \
300 --long list-modules \
301 --long show-modules \
306 if (( $? != 0 )); then
315 --kver) kernel="$2"; shift;;
316 -a|--add) push add_dracutmodules_l "$2"; shift;;
317 --force-add) push force_add_dracutmodules_l "$2"; shift;;
318 --add-drivers) push add_drivers_l "$2"; shift;;
319 --omit-drivers) push omit_drivers_l "$2"; shift;;
320 -m|--modules) push dracutmodules_l "$2"; shift;;
321 -o|--omit) push omit_dracutmodules_l "$2"; shift;;
322 -d|--drivers) push drivers_l "$2"; shift;;
323 --filesystems) push filesystems_l "$2"; shift;;
324 -I|--install) push install_items_l "$2"; shift;;
325 --fwdir) push fw_dir_l "$2"; shift;;
326 --libdirs) push libdirs_l "$2"; shift;;
327 --fscks) push fscks_l "$2"; shift;;
328 --add-fstab) push add_fstab_l "$2"; shift;;
329 --mount) push fstab_lines "$2"; shift;;
330 --nofscks) nofscks_l="yes";;
331 --ro-mnt) ro_mnt_l="yes";;
332 -k|--kmoddir) drivers_dir_l="$2"; shift;;
333 -c|--conf) conffile="$2"; shift;;
334 --confdir) confdir="$2"; shift;;
335 --tmpdir) tmpdir_l="$2"; shift;;
336 -L|--stdlog) stdloglvl_l="$2"; shift;;
337 --compress) compress_l="$2"; shift;;
338 --prefix) prefix_l="$2"; shift;;
339 -f|--force) force=yes;;
340 --kernel-only) kernel_only="yes"; no_kernel="no";;
341 --no-kernel) kernel_only="no"; no_kernel="yes";;
342 --strip) do_strip_l="yes";;
343 --nostrip) do_strip_l="no";;
344 --hardlink) do_hardlink_l="yes";;
345 --nohardlink) do_hardlink_l="no";;
346 --noprefix) prefix_l="/";;
347 --mdadmconf) mdadmconf_l="yes";;
348 --nomdadmconf) mdadmconf_l="no";;
349 --lvmconf) lvmconf_l="yes";;
350 --nolvmconf) lvmconf_l="no";;
351 --debug) debug="yes";;
352 --profile) profile="yes";;
353 --sshkey) sshkey="$2"; shift;;
354 -v|--verbose) ((verbosity_mod_l++));;
355 -q|--quiet) ((verbosity_mod_l--));;
358 [[ -f "$(readlink -f ${0%/*})/dracut-functions.sh" ]] \
359 && dracutbasedir="$(readlink -f ${0%/*})"
361 -H|--hostonly) hostonly_l="yes" ;;
362 -N|--no-hostonly) hostonly_l="no" ;;
363 --fstab) use_fstab_l="yes" ;;
364 -h|--help) long_usage; exit 1 ;;
365 -i|--include) push include_src "$2"
367 --bzip2) compress_l="bzip2";;
368 --lzma) compress_l="lzma";;
369 --xz) compress_l="xz";;
370 --no-compress) _no_compress_l="cat";;
371 --gzip) compress_l="gzip";;
372 --list-modules) do_list="yes";;
377 --printsize) printsize="yes";;
381 *) # should not even reach this point
382 printf "\n!Unknown option: '%s'\n\n" "$1" >&2; usage; exit 1;;
387 # getopt cannot handle multiple arguments, so just handle "-I,--include"
388 # the old fashioned way
392 ++include) push include_src "$2"
393 push include_target "$3"
396 if ! [[ ${outfile+x} ]]; then
398 elif ! [[ ${kernel+x} ]]; then
401 printf "\nUnknown arguments: %s\n\n" "$*" >&2
409 if ! [[ $kernel ]]; then
413 if ! [[ $outfile ]]; then
414 outfile="/boot/initramfs-$kernel.img"
417 for i in /usr/sbin /sbin /usr/bin /bin; do
422 if [[ "$NPATH" != "*:$rl*" ]] ; then
426 export PATH="${NPATH#:}"
428 unset LD_LIBRARY_PATH
431 export DRACUT_LOG_LEVEL=warning
433 export DRACUT_LOG_LEVEL=debug
434 export PS4='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): ';
439 export PS4='+ $(date "+%s.%N") ${BASH_SOURCE}@${LINENO}: ';
444 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
446 # if we were not passed a config file, try the default one
447 if [[ ! -f $conffile ]]; then
448 [[ $allowlocal ]] && conffile="$dracutbasedir/dracut.conf" || \
449 conffile="/etc/dracut.conf"
452 if [[ ! -d $confdir ]]; then
453 [[ $allowlocal ]] && confdir="$dracutbasedir/dracut.conf.d" || \
454 confdir="/etc/dracut.conf.d"
457 # source our config file
458 [[ -f $conffile ]] && . "$conffile"
460 # source our config dir
461 if [[ $confdir && -d $confdir ]]; then
462 for f in "$confdir"/*.conf; do
463 [[ -e $f ]] && . "$f"
467 # these optins add to the stuff in the config file
468 if (( ${#add_dracutmodules_l[@]} )); then
469 while pop add_dracutmodules_l val; do
470 add_dracutmodules+=" $val "
474 if (( ${#force_add_dracutmodules_l[@]} )); then
475 while pop force_add_dracutmodules_l val; do
476 force_add_dracutmodules+=" $val "
480 if (( ${#fscks_l[@]} )); then
481 while pop fscks_l val; do
486 if (( ${#add_fstab_l[@]} )); then
487 while pop add_fstab_l val; do
492 if (( ${#fstab_lines_l[@]} )); then
493 while pop fstab_lines_l val; do
494 push fstab_lines $val
498 if (( ${#install_items_l[@]} )); then
499 while pop install_items_l val; do
500 install_items+=" $val "
504 # these options override the stuff in the config file
505 if (( ${#dracutmodules_l[@]} )); then
507 while pop dracutmodules_l val; do
508 dracutmodules+="$val "
512 if (( ${#omit_dracutmodules_l[@]} )); then
513 omit_dracutmodules=''
514 while pop omit_dracutmodules_l val; do
515 omit_dracutmodules+="$val "
519 if (( ${#filesystems_l[@]} )); then
521 while pop filesystems_l val; do
526 if (( ${#fw_dir_l[@]} )); then
528 while pop fw_dir_l val; do
533 if (( ${#libdirs_l[@]} )); then
535 while pop libdirs_l val; do
540 [[ $stdloglvl_l ]] && stdloglvl=$stdloglvl_l
541 [[ ! $stdloglvl ]] && stdloglvl=4
542 stdloglvl=$((stdloglvl + verbosity_mod_l))
543 ((stdloglvl > 6)) && stdloglvl=6
544 ((stdloglvl < 0)) && stdloglvl=0
546 [[ $drivers_dir_l ]] && drivers_dir=$drivers_dir_l
547 [[ $do_strip_l ]] && do_strip=$do_strip_l
548 [[ $do_strip ]] || do_strip=no
549 [[ $do_hardlink_l ]] && do_hardlink=$do_hardlink_l
550 [[ $do_hardlink ]] || do_hardlink=yes
551 [[ $prefix_l ]] && prefix=$prefix_l
552 [[ $prefix = "/" ]] && unset prefix
553 [[ $hostonly_l ]] && hostonly=$hostonly_l
554 [[ $use_fstab_l ]] && use_fstab=$use_fstab_l
555 [[ $mdadmconf_l ]] && mdadmconf=$mdadmconf_l
556 [[ $lvmconf_l ]] && lvmconf=$lvmconf_l
557 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
558 [[ $fw_dir ]] || fw_dir="/lib/firmware/updates /lib/firmware"
559 [[ $tmpdir_l ]] && tmpdir="$tmpdir_l"
560 [[ $tmpdir ]] || tmpdir=/var/tmp
561 [[ $compress_l ]] && compress=$compress_l
562 [[ $show_modules_l ]] && show_modules=$show_modules_l
563 [[ $nofscks_l ]] && nofscks="yes"
564 [[ $ro_mnt_l ]] && ro_mnt="yes"
565 # eliminate IFS hackery when messing with fw_dir
566 fw_dir=${fw_dir//:/ }
568 # handle compression options.
569 [[ $compress ]] || compress="gzip"
571 bzip2) compress="bzip2 -9";;
572 lzma) compress="lzma -9";;
573 xz) compress="xz --check=crc32 --lzma2=dict=1MiB";;
574 gzip) command -v pigz > /dev/null 2>&1 && compress="pigz -9" || \
577 if [[ $_no_compress_l = "cat" ]]; then
581 [[ $hostonly = yes ]] && hostonly="-h"
582 [[ $hostonly != "-h" ]] && unset hostonly
584 readonly TMPDIR="$tmpdir"
585 readonly initdir=$(mktemp --tmpdir="$TMPDIR/" -d -t initramfs.XXXXXX)
586 [ -d "$initdir" ] || {
587 echo "dracut: mktemp --tmpdir=\"$TMPDIR/\" -d -t initramfs.XXXXXX failed." >&2
591 export DRACUT_KERNEL_LAZY="1"
592 export DRACUT_RESOLVE_LAZY="1"
594 if [[ -f $dracutbasedir/dracut-functions.sh ]]; then
595 . $dracutbasedir/dracut-functions.sh
597 echo "dracut: Cannot find $dracutbasedir/dracut-functions.sh." >&2
598 echo "dracut: Are you running from a git checkout?" >&2
599 echo "dracut: Try passing -l as an argument to $0" >&2
603 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
604 . $dracutbasedir/dracut-version.sh
607 # Verify bash version, curret minimum is 3.1
608 if (( ${BASH_VERSINFO[0]} < 3 ||
609 ( ${BASH_VERSINFO[0]} == 3 && ${BASH_VERSINFO[1]} < 1 ) )); then
610 dfatal 'You need at least Bash 3.1 to use dracut, sorry.'
614 dracutfunctions=$dracutbasedir/dracut-functions.sh
615 export dracutfunctions
617 if (( ${#drivers_l[@]} )); then
619 while pop drivers_l val; do
623 drivers=${drivers/-/_}
625 if (( ${#add_drivers_l[@]} )); then
626 while pop add_drivers_l val; do
627 add_drivers+=" $val "
630 add_drivers=${add_drivers/-/_}
632 if (( ${#omit_drivers_l[@]} )); then
633 while pop omit_drivers_l val; do
634 omit_drivers+=" $val "
637 omit_drivers=${omit_drivers/-/_}
639 omit_drivers_corrected=""
640 for d in $omit_drivers; do
641 strstr " $drivers $add_drivers " " $d " && continue
642 omit_drivers_corrected+="$d|"
644 omit_drivers="${omit_drivers_corrected%|}"
645 unset omit_drivers_corrected
647 # prepare args for logging
648 for ((i=0; i < ${#dracut_args[@]}; i++)); do
649 strstr "${dracut_args[$i]}" " " && \
650 dracut_args[$i]="\"${dracut_args[$i]}\""
653 ddebug "Executing: $0 ${dracut_args[@]}"
655 [[ $do_list = yes ]] && {
656 for mod in $dracutbasedir/modules.d/*; do
657 [[ -d $mod ]] || continue;
658 [[ -e $mod/install || -e $mod/installkernel || \
659 -e $mod/module-setup.sh ]] || continue
665 # This is kinda legacy -- eventually it should go away.
666 case $dracutmodules in
667 ""|auto) dracutmodules="all" ;;
670 abs_outfile=$(readlink -f "$outfile") && outfile="$abs_outfile"
672 [[ -f $srcmods/modules.dep ]] || {
673 dfatal "$srcmods/modules.dep is missing. Did you run depmod?"
677 if [[ -f $outfile && ! $force ]]; then
678 dfatal "Will not override existing initramfs ($outfile) without --force"
683 [[ $outdir ]] || outdir="/"
685 if [[ ! -d "$outdir" ]]; then
686 dfatal "Can't write $outfile: Directory $outdir does not exist."
688 elif [[ ! -w "$outdir" ]]; then
689 dfatal "No permission to write to $outdir."
691 elif [[ -f "$outfile" && ! -w "$outfile" ]]; then
692 dfatal "No permission to write $outfile."
696 # clean up after ourselves no matter how we die.
697 trap 'ret=$?;[[ $keep ]] && echo "Not removing $initdir." >&2 || rm -rf "$initdir";exit $ret;' EXIT
698 # clean up after ourselves no matter how we die.
699 trap 'exit 1;' SIGINT
701 # Need to be able to have non-root users read stuff (rpcbind etc)
704 for line in "${fstab_lines[@]}"; do
708 push host_fs_types "$1|$3"
711 for f in $add_fstab; do
712 [ -e $f ] || continue
713 while read dev rest; do
718 if [[ $hostonly ]]; then
719 # in hostonly mode, determine all devices, which have to be accessed
720 # and examine them for filesystem types
732 for mp in "${host_mp[@]}"; do
733 mountpoint "$mp" >/dev/null 2>&1 || continue
734 push host_devs $(readlink -f "/dev/block/$(find_block_device "$mp")")
740 if [[ -b $1 ]] && get_fs_env $1; then
741 echo "$(readlink -f $1)|$ID_FS_TYPE"
744 if [[ -b /dev/block/$1 ]] && get_fs_env /dev/block/$1; then
745 echo "$(readlink -f /dev/block/$1)|$ID_FS_TYPE"
748 if fstype=$(find_dev_fstype $1); then
755 for dev in "${host_devs[@]}"; do
757 for fstype in $(_get_fs_type $dev) \
758 $(check_block_and_slaves _get_fs_type $(get_maj_min $dev)); do
759 if ! strstr " ${host_fs_types[*]} " " $fstype ";then
760 push host_fs_types "$fstype"
766 || udevdir=$(pkg-config udev --variable=udevdir 2>/dev/null)
767 if ! [[ -d "$udevdir" ]]; then
768 [[ -d /lib/udev ]] && udevdir=/lib/udev
769 [[ -d /usr/lib/udev ]] && udevdir=/usr/lib/udev
772 [[ -d $systemdutildir ]] \
773 || systemdutildir=$(pkg-config systemd --variable=systemdutildir 2>/dev/null)
774 [[ -d $systemdsystemunitdir ]] \
775 || systemdsystemunitdir=$(pkg-config systemd --variable=systemdsystemunitdir 2>/dev/null)
777 if ! [[ -d "$systemdutildir" ]]; then
778 [[ -d /lib/systemd ]] && systemdutildir=/lib/systemd
779 [[ -d /usr/lib/systemd ]] && systemdutildir=/usr/lib/systemd
781 [[ -d "$systemdsystemunitdir" ]] || systemdsystemunitdir=${systemdutildir}/system
783 export initdir dracutbasedir dracutmodules \
784 fw_dir drivers_dir debug no_kernel kernel_only \
785 omit_drivers mdadmconf lvmconf \
786 use_fstab fstab_lines libdirs fscks nofscks ro_mnt \
787 stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
788 debug host_fs_types host_devs sshkey add_fstab \
789 DRACUT_VERSION udevdir systemdutildir systemdsystemunitdir \
790 prefix filesystems drivers
792 # Create some directory structure first
793 [[ $prefix ]] && mkdir -m 0755 -p "${initdir}${prefix}"
795 [[ -h /lib ]] || mkdir -m 0755 -p "${initdir}${prefix}/lib"
796 [[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib"
798 if [[ $prefix ]]; then
799 for d in bin etc lib sbin tmp usr var $libdirs; do
800 strstr "$d" "/" && continue
801 ln -sfn "${prefix#/}/${d#/}" "$initdir/$d"
805 if [[ $kernel_only != yes ]]; then
806 for d in usr/bin usr/sbin bin etc lib sbin tmp usr var var/log var/run var/lock $libdirs; do
807 [[ -e "${initdir}${prefix}/$d" ]] && continue
808 if [ -L "/$d" ]; then
809 inst_symlink "/$d" "${prefix}/$d"
811 mkdir -m 0755 -p "${initdir}${prefix}/$d"
815 for d in dev proc sys sysroot root run run/lock run/initramfs; do
816 if [ -L "/$d" ]; then
819 mkdir -m 0755 -p "$initdir/$d"
823 ln -sfn /run "$initdir/var/run"
824 ln -sfn /run/lock "$initdir/var/lock"
826 for d in lib "$libdir"; do
827 [[ -e "${initdir}${prefix}/$d" ]] && continue
828 if [ -h "/$d" ]; then
829 inst "/$d" "${prefix}/$d"
831 mkdir -m 0755 -p "${initdir}${prefix}/$d"
836 if [[ $kernel_only != yes ]]; then
837 mkdir -p "${initdir}/etc/cmdline.d"
838 for _d in $hookdirs; do
839 mkdir -m 0755 -p ${initdir}/lib/dracut/hooks/$_d
841 if [[ "$UID" = "0" ]]; then
842 [ -c ${initdir}/dev/null ] || mknod ${initdir}/dev/null c 1 3
843 [ -c ${initdir}/dev/kmsg ] || mknod ${initdir}/dev/kmsg c 1 11
844 [ -c ${initdir}/dev/console ] || mknod ${initdir}/dev/console c 5 1
849 # check all our modules to see if they should be sourced.
850 # This builds a list of modules that we will install next.
851 for_each_module_dir check_module
852 for_each_module_dir check_mount
854 strstr "$mods_to_load" "fips" && export DRACUT_FIPS_MODE=1
856 _isize=0 #initramfs size
858 # source our modules.
859 for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
860 _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]}
861 if strstr "$mods_to_load" " $_d_mod "; then
862 [[ $show_modules = yes ]] && echo "$_d_mod" || \
863 dinfo "*** Including module: $_d_mod ***"
864 if [[ $kernel_only = yes ]]; then
865 module_installkernel $_d_mod || {
866 dfatal "installkernel failed in module $_d_mod"
870 module_install $_d_mod
871 if [[ $no_kernel != yes ]]; then
872 module_installkernel $_d_mod || {
873 dfatal "installkernel failed in module $_d_mod"
878 mods_to_load=${mods_to_load// $_d_mod /}
879 modules_loaded+="$_d_mod "
881 #print the module install size
882 if [ -n "$printsize" ]; then
883 _isize_new=$(du -sk ${initdir}|cut -f1)
884 _isize_delta=$(($_isize_new - $_isize))
885 echo "$_d_mod install size: ${_isize_delta}k"
892 for i in $modules_loaded; do
893 mkdir -p $initdir/lib/dracut
894 echo "$i" >> $initdir/lib/dracut/modules.txt
897 dinfo "*** Including modules done ***"
899 ## final stuff that has to happen
900 if [[ $no_kernel != yes ]]; then
902 if [[ $drivers ]]; then
903 hostonly='' instmods $drivers
906 if [[ $add_drivers ]]; then
907 hostonly='' instmods -c $add_drivers
909 if [[ $filesystems ]]; then
910 hostonly='' instmods -c $filesystems
913 dinfo "*** Installing kernel module dependencies and firmware ***"
915 dinfo "*** Installing kernel module dependencies and firmware done ***"
918 if [[ $kernel_only != yes ]]; then
919 (( ${#install_items[@]} > 0 )) && dracut_install ${install_items[@]}
921 while pop fstab_lines line; do
922 echo "$line 0 0" >> "${initdir}/etc/fstab"
925 for f in $add_fstab; do
926 cat $f >> "${initdir}/etc/fstab"
929 if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then
930 dinfo "*** Resolving executable dependencies ***"
931 find "$initdir" -type f \
932 '(' -perm -0100 -or -perm -0010 -or -perm -0001 ')' \
933 -not -path '*.ko' -print0 \
934 | xargs -r -0 $DRACUT_INSTALL ${initdir+-D "$initdir"} -R ${DRACUT_FIPS_MODE+-H}
935 dinfo "*** Resolving executable dependencies done***"
939 while pop include_src src && pop include_target tgt; do
940 if [[ $src && $tgt ]]; then
941 if [[ -f $src ]]; then
944 ddebug "Including directory: $src"
945 mkdir -p "${initdir}/${tgt}"
946 # check for preexisting symlinks, so we can cope with the
947 # symlinks to $prefix
948 for i in "$src"/*; do
949 [[ -e "$i" || -h "$i" ]] || continue
950 s=${initdir}/${tgt}/${i#$src/}
951 if [[ -d "$i" ]]; then
952 if ! [[ -e "$s" ]]; then
953 mkdir -m 0755 -p "$s"
954 chmod --reference="$i" "$s"
956 cp --reflink=auto --sparse=auto -fa -t "$s" "$i"/*
958 cp --reflink=auto --sparse=auto -fa -t "$s" "$i"
965 if [[ $kernel_only != yes ]]; then
966 # make sure that library links are correct and up to date
967 for f in /etc/ld.so.conf /etc/ld.so.conf.d/*; do
968 [[ -f $f ]] && inst_simple "$f"
970 if ! ldconfig -r "$initdir"; then
971 if [[ $UID = 0 ]]; then
972 derror "ldconfig exited ungracefully"
974 derror "ldconfig might need uid=0 (root) for chroot()"
979 if (($maxloglvl >= 5)); then
980 ddebug "Listing sizes of included files:"
981 du -c "$initdir" | sort -n | ddebug
985 if [[ $do_strip = yes ]] ; then
986 for p in strip xargs find; do
987 if ! type -P $p >/dev/null; then
988 derror "Could not find '$p'. You should run $0 with '--nostrip'."
994 if strstr "$modules_loaded" " fips " && command -v prelink >/dev/null; then
995 dinfo "*** pre-unlinking files ***"
996 for dir in "$initdir/bin" \
999 "$initdir/usr/sbin"; do
1000 [[ -L "$dir" ]] && continue
1001 for i in "$dir"/*; do
1002 [[ -L $i ]] && continue
1003 [[ -x $i ]] && prelink -u $i &>/dev/null
1006 dinfo "*** pre-unlinking files done ***"
1009 if [[ $do_strip = yes ]] ; then
1010 dinfo "*** Stripping files ***"
1011 find "$initdir" -type f \
1012 '(' -perm -0100 -or -perm -0010 -or -perm -0001 \
1013 -or -path '*/lib/modules/*.ko' ')' -print0 \
1014 | xargs -r -0 strip -g 2>/dev/null
1015 dinfo "*** Stripping files done ***"
1018 if [[ $do_hardlink = yes ]] ; then
1019 type hardlink &>/dev/null && {
1020 dinfo "*** hardlinking files ***"
1021 hardlink "$initdir" 2>&1
1022 dinfo "*** hardlinking files done ***"
1026 dinfo "*** Creating image file ***"
1027 if ! ( cd "$initdir"; find . |cpio -R 0:0 -H newc -o --quiet| \
1028 $compress > "$outfile"; ); then
1029 dfatal "dracut: creation of $outfile failed"
1032 dinfo "*** Creating image file done ***"
1034 dinfo "Wrote $outfile:"
1035 dinfo "$(ls -l "$outfile")"