]> glassweightruler.freedombox.rocks Git - Ventoy.git/blobdiff - INSTALL/tool/ventoy_lib.sh
1.1.07 release
[Ventoy.git] / INSTALL / tool / ventoy_lib.sh
index 3562927c8b2e15853bd1308173cad8333810de3f..854881d7a841dd5bcbfaab96141419a10faa9aa8 100644 (file)
@@ -2,6 +2,7 @@
 
 #Ventoy partition 32MB
 VENTOY_PART_SIZE=33554432
+VENTOY_PART_SIZE_MB=32
 VENTOY_SECTOR_SIZE=512
 VENTOY_SECTOR_NUM=65536
 
@@ -13,78 +14,45 @@ ventoy_true() {
     [ "1" = "1" ]
 }
 
-ventoy_is_linux64() {
-    if [ -e /lib64 ]; then
-        ventoy_true
-        return
-    fi
-    
-    if [ -e /usr/lib64 ]; then
-        ventoy_true
-        return
-    fi
-    
-    if uname -a | egrep -q 'x86_64|amd64'; then
-        ventoy_true
-        return
-    fi
-    
-    ventoy_false
-}
-
-ventoy_is_dash() {
-    if [ -L /bin/sh ]; then
-        vtdst=$(readlink /bin/sh)
-        if [ "$vtdst" = "dash" ]; then
-            ventoy_true
-            return
-        fi
-    fi 
-    ventoy_false
-}
 
 vtinfo() {
-    if ventoy_is_dash; then
-        echo "\033[32m$*\033[0m"
-    else
-        echo -e "\033[32m$*\033[0m"
-    fi
+    echo -e "\033[32m$*\033[0m"
 }
 
 vtwarn() {
-    if ventoy_is_dash; then
-        echo "\033[33m$*\033[0m"
-    else
-        echo -e "\033[33m$*\033[0m"
-    fi
+    echo -e "\033[33m$*\033[0m"
 }
 
 
 vterr() {
-    if ventoy_is_dash; then
-        echo "\033[31m$*\033[0m"
-    else
-        echo -e "\033[31m$*\033[0m"
-    fi
+    echo -e "\033[31m$*\033[0m"
 }
 
 vtdebug() {
     echo "$*" >> ./log.txt
 }
 
-check_tool_work_ok() {
-    
-    if ventoy_is_linux64; then
-        vtdebug "This is linux 64"
-        mkexfatfs=mkexfatfs_64
-        vtoyfat=vtoyfat_64
+vtoy_gen_uuid() {
+    if  uuid -F BIN > /dev/null 2>&1; then
+        uuid -F BIN
+    elif uuidgen -V > /dev/null 2>&1; then
+        a=$(uuidgen | sed 's/-//g')
+        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}"        
+    elif python -V > /dev/null 2>&1; then
+        a=$(python -c 'import sys,uuid; sys.stdout.write(uuid.uuid4().hex)')
+        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}"
+    elif [ -e /dev/urandom ]; then
+        dd if=/dev/urandom bs=1 count=16 status=none
     else
-        vtdebug "This is linux 32"
-        mkexfatfs=mkexfatfs_32
-        vtoyfat=vtoyfat_32
+        datestr=$(date +%N%N%N%N%N)
+        a=${datestr:0:32}
+        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}"
     fi
