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