]> glassweightruler.freedombox.rocks Git - Ventoy.git/blob - INSTALL/Ventoy2Disk.sh
1.0.11 release
[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 grep "^$DISK" /proc/mounts | while read mtline; do
114 mtpnt=$(echo $mtline | awk '{print $2}')
115 vtdebug "Trying to umount $mtpnt ..."
116 umount $mtpnt >/dev/null 2>&1
117 done
118
119 if swapon -s | grep -q "^${DISK}[0-9]"; then
120 swapon -s | grep "^${DISK}[0-9]" | awk '{print $1}' | while read line; do
121 vtdebug "Trying to swapoff $line ..."
122 swapoff $line
123 done
124 fi
125
126
127 if grep "$DISK" /proc/mounts; then
128 vterr "$DISK is already mounted, please umount it first!"
129 cd $OLDDIR
130 exit 1
131 fi
132
133 if swapon -s | grep -q "^${DISK}[0-9]"; then
134 vterr "$DISK is used as swap, please swapoff it first!"
135 cd $OLDDIR
136 exit 1
137 fi
138
139
140 if [ "$MODE" = "install" ]; then
141 vtdebug "install ventoy ..."
142
143 if ! fdisk -v >/dev/null 2>&1; then
144 vterr "fdisk is needed by ventoy installation, but is not found in the system."
145 cd $OLDDIR
146 exit 1
147 fi
148
149 version=$(get_disk_ventoy_version $DISK)
150 if [ $? -eq 0 ]; then
151 if [ -z "$FORCE" ]; then
152 vtwarn "$DISK already contains a Ventoy with version $version"
153 vtwarn "Use -u option to do a safe upgrade operation."
154 vtwarn "OR if you really want to reinstall ventoy to $DISK, please use -I option."
155 vtwarn ""
156 cd $OLDDIR
157 exit 1
158 fi
159 fi
160
161 disk_sector_num=$(cat /sys/block/${DISK#/dev/}/size)
162 disk_size_gb=$(expr $disk_sector_num / 2097152)
163
164 if [ $disk_sector_num -gt 4294967296 ]; then
165 vterr "$DISK is over 2TB size, MBR will not work on it."
166 cd $OLDDIR
167 exit 1
168 fi
169
170 #Print disk info
171 echo "Disk : $DISK"
172 parted -s $DISK p 2>&1 | grep Model
173 echo "Size : $disk_size_gb GB"
174 echo ''
175
176 vtwarn "Attention:"
177 vtwarn "You will install Ventoy to $DISK."
178 vtwarn "All the data on the disk $DISK will be lost!!!"
179 echo ""
180
181 read -p 'Continue? (y/n)' Answer
182 if [ "$Answer" != "y" ]; then
183 if [ "$Answer" != "Y" ]; then
184 exit 0
185 fi
186 fi
187
188 echo ""
189 vtwarn "All the data on the disk $DISK will be lost!!!"
190 read -p 'Double-check. Continue? (y/n)' Answer
191 if [ "$Answer" != "y" ]; then
192 if [ "$Answer" != "Y" ]; then
193 exit 0
194 fi
195 fi
196
197
198 if [ $disk_sector_num -le $VENTOY_SECTOR_NUM ]; then
199 vterr "No enough space in disk $DISK"
200 exit 1
201 fi
202
203 if ! dd if=/dev/zero of=$DISK bs=1 count=512 status=none conv=fsync; then
204 vterr "Write data to $DISK failed, please check whether it's in use."
205 exit 1
206 fi
207
208 format_ventoy_disk $DISK
209
210 # format part1
211 if ventoy_is_linux64; then
212 cmd=./tool/mkexfatfs_64
213 else
214 cmd=./tool/mkexfatfs_32
215 fi
216
217 chmod +x ./tool/*
218
219 # DiskSize > 32GB Cluster Size use 128KB
220 # DiskSize < 32GB Cluster Size use 32KB
221 if [ $disk_size_gb -gt 32 ]; then
222 cluster_sectors=256
223 else
224 cluster_sectors=64
225 fi
226
227 $cmd -n ventoy -s $cluster_sectors ${DISK}1
228
229 chmod +x ./tool/vtoy_gen_uuid
230
231 vtinfo "writing data to disk ..."
232 dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=446
233 ./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1
234 ./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start_sector
235
236 #disk uuid
237 ./tool/vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} seek=384 bs=1 count=16
238
239 #disk signature
240 ./tool/vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} skip=12 seek=440 bs=1 count=4
241
242 vtinfo "sync data ..."
243 sync
244
245 vtinfo "esp partition processing ..."
246
247 sleep 1
248 mtpnt=$(grep "^${DISK}2" /proc/mounts | awk '{print $2}')
249 if [ -n "$mtpnt" ]; then
250 umount $mtpnt >/dev/null 2>&1
251 fi
252
253 if [ "$SECUREBOOT" != "YES" ]; then
254 mkdir ./tmp_mnt
255
256 vtdebug "mounting part2 ...."
257 for tt in 1 2 3; do
258 if mount ${DISK}2 ./tmp_mnt; then
259 vtdebug "mounting part2 success"
260 break
261 fi
262
263 mtpnt=$(grep "^${DISK}2" /proc/mounts | awk '{print $2}')
264 if [ -n "$mtpnt" ]; then
265 umount $mtpnt >/dev/null 2>&1
266 fi
267 sleep 2
268 done
269
270 rm -f ./tmp_mnt/EFI/BOOT/BOOTX64.EFI
271 rm -f ./tmp_mnt/EFI/BOOT/grubx64.efi
272 rm -f ./tmp_mnt/EFI/BOOT/MokManager.efi
273 rm -f ./tmp_mnt/ENROLL_THIS_KEY_IN_MOKMANAGER.cer
274 mv ./tmp_mnt/EFI/BOOT/grubx64_real.efi ./tmp_mnt/EFI/BOOT/BOOTX64.EFI
275
276 umount ./tmp_mnt
277 rm -rf ./tmp_mnt
278 fi
279
280 echo ""
281 vtinfo "Install Ventoy to $DISK successfully finished."
282 echo ""
283
284 else
285 vtdebug "update ventoy ..."
286
287 oldver=$(get_disk_ventoy_version $DISK)
288 if [ $? -ne 0 ]; then
289 vtwarn "$DISK does not contain ventoy or data corupted"
290 echo ""
291 vtwarn "Please use -i option if you want to install ventoy to $DISK"
292 echo ""
293 cd $OLDDIR
294 exit 1
295 fi
296
297 curver=$(cat ./ventoy/version)
298
299 vtinfo "Upgrade operation is safe, all the data in the 1st partition (iso files and other) will be unchanged!"
300 echo ""
301
302 read -p "Update Ventoy $oldver ===> $curver Continue? (y/n)" Answer
303 if [ "$Answer" != "y" ]; then
304 if [ "$Answer" != "Y" ]; then
305 cd $OLDDIR
306 exit 0
307 fi
308 fi
309
310 PART2=$(get_disk_part_name $DISK 2)
311
312 dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=440
313
314 ./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1
315
316 disk_sector_num=$(cat /sys/block/${DISK#/dev/}/size)
317 part2_start=$(expr $disk_sector_num - $VENTOY_SECTOR_NUM)
318 ./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start
319
320 sync
321
322 if [ "$SECUREBOOT" != "YES" ]; then
323 mkdir ./tmp_mnt
324
325 vtdebug "mounting part2 ...."
326 for tt in 1 2 3; do
327 if mount ${DISK}2 ./tmp_mnt; then
328 vtdebug "mounting part2 success"
329 break
330 fi
331 sleep 2
332 done
333
334 rm -f ./tmp_mnt/EFI/BOOT/BOOTX64.EFI
335 rm -f ./tmp_mnt/EFI/BOOT/grubx64.efi
336 rm -f ./tmp_mnt/EFI/BOOT/MokManager.efi
337 rm -f ./tmp_mnt/ENROLL_THIS_KEY_IN_MOKMANAGER.cer
338 mv ./tmp_mnt/EFI/BOOT/grubx64_real.efi ./tmp_mnt/EFI/BOOT/BOOTX64.EFI
339
340 umount ./tmp_mnt
341 rm -rf ./tmp_mnt
342 fi
343
344 echo ""
345 vtinfo "Update Ventoy to $DISK successfully finished."
346 echo ""
347
348 fi
349
350 cd $OLDDIR
351