]> git.ipfire.org Git - thirdparty/dracut.git/blame - dracut.sh
Support spaces in mount_nfs (#1109933)
[thirdparty/dracut.git] / dracut.sh
CommitLineData
c0815e4e 1#!/bin/bash
3b403b32 2#
641cc356
JK
3# Generator script for a dracut initramfs
4# Tries to retain some degree of compatibility with the command line
5# of the various mkinitrd implementations out there
6#
70c26b7f 7
7d848c55 8# Copyright 2005-2013 Red Hat, Inc. All rights reserved.
4f18fe82
HH
9#
10# This program is free software; you can redistribute it and/or modify
11# it under the terms of the GNU General Public License as published by
12# the Free Software Foundation; either version 2 of the License, or
13# (at your option) any later version.
14#
15# This program is distributed in the hope that it will be useful,
16# but WITHOUT ANY WARRANTY; without even the implied warranty of
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18# GNU General Public License for more details.
19#
20# You should have received a copy of the GNU General Public License
21# along with this program. If not, see <http://www.gnu.org/licenses/>.
22#
ec9315e5 23
58dad702 24# store for logging
ffa71b4a 25dracut_args=( "$@" )
5616feb0 26
7abd4264
HH
27set -o pipefail
28
5616feb0 29usage() {
dbf8f6ba
HH
30 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
31 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
32 . $dracutbasedir/dracut-version.sh
33 fi
34
5616feb0 35# 80x25 linebreak here ^
cc02093d 36 cat << EOF
ffa71b4a
HH
37Usage: $0 [OPTION]... [<initramfs> [<kernel-version>]]
38
39Version: $DRACUT_VERSION
40
41Creates initial ramdisk images for preloading modules
42
43 -h, --help Display all options
44
45If a [LIST] has multiple arguments, then you have to put these in quotes.
46
47For example:
48
49 # dracut --add-drivers "module1 module2" ...
50
51EOF
52}
53
54long_usage() {
55 [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
56 if [[ -f $dracutbasedir/dracut-version.sh ]]; then
57 . $dracutbasedir/dracut-version.sh
58 fi
59
60# 80x25 linebreak here ^
61 cat << EOF
62Usage: $0 [OPTION]... [<initramfs> [<kernel-version>]]
dbf8f6ba
HH
63
64Version: $DRACUT_VERSION
65
5616feb0
AT
66Creates initial ramdisk images for preloading modules
67
e65caf36 68 --kver [VERSION] Set kernel version to [VERSION].
39ff0682 69 -f, --force Overwrite existing initramfs file.
54e7d7c3 70 -a, --add [LIST] Add a space-separated list of dracut modules.
659dc319 71 --rebuild Append arguments to those of existing image and rebuild
5616feb0
AT
72 -m, --modules [LIST] Specify a space-separated list of dracut modules to
73 call when building the initramfs. Modules are located
c5a65990 74 in /usr/lib/dracut/modules.d.
39ff0682 75 -o, --omit [LIST] Omit a space-separated list of dracut modules.
ea3c4e82
HH
76 --force-add [LIST] Force to add a space-separated list of dracut modules
77 to the default set of modules, when -H is specified.
5616feb0 78 -d, --drivers [LIST] Specify a space-separated list of kernel modules to
ea3c4e82
HH
79 exclusively include in the initramfs.
80 --add-drivers [LIST] Specify a space-separated list of kernel
81 modules to add to the initramfs.
cea907f6
TR
82 --force-drivers [LIST] Specify a space-separated list of kernel
83 modules to add to the initramfs and make sure they
84 are tried to be loaded via modprobe same as passing
85 rd.driver.pre=DRIVER kernel parameter.
fcbcb252 86 --omit-drivers [LIST] Specify a space-separated list of kernel
ea3c4e82 87 modules not to add to the initramfs.
8fa510d4 88 --filesystems [LIST] Specify a space-separated list of kernel filesystem
ea3c4e82
HH
89 modules to exclusively include in the generic
90 initramfs.
3b403b32 91 -k, --kmoddir [DIR] Specify the directory, where to look for kernel
ea3c4e82 92 modules
3b403b32 93 --fwdir [DIR] Specify additional directories, where to look for
ea3c4e82 94 firmwares, separated by :
33ee031c
HH
95 --kernel-only Only install kernel drivers and firmware files
96 --no-kernel Do not install kernel drivers and firmware files
1743473b 97 --print-cmdline Print the kernel command line for the given disk layout
5bbfd484 98 --early-microcode Combine early microcode with ramdisk
5f2c30d9 99 --no-early-microcode Do not combine early microcode with ramdisk
d20fb951 100 --kernel-cmdline [PARAMETERS] Specify default kernel command line parameters
54e7d7c3 101 --strip Strip binaries in the initramfs
6c128565 102 --nostrip Do not strip binaries in the initramfs
f4a94278
HH
103 --prelink Prelink binaries in the initramfs
104 --noprelink Do not prelink binaries in the initramfs
54e7d7c3 105 --hardlink Hardlink files in the initramfs
04d18f55 106 --nohardlink Do not hardlink files in the initramfs
fd786adc 107 --prefix [DIR] Prefix initramfs files with [DIR]
54e7d7c3 108 --noprefix Do not prefix initramfs files
2f02ae9d
HH
109 --mdadmconf Include local /etc/mdadm.conf
110 --nomdadmconf Do not include local /etc/mdadm.conf
7a34efa5 111 --lvmconf Include local /etc/lvm/lvm.conf
cc02093d 112 --nolvmconf Do not include local /etc/lvm/lvm.conf
25b45979
MS
113 --fscks [LIST] Add a space-separated list of fsck helpers.
114 --nofscks Inhibit installation of any fsck helpers.
ff3953ef 115 --ro-mnt Mount / and /usr read-only by default.
5616feb0 116 -h, --help This message
00531568 117 --debug Output debug information of the build process
57258a2c 118 --profile Output profile information of the build process
e103615b
119 -L, --stdlog [0-6] Specify logging level (to standard error)
120 0 - suppress any messages
121 1 - only fatal errors
122 2 - all errors
123 3 - warnings
54e7d7c3 124 4 - info
e103615b
125 5 - debug info (here starts lots of output)
126 6 - trace info (and even more)
54e7d7c3
HH
127 -v, --verbose Increase verbosity level
128 -q, --quiet Decrease verbosity level
5616feb0
AT
129 -c, --conf [FILE] Specify configuration file to use.
130 Default: /etc/dracut.conf
3b403b32 131 --confdir [DIR] Specify configuration directory to use *.conf files
cc02093d 132 from. Default: /etc/dracut.conf.d
882c4c5a
133 --tmpdir [DIR] Temporary directory to be used instead of default
134 /var/tmp.
5616feb0
AT
135 -l, --local Local mode. Use modules from the current working
136 directory instead of the system-wide installed in
c5a65990 137 /usr/lib/dracut/modules.d.
5616feb0 138 Useful when running dracut from a git checkout.
7c179686 139 -H, --hostonly Host-Only mode: Install only what is needed for
324ea606 140 booting the local host instead of a generic host.
472189da 141 -N, --no-hostonly Disables Host-Only mode
ab9457ef
HH
142 --hostonly-cmdline Store kernel command line arguments needed
143 in the initramfs
144 --no-hostonly-cmdline Do not store kernel command line arguments needed
145 in the initramfs
324ea606
HH
146 --persistent-policy [POLICY]
147 Use [POLICY] to address disks and partitions.
148 POLICY can be any directory name found in /dev/disk.
149 E.g. "by-uuid", "by-label"
7c179686 150 --fstab Use /etc/fstab to determine the root device.
70cb8a68
HH
151 --add-fstab [FILE] Add file to the initramfs fstab
152 --mount "[DEV] [MP] [FSTYPE] [FSOPTS]"
153 Mount device [DEV] on mountpoint [MP] with filesystem
154 [FSTYPE] and options [FSOPTS] in the initramfs
c586b033 155 --add-device "[DEV]" Bring up [DEV] in initramfs
5616feb0 156 -i, --include [SOURCE] [TARGET]
39ff0682
AT
157 Include the files in the SOURCE directory into the
158 Target directory in the final initramfs.
3b403b32 159 If SOURCE is a file, it will be installed to TARGET
4fea3ea6 160 in the final initramfs.
39ff0682
AT
161 -I, --install [LIST] Install the space separated list of files into the
162 initramfs.
54b68829
HH
163 --install-optional [LIST] Install the space separated list of files into the
164 initramfs, if they exist.
5b158ad3 165 --gzip Compress the generated initramfs using gzip.
cc02093d
HH
166 This will be done by default, unless another
167 compression option or --no-compress is passed.
5b158ad3 168 --bzip2 Compress the generated initramfs using bzip2.
cc02093d
HH
169 Make sure your kernel has bzip2 decompression support
170 compiled in, otherwise you will not be able to boot.
171 --lzma Compress the generated initramfs using lzma.
3b403b32 172 Make sure your kernel has lzma support compiled in,
cc02093d 173 otherwise you will not be able to boot.
5e6c3b03
VL
174 --xz Compress the generated initramfs using xz.
175 Make sure that your kernel has xz support compiled
176 in, otherwise you will not be able to boot.
871c8e40 177 --lzo Compress the generated initramfs using lzop.
178 Make sure that your kernel has lzo support compiled
179 in, otherwise you will not be able to boot.
180 --lz4 Compress the generated initramfs using lz4.
181 Make sure that your kernel has lz4 support compiled
182 in, otherwise you will not be able to boot.
5e6c3b03
VL
183 --compress [COMPRESSION] Compress the generated initramfs with the
184 passed compression program. Make sure your kernel
3b403b32 185 knows how to decompress the generated initramfs,
5e6c3b03 186 otherwise you will not be able to boot.
5b158ad3 187 --no-compress Do not compress the generated initramfs. This will
cc02093d 188 override any other compression options.
5b11bb73 189 --list-modules List all available dracut modules.
956af8f2
190 -M, --show-modules Print included module's name to standard output during
191 build.
5fe5c7d0 192 --keep Keep the temporary initramfs for debugging purposes
ec3c5951 193 --printsize Print out the module install size
cdfeb278 194 --sshkey [SSHKEY] Add ssh key to initramfs (use with ssh-client module)
ee54b840 195 --logfile [FILE] Logfile to use (overrides configuration setting)
80626ded 196 --reproducible Create reproducible images
ccaa9bee
HH
197
198If [LIST] has multiple arguments, then you have to put these in quotes.
ffa71b4a 199
ccaa9bee 200For example:
ffa71b4a
HH
201
202 # dracut --add-drivers "module1 module2" ...
203
cc02093d 204EOF
5616feb0
AT
205}
206
8466db96
HH
207# function push()
208# push values to a stack
209# $1 = stack variable
210# $2.. values
211# example:
212# push stack 1 2 "3 4"
213push() {
ffa71b4a 214 local _i
8466db96 215 local __stack=$1; shift
ffa71b4a
HH
216 for _i in "$@"; do
217 eval ${__stack}'[${#'${__stack}'[@]}]="$_i"'
8466db96
HH
218 done
219}
220
221# function pop()
222# pops the last value from a stack
223# assigns value to second argument variable
224# or echo to stdout, if no second argument
225# $1 = stack variable
226# $2 = optional variable to store the value
227# example:
228# pop stack val
229# val=$(pop stack)
230pop() {
231 local __stack=$1; shift
3b403b32 232 local __resultvar=$1
ffa71b4a 233 local _value;
8466db96
HH
234 # check for empty stack
235 eval '[[ ${#'${__stack}'[@]} -eq 0 ]] && return 1'
236
ffa71b4a 237 eval _value='${'${__stack}'[${#'${__stack}'[@]}-1]}'
8466db96
HH
238
239 if [[ "$__resultvar" ]]; then
ffa71b4a 240 eval $__resultvar="'$_value'"
8466db96 241 else
b093aa2d 242 printf "%s" "$_value"
8466db96
HH
243 fi
244 eval unset ${__stack}'[${#'${__stack}'[@]}-1]'
245 return 0
246}
247
5bc545ed
VL
248# Little helper function for reading args from the commandline.
249# it automatically handles -a b and -a=b variants, and returns 1 if
250# we need to shift $3.
251read_arg() {
252 # $1 = arg name
253 # $2 = arg value
254 # $3 = arg parameter
255 local rematch='^[^=]*=(.*)$'
256 if [[ $2 =~ $rematch ]]; then
cc02093d 257 read "$1" <<< "${BASH_REMATCH[1]}"
5bc545ed 258 else
cc02093d
HH
259 read "$1" <<< "$3"
260 # There is no way to shift our callers args, so
261 # return 1 to indicate they should do it instead.
262 return 1
5bc545ed
VL
263 fi
264}
265
335bc217 266dropindirs_sort()
a42b2b81 267{
b093aa2d
HH
268 local suffix=$1; shift
269 local -a files
270 local f d
271
dba20559
HH
272 for d in "$@"; do
273 for i in "$d/"*"$suffix"; do
274 if [[ -e "$i" ]]; then
275 printf "%s\n" "${i##*/}"
276 fi
277 done
278 done | sort -Vu | {
279 readarray -t files
280
281 for f in "${files[@]}"; do
282 for d in "$@"; do
283 if [[ -e "$d/$f" ]]; then
284 printf "%s\n" "$d/$f"
285 continue 2
b093aa2d 286 fi
a42b2b81 287 done
a42b2b81 288 done
dba20559 289 }
a42b2b81
HH
290}
291
659dc319
HB
292rearrange_params()
293{
294 # Workaround -i, --include taking 2 arguments
295 set -- "${@/--include/++include}"
296
297 # This prevents any long argument ending with "-i"
298 # -i, like --opt-i but I think we can just prevent that
299 set -- "${@/%-i/++include}"
300
301 TEMP=$(unset POSIXLY_CORRECT; getopt \
302 -o "a:m:o:d:I:k:c:L:fvqlHhMN" \
303 --long kver: \
304 --long add: \
305 --long force-add: \
306 --long add-drivers: \
cea907f6 307 --long force-drivers: \
659dc319
HB
308 --long omit-drivers: \
309 --long modules: \
310 --long omit: \
311 --long drivers: \
312 --long filesystems: \
313 --long install: \
54b68829 314 --long install-optional: \
659dc319
HB
315 --long fwdir: \
316 --long libdirs: \
317 --long fscks: \
318 --long add-fstab: \
319 --long mount: \
320 --long device: \
321 --long add-device: \
322 --long nofscks: \
323 --long ro-mnt \
324 --long kmoddir: \
325 --long conf: \
326 --long confdir: \
327 --long tmpdir: \
328 --long stdlog: \
329 --long compress: \
330 --long prefix: \
331 --long rebuild: \
332 --long force \
333 --long kernel-only \
334 --long no-kernel \
335 --long print-cmdline \
336 --long kernel-cmdline: \
337 --long strip \
338 --long nostrip \
339 --long prelink \
340 --long noprelink \
341 --long hardlink \
342 --long nohardlink \
343 --long noprefix \
344 --long mdadmconf \
345 --long nomdadmconf \
346 --long lvmconf \
347 --long nolvmconf \
348 --long debug \
349 --long profile \
350 --long sshkey: \
351 --long logfile: \
352 --long verbose \
353 --long quiet \
354 --long local \
355 --long hostonly \
356 --long host-only \
357 --long no-hostonly \
358 --long no-host-only \
646e0506
WC
359 --long hostonly-cmdline \
360 --long no-hostonly-cmdline \
659dc319
HB
361 --long persistent-policy: \
362 --long fstab \
363 --long help \
364 --long bzip2 \
365 --long lzma \
366 --long xz \
367 --long lzo \
368 --long lz4 \
369 --long no-compress \
370 --long gzip \
371 --long list-modules \
372 --long show-modules \
373 --long keep \
374 --long printsize \
375 --long regenerate-all \
376 --long noimageifnotneeded \
377 --long early-microcode \
378 --long no-early-microcode \
80626ded 379 --long reproducible \
659dc319
HB
380 -- "$@")
381
382 if (( $? != 0 )); then
383 usage
384 exit 1
385 fi
386}
387
432196ae 388verbosity_mod_l=0
f79e587c
HH
389unset kernel
390unset outfile
486a1b93 391
659dc319
HB
392rearrange_params "$@"
393eval set -- "$TEMP"
394
395# parse command line args to check if '--rebuild' option is present
396unset append_args_l
397unset rebuild_file
398while :
399do
400 if [ "$1" == "--" ]; then
401 shift; break
402 fi
403 if [ "$1" == "--rebuild" ]; then
404 append_args_l="yes"
405 rebuild_file=$2
406 if [ ! -e $rebuild_file ]; then
407 echo "Image file '$rebuild_file', for rebuild, does not exist!"
408 exit 1
409 fi
410 abs_rebuild_file=$(readlink -f "$rebuild_file") && rebuild_file="$abs_rebuild_file"
411 shift; continue
412 fi
413 shift
414done
415
416# get output file name and kernel version from command line arguments
417while (($# > 0)); do
418 case ${1%%=*} in
419 ++include)
420 shift 2;;
421 *)
422 if ! [[ ${outfile+x} ]]; then
423 outfile=$1
424 elif ! [[ ${kernel+x} ]]; then
425 kernel=$1
426 else
427 printf "\nUnknown arguments: %s\n\n" "$*" >&2
428 usage; exit 1;
429 fi
430 ;;
431 esac
432 shift
433done
434
435# extract input image file provided with rebuild option to get previous parameters, if any
436if [[ $append_args_l == "yes" ]]; then
437 unset rebuild_param
438
439 # determine resultant file
440 if ! [[ $outfile ]]; then
441 outfile=$rebuild_file
442 fi
443
444 if ! rebuild_param=$(lsinitrd $rebuild_file '*lib/dracut/build-parameter.txt'); then
445 echo "Image '$rebuild_file' has no rebuild information stored"
446 exit 1
447 fi
448
449 # prepend previous parameters to current command line args
450 if [[ $rebuild_param ]]; then
451 TEMP="$rebuild_param $TEMP"
452 eval set -- "$TEMP"
453 rearrange_params "$@"
454 fi
455
456 # clean the temporarily used scratch-pad directory
457 rm -rf $scratch_dir
ffa71b4a
HH
458fi
459
659dc319
HB
460unset PARMS_TO_STORE
461PARMS_TO_STORE=""
462
ffa71b4a
HH
463eval set -- "$TEMP"
464
465while :; do
659dc319
HB
466 if [ $1 != "--" ] && [ $1 != "--rebuild" ]; then
467 PARMS_TO_STORE+=" $1";
468 fi
ffa71b4a 469 case $1 in
659dc319
HB
470 --kver) kernel="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
471 -a|--add) push add_dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
472 --force-add) push force_add_dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
473 --add-drivers) push add_drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
cea907f6 474 --force-drivers) push force_drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
659dc319
HB
475 --omit-drivers) push omit_drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
476 -m|--modules) push dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
477 -o|--omit) push omit_dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
478 -d|--drivers) push drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
479 --filesystems) push filesystems_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
480 -I|--install) push install_items_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
54b68829
HH
481 --install-optional)
482 push install_optional_items_l \
483 "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
659dc319
HB
484 --fwdir) push fw_dir_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
485 --libdirs) push libdirs_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
486 --fscks) push fscks_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
487 --add-fstab) push add_fstab_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
488 --mount) push fstab_lines "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
c586b033 489 --add-device|--device)
659dc319
HB
490 push add_device_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
491 --kernel-cmdline) push kernel_cmdline_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
25b45979 492 --nofscks) nofscks_l="yes";;
ff3953ef 493 --ro-mnt) ro_mnt_l="yes";;
659dc319
HB
494 -k|--kmoddir) drivers_dir_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
495 -c|--conf) conffile="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
496 --confdir) confdir="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
497 --tmpdir) tmpdir_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
498 -L|--stdlog) stdloglvl_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
499 --compress) compress_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
500 --prefix) prefix_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
501 --rebuild) if [ $rebuild_file == $outfile ]; then
502 force=yes
503 fi
504 shift
505 ;;
cc02093d
HH
506 -f|--force) force=yes;;
507 --kernel-only) kernel_only="yes"; no_kernel="no";;
508 --no-kernel) kernel_only="no"; no_kernel="yes";;
ab9457ef
HH
509 --print-cmdline)
510 print_cmdline="yes"; hostonly_l="yes"; kernel_only="yes"; no_kernel="yes";;
511 --early-microcode)
512 early_microcode_l="yes";;
513 --no-early-microcode)
514 early_microcode_l="no";;
cc02093d
HH
515 --strip) do_strip_l="yes";;
516 --nostrip) do_strip_l="no";;
f4a94278
HH
517 --prelink) do_prelink_l="yes";;
518 --noprelink) do_prelink_l="no";;
04d18f55
HH
519 --hardlink) do_hardlink_l="yes";;
520 --nohardlink) do_hardlink_l="no";;
fd786adc 521 --noprefix) prefix_l="/";;
690396a5
VL
522 --mdadmconf) mdadmconf_l="yes";;
523 --nomdadmconf) mdadmconf_l="no";;
524 --lvmconf) lvmconf_l="yes";;
525 --nolvmconf) lvmconf_l="no";;
cc02093d 526 --debug) debug="yes";;
57258a2c 527 --profile) profile="yes";;
659dc319 528 --sshkey) sshkey="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
ee54b840 529 --logfile) logfile_l="$2"; shift;;
432196ae
530 -v|--verbose) ((verbosity_mod_l++));;
531 -q|--quiet) ((verbosity_mod_l--));;
dbf8f6ba
HH
532 -l|--local)
533 allowlocal="yes"
b093aa2d
HH
534 [[ -f "$(readlink -f "${0%/*}")/dracut-functions.sh" ]] \
535 && dracutbasedir="$(readlink -f "${0%/*}")"
dbf8f6ba 536 ;;
ea3c4e82
HH
537 -H|--hostonly|--host-only)
538 hostonly_l="yes" ;;
539 -N|--no-hostonly|--no-host-only)
540 hostonly_l="no" ;;
ab9457ef
HH
541 --hostonly-cmdline)
542 hostonly_cmdline_l="yes" ;;
543 --no-hostonly-cmdline)
544 hostonly_cmdline_l="no" ;;
324ea606 545 --persistent-policy)
659dc319 546 persistent_policy_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
cc02093d 547 --fstab) use_fstab_l="yes" ;;
ffa71b4a 548 -h|--help) long_usage; exit 1 ;;
659dc319 549 -i|--include) push include_src "$2"; PARMS_TO_STORE+=" '$2'";
ffa71b4a 550 shift;;
3a714439
VL
551 --bzip2) compress_l="bzip2";;
552 --lzma) compress_l="lzma";;
553 --xz) compress_l="xz";;
871c8e40 554 --lzo) compress_l="lzo";;
555 --lz4) compress_l="lz4";;
3a714439
VL
556 --no-compress) _no_compress_l="cat";;
557 --gzip) compress_l="gzip";;
ffa71b4a 558 --list-modules) do_list="yes";;
956af8f2
559 -M|--show-modules)
560 show_modules_l="yes"
561 ;;
5fe5c7d0 562 --keep) keep="yes";;
ec3c5951 563 --printsize) printsize="yes";;
7d848c55 564 --regenerate-all) regenerate_all="yes";;
83bb0893 565 --noimageifnotneeded) noimageifnotneeded="yes";;
80626ded 566 --reproducible) reproducible_l="yes";;
ffa71b4a
HH
567 --) shift; break;;
568
569 *) # should not even reach this point
570 printf "\n!Unknown option: '%s'\n\n" "$1" >&2; usage; exit 1;;
571 esac
572 shift
573done
574
575# getopt cannot handle multiple arguments, so just handle "-I,--include"
576# the old fashioned way
577
578while (($# > 0)); do
4eec1a22 579 if [ "${1%%=*}" == "++include" ]; then
659dc319
HB
580 push include_src "$2"
581 push include_target "$3"
582 PARMS_TO_STORE+=" --include '$2' '$3'"
583 shift 2
584 fi
b368a5f3 585 shift
641cc356 586done
ffa71b4a 587
7d848c55
HH
588if [[ $regenerate_all == "yes" ]]; then
589 ret=0
590 if [[ $kernel ]]; then
b093aa2d 591 printf -- "--regenerate-all cannot be called with a kernel version\n" >&2
7d848c55
HH
592 exit 1
593 fi
594
595 if [[ $outfile ]]; then
b093aa2d 596 printf -- "--regenerate-all cannot be called with a image file\n" >&2
7d848c55
HH
597 exit 1
598 fi
599
600 ((len=${#dracut_args[@]}))
601 for ((i=0; i < len; i++)); do
602 [[ ${dracut_args[$i]} == "--regenerate-all" ]] && \
603 unset dracut_args[$i]
604 done
605
606 cd /lib/modules
607 for i in *; do
b29cb516 608 [[ -f $i/modules.dep ]] || [[ -f $i/modules.dep.bin ]] || continue
b093aa2d 609 dracut --kver="$i" "${dracut_args[@]}"
7d848c55
HH
610 ((ret+=$?))
611 done
612 exit $ret
613fi
614
8a5354a9 615if ! [[ $kernel ]]; then
486a1b93
HH
616 kernel=$(uname -r)
617fi
ffa71b4a 618
05214a0b
HH
619if [[ $kernel ]]; then
620 if ! [[ -d /lib/modules/$kernel ]] && [[ $no_kernel != yes ]]; then
621 printf -- "Kernel version $kernel has no module directory /lib/modules/$kernel\n" >&2
622 fi
623fi
624
ffa71b4a 625if ! [[ $outfile ]]; then
cc230300
HH
626 [[ -f /etc/machine-id ]] && read MACHINE_ID < /etc/machine-id
627
628 if [[ $MACHINE_ID ]] && ( [[ -d /boot/${MACHINE_ID} ]] || [[ -L /boot/${MACHINE_ID} ]] ); then
629 outfile="/boot/${MACHINE_ID}/$kernel/initrd"
630 else
631 outfile="/boot/initramfs-$kernel.img"
632 fi
ffa71b4a 633fi
4cba351e 634
02b5c8e3
HH
635unset LC_MESSAGES
636unset LC_CTYPE
637export LC_ALL=C
638export LANG=C
d619fb5e 639unset LD_LIBRARY_PATH
45404a2a 640unset LD_PRELOAD
1fcf2d2f 641unset GREP_OPTIONS
a55711cd 642
89d44e72 643export DRACUT_LOG_LEVEL=warning
3b403b32 644[[ $debug ]] && {
89d44e72 645 export DRACUT_LOG_LEVEL=debug
c36ce334
VL
646 export PS4='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): ';
647 set -x
648}
649
57258a2c
HH
650[[ $profile ]] && {
651 export PS4='+ $(date "+%s.%N") ${BASH_SOURCE}@${LINENO}: ';
652 set -x
653 debug=yes
654}
655
c5a65990 656[[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
5d791c0e 657
f1336ac7 658# if we were not passed a config file, try the default one
42c71947 659if [[ ! -f $conffile ]]; then
b093aa2d
HH
660 if [[ $allowlocal ]]; then
661 conffile="$dracutbasedir/dracut.conf"
662 else
eebc929a 663 conffile="/etc/dracut.conf"
b093aa2d 664 fi
42c71947 665fi
f1336ac7 666
2c2c4580 667if [[ ! -d $confdir ]]; then
b093aa2d
HH
668 if [[ $allowlocal ]]; then
669 confdir="$dracutbasedir/dracut.conf.d"
670 else
eebc929a 671 confdir="/etc/dracut.conf.d"
b093aa2d 672 fi
2c2c4580
HH
673fi
674
2245f372
AB
675# source our config file
676[[ -f $conffile ]] && . "$conffile"
677
2c2c4580 678# source our config dir
335bc217 679for f in $(dropindirs_sort ".conf" "$confdir" "$dracutbasedir/dracut.conf.d"); do
a42b2b81
HH
680 [[ -e $f ]] && . "$f"
681done
2c2c4580 682
5f2baf7d 683DRACUT_PATH=${DRACUT_PATH:-/sbin /bin /usr/sbin /usr/bin}
eab9b75c
HH
684
685for i in $DRACUT_PATH; do
686 rl=$i
687 if [ -L "$i" ]; then
688 rl=$(readlink -f $i)
689 fi
690 if [[ "$NPATH" != *:$rl* ]] ; then
691 NPATH+=":$rl"
692 fi
693done
694export PATH="${NPATH#:}"
695unset NPATH
696
d87c2708 697# these optins add to the stuff in the config file
e5e5c895 698if (( ${#add_dracutmodules_l[@]} )); then
661f9a34
HH
699 while pop add_dracutmodules_l val; do
700 add_dracutmodules+=" $val "
701 done
702fi
703
31f1c02d
AW
704if (( ${#force_add_dracutmodules_l[@]} )); then
705 while pop force_add_dracutmodules_l val; do
706 force_add_dracutmodules+=" $val "
707 done
708fi
709
25b45979
MS
710if (( ${#fscks_l[@]} )); then
711 while pop fscks_l val; do
712 fscks+=" $val "
713 done
714fi
715
70cb8a68
HH
716if (( ${#add_fstab_l[@]} )); then
717 while pop add_fstab_l val; do
718 add_fstab+=" $val "
719 done
720fi
721
722if (( ${#fstab_lines_l[@]} )); then
723 while pop fstab_lines_l val; do
724 push fstab_lines $val
725 done
726fi
727
0ec40e08
HH
728if (( ${#install_items_l[@]} )); then
729 while pop install_items_l val; do
c6c6a088 730 install_items+=" $val "
0ec40e08
HH
731 done
732fi
733
54b68829
HH
734if (( ${#install_optional_items_l[@]} )); then
735 while pop install_optional_items_l val; do
736 install_optional_items+=" $val "
737 done
738fi
739
f1336ac7 740# these options override the stuff in the config file
e5e5c895 741if (( ${#dracutmodules_l[@]} )); then
661f9a34
HH
742 dracutmodules=''
743 while pop dracutmodules_l val; do
744 dracutmodules+="$val "
745 done
746fi
747
e5e5c895 748if (( ${#omit_dracutmodules_l[@]} )); then
661f9a34
HH
749 omit_dracutmodules=''
750 while pop omit_dracutmodules_l val; do
751 omit_dracutmodules+="$val "
752 done
753fi
754
e5e5c895 755if (( ${#filesystems_l[@]} )); then
661f9a34
HH
756 filesystems=''
757 while pop filesystems_l val; do
758 filesystems+="$val "
759 done
760fi
761
e5e5c895 762if (( ${#fw_dir_l[@]} )); then
661f9a34
HH
763 fw_dir=''
764 while pop fw_dir_l val; do
765 fw_dir+="$val "
766 done
767fi
768
c9143a63
JAH
769if (( ${#libdirs_l[@]} )); then
770 libdirs=''
771 while pop libdirs_l val; do
772 libdirs+="$val "
773 done
774fi
775
e103615b 776[[ $stdloglvl_l ]] && stdloglvl=$stdloglvl_l
b991617f 777[[ ! $stdloglvl ]] && stdloglvl=4
432196ae
778stdloglvl=$((stdloglvl + verbosity_mod_l))
779((stdloglvl > 6)) && stdloglvl=6
780((stdloglvl < 0)) && stdloglvl=0
781
26537a5b 782[[ $drivers_dir_l ]] && drivers_dir=$drivers_dir_l
31f7db66 783[[ $do_strip_l ]] && do_strip=$do_strip_l
6c128565 784[[ $do_strip ]] || do_strip=yes
f4a94278
HH
785[[ $do_prelink_l ]] && do_prelink=$do_prelink_l
786[[ $do_prelink ]] || do_prelink=yes
04d18f55
HH
787[[ $do_hardlink_l ]] && do_hardlink=$do_hardlink_l
788[[ $do_hardlink ]] || do_hardlink=yes
fd786adc
HH
789[[ $prefix_l ]] && prefix=$prefix_l
790[[ $prefix = "/" ]] && unset prefix
ba726310 791[[ $hostonly_l ]] && hostonly=$hostonly_l
ab9457ef 792[[ $hostonly_cmdline_l ]] && hostonly_cmdline=$hostonly_cmdline_l
30f6c80d 793[[ "$hostonly" == "yes" ]] && ! [[ $hostonly_cmdline ]] && hostonly_cmdline="yes"
3411ad66 794[[ $persistent_policy_l ]] && persistent_policy=$persistent_policy_l
7c179686 795[[ $use_fstab_l ]] && use_fstab=$use_fstab_l
2f02ae9d 796[[ $mdadmconf_l ]] && mdadmconf=$mdadmconf_l
7a34efa5 797[[ $lvmconf_l ]] && lvmconf=$lvmconf_l
c5a65990 798[[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
8bc650d9 799[[ $fw_dir ]] || fw_dir="/lib/firmware/updates /lib/firmware"
882c4c5a
800[[ $tmpdir_l ]] && tmpdir="$tmpdir_l"
801[[ $tmpdir ]] || tmpdir=/var/tmp
871c8e40 802[[ $INITRD_COMPRESS ]] && compress=$INITRD_COMPRESS
3a714439 803[[ $compress_l ]] && compress=$compress_l
956af8f2 804[[ $show_modules_l ]] && show_modules=$show_modules_l
25b45979 805[[ $nofscks_l ]] && nofscks="yes"
ff3953ef 806[[ $ro_mnt_l ]] && ro_mnt="yes"
b7c770e1
DS
807[[ $early_microcode_l ]] && early_microcode=$early_microcode_l
808[[ $early_microcode ]] || early_microcode=no
ee54b840 809[[ $logfile_l ]] && logfile="$logfile_l"
80626ded
HH
810[[ $reproducible_l ]] && reproducible="$reproducible_l"
811
ddfd1d10
VL
812# eliminate IFS hackery when messing with fw_dir
813fw_dir=${fw_dir//:/ }
9a8a00cf 814
3a714439 815# handle compression options.
55468fb9 816[[ $compress ]] || compress="gzip"
3a714439 817case $compress in
6f223367 818 bzip2) compress="bzip2 -9";;
a76a22b7
KK
819 lzma) compress="lzma -9 -T0";;
820 xz) compress="xz --check=crc32 --lzma2=dict=1MiB -T0";;
80626ded 821 gzip) compress="gzip -n -9 --rsyncable"; command -v pigz > /dev/null 2>&1 && compress="pigz -9 -n -T -R";;
871c8e40 822 lzo) compress="lzop -9";;
8a2db478 823 lz4) compress="lz4 -l -9";;
3a714439
VL
824esac
825if [[ $_no_compress_l = "cat" ]]; then
826 compress="cat"
827fi
828
ba726310 829[[ $hostonly = yes ]] && hostonly="-h"
ba67b923 830[[ $hostonly != "-h" ]] && unset hostonly
ba726310 831
80626ded
HH
832[[ $reproducible == yes ]] && DRACUT_REPRODUCIBLE=1
833
26c231f1 834readonly TMPDIR="$tmpdir"
b093aa2d 835readonly initdir="$(mktemp --tmpdir="$TMPDIR/" -d -t initramfs.XXXXXX)"
26c231f1 836[ -d "$initdir" ] || {
f49ec88a 837 printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t initramfs.XXXXXX failed." >&2
26c231f1
HH
838 exit 1
839}
840
cd08059f 841if [[ $early_microcode = yes ]] || ( [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]] ); then
b5b608e4
TR
842 readonly early_cpio_dir="$(mktemp --tmpdir="$TMPDIR/" -d -t early_cpio.XXXXXX)"
843 [ -d "$early_cpio_dir" ] || {
f49ec88a 844 printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t early_cpio.XXXXXX failed." >&2
5f2c30d9
KRW
845 exit 1
846 }
847fi
d008b6b8 848# clean up after ourselves no matter how we die.
bbaa0d59
HH
849trap '
850 ret=$?;
bbaa0d59 851 [[ $keep ]] && echo "Not removing $initdir." >&2 || { [[ $initdir ]] && rm -rf -- "$initdir"; };
b5b608e4 852 [[ $keep ]] && echo "Not removing $early_cpio_dir." >&2 || { [[ $early_cpio_dir ]] && rm -Rf -- "$early_cpio_dir"; };
bbaa0d59
HH
853 [[ $_dlogdir ]] && rm -Rf -- "$_dlogdir";
854 exit $ret;
855 ' EXIT
856
d008b6b8
HH
857# clean up after ourselves no matter how we die.
858trap 'exit 1;' SIGINT
859
89d44e72
HH
860export DRACUT_KERNEL_LAZY="1"
861export DRACUT_RESOLVE_LAZY="1"
862
535f61ca
HH
863if [[ $print_cmdline ]]; then
864 stdloglvl=0
865 sysloglvl=0
866 fileloglvl=0
867 kmsgloglvl=0
868fi
869
e27ecc9a
HH
870if [[ -f $dracutbasedir/dracut-version.sh ]]; then
871 . $dracutbasedir/dracut-version.sh
872fi
873
552ecca6
HH
874if [[ -f $dracutbasedir/dracut-functions.sh ]]; then
875 . $dracutbasedir/dracut-functions.sh
adbc8a42 876else
b093aa2d
HH
877 printf "%s\n" "dracut: Cannot find $dracutbasedir/dracut-functions.sh." >&2
878 printf "%s\n" "dracut: Are you running from a git checkout?" >&2
879 printf "%s\n" "dracut: Try passing -l as an argument to $0" >&2
cc02093d 880 exit 1
adbc8a42 881fi
22fd1627 882
1743473b
HH
883if ! [[ $print_cmdline ]]; then
884 inst /bin/sh
ffc68f35 885 if ! $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R "$initdir/bin/sh" &>/dev/null; then
1743473b
HH
886 unset DRACUT_RESOLVE_LAZY
887 export DRACUT_RESOLVE_DEPS=1
888 fi
889 rm -fr -- ${initdir}/*
bfd2e8c2 890fi
bfd2e8c2 891
bfd2e8c2 892# Verify bash version, current minimum is 3.1
b093aa2d
HH
893if (( BASH_VERSINFO[0] < 4 )); then
894 dfatal 'You need at least Bash 4 to use dracut, sorry.'
d239b550
MS
895 exit 1
896fi
897
552ecca6 898dracutfunctions=$dracutbasedir/dracut-functions.sh
5cad5bb5 899export dracutfunctions
9a8a00cf 900
fcbcb252
HH
901if (( ${#drivers_l[@]} )); then
902 drivers=''
903 while pop drivers_l val; do
904 drivers+="$val "
905 done
906fi
907drivers=${drivers/-/_}
908
909if (( ${#add_drivers_l[@]} )); then
910 while pop add_drivers_l val; do
911 add_drivers+=" $val "
912 done
913fi
914add_drivers=${add_drivers/-/_}
915
cea907f6
TR
916if (( ${#force_drivers_l[@]} )); then
917 while pop force_drivers_l val; do
918 force_drivers+=" $val "
919 done
920fi
921force_drivers=${force_drivers/-/_}
922
fcbcb252
HH
923if (( ${#omit_drivers_l[@]} )); then
924 while pop omit_drivers_l val; do
925 omit_drivers+=" $val "
926 done
927fi
928omit_drivers=${omit_drivers/-/_}
929
d20fb951
HH
930if (( ${#kernel_cmdline_l[@]} )); then
931 while pop kernel_cmdline_l val; do
932 kernel_cmdline+=" $val "
933 done
934fi
935
34248c92 936omit_drivers_corrected=""
fcbcb252 937for d in $omit_drivers; do
b093aa2d 938 [[ " $drivers $add_drivers " == *\ $d\ * ]] && continue
cea907f6 939 [[ " $drivers $force_drivers " == *\ $d\ * ]] && continue
34248c92 940 omit_drivers_corrected+="$d|"
fcbcb252 941done
34248c92 942omit_drivers="${omit_drivers_corrected%|}"
fcbcb252
HH
943unset omit_drivers_corrected
944
ffa71b4a
HH
945# prepare args for logging
946for ((i=0; i < ${#dracut_args[@]}; i++)); do
b093aa2d 947 [[ "${dracut_args[$i]}" == *\ * ]] && \
ffa71b4a 948 dracut_args[$i]="\"${dracut_args[$i]}\""
a4210166 949 #" keep vim happy
ffa71b4a 950done
535f61ca 951
bbaa0d59 952dinfo "Executing: $0 ${dracut_args[@]}"
58dad702 953
5b11bb73
HH
954[[ $do_list = yes ]] && {
955 for mod in $dracutbasedir/modules.d/*; do
956 [[ -d $mod ]] || continue;
d8e8e14e
957 [[ -e $mod/install || -e $mod/installkernel || \
958 -e $mod/module-setup.sh ]] || continue
b093aa2d 959 printf "%s\n" "${mod##*/??}"
5b11bb73
HH
960 done
961 exit 0
962}
963
66ac3cd1 964# This is kinda legacy -- eventually it should go away.
f1336ac7 965case $dracutmodules in
66ac3cd1 966 ""|auto) dracutmodules="all" ;;
f1336ac7 967esac
e12aac5e 968
454771cd 969abs_outfile=$(readlink -f "$outfile") && outfile="$abs_outfile"
ec9315e5 970
5db6ca5a
HH
971if [[ -d $srcmods ]]; then
972 [[ -f $srcmods/modules.dep ]] || {
973 dwarn "$srcmods/modules.dep is missing. Did you run depmod?"
974 }
975fi
fe1484f3 976
96cf7270
HH
977if [[ ! $print_cmdline ]]; then
978 if [[ -f $outfile && ! $force ]]; then
979 dfatal "Will not override existing initramfs ($outfile) without --force"
980 exit 1
981 fi
982
983 outdir=${outfile%/*}
984 [[ $outdir ]] || outdir="/"
985
986 if [[ ! -d "$outdir" ]]; then
987 dfatal "Can't write to $outdir: Directory $outdir does not exist or is not accessible."
988 exit 1
989 elif [[ ! -w "$outdir" ]]; then
990 dfatal "No permission to write to $outdir."
991 exit 1
992 elif [[ -f "$outfile" && ! -w "$outfile" ]]; then
993 dfatal "No permission to write $outfile."
994 exit 1
995 fi
ec9315e5
JK
996fi
997
8e3f6537
HH
998if [[ $acpi_override = yes ]] && ! check_kernel_config CONFIG_ACPI_INITRD_TABLE_OVERRIDE; then
999 dwarn "Disabling ACPI override, because kernel does not support it. CONFIG_ACPI_INITRD_TABLE_OVERRIDE!=y"
1000 unset acpi_override
1001fi
1002
1003if [[ $early_microcode = yes ]]; then
1004 if [[ $hostonly ]]; then
1005 [[ $(get_cpu_vendor) == "AMD" ]] \
1006 && ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
1007 && unset early_microcode
1008 [[ $(get_cpu_vendor) == "Intel" ]] \
1009 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
1010 && unset early_microcode
1011 else
1012 ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
1013 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
1014 && unset early_microcode
1015 fi
1016 [[ $early_microcode != yes ]] \
1017 && dwarn "Disabling early microcode, because kernel does not support it. CONFIG_MICROCODE_[AMD|INTEL]_EARLY!=y"
1018fi
1019
f6f74096
DD
1020# Need to be able to have non-root users read stuff (rpcbind etc)
1021chmod 755 "$initdir"
1022
5bfa3b36
HH
1023if [[ $hostonly ]]; then
1024 for i in /sys /proc /run /dev; do
5e601454 1025 if ! findmnt --target "$i" &>/dev/null; then
5bfa3b36
HH
1026 dwarning "Turning off host-only mode: '$i' is not mounted!"
1027 unset hostonly
1028 fi
1029 done
1030fi
1031
d351541e
HH
1032declare -A host_fs_types
1033
cd7ff122
AW
1034for line in "${fstab_lines[@]}"; do
1035 set -- $line
1036 #dev mp fs fsopts
d0096de7 1037 push host_devs "$1"
d351541e 1038 host_fs_types["$1"]="$3"
cd7ff122
AW
1039done
1040
1041for f in $add_fstab; do
b093aa2d 1042 [[ -e $f ]] || continue
cd7ff122 1043 while read dev rest; do
b093aa2d
HH
1044 push host_devs "$dev"
1045 done < "$f"
1046done
1047
1048for dev in $add_device; do
1049 push host_devs "$dev"
cd7ff122
AW
1050done
1051
c586b033
CG
1052if (( ${#add_device_l[@]} )); then
1053 while pop add_device_l val; do
1054 add_device+=" $val "
b093aa2d 1055 push host_devs "$val"
c586b033
CG
1056 done
1057fi
1058
7ae5d9d1 1059if [[ $hostonly ]]; then
480d772f
HH
1060 # in hostonly mode, determine all devices, which have to be accessed
1061 # and examine them for filesystem types
1062
bcfbddef 1063 for mp in \
7ae5d9d1
HH
1064 "/" \
1065 "/etc" \
d624f606
HH
1066 "/bin" \
1067 "/sbin" \
1068 "/lib" \
1069 "/lib64" \
af75a298 1070 "/usr" \
9fc14445
HH
1071 "/usr/bin" \
1072 "/usr/sbin" \
1073 "/usr/lib" \
1074 "/usr/lib64" \
a956a464
HH
1075 "/boot" \
1076 "/boot/efi" \
1077 ;
bcfbddef 1078 do
d624f606 1079 mp=$(readlink -f "$mp")
7ae5d9d1 1080 mountpoint "$mp" >/dev/null 2>&1 || continue
a4f7b504 1081 _dev=$(find_block_device "$mp")
e95b6723 1082 _bdev=$(readlink -f "/dev/block/$_dev")
a4f7b504
HH
1083 [[ -b $_bdev ]] && _dev=$_bdev
1084 push host_devs $_dev
8da51857 1085 [[ "$mp" == "/" ]] && root_dev="$_dev"
5a6a98f8 1086 push host_devs "$_dev"
7ae5d9d1 1087 done
dd587549 1088
7fd850d5
HH
1089 if [[ -f /proc/swaps ]] && [[ -f /etc/fstab ]]; then
1090 while read dev type rest; do
1091 [[ -b $dev ]] || continue
1092 [[ "$type" == "partition" ]] || continue
1093
1094 while read _d _m _t _o _r; do
1095 [[ "$_d" == \#* ]] && continue
1096 [[ $_d ]] || continue
546d5dac
HH
1097 [[ $_t != "swap" ]] && continue
1098 [[ $_m != "swap" ]] && [[ $_m != "none" ]] && continue
7fd850d5 1099 [[ "$_o" == *noauto* ]] && continue
c82a1133 1100 _d=$(expand_persistent_dev "$_d")
7fd850d5
HH
1101 [[ "$_d" -ef "$dev" ]] || continue
1102
1103 if [[ -f /etc/crypttab ]]; then
1104 while read _mapper _a _p _o; do
1105 [[ $_mapper = \#* ]] && continue
1106 [[ "$_d" -ef /dev/mapper/"$_mapper" ]] || continue
1107 [[ "$_o" ]] || _o="$_p"
64ae4e07
HH
1108 # skip entries with password files
1109 [[ "$_p" == /* ]] && [[ -f $_p ]] && continue 2
1743473b 1110 # skip mkswap swap
7fd850d5
HH
1111 [[ $_o == *swap* ]] && continue 2
1112 done < /etc/crypttab
1113 fi
bcfbddef 1114
7fd850d5
HH
1115 push host_devs "$(readlink -f "$dev")"
1116 break
1117 done < /etc/fstab
1118 done < /proc/swaps
1119 fi
36b2e5e2
CW
1120 # record all host modaliases
1121 declare -A host_modalias
fc68c87a
HH
1122 find /sys/devices/ -name uevent -print > "$initdir/.modalias"
1123 while read m; do
1124 while read line; do
1125 [[ "$line" != MODALIAS\=* ]] && continue
1126 modalias="${line##MODALIAS=}" && [[ $modalias ]] && host_modalias["$modalias"]=1
3b9aaaab 1127 break
fc68c87a
HH
1128 done < "$m"
1129 done < "$initdir/.modalias"
1130
36b2e5e2
CW
1131 rm -f -- "$initdir/.modalias"
1132
4d7c18c7
HH
1133 while read _k _s _v; do
1134 [ "$_k" != "name" -a "$_k" != "driver" ] && continue
1135 host_modalias["$_v"]=1
1136 done </proc/crypto
1137
36b2e5e2
CW
1138 # check /proc/modules
1139 declare -A host_modules
1140 while read m rest; do
1141 host_modules["$m"]=1
1142 done </proc/modules
7ae5d9d1 1143fi
7ae5d9d1 1144
3c4315fa
HH
1145unset m
1146unset rest
1147
dba20559 1148_get_fs_type() {
19bab59c 1149 [[ $1 ]] || return
e41f3f90
HH
1150 if [[ -b /dev/block/$1 ]]; then
1151 ID_FS_TYPE=$(get_fs_env "/dev/block/$1") && host_fs_types["$(readlink -f "/dev/block/$1")"]="$ID_FS_TYPE"
19bab59c 1152 return 1
cd7ff122 1153 fi
e41f3f90
HH
1154 if [[ -b $1 ]]; then
1155 ID_FS_TYPE=$(get_fs_env "$1") && host_fs_types["$(readlink -f "$1")"]="$ID_FS_TYPE"
19bab59c 1156 return 1
4f10ae2b 1157 fi
b093aa2d 1158 if fstype=$(find_dev_fstype "$1"); then
dba20559 1159 host_fs_types["$1"]="$fstype"
19bab59c 1160 return 1
cd7ff122
AW
1161 fi
1162 return 1
dba20559
HH
1163}
1164
1165for dev in ${host_devs[@]}; do
1166 _get_fs_type "$dev"
1167 check_block_and_slaves_all _get_fs_type "$(get_maj_min "$dev")"
cd7ff122
AW
1168done
1169
8df0b654
HH
1170for dev in "${!host_fs_types[@]}"; do
1171 [[ ${host_fs_types[$dev]} = "reiserfs" ]] || [[ ${host_fs_types[$dev]} = "xfs" ]] || continue
1172 rootopts=$(find_dev_fsopts "$dev")
1173 if [[ ${host_fs_types[$dev]} = "reiserfs" ]]; then
1174 journaldev=$(fs_get_option $rootopts "jdev")
1175 elif [[ ${host_fs_types[$dev]} = "xfs" ]]; then
1176 journaldev=$(fs_get_option $rootopts "logdev")
1177 fi
1178 if [[ $journaldev ]]; then
1179 dev="$(readlink -f "$dev")"
1180 push host_devs "$dev"
1181 _get_fs_type "$dev"
1182 check_block_and_slaves_all _get_fs_type "$(get_maj_min "$dev")"
1183 fi
1184done
1185
d1615612 1186[[ -d $udevdir ]] \
b093aa2d 1187 || udevdir="$(pkg-config udev --variable=udevdir 2>/dev/null)"
d1615612
HH
1188if ! [[ -d "$udevdir" ]]; then
1189 [[ -d /lib/udev ]] && udevdir=/lib/udev
1190 [[ -d /usr/lib/udev ]] && udevdir=/usr/lib/udev
1191fi
1192
1193[[ -d $systemdutildir ]] \
1194 || systemdutildir=$(pkg-config systemd --variable=systemdutildir 2>/dev/null)
d1615612
HH
1195
1196if ! [[ -d "$systemdutildir" ]]; then
1197 [[ -d /lib/systemd ]] && systemdutildir=/lib/systemd
1198 [[ -d /usr/lib/systemd ]] && systemdutildir=/usr/lib/systemd
1199fi
cb8def95
HH
1200
1201[[ -d $systemdsystemunitdir ]] \
1202 || systemdsystemunitdir=$(pkg-config systemd --variable=systemdsystemunitdir 2>/dev/null)
1203
d1615612
HH
1204[[ -d "$systemdsystemunitdir" ]] || systemdsystemunitdir=${systemdutildir}/system
1205
cb8def95
HH
1206[[ -d $systemdsystemconfdir ]] \
1207 || systemdsystemconfdir=$(pkg-config systemd --variable=systemdsystemconfdir 2>/dev/null)
1208
1209[[ -d "$systemdsystemconfdir" ]] || systemdsystemconfdir=/etc/systemd/system
1210
aec9f902 1211export initdir dracutbasedir dracutmodules \
e103615b 1212 fw_dir drivers_dir debug no_kernel kernel_only \
5a6a98f8 1213 omit_drivers mdadmconf lvmconf root_dev \
ff3953ef 1214 use_fstab fstab_lines libdirs fscks nofscks ro_mnt \
1e64e493 1215 stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
dbf8f6ba 1216 debug host_fs_types host_devs sshkey add_fstab \
cb8def95 1217 DRACUT_VERSION udevdir prefix filesystems drivers \
3c4315fa 1218 systemdutildir systemdsystemunitdir systemdsystemconfdir \
ee4b74fb 1219 host_modalias host_modules hostonly_cmdline
f4fff04e 1220
1743473b
HH
1221mods_to_load=""
1222# check all our modules to see if they should be sourced.
1223# This builds a list of modules that we will install next.
1224for_each_module_dir check_module
1225for_each_module_dir check_mount
1226
88c86ac7 1227dracut_module_included "fips" && export DRACUT_FIPS_MODE=1
1743473b
HH
1228
1229if [[ $print_cmdline ]]; then
1230 modules_loaded=" "
1231 # source our modules.
1232 for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1233 _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]}
1234 module_cmdline "$_d_mod"
1235 done
1236 unset moddir
1237 printf "\n"
1238 exit 0
1239fi
1240
dbad9f46 1241# Create some directory structure first
fd786adc 1242[[ $prefix ]] && mkdir -m 0755 -p "${initdir}${prefix}"
dbad9f46 1243
785a6cd2 1244[[ -h /lib ]] || mkdir -m 0755 -p "${initdir}${prefix}/lib"
fd786adc 1245[[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib"
dbad9f46 1246
785a6cd2 1247if [[ $prefix ]]; then
d2a9c4a8 1248 for d in bin etc lib sbin tmp usr var $libdirs; do
b093aa2d 1249 [[ "$d" == */* ]] && continue
785a6cd2
HH
1250 ln -sfn "${prefix#/}/${d#/}" "$initdir/$d"
1251 done
1252fi
1253
1254if [[ $kernel_only != yes ]]; then
3f54a83c 1255 for d in usr/bin usr/sbin bin etc lib sbin tmp usr var $libdirs; do
fd786adc 1256 [[ -e "${initdir}${prefix}/$d" ]] && continue
d433da44
HH
1257 if [ -L "/$d" ]; then
1258 inst_symlink "/$d" "${prefix}/$d"
785a6cd2
HH
1259 else
1260 mkdir -m 0755 -p "${initdir}${prefix}/$d"
1261 fi
3b403b32 1262 done
dbad9f46 1263
8d89fc6b 1264 for d in dev proc sys sysroot root run; do
d433da44
HH
1265 if [ -L "/$d" ]; then
1266 inst_symlink "/$d"
785a6cd2
HH
1267 else
1268 mkdir -m 0755 -p "$initdir/$d"
1269 fi
33ee031c 1270 done
dbad9f46 1271
506b2192
HH
1272 ln -sfn ../run "$initdir/var/run"
1273 ln -sfn ../run/lock "$initdir/var/lock"
3f54a83c 1274 ln -sfn ../run/log "$initdir/var/log"
6f09acf8
HH
1275else
1276 for d in lib "$libdir"; do
1277 [[ -e "${initdir}${prefix}/$d" ]] && continue
1278 if [ -h "/$d" ]; then
1279 inst "/$d" "${prefix}/$d"
1280 else
1281 mkdir -m 0755 -p "${initdir}${prefix}/$d"
1282 fi
1283 done
33ee031c 1284fi
0f86847d 1285
14c47b0e
HH
1286if [[ $kernel_only != yes ]]; then
1287 mkdir -p "${initdir}/etc/cmdline.d"
4fed3ddf
HH
1288 for _d in $hookdirs; do
1289 mkdir -m 0755 -p ${initdir}/lib/dracut/hooks/$_d
1290 done
26144216 1291 if [[ "$UID" = "0" ]]; then
ad200fbc
HH
1292 [ -c ${initdir}/dev/null ] || mknod ${initdir}/dev/null c 1 3
1293 [ -c ${initdir}/dev/kmsg ] || mknod ${initdir}/dev/kmsg c 1 11
1294 [ -c ${initdir}/dev/console ] || mknod ${initdir}/dev/console c 5 1
26144216 1295 fi
14c47b0e 1296fi
96b8d60a 1297
ec3c5951 1298_isize=0 #initramfs size
979c4a93 1299modules_loaded=" "
95bde758 1300# source our modules.
5d791c0e 1301for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
979c4a93 1302 _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]}
b093aa2d
HH
1303 if [[ "$mods_to_load" == *\ $_d_mod\ * ]]; then
1304 if [[ $show_modules = yes ]]; then
1305 printf "%s\n" "$_d_mod"
1306 else
979c4a93 1307 dinfo "*** Including module: $_d_mod ***"
b093aa2d
HH
1308 fi
1309 if [[ $kernel_only == yes ]]; then
1310 module_installkernel "$_d_mod" || {
a6d3be9d
AW
1311 dfatal "installkernel failed in module $_d_mod"
1312 exit 1
1313 }
cc02093d 1314 else
b093aa2d 1315 module_install "$_d_mod"
95d2dabc 1316 if [[ $no_kernel != yes ]]; then
b093aa2d 1317 module_installkernel "$_d_mod" || {
a6d3be9d
AW
1318 dfatal "installkernel failed in module $_d_mod"
1319 exit 1
1320 }
cc02093d
HH
1321 fi
1322 fi
979c4a93
HH
1323 mods_to_load=${mods_to_load// $_d_mod /}
1324 modules_loaded+="$_d_mod "
ec3c5951
DY
1325
1326 #print the module install size
1327 if [ -n "$printsize" ]; then
1328 _isize_new=$(du -sk ${initdir}|cut -f1)
b093aa2d
HH
1329 _isize_delta=$((_isize_new - _isize))
1330 printf "%s\n" "$_d_mod install size: ${_isize_delta}k"
ec3c5951
DY
1331 _isize=$_isize_new
1332 fi
66ac3cd1 1333 fi
15136762 1334done
20abd914 1335unset moddir
0a35a80b
HH
1336
1337for i in $modules_loaded; do
43fed151 1338 mkdir -p $initdir/lib/dracut
b093aa2d 1339 printf "%s\n" "$i" >> $initdir/lib/dracut/modules.txt
0a35a80b
HH
1340done
1341
ea216a65 1342dinfo "*** Including modules done ***"
aabc0553 1343
0f86847d 1344## final stuff that has to happen
89d44e72 1345if [[ $no_kernel != yes ]]; then
aec9f902
HH
1346
1347 if [[ $drivers ]]; then
1348 hostonly='' instmods $drivers
1349 fi
1350
1351 if [[ $add_drivers ]]; then
1352 hostonly='' instmods -c $add_drivers
1353 fi
cea907f6
TR
1354 if [[ $force_drivers ]]; then
1355 hostonly='' instmods -c $force_drivers
1356 rm -f $initdir/etc/cmdline.d/20-force_driver.conf
1357 for mod in $force_drivers; do
1358 echo "rd.driver.pre=$mod" >>$initdir/etc/cmdline.d/20-force_drivers.conf
1359 done
1360 fi
aec9f902
HH
1361 if [[ $filesystems ]]; then
1362 hostonly='' instmods -c $filesystems
1363 fi
1364
89d44e72
HH
1365 dinfo "*** Installing kernel module dependencies and firmware ***"
1366 dracut_kernel_post
1367 dinfo "*** Installing kernel module dependencies and firmware done ***"
83bb0893
HH
1368
1369 if [[ $noimageifnotneeded == yes ]] && [[ $hostonly ]]; then
1370 if [[ ! -f "$initdir/lib/dracut/need-initqueue" ]] && \
1371 [[ -f ${initdir}/lib/modules/$kernel/modules.dep && ! -s ${initdir}/lib/modules/$kernel/modules.dep ]]; then
1372 for i in ${initdir}/etc/cmdline.d/*.conf; do
1373 # We need no initramfs image and do not generate one.
1374 [[ $i == "${initdir}/etc/cmdline.d/*.conf" ]] && exit 0
1375 done
1376 fi
1377 fi
89d44e72 1378fi
d8aeb3a7 1379
998bf6e0 1380if [[ $kernel_only != yes ]]; then
af119460 1381 (( ${#install_items[@]} > 0 )) && inst_multiple ${install_items[@]}
54b68829 1382 (( ${#install_optional_items[@]} > 0 )) && inst_multiple -o ${install_optional_items[@]}
998bf6e0 1383
b093aa2d 1384 [[ $kernel_cmdline ]] && printf "%s\n" "$kernel_cmdline" >> "${initdir}/etc/cmdline.d/01-default.conf"
d20fb951 1385
998bf6e0 1386 while pop fstab_lines line; do
5f6a495b
DY
1387 line=($line)
1388 [ -z "${line[3]}" ] && line[3]="defaults"
1389 [ -z "${line[4]}" ] && line[4]="0"
1390 [ -z "${line[5]}" ] && line[5]="2"
1391 echo "${line[@]}" >> "${initdir}/etc/fstab"
998bf6e0
HH
1392 done
1393
1394 for f in $add_fstab; do
b093aa2d 1395 cat "$f" >> "${initdir}/etc/fstab"
998bf6e0
HH
1396 done
1397
6c6d8057
HH
1398 if [ -d ${initdir}/$systemdutildir ]; then
1399 mkdir -p ${initdir}/etc/conf.d
1400 {
b093aa2d
HH
1401 printf "%s\n" "systemdutildir=\"$systemdutildir\""
1402 printf "%s\n" "systemdsystemunitdir=\"$systemdsystemunitdir\""
1403 printf "%s\n" "systemdsystemconfdir=\"$systemdsystemconfdir\""
6c6d8057
HH
1404 } > ${initdir}/etc/conf.d/systemd.conf
1405 fi
1406
998bf6e0
HH
1407 if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then
1408 dinfo "*** Resolving executable dependencies ***"
1409 find "$initdir" -type f \
1410 '(' -perm -0100 -or -perm -0010 -or -perm -0001 ')' \
1411 -not -path '*.ko' -print0 \
ffc68f35 1412 | xargs -r -0 $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R ${DRACUT_FIPS_MODE:+-H} --
998bf6e0
HH
1413 dinfo "*** Resolving executable dependencies done***"
1414 fi
8dcc4830
HH
1415
1416 # libpthread workaround: pthread_cancel wants to dlopen libgcc_s.so
1417 for _dir in $libdirs; do
1418 for _f in "$_dir/libpthread.so"*; do
1419 [[ -e "$_f" ]] || continue
1420 inst_libdir_file "libgcc_s.so*"
1421 break 2
1422 done
1423 done
998bf6e0
HH
1424fi
1425
661f9a34
HH
1426while pop include_src src && pop include_target tgt; do
1427 if [[ $src && $tgt ]]; then
1428 if [[ -f $src ]]; then
1429 inst $src $tgt
1430 else
3b403b32 1431 ddebug "Including directory: $src"
661f9a34 1432 mkdir -p "${initdir}/${tgt}"
dbad9f46 1433 # check for preexisting symlinks, so we can cope with the
fd786adc 1434 # symlinks to $prefix
dbad9f46
HH
1435 for i in "$src"/*; do
1436 [[ -e "$i" || -h "$i" ]] || continue
1437 s=${initdir}/${tgt}/${i#$src/}
1438 if [[ -d "$i" ]]; then
1439 if ! [[ -e "$s" ]]; then
1440 mkdir -m 0755 -p "$s"
1441 chmod --reference="$i" "$s"
1442 fi
98eb6d57 1443 cp --reflink=auto --sparse=auto -fa -t "$s" "$i"/*
dbad9f46 1444 else
98eb6d57 1445 cp --reflink=auto --sparse=auto -fa -t "$s" "$i"
3b403b32 1446 fi
dbad9f46 1447 done
661f9a34 1448 fi
4fea3ea6 1449 fi
661f9a34 1450done
88ffd2df 1451
14c47b0e 1452if [[ $kernel_only != yes ]]; then
1254925f
HH
1453 # make sure that library links are correct and up to date
1454 for f in /etc/ld.so.conf /etc/ld.so.conf.d/*; do
482c573d 1455 [[ -f $f ]] && inst_simple "$f"
1254925f
HH
1456 done
1457 if ! ldconfig -r "$initdir"; then
1458 if [[ $UID = 0 ]]; then
1459 derror "ldconfig exited ungracefully"
1460 else
1461 derror "ldconfig might need uid=0 (root) for chroot()"
1462 fi
432196ae
1463 fi
1464fi
fdc421db 1465
6cd7001b
HH
1466PRELINK_BIN="$(command -v prelink)"
1467if [[ $UID = 0 ]] && [[ $PRELINK_BIN ]]; then
1468 if [[ $DRACUT_FIPS_MODE ]]; then
1469 dinfo "*** Installing prelink files ***"
1470 inst_multiple -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf /etc/prelink.cache
1471 elif [[ $do_prelink == yes ]]; then
1472 dinfo "*** Pre-linking files ***"
1473 inst_multiple -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf
1474 chroot "$initdir" "$PRELINK_BIN" -a
1475 rm -f -- "$initdir/$PRELINK_BIN"
1476 rm -fr -- "$initdir"/etc/prelink.*
1477 dinfo "*** Pre-linking files done ***"
404815ea
HH
1478 fi
1479fi
1480
1481if [[ $do_hardlink = yes ]] && command -v hardlink >/dev/null; then
1482 dinfo "*** Hardlinking files ***"
1483 hardlink "$initdir" 2>&1
1484 dinfo "*** Hardlinking files done ***"
1485fi
1486
3b403b32 1487# strip binaries
98adb06e 1488if [[ $do_strip = yes ]] ; then
69b35075 1489 for p in strip xargs find; do
cc02093d 1490 if ! type -P $p >/dev/null; then
fefd3f66 1491 dinfo "Could not find '$p'. Not stripping the initramfs."
cc02093d
HH
1492 do_strip=no
1493 fi
31f7db66
HH
1494 done
1495fi
1496
5ae33613 1497if [[ $do_strip = yes ]] && ! [[ $DRACUT_FIPS_MODE ]]; then
89d44e72 1498 dinfo "*** Stripping files ***"
5ae33613
HH
1499 find "$initdir" -type f \
1500 -executable -not -path '*/lib/modules/*.ko' -print0 \
1501 | xargs -r -0 strip -g 2>/dev/null
2d9b156e
HH
1502
1503 # strip kernel modules, but do not touch signed modules
1504 find "$initdir" -type f -path '*/lib/modules/*.ko' -print0 \
1505 | while read -r -d $'\0' f; do
1506 SIG=$(tail -c 28 "$f")
b093aa2d 1507 [[ $SIG == '~Module signature appended~' ]] || { printf "%s\000" "$f"; }
2d9b156e
HH
1508 done | xargs -r -0 strip -g
1509
89d44e72 1510 dinfo "*** Stripping files done ***"
979c4a93 1511fi
5f2c30d9
KRW
1512if [[ $early_microcode = yes ]]; then
1513 dinfo "*** Generating early-microcode cpio image ***"
1514 ucode_dir=(amd-ucode intel-ucode)
1515 ucode_dest=(AuthenticAMD.bin GenuineIntel.bin)
b5b608e4 1516 _dest_dir="$early_cpio_dir/d/kernel/x86/microcode"
5f2c30d9
KRW
1517 _dest_idx="0 1"
1518 mkdir -p $_dest_dir
1519 if [[ $hostonly ]]; then
1520 [[ $(get_cpu_vendor) == "AMD" ]] && _dest_idx="0"
1521 [[ $(get_cpu_vendor) == "Intel" ]] && _dest_idx="1"
1522 fi
1523 for idx in $_dest_idx; do
1524 _fw=${ucode_dir[$idx]}
1525 for _fwdir in $fw_dir; do
1526 if [[ -d $_fwdir && -d $_fwdir/$_fw ]]; then
1527 _src="*"
1528 dinfo "*** Constructing ${ucode_dest[$idx]} ****"
1529 if [[ $hostonly ]]; then
1530 _src=$(get_ucode_file)
d8b04dc1
TR
1531 if ! [[ -r $_fwdir/$_fw/$_src ]];then
1532 break;
1533 fi
5f2c30d9
KRW
1534 fi
1535 cat $_fwdir/$_fw/$_src > $_dest_dir/${ucode_dest[$idx]}
d8b04dc1 1536 create_early_cpio="yes"
5f2c30d9
KRW
1537 fi
1538 done
1539 done
5f2c30d9 1540fi
bbaa0d59 1541
f3b14c2b
TR
1542if [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]]; then
1543 dinfo "*** Packaging ACPI tables to override BIOS provided ones ***"
1544 _dest_dir="$early_cpio_dir/d/kernel/firmware/acpi"
1545 mkdir -p $_dest_dir
1546 for table in $acpi_table_dir/*.aml; do
1547 dinfo " Adding ACPI table: $table"
80626ded 1548 cp -a $table $_dest_dir
f3b14c2b
TR
1549 create_early_cpio="yes"
1550 done
1551fi
1552
659dc319
HB
1553dinfo "*** Store current command line parameters ***"
1554if ! ( echo $PARMS_TO_STORE > $initdir/lib/dracut/build-parameter.txt ); then
1555 dfatal "Could not store the current command line parameters"
1556 exit 1
1557fi
1558
32bd2fbb 1559rm -f -- "$outfile"
89d44e72 1560dinfo "*** Creating image file ***"
c8a9a6b4 1561
80626ded
HH
1562if [[ $DRACUT_REPRODUCIBLE ]]; then
1563 find "$initdir" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1564 | xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1565
1566 [[ "$(cpio --help)" == *--reproducible* ]] && CPIO_REPRODUCIBLE=1
1567fi
1568
c8a9a6b4
HH
1569[[ "$UID" != 0 ]] && cpio_owner_root="-R 0:0"
1570
b5b608e4 1571if [[ $create_early_cpio = yes ]]; then
b9909e33 1572 echo 1 > "$early_cpio_dir/d/early_cpio"
80626ded
HH
1573
1574 if [[ $DRACUT_REPRODUCIBLE ]]; then
1575 find "$early_cpio_dir/d" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1576 | xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1577 fi
1578
5f2c30d9 1579 # The microcode blob is _before_ the initramfs blob, not after
80626ded
HH
1580 (
1581 cd "$early_cpio_dir/d"
1582 find . -print0 | sort -z \
1583 | cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc -o --quiet > $outfile
1584 )
5f2c30d9 1585fi
80626ded
HH
1586
1587if ! (
1588 umask 077; cd "$initdir"
1589 find . -print0 | sort -z \
1590 | cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc -o --quiet \
1591 | $compress >> "$outfile"
1592 ); then
dc4c1ee3 1593 dfatal "dracut: creation of $outfile failed"
734a0d9e 1594 exit 1
3b403b32 1595fi
89d44e72 1596dinfo "*** Creating image file done ***"
432196ae 1597
bbaa0d59 1598if (( maxloglvl >= 5 )); then
dadd2b69
HH
1599 if [[ $allowlocal ]]; then
1600 "$dracutbasedir/lsinitrd.sh" "$outfile"| ddebug
1601 else
1602 lsinitrd "$outfile"| ddebug
1603 fi
bbaa0d59 1604fi
1faecdc1 1605
3da58569 1606exit 0