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 ..."
71 if vtoycli fat -T; then
72 vtdebug "vtoycli fat test ok ..."
74 vtdebug "vtoycli fat 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
95 elif echo $DISK | grep -q "/dev/zd[0-9]"; then
102 check_umount_disk() {
104 grep "^${DiskOrPart}" /proc/mounts | while read mtline; do
105 mtpnt=$(echo $mtline | awk '{print $2}')
106 vtdebug "Trying to umount $mtpnt ..."
107 umount $mtpnt >/dev/null 2>&1
111 get_ventoy_version_from_cfg() {
112 if grep -q 'set.
*VENTOY_VERSION
=' $1; then
113 grep 'set.
*VENTOY_VERSION
=' $1 | awk -F'"' '{print $2}'
119 is_disk_contains_ventoy() {
122 PART1=$(get_disk_part_name $1 1)
123 PART2=$(get_disk_part_name $1 2)
125 if [ -e /sys/class/block/${PART2#/dev/}/size ]; then
126 SIZE=$(cat /sys/class/block/${PART2#/dev/}/size)
131 if ! [ -b $PART1 ]; then
132 vtdebug "$PART1 not exist
"
137 if ! [ -b $PART2 ]; then
138 vtdebug "$PART2 not exist
"
143 PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
144 PART2_TYPE=$(dd if=$DISK bs=1 count=1 skip=466 status=none | hexdump -n1 -e '1/1 "%02X"')
146 # if [ "$PART1_TYPE" != "EE
" ]; then
147 # if [ "$PART2_TYPE" != "EF
" ]; then
148 # vtdebug "part2
type is
$PART2_TYPE not EF
"
154 # PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
155 # if [ "$PART1_TYPE" != "07" ]; then
156 # vtdebug "part1
type is
$PART2_TYPE not
07"
161 if [ -e /sys/class/block/${PART1#/dev/}/start ]; then
162 PART1_START=$(cat /sys/class/block/${PART1#/dev/}/start)
165 if [ "$PART1_START" != "2048" ]; then
166 vtdebug "part1 start is
$PART1_START not
2048"
171 if [ "$VENTOY_SECTOR_NUM" != "$SIZE" ]; then
172 vtdebug "part2 size is
$SIZE not
$VENTOY_SECTOR_NUM"
180 check_disk_secure_boot() {
181 if ! is_disk_contains_ventoy $1; then
186 PART2=$(get_disk_part_name $1 2)
188 vtoycli fat -s $PART2
191 get_disk_ventoy_version() {
193 if ! is_disk_contains_ventoy $1; then
198 PART2=$(get_disk_part_name $1 2)
200 ParseVer=$(vtoycli fat $PART2)
201 if [ $? -eq 0 ]; then
202 vtdebug "Ventoy version
in $PART2 is
$ParseVer"
211 wait_and_create_part() {
214 echo 'Wait for partitions ...'
215 for i in 0 1 2 3 4 5 6 7 8 9; do
216 if ls -l $vPART1 2>/dev/null | grep -q '^b'; then
217 if ls -l $vPART2 2>/dev/null | grep -q '^b'; then
221 echo "Wait
for $vPART1/$vPART2 ...
"
226 if ls -l $vPART1 2>/dev/null | grep -q '^b'; then
227 echo "$vPART1 exist OK
"
229 MajorMinor=$(sed "s/:/ /" /sys/class/block/${vPART1#/dev/}/dev)
230 echo "mknod
-m 0660 $vPART1 b
$MajorMinor ...
"
231 mknod -m 0660 $vPART1 b $MajorMinor
234 if ls -l $vPART2 2>/dev/null | grep -q '^b'; then
235 echo "$vPART2 exist OK
"
237 MajorMinor=$(sed "s/:/ /" /sys/class/block/${vPART2#/dev/}/dev)
238 echo "mknod
-m 0660 $vPART2 b
$MajorMinor ...
"
239 mknod -m 0660 $vPART2 b $MajorMinor
242 if ls -l $vPART1 2>/dev/null | grep -q '^b'; then
243 if ls -l $vPART2 2>/dev/null | grep -q '^b'; then
244 echo "partition exist OK
"
247 echo "[FAIL
] $vPART1/$vPART2 does not exist
"
253 format_ventoy_disk_mbr() {
258 PART1=$(get_disk_part_name $DISK 1)
259 PART2=$(get_disk_part_name $DISK 2)
261 sector_num=$(cat /sys/block/${DISK#/dev/}/size)
263 part1_start_sector=2048
265 if [ $reserve_mb -gt 0 ]; then
266 reserve_sector_num=$(expr $reserve_mb \* 2048)
267 part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
269 part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 1)
272 part2_start_sector=$(expr $part1_end_sector + 1)
274 modsector=$(expr $part2_start_sector % 8)
275 if [ $modsector -gt 0 ]; then
276 vtdebug "modsector
:$modsector need to be aligned with
4KB
"
277 part1_end_sector=$(expr $part1_end_sector - $modsector)
278 part2_start_sector=$(expr $part1_end_sector + 1)
281 part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
283 export part2_start_sector
285 vtdebug "part1_start_sector
=$part1_start_sector part1_end_sector
=$part1_end_sector"
286 vtdebug "part2_start_sector
=$part2_start_sector part2_end_sector
=$part2_end_sector"
288 if [ -e $PART1 ]; then
293 if [ -e $PART2 ]; then
299 echo "Create partitions on
$DISK by
$PARTTOOL in MBR style ...
"
301 if [ "$PARTTOOL" = "parted
" ]; then
302 vtdebug "format disk by parted ...
"
303 parted -a none --script $DISK \
306 mkpart primary ntfs $part1_start_sector $part1_end_sector \
307 mkpart primary fat16 $part2_start_sector $part2_end_sector \
312 echo -en '\xEF' | dd of=$DISK conv=fsync bs=1 count=1 seek=466 > /dev/null 2>&1
314 vtdebug "format disk by fdisk ...
"
316 fdisk $DISK >>./log.txt 2>&1 <<EOF
340 udevadm trigger --name-match=$DISK >/dev/null 2>&1
341 partprobe >/dev/null 2>&1
346 echo 'Wait for partitions ...'
347 for i in 0 1 2 3 4 5 6 7 8 9; do
348 if [ -b $PART1 -a -b $PART2 ]; then
351 echo "Wait
for $PART1/$PART2 ...
"
356 if ! [ -b $PART1 ]; then
357 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
358 echo "mknod
-m 0660 $PART1 b
$MajorMinor ...
"
359 mknod -m 0660 $PART1 b $MajorMinor
362 if ! [ -b $PART2 ]; then
363 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
364 echo "mknod
-m 0660 $PART2 b
$MajorMinor ...
"
365 mknod -m 0660 $PART2 b $MajorMinor
368 if [ -b $PART1 -a -b $PART2 ]; then
369 echo "partition exist OK
"
371 echo "[FAIL
] $PART1/$PART2 does not exist
"
375 echo "create efi fat fs
$PART2 ...
"
376 for i in 0 1 2 3 4 5 6 7 8 9; do
377 check_umount_disk "$PART2"
379 if mkfs.vfat -F 16 -n VTOYEFI -s 1 $PART2; then
390 format_ventoy_disk_gpt() {
395 PART1=$(get_disk_part_name $DISK 1)
396 PART2=$(get_disk_part_name $DISK 2)
398 sector_num=$(cat /sys/block/${DISK#/dev/}/size)
400 part1_start_sector=2048
402 if [ $reserve_mb -gt 0 ]; then
403 reserve_sector_num=$(expr $reserve_mb \* 2048 + 33)
404 part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
406 part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 34)
409 part2_start_sector=$(expr $part1_end_sector + 1)
411 modsector=$(expr $part2_start_sector % 8)
412 if [ $modsector -gt 0 ]; then
413 vtdebug "modsector
:$modsector need to be aligned with
4KB
"
414 part1_end_sector=$(expr $part1_end_sector - $modsector)
415 part2_start_sector=$(expr $part1_end_sector + 1)
418 part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
420 export part2_start_sector
422 vtdebug "part1_start_sector
=$part1_start_sector part1_end_sector
=$part1_end_sector"
423 vtdebug "part2_start_sector
=$part2_start_sector part2_end_sector
=$part2_end_sector"
425 if [ -e $PART1 ]; then
430 if [ -e $PART2 ]; then
436 echo "Create partitions on
$DISK by
$PARTTOOL in GPT style ...
"
438 vtdebug "format disk by parted ...
"
440 if [ "$TOOLDIR" != "aarch64
" ]; then
441 vt_set_efi_type="set 2 msftdata on
"
444 parted -a none --script $DISK \
447 mkpart Ventoy ntfs $part1_start_sector $part1_end_sector \
448 mkpart VTOYEFI fat16 $part2_start_sector $part2_end_sector \
458 udevadm trigger --name-match=$DISK >/dev/null 2>&1
459 partprobe >/dev/null 2>&1
463 echo 'Wait for partitions ...'
464 for i in 0 1 2 3 4 5 6 7 8 9; do
465 if [ -b $PART1 -a -b $PART2 ]; then
468 echo "Wait
for $PART1/$PART2 ...
"
473 if ! [ -b $PART1 ]; then
474 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
475 echo "mknod
-m 0660 $PART1 b
$MajorMinor ...
"
476 mknod -m 0660 $PART1 b $MajorMinor
479 if ! [ -b $PART2 ]; then
480 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
481 echo "mknod
-m 0660 $PART2 b
$MajorMinor ...
"
482 mknod -m 0660 $PART2 b $MajorMinor
485 if [ -b $PART1 -a -b $PART2 ]; then
486 echo "partition exist OK
"
488 echo "[FAIL
] $PART1/$PART2 does not exist
"
492 echo "create efi fat fs
$PART2 ...
"
494 for i in 0 1 2 3 4 5 6 7 8 9; do
495 check_umount_disk "$PART2"
497 if mkfs.vfat -F 16 -n VTOYEFI -s 1 $PART2; then