]> git.proxmox.com Git - pve-kernel-meta.git/blame - bin/pveesptool
pve-kernel-helper: add new package
[pve-kernel-meta.git] / bin / pveesptool
CommitLineData
b3d47d2d
SI
1#!/bin/sh
2
3set -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
57format() {
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
95init() {
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
144refresh() {
145 hookscript='/etc/kernel/postinst.d/zz-pve-efiboot'
146 echo "Running hook script '$hookscript'.."
147 exec $hookscript
148}
149
150usage() {
151 warn "USAGE: $0 <commands> [ARGS]"
152 warn ""
153 warn " $0 format <partition> [--force]"
154 warn " $0 init <partition>"
155 warn " $0 refresh"
156}
157
158help() {
159 echo "USAGE: $0 format <partition> [--force]"
160 echo ""
161 echo " format <partition> as EFI system partition. Use --force to format even if <partition> is currently in use."
162 echo ""
163 echo "USAGE: $0 init <partition>"
164 echo ""
165 echo " initialize EFI system partition at <partition> for automatic synchronization of pve-kernels and their associated initrds."
166 echo ""
167 echo "USAGE: $0 refresh"
168 echo ""
169 echo " refresh all configured EFI system partitions."
170 echo ""
171}
172
173if [ -z "$1" ]; then
174 usage
175 exit 0
176fi
177
178case "$1" in
179 'format')
180 shift
181 if [ -z "$1" ]; then
182 warn "E: <partition> is mandatory."
183 warn ""
184 usage
185 exit 1
186 fi
187 format "$@"
188 exit 0
189 ;;
190 'init')
191 shift
192 if [ -z "$1" ]; then
193 warn "E: <partition> is mandatory."
194 warn ""
195 usage
196 exit 1
197 fi
198 init "$@"
199 exit 0
200 ;;
201 'refresh')
202 shift
203 refresh
204 exit 0
205 ;;
206 'help')
207 shift
208 help
209 exit 0
210 ;;
211 *)
212 warn "Invalid/unknown command '$1'."
213 warn ""
214 usage
215 exit 1
216 ;;
217esac
218
219exit 1