]>
Commit | Line | Data |
---|---|---|
b3d47d2d SI |
1 | #!/bin/sh |
2 | ||
3 | set -e | |
4 | ||
5 | . /usr/share/pve-kernel-helper/scripts/functions | |
6 | ||
7 | ||
8 | _get_partition_info() { | |
9 | if [ ! -e "$1" ]; then | |
10 | warn "E: '$1' does not exist!" | |
11 | exit 1 | |
12 | fi | |
13 | bdev=$(realpath "$1") | |
14 | if [ ! -b "$bdev" ]; then | |
15 | warn "E: '$bdev' is not a block device!" | |
16 | exit 1 | |
17 | fi | |
18 | ||
19 | bdev_info=$( \ | |
20 | lsblk \ | |
21 | --bytes \ | |
22 | --pairs \ | |
23 | -o 'UUID,SIZE,FSTYPE,PARTTYPE,PKNAME,MOUNTPOINT' \ | |
24 | "$bdev" \ | |
25 | ) | |
26 | if [ -z "$bdev_info" ]; then | |
27 | warn "E: unable to get information about block device '$1'!" | |
28 | exit 1 | |
29 | fi | |
30 | ||
31 | count=$(echo "$bdev_info" | grep -c '^') | |
32 | if [ "$count" -ne '1' ]; then | |
33 | echo "$bdev_info" | |
34 | warn "E: block device '$1' has children!" | |
35 | exit 1 | |
36 | fi | |
37 | ||
38 | echo "$bdev_info" | |
39 | eval "$bdev_info" | |
40 | ||
41 | if [ -z "$PKNAME" ]; then | |
42 | warn "E: cannot determine parent device of '$1' - please provide a partition, not a full disk." | |
43 | exit 1 | |
44 | fi | |
45 | ||
46 | if [ -n "$SIZE" ] && [ "$SIZE" -lt 268435456 ]; then | |
47 | warn "E: '$1' is too small (<256M)." | |
48 | exit 1 | |
49 | fi | |
50 | ||
51 | if [ -n "$MOUNTPOINT" ]; then | |
52 | warn "E: '$1' is mounted on '$MOUNTPOINT' - exiting." | |
53 | exit 1 | |
54 | fi | |
55 | } | |
56 | ||
57 | format() { | |
58 | part="$1" | |
59 | force="$2" | |
60 | ||
61 | _get_partition_info "$part" | |
62 | ||
63 | if [ -n "$FSTYPE" ]; then | |
64 | if [ -z "$force" ] || [ "$force" != '--force' ]; then | |
65 | warn "E: '$part' contains a filesystem ('$FSTYPE') - exiting (use --force to override)" | |
66 | exit 1 | |
67 | fi | |
68 | fi | |
69 | ||
70 | part_basename=$(basename "$part") | |
71 | if [ -z "$part_basename" ]; then | |
72 | warn "E: unable to determine basename of '$part'" | |
73 | exit 1 | |
74 | fi | |
75 | ||
76 | part_num=$(cat /sys/block/"$PKNAME"/"$part_basename"/partition) | |
77 | if [ -z "$part_num" ]; then | |
78 | warn "E: unable to determine partition number of '$part'" | |
79 | exit 1 | |
80 | fi | |
81 | ||
82 | if [ -z "$PARTTYPE" ] || [ "$PARTTYPE" != "$ESPTYPE" ]; then | |
83 | echo "Setting partition type of '$part' to '$ESPTYPE'.." | |
84 | sgdisk "-t$part_num:$ESPTYPE" "/dev/$PKNAME" | |
85 | echo "Calling 'udevadm settle'.." | |
86 | udevadm settle --timeout=5 | |
87 | fi | |
88 | ||
89 | echo "Formatting '$part' as vfat.." | |
90 | mkfs.vfat -F 32 "$part" | |
91 | echo "Done." | |
92 | exit 0 | |
93 | } | |
94 | ||
95 | init() { | |
96 | part="$1" | |
97 | ||
98 | _get_partition_info "$part" | |
99 | ||
100 | if [ -z "$PARTTYPE" ] || [ "$PARTTYPE" != "$ESPTYPE" ]; then | |
101 | warn "E: '$part' has wrong partition type (!= $ESPTYPE)." | |
102 | exit 1 | |
103 | fi | |
104 | ||
105 | if [ -z "$FSTYPE" ] || [ "$FSTYPE" != 'vfat' ]; then | |
106 | warn "E: '$part' has wrong filesystem (!= vfat)." | |
107 | exit 1 | |
108 | fi | |
109 | ||
110 | if [ -z "$UUID" ]; then | |
111 | warn "E: '$part' has no UUID set, required for mounting." | |
112 | exit 1 | |
113 | fi | |
114 | ||
115 | esp_mp="/var/tmp/espmounts/$UUID" | |
116 | ||
117 | mkdir -p "$esp_mp" | |
118 | echo "Mounting '$part' on '$esp_mp'." | |
119 | mount -t vfat "$part" "$esp_mp" | |
120 | ||
121 | echo "Installing systemd-boot.." | |
122 | mkdir -p "$esp_mp/$PMX_ESP_DIR" | |
123 | bootctl --path "$esp_mp" install | |
124 | ||
125 | echo "Configuring systemd-boot.." | |
126 | echo "timeout 3" > "$esp_mp/$PMX_LOADER_CONF.tmp" | |
127 | echo "default proxmox-*" >> "$esp_mp/$PMX_LOADER_CONF.tmp" | |
128 | mv "$esp_mp/$PMX_LOADER_CONF.tmp" "$esp_mp/$PMX_LOADER_CONF" | |
129 | echo "Unmounting '$part'." | |
130 | umount "$part" | |
131 | ||
132 | echo "Adding '$part' to list of synced ESPs.." | |
133 | if [ -e "$ESP_LIST" ]; then | |
134 | cp "$ESP_LIST" "$ESP_LIST.new" | |
135 | fi | |
136 | echo "$UUID" >> "$ESP_LIST.new" | |
137 | sort -uo "$ESP_LIST.new" "$ESP_LIST.new" | |
138 | mv "$ESP_LIST.new" "$ESP_LIST" | |
139 | ||
140 | echo "Refreshing kernels and initrds.." | |
141 | refresh | |
142 | } | |
143 | ||
144 | refresh() { | |
145 | hookscript='/etc/kernel/postinst.d/zz-pve-efiboot' | |
146 | echo "Running hook script '$hookscript'.." | |
147 | exec $hookscript | |
148 | } | |
149 | ||
150 | usage() { | |
151 | warn "USAGE: $0 <commands> [ARGS]" | |
152 | warn "" | |
153 | warn " $0 format <partition> [--force]" | |
154 | warn " $0 init <partition>" | |
155 | warn " $0 refresh" | |
0b99d576 | 156 | warn " $0 help" |
b3d47d2d SI |
157 | } |
158 | ||
159 | help() { | |
160 | echo "USAGE: $0 format <partition> [--force]" | |
161 | echo "" | |
162 | echo " format <partition> as EFI system partition. Use --force to format even if <partition> is currently in use." | |
163 | echo "" | |
164 | echo "USAGE: $0 init <partition>" | |
165 | echo "" | |
166 | echo " initialize EFI system partition at <partition> for automatic synchronization of pve-kernels and their associated initrds." | |
167 | echo "" | |
168 | echo "USAGE: $0 refresh" | |
169 | echo "" | |
170 | echo " refresh all configured EFI system partitions." | |
171 | echo "" | |
172 | } | |
173 | ||
174 | if [ -z "$1" ]; then | |
175 | usage | |
176 | exit 0 | |
177 | fi | |
178 | ||
179 | case "$1" in | |
180 | 'format') | |
181 | shift | |
182 | if [ -z "$1" ]; then | |
183 | warn "E: <partition> is mandatory." | |
184 | warn "" | |
185 | usage | |
186 | exit 1 | |
187 | fi | |
188 | format "$@" | |
189 | exit 0 | |
190 | ;; | |
191 | 'init') | |
420039cd | 192 | reexec_in_mountns "$@" |
b3d47d2d SI |
193 | shift |
194 | if [ -z "$1" ]; then | |
195 | warn "E: <partition> is mandatory." | |
196 | warn "" | |
197 | usage | |
198 | exit 1 | |
199 | fi | |
200 | init "$@" | |
201 | exit 0 | |
202 | ;; | |
203 | 'refresh') | |
204 | shift | |
205 | refresh | |
206 | exit 0 | |
207 | ;; | |
208 | 'help') | |
209 | shift | |
210 | help | |
211 | exit 0 | |
212 | ;; | |
213 | *) | |
214 | warn "Invalid/unknown command '$1'." | |
215 | warn "" | |
216 | usage | |
217 | exit 1 | |
218 | ;; | |
219 | esac | |
220 | ||
221 | exit 1 |