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