]> glassweightruler.freedombox.rocks Git - Ventoy.git/blob - INSTALL/tool/ventoy_lib.sh
update CI build script
[Ventoy.git] / INSTALL / tool / ventoy_lib.sh
1 #!/bin/sh
2
3 #Ventoy partition 32MB
4 VENTOY_PART_SIZE=33554432
5 VENTOY_PART_SIZE_MB=32
6 VENTOY_SECTOR_SIZE=512
7 VENTOY_SECTOR_NUM=65536
8
9 ventoy_false() {
10 [ "1" = "2" ]
11 }
12
13 ventoy_true() {
14 [ "1" = "1" ]
15 }
16
17
18 vtinfo() {
19 echo -e "\033[32m$*\033[0m"
20 }
21
22 vtwarn() {
23 echo -e "\033[33m$*\033[0m"
24 }
25
26
27 vterr() {
28 echo -e "\033[31m$*\033[0m"
29 }
30
31 vtdebug() {
32 echo "$*" >> ./log.txt
33 }
34
35 vtoy_gen_uuid() {
36 if uuid -F BIN > /dev/null 2>&1; then
37 uuid -F BIN
38 elif uuidgen -V > /dev/null 2>&1; then
39 a=$(uuidgen | sed 's/-//g')
40 echo -en "\x${a:0:2}\x${a:2:2}\x${a:4:2}\x${a:6:2}\x${a:8:2}\x${a:10:2}\x${a:12:2}\x${a:14:2}\x${a:16:2}\x${a:18:2}\x${a:20:2}\x${a:22:2}\x${a:24:2}\x${a:26:2}\x${a:28:2}\x${a:30:2}"
41 elif python -V > /dev/null 2>&1; then
42 a=$(python -c 'import sys,uuid; sys.stdout.write(uuid.uuid4().hex)')
43 echo -en "\x${a:0:2}\x${a:2:2}\x${a:4:2}\x${a:6:2}\x${a:8:2}\x${a:10:2}\x${a:12:2}\x${a:14:2}\x${a:16:2}\x${a:18:2}\x${a:20:2}\x${a:22:2}\x${a:24:2}\x${a:26:2}\x${a:28:2}\x${a:30:2}"
44 elif [ -e /dev/urandom ]; then
45 dd if=/dev/urandom bs=1 count=16 status=none
46 else
47 datestr=$(date +%N%N%N%N%N)
48 a=${datestr:0:32}
49 echo -en "\x${a:0:2}\x${a:2:2}\x${a:4:2}\x${a:6:2}\x${a:8:2}\x${a:10:2}\x${a:12:2}\x${a:14:2}\x${a:16:2}\x${a:18:2}\x${a:20:2}\x${a:22:2}\x${a:24:2}\x${a:26:2}\x${a:28:2}\x${a:30:2}"
50 fi
51 }
52
53 check_tool_work_ok() {
54
55 if echo 1 | hexdump > /dev/null; then
56 vtdebug "hexdump test ok ..."
57 else
58 vtdebug "hexdump test fail ..."
59 ventoy_false
60 return
61 fi
62
63 if mkexfatfs -V > /dev/null; then
64 vtdebug "mkexfatfs test ok ..."
65 else
66 vtdebug "mkexfatfs test fail ..."
67 ventoy_false
68 return
69 fi
70
71 if vtoyfat -T; then
72 vtdebug "vtoyfat test ok ..."
73 else
74 vtdebug "vtoyfat test fail ..."
75 ventoy_false
76 return
77 fi
78
79 vtdebug "tool check success ..."
80 ventoy_true
81 }
82
83
84 get_disk_part_name() {
85 DISK=$1
86
87 if echo $DISK | grep -q "/dev/loop"; then
88 echo ${DISK}p${2}
89 elif echo $DISK | grep -q "/dev/nvme[0-9][0-9]*n[0-9]"; then
90 echo ${DISK}p${2}
91 elif echo $DISK | grep -q "/dev/mmcblk[0-9]"; then
92 echo ${DISK}p${2}
93 else
94 echo ${DISK}${2}
95 fi
96 }
97
98
99 get_ventoy_version_from_cfg() {
100 if grep -q 'set.*VENTOY_VERSION=' $1; then
101 grep 'set.*VENTOY_VERSION=' $1 | awk -F'"' '{print $2}'
102 else
103 echo 'none'
104 fi
105 }
106
107 is_disk_contains_ventoy() {
108 DISK=$1
109
110 PART1=$(get_disk_part_name $1 1)
111 PART2=$(get_disk_part_name $1 2)
112
113 if [ -e /sys/class/block/${PART2#/dev/}/size ]; then
114 SIZE=$(cat /sys/class/block/${PART2#/dev/}/size)
115 else
116 SIZE=0
117 fi
118
119 if ! [ -b $PART1 ]; then
120 vtdebug "$PART1 not exist"
121 ventoy_false
122 return
123 fi
124
125 if ! [ -b $PART2 ]; then
126 vtdebug "$PART2 not exist"
127 ventoy_false
128 return
129 fi
130
131 PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
132 PART2_TYPE=$(dd if=$DISK bs=1 count=1 skip=466 status=none | hexdump -n1 -e '1/1 "%02X"')
133
134 # if [ "$PART1_TYPE" != "EE" ]; then
135 # if [ "$PART2_TYPE" != "EF" ]; then
136 # vtdebug "part2 type is $PART2_TYPE not EF"
137 # ventoy_false
138 # return
139 # fi
140 # fi
141
142 # PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
143 # if [ "$PART1_TYPE" != "07" ]; then
144 # vtdebug "part1 type is $PART2_TYPE not 07"
145 # ventoy_false
146 # return
147 # fi
148
149 if [ -e /sys/class/block/${PART1#/dev/}/start ]; then
150 PART1_START=$(cat /sys/class/block/${PART1#/dev/}/start)
151 fi
152
153 if [ "$PART1_START" != "2048" ]; then
154 vtdebug "part1 start is $PART1_START not 2048"
155 ventoy_false
156 return
157 fi
158
159 if [ "$VENTOY_SECTOR_NUM" != "$SIZE" ]; then
160 vtdebug "part2 size is $SIZE not $VENTOY_SECTOR_NUM"
161 ventoy_false
162 return
163 fi
164
165 ventoy_true
166 }
167
168 check_disk_secure_boot() {
169 if ! is_disk_contains_ventoy $1; then
170 ventoy_false
171 return
172 fi
173
174 PART2=$(get_disk_part_name $1 2)
175
176 vtoyfat -s $PART2
177 }
178
179 get_disk_ventoy_version() {
180
181 if ! is_disk_contains_ventoy $1; then
182 ventoy_false
183 return
184 fi
185
186 PART2=$(get_disk_part_name $1 2)
187
188 ParseVer=$(vtoyfat $PART2)
189 if [ $? -eq 0 ]; then
190 vtdebug "Ventoy version in $PART2 is $ParseVer"
191 echo $ParseVer
192 ventoy_true
193 return
194 fi
195
196 ventoy_false
197 }
198
199 format_ventoy_disk_mbr() {
200 reserve_mb=$1
201 DISK=$2
202 PARTTOOL=$3
203
204 PART1=$(get_disk_part_name $DISK 1)
205 PART2=$(get_disk_part_name $DISK 2)
206
207 sector_num=$(cat /sys/block/${DISK#/dev/}/size)
208
209 part1_start_sector=2048
210
211 if [ $reserve_mb -gt 0 ]; then
212 reserve_sector_num=$(expr $reserve_mb \* 2048)
213 part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
214 else
215 part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 1)
216 fi
217
218 part2_start_sector=$(expr $part1_end_sector + 1)
219 part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
220
221 export part2_start_sector
222
223 vtdebug "part1_start_sector=$part1_start_sector part1_end_sector=$part1_end_sector"
224 vtdebug "part2_start_sector=$part2_start_sector part2_end_sector=$part2_end_sector"
225
226 if [ -e $PART2 ]; then
227 echo "delete $PART2"
228 rm -f $PART2
229 fi
230
231 echo ""
232 echo "Create partitions on $DISK by $PARTTOOL in MBR style ..."
233
234 if [ "$PARTTOOL" = "parted" ]; then
235 vtdebug "format disk by parted ..."
236 parted -a none --script $DISK \
237 mklabel msdos \
238 unit s \
239 mkpart primary ntfs $part1_start_sector $part1_end_sector \
240 mkpart primary fat16 $part2_start_sector $part2_end_sector \
241 set 1 boot on \
242 quit
243
244 sync
245 echo -en '\xEF' | dd of=$DISK conv=fsync bs=1 count=1 seek=466 > /dev/null 2>&1
246 else
247 vtdebug "format disk by fdisk ..."
248
249 fdisk $DISK >>./log.txt 2>&1 <<EOF
250 o
251 n
252 p
253 1
254 $part1_start_sector
255 $part1_end_sector
256 n
257 p
258 2
259 $part2_start_sector
260 $part2_end_sector
261 t
262 1
263 7
264 t
265 2
266 ef
267 a
268 1
269 w
270 EOF
271 fi
272
273 udevadm trigger --name-match=$DISK >/dev/null 2>&1
274 partprobe >/dev/null 2>&1
275 sleep 3
276 echo "Done"
277
278 echo 'mkfs on disk partitions ...'
279 for i in 1 2 3 4 5 6 7; do
280 if [ -b $PART2 ]; then
281 break
282 else
283 echo "wait $PART2 ..."
284 sleep 1
285 fi
286 done
287
288
289 if ! [ -b $PART2 ]; then
290 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
291 echo "mknod -m 0660 $PART2 b $MajorMinor ..."
292 mknod -m 0660 $PART2 b $MajorMinor
293
294 if ! [ -b $PART1 ]; then
295 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
296 echo "mknod -m 0660 $PART1 b $MajorMinor ..."
297 mknod -m 0660 $PART1 b $MajorMinor
298 fi
299 fi
300
301 echo "create efi fat fs $PART2 ..."
302 for i in 0 1 2 3 4 5 6 7 8 9; do
303 if mkfs.vfat -F 16 -n VTOYEFI $PART2; then
304 echo 'success'
305 break
306 else
307 echo "$? retry ..."
308 sleep 2
309 fi
310 done
311 }
312
313
314 format_ventoy_disk_gpt() {
315 reserve_mb=$1
316 DISK=$2
317 PARTTOOL=$3
318
319 PART1=$(get_disk_part_name $DISK 1)
320 PART2=$(get_disk_part_name $DISK 2)
321
322 sector_num=$(cat /sys/block/${DISK#/dev/}/size)
323
324 part1_start_sector=2048
325
326 if [ $reserve_mb -gt 0 ]; then
327 reserve_sector_num=$(expr $reserve_mb \* 2048 + 33)
328 part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
329 else
330 part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 34)
331 fi
332
333 part2_start_sector=$(expr $part1_end_sector + 1)
334 part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
335
336 export part2_start_sector
337
338 vtdebug "part1_start_sector=$part1_start_sector part1_end_sector=$part1_end_sector"
339 vtdebug "part2_start_sector=$part2_start_sector part2_end_sector=$part2_end_sector"
340
341 if [ -e $PART2 ]; then
342 echo "delete $PART2"
343 rm -f $PART2
344 fi
345
346 echo ""
347 echo "Create partitions on $DISK by $PARTTOOL in GPT style ..."
348
349 vtdebug "format disk by parted ..."
350
351 if [ "$TOOLDIR" != "aarch64" ]; then
352 vt_set_efi_type="set 2 msftdata on"
353 fi
354
355 parted -a none --script $DISK \
356 mklabel gpt \
357 unit s \
358 mkpart Ventoy ntfs $part1_start_sector $part1_end_sector \
359 mkpart VTOYEFI fat16 $part2_start_sector $part2_end_sector \
360 $vt_set_efi_type \
361 set 2 hidden on \
362 quit
363
364 sync
365
366 vtoygpt -f $DISK
367 sync
368
369 udevadm trigger --name-match=$DISK >/dev/null 2>&1
370 partprobe >/dev/null 2>&1
371 sleep 3
372 echo "Done"
373
374 echo 'mkfs on disk partitions ...'
375 for i in 1 2 3 4 5 6 7; do
376 if [ -b $PART2 ]; then
377 break
378 else
379 echo "wait $PART2 ..."
380 sleep 1
381 fi
382 done
383
384
385 if ! [ -b $PART2 ]; then
386 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
387 echo "mknod -m 0660 $PART2 b $MajorMinor ..."
388 mknod -m 0660 $PART2 b $MajorMinor
389
390 if ! [ -b $PART1 ]; then
391 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
392 echo "mknod -m 0660 $PART1 b $MajorMinor ..."
393 mknod -m 0660 $PART1 b $MajorMinor
394 fi
395 fi
396
397 echo "create efi fat fs $PART2 ..."
398 for i in 0 1 2 3 4 5 6 7 8 9; do
399 if mkfs.vfat -F 16 -n VTOYEFI $PART2; then
400 echo 'success'
401 break
402 else
403 echo "$? retry ..."
404 sleep 2
405 fi
406 done
407 }
408
409
410
411
412