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