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