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
101 get_ventoy_version_from_cfg() {
102 if grep -q 'set.
*VENTOY_VERSION
=' $1; then
103 grep 'set.
*VENTOY_VERSION
=' $1 | awk -F'"' '{print $2}'
109 is_disk_contains_ventoy() {
112 PART1=$(get_disk_part_name $1 1)
113 PART2=$(get_disk_part_name $1 2)
115 if [ -e /sys/class/block/${PART2#/dev/}/size ]; then
116 SIZE=$(cat /sys/class/block/${PART2#/dev/}/size)
121 if ! [ -b $PART1 ]; then
122 vtdebug "$PART1 not exist
"
127 if ! [ -b $PART2 ]; then
128 vtdebug "$PART2 not exist
"
133 PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
134 PART2_TYPE=$(dd if=$DISK bs=1 count=1 skip=466 status=none | hexdump -n1 -e '1/1 "%02X"')
136 # if [ "$PART1_TYPE" != "EE
" ]; then
137 # if [ "$PART2_TYPE" != "EF
" ]; then
138 # vtdebug "part2
type is
$PART2_TYPE not EF
"
144 # PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
145 # if [ "$PART1_TYPE" != "07" ]; then
146 # vtdebug "part1
type is
$PART2_TYPE not
07"
151 if [ -e /sys/class/block/${PART1#/dev/}/start ]; then
152 PART1_START=$(cat /sys/class/block/${PART1#/dev/}/start)
155 if [ "$PART1_START" != "2048" ]; then
156 vtdebug "part1 start is
$PART1_START not
2048"
161 if [ "$VENTOY_SECTOR_NUM" != "$SIZE" ]; then
162 vtdebug "part2 size is
$SIZE not
$VENTOY_SECTOR_NUM"
170 check_disk_secure_boot() {
171 if ! is_disk_contains_ventoy $1; then
176 PART2=$(get_disk_part_name $1 2)
181 get_disk_ventoy_version() {
183 if ! is_disk_contains_ventoy $1; then
188 PART2=$(get_disk_part_name $1 2)
190 ParseVer=$(vtoyfat $PART2)
191 if [ $? -eq 0 ]; then
192 vtdebug "Ventoy version
in $PART2 is
$ParseVer"
201 format_ventoy_disk_mbr() {
206 PART1=$(get_disk_part_name $DISK 1)
207 PART2=$(get_disk_part_name $DISK 2)
209 sector_num=$(cat /sys/block/${DISK#/dev/}/size)
211 part1_start_sector=2048
213 if [ $reserve_mb -gt 0 ]; then
214 reserve_sector_num=$(expr $reserve_mb \* 2048)
215 part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
217 part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 1)
220 part2_start_sector=$(expr $part1_end_sector + 1)
221 part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
223 export part2_start_sector
225 vtdebug "part1_start_sector
=$part1_start_sector part1_end_sector
=$part1_end_sector"
226 vtdebug "part2_start_sector
=$part2_start_sector part2_end_sector
=$part2_end_sector"
228 if [ -e $PART2 ]; then
234 echo "Create partitions on
$DISK by
$PARTTOOL in MBR style ...
"
236 if [ "$PARTTOOL" = "parted
" ]; then
237 vtdebug "format disk by parted ...
"
238 parted -a none --script $DISK \
241 mkpart primary ntfs $part1_start_sector $part1_end_sector \
242 mkpart primary fat16 $part2_start_sector $part2_end_sector \
247 echo -en '\xEF' | dd of=$DISK conv=fsync bs=1 count=1 seek=466 > /dev/null 2>&1
249 vtdebug "format disk by fdisk ...
"
251 fdisk $DISK >>./log.txt 2>&1 <<EOF
275 udevadm trigger --name-match=$DISK >/dev/null 2>&1
276 partprobe >/dev/null 2>&1
280 echo 'mkfs on disk partitions ...'
281 for i in 1 2 3 4 5 6 7; do
282 if [ -b $PART2 ]; then
285 echo "wait $PART2 ...
"
291 if ! [ -b $PART2 ]; then
292 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
293 echo "mknod
-m 0660 $PART2 b
$MajorMinor ...
"
294 mknod -m 0660 $PART2 b $MajorMinor
296 if ! [ -b $PART1 ]; then
297 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
298 echo "mknod
-m 0660 $PART1 b
$MajorMinor ...
"
299 mknod -m 0660 $PART1 b $MajorMinor
303 echo "create efi fat fs
$PART2 ...
"
304 for i in 0 1 2 3 4 5 6 7 8 9; do
305 if mkfs.vfat -F 16 -n VTOYEFI $PART2; then
316 format_ventoy_disk_gpt() {
321 PART1=$(get_disk_part_name $DISK 1)
322 PART2=$(get_disk_part_name $DISK 2)
324 sector_num=$(cat /sys/block/${DISK#/dev/}/size)
326 part1_start_sector=2048
328 if [ $reserve_mb -gt 0 ]; then
329 reserve_sector_num=$(expr $reserve_mb \* 2048 + 33)
330 part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
332 part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 34)
335 part2_start_sector=$(expr $part1_end_sector + 1)
336 part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
338 export part2_start_sector
340 vtdebug "part1_start_sector
=$part1_start_sector part1_end_sector
=$part1_end_sector"
341 vtdebug "part2_start_sector
=$part2_start_sector part2_end_sector
=$part2_end_sector"
343 if [ -e $PART2 ]; then
349 echo "Create partitions on
$DISK by
$PARTTOOL in GPT style ...
"
351 vtdebug "format disk by parted ...
"
353 if [ "$TOOLDIR" != "aarch64
" ]; then
354 vt_set_efi_type="set 2 msftdata on
"
357 parted -a none --script $DISK \
360 mkpart Ventoy ntfs $part1_start_sector $part1_end_sector \
361 mkpart VTOYEFI fat16 $part2_start_sector $part2_end_sector \
371 udevadm trigger --name-match=$DISK >/dev/null 2>&1
372 partprobe >/dev/null 2>&1
376 echo 'mkfs on disk partitions ...'
377 for i in 1 2 3 4 5 6 7; do
378 if [ -b $PART2 ]; then
381 echo "wait $PART2 ...
"
387 if ! [ -b $PART2 ]; then
388 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
389 echo "mknod
-m 0660 $PART2 b
$MajorMinor ...
"
390 mknod -m 0660 $PART2 b $MajorMinor
392 if ! [ -b $PART1 ]; then
393 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
394 echo "mknod
-m 0660 $PART1 b
$MajorMinor ...
"
395 mknod -m 0660 $PART1 b $MajorMinor
399 echo "create efi fat fs
$PART2 ...
"
400 for i in 0 1 2 3 4 5 6 7 8 9; do
401 if mkfs.vfat -F 16 -n VTOYEFI $PART2; then