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