]> glassweightruler.freedombox.rocks Git - Ventoy.git/blob - INSTALL/tool/ventoy_lib.sh
1. change icon from * to a lock icon
[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 elif echo $DISK | grep -q "/dev/nbd[0-9]"; then
94 echo ${DISK}p${2}
95 else
96 echo ${DISK}${2}
97 fi
98 }
99
100
101 get_ventoy_version_from_cfg() {
102 if grep -q 'set.*VENTOY_VERSION=' $1; then
103 grep 'set.*VENTOY_VERSION=' $1 | awk -F'"' '{print $2}'
104 else
105 echo 'none'
106 fi
107 }
108
109 is_disk_contains_ventoy() {
110 DISK=$1
111
112 PART1=$(get_disk_part_name $1 1)
113 PART2=$(get_disk_part_name $1 2)
114
115 if [ -e /sys/class/block/${PART2#/dev/}/size ]; then
116 SIZE=$(cat /sys/class/block/${PART2#/dev/}/size)
117 else
118 SIZE=0
119 fi
120
121 if ! [ -b $PART1 ]; then
122 vtdebug "$PART1 not exist"
123 ventoy_false
124 return
125 fi
126
127 if ! [ -b $PART2 ]; then
128 vtdebug "$PART2 not exist"
129 ventoy_false
130 return
131 fi
132
133 PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
134 PART2_TYPE=$(dd if=$DISK bs=1 count=1 skip=466 status=none | hexdump -n1 -e '1/1 "%02X"')
135
136 # if [ "$PART1_TYPE" != "EE" ]; then
137 # if [ "$PART2_TYPE" != "EF" ]; then
138 # vtdebug "part2 type is $PART2_TYPE not EF"
139 # ventoy_false
140 # return
141 # fi
142 # fi
143
144 # PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
145 # if [ "$PART1_TYPE" != "07" ]; then
146 # vtdebug "part1 type is $PART2_TYPE not 07"
147 # ventoy_false
148 # return
149 # fi
150
151 if [ -e /sys/class/block/${PART1#/dev/}/start ]; then
152 PART1_START=$(cat /sys/class/block/${PART1#/dev/}/start)
153 fi
154
155 if [ "$PART1_START" != "2048" ]; then
156 vtdebug "part1 start is $PART1_START not 2048"
157 ventoy_false
158 return
159 fi
160
161 if [ "$VENTOY_SECTOR_NUM" != "$SIZE" ]; then
162 vtdebug "part2 size is $SIZE not $VENTOY_SECTOR_NUM"
163 ventoy_false
164 return
165 fi
166
167 ventoy_true
168 }
169
170 check_disk_secure_boot() {
171 if ! is_disk_contains_ventoy $1; then
172 ventoy_false
173 return
174 fi
175
176 PART2=$(get_disk_part_name $1 2)
177
178 vtoyfat -s $PART2
179 }
180
181 get_disk_ventoy_version() {
182
183 if ! is_disk_contains_ventoy $1; then
184 ventoy_false
185 return
186 fi
187
188 PART2=$(get_disk_part_name $1 2)
189
190 ParseVer=$(vtoyfat $PART2)
191 if [ $? -eq 0 ]; then
192 vtdebug "Ventoy version in $PART2 is $ParseVer"
193 echo $ParseVer
194 ventoy_true
195 return
196 fi
197
198 ventoy_false
199 }
200
201 format_ventoy_disk_mbr() {
202 reserve_mb=$1
203 DISK=$2
204 PARTTOOL=$3
205
206 PART1=$(get_disk_part_name $DISK 1)
207 PART2=$(get_disk_part_name $DISK 2)
208
209 sector_num=$(cat /sys/block/${DISK#/dev/}/size)
210
211 part1_start_sector=2048
212
213 if [ $reserve_mb -gt 0 ]; then
214 reserve_sector_num=$(expr $reserve_mb \* 2048)
215 part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
216 else
217 part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 1)
218 fi
219
220 part2_start_sector=$(expr $part1_end_sector + 1)
221 part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
222
223 export part2_start_sector
224
225 vtdebug "part1_start_sector=$part1_start_sector part1_end_sector=$part1_end_sector"
226 vtdebug "part2_start_sector=$part2_start_sector part2_end_sector=$part2_end_sector"
227
228 if [ -e $PART2 ]; then
229 echo "delete $PART2"
230 rm -f $PART2
231 fi
232
233 echo ""
234 echo "Create partitions on $DISK by $PARTTOOL in MBR style ..."
235
236 if [ "$PARTTOOL" = "parted" ]; then
237 vtdebug "format disk by parted ..."
238 parted -a none --script $DISK \
239 mklabel msdos \
240 unit s \
241 mkpart primary ntfs $part1_start_sector $part1_end_sector \
242 mkpart primary fat16 $part2_start_sector $part2_end_sector \
243 set 1 boot on \
244 quit
245
246 sync
247 echo -en '\xEF' | dd of=$DISK conv=fsync bs=1 count=1 seek=466 > /dev/null 2>&1
248 else
249 vtdebug "format disk by fdisk ..."
250
251 fdisk $DISK >>./log.txt 2>&1 <<EOF
252 o
253 n
254 p
255 1
256 $part1_start_sector
257 $part1_end_sector
258 n
259 p
260 2
261 $part2_start_sector
262 $part2_end_sector
263 t
264 1
265 7
266 t
267 2
268 ef
269 a
270 1
271 w
272 EOF
273 fi
274
275 udevadm trigger --name-match=$DISK >/dev/null 2>&1
276 partprobe >/dev/null 2>&1
277 sleep 3
278 echo "Done"
279
280 echo 'mkfs on disk partitions ...'
281 for i in 1 2 3 4 5 6 7; do
282 if [ -b $PART2 ]; then
283 break
284 else
285 echo "wait $PART2 ..."
286 sleep 1
287 fi
288 done
289
290
291 if ! [ -b $PART2 ]; then
292 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
293 echo "mknod -m 0660 $PART2 b $MajorMinor ..."
294 mknod -m 0660 $PART2 b $MajorMinor
295
296 if ! [ -b $PART1 ]; then
297 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
298 echo "mknod -m 0660 $PART1 b $MajorMinor ..."
299 mknod -m 0660 $PART1 b $MajorMinor
300 fi
301 fi
302
303 echo "create efi fat fs $PART2 ..."
304 for i in 0 1 2 3 4 5 6 7 8 9; do
305 if mkfs.vfat -F 16 -n VTOYEFI $PART2; then
306 echo 'success'
307 break
308 else
309 echo "$? retry ..."
310 sleep 2
311 fi
312 done
313 }
314
315
316 format_ventoy_disk_gpt() {
317 reserve_mb=$1
318 DISK=$2
319 PARTTOOL=$3
320
321 PART1=$(get_disk_part_name $DISK 1)
322 PART2=$(get_disk_part_name $DISK 2)
323
324 sector_num=$(cat /sys/block/${DISK#/dev/}/size)
325
326 part1_start_sector=2048
327
328 if [ $reserve_mb -gt 0 ]; then
329 reserve_sector_num=$(expr $reserve_mb \* 2048 + 33)
330 part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
331 else
332 part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 34)
333 fi
334
335 part2_start_sector=$(expr $part1_end_sector + 1)
336 part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
337
338 export part2_start_sector
339
340 vtdebug "part1_start_sector=$part1_start_sector part1_end_sector=$part1_end_sector"
341 vtdebug "part2_start_sector=$part2_start_sector part2_end_sector=$part2_end_sector"
342
343 if [ -e $PART2 ]; then
344 echo "delete $PART2"
345 rm -f $PART2
346 fi
347
348 echo ""
349 echo "Create partitions on $DISK by $PARTTOOL in GPT style ..."
350
351 vtdebug "format disk by parted ..."
352
353 if [ "$TOOLDIR" != "aarch64" ]; then
354 vt_set_efi_type="set 2 msftdata on"
355 fi
356
357 parted -a none --script $DISK \
358 mklabel gpt \
359 unit s \
360 mkpart Ventoy ntfs $part1_start_sector $part1_end_sector \
361 mkpart VTOYEFI fat16 $part2_start_sector $part2_end_sector \
362 $vt_set_efi_type \
363 set 2 hidden on \
364 quit
365
366 sync
367
368 vtoygpt -f $DISK
369 sync
370
371 udevadm trigger --name-match=$DISK >/dev/null 2>&1
372 partprobe >/dev/null 2>&1
373 sleep 3
374 echo "Done"
375
376 echo 'mkfs on disk partitions ...'
377 for i in 1 2 3 4 5 6 7; do
378 if [ -b $PART2 ]; then
379 break
380 else
381 echo "wait $PART2 ..."
382 sleep 1
383 fi
384 done
385
386
387 if ! [ -b $PART2 ]; then
388 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
389 echo "mknod -m 0660 $PART2 b $MajorMinor ..."
390 mknod -m 0660 $PART2 b $MajorMinor
391
392 if ! [ -b $PART1 ]; then
393 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
394 echo "mknod -m 0660 $PART1 b $MajorMinor ..."
395 mknod -m 0660 $PART1 b $MajorMinor
396 fi
397 fi
398
399 echo "create efi fat fs $PART2 ..."
400 for i in 0 1 2 3 4 5 6 7 8 9; do
401 if mkfs.vfat -F 16 -n VTOYEFI $PART2; then
402 echo 'success'
403 break
404 else
405 echo "$? retry ..."
406 sleep 2
407 fi
408 done
409 }
410
411
412
413
414