dracut.sh: mkdir of $libdirs at then end
[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-2010 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 usage() {
30     [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
31     if [[ -f $dracutbasedir/dracut-version.sh ]]; then
32         . $dracutbasedir/dracut-version.sh
33     fi
34
35 #                                                       80x25 linebreak here ^
36     cat << EOF
37 Usage: $0 [OPTION]... <initramfs> <kernel-version>
38
39 Version: $DRACUT_VERSION
40
41 Creates initial ramdisk images for preloading modules
42
43   -f, --force           Overwrite existing initramfs file.
44   -m, --modules [LIST]  Specify a space-separated list of dracut modules to
45                          call when building the initramfs. Modules are located
46                          in /usr/lib/dracut/modules.d.
47   -o, --omit [LIST]     Omit a space-separated list of dracut modules.
48   -a, --add [LIST]      Add a space-separated list of dracut modules.
49   -d, --drivers [LIST]  Specify a space-separated list of kernel modules to
50                         exclusively include in the initramfs.
51   --add-drivers [LIST] Specify a space-separated list of kernel
52                         modules to add to the initramfs.
53   --omit-drivers [LIST] Specify a space-separated list of kernel
54                         modules not to add to the initramfs.
55   --filesystems [LIST]  Specify a space-separated list of kernel filesystem
56                         modules to exclusively include in the generic
57                         initramfs.
58   -k, --kmoddir [DIR]   Specify the directory, where to look for kernel
59                         modules
60   --fwdir [DIR]         Specify additional directories, where to look for
61                         firmwares, separated by :
62   --kernel-only         Only install kernel drivers and firmware files
63   --no-kernel           Do not install kernel drivers and firmware files
64   --strip               Strip binaries in the initramfs
65   --nostrip             Do not strip binaries in the initramfs (default)
66   --prefix [DIR]        Prefix initramfs files with [DIR]
67   --noprefix            Do not prefix initramfs files (default)
68   --mdadmconf           Include local /etc/mdadm.conf
69   --nomdadmconf         Do not include local /etc/mdadm.conf
70   --lvmconf             Include local /etc/lvm/lvm.conf
71   --nolvmconf           Do not include local /etc/lvm/lvm.conf
72   --fscks [LIST]        Add a space-separated list of fsck helpers.
73   --nofscks             Inhibit installation of any fsck helpers.
74   -h, --help            This message
75   --debug               Output debug information of the build process
76   --profile             Output profile information of the build process
77   -L, --stdlog [0-6]    Specify logging level (to standard error)
78                          0 - suppress any messages
79                          1 - only fatal errors
80                          2 - all errors
81                          3 - warnings
82                          4 - info (default)
83                          5 - debug info (here starts lots of output)
84                          6 - trace info (and even more)
85   -v, --verbose         Increase verbosity level (default is info(4))
86   -q, --quiet           Decrease verbosity level (default is info(4))
87   -c, --conf [FILE]     Specify configuration file to use.
88                          Default: /etc/dracut.conf
89   --confdir [DIR]       Specify configuration directory to use *.conf files
90                          from. Default: /etc/dracut.conf.d
91   --tmpdir [DIR]        Temporary directory to be used instead of default
92                          /var/tmp.
93   -l, --local           Local mode. Use modules from the current working
94                          directory instead of the system-wide installed in
95                          /usr/lib/dracut/modules.d.
96                          Useful when running dracut from a git checkout.
97   -H, --hostonly        Host-Only mode: Install only what is needed for
98                          booting the local host instead of a generic host.
99   --no-hostonly         Disables Host-Only mode
100   --fstab               Use /etc/fstab to determine the root device.
101   --add-fstab [FILE]    Add file to the initramfs fstab
102   --mount "[DEV] [MP] [FSTYPE] [FSOPTS]"
103                         Mount device [DEV] on mountpoint [MP] with filesystem
104                         [FSTYPE] and options [FSOPTS] in the initramfs
105   -i, --include [SOURCE] [TARGET]
106                         Include the files in the SOURCE directory into the
107                          Target directory in the final initramfs.
108                         If SOURCE is a file, it will be installed to TARGET
109                          in the final initramfs.
110   -I, --install [LIST]  Install the space separated list of files into the
111                          initramfs.
112   --gzip                Compress the generated initramfs using gzip.
113                          This will be done by default, unless another
114                          compression option or --no-compress is passed.
115   --bzip2               Compress the generated initramfs using bzip2.
116                          Make sure your kernel has bzip2 decompression support
117                          compiled in, otherwise you will not be able to boot.
118   --lzma                Compress the generated initramfs using lzma.
119                          Make sure your kernel has lzma support compiled in,
120                          otherwise you will not be able to boot.
121   --xz                  Compress the generated initramfs using xz.
122                          Make sure that your kernel has xz support compiled
123                          in, otherwise you will not be able to boot.
124   --compress [COMPRESSION] Compress the generated initramfs with the
125                          passed compression program.  Make sure your kernel
126                          knows how to decompress the generated initramfs,
127                          otherwise you will not be able to boot.
128   --no-compress         Do not compress the generated initramfs.  This will
129                          override any other compression options.
130   --list-modules        List all available dracut modules.
131   -M, --show-modules    Print included module's name to standard output during
132                          build.
133   --keep                Keep the temporary initramfs for debugging purposes
134   --printsize           Print out the module install size
135   --sshkey [SSHKEY]     Add ssh key to initramfs (use with ssh-client module)
136
137 If [LIST] has multiple arguments, then you have to put these in quotes.
138 For example:
139 # dracut --add-drivers "module1 module2"  ...
140 EOF
141 }
142
143 # function push()
144 # push values to a stack
145 # $1 = stack variable
146 # $2.. values
147 # example:
148 # push stack 1 2 "3 4"
149 push() {
150     local __stack=$1; shift
151     for i in "$@"; do
152         eval ${__stack}'[${#'${__stack}'[@]}]="$i"'
153     done
154 }
155
156 # function pop()
157 # pops the last value from a stack
158 # assigns value to second argument variable
159 # or echo to stdout, if no second argument
160 # $1 = stack variable
161 # $2 = optional variable to store the value
162 # example:
163 # pop stack val
164 # val=$(pop stack)
165 pop() {
166     local __stack=$1; shift
167     local __resultvar=$1
168     local myresult;
169     # check for empty stack
170     eval '[[ ${#'${__stack}'[@]} -eq 0 ]] && return 1'
171
172     eval myresult='${'${__stack}'[${#'${__stack}'[@]}-1]}'
173
174     if [[ "$__resultvar" ]]; then
175         eval $__resultvar="'$myresult'"
176     else
177         echo "$myresult"
178     fi
179     eval unset ${__stack}'[${#'${__stack}'[@]}-1]'
180     return 0
181 }
182
183 # Little helper function for reading args from the commandline.
184 # it automatically handles -a b and -a=b variants, and returns 1 if
185 # we need to shift $3.
186 read_arg() {
187     # $1 = arg name
188     # $2 = arg value
189     # $3 = arg parameter
190     local rematch='^[^=]*=(.*)$'
191     if [[ $2 =~ $rematch ]]; then
192         read "$1" <<< "${BASH_REMATCH[1]}"
193     else
194         read "$1" <<< "$3"
195         # There is no way to shift our callers args, so
196         # return 1 to indicate they should do it instead.
197         return 1
198     fi
199 }
200
201 # Little helper function for reading args from the commandline to a stack.
202 # it automatically handles -a b and -a=b variants, and returns 1 if
203 # we need to shift $3.
204 push_arg() {
205     # $1 = arg name
206     # $2 = arg value
207     # $3 = arg parameter
208     local rematch='^[^=]*=(.*)$'
209     if [[ $2 =~ $rematch ]]; then
210         push "$1" "${BASH_REMATCH[1]}"
211     else
212         push "$1" "$3"
213         # There is no way to shift our callers args, so
214         # return 1 to indicate they should do it instead.
215         return 1
216     fi
217 }
218
219 verbosity_mod_l=0
220
221 while (($# > 0)); do
222     case ${1%%=*} in
223         -a|--add)      push_arg add_dracutmodules_l  "$@" || shift;;
224         --force-add)   push_arg force_add_dracutmodules_l  "$@" || shift;;
225         --add-drivers) push_arg add_drivers_l        "$@" || shift;;
226         --omit-drivers) push_arg omit_drivers_l      "$@" || shift;;
227         -m|--modules)  push_arg dracutmodules_l      "$@" || shift;;
228         -o|--omit)     push_arg omit_dracutmodules_l "$@" || shift;;
229         -d|--drivers)  push_arg drivers_l            "$@" || shift;;
230         --filesystems) push_arg filesystems_l        "$@" || shift;;
231         -I|--install)  push_arg install_items_l      "$@" || shift;;
232         --fwdir)       push_arg fw_dir_l             "$@" || shift;;
233         --libdirs)     push_arg libdirs_l            "$@" || shift;;
234         --fscks)       push_arg fscks_l              "$@" || shift;;
235         --add-fstab)   push_arg add_fstab_l          "$@" || shift;;
236         --mount)       push_arg fstab_lines          "$@" || shift;;
237         --nofscks)     nofscks_l="yes";;
238         -k|--kmoddir)  read_arg drivers_dir_l        "$@" || shift;;
239         -c|--conf)     read_arg conffile             "$@" || shift;;
240         --confdir)     read_arg confdir              "$@" || shift;;
241         --tmpdir)      read_arg tmpdir_l             "$@" || shift;;
242         -L|--stdlog)   read_arg stdloglvl_l          "$@" || shift;;
243         --compress)    read_arg compress_l           "$@" || shift;;
244         --prefix)      read_arg prefix_l             "$@" || shift;;
245         -f|--force)    force=yes;;
246         --kernel-only) kernel_only="yes"; no_kernel="no";;
247         --no-kernel)   kernel_only="no"; no_kernel="yes";;
248         --strip)       do_strip_l="yes";;
249         --nostrip)     do_strip_l="no";;
250         --noprefix)    prefix_l="/";;
251         --mdadmconf)   mdadmconf_l="yes";;
252         --nomdadmconf) mdadmconf_l="no";;
253         --lvmconf)     lvmconf_l="yes";;
254         --nolvmconf)   lvmconf_l="no";;
255         --debug)       debug="yes";;
256         --profile)     profile="yes";;
257         --sshkey)      read_arg sshkey   "$@" || shift;;
258         -v|--verbose)  ((verbosity_mod_l++));;
259         -q|--quiet)    ((verbosity_mod_l--));;
260         -l|--local)
261                        allowlocal="yes"
262                        [[ -f "$(readlink -f ${0%/*})/dracut-functions.sh" ]] \
263                            && dracutbasedir="$(readlink -f ${0%/*})"
264                        ;;
265         -H|--hostonly) hostonly_l="yes" ;;
266         --no-hostonly) hostonly_l="no" ;;
267         --fstab)       use_fstab_l="yes" ;;
268         -h|--help)     usage; exit 1 ;;
269         -i|--include)  push include_src "$2"
270                        push include_target "$3"
271                        shift 2;;
272         --bzip2)       compress_l="bzip2";;
273         --lzma)        compress_l="lzma";;
274         --xz)          compress_l="xz";;
275         --no-compress) _no_compress_l="cat";;
276         --gzip)        compress_l="gzip";;
277         --list-modules)
278             do_list="yes";
279             ;;
280         -M|--show-modules)
281                        show_modules_l="yes"
282                        ;;
283         --keep)        keep="yes";;
284         --printsize)   printsize="yes";;
285         -*) printf "\nUnknown option: %s\n\n" "$1" >&2; usage; exit 1;;
286         *)
287             if ! [[ ${outfile+x} ]]; then
288                 outfile=$1
289             elif ! [[ ${kernel+x} ]]; then
290                 kernel=$1
291             else
292                 usage; exit 1;
293             fi
294             ;;
295     esac
296     shift
297 done
298 if ! [[ $kernel ]]; then
299     kernel=$(uname -r)
300 fi
301 [[ $outfile ]] || outfile="/boot/initramfs-$kernel.img"
302
303 for i in /usr/sbin /sbin /usr/bin /bin; do
304     rl=$i
305     if [ -L "$i" ]; then
306         rl=$(readlink -f $i)
307     fi
308     NPATH+=":$rl"
309 done
310 export PATH="${NPATH#:}"
311 unset NPATH
312 unset LD_LIBRARY_PATH
313 unset GREP_OPTIONS
314
315 [[ $debug ]] && {
316     export PS4='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): ';
317     set -x
318 }
319
320 [[ $profile ]] && {
321     export PS4='+ $(date "+%s.%N") ${BASH_SOURCE}@${LINENO}: ';
322     set -x
323     debug=yes
324 }
325
326 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
327
328 # if we were not passed a config file, try the default one
329 if [[ ! -f $conffile ]]; then
330     [[ $allowlocal ]] && conffile="$dracutbasedir/dracut.conf" || \
331         conffile="/etc/dracut.conf"
332 fi
333
334 if [[ ! -d $confdir ]]; then
335     [[ $allowlocal ]] && confdir="$dracutbasedir/dracut.conf.d" || \
336         confdir="/etc/dracut.conf.d"
337 fi
338
339 # source our config file
340 [[ -f $conffile ]] && . "$conffile"
341
342 # source our config dir
343 if [[ $confdir && -d $confdir ]]; then
344     for f in "$confdir"/*.conf; do
345         [[ -e $f ]] && . "$f"
346     done
347 fi
348
349 # these optins add to the stuff in the config file
350 if (( ${#add_dracutmodules_l[@]} )); then
351     while pop add_dracutmodules_l val; do
352         add_dracutmodules+=" $val "
353     done
354 fi
355
356 if (( ${#force_add_dracutmodules_l[@]} )); then
357     while pop force_add_dracutmodules_l val; do
358         force_add_dracutmodules+=" $val "
359     done
360 fi
361
362 if (( ${#fscks_l[@]} )); then
363     while pop fscks_l val; do
364         fscks+=" $val "
365     done
366 fi
367
368 if (( ${#add_fstab_l[@]} )); then
369     while pop add_fstab_l val; do
370         add_fstab+=" $val "
371     done
372 fi
373
374 if (( ${#fstab_lines_l[@]} )); then
375     while pop fstab_lines_l val; do
376         push fstab_lines $val
377     done
378 fi
379
380 if (( ${#install_items_l[@]} )); then
381     while pop install_items_l val; do
382         install_items+=" $val "
383     done
384 fi
385
386 # these options override the stuff in the config file
387 if (( ${#dracutmodules_l[@]} )); then
388     dracutmodules=''
389     while pop dracutmodules_l val; do
390         dracutmodules+="$val "
391     done
392 fi
393
394 if (( ${#omit_dracutmodules_l[@]} )); then
395     omit_dracutmodules=''
396     while pop omit_dracutmodules_l val; do
397         omit_dracutmodules+="$val "
398     done
399 fi
400
401 if (( ${#filesystems_l[@]} )); then
402     filesystems=''
403     while pop filesystems_l val; do
404         filesystems+="$val "
405     done
406 fi
407
408 if (( ${#fw_dir_l[@]} )); then
409     fw_dir=''
410     while pop fw_dir_l val; do
411         fw_dir+="$val "
412     done
413 fi
414
415 if (( ${#libdirs_l[@]} )); then
416     libdirs=''
417     while pop libdirs_l val; do
418         libdirs+="$val "
419     done
420 fi
421
422 [[ $stdloglvl_l ]] && stdloglvl=$stdloglvl_l
423 [[ ! $stdloglvl ]] && stdloglvl=4
424 stdloglvl=$((stdloglvl + verbosity_mod_l))
425 ((stdloglvl > 6)) && stdloglvl=6
426 ((stdloglvl < 0)) && stdloglvl=0
427
428 [[ $drivers_dir_l ]] && drivers_dir=$drivers_dir_l
429 [[ $do_strip_l ]] && do_strip=$do_strip_l
430 [[ $prefix_l ]] && prefix=$prefix_l
431 [[ $prefix = "/" ]] && unset prefix
432 [[ $hostonly_l ]] && hostonly=$hostonly_l
433 [[ $use_fstab_l ]] && use_fstab=$use_fstab_l
434 [[ $mdadmconf_l ]] && mdadmconf=$mdadmconf_l
435 [[ $lvmconf_l ]] && lvmconf=$lvmconf_l
436 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
437 [[ $fw_dir ]] || fw_dir="/lib/firmware/updates /lib/firmware"
438 [[ $tmpdir_l ]] && tmpdir="$tmpdir_l"
439 [[ $tmpdir ]] || tmpdir=/var/tmp
440 [[ $do_strip ]] || do_strip=no
441 [[ $compress_l ]] && compress=$compress_l
442 [[ $show_modules_l ]] && show_modules=$show_modules_l
443 [[ $nofscks_l ]] && nofscks="yes"
444 # eliminate IFS hackery when messing with fw_dir
445 fw_dir=${fw_dir//:/ }
446
447 # handle compression options.
448 [[ $compress ]] || compress="gzip"
449 case $compress in
450     bzip2) compress="bzip2 -9";;
451     lzma)  compress="lzma -9";;
452     xz)    compress="xz --check=crc32 --lzma2=dict=1MiB";;
453     gzip)  command -v pigz > /dev/null 2>&1 && compress="pigz -9" || \
454                                          compress="gzip -9";;
455 esac
456 if [[ $_no_compress_l = "cat" ]]; then
457     compress="cat"
458 fi
459
460 [[ $hostonly = yes ]] && hostonly="-h"
461 [[ $hostonly != "-h" ]] && unset hostonly
462
463 if [[ -f $dracutbasedir/dracut-functions.sh ]]; then
464     . $dracutbasedir/dracut-functions.sh
465 else
466     echo "Cannot find $dracutbasedir/dracut-functions.sh." >&2
467     echo "Are you running from a git checkout?" >&2
468     echo "Try passing -l as an argument to $0" >&2
469     exit 1
470 fi
471
472 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
473     . $dracutbasedir/dracut-version.sh
474 fi
475
476 # Verify bash version, curret minimum is 3.1
477 if (( ${BASH_VERSINFO[0]} < 3 ||
478     ( ${BASH_VERSINFO[0]} == 3 && ${BASH_VERSINFO[1]} < 1 ) )); then
479     dfatal 'You need at least Bash 3.1 to use dracut, sorry.'
480     exit 1
481 fi
482
483 dracutfunctions=$dracutbasedir/dracut-functions.sh
484 export dracutfunctions
485
486 if (( ${#drivers_l[@]} )); then
487     drivers=''
488     while pop drivers_l val; do
489         drivers+="$val "
490     done
491 fi
492 drivers=${drivers/-/_}
493
494 if (( ${#add_drivers_l[@]} )); then
495     while pop add_drivers_l val; do
496         add_drivers+=" $val "
497     done
498 fi
499 add_drivers=${add_drivers/-/_}
500
501 if (( ${#omit_drivers_l[@]} )); then
502     while pop omit_drivers_l val; do
503         omit_drivers+=" $val "
504     done
505 fi
506 omit_drivers=${omit_drivers/-/_}
507
508 omit_drivers_corrected=""
509 for d in $omit_drivers; do
510     strstr " $drivers $add_drivers " " $d " && continue
511     omit_drivers_corrected+="$d|"
512 done
513 omit_drivers="${omit_drivers_corrected%|}"
514 unset omit_drivers_corrected
515
516
517 ddebug "Executing $0 $dracut_args"
518
519 [[ $do_list = yes ]] && {
520     for mod in $dracutbasedir/modules.d/*; do
521         [[ -d $mod ]] || continue;
522         [[ -e $mod/install || -e $mod/installkernel || \
523             -e $mod/module-setup.sh ]] || continue
524         echo ${mod##*/??}
525     done
526     exit 0
527 }
528
529 # Detect lib paths
530 if ! [[ $libdirs ]] ; then
531     if strstr "$(ldd /bin/sh)" "/lib64/" &>/dev/null \
532         && [[ -d /lib64 ]]; then
533         libdirs+=" /lib64"
534         [[ -d /usr/lib64 ]] && libdirs+=" /usr/lib64"
535     else
536         libdirs+=" /lib"
537         [[ -d /usr/lib ]] && libdirs+=" /usr/lib"
538     fi
539 fi
540
541 # This is kinda legacy -- eventually it should go away.
542 case $dracutmodules in
543     ""|auto) dracutmodules="all" ;;
544 esac
545
546 abs_outfile=$(readlink -f "$outfile") && outfile="$abs_outfile"
547
548 srcmods="/lib/modules/$kernel/"
549 [[ $drivers_dir ]] && {
550     if vercmp $(modprobe --version | cut -d' ' -f3) lt 3.7; then
551         dfatal 'To use --kmoddir option module-init-tools >= 3.7 is required.'
552         exit 1
553     fi
554     srcmods="$drivers_dir"
555 }
556 export srcmods
557
558 [[ -f $srcmods/modules.dep ]] || {
559     dfatal "$srcmods/modules.dep is missing. Did you run depmod?"
560     exit 1
561 }
562
563 if [[ -f $outfile && ! $force ]]; then
564     dfatal "Will not override existing initramfs ($outfile) without --force"
565     exit 1
566 fi
567
568 outdir=${outfile%/*}
569 [[ $outdir ]] || outdir="/"
570
571 if [[ ! -d "$outdir" ]]; then
572     dfatal "Can't write $outfile: Directory $outdir does not exist."
573     exit 1
574 elif [[ ! -w "$outdir" ]]; then
575     dfatal "No permission to write $outdir."
576     exit 1
577 elif [[ -f "$outfile" && ! -w "$outfile" ]]; then
578     dfatal "No permission to write $outfile."
579     exit 1
580 fi
581
582 readonly TMPDIR="$tmpdir"
583 readonly initdir=$(mktemp --tmpdir="$TMPDIR/" -d -t initramfs.XXXXXX)
584 [ -d "$initdir" ] || {
585     dfatal "mktemp failed."
586     exit 1
587 }
588
589 # clean up after ourselves no matter how we die.
590 trap 'ret=$?;[[ $keep ]] && echo "Not removing $initdir." >&2 || rm -rf "$initdir";exit $ret;' EXIT
591 # clean up after ourselves no matter how we die.
592 trap 'exit 1;' SIGINT
593
594 # Need to be able to have non-root users read stuff (rpcbind etc)
595 chmod 755 "$initdir"
596
597 for line in "${fstab_lines[@]}"; do
598     set -- $line
599     #dev mp fs fsopts
600     push host_devs "$1"
601     push host_fs_types "$1|$3"
602 done
603
604 for f in $add_fstab; do
605     [ -e $f ] || continue
606     while read dev rest; do
607         push host_devs $dev
608     done < $f
609 done
610
611 if [[ $hostonly ]]; then
612     # in hostonly mode, determine all devices, which have to be accessed
613     # and examine them for filesystem types
614
615     push host_mp \
616         "/" \
617         "/etc" \
618         "/usr" \
619         "/usr/bin" \
620         "/usr/sbin" \
621         "/usr/lib" \
622         "/usr/lib64" \
623         "/boot"
624
625     for mp in "${host_mp[@]}"; do
626         mountpoint "$mp" >/dev/null 2>&1 || continue
627         push host_devs $(readlink -f "/dev/block/$(find_block_device "$mp")")
628     done
629 fi
630
631 _get_fs_type() (
632     [[ $1 ]] || return
633     if [[ -b $1 ]] && get_fs_env $1; then
634         echo "$(readlink -f $1)|$ID_FS_TYPE"
635         return 1
636     fi
637     if [[ -b /dev/block/$1 ]] && get_fs_env /dev/block/$1; then
638         echo "$(readlink -f /dev/block/$1)|$ID_FS_TYPE"
639         return 1
640     fi
641     if fstype=$(find_dev_fstype $1); then
642         echo "$1|$fstype"
643         return 1
644     fi
645     return 1
646 )
647
648 for dev in "${host_devs[@]}"; do
649     unset fs_type
650     for fstype in $(_get_fs_type $dev) \
651         $(check_block_and_slaves _get_fs_type $(get_maj_min $dev)); do
652         if ! strstr " ${host_fs_types[*]} " " $fstype ";then
653             push host_fs_types "$fstype"
654         fi
655     done
656 done
657
658 [[ -d $udevdir ]] \
659     || udevdir=$(pkg-config udev --variable=udevdir 2>/dev/null)
660 if ! [[ -d "$udevdir" ]]; then
661     [[ -d /lib/udev ]] && udevdir=/lib/udev
662     [[ -d /usr/lib/udev ]] && udevdir=/usr/lib/udev
663 fi
664
665 [[ -d $systemdutildir ]] \
666     || systemdutildir=$(pkg-config systemd --variable=systemdutildir 2>/dev/null)
667 [[ -d $systemdsystemunitdir ]] \
668     || systemdsystemunitdir=$(pkg-config systemd --variable=systemdsystemunitdir 2>/dev/null)
669
670 if ! [[ -d "$systemdutildir" ]]; then
671     [[ -d /lib/systemd ]] && systemdutildir=/lib/systemd
672     [[ -d /usr/lib/systemd ]] && systemdutildir=/usr/lib/systemd
673 fi
674 [[ -d "$systemdsystemunitdir" ]] || systemdsystemunitdir=${systemdutildir}/system
675
676 export initdir dracutbasedir dracutmodules drivers \
677     fw_dir drivers_dir debug no_kernel kernel_only \
678     add_drivers omit_drivers mdadmconf lvmconf filesystems \
679     use_fstab fstab_lines libdirs fscks nofscks \
680     stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
681     debug host_fs_types host_devs sshkey add_fstab \
682     DRACUT_VERSION udevdir systemdutildir systemdsystemunitdir
683
684 # Create some directory structure first
685 [[ $prefix ]] && mkdir -m 0755 -p "${initdir}${prefix}"
686
687 [[ -h /lib ]] || mkdir -m 0755 -p "${initdir}${prefix}/lib"
688 [[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib"
689
690 if [[ $prefix ]]; then
691     for d in bin etc lib sbin tmp usr var $libdirs; do
692         strstr "$d" "/" && continue
693         ln -sfn "${prefix#/}/${d#/}" "$initdir/$d"
694     done
695 fi
696
697 if [[ $kernel_only != yes ]]; then
698     for d in usr/bin usr/sbin bin etc lib sbin tmp usr var var/log var/run var/lock $libdirs; do
699         [[ -e "${initdir}${prefix}/$d" ]] && continue
700         if [ -L "/$d" ]; then
701             inst_symlink "/$d" "${prefix}/$d"
702         else
703             mkdir -m 0755 -p "${initdir}${prefix}/$d"
704         fi
705     done
706
707     for d in dev proc sys sysroot root run run/lock run/initramfs; do
708         if [ -L "/$d" ]; then
709             inst_symlink "/$d"
710         else
711             mkdir -m 0755 -p "$initdir/$d"
712         fi
713     done
714
715     ln -sfn /run "$initdir/var/run"
716     ln -sfn /run/lock "$initdir/var/lock"
717 else
718     for d in lib "$libdir"; do
719         [[ -e "${initdir}${prefix}/$d" ]] && continue
720         if [ -h "/$d" ]; then
721             inst "/$d" "${prefix}/$d"
722         else
723             mkdir -m 0755 -p "${initdir}${prefix}/$d"
724         fi
725     done
726 fi
727
728 if [[ $kernel_only != yes ]]; then
729     mkdir -p "${initdir}/etc/cmdline.d"
730     for _d in $hookdirs; do
731         mkdir -m 0755 -p ${initdir}/lib/dracut/hooks/$_d
732     done
733     if [[ "$UID" = "0" ]]; then
734         cp -a /dev/kmsg /dev/null /dev/console $initdir/dev
735     fi
736 fi
737
738 mkdir -p "$initdir/.kernelmodseen"
739
740 mods_to_load=""
741 # check all our modules to see if they should be sourced.
742 # This builds a list of modules that we will install next.
743 for_each_module_dir check_module
744 for_each_module_dir check_mount
745
746 _isize=0 #initramfs size
747 modules_loaded=" "
748 # source our modules.
749 for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
750     _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]}
751     if strstr "$mods_to_load" " $_d_mod "; then
752         [[ $show_modules = yes ]] && echo "$_d_mod" || \
753             dinfo "*** Including module: $_d_mod ***"
754         if [[ $kernel_only = yes ]]; then
755             module_installkernel $_d_mod || {
756                 dfatal "installkernel failed in module $_d_mod"
757                 exit 1
758             }
759         else
760             module_install $_d_mod
761             if [[ $no_kernel != yes ]]; then
762                 module_installkernel $_d_mod || {
763                     dfatal "installkernel failed in module $_d_mod"
764                     exit 1
765                 }
766             fi
767         fi
768         mods_to_load=${mods_to_load// $_d_mod /}
769         modules_loaded+="$_d_mod "
770
771         #print the module install size
772         if [ -n "$printsize" ]; then
773             _isize_new=$(du -sk ${initdir}|cut -f1)
774             _isize_delta=$(($_isize_new - $_isize))
775             echo "$_d_mod install size: ${_isize_delta}k"
776             _isize=$_isize_new
777         fi
778     fi
779 done
780 unset moddir
781
782 for i in $modules_loaded; do
783     echo "$i" >> $initdir/lib/dracut/modules.txt
784 done
785
786 dinfo "*** Including modules done ***"
787
788 ## final stuff that has to happen
789
790 # generate module dependencies for the initrd
791 if [[ -d $initdir/lib/modules/$kernel ]] && \
792     ! depmod -a -b "$initdir" $kernel; then
793     dfatal "\"depmod -a $kernel\" failed."
794     exit 1
795 fi
796
797 while pop include_src src && pop include_target tgt; do
798     if [[ $src && $tgt ]]; then
799         if [[ -f $src ]]; then
800             inst $src $tgt
801         else
802             ddebug "Including directory: $src"
803             mkdir -p "${initdir}/${tgt}"
804             # check for preexisting symlinks, so we can cope with the
805             # symlinks to $prefix
806             for i in "$src"/*; do
807                 [[ -e "$i" || -h "$i" ]] || continue
808                 s=${initdir}/${tgt}/${i#$src/}
809                 if [[ -d "$i" ]]; then
810                     if ! [[ -e "$s" ]]; then
811                         mkdir -m 0755 -p "$s"
812                         chmod --reference="$i" "$s"
813                     fi
814                     cp -a -t "$s" "$i"/*
815                 else
816                     cp -a -t "$s" "$i"
817                 fi
818             done
819         fi
820     fi
821 done
822
823 if [[ $kernel_only != yes ]]; then
824     for item in $install_items; do
825         dracut_install "$item"
826     done
827     unset item
828
829     while pop fstab_lines line; do
830         echo "$line 0 0" >> "${initdir}/etc/fstab"
831     done
832
833     for f in $add_fstab; do
834         cat $f >> "${initdir}/etc/fstab"
835     done
836
837     # make sure that library links are correct and up to date
838     for f in /etc/ld.so.conf /etc/ld.so.conf.d/*; do
839         [[ -f $f ]] && inst_simple "$f"
840     done
841     if ! ldconfig -r "$initdir"; then
842         if [[ $UID = 0 ]]; then
843             derror "ldconfig exited ungracefully"
844         else
845             derror "ldconfig might need uid=0 (root) for chroot()"
846         fi
847     fi
848 fi
849
850 rm -fr "$initdir/.kernelmodseen"
851
852
853 if (($maxloglvl >= 5)); then
854     ddebug "Listing sizes of included files:"
855     du -c "$initdir" | sort -n | ddebug
856 fi
857
858 # strip binaries
859 if [[ $do_strip = yes ]] ; then
860     for p in strip grep find; do
861         if ! type -P $p >/dev/null; then
862             derror "Could not find '$p'. You should run $0 with '--nostrip'."
863             do_strip=no
864         fi
865     done
866 fi
867
868 if [[ $do_strip = yes ]] ; then
869     for f in $(find "$initdir" -type f \
870         \( -perm -0100 -or -perm -0010 -or -perm -0001 \
871            -or -path '*/lib/modules/*.ko' \) ); do
872         dinfo "Stripping $f"
873         strip -g "$f" 2>/dev/null|| :
874     done
875 fi
876
877 type hardlink &>/dev/null && {
878     hardlink "$initdir" 2>&1
879 }
880
881 if strstr "$modules_loaded" " fips " && command -v prelink >/dev/null; then
882     for dir in "$initdir/bin" \
883        "$initdir/sbin" \
884        "$initdir/usr/bin" \
885        "$initdir/usr/sbin"; do
886         [[ -L "$dir" ]] && continue
887         for i in "$dir"/*; do
888             [[ -x $i ]] && prelink -u $i &>/dev/null
889         done
890     done
891 fi
892
893 if ! ( cd "$initdir"; find . |cpio -R 0:0 -H newc -o --quiet| \
894     $compress > "$outfile"; ); then
895     dfatal "dracut: creation of $outfile failed"
896     exit 1
897 fi
898
899 dinfo "Wrote $outfile:"
900 dinfo "$(ls -l "$outfile")"
901
902 exit 0