]> git.ipfire.org Git - thirdparty/dracut.git/blame - dracut.sh
dracut.sh: always assemble /usr device in initramfs
[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
78d1d4f8
HH
831 if ! [[ -d /run/udev/data ]]; then
832 dwarning "Turning off host-only mode: udev database not found!"
833 unset hostonly
834 fi
5bfa3b36
HH
835fi
836
d351541e
HH
837declare -A host_fs_types
838
cd7ff122
AW
839for line in "${fstab_lines[@]}"; do
840 set -- $line
841 #dev mp fs fsopts
d0096de7 842 push host_devs "$1"
d351541e 843 host_fs_types["$1"]="$3"
cd7ff122
AW
844done
845
846for f in $add_fstab; do
b093aa2d 847 [[ -e $f ]] || continue
cd7ff122 848 while read dev rest; do
b093aa2d
HH
849 push host_devs "$dev"
850 done < "$f"
851done
852
853for dev in $add_device; do
854 push host_devs "$dev"
cd7ff122
AW
855done
856
c586b033
CG
857if (( ${#add_device_l[@]} )); then
858 while pop add_device_l val; do
859 add_device+=" $val "
b093aa2d 860 push host_devs "$val"
c586b033
CG
861 done
862fi
863
7ae5d9d1 864if [[ $hostonly ]]; then
480d772f
HH
865 # in hostonly mode, determine all devices, which have to be accessed
866 # and examine them for filesystem types
867
bcfbddef 868 for mp in \
7ae5d9d1
HH
869 "/" \
870 "/etc" \
d624f606
HH
871 "/bin" \
872 "/sbin" \
873 "/lib" \
874 "/lib64" \
9fc14445
HH
875 "/usr/bin" \
876 "/usr/sbin" \
877 "/usr/lib" \
878 "/usr/lib64" \
bcfbddef
HH
879 "/boot";
880 do
d624f606 881 mp=$(readlink -f "$mp")
7ae5d9d1 882 mountpoint "$mp" >/dev/null 2>&1 || continue
a4f7b504 883 _dev=$(find_block_device "$mp")
e95b6723 884 _bdev=$(readlink -f "/dev/block/$_dev")
a4f7b504
HH
885 [[ -b $_bdev ]] && _dev=$_bdev
886 push host_devs $_dev
5a6a98f8
HH
887 [[ "$_mp" == "/" ]] && root_dev="$_dev"
888 push host_devs "$_dev"
7ae5d9d1 889 done
dd587549 890
7fd850d5
HH
891 if [[ -f /proc/swaps ]] && [[ -f /etc/fstab ]]; then
892 while read dev type rest; do
893 [[ -b $dev ]] || continue
894 [[ "$type" == "partition" ]] || continue
895
896 while read _d _m _t _o _r; do
897 [[ "$_d" == \#* ]] && continue
898 [[ $_d ]] || continue
899 [[ $_t != "swap" ]] || [[ $_m != "swap" ]] && continue
900 [[ "$_o" == *noauto* ]] && continue
901 [[ "$_d" == UUID\=* ]] && _d="/dev/disk/by-uuid/${_d#UUID=}"
902 [[ "$_d" == LABEL\=* ]] && _d="/dev/disk/by-label/$_d#LABEL=}"
903 [[ "$_d" -ef "$dev" ]] || continue
904
905 if [[ -f /etc/crypttab ]]; then
906 while read _mapper _a _p _o; do
907 [[ $_mapper = \#* ]] && continue
908 [[ "$_d" -ef /dev/mapper/"$_mapper" ]] || continue
909 [[ "$_o" ]] || _o="$_p"
bcfbddef 910 # skip mkswap swap
7fd850d5
HH
911 [[ $_o == *swap* ]] && continue 2
912 done < /etc/crypttab
913 fi
bcfbddef 914
7fd850d5
HH
915 push host_devs "$(readlink -f "$dev")"
916 break
917 done < /etc/fstab
918 done < /proc/swaps
919 fi
7ae5d9d1 920fi
7ae5d9d1 921
dba20559 922_get_fs_type() {
19bab59c 923 [[ $1 ]] || return
b093aa2d 924 if [[ -b /dev/block/$1 ]] && ID_FS_TYPE=$(get_fs_env "/dev/block/$1"); then
dba20559 925 host_fs_types["$(readlink -f "/dev/block/$1")"]="$ID_FS_TYPE"
19bab59c 926 return 1
cd7ff122 927 fi
b093aa2d 928 if [[ -b $1 ]] && ID_FS_TYPE=$(get_fs_env "$1"); then
dba20559 929 host_fs_types["$(readlink -f "$1")"]="$ID_FS_TYPE"
19bab59c 930 return 1
4f10ae2b 931 fi
b093aa2d 932 if fstype=$(find_dev_fstype "$1"); then
dba20559 933 host_fs_types["$1"]="$fstype"
19bab59c 934 return 1
cd7ff122
AW
935 fi
936 return 1
dba20559
HH
937}
938
939for dev in ${host_devs[@]}; do
940 _get_fs_type "$dev"
941 check_block_and_slaves_all _get_fs_type "$(get_maj_min "$dev")"
cd7ff122
AW
942done
943
d1615612 944[[ -d $udevdir ]] \
b093aa2d 945 || udevdir="$(pkg-config udev --variable=udevdir 2>/dev/null)"
d1615612
HH
946if ! [[ -d "$udevdir" ]]; then
947 [[ -d /lib/udev ]] && udevdir=/lib/udev
948 [[ -d /usr/lib/udev ]] && udevdir=/usr/lib/udev
949fi
950
951[[ -d $systemdutildir ]] \
952 || systemdutildir=$(pkg-config systemd --variable=systemdutildir 2>/dev/null)
d1615612
HH
953
954if ! [[ -d "$systemdutildir" ]]; then
955 [[ -d /lib/systemd ]] && systemdutildir=/lib/systemd
956 [[ -d /usr/lib/systemd ]] && systemdutildir=/usr/lib/systemd
957fi
cb8def95
HH
958
959[[ -d $systemdsystemunitdir ]] \
960 || systemdsystemunitdir=$(pkg-config systemd --variable=systemdsystemunitdir 2>/dev/null)
961
d1615612
HH
962[[ -d "$systemdsystemunitdir" ]] || systemdsystemunitdir=${systemdutildir}/system
963
cb8def95
HH
964[[ -d $systemdsystemconfdir ]] \
965 || systemdsystemconfdir=$(pkg-config systemd --variable=systemdsystemconfdir 2>/dev/null)
966
967[[ -d "$systemdsystemconfdir" ]] || systemdsystemconfdir=/etc/systemd/system
968
aec9f902 969export initdir dracutbasedir dracutmodules \
e103615b 970 fw_dir drivers_dir debug no_kernel kernel_only \
5a6a98f8 971 omit_drivers mdadmconf lvmconf root_dev \
ff3953ef 972 use_fstab fstab_lines libdirs fscks nofscks ro_mnt \
1e64e493 973 stdloglvl sysloglvl fileloglvl kmsgloglvl logfile \
dbf8f6ba 974 debug host_fs_types host_devs sshkey add_fstab \
cb8def95
HH
975 DRACUT_VERSION udevdir prefix filesystems drivers \
976 systemdutildir systemdsystemunitdir systemdsystemconfdir
f4fff04e 977
dbad9f46 978# Create some directory structure first
fd786adc 979[[ $prefix ]] && mkdir -m 0755 -p "${initdir}${prefix}"
dbad9f46 980
785a6cd2 981[[ -h /lib ]] || mkdir -m 0755 -p "${initdir}${prefix}/lib"
fd786adc 982[[ $prefix ]] && ln -sfn "${prefix#/}/lib" "$initdir/lib"
dbad9f46 983
785a6cd2 984if [[ $prefix ]]; then
d2a9c4a8 985 for d in bin etc lib sbin tmp usr var $libdirs; do
b093aa2d 986 [[ "$d" == */* ]] && continue
785a6cd2
HH
987 ln -sfn "${prefix#/}/${d#/}" "$initdir/$d"
988 done
989fi
990
991if [[ $kernel_only != yes ]]; then
3f54a83c 992 for d in usr/bin usr/sbin bin etc lib sbin tmp usr var $libdirs; do
fd786adc 993 [[ -e "${initdir}${prefix}/$d" ]] && continue
d433da44
HH
994 if [ -L "/$d" ]; then
995 inst_symlink "/$d" "${prefix}/$d"
785a6cd2
HH
996 else
997 mkdir -m 0755 -p "${initdir}${prefix}/$d"
998 fi
3b403b32 999 done
dbad9f46 1000
7c14b368 1001 for d in dev proc sys sysroot root run run/lock run/initramfs; do
d433da44
HH
1002 if [ -L "/$d" ]; then
1003 inst_symlink "/$d"
785a6cd2
HH
1004 else
1005 mkdir -m 0755 -p "$initdir/$d"
1006 fi
33ee031c 1007 done
dbad9f46 1008
506b2192
HH
1009 ln -sfn ../run "$initdir/var/run"
1010 ln -sfn ../run/lock "$initdir/var/lock"
3f54a83c 1011 ln -sfn ../run/log "$initdir/var/log"
6f09acf8
HH
1012else
1013 for d in lib "$libdir"; do
1014 [[ -e "${initdir}${prefix}/$d" ]] && continue
1015 if [ -h "/$d" ]; then
1016 inst "/$d" "${prefix}/$d"
1017 else
1018 mkdir -m 0755 -p "${initdir}${prefix}/$d"
1019 fi
1020 done
33ee031c 1021fi
0f86847d 1022
14c47b0e
HH
1023if [[ $kernel_only != yes ]]; then
1024 mkdir -p "${initdir}/etc/cmdline.d"
4fed3ddf
HH
1025 for _d in $hookdirs; do
1026 mkdir -m 0755 -p ${initdir}/lib/dracut/hooks/$_d
1027 done
26144216 1028 if [[ "$UID" = "0" ]]; then
ad200fbc
HH
1029 [ -c ${initdir}/dev/null ] || mknod ${initdir}/dev/null c 1 3
1030 [ -c ${initdir}/dev/kmsg ] || mknod ${initdir}/dev/kmsg c 1 11
1031 [ -c ${initdir}/dev/console ] || mknod ${initdir}/dev/console c 5 1
26144216 1032 fi
14c47b0e 1033fi
96b8d60a 1034
1b7fd0fa 1035mods_to_load=""
66ac3cd1
VL
1036# check all our modules to see if they should be sourced.
1037# This builds a list of modules that we will install next.
1b7fd0fa
AW
1038for_each_module_dir check_module
1039for_each_module_dir check_mount
1040
b093aa2d 1041[[ "$mods_to_load " == *01fips\ * ]] && export DRACUT_FIPS_MODE=1
89d44e72 1042
ec3c5951 1043_isize=0 #initramfs size
979c4a93 1044modules_loaded=" "
95bde758 1045# source our modules.
5d791c0e 1046for moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do
979c4a93 1047 _d_mod=${moddir##*/}; _d_mod=${_d_mod#[0-9][0-9]}
b093aa2d
HH
1048 if [[ "$mods_to_load" == *\ $_d_mod\ * ]]; then
1049 if [[ $show_modules = yes ]]; then
1050 printf "%s\n" "$_d_mod"
1051 else
979c4a93 1052 dinfo "*** Including module: $_d_mod ***"
b093aa2d
HH
1053 fi
1054 if [[ $kernel_only == yes ]]; then
1055 module_installkernel "$_d_mod" || {
a6d3be9d
AW
1056 dfatal "installkernel failed in module $_d_mod"
1057 exit 1
1058 }
cc02093d 1059 else
b093aa2d 1060 module_install "$_d_mod"
95d2dabc 1061 if [[ $no_kernel != yes ]]; then
b093aa2d 1062 module_installkernel "$_d_mod" || {
a6d3be9d
AW
1063 dfatal "installkernel failed in module $_d_mod"
1064 exit 1
1065 }
cc02093d
HH
1066 fi
1067 fi
979c4a93
HH
1068 mods_to_load=${mods_to_load// $_d_mod /}
1069 modules_loaded+="$_d_mod "
ec3c5951
DY
1070
1071 #print the module install size
1072 if [ -n "$printsize" ]; then
1073 _isize_new=$(du -sk ${initdir}|cut -f1)
b093aa2d
HH
1074 _isize_delta=$((_isize_new - _isize))
1075 printf "%s\n" "$_d_mod install size: ${_isize_delta}k"
ec3c5951
DY
1076 _isize=$_isize_new
1077 fi
66ac3cd1 1078 fi
15136762 1079done
20abd914 1080unset moddir
0a35a80b
HH
1081
1082for i in $modules_loaded; do
43fed151 1083 mkdir -p $initdir/lib/dracut
b093aa2d 1084 printf "%s\n" "$i" >> $initdir/lib/dracut/modules.txt
0a35a80b
HH
1085done
1086
ea216a65 1087dinfo "*** Including modules done ***"
aabc0553 1088
0f86847d 1089## final stuff that has to happen
89d44e72 1090if [[ $no_kernel != yes ]]; then
aec9f902
HH
1091
1092 if [[ $drivers ]]; then
1093 hostonly='' instmods $drivers
1094 fi
1095
1096 if [[ $add_drivers ]]; then
1097 hostonly='' instmods -c $add_drivers
1098 fi
1099 if [[ $filesystems ]]; then
1100 hostonly='' instmods -c $filesystems
1101 fi
1102
89d44e72
HH
1103 dinfo "*** Installing kernel module dependencies and firmware ***"
1104 dracut_kernel_post
1105 dinfo "*** Installing kernel module dependencies and firmware done ***"
83bb0893
HH
1106
1107 if [[ $noimageifnotneeded == yes ]] && [[ $hostonly ]]; then
1108 if [[ ! -f "$initdir/lib/dracut/need-initqueue" ]] && \
1109 [[ -f ${initdir}/lib/modules/$kernel/modules.dep && ! -s ${initdir}/lib/modules/$kernel/modules.dep ]]; then
1110 for i in ${initdir}/etc/cmdline.d/*.conf; do
1111 # We need no initramfs image and do not generate one.
1112 [[ $i == "${initdir}/etc/cmdline.d/*.conf" ]] && exit 0
1113 done
1114 fi
1115 fi
89d44e72 1116fi
d8aeb3a7 1117
998bf6e0 1118if [[ $kernel_only != yes ]]; then
af119460 1119 (( ${#install_items[@]} > 0 )) && inst_multiple ${install_items[@]}
998bf6e0 1120
b093aa2d 1121 [[ $kernel_cmdline ]] && printf "%s\n" "$kernel_cmdline" >> "${initdir}/etc/cmdline.d/01-default.conf"
d20fb951 1122
998bf6e0 1123 while pop fstab_lines line; do
b093aa2d 1124 printf "%s\n" "$line 0 0" >> "${initdir}/etc/fstab"
998bf6e0
HH
1125 done
1126
1127 for f in $add_fstab; do
b093aa2d 1128 cat "$f" >> "${initdir}/etc/fstab"
998bf6e0
HH
1129 done
1130
6c6d8057
HH
1131 if [ -d ${initdir}/$systemdutildir ]; then
1132 mkdir -p ${initdir}/etc/conf.d
1133 {
b093aa2d
HH
1134 printf "%s\n" "systemdutildir=\"$systemdutildir\""
1135 printf "%s\n" "systemdsystemunitdir=\"$systemdsystemunitdir\""
1136 printf "%s\n" "systemdsystemconfdir=\"$systemdsystemconfdir\""
6c6d8057
HH
1137 } > ${initdir}/etc/conf.d/systemd.conf
1138 fi
1139
998bf6e0
HH
1140 if [[ $DRACUT_RESOLVE_LAZY ]] && [[ $DRACUT_INSTALL ]]; then
1141 dinfo "*** Resolving executable dependencies ***"
1142 find "$initdir" -type f \
1143 '(' -perm -0100 -or -perm -0010 -or -perm -0001 ')' \
1144 -not -path '*.ko' -print0 \
b093aa2d 1145 | xargs -r -0 $DRACUT_INSTALL ${initdir+-D "$initdir"} -R ${DRACUT_FIPS_MODE+-H} --
998bf6e0
HH
1146 dinfo "*** Resolving executable dependencies done***"
1147 fi
1148fi
1149
661f9a34
HH
1150while pop include_src src && pop include_target tgt; do
1151 if [[ $src && $tgt ]]; then
1152 if [[ -f $src ]]; then
1153 inst $src $tgt
1154 else
3b403b32 1155 ddebug "Including directory: $src"
661f9a34 1156 mkdir -p "${initdir}/${tgt}"
dbad9f46 1157 # check for preexisting symlinks, so we can cope with the
fd786adc 1158 # symlinks to $prefix
dbad9f46
HH
1159 for i in "$src"/*; do
1160 [[ -e "$i" || -h "$i" ]] || continue
1161 s=${initdir}/${tgt}/${i#$src/}
1162 if [[ -d "$i" ]]; then
1163 if ! [[ -e "$s" ]]; then
1164 mkdir -m 0755 -p "$s"
1165 chmod --reference="$i" "$s"
1166 fi
98eb6d57 1167 cp --reflink=auto --sparse=auto -fa -t "$s" "$i"/*
dbad9f46 1168 else
98eb6d57 1169 cp --reflink=auto --sparse=auto -fa -t "$s" "$i"
3b403b32 1170 fi
dbad9f46 1171 done
661f9a34 1172 fi
4fea3ea6 1173 fi
661f9a34 1174done
88ffd2df 1175
14c47b0e 1176if [[ $kernel_only != yes ]]; then
1254925f
HH
1177 # make sure that library links are correct and up to date
1178 for f in /etc/ld.so.conf /etc/ld.so.conf.d/*; do
482c573d 1179 [[ -f $f ]] && inst_simple "$f"
1254925f
HH
1180 done
1181 if ! ldconfig -r "$initdir"; then
1182 if [[ $UID = 0 ]]; then
1183 derror "ldconfig exited ungracefully"
1184 else
1185 derror "ldconfig might need uid=0 (root) for chroot()"
1186 fi
432196ae
1187 fi
1188fi
fdc421db 1189
b093aa2d 1190PRELINK_BIN="$(command -v prelink)"
404815ea
HH
1191if [[ $UID = 0 ]] && [[ $PRELINK_BIN ]]; then
1192 if [[ $DRACUT_FIPS_MODE ]]; then
8461734e 1193 dinfo "*** Installing prelink files ***"
af119460 1194 inst_multiple -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf /etc/prelink.cache
404815ea
HH
1195 else
1196 dinfo "*** Pre-linking files ***"
af119460 1197 inst_multiple -o prelink /etc/prelink.conf /etc/prelink.conf.d/*.conf
b093aa2d
HH
1198 chroot "$initdir" "$PRELINK_BIN" -a
1199 rm -f -- "$initdir/$PRELINK_BIN"
32bd2fbb 1200 rm -fr -- "$initdir"/etc/prelink.*
404815ea
HH
1201 dinfo "*** Pre-linking files done ***"
1202 fi
1203fi
1204
1205if [[ $do_hardlink = yes ]] && command -v hardlink >/dev/null; then
1206 dinfo "*** Hardlinking files ***"
1207 hardlink "$initdir" 2>&1
1208 dinfo "*** Hardlinking files done ***"
1209fi
1210
3b403b32 1211# strip binaries
98adb06e 1212if [[ $do_strip = yes ]] ; then
69b35075 1213 for p in strip xargs find; do
cc02093d 1214 if ! type -P $p >/dev/null; then
fefd3f66 1215 dinfo "Could not find '$p'. Not stripping the initramfs."
cc02093d
HH
1216 do_strip=no
1217 fi
31f7db66
HH
1218 done
1219fi
1220
5ae33613 1221if [[ $do_strip = yes ]] && ! [[ $DRACUT_FIPS_MODE ]]; then
89d44e72 1222 dinfo "*** Stripping files ***"
5ae33613
HH
1223 find "$initdir" -type f \
1224 -executable -not -path '*/lib/modules/*.ko' -print0 \
1225 | xargs -r -0 strip -g 2>/dev/null
2d9b156e
HH
1226
1227 # strip kernel modules, but do not touch signed modules
1228 find "$initdir" -type f -path '*/lib/modules/*.ko' -print0 \
1229 | while read -r -d $'\0' f; do
1230 SIG=$(tail -c 28 "$f")
b093aa2d 1231 [[ $SIG == '~Module signature appended~' ]] || { printf "%s\000" "$f"; }
2d9b156e
HH
1232 done | xargs -r -0 strip -g
1233
89d44e72 1234 dinfo "*** Stripping files done ***"
979c4a93 1235fi
5f2c30d9
KRW
1236if [[ $early_microcode = yes ]]; then
1237 dinfo "*** Generating early-microcode cpio image ***"
1238 ucode_dir=(amd-ucode intel-ucode)
1239 ucode_dest=(AuthenticAMD.bin GenuineIntel.bin)
1240 _dest_dir="$microcode_dir/d/kernel/x86/microcode"
1241 _dest_idx="0 1"
1242 mkdir -p $_dest_dir
1243 if [[ $hostonly ]]; then
1244 [[ $(get_cpu_vendor) == "AMD" ]] && _dest_idx="0"
1245 [[ $(get_cpu_vendor) == "Intel" ]] && _dest_idx="1"
1246 fi
1247 for idx in $_dest_idx; do
1248 _fw=${ucode_dir[$idx]}
1249 for _fwdir in $fw_dir; do
1250 if [[ -d $_fwdir && -d $_fwdir/$_fw ]]; then
1251 _src="*"
1252 dinfo "*** Constructing ${ucode_dest[$idx]} ****"
1253 if [[ $hostonly ]]; then
1254 _src=$(get_ucode_file)
1255 fi
1256 cat $_fwdir/$_fw/$_src > $_dest_dir/${ucode_dest[$idx]}
1257 fi
1258 done
1259 done
283c34fc 1260 (cd "$microcode_dir/d"; find . -print0 | cpio --null -o -H newc --quiet >../ucode.cpio)
5f2c30d9 1261fi
bbaa0d59 1262
32bd2fbb 1263rm -f -- "$outfile"
89d44e72 1264dinfo "*** Creating image file ***"
5f2c30d9
KRW
1265if [[ $early_microcode = yes ]]; then
1266 # The microcode blob is _before_ the initramfs blob, not after
1267 mv $microcode_dir/ucode.cpio $outfile.$$
1268fi
283c34fc 1269if ! ( umask 077; cd "$initdir"; find . -print0 | cpio --null -R 0:0 -H newc -o --quiet| \
5f2c30d9 1270 $compress >> "$outfile.$$"; ); then
9a9c6e12 1271 dfatal "dracut: creation of $outfile.$$ failed"
734a0d9e 1272 exit 1
3b403b32 1273fi
b093aa2d 1274mv -- "$outfile.$$" "$outfile"
89d44e72 1275dinfo "*** Creating image file done ***"
432196ae 1276
bbaa0d59 1277if (( maxloglvl >= 5 )); then
dadd2b69
HH
1278 if [[ $allowlocal ]]; then
1279 "$dracutbasedir/lsinitrd.sh" "$outfile"| ddebug
1280 else
1281 lsinitrd "$outfile"| ddebug
1282 fi
bbaa0d59 1283fi
1faecdc1 1284
3da58569 1285exit 0