]> glassweightruler.freedombox.rocks Git - Ventoy.git/blob - INSTALL/Ventoy2Disk.sh
Persian language added (#170)
[Ventoy.git] / INSTALL / Ventoy2Disk.sh
1 #!/bin/sh
2
3 OLDDIR=$PWD
4
5 if ! [ -f ./tool/ventoy_lib.sh ]; then
6 cd ${0%Ventoy2Disk.sh}
7 fi
8
9 . ./tool/ventoy_lib.sh
10
11 print_usage() {
12 echo 'Usage: Ventoy2Disk.sh CMD [ OPTION ] /dev/sdX'
13 echo ' CMD:'
14 echo ' -i install ventoy to sdX (fail if disk already installed with ventoy)'
15 echo ' -u update ventoy in sdX'
16 echo ' -I force install ventoy to sdX (no matter installed or not)'
17 echo ''
18 echo ' OPTION: (optional)'
19 echo ' -s enable secure boot support (default is disabled)'
20 echo ''
21
22 }
23
24 echo ''
25 echo '***********************************************************'
26 echo '* Ventoy2Disk Script *'
27 echo '* longpanda admin@ventoy.net *'
28 echo '***********************************************************'
29 echo ''
30
31 vtdebug "############# Ventoy2Disk $0 ################"
32
33 while [ -n "$1" ]; do
34 if [ "$1" = "-i" ]; then
35 MODE="install"
36 elif [ "$1" = "-I" ]; then
37 MODE="install"
38 FORCE="Y"
39 elif [ "$1" = "-u" ]; then
40 MODE="update"
41 elif [ "$1" = "-s" ]; then
42 SECUREBOOT="YES"
43 else
44 if ! [ -b "$1" ]; then
45 vterr "$1 is NOT a valid device"
46 print_usage
47 cd $OLDDIR
48 exit 1
49 fi
50 DISK=$1
51 fi
52
53 shift
54 done
55
56 if [ -z "$MODE" ]; then
57 print_usage
58 cd $OLDDIR
59 exit 1
60 fi
61
62 if ! [ -b "$DISK" ]; then
63 vterr "Disk $DISK does not exist"
64 cd $OLDDIR
65 exit 1
66 fi
67
68 if [ -e /sys/class/block/${DISK#/dev/}/start ]; then
69 vterr "$DISK is a partition, please use the whole disk"
70 cd $OLDDIR
71 exit 1
72 fi
73
74 if dd if="$DISK" of=/dev/null bs=1 count=1 >/dev/null 2>&1; then
75 vtdebug "root permission check ok ..."
76 else
77 vterr "Failed to access $DISK, maybe root privilege is needed!"
78 echo ''
79 cd $OLDDIR
80 exit 1
81 fi
82
83 vtdebug "MODE=$MODE FORCE=$FORCE"
84
85 if ! [ -f ./boot/boot.img ]; then
86 if [ -d ./grub ]; then
87 vterr "Don't run me here, please download the released install package, and run there."
88 else
89 vterr "Please run under the right directory!"
90 fi
91 exit 1
92 fi
93
94 #decompress tool
95 cd tool
96 chmod +x ./xzcat
97 for file in $(ls); do
98 if [ "$file" != "xzcat" ]; then
99 if [ "$file" != "ventoy_lib.sh" ]; then
100 ./xzcat $file > ${file%.xz}
101 chmod +x ${file%.xz}
102 fi
103 fi
104 done
105 cd ../
106
107 if ! check_tool_work_ok; then
108 vterr "Some tools can not run in current system. Please check log.txt for detail."
109 cd $OLDDIR
110 exit 1
111 fi
112
113 testEF=$(echo -en '\xEF' | ./tool/hexdump -n 1 -e '1/1 "%02X"')
114 if [ "$testEF" != "EF" ]; then
115 vtdebug "testEF=##${testEF}##"
116 vterr "There is something wrong with the interpreter !"
117 exit 1
118 fi
119
120 grep "^$DISK" /proc/mounts | while read mtline; do
121 mtpnt=$(echo $mtline | awk '{print $2}')
122 vtdebug "Trying to umount $mtpnt ..."
123 umount $mtpnt >/dev/null 2>&1
124 done
125
126 if swapon -s | grep -q "^${DISK}[0-9]"; then
127 swapon -s | grep "^${DISK}[0-9]" | awk '{print $1}' | while read line; do
128 vtdebug "Trying to swapoff $line ..."
129 swapoff $line
130 done
131 fi
132
133
134 if grep "$DISK" /proc/mounts; then
135 vterr "$DISK is already mounted, please umount it first!"
136 cd $OLDDIR
137 exit 1
138 fi
139
140 if swapon -s | grep -q "^${DISK}[0-9]"; then
141 vterr "$DISK is used as swap, please swapoff it first!"
142 cd $OLDDIR
143 exit 1
144 fi
145
146
147 if [ "$MODE" = "install" ]; then
148 vtdebug "install ventoy ..."
149
150 if parted -v > /dev/null 2>&1; then
151 PARTTOOL='parted'
152 elif fdisk -v >/dev/null 2>&1; then
153 PARTTOOL='fdisk'
154 else
155 vterr "Both parted and fdisk are not found in the sysstem, Ventoy can't create new partition."
156 cd $OLDDIR
157 exit 1
158 fi
159
160 version=$(get_disk_ventoy_version $DISK)
161 if [ $? -eq 0 ]; then
162 if [ -z "$FORCE" ]; then
163 vtwarn "$DISK already contains a Ventoy with version $version"
164 vtwarn "Use -u option to do a safe upgrade operation."
165 vtwarn "OR if you really want to reinstall ventoy to $DISK, please use -I option."
166 vtwarn ""
167 cd $OLDDIR
168 exit 1
169 fi
170 fi
171
172 disk_sector_num=$(cat /sys/block/${DISK#/dev/}/size)
173 disk_size_gb=$(expr $disk_sector_num / 2097152)
174
175 if [ $disk_sector_num -gt 4294967296 ]; then
176 vterr "$DISK is over 2TB size, MBR will not work on it."
177 cd $OLDDIR
178 exit 1
179 fi
180
181 #Print disk info
182 echo "Disk : $DISK"
183 parted -s $DISK p 2>&1 | grep Model
184 echo "Size : $disk_size_gb GB"
185 echo ''
186
187 vtwarn "Attention:"
188 vtwarn "You will install Ventoy to $DISK."
189 vtwarn "All the data on the disk $DISK will be lost!!!"
190 echo ""
191
192 read -p 'Continue? (y/n)' Answer
193 if [ "$Answer" != "y" ]; then
194 if [ "$Answer" != "Y" ]; then
195 exit 0
196 fi
197 fi
198
199 echo ""
200 vtwarn "All the data on the disk $DISK will be lost!!!"
201 read -p 'Double-check. Continue? (y/n)' Answer
202 if [ "$Answer" != "y" ]; then
203 if [ "$Answer" != "Y" ]; then
204 exit 0
205 fi
206 fi
207
208
209 if [ $disk_sector_num -le $VENTOY_SECTOR_NUM ]; then
210 vterr "No enough space in disk $DISK"
211 exit 1
212 fi
213
214 if ! dd if=/dev/zero of=$DISK bs=1 count=512 status=none conv=fsync; then
215 vterr "Write data to $DISK failed, please check whether it's in use."
216 exit 1
217 fi
218
219 format_ventoy_disk $DISK $PARTTOOL
220
221 # format part1
222 if ventoy_is_linux64; then
223 cmd=./tool/mkexfatfs_64
224 else
225 cmd=./tool/mkexfatfs_32
226 fi
227
228 chmod +x ./tool/*
229
230 # DiskSize > 32GB Cluster Size use 128KB
231 # DiskSize < 32GB Cluster Size use 32KB
232 if [ $disk_size_gb -gt 32 ]; then
233 cluster_sectors=256
234 else
235 cluster_sectors=64
236 fi
237
238 $cmd -n ventoy -s $cluster_sectors ${DISK}1
239
240 chmod +x ./tool/vtoy_gen_uuid
241
242 vtinfo "writing data to disk ..."
243 dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=446
244 ./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1
245 ./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start_sector
246
247 #disk uuid
248 ./tool/vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} seek=384 bs=1 count=16
249
250 #disk signature
251 ./tool/vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} skip=12 seek=440 bs=1 count=4
252
253 vtinfo "sync data ..."
254 sync
255
256 vtinfo "esp partition processing ..."
257
258 sleep 1
259 mtpnt=$(grep "^${DISK}2" /proc/mounts | awk '{print $2}')
260 if [ -n "$mtpnt" ]; then
261 umount $mtpnt >/dev/null 2>&1
262 fi
263
264 if [ "$SECUREBOOT" != "YES" ]; then
265 mkdir ./tmp_mnt
266
267 vtdebug "mounting part2 ...."
268 for tt in 1 2 3; do
269 if mount ${DISK}2 ./tmp_mnt; then
270 vtdebug "mounting part2 success"
271 break
272 fi
273
274 mtpnt=$(grep "^${DISK}2" /proc/mounts | awk '{print $2}')
275 if [ -n "$mtpnt" ]; then
276 umount $mtpnt >/dev/null 2>&1
277 fi
278 sleep 2
279 done
280
281 rm -f ./tmp_mnt/EFI/BOOT/BOOTX64.EFI
282 rm -f ./tmp_mnt/EFI/BOOT/grubx64.efi
283 rm -f ./tmp_mnt/EFI/BOOT/MokManager.efi
284 rm -f ./tmp_mnt/ENROLL_THIS_KEY_IN_MOKMANAGER.cer
285 mv ./tmp_mnt/EFI/BOOT/grubx64_real.efi ./tmp_mnt/EFI/BOOT/BOOTX64.EFI
286
287 umount ./tmp_mnt
288 rm -rf ./tmp_mnt
289 fi
290
291 echo ""
292 vtinfo "Install Ventoy to $DISK successfully finished."
293 echo ""
294
295 else
296 vtdebug "update ventoy ..."
297
298 oldver=$(get_disk_ventoy_version $DISK)
299 if [ $? -ne 0 ]; then
300 vtwarn "$DISK does not contain ventoy or data corupted"
301 echo ""
302 vtwarn "Please use -i option if you want to install ventoy to $DISK"
303 echo ""
304 cd $OLDDIR
305 exit 1
306 fi
307
308 curver=$(cat ./ventoy/version)
309
310 vtinfo "Upgrade operation is safe, all the data in the 1st partition (iso files and other) will be unchanged!"
311 echo ""
312
313 read -p "Update Ventoy $oldver ===> $curver Continue? (y/n)" Answer
314 if [ "$Answer" != "y" ]; then
315 if [ "$Answer" != "Y" ]; then
316 cd $OLDDIR
317 exit 0
318 fi
319 fi
320
321 PART2=$(get_disk_part_name $DISK 2)
322
323 dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=440
324
325 ./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1
326
327 disk_sector_num=$(cat /sys/block/${DISK#/dev/}/size)
328 part2_start=$(expr $disk_sector_num - $VENTOY_SECTOR_NUM)
329 ./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start
330
331 sync
332
333 if [ "$SECUREBOOT" != "YES" ]; then
334 mkdir ./tmp_mnt
335
336 vtdebug "mounting part2 ...."
337 for tt in 1 2 3; do
338 if mount ${DISK}2 ./tmp_mnt; then
339 vtdebug "mounting part2 success"
340 break
341 fi
342 sleep 2
343 done
344
345 rm -f ./tmp_mnt/EFI/BOOT/BOOTX64.EFI
346 rm -f ./tmp_mnt/EFI/BOOT/grubx64.efi
347 rm -f ./tmp_mnt/EFI/BOOT/MokManager.efi
348 rm -f ./tmp_mnt/ENROLL_THIS_KEY_IN_MOKMANAGER.cer
349 mv ./tmp_mnt/EFI/BOOT/grubx64_real.efi ./tmp_mnt/EFI/BOOT/BOOTX64.EFI
350
351 umount ./tmp_mnt
352 rm -rf ./tmp_mnt
353 fi
354
355 echo ""
356 vtinfo "Update Ventoy to $DISK successfully finished."
357 echo ""
358
359 fi
360
361 cd $OLDDIR