dracut: do not enable early microcode inclusion by default
[platform/upstream/dracut.git] / dracut.sh
1 #!/bin/bash
2 # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
3 # ex: ts=8 sw=4 sts=4 et filetype=sh
4 #
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
8 #
9
10 # Copyright 2005-2013 Red Hat, Inc.  All rights reserved.
11 #
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.
16 #
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.
21 #
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/>.
24 #
25
26 # store for logging
27 dracut_args=( "$@" )
28
29 set -o pipefail
30
31 usage() {
32     [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
33     if [[ -f $dracutbasedir/dracut-version.sh ]]; then
34         . $dracutbasedir/dracut-version.sh
35     fi
36
37 #                                                       80x25 linebreak here ^
38     cat << EOF
39 Usage: $0 [OPTION]... [<initramfs> [<kernel-version>]]
40
41 Version: $DRACUT_VERSION
42
43 Creates initial ramdisk images for preloading modules
44
45   -h, --help  Display all options
46
47 If a [LIST] has multiple arguments, then you have to put these in quotes.
48
49 For example:
50
51     # dracut --add-drivers "module1 module2"  ...
52
53 EOF
54 }
55
56 long_usage() {
57     [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
58     if [[ -f $dracutbasedir/dracut-version.sh ]]; then
59         . $dracutbasedir/dracut-version.sh
60     fi
61
62 #                                                       80x25 linebreak here ^
63     cat << EOF
64 Usage: $0 [OPTION]... [<initramfs> [<kernel-version>]]
65
66 Version: $DRACUT_VERSION
67
68 Creates initial ramdisk images for preloading modules
69
70   --kver [VERSION]      Set kernel version to [VERSION].
71   -f, --force           Overwrite existing initramfs file.
72   -a, --add [LIST]      Add a space-separated list of dracut modules.
73   -m, --modules [LIST]  Specify a space-separated list of dracut modules to
74                          call when building the initramfs. Modules are located
75                          in /usr/lib/dracut/modules.d.
76   -o, --omit [LIST]     Omit a space-separated list of dracut modules.
77   --force-add [LIST]    Force to add a space-separated list of dracut modules
78                          to the default set of modules, when -H is specified.
79   -d, --drivers [LIST]  Specify a space-separated list of kernel modules to
80                          exclusively include in the initramfs.
81   --add-drivers [LIST]  Specify a space-separated list of kernel
82                          modules to add to the initramfs.
83   --omit-drivers [LIST] Specify a space-separated list of kernel
84                          modules not to add to the initramfs.
85   --filesystems [LIST]  Specify a space-separated list of kernel filesystem
86                          modules to exclusively include in the generic
87                          initramfs.
88   -k, --kmoddir [DIR]   Specify the directory, where to look for kernel
89                          modules
90   --fwdir [DIR]         Specify additional directories, where to look for
91                          firmwares, separated by :
92   --kernel-only         Only install kernel drivers and firmware files
93   --no-kernel           Do not install kernel drivers and firmware files
94   --early-microcode     Combine early microcode with ramdisk
95   --no-early-microcode  Do not combine early microcode with ramdisk
96   --kernel-cmdline [PARAMETERS] Specify default kernel command line parameters
97   --strip               Strip binaries in the initramfs
98   --nostrip             Do not strip binaries in the initramfs
99   --hardlink            Hardlink files in the initramfs
100   --nohardlink          Do not hardlink files in the initramfs
101   --prefix [DIR]        Prefix initramfs files with [DIR]
102   --noprefix            Do not prefix initramfs files
103   --mdadmconf           Include local /etc/mdadm.conf
104   --nomdadmconf         Do not include local /etc/mdadm.conf
105   --lvmconf             Include local /etc/lvm/lvm.conf
106   --nolvmconf           Do not include local /etc/lvm/lvm.conf
107   --fscks [LIST]        Add a space-separated list of fsck helpers.
108   --nofscks             Inhibit installation of any fsck helpers.
109   --ro-mnt              Mount / and /usr read-only by default.
110   -h, --help            This message
111   --debug               Output debug information of the build process
112   --profile             Output profile information of the build process
113   -L, --stdlog [0-6]    Specify logging level (to standard error)
114                          0 - suppress any messages
115                          1 - only fatal errors
116                          2 - all errors
117                          3 - warnings
118                          4 - info
119                          5 - debug info (here starts lots of output)
120                          6 - trace info (and even more)
121   -v, --verbose         Increase verbosity level
122   -q, --quiet           Decrease verbosity level
123   -c, --conf [FILE]     Specify configuration file to use.
124                          Default: /etc/dracut.conf
125   --confdir [DIR]       Specify configuration directory to use *.conf files
126                          from. Default: /etc/dracut.conf.d
127   --tmpdir [DIR]        Temporary directory to be used instead of default
128                          /var/tmp.
129   -l, --local           Local mode. Use modules from the current working
130                          directory instead of the system-wide installed in
131                          /usr/lib/dracut/modules.d.
132                          Useful when running dracut from a git checkout.
133   -H, --hostonly        Host-Only mode: Install only what is needed for
134                          booting the local host instead of a generic host.
135   -N, --no-hostonly     Disables Host-Only mode
136   --fstab               Use /etc/fstab to determine the root device.
137   --add-fstab [FILE]    Add file to the initramfs fstab
138   --mount "[DEV] [MP] [FSTYPE] [FSOPTS]"
139                         Mount device [DEV] on mountpoint [MP] with filesystem
140                         [FSTYPE] and options [FSOPTS] in the initramfs
141   --add-device "[DEV]"  Bring up [DEV] in initramfs
142   -i, --include [SOURCE] [TARGET]
143                         Include the files in the SOURCE directory into the
144                          Target directory in the final initramfs.
145                         If SOURCE is a file, it will be installed to TARGET
146                          in the final initramfs.
147   -I, --install [LIST]  Install the space separated list of files into the
148                          initramfs.
149   --gzip                Compress the generated initramfs using gzip.
150                          This will be done by default, unless another
151                          compression option or --no-compress is passed.
152   --bzip2               Compress the generated initramfs using bzip2.
153                          Make sure your kernel has bzip2 decompression support
154                          compiled in, otherwise you will not be able to boot.
155   --lzma                Compress the generated initramfs using lzma.
156                          Make sure your kernel has lzma support compiled in,
157                          otherwise you will not be able to boot.
158   --xz                  Compress the generated initramfs using xz.
159                          Make sure that your kernel has xz support compiled
160                          in, otherwise you will not be able to boot.
161   --compress [COMPRESSION] Compress the generated initramfs with the
162                          passed compression program.  Make sure your kernel
163                          knows how to decompress the generated initramfs,
164                          otherwise you will not be able to boot.
165   --no-compress         Do not compress the generated initramfs.  This will
166                          override any other compression options.
167   --list-modules        List all available dracut modules.
168   -M, --show-modules    Print included module's name to standard output during
169                          build.
170   --keep                Keep the temporary initramfs for debugging purposes
171   --printsize           Print out the module install size
172   --sshkey [SSHKEY]     Add ssh key to initramfs (use with ssh-client module)
173
174 If [LIST] has multiple arguments, then you have to put these in quotes.
175
176 For example:
177
178     # dracut --add-drivers "module1 module2"  ...
179
180 EOF
181 }
182
183 # function push()
184 # push values to a stack
185 # $1 = stack variable
186 # $2.. values
187 # example:
188 # push stack 1 2 "3 4"
189 push() {
190     local _i
191     local __stack=$1; shift
192     for _i in "$@"; do
193         eval ${__stack}'[${#'${__stack}'[@]}]="$_i"'
194     done
195 }
196
197 # function pop()
198 # pops the last value from a stack
199 # assigns value to second argument variable
200 # or echo to stdout, if no second argument
201 # $1 = stack variable
202 # $2 = optional variable to store the value
203 # example:
204 # pop stack val
205 # val=$(pop stack)
206 pop() {
207     local __stack=$1; shift
208     local __resultvar=$1
209     local _value;
210     # check for empty stack
211     eval '[[ ${#'${__stack}'[@]} -eq 0 ]] && return 1'
212
213     eval _value='${'${__stack}'[${#'${__stack}'[@]}-1]}'
214
215     if [[ "$__resultvar" ]]; then
216         eval $__resultvar="'$_value'"
217     else
218         printf "%s" "$_value"
219     fi
220     eval unset ${__stack}'[${#'${__stack}'[@]}-1]'
221     return 0
222 }
223
224 # Little helper function for reading args from the commandline.
225 # it automatically handles -a b and -a=b variants, and returns 1 if
226 # we need to shift $3.
227 read_arg() {
228     # $1 = arg name
229     # $2 = arg value
230     # $3 = arg parameter
231     local rematch='^[^=]*=(.*)$'
232     if [[ $2 =~ $rematch ]]; then
233         read "$1" <<< "${BASH_REMATCH[1]}"
234     else
235         read "$1" <<< "$3"
236         # There is no way to shift our callers args, so
237         # return 1 to indicate they should do it instead.
238         return 1
239     fi
240 }
241
242 dropindirs_sort()
243 {
244     local suffix=$1; shift
245     local -a files
246     local f d
247
248     readarray -t files < <(
249         for d in "$@"; do
250             for i in "$d/"*"$suffix"; do
251                 if [[ -e "$i" ]]; then
252                     printf "%s\n" "${i##*/}"
253                 fi
254             done
255         done | sort -Vu
256     )
257
258     for f in "${files[@]}"; do
259         for d in "$@"; do
260             if [[ -e "$d/$f" ]]; then
261                 printf "%s\n" "$d/$f"
262                 continue 2
263             fi
264         done
265     done
266 }
267
268 verbosity_mod_l=0
269 unset kernel
270 unset outfile
271
272 # Workaround -i, --include taking 2 arguments
273 set -- "${@/--include/++include}"
274
275 # This prevents any long argument ending with "-i"
276 # -i, like --opt-i but I think we can just prevent that
277 set -- "${@/%-i/++include}"
278
279 TEMP=$(unset POSIXLY_CORRECT; getopt \
280     -o "a:m:o:d:I:k:c:L:fvqlHhMN" \
281     --long kver: \
282     --long add: \
283     --long force-add: \
284     --long add-drivers: \
285     --long omit-drivers: \
286     --long modules: \
287     --long omit: \
288     --long drivers: \
289     --long filesystems: \
290     --long install: \
291     --long fwdir: \
292     --long libdirs: \
293     --long fscks: \
294     --long add-fstab: \
295     --long mount: \
296     --long device: \
297     --long nofscks: \
298     --long ro-mnt \
299     --long kmoddir: \
300     --long conf: \
301     --long confdir: \
302     --long tmpdir: \
303     --long stdlog: \
304     --long compress: \
305     --long prefix: \
306     --long force \
307     --long kernel-only \
308     --long no-kernel \
309     --long kernel-cmdline: \
310     --long strip \
311     --long nostrip \
312     --long hardlink \
313     --long nohardlink \
314     --long noprefix \
315     --long mdadmconf \
316     --long nomdadmconf \
317     --long lvmconf \
318     --long nolvmconf \
319     --long debug \
320     --long profile \
321     --long sshkey: \
322     --long verbose \
323     --long quiet \
324     --long local \
325     --long hostonly \
326     --long host-only \
327     --long no-hostonly \
328     --long no-host-only \
329     --long fstab \
330     --long help \
331     --long bzip2 \
332     --long lzma \
333     --long xz \
334     --long no-compress \
335     --long gzip \
336     --long list-modules \
337     --long show-modules \
338     --long keep \
339     --long printsize \
340     --long regenerate-all \
341     --long noimageifnotneeded \
342     -- "$@")
343
344 if (( $? != 0 )); then
345     usage
346     exit 1
347 fi
348
349 eval set -- "$TEMP"
350
351 while :; do
352     case $1 in
353         --kver)        kernel="$2"; shift;;
354         -a|--add)      push add_dracutmodules_l  "$2"; shift;;
355         --force-add)   push force_add_dracutmodules_l  "$2"; shift;;
356         --add-drivers) push add_drivers_l        "$2"; shift;;
357         --omit-drivers) push omit_drivers_l      "$2"; shift;;
358         -m|--modules)  push dracutmodules_l      "$2"; shift;;
359         -o|--omit)     push omit_dracutmodules_l "$2"; shift;;
360         -d|--drivers)  push drivers_l            "$2"; shift;;
361         --filesystems) push filesystems_l        "$2"; shift;;
362         -I|--install)  push install_items_l      "$2"; shift;;
363         --fwdir)       push fw_dir_l             "$2"; shift;;
364         --libdirs)     push libdirs_l            "$2"; shift;;
365         --fscks)       push fscks_l              "$2"; shift;;
366         --add-fstab)   push add_fstab_l          "$2"; shift;;
367         --mount)       push fstab_lines          "$2"; shift;;
368         --add-device|--device)
369                        push add_device_l         "$2"; shift;;
370         --kernel-cmdline) push kernel_cmdline_l  "$2"; shift;;
371         --nofscks)     nofscks_l="yes";;
372         --ro-mnt)      ro_mnt_l="yes";;
373         -k|--kmoddir)  drivers_dir_l="$2"; shift;;
374         -c|--conf)     conffile="$2"; shift;;
375         --confdir)     confdir="$2"; shift;;
376         --tmpdir)      tmpdir_l="$2"; shift;;
377         -L|--stdlog)   stdloglvl_l="$2"; shift;;
378         --compress)    compress_l="$2"; shift;;
379         --prefix)      prefix_l="$2"; shift;;
380         -f|--force)    force=yes;;
381         --kernel-only) kernel_only="yes"; no_kernel="no";;
382         --no-kernel)   kernel_only="no"; no_kernel="yes";;
383         --early-microcode) early_microcode="yes";;
384         --no-early-microcode) early_microcode="no";;
385         --strip)       do_strip_l="yes";;
386         --nostrip)     do_strip_l="no";;
387         --hardlink)    do_hardlink_l="yes";;
388         --nohardlink)  do_hardlink_l="no";;
389         --noprefix)    prefix_l="/";;
390         --mdadmconf)   mdadmconf_l="yes";;
391         --nomdadmconf) mdadmconf_l="no";;
392         --lvmconf)     lvmconf_l="yes";;
393         --nolvmconf)   lvmconf_l="no";;
394         --debug)       debug="yes";;
395         --profile)     profile="yes";;
396         --sshkey)      sshkey="$2"; shift;;
397         -v|--verbose)  ((verbosity_mod_l++));;
398         -q|--quiet)    ((verbosity_mod_l--));;
399         -l|--local)
400                        allowlocal="yes"
401                        [[ -f "$(readlink -f "${0%/*}")/dracut-functions.sh" ]] \
402                            && dracutbasedir="$(readlink -f "${0%/*}")"
403                        ;;
404         -H|--hostonly|--host-only)
405                        hostonly_l="yes" ;;
406         -N|--no-hostonly|--no-host-only)
407                        hostonly_l="no" ;;
408         --fstab)       use_fstab_l="yes" ;;
409         -h|--help)     long_usage; exit 1 ;;
410         -i|--include)  push include_src "$2"
411                        shift;;
412         --bzip2)       compress_l="bzip2";;
413         --lzma)        compress_l="lzma";;
414         --xz)          compress_l="xz";;
415         --no-compress) _no_compress_l="cat";;
416         --gzip)        compress_l="gzip";;
417         --list-modules) do_list="yes";;
418         -M|--show-modules)
419                        show_modules_l="yes"
420                        ;;
421         --keep)        keep="yes";;
422         --printsize)   printsize="yes";;
423         --regenerate-all) regenerate_all="yes";;
424         --noimageifnotneeded) noimageifnotneeded="yes";;
425
426         --) shift; break;;
427
428         *)  # should not even reach this point
429             printf "\n!Unknown option: '%s'\n\n" "$1" >&2; usage; exit 1;;
430     esac
431     shift
432 done
433
434 # getopt cannot handle multiple arguments, so just handle "-I,--include"
435 # the old fashioned way
436
437 while (($# > 0)); do
438     case ${1%%=*} in
439         ++include) push include_src "$2"
440                        push include_target "$3"
441                        shift 2;;
442         *)
443             if ! [[ ${outfile+x} ]]; then
444                 outfile=$1
445             elif ! [[ ${kernel+x} ]]; then
446                 kernel=$1
447             else
448                 printf "\nUnknown arguments: %s\n\n" "$*" >&2
449                 usage; exit 1;
450             fi
451             ;;
452     esac
453     shift
454 done
455
456 if [[ $regenerate_all == "yes" ]]; then
457     ret=0
458     if [[ $kernel ]]; then
459         printf -- "--regenerate-all cannot be called with a kernel version\n" >&2
460         exit 1
461     fi
462
463     if [[ $outfile ]]; then
464         printf -- "--regenerate-all cannot be called with a image file\n" >&2
465         exit 1
466     fi
467
468     ((len=${#dracut_args[@]}))
469     for ((i=0; i < len; i++)); do
470         [[ ${dracut_args[$i]} == "--regenerate-all" ]] && \
471             unset dracut_args[$i]
472     done
473
474     cd /lib/modules
475     for i in *; do
476         [[ -f $i/modules.builtin ]] || continue
477         dracut --kver="$i" "${dracut_args[@]}"
478         ((ret+=$?))
479     done
480     exit $ret
481 fi
482
483 if ! [[ $kernel ]]; then
484     kernel=$(uname -r)
485 fi
486
487 if ! [[ $outfile ]]; then
488     [[ -f /etc/machine-id ]] && read MACHINE_ID < /etc/machine-id
489
490     if [[ $MACHINE_ID ]] && ( [[ -d /boot/${MACHINE_ID} ]] || [[ -L /boot/${MACHINE_ID} ]] ); then
491         outfile="/boot/${MACHINE_ID}/$kernel/initrd"
492     else
493         outfile="/boot/initramfs-$kernel.img"
494     fi
495 fi
496
497 for i in /usr/sbin /sbin /usr/bin /bin; do
498     rl=$i
499     if [ -L "$i" ]; then
500         rl=$(readlink -f $i)
501     fi
502     if [[ "$NPATH" != "*:$rl*" ]] ; then
503         NPATH+=":$rl"
504     fi
505 done
506 export PATH="${NPATH#:}"
507 unset LC_MESSAGES
508 unset LC_CTYPE
509 export LC_ALL=C
510 export LANG=C
511 unset NPATH
512 unset LD_LIBRARY_PATH
513 unset GREP_OPTIONS
514
515 export DRACUT_LOG_LEVEL=warning
516 [[ $debug ]] && {
517     export DRACUT_LOG_LEVEL=debug
518     export PS4='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): ';
519     set -x
520 }
521
522 [[ $profile ]] && {
523     export PS4='+ $(date "+%s.%N") ${BASH_SOURCE}@${LINENO}: ';
524     set -x
525     debug=yes
526 }
527
528 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
529
530 # if we were not passed a config file, try the default one
531 if [[ ! -f $conffile ]]; then
532     if [[ $allowlocal ]]; then
533         conffile="$dracutbasedir/dracut.conf"
534     else
535         conffile="/etc/dracut.conf"
536     fi
537 fi
538
539 if [[ ! -d $confdir ]]; then
540     if [[ $allowlocal ]]; then
541         confdir="$dracutbasedir/dracut.conf.d"
542     else
543         confdir="/etc/dracut.conf.d"
544     fi
545 fi
546
547 # source our config file
548 [[ -f $conffile ]] && . "$conffile"
549
550 # source our config dir
551 for f in $(dropindirs_sort ".conf" "$confdir" "$dracutbasedir/dracut.conf.d"); do
552     [[ -e $f ]] && . "$f"
553 done
554
555 # these optins add to the stuff in the config file
556 if (( ${#add_dracutmodules_l[@]} )); then
557     while pop add_dracutmodules_l val; do
558         add_dracutmodules+=" $val "
559     done
560 fi
561
562 if (( ${#force_add_dracutmodules_l[@]} )); then
563     while pop force_add_dracutmodules_l val; do
564         force_add_dracutmodules+=" $val "
565     done
566 fi
567
568 if (( ${#fscks_l[@]} )); then
569     while pop fscks_l val; do
570         fscks+=" $val "
571     done
572 fi
573
574 if (( ${#add_fstab_l[@]} )); then
575     while pop add_fstab_l val; do
576         add_fstab+=" $val "
577     done
578 fi
579
580 if (( ${#fstab_lines_l[@]} )); then
581     while pop fstab_lines_l val; do
582         push fstab_lines $val
583     done
584 fi
585
586 if (( ${#install_items_l[@]} )); then
587     while pop install_items_l val; do
588         install_items+=" $val "
589     done
590 fi
591
592 # these options override the stuff in the config file
593 if (( ${#dracutmodules_l[@]} )); then
594     dracutmodules=''
595     while pop dracutmodules_l val; do
596         dracutmodules+="$val "
597     done
598 fi
599
600 if (( ${#omit_dracutmodules_l[@]} )); then
601     omit_dracutmodules=''
602     while pop omit_dracutmodules_l val; do
603         omit_dracutmodules+="$val "
604     done
605 fi
606
607 if (( ${#filesystems_l[@]} )); then
608     filesystems=''
609     while pop filesystems_l val; do
610         filesystems+="$val "
611     done
612 fi
613
614 if (( ${#fw_dir_l[@]} )); then
615     fw_dir=''
616     while pop fw_dir_l val; do
617         fw_dir+="$val "
618     done
619 fi
620
621 if (( ${#libdirs_l[@]} )); then
622     libdirs=''
623     while pop libdirs_l val; do
624         libdirs+="$val "
625     done
626 fi
627
628 [[ $stdloglvl_l ]] && stdloglvl=$stdloglvl_l
629 [[ ! $stdloglvl ]] && stdloglvl=4
630 stdloglvl=$((stdloglvl + verbosity_mod_l))
631 ((stdloglvl > 6)) && stdloglvl=6
632 ((stdloglvl < 0)) && stdloglvl=0
633
634 [[ $drivers_dir_l ]] && drivers_dir=$drivers_dir_l
635 [[ $do_strip_l ]] && do_strip=$do_strip_l
636 [[ $do_strip ]] || do_strip=yes
637 [[ $do_hardlink_l ]] && do_hardlink=$do_hardlink_l
638 [[ $do_hardlink ]] || do_hardlink=yes
639 [[ $prefix_l ]] && prefix=$prefix_l
640 [[ $prefix = "/" ]] && unset prefix
641 [[ $hostonly_l ]] && hostonly=$hostonly_l
642 [[ $use_fstab_l ]] && use_fstab=$use_fstab_l
643 [[ $mdadmconf_l ]] && mdadmconf=$mdadmconf_l
644 [[ $lvmconf_l ]] && lvmconf=$lvmconf_l
645 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
646 [[ $fw_dir ]] || fw_dir="/lib/firmware/updates /lib/firmware"
647 [[ $tmpdir_l ]] && tmpdir="$tmpdir_l"
648 [[ $tmpdir ]] || tmpdir=/var/tmp
649 [[ $compress_l ]] && compress=$compress_l
650 [[ $show_modules_l ]] && show_modules=$show_modules_l
651 [[ $nofscks_l ]] && nofscks="yes"
652 [[ $ro_mnt_l ]] && ro_mnt="yes"
653 # eliminate IFS hackery when messing with fw_dir
654 fw_dir=${fw_dir//:/ }
655
656 # handle compression options.
657 [[ $compress ]] || compress="gzip"
658 case $compress in
659     bzip2) compress="bzip2 -9";;
660     lzma)  compress="lzma -9";;
661     xz)    compress="xz --check=crc32 --lzma2=dict=1MiB";;
662     gzip)  compress="gzip -9"; command -v pigz > /dev/null 2>&1 && compress="pigz -9";;
663 esac
664 if [[ $_no_compress_l = "cat" ]]; then
665     compress="cat"
666 fi
667
668 [[ $hostonly = yes ]] && hostonly="-h"
669 [[ $hostonly != "-h" ]] && unset hostonly
670
671 readonly TMPDIR="$tmpdir"
672 readonly initdir="$(mktemp --tmpdir="$TMPDIR/" -d -t initramfs.XXXXXX)"
673 [ -d "$initdir" ] || {
674     printf "%s\n" "dracut: mktemp --tmpdir=\"$TMPDIR/\" -d -t initramfs.XXXXXX failed." >&2
675     exit 1
676 }
677
678 if [[ $early_microcode = yes ]]; then
679     readonly microcode_dir="$(mktemp --tmpdir="$TMPDIR/" -d -t early_microcode.XXXXXX)"
680     [ -d "$microcode_dir" ] || {
681         printf "%s\n" "dracut: mktemp --tmpdir=\"$TMPDIR/\" -d -t early_microcode.XXXXXX failed." >&2
682         exit 1
683     }
684 fi
685 # clean up after ourselves no matter how we die.
686 trap 'ret=$?;[[ $outfile ]] && [[ -f $outfile.$$ ]] && rm -f -- "$outfile.$$";[[ $keep ]] && echo "Not removing $initdir." >&2 || { [[ $initdir ]] && rm -rf -- "$initdir"; [[ $microcode_dir ]] && rm -Rf -- "$microcode_dir"; exit $ret; };' EXIT
687 # clean up after ourselves no matter how we die.
688 trap 'exit 1;' SIGINT
689
690 export DRACUT_KERNEL_LAZY="1"
691 export DRACUT_RESOLVE_LAZY="1"
692
693 if [[ -f $dracutbasedir/dracut-functions.sh ]]; then
694     . $dracutbasedir/dracut-functions.sh
695 else
696     printf "%s\n" "dracut: Cannot find $dracutbasedir/dracut-functions.sh." >&2
697     printf "%s\n" "dracut: Are you running from a git checkout?" >&2
698     printf "%s\n" "dracut: Try passing -l as an argument to $0" >&2
699     exit 1
700 fi
701
702 inst /bin/sh
703 if ! $DRACUT_INSTALL ${initdir+-D "$initdir"} -R "$initdir/bin/sh" &>/dev/null; then
704     unset DRACUT_RESOLVE_LAZY
705     export DRACUT_RESOLVE_DEPS=1
706 fi
707 rm -fr -- ${initdir}/*
708
709 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
710     . $dracutbasedir/dracut-version.sh
711 fi
712
713 # Verify bash version, current minimum is 3.1
714 if (( BASH_VERSINFO[0] < 4 )); then
715     dfatal 'You need at least Bash 4 to use dracut, sorry.'
716     exit 1
717 fi
718
719 dracutfunctions=$dracutbasedir/dracut-functions.sh
720 export dracutfunctions
721
722 if (( ${#drivers_l[@]} )); then
723     drivers=''
724     while pop drivers_l val; do
725         drivers+="$val "
726     done
727 fi
728 drivers=${drivers/-/_}
729
730 if (( ${#add_drivers_l[@]} )); then
731     while pop add_drivers_l val; do
732         add_drivers+=" $val "
733     done
734 fi
735 add_drivers=${add_drivers/-/_}
736
737 if (( ${#omit_drivers_l[@]} )); then
738     while pop omit_drivers_l val; do
739         omit_drivers+=" $val "
740     done
741 fi
742 omit_drivers=${omit_drivers/-/_}
743
744 if (( ${#kernel_cmdline_l[@]} )); then
745     while pop kernel_cmdline_l val; do
746         kernel_cmdline+=" $val "
747     done
748 fi
749
750 omit_drivers_corrected=""
751 for d in $omit_drivers; do
752     [[ " $drivers $add_drivers " == *\ $d\ * ]] && continue
753     omit_drivers_corrected+="$d|"
754 done
755 omit_drivers="${omit_drivers_corrected%|}"
756 unset omit_drivers_corrected
757
758 # prepare args for logging
759 for ((i=0; i < ${#dracut_args[@]}; i++)); do
760     [[ "${dracut_args[$i]}" == *\ * ]] && \
761         dracut_args[$i]="\"${dracut_args[$i]}\""
762         #" keep vim happy
763 done
764 ddebug "Executing: $0 ${dracut_args[@]}"
765
766 [[ $do_list = yes ]] && {
767     for mod in $dracutbasedir/modules.d/*; do
768         [[ -d $mod ]] || continue;
769         [[ -e $mod/install || -e $mod/installkernel || \
770             -e $mod/module-setup.sh ]] || continue
771         printf "%s\n" "${mod##*/??}"
772     done
773     exit 0
774 }
775
776 # This is kinda legacy -- eventually it should go away.
777 case $dracutmodules in
778     ""|auto) dracutmodules="all" ;;
779 esac
780
781 abs_outfile=$(readlink -f "$outfile") && outfile="$abs_outfile"
782
783 if [[ -d $srcmods ]]; then
784     [[ -f $srcmods/modules.dep ]] || {
785       dwarn "$srcmods/modules.dep is missing. Did you run depmod?"
786     }
787 fi
788
789 if [[ -f $outfile && ! $force ]]; then
790     dfatal "Will not override existing initramfs ($outfile) without --force"
791     exit 1
792 fi
793
794 outdir=${outfile%/*}
795 [[ $outdir ]] || outdir="/"
796
797 if [[ ! -d "$outdir" ]]; then
798     dfatal "Can't write to $outdir: Directory $outdir does not exist or is not accessible."
799     exit 1
800 elif [[ ! -w "$outdir" ]]; then
801     dfatal "No permission to write to $outdir."
802     exit 1
803 elif [[ -f "$outfile" && ! -w "$outfile" ]]; then
804     dfatal "No permission to write $outfile."
805     exit 1
806 fi
807
808 # Need to be able to have non-root users read stuff (rpcbind etc)
809 chmod 755 "$initdir"
810
811 if [[ $hostonly ]]; then
812     for i in /sys /proc /run /dev; do
813         if ! findmnt --target "$i" &>/dev/null; then
814             dwarning "Turning off host-only mode: '$i' is not mounted!"
815             unset hostonly
816         fi
817     done
818     if ! [[ -d /run/udev/data ]]; then
819         dwarning "Turning off host-only mode: udev database not found!"
820         unset hostonly
821     fi
822 fi
823
824 declare -A host_fs_types
825
826 for line in "${fstab_lines[@]}"; do
827     set -- $line
828     #dev mp fs fsopts
829     push host_devs "$1"
830     host_fs_types["$1"]="$3"
831 done
832
833 for f in $add_fstab; do
834     [[ -e $f ]] || continue
835     while read dev rest; do
836         push host_devs "$dev"
837     done < "$f"
838 done
839
840 for dev in $add_device; do
841     push host_devs "$dev"
842 done
843
844 if (( ${#add_device_l[@]} )); then
845     while pop add_device_l val; do
846         add_device+=" $val "
847         push host_devs "$val"
848     done
849 fi
850
851 if [[ $hostonly ]]; then
852     # in hostonly mode, determine all devices, which have to be accessed
853     # and examine them for filesystem types
854
855     for mp in \
856         "/" \
857         "/etc" \
858         "/usr" \
859         "/usr/bin" \
860         "/usr/sbin" \
861         "/usr/lib" \
862         "/usr/lib64" \
863         "/boot";
864     do
865         mountpoint "$mp" >/dev/null 2>&1 || continue
866         _dev="$(readlink -f "/dev/block/$(find_block_device "$mp")")"
867         [[ "$_mp" == "/" ]] && root_dev="$_dev"
868         push host_devs "$_dev"
869     done
870
871     while read dev type rest; do
872         [[ -b $dev ]] || continue
873         [[ "$type" == "partition" ]] || continue
874         while read _d _m _t _o _r; do
875             [[ "$_d" == \#* ]] && continue
876             [[ $_d ]] || continue
877             [[ $_t != "swap" ]] || [[ $_m != "swap" ]] && continue
878             [[ "$_o" == *noauto* ]] && continue
879             [[ "$_d" == UUID\=* ]] && _d="/dev/disk/by-uuid/${_d#UUID=}"
880             [[ "$_d" == LABEL\=* ]] && _d="/dev/disk/by-label/$_d#LABEL=}"
881             [[ "$_d" -ef "$dev" ]] || continue
882
883             while read _mapper _a _p _o; do
884                 [[ $_mapper = \#* ]] && continue
885                 [[ "$_d" -ef /dev/mapper/"$_mapper" ]] || continue
886                 [[ "$_o" ]] || _o="$_p"
887                 # skip mkswap swap
888                 [[ $_o == *swap* ]] && continue 2
889             done < /etc/crypttab
890
891             push host_devs "$(readlink -f "$dev")"
892             break
893         done < /etc/fstab
894     done < /proc/swaps
895 fi
896
897 _get_fs_type() { (
898     [[ $1 ]] || return
899     if [[ -b /dev/block/$1 ]] && ID_FS_TYPE=$(get_fs_env "/dev/block/$1"); then
900         printf "%s\n" "$(readlink -f "/dev/block/$1")" "$ID_FS_TYPE"
901         return 1
902     fi
903     if [[ -b $1 ]] && ID_FS_TYPE=$(get_fs_env "$1"); then
904         printf "%s\n" "$(readlink -f "$1")" "$ID_FS_TYPE"
905         return 1
906     fi
907     if fstype=$(find_dev_fstype "$1"); then
908         printf "%s\n" "$1" "$fstype"
909         return 1
910     fi
911     return 1
912 ) }
913
914 for dev in "${host_devs[@]}"; do
915     while read key; do
916         read val
917         host_fs_types["$key"]="$val"
918     done < <(
919         _get_fs_type "$dev"
920         check_block_and_slaves_all _get_fs_type "$(get_maj_min "$dev")"
921     )
922 done
923
924 [[ -d $udevdir ]] \
925     || udevdir="$(pkg-config udev --variable=udevdir 2>/dev/null)"
926 if ! [[ -d "$udevdir" ]]; then
927     [[ -d /lib/udev ]] && udevdir=/lib/udev
928     [[ -d /usr/lib/udev ]] && udevdir=/usr/lib/udev
929 fi
930
931 [[ -d $systemdutildir ]] \
932     || systemdutildir=$(pkg-config systemd --variable=systemdutildir 2>/dev/null)
933
934 if ! [[ -d "$systemdutildir" ]]; then
935     [[ -d /lib/systemd ]] && systemdutildir=/lib/systemd
936     [[ -d /usr/lib/systemd ]] && systemdutildir=/usr/lib/systemd
937 fi
938
939 [[ -d $systemdsystemunitdir ]] \
940     || systemdsystemunitdir=$(pkg-config systemd --variable=systemdsystemunitdir 2>/dev/null)
941
942 [[ -d "$systemdsystemunitdir" ]] || systemdsystemunitdir=${systemdutildir}/system
943
944 [[ -d $systemdsystemconfdir ]] \
945     || systemdsystemconfdir=$(pkg-config systemd --variable=systemdsystemconfdir 2>/dev/null)
946
947 [[ -d "$systemdsystemconfdir" ]] || systemdsystemconfdir=/etc/systemd/system
948
949 export initdir dracutbasedir dracutmodules \
950     fw_dir drivers_dir debug no_kernel kernel_only \
951     omit_drivers mdadmconf lvmconf root_dev \
952     use_fstab fstab_lines libdirs fscks nofscks ro_mnt \
953     stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
954     debug host_fs_types host_devs sshkey add_fstab \
955     DRACUT_VERSION udevdir prefix filesystems drivers \
956     systemdutildir systemdsystemunitdir systemdsystemconfdir
957
958 # Create some directory structure first
959 [[ $prefix ]] && mkdir -m 0755 -p "${initdir}${prefix}"
960
961 [[ -h /lib ]] || mkdir -m 0755 -p "${initdir}${prefix}/lib"
962 [[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib"
963
964 if [[ $prefix ]]; then
965     for d in bin etc lib sbin tmp usr var $libdirs; do
966         [[ "$d" == */* ]] && continue
967         ln -sfn "${prefix#/}/${d#/}" "$initdir/$d"
968     done
969 fi
970
971 if [[ $kernel_only != yes ]]; then
972     for d in usr/bin usr/sbin bin etc lib sbin tmp usr var $libdirs; do
973         [[ -e "${initdir}${prefix}/$d" ]] && continue
974         if [ -L "/$d" ]; then
975             inst_symlink "/$d" "${prefix}/$d"
976         else
977             mkdir -m 0755 -p "${initdir}${prefix}/$d"
978         fi
979     done
980
981     for d in dev proc sys sysroot root run run/lock run/initramfs; do
982         if [ -L "/$d" ]; then
983             inst_symlink "/$d"
984         else
985             mkdir -m 0755 -p "$initdir/$d"
986         fi
987     done
988
989     ln -sfn ../run "$initdir/var/run"
990     ln -sfn ../run/lock "$initdir/var/lock"
991     ln -sfn ../run/log "$initdir/var/log"
992 else
993     for d in lib "$libdir"; do
994         [[ -e "${initdir}${prefix}/$d" ]] && continue
995         if [ -h "/$d" ]; then
996             inst "/$d" "${prefix}/$d"
997         else
998             mkdir -m 0755 -p "${initdir}${prefix}/$d"
999         fi
1000     done
1001 fi
1002
1003 if [[ $kernel_only != yes ]]; then
1004     mkdir -p "${initdir}/etc/cmdline.d"
1005     for _d in $hookdirs; do
1006         mkdir -m 0755 -p ${initdir}/lib/dracut/hooks/$_d
1007     done
1008     if [[ "$UID" = "0" ]]; then
1009         [ -c ${initdir}/dev/null ] || mknod ${initdir}/dev/null c 1 3
1010         [ -c ${initdir}/dev/kmsg ] || mknod ${initdir}/dev/kmsg c 1 11
1011         [ -c ${initdir}/dev/console ] || mknod ${initdir}/dev/console c 5 1
1012     fi
1013 fi
1014
1015 mods_to_load=""
1016 # check all our modules to see if they should be sourced.
1017 # This builds a list of modules that we will install next.
1018 for_each_module_dir check_module
1019 for_each_module_dir check_mount
1020
1021 [[ "$mods_to_load " == *01fips\ * ]] && export DRACUT_FIPS_MODE=1
1022
1023 _isize=0 #initramfs size
1024 modules_loaded=" "
1025 # source our modules.
1026 for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1027     _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]}
1028     if [[ "$mods_to_load" == *\ $_d_mod\ * ]]; then
1029         if [[ $show_modules = yes ]]; then
1030             printf "%s\n" "$_d_mod"
1031         else
1032             dinfo "*** Including module: $_d_mod ***"
1033         fi
1034         if [[ $kernel_only == yes ]]; then
1035             module_installkernel "$_d_mod" || {
1036                 dfatal "installkernel failed in module $_d_mod"
1037                 exit 1
1038             }
1039         else
1040             module_install "$_d_mod"
1041             if [[ $no_kernel != yes ]]; then
1042                 module_installkernel "$_d_mod" || {
1043                     dfatal "installkernel failed in module $_d_mod"
1044                     exit 1
1045                 }
1046             fi
1047         fi
1048         mods_to_load=${mods_to_load// $_d_mod /}
1049         modules_loaded+="$_d_mod "
1050
1051         #print the module install size
1052         if [ -n "$printsize" ]; then
1053             _isize_new=$(du -sk ${initdir}|cut -f1)
1054             _isize_delta=$((_isize_new - _isize))
1055             printf "%s\n" "$_d_mod install size: ${_isize_delta}k"
1056             _isize=$_isize_new
1057         fi
1058     fi
1059 done
1060 unset moddir
1061
1062 for i in $modules_loaded; do
1063     mkdir -p $initdir/lib/dracut
1064     printf "%s\n" "$i" >> $initdir/lib/dracut/modules.txt
1065 done
1066
1067 dinfo "*** Including modules done ***"
1068
1069 ## final stuff that has to happen
1070 if [[ $no_kernel != yes ]]; then
1071
1072     if [[ $drivers ]]; then
1073         hostonly='' instmods $drivers
1074     fi
1075
1076     if [[ $add_drivers ]]; then
1077         hostonly='' instmods -c $add_drivers
1078     fi
1079     if [[ $filesystems ]]; then
1080         hostonly='' instmods -c $filesystems
1081     fi
1082
1083     dinfo "*** Installing kernel module dependencies and firmware ***"
1084     dracut_kernel_post
1085     dinfo "*** Installing kernel module dependencies and firmware done ***"
1086
1087     if [[ $noimageifnotneeded == yes ]] && [[ $hostonly ]]; then
1088         if [[ ! -f "$initdir/lib/dracut/need-initqueue" ]] && \
1089             [[ -f ${initdir}/lib/modules/$kernel/modules.dep && ! -s ${initdir}/lib/modules/$kernel/modules.dep ]]; then
1090             for i in ${initdir}/etc/cmdline.d/*.conf; do
1091                 # We need no initramfs image and do not generate one.
1092                 [[ $i == "${initdir}/etc/cmdline.d/*.conf" ]] && exit 0
1093             done
1094         fi
1095     fi
1096 fi
1097
1098 if [[ $kernel_only != yes ]]; then
1099     (( ${#install_items[@]} > 0 )) && dracut_install ${install_items[@]}
1100
1101     [[ $kernel_cmdline ]] && printf "%s\n" "$kernel_cmdline" >> "${initdir}/etc/cmdline.d/01-default.conf"
1102
1103     while pop fstab_lines line; do
1104         printf "%s\n" "$line 0 0" >> "${initdir}/etc/fstab"
1105     done
1106
1107     for f in $add_fstab; do
1108         cat "$f" >> "${initdir}/etc/fstab"
1109     done
1110
1111     if [ -d ${initdir}/$systemdutildir ]; then
1112         mkdir -p ${initdir}/etc/conf.d
1113         {
1114             printf "%s\n" "systemdutildir=\"$systemdutildir\""
1115             printf "%s\n" "systemdsystemunitdir=\"$systemdsystemunitdir\""
1116             printf "%s\n" "systemdsystemconfdir=\"$systemdsystemconfdir\""
1117         } > ${initdir}/etc/conf.d/systemd.conf
1118     fi
1119
1120     if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then
1121         dinfo "*** Resolving executable dependencies ***"
1122         find "$initdir" -type f \
1123             '(' -perm -0100 -or -perm -0010 -or -perm -0001 ')' \
1124             -not -path '*.ko' -print0 \
1125         | xargs -r -0 $DRACUT_INSTALL ${initdir+-D "$initdir"} -R ${DRACUT_FIPS_MODE+-H} --
1126         dinfo "*** Resolving executable dependencies done***"
1127     fi
1128 fi
1129
1130 while pop include_src src && pop include_target tgt; do
1131     if [[ $src && $tgt ]]; then
1132         if [[ -f $src ]]; then
1133             inst $src $tgt
1134         else
1135             ddebug "Including directory: $src"
1136             mkdir -p "${initdir}/${tgt}"
1137             # check for preexisting symlinks, so we can cope with the
1138             # symlinks to $prefix
1139             for i in "$src"/*; do
1140                 [[ -e "$i" || -h "$i" ]] || continue
1141                 s=${initdir}/${tgt}/${i#$src/}
1142                 if [[ -d "$i" ]]; then
1143                     if ! [[ -e "$s" ]]; then
1144                         mkdir -m 0755 -p "$s"
1145                         chmod --reference="$i" "$s"
1146                     fi
1147                     cp --reflink=auto --sparse=auto -fa -t "$s" "$i"/*
1148                 else
1149                     cp --reflink=auto --sparse=auto -fa -t "$s" "$i"
1150                 fi
1151             done
1152         fi
1153     fi
1154 done
1155
1156 if [[ $kernel_only != yes ]]; then
1157     # make sure that library links are correct and up to date
1158     for f in /etc/ld.so.conf /etc/ld.so.conf.d/*; do
1159         [[ -f $f ]] && inst_simple "$f"
1160     done
1161     if ! ldconfig -r "$initdir"; then
1162         if [[ $UID = 0 ]]; then
1163             derror "ldconfig exited ungracefully"
1164         else
1165             derror "ldconfig might need uid=0 (root) for chroot()"
1166         fi
1167     fi
1168 fi
1169
1170 if (( maxloglvl >= 5 )); then
1171     ddebug "Listing sizes of included files:"
1172     du -c "$initdir" | sort -n | ddebug
1173 fi
1174
1175 PRELINK_BIN="$(command -v prelink)"
1176 if [[ $UID = 0 ]] && [[ $PRELINK_BIN ]]; then
1177     if [[ $DRACUT_FIPS_MODE ]]; then
1178         dinfo "*** Installing prelink files ***"
1179         dracut_install -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf /etc/prelink.cache
1180     else
1181         dinfo "*** Pre-linking files ***"
1182         dracut_install -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf
1183         chroot "$initdir" "$PRELINK_BIN" -a
1184         rm -f -- "$initdir/$PRELINK_BIN"
1185         rm -fr -- "$initdir"/etc/prelink.*
1186         dinfo "*** Pre-linking files done ***"
1187     fi
1188 fi
1189
1190 if [[ $do_hardlink = yes ]] && command -v hardlink >/dev/null; then
1191     dinfo "*** Hardlinking files ***"
1192     hardlink "$initdir" 2>&1
1193     dinfo "*** Hardlinking files done ***"
1194 fi
1195
1196 # strip binaries
1197 if [[ $do_strip = yes ]] ; then
1198     for p in strip xargs find; do
1199         if ! type -P $p >/dev/null; then
1200             dinfo "Could not find '$p'. Not stripping the initramfs."
1201             do_strip=no
1202         fi
1203     done
1204 fi
1205
1206 if [[ $do_strip = yes ]] ; then
1207     dinfo "*** Stripping files ***"
1208     if [[ $DRACUT_FIPS_MODE ]]; then
1209         find "$initdir" -type f \
1210             -executable -not -path '*/lib/modules/*.ko' -print0 \
1211             | while read -r -d $'\0' f; do
1212             if ! [[ -e "${f%/*}/.${f##*/}.hmac" ]] \
1213                 && ! [[ -e "/lib/hmaccalc/${f##*/}.hmac" ]] \
1214                 && ! [[ -e "/lib64/hmaccalc/${f##*/}.hmac" ]] \
1215                 && ! [[ -e "/lib/fipscheck/${f##*/}.hmac" ]] \
1216                 && ! [[ -e "/lib64/fipscheck/${f##*/}.hmac" ]]; then
1217                 printf "%s\000" "$f";
1218             fi
1219         done | xargs -r -0 strip -g 2>/dev/null
1220     else
1221         find "$initdir" -type f \
1222             -executable -not -path '*/lib/modules/*.ko' -print0 \
1223             | xargs -r -0 strip -g 2>/dev/null
1224     fi
1225
1226     # strip kernel modules, but do not touch signed modules
1227     find "$initdir" -type f -path '*/lib/modules/*.ko' -print0 \
1228         | while read -r -d $'\0' f; do
1229         SIG=$(tail -c 28 "$f")
1230         [[ $SIG == '~Module signature appended~' ]] || { printf "%s\000" "$f"; }
1231     done | xargs -r -0 strip -g
1232
1233     dinfo "*** Stripping files done ***"
1234 fi
1235 if [[ $early_microcode = yes ]]; then
1236     dinfo "*** Generating early-microcode cpio image ***"
1237     ucode_dir=(amd-ucode intel-ucode)
1238     ucode_dest=(AuthenticAMD.bin GenuineIntel.bin)
1239     _dest_dir="$microcode_dir/d/kernel/x86/microcode"
1240     _dest_idx="0 1"
1241     mkdir -p $_dest_dir
1242     if [[ $hostonly ]]; then
1243         [[ $(get_cpu_vendor) == "AMD" ]] && _dest_idx="0"
1244         [[ $(get_cpu_vendor) == "Intel" ]] && _dest_idx="1"
1245     fi
1246     for idx in $_dest_idx; do
1247         _fw=${ucode_dir[$idx]}
1248         for _fwdir in $fw_dir; do
1249             if [[ -d $_fwdir && -d $_fwdir/$_fw ]]; then
1250                 _src="*"
1251                 dinfo "*** Constructing ${ucode_dest[$idx]} ****"
1252                 if [[ $hostonly ]]; then
1253                     _src=$(get_ucode_file)
1254                 fi
1255                 cat $_fwdir/$_fw/$_src > $_dest_dir/${ucode_dest[$idx]}
1256             fi
1257         done
1258     done
1259     (cd "$microcode_dir/d"; find . | cpio -o -H newc --quiet >../ucode.cpio)
1260 fi
1261 rm -f -- "$outfile"
1262 dinfo "*** Creating image file ***"
1263 if [[ $early_microcode = yes ]]; then
1264     # The microcode blob is _before_ the initramfs blob, not after
1265     mv $microcode_dir/ucode.cpio $outfile.$$
1266 fi
1267 if ! ( umask 077; cd "$initdir"; find . |cpio -R 0:0 -H newc -o --quiet| \
1268     $compress >> "$outfile.$$"; ); then
1269     dfatal "dracut: creation of $outfile.$$ failed"
1270     exit 1
1271 fi
1272 mv -- "$outfile.$$" "$outfile"
1273 dinfo "*** Creating image file done ***"
1274
1275 dinfo "Wrote $outfile:"
1276 dinfo "$(ls -l "$outfile")"
1277
1278 exit 0