+}
+
+check_tool_work_ok() {
     
-    if echo 1 | ./tool/hexdump > /dev/null; then
+    if echo 1 | hexdump > /dev/null; then
         vtdebug "hexdump test ok ..."
     else
         vtdebug "hexdump test fail ..."
@@ -92,18 +60,18 @@ check_tool_work_ok() {
         return
     fi
    
-    if ./tool/$mkexfatfs -V > /dev/null; then
-        vtdebug "$mkexfatfs test ok ..."
+    if mkexfatfs -V > /dev/null; then
+        vtdebug "mkexfatfs test ok ..."
     else
-        vtdebug "$mkexfatfs test fail ..."
+        vtdebug "mkexfatfs test fail ..."
         ventoy_false
         return
     fi
     
-    if ./tool/$vtoyfat -T; then
-        vtdebug "$vtoyfat test ok ..."
+    if vtoycli fat -T; then
+        vtdebug "vtoycli fat test ok ..."
     else
-        vtdebug "$vtoyfat test fail ..."
+        vtdebug "vtoycli fat test fail ..."
         ventoy_false
         return
     fi
@@ -120,11 +88,27 @@ get_disk_part_name() {
         echo ${DISK}p${2}
     elif echo $DISK | grep -q "/dev/nvme[0-9][0-9]*n[0-9]"; then
         echo ${DISK}p${2}
+    elif echo $DISK | grep -q "/dev/mmcblk[0-9]"; then
+        echo ${DISK}p${2}
+    elif echo $DISK | grep -q "/dev/nbd[0-9]"; then
+        echo ${DISK}p${2}
+    elif echo $DISK | grep -q "/dev/zd[0-9]"; then
+        echo ${DISK}p${2}
+    elif echo $DISK | grep -q "/dev/md[0-9]"; then
+        echo ${DISK}p${2}
     else
         echo ${DISK}${2}
     fi
 }
 
+check_umount_disk() {
+    DiskOrPart="$1"
+    grep "^${DiskOrPart}" /proc/mounts | while read mtline; do
+        mtpnt=$(echo $mtline | awk '{print $2}')
+        vtdebug "Trying to umount $mtpnt ..."
+        umount $mtpnt >/dev/null 2>&1
+    done
+}
 
 get_ventoy_version_from_cfg() {
     if grep -q 'set.*VENTOY_VERSION=' $1; then
@@ -135,7 +119,7 @@ get_ventoy_version_from_cfg() {
 }
 
 is_disk_contains_ventoy() {
-    DISK=$1
+    DISK=$1    
     
     PART1=$(get_disk_part_name $1 1)  
     PART2=$(get_disk_part_name $1 2)  
@@ -158,19 +142,23 @@ is_disk_contains_ventoy() {
         return
     fi
     
-    PART2_TYPE=$(dd if=$DISK bs=1 count=1 skip=466 status=none | ./tool/hexdump -n1 -e  '1/1 "%02X"')
-    if [ "$PART2_TYPE" != "EF" ]; then
-        vtdebug "part2 type is $PART2_TYPE not EF"
-        ventoy_false
-        return
-    fi
+    PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e  '1/1 "%02X"')
+    PART2_TYPE=$(dd if=$DISK bs=1 count=1 skip=466 status=none | hexdump -n1 -e  '1/1 "%02X"')
     
-    PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | ./tool/hexdump -n1 -e  '1/1 "%02X"')
-    if [ "$PART1_TYPE" != "07" ]; then
-        vtdebug "part1 type is $PART2_TYPE not 07"
-        ventoy_false
-        return
-    fi
+    # if [ "$PART1_TYPE" != "EE" ]; then
+        # if [ "$PART2_TYPE" != "EF" ]; then
+            # vtdebug "part2 type is $PART2_TYPE not EF"
+            # ventoy_false
+            # return
+        # fi
+    # fi
+    
+    # PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e  '1/1 "%02X"')
+    # if [ "$PART1_TYPE" != "07" ]; then
+        # vtdebug "part1 type is $PART2_TYPE not 07"
+        # ventoy_false
+        # return
+    # fi
     
     if [ -e /sys/class/block/${PART1#/dev/}/start ]; then
         PART1_START=$(cat /sys/class/block/${PART1#/dev/}/start)
@@ -191,8 +179,7 @@ is_disk_contains_ventoy() {
     ventoy_true
 }
 
-get_disk_ventoy_version() {
-
+check_disk_secure_boot() {
     if ! is_disk_contains_ventoy $1; then
         ventoy_false
         return
@@ -200,13 +187,19 @@ get_disk_ventoy_version() {
     
     PART2=$(get_disk_part_name $1 2)    
     
-    if ventoy_is_linux64; then
-        cmd=./tool/vtoyfat_64
-    else
-        cmd=./tool/vtoyfat_32
+    vtoycli fat -s $PART2
+}
+
+get_disk_ventoy_version() {
+
+    if ! is_disk_contains_ventoy $1; then
+        ventoy_false
+        return
     fi
     
-    ParseVer=$($cmd $PART2)
+    PART2=$(get_disk_part_name $1 2)    
+    
+    ParseVer=$(vtoycli fat $PART2)
     if [ $? -eq 0 ]; then
         vtdebug "Ventoy version in $PART2 is $ParseVer"
         echo $ParseVer
@@ -217,17 +210,87 @@ get_disk_ventoy_version() {
     ventoy_false
 }
 
+wait_and_create_part() {
+    vPART1=$1
+    vPART2=$2
+    echo 'Wait for partitions $vPART1 and $vPART2 ...'
+    for i in 0 1 2 3 4 5 6 7 8 9; do
+        if ls -l $vPART1 2>/dev/null | grep -q '^b'; then
+            if ls -l $vPART2 2>/dev/null | grep -q '^b'; then
+                break
+            fi
+        else
+            echo "Wait for $vPART1 and $vPART2 ..."
+            sleep 1
+        fi
+    done
 
-format_ventoy_disk() {
-    DISK=$1
+    if ls -l $vPART1 2>/dev/null | grep -q '^b'; then
+        echo "$vPART1 exist OK"
+    else
+        MajorMinor=$(sed "s/:/ /" /sys/class/block/${vPART1#/dev/}/dev)        
+        echo "mknod -m 0660 $vPART1 b $MajorMinor ..."
+        mknod -m 0660 $vPART1 b $MajorMinor
+    fi
+    
+    if ls -l $vPART2 2>/dev/null | grep -q '^b'; then
+        echo "$vPART2 exist OK"
+    else
+        MajorMinor=$(sed "s/:/ /" /sys/class/block/${vPART2#/dev/}/dev)        
+        echo "mknod -m 0660 $vPART2 b $MajorMinor ..."
+        mknod -m 0660 $vPART2 b $MajorMinor        
+    fi
+
+    if ls -l $vPART1 2>/dev/null | grep -q '^b'; then
+        if ls -l $vPART2 2>/dev/null | grep -q '^b'; then
+            echo "partition exist OK"
+        fi
+    else
+        echo "[FAIL] $vPART1/$vPART2 does not exist"
+        exit 1
+    fi
+}
+
+
+format_ventoy_disk_mbr() {
+    reserve_mb=$1
+    DISK=$2
+    PARTTOOL=$3
+    
+    PART1=$(get_disk_part_name $DISK 1)
     PART2=$(get_disk_part_name $DISK 2)
     
     sector_num=$(cat /sys/block/${DISK#/dev/}/size)
     
-    part1_start_sector=2048
-    part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 1)
-    export part2_start_sector=$(expr $part1_end_sector + 1)
-    part2_end_sector=$(expr $sector_num - 1)
+    part1_start_sector=2048 
+    
+    if [ $reserve_mb -gt 0 ]; then
+        reserve_sector_num=$(expr $reserve_mb \* 2048)
+        part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
+    else
+        part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 1)
+    fi
+    
+    part2_start_sector=$(expr $part1_end_sector + 1)
+    
+    modsector=$(expr $part2_start_sector % 8)
+    if [ $modsector -gt 0 ]; then
+        vtdebug "modsector:$modsector need to be aligned with 4KB"
+        part1_end_sector=$(expr $part1_end_sector - $modsector)
+        part2_start_sector=$(expr $part1_end_sector + 1)
+    fi
+    
+    part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
+
+    export part2_start_sector
+
+    vtdebug "part1_start_sector=$part1_start_sector  part1_end_sector=$part1_end_sector"
+    vtdebug "part2_start_sector=$part2_start_sector  part2_end_sector=$part2_end_sector"
+
+    if [ -e $PART1 ]; then
+        echo "delete $PART1"
+        rm -f $PART1
+    fi
 
     if [ -e $PART2 ]; then
         echo "delete $PART2"
@@ -235,9 +298,24 @@ format_ventoy_disk() {
     fi
 
     echo ""
-    echo "Create partitions on $DISK ..."
+    echo "Create partitions on $DISK by $PARTTOOL in MBR style ..."
     
-fdisk $DISK >/dev/null 2>&1 <<EOF
+    if [ "$PARTTOOL" = "parted" ]; then
+        vtdebug "format disk by parted ..."
+        parted -a none --script $DISK \
+            mklabel msdos \
+            unit s \
+            mkpart primary ntfs $part1_start_sector $part1_end_sector \
+            mkpart primary fat16 $part2_start_sector $part2_end_sector \
+            set 1 boot on \
+            quit
+
+        sync
+        echo -en '\xEF' | dd of=$DISK conv=fsync bs=1 count=1 seek=466 > /dev/null 2>&1
+    else
+    vtdebug "format disk by fdisk ..."
+    
+fdisk $DISK >>./log.txt 2>&1 <<EOF
 o
 n
 p
@@ -256,25 +334,51 @@ t
 2
 ef
 a
-2
+1
 w
 EOF
-    
-    echo "Done"
-    udevadm trigger >/dev/null 2>&1
+    fi
+   
+    udevadm trigger --name-match=$DISK >/dev/null 2>&1
     partprobe >/dev/null 2>&1
     sleep 3
+    echo "Done"
 
 
-    echo 'mkfs on disk partitions ...'
-    while ! [ -e $PART2 ]; do
-        echo "wait $PART2 ..."
-        sleep 1
+    echo 'Wait for partitions ...'
+    for i in 0 1 2 3 4 5 6 7 8 9; do
+        if [ -b $PART1 -a -b $PART2 ]; then
+            break
+        else
+            echo "Wait for $PART1/$PART2 ..."
+            sleep 1
+        fi
     done
 
-    echo "create efi fat fs ..."
+    if ! [ -b $PART1 ]; then
+        MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)        
+        echo "mknod -m 0660 $PART1 b $MajorMinor ..."
+        mknod -m 0660 $PART1 b $MajorMinor
+    fi
+    
+    if ! [ -b $PART2 ]; then
+        MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)        
+        echo "mknod -m 0660 $PART2 b $MajorMinor ..."
+        mknod -m 0660 $PART2 b $MajorMinor        
+    fi
+
+    if [ -b $PART1 -a -b $PART2 ]; then
+        echo "partition exist OK"
+    else
+        echo "[FAIL] $PART1/$PART2 does not exist"
+        exit 1
+    fi
+
+    echo "create efi fat fs $PART2 ..."
     for i in 0 1 2 3 4 5 6 7 8 9; do
-        if mkfs.vfat -F 16 -n EFI $PART2; then
+        check_umount_disk "$PART2"
+
+        if mkfs.vfat -F 16 -n VTOYEFI -s 1 $PART2; then
             echo 'success'
             break
         else
@@ -285,5 +389,123 @@ EOF
 }
 
 
+format_ventoy_disk_gpt() {
+    reserve_mb=$1
+    DISK=$2
+    PARTTOOL=$3
+    
+    PART1=$(get_disk_part_name $DISK 1)
+    PART2=$(get_disk_part_name $DISK 2)
+    
+    sector_num=$(cat /sys/block/${DISK#/dev/}/size)
+    
+    part1_start_sector=2048 
+    
+    if [ $reserve_mb -gt 0 ]; then
+        reserve_sector_num=$(expr $reserve_mb \* 2048 + 33)
+        part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
+    else
+        part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 34)
+    fi
+    
+    part2_start_sector=$(expr $part1_end_sector + 1)
+    
+    modsector=$(expr $part2_start_sector % 8)
+    if [ $modsector -gt 0 ]; then
+        vtdebug "modsector:$modsector need to be aligned with 4KB"
+        part1_end_sector=$(expr $part1_end_sector - $modsector)
+        part2_start_sector=$(expr $part1_end_sector + 1)
+    fi
+    
+    part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
+
+    export part2_start_sector
+
+    vtdebug "part1_start_sector=$part1_start_sector  part1_end_sector=$part1_end_sector"
+    vtdebug "part2_start_sector=$part2_start_sector  part2_end_sector=$part2_end_sector"
+
+    if [ -e $PART1 ]; then
+        echo "delete $PART1"
+        rm -f $PART1
+    fi
+
+    if [ -e $PART2 ]; then
+        echo "delete $PART2"
+        rm -f $PART2
+    fi
+
+    echo ""
+    echo "Create partitions on $DISK by $PARTTOOL in GPT style ..."
+    
+    vtdebug "format disk by parted ..."
+    
+    if [ "$TOOLDIR" != "aarch64" ]; then
+        vt_set_efi_type="set 2 msftdata on"
+    fi    
+    
+    parted -a none --script $DISK \
+        mklabel gpt \
+        unit s \
+        mkpart Ventoy ntfs $part1_start_sector $part1_end_sector \
+        mkpart VTOYEFI fat16 $part2_start_sector $part2_end_sector \
+        $vt_set_efi_type \
+        quit
+
+    sync
+    
+    vtoycli gpt -f $DISK
+    sync
+
+    udevadm trigger --name-match=$DISK >/dev/null 2>&1
+    partprobe >/dev/null 2>&1
+    sleep 3
+    echo "Done"
+
+    echo 'Wait for partitions ...'
+    for i in 0 1 2 3 4 5 6 7 8 9; do
+        if [ -b $PART1 -a -b $PART2 ]; then
+            break
+        else
+            echo "Wait for $PART1/$PART2 ..."
+            sleep 1
+        fi
+    done
+
+    if ! [ -b $PART1 ]; then
+        MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)        
+        echo "mknod -m 0660 $PART1 b $MajorMinor ..."
+        mknod -m 0660 $PART1 b $MajorMinor
+    fi
+    
+    if ! [ -b $PART2 ]; then
+        MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)        
+        echo "mknod -m 0660 $PART2 b $MajorMinor ..."
+        mknod -m 0660 $PART2 b $MajorMinor        
+    fi
+
+    if [ -b $PART1 -a -b $PART2 ]; then
+        echo "partition exist OK"
+    else
+        echo "[FAIL] $PART1/$PART2 does not exist"
+        exit 1
+    fi
+
+    echo "create efi fat fs $PART2 ..."
+    
+    for i in 0 1 2 3 4 5 6 7 8 9; do
+        check_umount_disk "$PART2"
+        
+        if mkfs.vfat -F 16 -n VTOYEFI -s 1 $PART2; then
+            echo 'success'
+            break
+        else
+            echo "$? retry ..."
+            sleep 2
+        fi
+    done
+}
+
+
+