]> git.ipfire.org Git - thirdparty/dracut.git/blob - 51-dracut-rescue.install
iscsi: always popd, even if there is no iscsi device
[thirdparty/dracut.git] / 51-dracut-rescue.install
1 #!/bin/bash
2
3 export LANG=C
4
5 COMMAND="$1"
6 KERNEL_VERSION="$2"
7 BOOT_DIR_ABS="${3%/*}/0-rescue"
8 KERNEL_IMAGE="$4"
9
10
11 dropindirs_sort()
12 {
13 suffix=$1; shift
14 args=("$@")
15 files=$(
16 while (( $# > 0 )); do
17 for i in ${1}/*${suffix}; do
18 [[ -f $i ]] && echo ${i##*/}
19 done
20 shift
21 done | sort -Vu
22 )
23
24 for f in $files; do
25 for d in "${args[@]}"; do
26 if [[ -f "$d/$f" ]]; then
27 echo "$d/$f"
28 continue 2
29 fi
30 done
31 done
32 }
33
34 [[ -f /etc/os-release ]] && . /etc/os-release
35
36 if [[ ${KERNEL_INSTALL_MACHINE_ID+x} ]]; then
37 MACHINE_ID=$KERNEL_INSTALL_MACHINE_ID
38 elif [[ -f /etc/machine-id ]] ; then
39 read MACHINE_ID < /etc/machine-id
40 fi
41
42 if ! [[ $MACHINE_ID ]]; then
43 exit 0
44 fi
45
46 if [[ -f /etc/kernel/cmdline ]]; then
47 read -r -d '' -a BOOT_OPTIONS < /etc/kernel/cmdline
48 elif [[ -f /usr/lib/kernel/cmdline ]]; then
49 read -r -d '' -a BOOT_OPTIONS < /usr/lib/kernel/cmdline
50 fi
51
52 if ! [[ "${BOOT_OPTIONS[@]}" ]]; then
53 read -r -d '' -a line < /proc/cmdline
54 for i in "${line[@]}"; do
55 [[ "${i#initrd=*}" != "$i" ]] && continue
56 BOOT_OPTIONS+=("$i")
57 done
58 fi
59
60 if ! [[ ${BOOT_OPTIONS[*]} ]]; then
61 echo "Could not determine the kernel command line parameters." >&2
62 echo "Please specify the kernel command line in /etc/kernel/cmdline!" >&2
63 exit 1
64 fi
65
66 if [[ -d "${BOOT_DIR_ABS%/*}" ]]; then
67 BOOT_DIR="/${MACHINE_ID}/0-rescue"
68 BOOT_ROOT=${BOOT_DIR_ABS%$BOOT_DIR}
69 LOADER_ENTRY="$BOOT_ROOT/loader/entries/${MACHINE_ID}-0-rescue.conf"
70 KERNEL="linux"
71 INITRD="initrd"
72 else
73 BLS_DIR="/boot/loader/entries"
74 BOOT_DIR_ABS="/boot"
75 LOADER_ENTRY="$BLS_DIR/${MACHINE_ID}-0-rescue.conf"
76 KERNEL="vmlinuz-0-rescue-${MACHINE_ID}"
77 INITRD="initramfs-0-rescue-${MACHINE_ID}.img"
78 fi
79
80 ret=0
81
82 case "$COMMAND" in
83 add)
84 [[ -f "$LOADER_ENTRY" ]] && [[ -f "$BOOT_DIR_ABS/$KERNEL" ]] \
85 && [[ -f "$BOOT_DIR_ABS/$INITRD" ]] && exit 0
86
87 # source our config dir
88 for f in $(dropindirs_sort ".conf" "/etc/dracut.conf.d" "/usr/lib/dracut/dracut.conf.d"); do
89 [[ -e $f ]] && . "$f"
90 done
91
92 [[ $dracut_rescue_image != "yes" ]] && exit 0
93
94 [[ -d "$BOOT_DIR_ABS" ]] || mkdir -p "$BOOT_DIR_ABS"
95
96 if ! cp --reflink=auto "$KERNEL_IMAGE" "$BOOT_DIR_ABS/$KERNEL"; then
97 echo "Can't copy '$KERNEL_IMAGE to '$BOOT_DIR_ABS/$KERNEL'!" >&2
98 fi
99
100 if [[ ! -f "$BOOT_DIR_ABS/$INITRD" ]]; then
101 dracut -f --no-hostonly -a "rescue" "$BOOT_DIR_ABS/$INITRD" "$KERNEL_VERSION"
102 ((ret+=$?))
103 fi
104
105 if [[ "${BOOT_DIR_ABS}" != "/boot" ]]; then
106 {
107 echo "title $PRETTY_NAME - Rescue Image"
108 echo "version $KERNEL_VERSION"
109 echo "machine-id $MACHINE_ID"
110 echo "options ${BOOT_OPTIONS[@]} rd.auto=1"
111 echo "linux $BOOT_DIR/linux"
112 echo "initrd $BOOT_DIR/initrd"
113 } > $LOADER_ENTRY
114 else
115 cp -aT "${KERNEL_IMAGE%/*}/bls.conf" $LOADER_ENTRY
116 sed -i 's/'$KERNEL_VERSION'/0-rescue-'${MACHINE_ID}'/' $LOADER_ENTRY
117 fi
118
119 ((ret+=$?))
120 ;;
121
122 remove)
123 exit 0
124 ;;
125
126 *)
127 usage
128 ret=1;;
129 esac
130
131 exit $ret