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
99 get_ventoy_version_from_cfg() {
100 if grep -q 'set.
*VENTOY_VERSION
=' $1; then
101 grep 'set.
*VENTOY_VERSION
=' $1 | awk -F'"' '{print $2}'
107 is_disk_contains_ventoy() {
110 PART1=$(get_disk_part_name $1 1)
111 PART2=$(get_disk_part_name $1 2)
113 if [ -e /sys/class/block/${PART2#/dev/}/size ]; then
114 SIZE=$(cat /sys/class/block/${PART2#/dev/}/size)
119 if ! [ -b $PART1 ]; then
120 vtdebug "$PART1 not exist
"
125 if ! [ -b $PART2 ]; then
126 vtdebug "$PART2 not exist
"
131 PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
132 PART2_TYPE=$(dd if=$DISK bs=1 count=1 skip=466 status=none | hexdump -n1 -e '1/1 "%02X"')
134 # if [ "$PART1_TYPE" != "EE
" ]; then
135 # if [ "$PART2_TYPE" != "EF
" ]; then
136 # vtdebug "part2
type is
$PART2_TYPE not EF
"
142 # PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
143 # if [ "$PART1_TYPE" != "07" ]; then
144 # vtdebug "part1
type is
$PART2_TYPE not
07"
149 if [ -e /sys/class/block/${PART1#/dev/}/start ]; then
150 PART1_START=$(cat /sys/class/block/${PART1#/dev/}/start)
153 if [ "$PART1_START" != "2048" ]; then
154 vtdebug "part1 start is
$PART1_START not
2048"
159 if [ "$VENTOY_SECTOR_NUM" != "$SIZE" ]; then
160 vtdebug "part2 size is
$SIZE not
$VENTOY_SECTOR_NUM"
168 check_disk_secure_boot() {
169 if ! is_disk_contains_ventoy $1; then
174 PART2=$(get_disk_part_name $1 2)
179 get_disk_ventoy_version() {
181 if ! is_disk_contains_ventoy $1; then
186 PART2=$(get_disk_part_name $1 2)
188 ParseVer=$(vtoyfat $PART2)
189 if [ $? -eq 0 ]; then
190 vtdebug "Ventoy version
in $PART2 is
$ParseVer"
199 format_ventoy_disk_mbr() {
204 PART1=$(get_disk_part_name $DISK 1)
205 PART2=$(get_disk_part_name $DISK 2)
207 sector_num=$(cat /sys/block/${DISK#/dev/}/size)
209 part1_start_sector=2048
211 if [ $reserve_mb -gt 0 ]; then
212 reserve_sector_num=$(expr $reserve_mb \* 2048)
213 part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
215 part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 1)
218 part2_start_sector=$(expr $part1_end_sector + 1)
219 part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
221 export part2_start_sector
223 vtdebug "part1_start_sector
=$part1_start_sector part1_end_sector
=$part1_end_sector"
224 vtdebug "part2_start_sector
=$part2_start_sector part2_end_sector
=$part2_end_sector"
226 if [ -e $PART2 ]; then
232 echo "Create partitions on
$DISK by
$PARTTOOL in MBR style ...
"
234 if [ "$PARTTOOL" = "parted
" ]; then
235 vtdebug "format disk by parted ...
"
236 parted -a none --script $DISK \
239 mkpart primary ntfs $part1_start_sector $part1_end_sector \
240 mkpart primary fat16 $part2_start_sector $part2_end_sector \
245 echo -en '\xEF' | dd of=$DISK conv=fsync bs=1 count=1 seek=466 > /dev/null 2>&1
247 vtdebug "format disk by fdisk ...
"
249 fdisk $DISK >>./log.txt 2>&1 <<EOF
273 udevadm trigger --name-match=$DISK >/dev/null 2>&1
274 partprobe >/dev/null 2>&1
278 echo 'mkfs on disk partitions ...'
279 for i in 1 2 3 4 5 6 7; do
280 if [ -b $PART2 ]; then
283 echo "wait $PART2 ...
"
289 if ! [ -b $PART2 ]; then
290 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
291 echo "mknod
-m 0660 $PART2 b
$MajorMinor ...
"
292 mknod -m 0660 $PART2 b $MajorMinor
294 if ! [ -b $PART1 ]; then
295 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
296 echo "mknod
-m 0660 $PART1 b
$MajorMinor ...
"
297 mknod -m 0660 $PART1 b $MajorMinor
301 echo "create efi fat fs
$PART2 ...
"
302 for i in 0 1 2 3 4 5 6 7 8 9; do
303 if mkfs.vfat -F 16 -n VTOYEFI $PART2; then
314 format_ventoy_disk_gpt() {
319 PART1=$(get_disk_part_name $DISK 1)
320 PART2=$(get_disk_part_name $DISK 2)
322 sector_num=$(cat /sys/block/${DISK#/dev/}/size)
324 part1_start_sector=2048
326 if [ $reserve_mb -gt 0 ]; then
327 reserve_sector_num=$(expr $reserve_mb \* 2048 + 33)
328 part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
330 part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 34)
333 part2_start_sector=$(expr $part1_end_sector + 1)
334 part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
336 export part2_start_sector
338 vtdebug "part1_start_sector
=$part1_start_sector part1_end_sector
=$part1_end_sector"
339 vtdebug "part2_start_sector
=$part2_start_sector part2_end_sector
=$part2_end_sector"
341 if [ -e $PART2 ]; then
347 echo "Create partitions on
$DISK by
$PARTTOOL in GPT style ...
"
349 vtdebug "format disk by parted ...
"
351 if [ "$TOOLDIR" != "aarch64
" ]; then
352 vt_set_efi_type="set 2 msftdata on
"
355 parted -a none --script $DISK \
358 mkpart Ventoy ntfs $part1_start_sector $part1_end_sector \
359 mkpart VTOYEFI fat16 $part2_start_sector $part2_end_sector \
369 udevadm trigger --name-match=$DISK >/dev/null 2>&1
370 partprobe >/dev/null 2>&1
374 echo 'mkfs on disk partitions ...'
375 for i in 1 2 3 4 5 6 7; do
376 if [ -b $PART2 ]; then
379 echo "wait $PART2 ...
"
385 if ! [ -b $PART2 ]; then
386 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
387 echo "mknod
-m 0660 $PART2 b
$MajorMinor ...
"
388 mknod -m 0660 $PART2 b $MajorMinor
390 if ! [ -b $PART1 ]; then
391 MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
392 echo "mknod
-m 0660 $PART1 b
$MajorMinor ...
"
393 mknod -m 0660 $PART1 b $MajorMinor
397 echo "create efi fat fs
$PART2 ...
"
398 for i in 0 1 2 3 4 5 6 7 8 9; do
399 if mkfs.vfat -F 16 -n VTOYEFI $PART2; then