]> git.proxmox.com Git - pve-kernel-meta.git/blob - bin/pve-efiboot-tool
rename pveesptool to pve-efiboot-tool
[pve-kernel-meta.git] / bin / pve-efiboot-tool
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"
156 warn " $0 help"
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')
192 shift
193 if [ -z "$1" ]; then
194 warn "E: <partition> is mandatory."
195 warn ""
196 usage
197 exit 1
198 fi
199 init "$@"
200 exit 0
201 ;;
202 'refresh')
203 shift
204 refresh
205 exit 0
206 ;;
207 'help')
208 shift
209 help
210 exit 0
211 ;;
212 *)
213 warn "Invalid/unknown command '$1'."
214 warn ""
215 usage
216 exit 1
217 ;;
218 esac
219
220 exit 1