4 VENTOY_PART_SIZE
=33554432
7 VENTOY_SECTOR_NUM
=65536
19 echo -e "\033[32m$*\033[0m"
23 echo -e "\033[33m$*\033[0m"
28 echo -e "\033[31m$*\033[0m"
32 echo "$*" >> .
/log.txt
36 if uuid
-F BIN
> /dev
/null
2>&1; then
38 elif uuidgen
-V > /dev
/null
2>&1; then
39 a
=$(uuidgen | sed 's/-//g')
40 echo -en "\x${a:0:2}\x${a:2:2}\x${a:4:2}\x${a:6:2}\x${a:8:2}\x${a:10:2}\x${a:12:2}\x${a:14:2}\x${a:16:2}\x${a:18:2}\x${a:20:2}\x${a:22:2}\x${a:24:2}\x${a:26:2}\x${a:28:2}\x${a:30:2}"
41 elif python
-V > /dev
/null
2>&1; then
42 a
=$(python -c 'import sys,uuid; sys.stdout.write(uuid.uuid4().hex
)')
43 echo -en "\x${a:0:2}\x${a:2:2}\x${a:4:2}\x${a:6:2}\x${a:8:2}\x${a:10:2}\x${a:12:2}\x${a:14:2}\x${a:16:2}\x${a:18:2}\x${a:20:2}\x${a:22:2}\x${a:24:2}\x${a:26:2}\x${a:28:2}\x${a:30:2}"
44 elif [ -e /dev/urandom ]; then
45 dd if=/dev/urandom bs=1 count=16 status=none
47 datestr=$(date +%N%N%N%N%N)
49 echo -en "\x${a:0:2}\x${a:2:2}\x${a:4:2}\x${a:6:2}\x${a:8:2}\x${a:10:2}\x${a:12:2}\x${a:14:2}\x${a:16:2}\x${a:18:2}\x${a:20:2}\x${a:22:2}\x${a:24:2}\x${a:26:2}\x${a:28:2}\x${a:30:2}"
53 check_tool_work_ok() {
55 if echo 1 | hexdump > /dev/null; then
56 vtdebug "hexdump test ok ..."
58 vtdebug "hexdump test fail ..."
63 if mkexfatfs -V > /dev/null; then
64 vtdebug "mkexfatfs test ok ..."
66 vtdebug "mkexfatfs test fail ..."
72 vtdebug "vtoyfat test ok ..."
74 vtdebug "vtoyfat test fail ..."
79 vtdebug "tool check success ..."
84 get_disk_part_name() {
87 if echo $DISK | grep -q "/dev/loop"; then
89 elif echo $DISK | grep -q "/dev/nvme[0-9][0-9]*n[0-9]"; then
91 elif echo $DISK | grep -q "/dev/mmcblk[0-9]"; then
93 elif echo $DISK | grep -q "/dev/nbd[0-9]"; then
100 check_umount_disk() {
102 grep "^${DiskOrPart}" /proc/mounts | while read mtline; do
103 mtpnt=$(echo $mtline | awk '{print $2}')
104 vtdebug "Trying to umount $mtpnt ..."
105 umount $mtpnt >/dev/null 2>&1
109 get_ventoy_version_from_cfg() {
110 if grep -q 'set.
*VENTOY_VERSION
=' $1; then
111 grep 'set.
*VENTOY_VERSION
=' $1 | awk -F'"' '{print $2}'
117 is_disk_contains_ventoy() {
120 PART1=$(get_disk_part_name $1 1)
121 PART2=$(get_disk_part_name $1 2)
123 if [ -e /sys/class/block/${PART2#/dev/}/size ]; then
124 SIZE=$(cat /sys/class/block/${PART2#/dev/}/size)
129 if ! [ -b $PART1 ]; then
130 vtdebug "$PART1 not exist
"
135 if ! [ -b $PART2 ]; then
136 vtdebug "$PART2 not exist
"
141 PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
142 PART2_TYPE=$(dd if=$DISK bs=1 count=1 skip=466 status=none | hexdump -n1 -e '1/1 "%02X"')
144 # if [ "$PART1_TYPE" != "EE
" ]; then
145 # if [ "$PART2_TYPE" != "EF
" ]; then
146 # vtdebug "part2
type is
$PART2_TYPE not EF
"
152 # PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
153 # if [ "$PART1_TYPE" != "07" ]; then
154 # vtdebug "part1
type is
$PART2_TYPE not
07"
159 if [ -e /sys/class/block/${PART1#/dev/}/start ]; then
160 PART1_START=$(cat /sys/class/block/${PART1#/dev/}/start)
163 if [ "$PART1_START" != "2048" ]; then
164 vtdebug "part1 start is
$PART1_START not
2048"
169 if [ "$VENTOY_SECTOR_NUM" != "$SIZE" ]; then
170 vtdebug "part2 size is
$SIZE not
$VENTOY_SECTOR_NUM"
178 check_disk_secure_boot() {
179 if ! is_disk_contains_ventoy $1; then
184 PART2=$(get_disk_part_name $1 2)
189 get_disk_ventoy_version() {
191 if ! is_disk_contains_ventoy $1; then
196 PART2=$(get_disk_part_name $1 2)
198 ParseVer=$(vtoyfat $PART2)
199 if [ $? -eq 0 ]; then
200 vtdebug "Ventoy version
in $PART2 is
$ParseVer"
209 format_ventoy_disk_mbr() {
214 PART1=$(get_disk_part_name $DISK 1)
215 PART2=$(get_disk_part_name $DISK 2)
217 sector_num=$(cat /sys/block/${DISK#/dev/}/size)
219 part1_start_sector=2048
221 if [ $reserve_mb -gt 0 ]; then
222 reserve_sector_num=$(expr $reserve_mb \* 2048)
223 part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
225 part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 1)
228 part2_start_sector=$(expr $part1_end_sector + 1)
230 modsector=$(expr $part2_start_sector % 8)
231 if [ $modsector -gt 0 ]; then
232 vtdebug "modsector
:$modsector need to be aligned with
4KB
"
233 part1_end_sector=$(expr $part1_end_sector - $modsector)
234 part2_start_sector=$(expr $part1_end_sector + 1)
237 part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
239 export part2_start_sector
241 vtdebug "part1_start_sector
=$part1_start_sector part1_end_sector
=$part1_end_sector"
242 vtdebug "part2_start_sector
=$part2_start_sector part2_end_sector
=$part2_end_sector"
244 if [ -e $PART2 ]; then
250 echo "Create partitions on
$DISK by
$PARTTOOL in MBR style ...
"
252 if [ "$PARTTOOL" = "parted
" ]; then
253 vtdebug "format disk by parted ...
"
254 parted -a none --script $DISK \
257 mkpart primary ntfs $part1_start_sector $part1_end_sector \
258 mkpart primary fat16 $part2_start_sector $part2_end_sector \
263 echo -en '\xEF' | dd of=$DISK conv=fsync bs=1 count=1 seek=466 > /dev/null 2>&1
265 vtdebug "format disk by fdisk ...
"
267 fdisk $DISK >>./log.txt 2>&1 <<EOF
291 udevadm trigger --name-match=$DISK >/dev/null 2>&1
292 partprobe >/dev/null 2>&1
296 echo 'mkfs on disk partitions ...'
297 for i in 1 2 3 4 5 6 7; do
298 if [ -b $PART2 ]; then
301 echo "wait $PART2 ...
"
307 if ! [ -b $PART2 ]; then
308 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
309 echo "mknod
-m 0660 $PART2 b
$MajorMinor ...
"
310 mknod -m 0660 $PART2 b $MajorMinor
312 if ! [ -b $PART1 ]; then
313 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
314 echo "mknod
-m 0660 $PART1 b
$MajorMinor ...
"
315 mknod -m 0660 $PART1 b $MajorMinor
319 echo "create efi fat fs
$PART2 ...
"
320 for i in 0 1 2 3 4 5 6 7 8 9; do
321 check_umount_disk "$PART2"
323 if mkfs.vfat -F 16 -n VTOYEFI $PART2; then
334 format_ventoy_disk_gpt() {
339 PART1=$(get_disk_part_name $DISK 1)
340 PART2=$(get_disk_part_name $DISK 2)
342 sector_num=$(cat /sys/block/${DISK#/dev/}/size)
344 part1_start_sector=2048
346 if [ $reserve_mb -gt 0 ]; then
347 reserve_sector_num=$(expr $reserve_mb \* 2048 + 33)
348 part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
350 part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 34)
353 part2_start_sector=$(expr $part1_end_sector + 1)
355 modsector=$(expr $part2_start_sector % 8)
356 if [ $modsector -gt 0 ]; then
357 vtdebug "modsector
:$modsector need to be aligned with
4KB
"
358 part1_end_sector=$(expr $part1_end_sector - $modsector)
359 part2_start_sector=$(expr $part1_end_sector + 1)
362 part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
364 export part2_start_sector
366 vtdebug "part1_start_sector
=$part1_start_sector part1_end_sector
=$part1_end_sector"
367 vtdebug "part2_start_sector
=$part2_start_sector part2_end_sector
=$part2_end_sector"
369 if [ -e $PART2 ]; then
375 echo "Create partitions on
$DISK by
$PARTTOOL in GPT style ...
"
377 vtdebug "format disk by parted ...
"
379 if [ "$TOOLDIR" != "aarch64
" ]; then
380 vt_set_efi_type="set 2 msftdata on
"
383 parted -a none --script $DISK \
386 mkpart Ventoy ntfs $part1_start_sector $part1_end_sector \
387 mkpart VTOYEFI fat16 $part2_start_sector $part2_end_sector \
397 udevadm trigger --name-match=$DISK >/dev/null 2>&1
398 partprobe >/dev/null 2>&1
402 echo 'mkfs on disk partitions ...'
403 for i in 1 2 3 4 5 6 7; do
404 if [ -b $PART2 ]; then
407 echo "wait $PART2 ...
"
413 if ! [ -b $PART2 ]; then
414 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
415 echo "mknod
-m 0660 $PART2 b
$MajorMinor ...
"
416 mknod -m 0660 $PART2 b $MajorMinor
418 if ! [ -b $PART1 ]; then
419 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
420 echo "mknod
-m 0660 $PART1 b
$MajorMinor ...
"
421 mknod -m 0660 $PART1 b $MajorMinor
425 echo "create efi fat fs
$PART2 ...
"
427 for i in 0 1 2 3 4 5 6 7 8 9; do
428 check_umount_disk "$PART2"
430 if mkfs.vfat -F 16 -n VTOYEFI $PART2; then