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