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