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