]> glassweightruler.freedombox.rocks Git - Ventoy.git/blob - INSTALL/tool/ventoy_lib.sh
Update ventoy_lib.sh
[Ventoy.git] / INSTALL / tool / ventoy_lib.sh
1 #!/bin/sh
2
3 #Ventoy partition 32MB
4 VENTOY_PART_SIZE=33554432
5 VENTOY_SECTOR_SIZE=512
6 VENTOY_SECTOR_NUM=65536
7
8 ventoy_false() {
9 [ "1" = "2" ]
10 }
11
12 ventoy_true() {
13 [ "1" = "1" ]
14 }
15
16 ventoy_is_linux64() {
17 if uname -a | egrep -q 'x86_64|amd64'; then
18 ventoy_true
19 return
20 fi
21
22 ventoy_false
23 }
24
25 ventoy_is_dash() {
26 if [ -L /bin/sh ]; then
27 vtdst=$(readlink /bin/sh)
28 if [ "$vtdst" = "dash" ]; then
29 ventoy_true
30 return
31 fi
32 fi
33 ventoy_false
34 }
35
36 vtinfo() {
37 if ventoy_is_dash; then
38 echo "\033[32m$*\033[0m"
39 else
40 echo -e "\033[32m$*\033[0m"
41 fi
42 }
43
44 vtwarn() {
45 if ventoy_is_dash; then
46 echo "\033[33m$*\033[0m"
47 else
48 echo -e "\033[33m$*\033[0m"
49 fi
50 }
51
52
53 vterr() {
54 if ventoy_is_dash; then
55 echo "\033[31m$*\033[0m"
56 else
57 echo -e "\033[31m$*\033[0m"
58 fi
59 }
60
61 vtdebug() {
62 echo "$*" >> ./log.txt
63 }
64
65 check_tool_work_ok() {
66
67 if ventoy_is_linux64; then
68 vtdebug "This is linux 64"
69 mkexfatfs=mkexfatfs_64
70 vtoyfat=vtoyfat_64
71 else
72 vtdebug "This is linux 32"
73 mkexfatfs=mkexfatfs_32
74 vtoyfat=vtoyfat_32
75 fi
76
77 if echo 1 | ./tool/hexdump > /dev/null; then
78 vtdebug "hexdump test ok ..."
79 else
80 vtdebug "hexdump test fail ..."
81 ventoy_false
82 return
83 fi
84
85 if ./tool/$mkexfatfs -V > /dev/null; then
86 vtdebug "$mkexfatfs test ok ..."
87 else
88 vtdebug "$mkexfatfs test fail ..."
89 ventoy_false
90 return
91 fi
92
93 if ./tool/$vtoyfat -T; then
94 vtdebug "$vtoyfat test ok ..."
95 else
96 vtdebug "$vtoyfat test fail ..."
97 ventoy_false
98 return
99 fi
100
101 vtdebug "tool check success ..."
102 ventoy_true
103 }
104
105
106 get_disk_part_name() {
107 DISK=$1
108
109 if echo $DISK | grep -q "/dev/loop"; then
110 echo ${DISK}p${2}
111 elif echo $DISK | grep -q "/dev/nvme[0-9][0-9]*n[0-9]"; then
112 echo ${DISK}p${2}
113 else
114 echo ${DISK}${2}
115 fi
116 }
117
118
119 get_ventoy_version_from_cfg() {
120 if grep -q 'set.*VENTOY_VERSION=' $1; then
121 grep 'set.*VENTOY_VERSION=' $1 | awk -F'"' '{print $2}'
122 else
123 echo 'none'
124 fi
125 }
126
127 is_disk_contains_ventoy() {
128 DISK=$1
129
130 PART1=$(get_disk_part_name $1 1)
131 PART2=$(get_disk_part_name $1 2)
132
133 if [ -e /sys/class/block/${PART2#/dev/}/size ]; then
134 SIZE=$(cat /sys/class/block/${PART2#/dev/}/size)
135 else
136 SIZE=0
137 fi
138
139 if ! [ -b $PART1 ]; then
140 vtdebug "$PART1 not exist"
141 ventoy_false
142 return
143 fi
144
145 if ! [ -b $PART2 ]; then
146 vtdebug "$PART2 not exist"
147 ventoy_false
148 return
149 fi
150
151 PART2_TYPE=$(dd if=$DISK bs=1 count=1 skip=466 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
152 if [ "$PART2_TYPE" != "EF" ]; then
153 vtdebug "part2 type is $PART2_TYPE not EF"
154 ventoy_false
155 return
156 fi
157
158 # PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | ./tool/hexdump -n1 -e '1/1 "%02X"')
159 # if [ "$PART1_TYPE" != "07" ]; then
160 # vtdebug "part1 type is $PART2_TYPE not 07"
161 # ventoy_false
162 # return
163 # fi
164
165 if [ -e /sys/class/block/${PART1#/dev/}/start ]; then
166 PART1_START=$(cat /sys/class/block/${PART1#/dev/}/start)
167 fi
168
169 if [ "$PART1_START" != "2048" ]; then
170 vtdebug "part1 start is $PART1_START not 2048"
171 ventoy_false
172 return
173 fi
174
175 if [ "$VENTOY_SECTOR_NUM" != "$SIZE" ]; then
176 vtdebug "part2 size is $SIZE not $VENTOY_SECTOR_NUM"
177 ventoy_false
178 return
179 fi
180
181 ventoy_true
182 }
183
184 get_disk_ventoy_version() {
185
186 if ! is_disk_contains_ventoy $1; then
187 ventoy_false
188 return
189 fi
190
191 PART2=$(get_disk_part_name $1 2)
192
193 if ventoy_is_linux64; then
194 cmd=./tool/vtoyfat_64
195 else
196 cmd=./tool/vtoyfat_32
197 fi
198
199 ParseVer=$($cmd $PART2)
200 if [ $? -eq 0 ]; then
201 vtdebug "Ventoy version in $PART2 is $ParseVer"
202 echo $ParseVer
203 ventoy_true
204 return
205 fi
206
207 ventoy_false
208 }
209
210
211 format_ventoy_disk() {
212 DISK=$1
213 PART1=$(get_disk_part_name $DISK 1)
214 PART2=$(get_disk_part_name $DISK 2)
215
216 sector_num=$(cat /sys/block/${DISK#/dev/}/size)
217
218 part1_start_sector=2048
219 part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 1)
220 export part2_start_sector=$(expr $part1_end_sector + 1)
221 part2_end_sector=$(expr $sector_num - 1)
222
223 if [ -e $PART2 ]; then
224 echo "delete $PART2"
225 rm -f $PART2
226 fi
227
228 echo ""
229 echo "Create partitions on $DISK ..."
230
231 fdisk $DISK >/dev/null 2>&1 <<EOF
232 o
233 n
234 p
235 1
236 $part1_start_sector
237 $part1_end_sector
238 n
239 p
240 2
241 $part2_start_sector
242 $part2_end_sector
243 t
244 1
245 7
246 t
247 2
248 ef
249 a
250 2
251 w
252 EOF
253
254 echo "Done"
255 udevadm trigger >/dev/null 2>&1
256 partprobe >/dev/null 2>&1
257 sleep 3
258
259 echo 'mkfs on disk partitions ...'
260 for i in 1 2 3 4 5 6 7; do
261 if [ -b $PART2 ]; then
262 break
263 else
264 echo "wait $PART2 ..."
265 sleep 1
266 fi
267 done
268
269 if ! [ -b $PART2 ]; then
270 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
271 echo "mknod -m 0660 $PART2 b $MajorMinor ..."
272 mknod -m 0660 $PART2 b $MajorMinor
273
274 if ! [ -b $PART1 ]; then
275 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
276 echo "mknod -m 0660 $PART1 b $MajorMinor ..."
277 mknod -m 0660 $PART1 b $MajorMinor
278 fi
279 fi
280
281 echo "create efi fat fs ..."
282 for i in 0 1 2 3 4 5 6 7 8 9; do
283 if mkfs.vfat -F 16 -n EFI $PART2; then
284 echo 'success'
285 break
286 else
287 echo "$? retry ..."
288 sleep 2
289 fi
290 done
291 }
292
293
294
295