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