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