]> glassweightruler.freedombox.rocks Git - Ventoy.git/blob - INSTALL/tool/ventoy_lib.sh
support original order in image_list plugin
[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 ventoy_is_linux64() {
18 if uname -a | egrep -q 'x86_64|amd64'; then
19 ventoy_true
20 return
21 fi
22
23 ventoy_false
24 }
25
26 vtinfo() {
27 echo -e "\033[32m$*\033[0m"
28 }
29
30 vtwarn() {
31 echo -e "\033[33m$*\033[0m"
32 }
33
34
35 vterr() {
36 echo -e "\033[31m$*\033[0m"
37 }
38
39 vtdebug() {
40 echo "$*" >> ./log.txt
41 }
42
43 check_tool_work_ok() {
44
45 if ventoy_is_linux64; then
46 vtdebug "This is linux 64"
47 mkexfatfs=mkexfatfs_64
48 vtoyfat=vtoyfat_64
49 else
50 vtdebug "This is linux 32"
51 mkexfatfs=mkexfatfs_32
52 vtoyfat=vtoyfat_32
53 fi
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 ./tool/$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 ./tool/$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 | ./tool/hexdump -n1 -e '1/1 "%02X"')
132 PART2_TYPE=$(dd if=$DISK bs=1 count=1 skip=466 status=none | ./tool/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 | ./tool/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 get_disk_ventoy_version() {
169
170 if ! is_disk_contains_ventoy $1; then
171 ventoy_false
172 return
173 fi
174
175 PART2=$(get_disk_part_name $1 2)
176
177 if ventoy_is_linux64; then
178 cmd=./tool/vtoyfat_64
179 else
180 cmd=./tool/vtoyfat_32
181 fi
182
183 ParseVer=$($cmd $PART2)
184 if [ $? -eq 0 ]; then
185 vtdebug "Ventoy version in $PART2 is $ParseVer"
186 echo $ParseVer
187 ventoy_true
188 return
189 fi
190
191 ventoy_false
192 }
193
194 format_ventoy_disk_mbr() {
195 reserve_mb=$1
196 DISK=$2
197 PARTTOOL=$3
198
199 PART1=$(get_disk_part_name $DISK 1)
200 PART2=$(get_disk_part_name $DISK 2)
201
202 sector_num=$(cat /sys/block/${DISK#/dev/}/size)
203
204 part1_start_sector=2048
205
206 if [ $reserve_mb -gt 0 ]; then
207 reserve_sector_num=$(expr $reserve_mb \* 2048)
208 part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
209 else
210 part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 1)
211 fi
212
213 part2_start_sector=$(expr $part1_end_sector + 1)
214 part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
215
216 export part2_start_sector
217
218 vtdebug "part1_start_sector=$part1_start_sector part1_end_sector=$part1_end_sector"
219 vtdebug "part2_start_sector=$part2_start_sector part2_end_sector=$part2_end_sector"
220
221 if [ -e $PART2 ]; then
222 echo "delete $PART2"
223 rm -f $PART2
224 fi
225
226 echo ""
227 echo "Create partitions on $DISK by $PARTTOOL in MBR style ..."
228
229 if [ "$PARTTOOL" = "parted" ]; then
230 vtdebug "format disk by parted ..."
231 parted -a none --script $DISK \
232 mklabel msdos \
233 unit s \
234 mkpart primary ntfs $part1_start_sector $part1_end_sector \
235 mkpart primary fat16 $part2_start_sector $part2_end_sector \
236 set 1 boot on \
237 quit
238
239 sync
240 echo -en '\xEF' | dd of=$DISK conv=fsync bs=1 count=1 seek=466 > /dev/null 2>&1
241 else
242 vtdebug "format disk by fdisk ..."
243
244 fdisk $DISK >>./log.txt 2>&1 <<EOF
245 o
246 n
247 p
248 1
249 $part1_start_sector
250 $part1_end_sector
251 n
252 p
253 2
254 $part2_start_sector
255 $part2_end_sector
256 t
257 1
258 7
259 t
260 2
261 ef
262 a
263 1
264 w
265 EOF
266 fi
267
268 udevadm trigger >/dev/null 2>&1
269 partprobe >/dev/null 2>&1
270 sleep 3
271 echo "Done"
272
273 echo 'mkfs on disk partitions ...'
274 for i in 1 2 3 4 5 6 7; do
275 if [ -b $PART2 ]; then
276 break
277 else
278 echo "wait $PART2 ..."
279 sleep 1
280 fi
281 done
282
283
284 if ! [ -b $PART2 ]; then
285 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
286 echo "mknod -m 0660 $PART2 b $MajorMinor ..."
287 mknod -m 0660 $PART2 b $MajorMinor
288
289 if ! [ -b $PART1 ]; then
290 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
291 echo "mknod -m 0660 $PART1 b $MajorMinor ..."
292 mknod -m 0660 $PART1 b $MajorMinor
293 fi
294 fi
295
296 echo "create efi fat fs $PART2 ..."
297 for i in 0 1 2 3 4 5 6 7 8 9; do
298 if mkfs.vfat -F 16 -n VTOYEFI $PART2; then
299 echo 'success'
300 break
301 else
302 echo "$? retry ..."
303 sleep 2
304 fi
305 done
306 }
307
308
309 format_ventoy_disk_gpt() {
310 reserve_mb=$1
311 DISK=$2
312 PARTTOOL=$3
313
314 PART1=$(get_disk_part_name $DISK 1)
315 PART2=$(get_disk_part_name $DISK 2)
316
317 sector_num=$(cat /sys/block/${DISK#/dev/}/size)
318
319 part1_start_sector=2048
320
321 if [ $reserve_mb -gt 0 ]; then
322 reserve_sector_num=$(expr $reserve_mb \* 2048 + 33)
323 part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
324 else
325 part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 34)
326 fi
327
328 part2_start_sector=$(expr $part1_end_sector + 1)
329 part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
330
331 export part2_start_sector
332
333 vtdebug "part1_start_sector=$part1_start_sector part1_end_sector=$part1_end_sector"
334 vtdebug "part2_start_sector=$part2_start_sector part2_end_sector=$part2_end_sector"
335
336 if [ -e $PART2 ]; then
337 echo "delete $PART2"
338 rm -f $PART2
339 fi
340
341 echo ""
342 echo "Create partitions on $DISK by $PARTTOOL in GPT style ..."
343
344 vtdebug "format disk by parted ..."
345 parted -a none --script $DISK \
346 mklabel gpt \
347 unit s \
348 mkpart Ventoy ntfs $part1_start_sector $part1_end_sector \
349 mkpart VTOYEFI fat16 $part2_start_sector $part2_end_sector \
350 set 2 msftdata on \
351 set 2 hidden on \
352 quit
353
354 sync
355
356 if ventoy_is_linux64; then
357 vtoygpt=./tool/vtoygpt_64
358 else
359 vtoygpt=./tool/vtoygpt_32
360 fi
361
362 $vtoygpt -f $DISK
363 sync
364
365 udevadm trigger >/dev/null 2>&1
366 partprobe >/dev/null 2>&1
367 sleep 3
368 echo "Done"
369
370 echo 'mkfs on disk partitions ...'
371 for i in 1 2 3 4 5 6 7; do
372 if [ -b $PART2 ]; then
373 break
374 else
375 echo "wait $PART2 ..."
376 sleep 1
377 fi
378 done
379
380
381 if ! [ -b $PART2 ]; then
382 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
383 echo "mknod -m 0660 $PART2 b $MajorMinor ..."
384 mknod -m 0660 $PART2 b $MajorMinor
385
386 if ! [ -b $PART1 ]; then
387 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
388 echo "mknod -m 0660 $PART1 b $MajorMinor ..."
389 mknod -m 0660 $PART1 b $MajorMinor
390 fi
391 fi
392
393 echo "create efi fat fs $PART2 ..."
394 for i in 0 1 2 3 4 5 6 7 8 9; do
395 if mkfs.vfat -F 16 -n VTOYEFI $PART2; then
396 echo 'success'
397 break
398 else
399 echo "$? retry ..."
400 sleep 2
401 fi
402 done
403 }
404
405
406
407
408