]> git.ipfire.org Git - thirdparty/dracut.git/blame - dracut.sh
lower the log level for dfatal
[thirdparty/dracut.git] / dracut.sh
CommitLineData
6ac2c835 1#!/bin/bash --norc
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.
37383f71 177 --lzo Compress the generated initramfs using lzop.
871c8e40 178 Make sure that your kernel has lzo support compiled
179 in, otherwise you will not be able to boot.
37383f71 180 --lz4 Compress the generated initramfs using lz4.
871c8e40 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
37383f71 197 --loginstall [DIR] Log all files installed from the host to [DIR]
636d2d46
HH
198 --uefi Create an UEFI executable with the kernel cmdline and
199 kernel combined
200 --uefi-stub [FILE] Use the UEFI stub [FILE] to create an UEFI executable
201 --kernel-image [FILE] location of the kernel image
ccaa9bee
HH
202
203If [LIST] has multiple arguments, then you have to put these in quotes.
ffa71b4a 204
ccaa9bee 205For example:
ffa71b4a
HH
206
207 # dracut --add-drivers "module1 module2" ...
208
cc02093d 209EOF
5616feb0
AT
210}
211
8466db96
HH
212# function push()
213# push values to a stack
214# $1 = stack variable
215# $2.. values
216# example:
217# push stack 1 2 "3 4"
218push() {
ffa71b4a 219 local _i
8466db96 220 local __stack=$1; shift
ffa71b4a
HH
221 for _i in "$@"; do
222 eval ${__stack}'[${#'${__stack}'[@]}]="$_i"'
8466db96
HH
223 done
224}
225
118ca9ec
TR
226# Fills up host_devs stack variable and makes sure there are no duplicates
227push_host_devs() {
228 local _dev
229 for _dev in ${host_devs[@]}; do
230 [ "$_dev" = "$1" ] && return
231 done
232 push host_devs "$1"
233}
234
235
8466db96
HH
236# function pop()
237# pops the last value from a stack
238# assigns value to second argument variable
239# or echo to stdout, if no second argument
240# $1 = stack variable
241# $2 = optional variable to store the value
242# example:
243# pop stack val
244# val=$(pop stack)
245pop() {
246 local __stack=$1; shift
3b403b32 247 local __resultvar=$1
ffa71b4a 248 local _value;
8466db96
HH
249 # check for empty stack
250 eval '[[ ${#'${__stack}'[@]} -eq 0 ]] && return 1'
251
ffa71b4a 252 eval _value='${'${__stack}'[${#'${__stack}'[@]}-1]}'
8466db96
HH
253
254 if [[ "$__resultvar" ]]; then
ffa71b4a 255 eval $__resultvar="'$_value'"
8466db96 256 else
b093aa2d 257 printf "%s" "$_value"
8466db96
HH
258 fi
259 eval unset ${__stack}'[${#'${__stack}'[@]}-1]'
260 return 0
261}
262
5bc545ed
VL
263# Little helper function for reading args from the commandline.
264# it automatically handles -a b and -a=b variants, and returns 1 if
265# we need to shift $3.
266read_arg() {
267 # $1 = arg name
268 # $2 = arg value
269 # $3 = arg parameter
270 local rematch='^[^=]*=(.*)$'
271 if [[ $2 =~ $rematch ]]; then
cc02093d 272 read "$1" <<< "${BASH_REMATCH[1]}"
5bc545ed 273 else
cc02093d
HH
274 read "$1" <<< "$3"
275 # There is no way to shift our callers args, so
276 # return 1 to indicate they should do it instead.
277 return 1
5bc545ed
VL
278 fi
279}
280
335bc217 281dropindirs_sort()
a42b2b81 282{
b093aa2d
HH
283 local suffix=$1; shift
284 local -a files
285 local f d
286
dba20559
HH
287 for d in "$@"; do
288 for i in "$d/"*"$suffix"; do
289 if [[ -e "$i" ]]; then
290 printf "%s\n" "${i##*/}"
291 fi
292 done
293 done | sort -Vu | {
294 readarray -t files
295
296 for f in "${files[@]}"; do
297 for d in "$@"; do
298 if [[ -e "$d/$f" ]]; then
299 printf "%s\n" "$d/$f"
300 continue 2
b093aa2d 301 fi
a42b2b81 302 done
a42b2b81 303 done
dba20559 304 }
a42b2b81
HH
305}
306
659dc319
HB
307rearrange_params()
308{
309 # Workaround -i, --include taking 2 arguments
310 set -- "${@/--include/++include}"
311
312 # This prevents any long argument ending with "-i"
313 # -i, like --opt-i but I think we can just prevent that
314 set -- "${@/%-i/++include}"
315
316 TEMP=$(unset POSIXLY_CORRECT; getopt \
317 -o "a:m:o:d:I:k:c:L:fvqlHhMN" \
318 --long kver: \
319 --long add: \
320 --long force-add: \
321 --long add-drivers: \
cea907f6 322 --long force-drivers: \
659dc319
HB
323 --long omit-drivers: \
324 --long modules: \
325 --long omit: \
326 --long drivers: \
327 --long filesystems: \
328 --long install: \
54b68829 329 --long install-optional: \
659dc319
HB
330 --long fwdir: \
331 --long libdirs: \
332 --long fscks: \
333 --long add-fstab: \
334 --long mount: \
335 --long device: \
336 --long add-device: \
337 --long nofscks: \
338 --long ro-mnt \
339 --long kmoddir: \
340 --long conf: \
341 --long confdir: \
342 --long tmpdir: \
343 --long stdlog: \
344 --long compress: \
345 --long prefix: \
346 --long rebuild: \
347 --long force \
348 --long kernel-only \
349 --long no-kernel \
350 --long print-cmdline \
351 --long kernel-cmdline: \
352 --long strip \
353 --long nostrip \
354 --long prelink \
355 --long noprelink \
356 --long hardlink \
357 --long nohardlink \
358 --long noprefix \
359 --long mdadmconf \
360 --long nomdadmconf \
361 --long lvmconf \
362 --long nolvmconf \
363 --long debug \
364 --long profile \
365 --long sshkey: \
366 --long logfile: \
367 --long verbose \
368 --long quiet \
369 --long local \
370 --long hostonly \
371 --long host-only \
372 --long no-hostonly \
373 --long no-host-only \
646e0506
WC
374 --long hostonly-cmdline \
375 --long no-hostonly-cmdline \
659dc319
HB
376 --long persistent-policy: \
377 --long fstab \
378 --long help \
379 --long bzip2 \
380 --long lzma \
381 --long xz \
382 --long lzo \
383 --long lz4 \
384 --long no-compress \
385 --long gzip \
386 --long list-modules \
387 --long show-modules \
388 --long keep \
389 --long printsize \
390 --long regenerate-all \
391 --long noimageifnotneeded \
392 --long early-microcode \
393 --long no-early-microcode \
80626ded 394 --long reproducible \
37383f71 395 --long loginstall: \
636d2d46
HH
396 --long uefi \
397 --long uefi-stub: \
398 --long kernel-image: \
659dc319
HB
399 -- "$@")
400
401 if (( $? != 0 )); then
402 usage
403 exit 1
404 fi
405}
406
432196ae 407verbosity_mod_l=0
f79e587c
HH
408unset kernel
409unset outfile
486a1b93 410
659dc319
HB
411rearrange_params "$@"
412eval set -- "$TEMP"
413
414# parse command line args to check if '--rebuild' option is present
415unset append_args_l
416unset rebuild_file
417while :
418do
419 if [ "$1" == "--" ]; then
420 shift; break
421 fi
422 if [ "$1" == "--rebuild" ]; then
423 append_args_l="yes"
424 rebuild_file=$2
425 if [ ! -e $rebuild_file ]; then
426 echo "Image file '$rebuild_file', for rebuild, does not exist!"
427 exit 1
428 fi
429 abs_rebuild_file=$(readlink -f "$rebuild_file") && rebuild_file="$abs_rebuild_file"
430 shift; continue
431 fi
432 shift
433done
434
435# get output file name and kernel version from command line arguments
436while (($# > 0)); do
437 case ${1%%=*} in
438 ++include)
439 shift 2;;
440 *)
441 if ! [[ ${outfile+x} ]]; then
442 outfile=$1
443 elif ! [[ ${kernel+x} ]]; then
444 kernel=$1
445 else
446 printf "\nUnknown arguments: %s\n\n" "$*" >&2
447 usage; exit 1;
448 fi
449 ;;
450 esac
451 shift
452done
453
454# extract input image file provided with rebuild option to get previous parameters, if any
455if [[ $append_args_l == "yes" ]]; then
456 unset rebuild_param
457
458 # determine resultant file
459 if ! [[ $outfile ]]; then
460 outfile=$rebuild_file
461 fi
462
463 if ! rebuild_param=$(lsinitrd $rebuild_file '*lib/dracut/build-parameter.txt'); then
464 echo "Image '$rebuild_file' has no rebuild information stored"
465 exit 1
466 fi
467
468 # prepend previous parameters to current command line args
469 if [[ $rebuild_param ]]; then
470 TEMP="$rebuild_param $TEMP"
471 eval set -- "$TEMP"
472 rearrange_params "$@"
473 fi
474
475 # clean the temporarily used scratch-pad directory
476 rm -rf $scratch_dir
ffa71b4a
HH
477fi
478
659dc319
HB
479unset PARMS_TO_STORE
480PARMS_TO_STORE=""
481
ffa71b4a
HH
482eval set -- "$TEMP"
483
484while :; do
659dc319
HB
485 if [ $1 != "--" ] && [ $1 != "--rebuild" ]; then
486 PARMS_TO_STORE+=" $1";
487 fi
ffa71b4a 488 case $1 in
659dc319
HB
489 --kver) kernel="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
490 -a|--add) push add_dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
491 --force-add) push force_add_dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
492 --add-drivers) push add_drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
cea907f6 493 --force-drivers) push force_drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
659dc319
HB
494 --omit-drivers) push omit_drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
495 -m|--modules) push dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
496 -o|--omit) push omit_dracutmodules_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
497 -d|--drivers) push drivers_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
498 --filesystems) push filesystems_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
499 -I|--install) push install_items_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
54b68829
HH
500 --install-optional)
501 push install_optional_items_l \
502 "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
659dc319
HB
503 --fwdir) push fw_dir_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
504 --libdirs) push libdirs_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
505 --fscks) push fscks_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
506 --add-fstab) push add_fstab_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
507 --mount) push fstab_lines "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
c586b033 508 --add-device|--device)
659dc319
HB
509 push add_device_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
510 --kernel-cmdline) push kernel_cmdline_l "$2"; PARMS_TO_STORE+=" '$2'"; shift;;
25b45979 511 --nofscks) nofscks_l="yes";;
ff3953ef 512 --ro-mnt) ro_mnt_l="yes";;
659dc319
HB
513 -k|--kmoddir) drivers_dir_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
514 -c|--conf) conffile="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
515 --confdir) confdir="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
516 --tmpdir) tmpdir_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
517 -L|--stdlog) stdloglvl_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
518 --compress) compress_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
519 --prefix) prefix_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
37383f71 520 --loginstall) loginstall_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
659dc319
HB
521 --rebuild) if [ $rebuild_file == $outfile ]; then
522 force=yes
523 fi
524 shift
525 ;;
cc02093d
HH
526 -f|--force) force=yes;;
527 --kernel-only) kernel_only="yes"; no_kernel="no";;
528 --no-kernel) kernel_only="no"; no_kernel="yes";;
ab9457ef
HH
529 --print-cmdline)
530 print_cmdline="yes"; hostonly_l="yes"; kernel_only="yes"; no_kernel="yes";;
531 --early-microcode)
532 early_microcode_l="yes";;
533 --no-early-microcode)
534 early_microcode_l="no";;
cc02093d
HH
535 --strip) do_strip_l="yes";;
536 --nostrip) do_strip_l="no";;
f4a94278
HH
537 --prelink) do_prelink_l="yes";;
538 --noprelink) do_prelink_l="no";;
04d18f55
HH
539 --hardlink) do_hardlink_l="yes";;
540 --nohardlink) do_hardlink_l="no";;
fd786adc 541 --noprefix) prefix_l="/";;
690396a5
VL
542 --mdadmconf) mdadmconf_l="yes";;
543 --nomdadmconf) mdadmconf_l="no";;
544 --lvmconf) lvmconf_l="yes";;
545 --nolvmconf) lvmconf_l="no";;
cc02093d 546 --debug) debug="yes";;
57258a2c 547 --profile) profile="yes";;
659dc319 548 --sshkey) sshkey="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
ee54b840 549 --logfile) logfile_l="$2"; shift;;
432196ae
550 -v|--verbose) ((verbosity_mod_l++));;
551 -q|--quiet) ((verbosity_mod_l--));;
dbf8f6ba
HH
552 -l|--local)
553 allowlocal="yes"
b093aa2d
HH
554 [[ -f "$(readlink -f "${0%/*}")/dracut-functions.sh" ]] \
555 && dracutbasedir="$(readlink -f "${0%/*}")"
dbf8f6ba 556 ;;
ea3c4e82
HH
557 -H|--hostonly|--host-only)
558 hostonly_l="yes" ;;
559 -N|--no-hostonly|--no-host-only)
560 hostonly_l="no" ;;
ab9457ef
HH
561 --hostonly-cmdline)
562 hostonly_cmdline_l="yes" ;;
563 --no-hostonly-cmdline)
564 hostonly_cmdline_l="no" ;;
324ea606 565 --persistent-policy)
659dc319 566 persistent_policy_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
cc02093d 567 --fstab) use_fstab_l="yes" ;;
ffa71b4a 568 -h|--help) long_usage; exit 1 ;;
659dc319 569 -i|--include) push include_src "$2"; PARMS_TO_STORE+=" '$2'";
ffa71b4a 570 shift;;
3a714439
VL
571 --bzip2) compress_l="bzip2";;
572 --lzma) compress_l="lzma";;
573 --xz) compress_l="xz";;
871c8e40 574 --lzo) compress_l="lzo";;
575 --lz4) compress_l="lz4";;
3a714439
VL
576 --no-compress) _no_compress_l="cat";;
577 --gzip) compress_l="gzip";;
ffa71b4a 578 --list-modules) do_list="yes";;
956af8f2
579 -M|--show-modules)
580 show_modules_l="yes"
581 ;;
5fe5c7d0 582 --keep) keep="yes";;
ec3c5951 583 --printsize) printsize="yes";;
7d848c55 584 --regenerate-all) regenerate_all="yes";;
83bb0893 585 --noimageifnotneeded) noimageifnotneeded="yes";;
80626ded 586 --reproducible) reproducible_l="yes";;
636d2d46
HH
587 --uefi) uefi="yes";;
588 --uefi-stub)
589 uefi_stub_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
590 --kernel-image)
591 kernel_image_l="$2"; PARMS_TO_STORE+=" '$2'"; shift;;
ffa71b4a
HH
592 --) shift; break;;
593
594 *) # should not even reach this point
595 printf "\n!Unknown option: '%s'\n\n" "$1" >&2; usage; exit 1;;
596 esac
597 shift
598done
599
600# getopt cannot handle multiple arguments, so just handle "-I,--include"
601# the old fashioned way
602
603while (($# > 0)); do
4eec1a22 604 if [ "${1%%=*}" == "++include" ]; then
659dc319
HB
605 push include_src "$2"
606 push include_target "$3"
607 PARMS_TO_STORE+=" --include '$2' '$3'"
608 shift 2
609 fi
b368a5f3 610 shift
641cc356 611done
ffa71b4a 612
7d848c55
HH
613if [[ $regenerate_all == "yes" ]]; then
614 ret=0
615 if [[ $kernel ]]; then
b093aa2d 616 printf -- "--regenerate-all cannot be called with a kernel version\n" >&2
7d848c55
HH
617 exit 1
618 fi
619
620 if [[ $outfile ]]; then
b093aa2d 621 printf -- "--regenerate-all cannot be called with a image file\n" >&2
7d848c55
HH
622 exit 1
623 fi
624
625 ((len=${#dracut_args[@]}))
626 for ((i=0; i < len; i++)); do
627 [[ ${dracut_args[$i]} == "--regenerate-all" ]] && \
628 unset dracut_args[$i]
629 done
630
631 cd /lib/modules
632 for i in *; do
b29cb516 633 [[ -f $i/modules.dep ]] || [[ -f $i/modules.dep.bin ]] || continue
b093aa2d 634 dracut --kver="$i" "${dracut_args[@]}"
7d848c55
HH
635 ((ret+=$?))
636 done
637 exit $ret
638fi
639
8a5354a9 640if ! [[ $kernel ]]; then
486a1b93
HH
641 kernel=$(uname -r)
642fi
ffa71b4a 643
05214a0b
HH
644if [[ $kernel ]]; then
645 if ! [[ -d /lib/modules/$kernel ]] && [[ $no_kernel != yes ]]; then
646 printf -- "Kernel version $kernel has no module directory /lib/modules/$kernel\n" >&2
647 fi
648fi
649
ffa71b4a 650if ! [[ $outfile ]]; then
cc230300
HH
651 [[ -f /etc/machine-id ]] && read MACHINE_ID < /etc/machine-id
652
653 if [[ $MACHINE_ID ]] && ( [[ -d /boot/${MACHINE_ID} ]] || [[ -L /boot/${MACHINE_ID} ]] ); then
654 outfile="/boot/${MACHINE_ID}/$kernel/initrd"
655 else
656 outfile="/boot/initramfs-$kernel.img"
657 fi
ffa71b4a 658fi
4cba351e 659
02b5c8e3
HH
660unset LC_MESSAGES
661unset LC_CTYPE
662export LC_ALL=C
663export LANG=C
d619fb5e 664unset LD_LIBRARY_PATH
45404a2a 665unset LD_PRELOAD
1fcf2d2f 666unset GREP_OPTIONS
a55711cd 667
89d44e72 668export DRACUT_LOG_LEVEL=warning
3b403b32 669[[ $debug ]] && {
89d44e72 670 export DRACUT_LOG_LEVEL=debug
c36ce334
VL
671 export PS4='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): ';
672 set -x
673}
674
57258a2c
HH
675[[ $profile ]] && {
676 export PS4='+ $(date "+%s.%N") ${BASH_SOURCE}@${LINENO}: ';
677 set -x
678 debug=yes
679}
680
c5a65990 681[[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
5d791c0e 682
f1336ac7 683# if we were not passed a config file, try the default one
42c71947 684if [[ ! -f $conffile ]]; then
b093aa2d
HH
685 if [[ $allowlocal ]]; then
686 conffile="$dracutbasedir/dracut.conf"
687 else
eebc929a 688 conffile="/etc/dracut.conf"
b093aa2d 689 fi
42c71947 690fi
f1336ac7 691
2c2c4580 692if [[ ! -d $confdir ]]; then
b093aa2d
HH
693 if [[ $allowlocal ]]; then
694 confdir="$dracutbasedir/dracut.conf.d"
695 else
eebc929a 696 confdir="/etc/dracut.conf.d"
b093aa2d 697 fi
2c2c4580
HH
698fi
699
2245f372
AB
700# source our config file
701[[ -f $conffile ]] && . "$conffile"
702
2c2c4580 703# source our config dir
335bc217 704for f in $(dropindirs_sort ".conf" "$confdir" "$dracutbasedir/dracut.conf.d"); do
a42b2b81
HH
705 [[ -e $f ]] && . "$f"
706done
2c2c4580 707
5f2baf7d 708DRACUT_PATH=${DRACUT_PATH:-/sbin /bin /usr/sbin /usr/bin}
eab9b75c
HH
709
710for i in $DRACUT_PATH; do
711 rl=$i
712 if [ -L "$i" ]; then
713 rl=$(readlink -f $i)
714 fi
715 if [[ "$NPATH" != *:$rl* ]] ; then
716 NPATH+=":$rl"
717 fi
718done
719export PATH="${NPATH#:}"
720unset NPATH
721
d87c2708 722# these optins add to the stuff in the config file
e5e5c895 723if (( ${#add_dracutmodules_l[@]} )); then
661f9a34
HH
724 while pop add_dracutmodules_l val; do
725 add_dracutmodules+=" $val "
726 done
727fi
728
31f1c02d
AW
729if (( ${#force_add_dracutmodules_l[@]} )); then
730 while pop force_add_dracutmodules_l val; do
731 force_add_dracutmodules+=" $val "
732 done
733fi
734
25b45979
MS
735if (( ${#fscks_l[@]} )); then
736 while pop fscks_l val; do
737 fscks+=" $val "
738 done
739fi
740
70cb8a68
HH
741if (( ${#add_fstab_l[@]} )); then
742 while pop add_fstab_l val; do
743 add_fstab+=" $val "
744 done
745fi
746
747if (( ${#fstab_lines_l[@]} )); then
748 while pop fstab_lines_l val; do
749 push fstab_lines $val
750 done
751fi
752
0ec40e08
HH
753if (( ${#install_items_l[@]} )); then
754 while pop install_items_l val; do
c6c6a088 755 install_items+=" $val "
0ec40e08
HH
756 done
757fi
758
54b68829
HH
759if (( ${#install_optional_items_l[@]} )); then
760 while pop install_optional_items_l val; do
761 install_optional_items+=" $val "
762 done
763fi
764
f1336ac7 765# these options override the stuff in the config file
e5e5c895 766if (( ${#dracutmodules_l[@]} )); then
661f9a34
HH
767 dracutmodules=''
768 while pop dracutmodules_l val; do
769 dracutmodules+="$val "
770 done
771fi
772
e5e5c895 773if (( ${#omit_dracutmodules_l[@]} )); then
661f9a34
HH
774 omit_dracutmodules=''
775 while pop omit_dracutmodules_l val; do
776 omit_dracutmodules+="$val "
777 done
778fi
779
e5e5c895 780if (( ${#filesystems_l[@]} )); then
661f9a34
HH
781 filesystems=''
782 while pop filesystems_l val; do
783 filesystems+="$val "
784 done
785fi
786
e5e5c895 787if (( ${#fw_dir_l[@]} )); then
661f9a34
HH
788 fw_dir=''
789 while pop fw_dir_l val; do
790 fw_dir+="$val "
791 done
792fi
793
c9143a63
JAH
794if (( ${#libdirs_l[@]} )); then
795 libdirs=''
796 while pop libdirs_l val; do
797 libdirs+="$val "
798 done
799fi
800
e103615b 801[[ $stdloglvl_l ]] && stdloglvl=$stdloglvl_l
b991617f 802[[ ! $stdloglvl ]] && stdloglvl=4
432196ae
803stdloglvl=$((stdloglvl + verbosity_mod_l))
804((stdloglvl > 6)) && stdloglvl=6
805((stdloglvl < 0)) && stdloglvl=0
806
26537a5b 807[[ $drivers_dir_l ]] && drivers_dir=$drivers_dir_l
31f7db66 808[[ $do_strip_l ]] && do_strip=$do_strip_l
6c128565 809[[ $do_strip ]] || do_strip=yes
f4a94278
HH
810[[ $do_prelink_l ]] && do_prelink=$do_prelink_l
811[[ $do_prelink ]] || do_prelink=yes
04d18f55
HH
812[[ $do_hardlink_l ]] && do_hardlink=$do_hardlink_l
813[[ $do_hardlink ]] || do_hardlink=yes
fd786adc
HH
814[[ $prefix_l ]] && prefix=$prefix_l
815[[ $prefix = "/" ]] && unset prefix
ba726310 816[[ $hostonly_l ]] && hostonly=$hostonly_l
ab9457ef 817[[ $hostonly_cmdline_l ]] && hostonly_cmdline=$hostonly_cmdline_l
30f6c80d 818[[ "$hostonly" == "yes" ]] && ! [[ $hostonly_cmdline ]] && hostonly_cmdline="yes"
3411ad66 819[[ $persistent_policy_l ]] && persistent_policy=$persistent_policy_l
7c179686 820[[ $use_fstab_l ]] && use_fstab=$use_fstab_l
2f02ae9d 821[[ $mdadmconf_l ]] && mdadmconf=$mdadmconf_l
7a34efa5 822[[ $lvmconf_l ]] && lvmconf=$lvmconf_l
c5a65990 823[[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
b52cfbea 824[[ $fw_dir ]] || fw_dir="/lib/firmware/updates /lib/firmware /lib/firmware/$kernel"
882c4c5a
825[[ $tmpdir_l ]] && tmpdir="$tmpdir_l"
826[[ $tmpdir ]] || tmpdir=/var/tmp
871c8e40 827[[ $INITRD_COMPRESS ]] && compress=$INITRD_COMPRESS
3a714439 828[[ $compress_l ]] && compress=$compress_l
956af8f2 829[[ $show_modules_l ]] && show_modules=$show_modules_l
25b45979 830[[ $nofscks_l ]] && nofscks="yes"
ff3953ef 831[[ $ro_mnt_l ]] && ro_mnt="yes"
b7c770e1
DS
832[[ $early_microcode_l ]] && early_microcode=$early_microcode_l
833[[ $early_microcode ]] || early_microcode=no
ee54b840 834[[ $logfile_l ]] && logfile="$logfile_l"
80626ded 835[[ $reproducible_l ]] && reproducible="$reproducible_l"
37383f71 836[[ $loginstall_l ]] && loginstall="$loginstall_l"
636d2d46
HH
837[[ $uefi_stub_l ]] && uefi_stub="$uefi_stub_l"
838[[ $kernel_image_l ]] && kernel_image="$kernel_image_l"
80626ded 839
ddfd1d10
VL
840# eliminate IFS hackery when messing with fw_dir
841fw_dir=${fw_dir//:/ }
9a8a00cf 842
3838dc47 843# check for logfile and try to create one if it doesn't exist
844if [[ -n "$logfile" ]];then
845 if [[ ! -f "$logfile" ]];then
846 touch "$logfile"
847 if [ ! $? -eq 0 ] ;then
848 printf "%s\n" "dracut: touch $logfile failed." >&2
849 fi
850 fi
851fi
852
3a714439 853# handle compression options.
55468fb9 854[[ $compress ]] || compress="gzip"
3a714439 855case $compress in
ee846409
VS
856 bzip2) compress="bzip2 -9";
857 command -v lbzip2 > /dev/null 2>&1 && compress="lbzip2 -9";;
a76a22b7
KK
858 lzma) compress="lzma -9 -T0";;
859 xz) compress="xz --check=crc32 --lzma2=dict=1MiB -T0";;
66fd7e43
HH
860 gzip) compress="gzip -n -9";
861 if command -v pigz > /dev/null 2>&1; then
862 compress="pigz -9 -n -T -R"
863 elif command -v gzip --help 2>&1 | grep -q rsyncable; then
864 compress="gzip -n -9 --rsyncable"
865 fi
866 ;;
871c8e40 867 lzo) compress="lzop -9";;
8a2db478 868 lz4) compress="lz4 -l -9";;
3a714439
VL
869esac
870if [[ $_no_compress_l = "cat" ]]; then
871 compress="cat"
872fi
873
ba726310 874[[ $hostonly = yes ]] && hostonly="-h"
ba67b923 875[[ $hostonly != "-h" ]] && unset hostonly
ba726310 876
80626ded
HH
877[[ $reproducible == yes ]] && DRACUT_REPRODUCIBLE=1
878
26c231f1 879readonly TMPDIR="$tmpdir"
b093aa2d 880readonly initdir="$(mktemp --tmpdir="$TMPDIR/" -d -t initramfs.XXXXXX)"
26c231f1 881[ -d "$initdir" ] || {
f49ec88a 882 printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t initramfs.XXXXXX failed." >&2
26c231f1
HH
883 exit 1
884}
885
cd08059f 886if [[ $early_microcode = yes ]] || ( [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]] ); then
b5b608e4
TR
887 readonly early_cpio_dir="$(mktemp --tmpdir="$TMPDIR/" -d -t early_cpio.XXXXXX)"
888 [ -d "$early_cpio_dir" ] || {
f49ec88a 889 printf "%s\n" "dracut: mktemp --tmpdir='$TMPDIR/' -d -t early_cpio.XXXXXX failed." >&2
5f2c30d9
KRW
890 exit 1
891 }
892fi
d008b6b8 893# clean up after ourselves no matter how we die.
bbaa0d59
HH
894trap '
895 ret=$?;
bbaa0d59 896 [[ $keep ]] && echo "Not removing $initdir." >&2 || { [[ $initdir ]] && rm -rf -- "$initdir"; };
b5b608e4 897 [[ $keep ]] && echo "Not removing $early_cpio_dir." >&2 || { [[ $early_cpio_dir ]] && rm -Rf -- "$early_cpio_dir"; };
636d2d46 898 [[ $keep ]] && echo "Not removing $uefi_outdir." >&2 || { [[ $uefi_outdir ]] && rm -Rf -- "$uefi_outdir"; };
bbaa0d59
HH
899 [[ $_dlogdir ]] && rm -Rf -- "$_dlogdir";
900 exit $ret;
901 ' EXIT
902
d008b6b8
HH
903# clean up after ourselves no matter how we die.
904trap 'exit 1;' SIGINT
905
89d44e72
HH
906export DRACUT_KERNEL_LAZY="1"
907export DRACUT_RESOLVE_LAZY="1"
908
535f61ca
HH
909if [[ $print_cmdline ]]; then
910 stdloglvl=0
911 sysloglvl=0
912 fileloglvl=0
913 kmsgloglvl=0
914fi
915
e27ecc9a
HH
916if [[ -f $dracutbasedir/dracut-version.sh ]]; then
917 . $dracutbasedir/dracut-version.sh
918fi
919
552ecca6
HH
920if [[ -f $dracutbasedir/dracut-functions.sh ]]; then
921 . $dracutbasedir/dracut-functions.sh
adbc8a42 922else
b093aa2d
HH
923 printf "%s\n" "dracut: Cannot find $dracutbasedir/dracut-functions.sh." >&2
924 printf "%s\n" "dracut: Are you running from a git checkout?" >&2
925 printf "%s\n" "dracut: Try passing -l as an argument to $0" >&2
cc02093d 926 exit 1
adbc8a42 927fi
22fd1627 928
1743473b
HH
929if ! [[ $print_cmdline ]]; then
930 inst /bin/sh
ffc68f35 931 if ! $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R "$initdir/bin/sh" &>/dev/null; then
1743473b
HH
932 unset DRACUT_RESOLVE_LAZY
933 export DRACUT_RESOLVE_DEPS=1
934 fi
935 rm -fr -- ${initdir}/*
bfd2e8c2 936fi
bfd2e8c2 937
f8139a8b 938# Verify bash version, current minimum is 4
b093aa2d
HH
939if (( BASH_VERSINFO[0] < 4 )); then
940 dfatal 'You need at least Bash 4 to use dracut, sorry.'
d239b550
MS
941 exit 1
942fi
943
552ecca6 944dracutfunctions=$dracutbasedir/dracut-functions.sh
5cad5bb5 945export dracutfunctions
9a8a00cf 946
fcbcb252
HH
947if (( ${#drivers_l[@]} )); then
948 drivers=''
949 while pop drivers_l val; do
950 drivers+="$val "
951 done
952fi
953drivers=${drivers/-/_}
954
955if (( ${#add_drivers_l[@]} )); then
956 while pop add_drivers_l val; do
957 add_drivers+=" $val "
958 done
959fi
960add_drivers=${add_drivers/-/_}
961
cea907f6
TR
962if (( ${#force_drivers_l[@]} )); then
963 while pop force_drivers_l val; do
964 force_drivers+=" $val "
965 done
966fi
967force_drivers=${force_drivers/-/_}
968
fcbcb252
HH
969if (( ${#omit_drivers_l[@]} )); then
970 while pop omit_drivers_l val; do
971 omit_drivers+=" $val "
972 done
973fi
974omit_drivers=${omit_drivers/-/_}
975
d20fb951
HH
976if (( ${#kernel_cmdline_l[@]} )); then
977 while pop kernel_cmdline_l val; do
978 kernel_cmdline+=" $val "
979 done
980fi
981
34248c92 982omit_drivers_corrected=""
fcbcb252 983for d in $omit_drivers; do
b093aa2d 984 [[ " $drivers $add_drivers " == *\ $d\ * ]] && continue
cea907f6 985 [[ " $drivers $force_drivers " == *\ $d\ * ]] && continue
34248c92 986 omit_drivers_corrected+="$d|"
fcbcb252 987done
34248c92 988omit_drivers="${omit_drivers_corrected%|}"
fcbcb252
HH
989unset omit_drivers_corrected
990
ffa71b4a
HH
991# prepare args for logging
992for ((i=0; i < ${#dracut_args[@]}; i++)); do
b093aa2d 993 [[ "${dracut_args[$i]}" == *\ * ]] && \
ffa71b4a 994 dracut_args[$i]="\"${dracut_args[$i]}\""
a4210166 995 #" keep vim happy
ffa71b4a 996done
535f61ca 997
bbaa0d59 998dinfo "Executing: $0 ${dracut_args[@]}"
58dad702 999
5b11bb73
HH
1000[[ $do_list = yes ]] && {
1001 for mod in $dracutbasedir/modules.d/*; do
1002 [[ -d $mod ]] || continue;
d8e8e14e
1003 [[ -e $mod/install || -e $mod/installkernel || \
1004 -e $mod/module-setup.sh ]] || continue
b093aa2d 1005 printf "%s\n" "${mod##*/??}"
5b11bb73
HH
1006 done
1007 exit 0
1008}
1009
66ac3cd1 1010# This is kinda legacy -- eventually it should go away.
f1336ac7 1011case $dracutmodules in
66ac3cd1 1012 ""|auto) dracutmodules="all" ;;
f1336ac7 1013esac
e12aac5e 1014
454771cd 1015abs_outfile=$(readlink -f "$outfile") && outfile="$abs_outfile"
ec9315e5 1016
5db6ca5a
HH
1017if [[ -d $srcmods ]]; then
1018 [[ -f $srcmods/modules.dep ]] || {
1019 dwarn "$srcmods/modules.dep is missing. Did you run depmod?"
1020 }
1021fi
fe1484f3 1022
96cf7270
HH
1023if [[ ! $print_cmdline ]]; then
1024 if [[ -f $outfile && ! $force ]]; then
1025 dfatal "Will not override existing initramfs ($outfile) without --force"
1026 exit 1
1027 fi
1028
1029 outdir=${outfile%/*}
1030 [[ $outdir ]] || outdir="/"
1031
1032 if [[ ! -d "$outdir" ]]; then
1033 dfatal "Can't write to $outdir: Directory $outdir does not exist or is not accessible."
1034 exit 1
1035 elif [[ ! -w "$outdir" ]]; then
1036 dfatal "No permission to write to $outdir."
1037 exit 1
1038 elif [[ -f "$outfile" && ! -w "$outfile" ]]; then
1039 dfatal "No permission to write $outfile."
1040 exit 1
1041 fi
37383f71
HH
1042
1043 if [[ $loginstall ]]; then
1044 if ! mkdir -p "$loginstall"; then
1045 dfatal "Could not create directory to log installed files to '$loginstall'."
1046 exit 1
1047 fi
1048 loginstall=$(readlink -f "$loginstall")
1049 fi
636d2d46
HH
1050
1051 if [[ $uefi = yes ]]; then
1052 if ! command -v objcopy &>/dev/null; then
1053 dfatal "Need 'objcopy' to create a UEFI executable"
1054 exit 1
1055 fi
1056 unset EFI_MACHINE_TYPE_NAME
1057 case $(arch) in
1058 x86_64)
1059 EFI_MACHINE_TYPE_NAME=x64;;
1060 ia32)
1061 EFI_MACHINE_TYPE_NAME=ia32;;
1062 *)
1063 dfatal "Architecture '$(arch)' not supported to create a UEFI executable"
1064 exit 1
1065 ;;
1066 esac
1067
1068 if ! [[ -s $uefi_stub ]]; then
1069 for uefi_stub in \
1070 "/lib/systemd/boot/efi/linux${EFI_MACHINE_TYPE_NAME}.efi.stub" \
1071 "/usr/lib/gummiboot/linux${EFI_MACHINE_TYPE_NAME}.efi.stub"; do
1072 [[ -s $uefi_stub ]] || continue
1073 break
1074 done
1075 fi
1076 if ! [[ -s $uefi_stub ]]; then
1077 dfatal "Can't find a uefi stub '$uefi_stub' to create a UEFI executable"
1078 exit 1
1079 fi
1080
1081 if ! [[ $kernel_image ]]; then
1082 for kernel_image in "/lib/modules/$kernel/vmlinuz" "/boot/vmlinuz-$kernel"; do
1083 [[ -s "$kernel_image" ]] || continue
1084 break
1085 done
1086 fi
1087 if ! [[ -s $kernel_image ]]; then
1088 dfatal "Can't find a kernel image '$kernel_image' to create a UEFI executable"
1089 exit 1
1090 fi
1091 fi
ec9315e5
JK
1092fi
1093
8e3f6537
HH
1094if [[ $acpi_override = yes ]] && ! check_kernel_config CONFIG_ACPI_INITRD_TABLE_OVERRIDE; then
1095 dwarn "Disabling ACPI override, because kernel does not support it. CONFIG_ACPI_INITRD_TABLE_OVERRIDE!=y"
1096 unset acpi_override
1097fi
1098
1099if [[ $early_microcode = yes ]]; then
1100 if [[ $hostonly ]]; then
1101 [[ $(get_cpu_vendor) == "AMD" ]] \
1102 && ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
1103 && unset early_microcode
1104 [[ $(get_cpu_vendor) == "Intel" ]] \
1105 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
1106 && unset early_microcode
1107 else
1108 ! check_kernel_config CONFIG_MICROCODE_AMD_EARLY \
1109 && ! check_kernel_config CONFIG_MICROCODE_INTEL_EARLY \
1110 && unset early_microcode
1111 fi
1112 [[ $early_microcode != yes ]] \
1113 && dwarn "Disabling early microcode, because kernel does not support it. CONFIG_MICROCODE_[AMD|INTEL]_EARLY!=y"
1114fi
1115
f6f74096
DD
1116# Need to be able to have non-root users read stuff (rpcbind etc)
1117chmod 755 "$initdir"
1118
5bfa3b36
HH
1119if [[ $hostonly ]]; then
1120 for i in /sys /proc /run /dev; do
5e601454 1121 if ! findmnt --target "$i" &>/dev/null; then
5bfa3b36
HH
1122 dwarning "Turning off host-only mode: '$i' is not mounted!"
1123 unset hostonly
1124 fi
1125 done
1126fi
1127
d351541e
HH
1128declare -A host_fs_types
1129
cd7ff122
AW
1130for line in "${fstab_lines[@]}"; do
1131 set -- $line
6df52351 1132 dev="$1"
cd7ff122 1133 #dev mp fs fsopts
6df52351
TR
1134 case "$dev" in
1135 UUID=*)
1136 dev=$(blkid -l -t UUID=${dev#UUID=} -o device)
1137 ;;
1138 LABEL=*)
1139 dev=$(blkid -l -t LABEL=${dev#LABEL=} -o device)
1140 ;;
1141 PARTUUID=*)
1142 dev=$(blkid -l -t PARTUUID=${dev#PARTUUID=} -o device)
1143 ;;
1144 PARTLABEL=*)
1145 dev=$(blkid -l -t PARTLABEL=${dev#PARTLABEL=} -o device)
1146 ;;
1147 esac
1148 [ -z "$dev" ] && dwarn "Bad fstab entry $@" && continue
1149 push_host_devs "$dev"
1150 host_fs_types["$dev"]="$3"
cd7ff122
AW
1151done
1152
1153for f in $add_fstab; do
b093aa2d 1154 [[ -e $f ]] || continue
6d58fa27 1155 while read dev rest || [ -n "$dev" ]; do
118ca9ec 1156 push_host_devs "$dev"
b093aa2d
HH
1157 done < "$f"
1158done
1159
1160for dev in $add_device; do
118ca9ec 1161 push_host_devs "$dev"
cd7ff122
AW
1162done
1163
c586b033
CG
1164if (( ${#add_device_l[@]} )); then
1165 while pop add_device_l val; do
1166 add_device+=" $val "
118ca9ec 1167 push_host_devs "$val"
c586b033
CG
1168 done
1169fi
1170
7ae5d9d1 1171if [[ $hostonly ]]; then
480d772f
HH
1172 # in hostonly mode, determine all devices, which have to be accessed
1173 # and examine them for filesystem types
1174
bcfbddef 1175 for mp in \
7ae5d9d1
HH
1176 "/" \
1177 "/etc" \
d624f606
HH
1178 "/bin" \
1179 "/sbin" \
1180 "/lib" \
1181 "/lib64" \
af75a298 1182 "/usr" \
9fc14445
HH
1183 "/usr/bin" \
1184 "/usr/sbin" \
1185 "/usr/lib" \
1186 "/usr/lib64" \
a956a464
HH
1187 "/boot" \
1188 "/boot/efi" \
1189 ;
bcfbddef 1190 do
d624f606 1191 mp=$(readlink -f "$mp")
7ae5d9d1 1192 mountpoint "$mp" >/dev/null 2>&1 || continue
a4f7b504 1193 _dev=$(find_block_device "$mp")
e95b6723 1194 _bdev=$(readlink -f "/dev/block/$_dev")
a4f7b504 1195 [[ -b $_bdev ]] && _dev=$_bdev
118ca9ec 1196 push_host_devs $_dev
8da51857 1197 [[ "$mp" == "/" ]] && root_dev="$_dev"
118ca9ec 1198 push_host_devs "$_dev"
7ae5d9d1 1199 done
dd587549 1200
7fd850d5 1201 if [[ -f /proc/swaps ]] && [[ -f /etc/fstab ]]; then
6d58fa27 1202 while read dev type rest || [ -n "$dev" ]; do
7fd850d5
HH
1203 [[ -b $dev ]] || continue
1204 [[ "$type" == "partition" ]] || continue
1205
6d58fa27 1206 while read _d _m _t _o _r || [ -n "$_d" ]; do
7fd850d5
HH
1207 [[ "$_d" == \#* ]] && continue
1208 [[ $_d ]] || continue
546d5dac
HH
1209 [[ $_t != "swap" ]] && continue
1210 [[ $_m != "swap" ]] && [[ $_m != "none" ]] && continue
7fd850d5 1211 [[ "$_o" == *noauto* ]] && continue
c82a1133 1212 _d=$(expand_persistent_dev "$_d")
7fd850d5
HH
1213 [[ "$_d" -ef "$dev" ]] || continue
1214
1215 if [[ -f /etc/crypttab ]]; then
6d58fa27 1216 while read _mapper _a _p _o || [ -n "$_mapper" ]; do
7fd850d5
HH
1217 [[ $_mapper = \#* ]] && continue
1218 [[ "$_d" -ef /dev/mapper/"$_mapper" ]] || continue
1219 [[ "$_o" ]] || _o="$_p"
64ae4e07
HH
1220 # skip entries with password files
1221 [[ "$_p" == /* ]] && [[ -f $_p ]] && continue 2
1743473b 1222 # skip mkswap swap
7fd850d5
HH
1223 [[ $_o == *swap* ]] && continue 2
1224 done < /etc/crypttab
1225 fi
bcfbddef 1226
3e3ed34f
CG
1227 _dev="$(readlink -f "$dev")"
1228 push_host_devs "$_dev"
1229 push swap_devs "$_dev"
7fd850d5
HH
1230 break
1231 done < /etc/fstab
1232 done < /proc/swaps
1233 fi
36b2e5e2
CW
1234 # record all host modaliases
1235 declare -A host_modalias
fc68c87a 1236 find /sys/devices/ -name uevent -print > "$initdir/.modalias"
6d58fa27
HH
1237 while read m || [ -n "$m" ]; do
1238 while read line || [ -n "$line" ]; do
fc68c87a
HH
1239 [[ "$line" != MODALIAS\=* ]] && continue
1240 modalias="${line##MODALIAS=}" && [[ $modalias ]] && host_modalias["$modalias"]=1
3b9aaaab 1241 break
fc68c87a
HH
1242 done < "$m"
1243 done < "$initdir/.modalias"
1244
36b2e5e2
CW
1245 rm -f -- "$initdir/.modalias"
1246
6d58fa27 1247 while read _k _s _v || [ -n "$_k" ]; do
4d7c18c7
HH
1248 [ "$_k" != "name" -a "$_k" != "driver" ] && continue
1249 host_modalias["$_v"]=1
1250 done </proc/crypto
1251
36b2e5e2
CW
1252 # check /proc/modules
1253 declare -A host_modules
6d58fa27 1254 while read m rest || [ -n "$m" ]; do
36b2e5e2
CW
1255 host_modules["$m"]=1
1256 done </proc/modules
7ae5d9d1 1257fi
7ae5d9d1 1258
3c4315fa
HH
1259unset m
1260unset rest
1261
dba20559 1262_get_fs_type() {
19bab59c 1263 [[ $1 ]] || return
e41f3f90
HH
1264 if [[ -b /dev/block/$1 ]]; then
1265 ID_FS_TYPE=$(get_fs_env "/dev/block/$1") && host_fs_types["$(readlink -f "/dev/block/$1")"]="$ID_FS_TYPE"
19bab59c 1266 return 1
cd7ff122 1267 fi
e41f3f90
HH
1268 if [[ -b $1 ]]; then
1269 ID_FS_TYPE=$(get_fs_env "$1") && host_fs_types["$(readlink -f "$1")"]="$ID_FS_TYPE"
19bab59c 1270 return 1
4f10ae2b 1271 fi
b093aa2d 1272 if fstype=$(find_dev_fstype "$1"); then
dba20559 1273 host_fs_types["$1"]="$fstype"
19bab59c 1274 return 1
cd7ff122
AW
1275 fi
1276 return 1
dba20559
HH
1277}
1278
1279for dev in ${host_devs[@]}; do
1280 _get_fs_type "$dev"
1281 check_block_and_slaves_all _get_fs_type "$(get_maj_min "$dev")"
cd7ff122
AW
1282done
1283
8df0b654
HH
1284for dev in "${!host_fs_types[@]}"; do
1285 [[ ${host_fs_types[$dev]} = "reiserfs" ]] || [[ ${host_fs_types[$dev]} = "xfs" ]] || continue
1286 rootopts=$(find_dev_fsopts "$dev")
1287 if [[ ${host_fs_types[$dev]} = "reiserfs" ]]; then
1288 journaldev=$(fs_get_option $rootopts "jdev")
1289 elif [[ ${host_fs_types[$dev]} = "xfs" ]]; then
1290 journaldev=$(fs_get_option $rootopts "logdev")
1291 fi
1292 if [[ $journaldev ]]; then
1293 dev="$(readlink -f "$dev")"
118ca9ec 1294 push_host_devs "$dev"
8df0b654
HH
1295 _get_fs_type "$dev"
1296 check_block_and_slaves_all _get_fs_type "$(get_maj_min "$dev")"
1297 fi
1298done
1299
d1615612 1300[[ -d $udevdir ]] \
b093aa2d 1301 || udevdir="$(pkg-config udev --variable=udevdir 2>/dev/null)"
d1615612 1302if ! [[ -d "$udevdir" ]]; then
80dab03a 1303 [[ ! -h /lib ]] && [[ -d /lib/udev ]] && udevdir=/lib/udev
d1615612
HH
1304 [[ -d /usr/lib/udev ]] && udevdir=/usr/lib/udev
1305fi
1306
1307[[ -d $systemdutildir ]] \
1308 || systemdutildir=$(pkg-config systemd --variable=systemdutildir 2>/dev/null)
d1615612
HH
1309
1310if ! [[ -d "$systemdutildir" ]]; then
80dab03a 1311 [[ ! -h /lib ]] && [[ -d /lib/systemd ]] && systemdutildir=/lib/systemd
d1615612
HH
1312 [[ -d /usr/lib/systemd ]] && systemdutildir=/usr/lib/systemd
1313fi
cb8def95
HH
1314
1315[[ -d $systemdsystemunitdir ]] \
1316 || systemdsystemunitdir=$(pkg-config systemd --variable=systemdsystemunitdir 2>/dev/null)
1317
d1615612
HH
1318[[ -d "$systemdsystemunitdir" ]] || systemdsystemunitdir=${systemdutildir}/system
1319
cb8def95
HH
1320[[ -d $systemdsystemconfdir ]] \
1321 || systemdsystemconfdir=$(pkg-config systemd --variable=systemdsystemconfdir 2>/dev/null)
1322
1323[[ -d "$systemdsystemconfdir" ]] || systemdsystemconfdir=/etc/systemd/system
1324
3a04bdde
HH
1325[[ -d $tmpfilesdir ]] \
1326 || tmpfilesdir=$(pkg-config systemd --variable=tmpfilesdir 2>/dev/null)
1327
1328if ! [[ -d "$tmpfilesdir" ]]; then
1329 [[ -f /lib/tmpfiles.d ]] && tmpfilesdir=/lib/tmpfiles.d
1330 [[ -f /usr/lib/tmpfiles.d ]] && tmpfilesdir=/usr/lib/tmpfiles.d
1331fi
1332
ab2f95e4
HH
1333export initdir dracutbasedir \
1334 dracutmodules force_add_dracutmodules add_dracutmodules omit_dracutmodules \
1335 mods_to_load \
e103615b 1336 fw_dir drivers_dir debug no_kernel kernel_only \
5a6a98f8 1337 omit_drivers mdadmconf lvmconf root_dev \
ff3953ef 1338 use_fstab fstab_lines libdirs fscks nofscks ro_mnt \
1e64e493 1339 stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
3e3ed34f 1340 debug host_fs_types host_devs swap_devs sshkey add_fstab \
cb8def95 1341 DRACUT_VERSION udevdir prefix filesystems drivers \
3c4315fa 1342 systemdutildir systemdsystemunitdir systemdsystemconfdir \
3a04bdde
HH
1343 host_modalias host_modules hostonly_cmdline loginstall \
1344 tmpfilesdir
f4fff04e 1345
1743473b
HH
1346mods_to_load=""
1347# check all our modules to see if they should be sourced.
1348# This builds a list of modules that we will install next.
1349for_each_module_dir check_module
1350for_each_module_dir check_mount
1351
88c86ac7 1352dracut_module_included "fips" && export DRACUT_FIPS_MODE=1
1743473b 1353
91190597
HH
1354do_print_cmdline()
1355{
21a20973
HH
1356 local -A _mods_to_print
1357 for i in $modules_loaded $mods_to_load; do
1358 _mods_to_print[$i]=1
1359 done
1360
1743473b
HH
1361 # source our modules.
1362 for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
1363 _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]}
21a20973 1364 [[ ${_mods_to_print[$_d_mod]} ]] || continue
1743473b
HH
1365 module_cmdline "$_d_mod"
1366 done
1367 unset moddir
91190597
HH
1368}
1369
1370if [[ $print_cmdline ]]; then
1371 do_print_cmdline
a17d5cf4 1372 printf "\n"
1743473b
HH
1373 exit 0
1374fi
1375
dbad9f46 1376# Create some directory structure first
fd786adc 1377[[ $prefix ]] && mkdir -m 0755 -p "${initdir}${prefix}"
dbad9f46 1378
785a6cd2 1379[[ -h /lib ]] || mkdir -m 0755 -p "${initdir}${prefix}/lib"
fd786adc 1380[[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib"
dbad9f46 1381
785a6cd2 1382if [[ $prefix ]]; then
d2a9c4a8 1383 for d in bin etc lib sbin tmp usr var $libdirs; do
b093aa2d 1384 [[ "$d" == */* ]] && continue
785a6cd2
HH
1385 ln -sfn "${prefix#/}/${d#/}" "$initdir/$d"
1386 done
1387fi
1388
1389if [[ $kernel_only != yes ]]; then
6f92423c 1390 for d in usr/bin usr/sbin bin etc lib sbin tmp usr var var/tmp $libdirs; do
fd786adc 1391 [[ -e "${initdir}${prefix}/$d" ]] && continue
d433da44
HH
1392 if [ -L "/$d" ]; then
1393 inst_symlink "/$d" "${prefix}/$d"
785a6cd2
HH
1394 else
1395 mkdir -m 0755 -p "${initdir}${prefix}/$d"
1396 fi
3b403b32 1397 done
dbad9f46 1398
8d89fc6b 1399 for d in dev proc sys sysroot root run; do
d433da44
HH
1400 if [ -L "/$d" ]; then
1401 inst_symlink "/$d"
785a6cd2
HH
1402 else
1403 mkdir -m 0755 -p "$initdir/$d"
1404 fi
33ee031c 1405 done
dbad9f46 1406
506b2192
HH
1407 ln -sfn ../run "$initdir/var/run"
1408 ln -sfn ../run/lock "$initdir/var/lock"
6f09acf8
HH
1409else
1410 for d in lib "$libdir"; do
1411 [[ -e "${initdir}${prefix}/$d" ]] && continue
1412 if [ -h "/$d" ]; then
1413 inst "/$d" "${prefix}/$d"
1414 else
1415 mkdir -m 0755 -p "${initdir}${prefix}/$d"
1416 fi
1417 done
33ee031c 1418fi
0f86847d 1419
14c47b0e
HH
1420if [[ $kernel_only != yes ]]; then
1421 mkdir -p "${initdir}/etc/cmdline.d"
4fed3ddf
HH
1422 for _d in $hookdirs; do
1423 mkdir -m 0755 -p ${initdir}/lib/dracut/hooks/$_d
1424 done
26144216 1425 if [[ "$UID" = "0" ]]; then
ad200fbc
HH
1426 [ -c ${initdir}/dev/null ] || mknod ${initdir}/dev/null c 1 3
1427 [ -c ${initdir}/dev/kmsg ] || mknod ${initdir}/dev/kmsg c 1 11
1428 [ -c ${initdir}/dev/console ] || mknod ${initdir}/dev/console c 5 1
26144216 1429 fi
14c47b0e 1430fi
96b8d60a 1431
ec3c5951 1432_isize=0 #initramfs size
979c4a93 1433modules_loaded=" "
95bde758 1434# source our modules.
5d791c0e 1435for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
979c4a93 1436 _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]}
bee08653
HH
1437 [[ "$mods_to_load" == *\ $_d_mod\ * ]] || continue
1438 if [[ $show_modules = yes ]]; then
1439 printf "%s\n" "$_d_mod"
1440 else
1441 dinfo "*** Including module: $_d_mod ***"
1442 fi
1443 if [[ $kernel_only == yes ]]; then
1444 module_installkernel "$_d_mod" || {
1445 dfatal "installkernel failed in module $_d_mod"
1446 exit 1
1447 }
1448 else
1449 module_install "$_d_mod"
1450 if [[ $no_kernel != yes ]]; then
b093aa2d 1451 module_installkernel "$_d_mod" || {
a6d3be9d
AW
1452 dfatal "installkernel failed in module $_d_mod"
1453 exit 1
1454 }
ec3c5951 1455 fi
66ac3cd1 1456 fi
bee08653
HH
1457 mods_to_load=${mods_to_load// $_d_mod /}
1458 modules_loaded+="$_d_mod "
1459
1460 #print the module install size
1461 if [ -n "$printsize" ]; then
1462 _isize_new=$(du -sk ${initdir}|cut -f1)
1463 _isize_delta=$((_isize_new - _isize))
1464 printf "%s\n" "$_d_mod install size: ${_isize_delta}k"
1465 _isize=$_isize_new
1466 fi
15136762 1467done
20abd914 1468unset moddir
0a35a80b
HH
1469
1470for i in $modules_loaded; do
43fed151 1471 mkdir -p $initdir/lib/dracut
b093aa2d 1472 printf "%s\n" "$i" >> $initdir/lib/dracut/modules.txt
0a35a80b
HH
1473done
1474
ea216a65 1475dinfo "*** Including modules done ***"
aabc0553 1476
0f86847d 1477## final stuff that has to happen
89d44e72 1478if [[ $no_kernel != yes ]]; then
aec9f902
HH
1479
1480 if [[ $drivers ]]; then
1481 hostonly='' instmods $drivers
1482 fi
1483
1484 if [[ $add_drivers ]]; then
1485 hostonly='' instmods -c $add_drivers
1486 fi
cea907f6
TR
1487 if [[ $force_drivers ]]; then
1488 hostonly='' instmods -c $force_drivers
1489 rm -f $initdir/etc/cmdline.d/20-force_driver.conf
1490 for mod in $force_drivers; do
1491 echo "rd.driver.pre=$mod" >>$initdir/etc/cmdline.d/20-force_drivers.conf
1492 done
1493 fi
aec9f902
HH
1494 if [[ $filesystems ]]; then
1495 hostonly='' instmods -c $filesystems
1496 fi
1497
89d44e72
HH
1498 dinfo "*** Installing kernel module dependencies and firmware ***"
1499 dracut_kernel_post
1500 dinfo "*** Installing kernel module dependencies and firmware done ***"
83bb0893
HH
1501
1502 if [[ $noimageifnotneeded == yes ]] && [[ $hostonly ]]; then
1503 if [[ ! -f "$initdir/lib/dracut/need-initqueue" ]] && \
1504 [[ -f ${initdir}/lib/modules/$kernel/modules.dep && ! -s ${initdir}/lib/modules/$kernel/modules.dep ]]; then
1505 for i in ${initdir}/etc/cmdline.d/*.conf; do
1506 # We need no initramfs image and do not generate one.
1507 [[ $i == "${initdir}/etc/cmdline.d/*.conf" ]] && exit 0
1508 done
1509 fi
1510 fi
89d44e72 1511fi
d8aeb3a7 1512
998bf6e0 1513if [[ $kernel_only != yes ]]; then
af119460 1514 (( ${#install_items[@]} > 0 )) && inst_multiple ${install_items[@]}
54b68829 1515 (( ${#install_optional_items[@]} > 0 )) && inst_multiple -o ${install_optional_items[@]}
998bf6e0 1516
b093aa2d 1517 [[ $kernel_cmdline ]] && printf "%s\n" "$kernel_cmdline" >> "${initdir}/etc/cmdline.d/01-default.conf"
d20fb951 1518
998bf6e0 1519 while pop fstab_lines line; do
5f6a495b
DY
1520 line=($line)
1521 [ -z "${line[3]}" ] && line[3]="defaults"
1522 [ -z "${line[4]}" ] && line[4]="0"
1523 [ -z "${line[5]}" ] && line[5]="2"
3586a7aa 1524 strstr "${line[2]}" "nfs" && line[5]="0"
5f6a495b 1525 echo "${line[@]}" >> "${initdir}/etc/fstab"
998bf6e0
HH
1526 done
1527
1528 for f in $add_fstab; do
b093aa2d 1529 cat "$f" >> "${initdir}/etc/fstab"
998bf6e0
HH
1530 done
1531
6c6d8057
HH
1532 if [ -d ${initdir}/$systemdutildir ]; then
1533 mkdir -p ${initdir}/etc/conf.d
1534 {
b093aa2d
HH
1535 printf "%s\n" "systemdutildir=\"$systemdutildir\""
1536 printf "%s\n" "systemdsystemunitdir=\"$systemdsystemunitdir\""
1537 printf "%s\n" "systemdsystemconfdir=\"$systemdsystemconfdir\""
6c6d8057
HH
1538 } > ${initdir}/etc/conf.d/systemd.conf
1539 fi
1540
998bf6e0
HH
1541 if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then
1542 dinfo "*** Resolving executable dependencies ***"
f182cb95 1543 find "$initdir" -type f -perm /0111 -not -path '*.ko' -print0 \
ffc68f35 1544 | xargs -r -0 $DRACUT_INSTALL ${initdir:+-D "$initdir"} -R ${DRACUT_FIPS_MODE:+-H} --
998bf6e0
HH
1545 dinfo "*** Resolving executable dependencies done***"
1546 fi
8dcc4830
HH
1547
1548 # libpthread workaround: pthread_cancel wants to dlopen libgcc_s.so
1549 for _dir in $libdirs; do
1550 for _f in "$_dir/libpthread.so"*; do
1551 [[ -e "$_f" ]] || continue
1552 inst_libdir_file "libgcc_s.so*"
1553 break 2
1554 done
1555 done
998bf6e0
HH
1556fi
1557
c9364f6e
EV
1558while pop include_src src && pop include_target target; do
1559 if [[ $src && $target ]]; then
661f9a34 1560 if [[ -f $src ]]; then
c9364f6e 1561 inst $src $target
661f9a34 1562 else
3b403b32 1563 ddebug "Including directory: $src"
c9364f6e 1564 destdir="${initdir}/${target}"
332ecaa9 1565 mkdir -p "$destdir"
dbad9f46 1566 # check for preexisting symlinks, so we can cope with the
fd786adc 1567 # symlinks to $prefix
c9364f6e
EV
1568 # Objectname is a file or a directory
1569 for objectname in "$src"/*; do
1570 [[ -e "$objectname" || -h "$objectname" ]] || continue
1571 if [[ -d "$objectname" ]]; then
1572 # objectname is a directory, let's compute the final directory name
1573 object_destdir=${destdir}/${objectname#$src/}
1574 if ! [[ -e "$object_destdir" ]]; then
1575 mkdir -m 0755 -p "$object_destdir"
1576 chmod --reference="$objectname" "$object_destdir"
dbad9f46 1577 fi
c9364f6e 1578 cp --reflink=auto --sparse=auto -fa -t "$object_destdir" "$objectname"/*
dbad9f46 1579 else
c9364f6e 1580 cp --reflink=auto --sparse=auto -fa -t "$destdir" "$objectname"
3b403b32 1581 fi
dbad9f46 1582 done
661f9a34 1583 fi
4fea3ea6 1584 fi
661f9a34 1585done
88ffd2df 1586
14c47b0e 1587if [[ $kernel_only != yes ]]; then
1254925f
HH
1588 # make sure that library links are correct and up to date
1589 for f in /etc/ld.so.conf /etc/ld.so.conf.d/*; do
482c573d 1590 [[ -f $f ]] && inst_simple "$f"
1254925f
HH
1591 done
1592 if ! ldconfig -r "$initdir"; then
1593 if [[ $UID = 0 ]]; then
1594 derror "ldconfig exited ungracefully"
1595 else
1596 derror "ldconfig might need uid=0 (root) for chroot()"
1597 fi
432196ae
1598 fi
1599fi
fdc421db 1600
6cd7001b
HH
1601PRELINK_BIN="$(command -v prelink)"
1602if [[ $UID = 0 ]] && [[ $PRELINK_BIN ]]; then
1603 if [[ $DRACUT_FIPS_MODE ]]; then
1604 dinfo "*** Installing prelink files ***"
1605 inst_multiple -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf /etc/prelink.cache
1606 elif [[ $do_prelink == yes ]]; then
1607 dinfo "*** Pre-linking files ***"
1608 inst_multiple -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf
1609 chroot "$initdir" "$PRELINK_BIN" -a
1610 rm -f -- "$initdir/$PRELINK_BIN"
1611 rm -fr -- "$initdir"/etc/prelink.*
1612 dinfo "*** Pre-linking files done ***"
404815ea
HH
1613 fi
1614fi
1615
1616if [[ $do_hardlink = yes ]] && command -v hardlink >/dev/null; then
1617 dinfo "*** Hardlinking files ***"
1618 hardlink "$initdir" 2>&1
1619 dinfo "*** Hardlinking files done ***"
1620fi
1621
3b403b32 1622# strip binaries
98adb06e 1623if [[ $do_strip = yes ]] ; then
69b35075 1624 for p in strip xargs find; do
cc02093d 1625 if ! type -P $p >/dev/null; then
fefd3f66 1626 dinfo "Could not find '$p'. Not stripping the initramfs."
cc02093d
HH
1627 do_strip=no
1628 fi
31f7db66
HH
1629 done
1630fi
1631
5ae33613 1632if [[ $do_strip = yes ]] && ! [[ $DRACUT_FIPS_MODE ]]; then
89d44e72 1633 dinfo "*** Stripping files ***"
5ae33613
HH
1634 find "$initdir" -type f \
1635 -executable -not -path '*/lib/modules/*.ko' -print0 \
1636 | xargs -r -0 strip -g 2>/dev/null
2d9b156e
HH
1637
1638 # strip kernel modules, but do not touch signed modules
1639 find "$initdir" -type f -path '*/lib/modules/*.ko' -print0 \
6d58fa27 1640 | while read -r -d $'\0' f || [ -n "$f" ]; do
2d9b156e 1641 SIG=$(tail -c 28 "$f")
b093aa2d 1642 [[ $SIG == '~Module signature appended~' ]] || { printf "%s\000" "$f"; }
2d9b156e
HH
1643 done | xargs -r -0 strip -g
1644
89d44e72 1645 dinfo "*** Stripping files done ***"
979c4a93 1646fi
5f2c30d9
KRW
1647if [[ $early_microcode = yes ]]; then
1648 dinfo "*** Generating early-microcode cpio image ***"
1649 ucode_dir=(amd-ucode intel-ucode)
1650 ucode_dest=(AuthenticAMD.bin GenuineIntel.bin)
b5b608e4 1651 _dest_dir="$early_cpio_dir/d/kernel/x86/microcode"
5f2c30d9
KRW
1652 _dest_idx="0 1"
1653 mkdir -p $_dest_dir
1654 if [[ $hostonly ]]; then
1655 [[ $(get_cpu_vendor) == "AMD" ]] && _dest_idx="0"
1656 [[ $(get_cpu_vendor) == "Intel" ]] && _dest_idx="1"
1657 fi
1658 for idx in $_dest_idx; do
1659 _fw=${ucode_dir[$idx]}
1660 for _fwdir in $fw_dir; do
1661 if [[ -d $_fwdir && -d $_fwdir/$_fw ]]; then
1662 _src="*"
1663 dinfo "*** Constructing ${ucode_dest[$idx]} ****"
1664 if [[ $hostonly ]]; then
1665 _src=$(get_ucode_file)
d8b04dc1
TR
1666 if ! [[ -r $_fwdir/$_fw/$_src ]];then
1667 break;
1668 fi
5f2c30d9
KRW
1669 fi
1670 cat $_fwdir/$_fw/$_src > $_dest_dir/${ucode_dest[$idx]}
d8b04dc1 1671 create_early_cpio="yes"
5f2c30d9
KRW
1672 fi
1673 done
1674 done
5f2c30d9 1675fi
bbaa0d59 1676
f3b14c2b
TR
1677if [[ $acpi_override = yes ]] && [[ -d $acpi_table_dir ]]; then
1678 dinfo "*** Packaging ACPI tables to override BIOS provided ones ***"
1679 _dest_dir="$early_cpio_dir/d/kernel/firmware/acpi"
1680 mkdir -p $_dest_dir
1681 for table in $acpi_table_dir/*.aml; do
1682 dinfo " Adding ACPI table: $table"
80626ded 1683 cp -a $table $_dest_dir
f3b14c2b
TR
1684 create_early_cpio="yes"
1685 done
1686fi
1687
659dc319
HB
1688dinfo "*** Store current command line parameters ***"
1689if ! ( echo $PARMS_TO_STORE > $initdir/lib/dracut/build-parameter.txt ); then
1690 dfatal "Could not store the current command line parameters"
1691 exit 1
1692fi
1693
fe273e39 1694if [[ $hostonly_cmdline ]] ; then
496e3d96 1695 unset _stored_cmdline
fe273e39
HR
1696 if [ -d $initdir/etc/cmdline.d ];then
1697 dinfo "Stored kernel commandline:"
1698 for conf in $initdir/etc/cmdline.d/*.conf ; do
496e3d96 1699 [ -e "$conf" ] || continue
fe273e39 1700 dinfo "$(< $conf)"
496e3d96 1701 _stored_cmdline=1
fe273e39 1702 done
496e3d96
HH
1703 fi
1704 if ! [[ $_stored_cmdline ]]; then
fe273e39
HR
1705 dinfo "No dracut internal kernel commandline stored in initrd"
1706 fi
1707fi
32bd2fbb 1708rm -f -- "$outfile"
636d2d46
HH
1709dinfo "*** Creating image file '$outfile' ***"
1710
1711if [[ $uefi = yes ]]; then
1712 uefi_outfile="$outfile"
1713 readonly uefi_outdir="$(mktemp --tmpdir="$TMPDIR/" -d -t initrd.XXXXXX)"
1714 # redirect initrd output
1715 outfile="$uefi_outdir/initrd"
1716fi
c8a9a6b4 1717
80626ded
HH
1718if [[ $DRACUT_REPRODUCIBLE ]]; then
1719 find "$initdir" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1720 | xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1721
1722 [[ "$(cpio --help)" == *--reproducible* ]] && CPIO_REPRODUCIBLE=1
1723fi
1724
c8a9a6b4
HH
1725[[ "$UID" != 0 ]] && cpio_owner_root="-R 0:0"
1726
b5b608e4 1727if [[ $create_early_cpio = yes ]]; then
b9909e33 1728 echo 1 > "$early_cpio_dir/d/early_cpio"
80626ded
HH
1729
1730 if [[ $DRACUT_REPRODUCIBLE ]]; then
1731 find "$early_cpio_dir/d" -newer "$dracutbasedir/dracut-functions.sh" -print0 \
1732 | xargs -r -0 touch -h -m -c -r "$dracutbasedir/dracut-functions.sh"
1733 fi
1734
5f2c30d9 1735 # The microcode blob is _before_ the initramfs blob, not after
80626ded
HH
1736 (
1737 cd "$early_cpio_dir/d"
1738 find . -print0 | sort -z \
1739 | cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc -o --quiet > $outfile
1740 )
5f2c30d9 1741fi
80626ded
HH
1742
1743if ! (
1744 umask 077; cd "$initdir"
1745 find . -print0 | sort -z \
1746 | cpio ${CPIO_REPRODUCIBLE:+--reproducible} --null $cpio_owner_root -H newc -o --quiet \
1747 | $compress >> "$outfile"
1748 ); then
dc4c1ee3 1749 dfatal "dracut: creation of $outfile failed"
734a0d9e 1750 exit 1
3b403b32 1751fi
636d2d46 1752dinfo "*** Creating initrd image file '$outfile' done ***"
432196ae 1753
bbaa0d59 1754if (( maxloglvl >= 5 )); then
dadd2b69
HH
1755 if [[ $allowlocal ]]; then
1756 "$dracutbasedir/lsinitrd.sh" "$outfile"| ddebug
1757 else
1758 lsinitrd "$outfile"| ddebug
1759 fi
bbaa0d59 1760fi
1faecdc1 1761
636d2d46
HH
1762if [[ $uefi = yes ]]; then
1763 if [[ $kernel_cmdline ]]; then
1764 echo -n "$kernel_cmdline" > "$uefi_outdir/cmdline.txt"
1765 elif [[ $hostonly_cmdline = yes ]] && [ -d $initdir/etc/cmdline.d ];then
1766 for conf in $initdir/etc/cmdline.d/*.conf ; do
1767 [ -e "$conf" ] || continue
1768 printf "%s " "$(< $conf)" >> "$uefi_outdir/cmdline.txt"
1769 done
1770 else
1771 do_print_cmdline > "$uefi_outdir/cmdline.txt"
1772 fi
1773 echo -ne "\x00" >> "$uefi_outdir/cmdline.txt"
1774
1775 dinfo "Using UEFI kernel cmdline:"
1776 dinfo $(< "$uefi_outdir/cmdline.txt")
1777
3ac9cdb1 1778 [[ -s /usr/lib/os-release ]] && uefi_osrelease="/usr/lib/os-release"
636d2d46
HH
1779 [[ -s /etc/os-release ]] && uefi_osrelease="/etc/os-release"
1780
1781 objcopy \
1782 ${uefi_osrelease:+--add-section .osrel=$uefi_osrelease --change-section-vma .osrel=0x20000} \
1783 --add-section .cmdline="$uefi_outdir/cmdline.txt" --change-section-vma .cmdline=0x30000 \
1784 --add-section .linux="$kernel_image" --change-section-vma .linux=0x40000 \
1785 --add-section .initrd="$outfile" --change-section-vma .initrd=0x3000000 \
1786 "$uefi_stub" "$uefi_outfile"
1787 dinfo "*** Creating UEFI image file '$uefi_outfile' done ***"
1788fi
1789
3da58569 1790exit 0