]> glassweightruler.freedombox.rocks Git - Ventoy.git/blob - INSTALL/tool/ventoy_lib.sh
Japanese translation Fixed. (#2808)
[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 vtoycli fat -T; then
72 vtdebug "vtoycli fat test ok ..."
73 else
74 vtdebug "vtoycli fat 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 elif echo $DISK | grep -q "/dev/zd[0-9]"; then
96 echo ${DISK}p${2}
97 else
98 echo ${DISK}${2}
99 fi
100 }
101
102 check_umount_disk() {
103 DiskOrPart="$1"
104 grep "^${DiskOrPart}" /proc/mounts | while read mtline; do
105 mtpnt=$(echo $mtline | awk '{print $2}')
106 vtdebug "Trying to umount $mtpnt ..."
107 umount $mtpnt >/dev/null 2>&1
108 done
109 }
110
111 get_ventoy_version_from_cfg() {
112 if grep -q 'set.*VENTOY_VERSION=' $1; then
113 grep 'set.*VENTOY_VERSION=' $1 | awk -F'"' '{print $2}'
114 else
115 echo 'none'
116 fi
117 }
118
119 is_disk_contains_ventoy() {
120 DISK=$1
121
122 PART1=$(get_disk_part_name $1 1)
123 PART2=$(get_disk_part_name $1 2)
124
125 if [ -e /sys/class/block/${PART2#/dev/}/size ]; then
126 SIZE=$(cat /sys/class/block/${PART2#/dev/}/size)
127 else
128 SIZE=0
129 fi
130
131 if ! [ -b $PART1 ]; then
132 vtdebug "$PART1 not exist"
133 ventoy_false
134 return
135 fi
136
137 if ! [ -b $PART2 ]; then
138 vtdebug "$PART2 not exist"
139 ventoy_false
140 return
141 fi
142
143 PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
144 PART2_TYPE=$(dd if=$DISK bs=1 count=1 skip=466 status=none | hexdump -n1 -e '1/1 "%02X"')
145
146 # if [ "$PART1_TYPE" != "EE" ]; then
147 # if [ "$PART2_TYPE" != "EF" ]; then
148 # vtdebug "part2 type is $PART2_TYPE not EF"
149 # ventoy_false
150 # return
151 # fi
152 # fi
153
154 # PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
155 # if [ "$PART1_TYPE" != "07" ]; then
156 # vtdebug "part1 type is $PART2_TYPE not 07"
157 # ventoy_false
158 # return
159 # fi
160
161 if [ -e /sys/class/block/${PART1#/dev/}/start ]; then
162 PART1_START=$(cat /sys/class/block/${PART1#/dev/}/start)
163 fi
164
165 if [ "$PART1_START" != "2048" ]; then
166 vtdebug "part1 start is $PART1_START not 2048"
167 ventoy_false
168 return
169 fi
170
171 if [ "$VENTOY_SECTOR_NUM" != "$SIZE" ]; then
172 vtdebug "part2 size is $SIZE not $VENTOY_SECTOR_NUM"
173 ventoy_false
174 return
175 fi
176
177 ventoy_true
178 }
179
180 check_disk_secure_boot() {
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 vtoycli fat -s $PART2
189 }
190
191 get_disk_ventoy_version() {
192
193 if ! is_disk_contains_ventoy $1; then
194 ventoy_false
195 return
196 fi
197
198 PART2=$(get_disk_part_name $1 2)
199
200 ParseVer=$(vtoycli fat $PART2)
201 if [ $? -eq 0 ]; then
202 vtdebug "Ventoy version in $PART2 is $ParseVer"
203 echo $ParseVer
204 ventoy_true
205 return
206 fi
207
208 ventoy_false
209 }
210
211 wait_and_create_part() {
212 vPART1=$1
213 vPART2=$2
214 echo 'Wait for partitions ...'
215 for i in 0 1 2 3 4 5 6 7 8 9; do
216 if ls -l $vPART1 2>/dev/null | grep -q '^b'; then
217 if ls -l $vPART2 2>/dev/null | grep -q '^b'; then
218 break
219 fi
220 else
221 echo "Wait for $vPART1/$vPART2 ..."
222 sleep 1
223 fi
224 done
225
226 if ls -l $vPART1 2>/dev/null | grep -q '^b'; then
227 echo "$vPART1 exist OK"
228 else
229 MajorMinor=$(sed "s/:/ /" /sys/class/block/${vPART1#/dev/}/dev)
230 echo "mknod -m 0660 $vPART1 b $MajorMinor ..."
231 mknod -m 0660 $vPART1 b $MajorMinor
232 fi
233
234 if ls -l $vPART2 2>/dev/null | grep -q '^b'; then
235 echo "$vPART2 exist OK"
236 else
237 MajorMinor=$(sed "s/:/ /" /sys/class/block/${vPART2#/dev/}/dev)
238 echo "mknod -m 0660 $vPART2 b $MajorMinor ..."
239 mknod -m 0660 $vPART2 b $MajorMinor
240 fi
241
242 if ls -l $vPART1 2>/dev/null | grep -q '^b'; then
243 if ls -l $vPART2 2>/dev/null | grep -q '^b'; then
244 echo "partition exist OK"
245 fi
246 else
247 echo "[FAIL] $vPART1/$vPART2 does not exist"
248 exit 1
249 fi
250 }
251
252
253 format_ventoy_disk_mbr() {
254 reserve_mb=$1
255 DISK=$2
256 PARTTOOL=$3
257
258 PART1=$(get_disk_part_name $DISK 1)
259 PART2=$(get_disk_part_name $DISK 2)
260
261 sector_num=$(cat /sys/block/${DISK#/dev/}/size)
262
263 part1_start_sector=2048
264
265 if [ $reserve_mb -gt 0 ]; then
266 reserve_sector_num=$(expr $reserve_mb \* 2048)
267 part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
268 else
269 part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 1)
270 fi
271
272 part2_start_sector=$(expr $part1_end_sector + 1)
273
274 modsector=$(expr $part2_start_sector % 8)
275 if [ $modsector -gt 0 ]; then
276 vtdebug "modsector:$modsector need to be aligned with 4KB"
277 part1_end_sector=$(expr $part1_end_sector - $modsector)
278 part2_start_sector=$(expr $part1_end_sector + 1)
279 fi
280
281 part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
282
283 export part2_start_sector
284
285 vtdebug "part1_start_sector=$part1_start_sector part1_end_sector=$part1_end_sector"
286 vtdebug "part2_start_sector=$part2_start_sector part2_end_sector=$part2_end_sector"
287
288 if [ -e $PART1 ]; then
289 echo "delete $PART1"
290 rm -f $PART1
291 fi
292
293 if [ -e $PART2 ]; then
294 echo "delete $PART2"
295 rm -f $PART2
296 fi
297
298 echo ""
299 echo "Create partitions on $DISK by $PARTTOOL in MBR style ..."
300
301 if [ "$PARTTOOL" = "parted" ]; then
302 vtdebug "format disk by parted ..."
303 parted -a none --script $DISK \
304 mklabel msdos \
305 unit s \
306 mkpart primary ntfs $part1_start_sector $part1_end_sector \
307 mkpart primary fat16 $part2_start_sector $part2_end_sector \
308 set 1 boot on \
309 quit
310
311 sync
312 echo -en '\xEF' | dd of=$DISK conv=fsync bs=1 count=1 seek=466 > /dev/null 2>&1
313 else
314 vtdebug "format disk by fdisk ..."
315
316 fdisk $DISK >>./log.txt 2>&1 <<EOF
317 o
318 n
319 p
320 1
321 $part1_start_sector
322 $part1_end_sector
323 n
324 p
325 2
326 $part2_start_sector
327 $part2_end_sector
328 t
329 1
330 7
331 t
332 2
333 ef
334 a
335 1
336 w
337 EOF
338 fi
339
340 udevadm trigger --name-match=$DISK >/dev/null 2>&1
341 partprobe >/dev/null 2>&1
342 sleep 3
343 echo "Done"
344
345
346 echo 'Wait for partitions ...'
347 for i in 0 1 2 3 4 5 6 7 8 9; do
348 if [ -b $PART1 -a -b $PART2 ]; then
349 break
350 else
351 echo "Wait for $PART1/$PART2 ..."
352 sleep 1
353 fi
354 done
355
356 if ! [ -b $PART1 ]; then
357 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
358 echo "mknod -m 0660 $PART1 b $MajorMinor ..."
359 mknod -m 0660 $PART1 b $MajorMinor
360 fi
361
362 if ! [ -b $PART2 ]; then
363 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
364 echo "mknod -m 0660 $PART2 b $MajorMinor ..."
365 mknod -m 0660 $PART2 b $MajorMinor
366 fi
367
368 if [ -b $PART1 -a -b $PART2 ]; then
369 echo "partition exist OK"
370 else
371 echo "[FAIL] $PART1/$PART2 does not exist"
372 exit 1
373 fi
374
375 echo "create efi fat fs $PART2 ..."
376 for i in 0 1 2 3 4 5 6 7 8 9; do
377 check_umount_disk "$PART2"
378
379 if mkfs.vfat -F 16 -n VTOYEFI -s 1 $PART2; then
380 echo 'success'
381 break
382 else
383 echo "$? retry ..."
384 sleep 2
385 fi
386 done
387 }
388
389
390 format_ventoy_disk_gpt() {
391 reserve_mb=$1
392 DISK=$2
393 PARTTOOL=$3
394
395 PART1=$(get_disk_part_name $DISK 1)
396 PART2=$(get_disk_part_name $DISK 2)
397
398 sector_num=$(cat /sys/block/${DISK#/dev/}/size)
399
400 part1_start_sector=2048
401
402 if [ $reserve_mb -gt 0 ]; then
403 reserve_sector_num=$(expr $reserve_mb \* 2048 + 33)
404 part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
405 else
406 part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 34)
407 fi
408
409 part2_start_sector=$(expr $part1_end_sector + 1)
410
411 modsector=$(expr $part2_start_sector % 8)
412 if [ $modsector -gt 0 ]; then
413 vtdebug "modsector:$modsector need to be aligned with 4KB"
414 part1_end_sector=$(expr $part1_end_sector - $modsector)
415 part2_start_sector=$(expr $part1_end_sector + 1)
416 fi
417
418 part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
419
420 export part2_start_sector
421
422 vtdebug "part1_start_sector=$part1_start_sector part1_end_sector=$part1_end_sector"
423 vtdebug "part2_start_sector=$part2_start_sector part2_end_sector=$part2_end_sector"
424
425 if [ -e $PART1 ]; then
426 echo "delete $PART1"
427 rm -f $PART1
428 fi
429
430 if [ -e $PART2 ]; then
431 echo "delete $PART2"
432 rm -f $PART2
433 fi
434
435 echo ""
436 echo "Create partitions on $DISK by $PARTTOOL in GPT style ..."
437
438 vtdebug "format disk by parted ..."
439
440 if [ "$TOOLDIR" != "aarch64" ]; then
441 vt_set_efi_type="set 2 msftdata on"
442 fi
443
444 parted -a none --script $DISK \
445 mklabel gpt \
446 unit s \
447 mkpart Ventoy ntfs $part1_start_sector $part1_end_sector \
448 mkpart VTOYEFI fat16 $part2_start_sector $part2_end_sector \
449 $vt_set_efi_type \
450 set 2 hidden on \
451 quit
452
453 sync
454
455 vtoycli gpt -f $DISK
456 sync
457
458 udevadm trigger --name-match=$DISK >/dev/null 2>&1
459 partprobe >/dev/null 2>&1
460 sleep 3
461 echo "Done"
462
463 echo 'Wait for partitions ...'
464 for i in 0 1 2 3 4 5 6 7 8 9; do
465 if [ -b $PART1 -a -b $PART2 ]; then
466 break
467 else
468 echo "Wait for $PART1/$PART2 ..."
469 sleep 1
470 fi
471 done
472
473 if ! [ -b $PART1 ]; then
474 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
475 echo "mknod -m 0660 $PART1 b $MajorMinor ..."
476 mknod -m 0660 $PART1 b $MajorMinor
477 fi
478
479 if ! [ -b $PART2 ]; then
480 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
481 echo "mknod -m 0660 $PART2 b $MajorMinor ..."
482 mknod -m 0660 $PART2 b $MajorMinor
483 fi
484
485 if [ -b $PART1 -a -b $PART2 ]; then
486 echo "partition exist OK"
487 else
488 echo "[FAIL] $PART1/$PART2 does not exist"
489 exit 1
490 fi
491
492 echo "create efi fat fs $PART2 ..."
493
494 for i in 0 1 2 3 4 5 6 7 8 9; do
495 check_umount_disk "$PART2"
496
497 if mkfs.vfat -F 16 -n VTOYEFI -s 1 $PART2; then
498 echo 'success'
499 break
500 else
501 echo "$? retry ..."
502 sleep 2
503 fi
504 done
505 }
506
507
508
509
510