]> glassweightruler.freedombox.rocks Git - Ventoy.git/blobdiff - INSTALL/Ventoy2Disk.sh
Update Ventoy2Disk.sh
[Ventoy.git] / INSTALL / Ventoy2Disk.sh
index 9e6deef2e6b48c8c0763bf8e2d666a87ca3cfb6c..96dd77fb85cc6e348568db7ec2afd33bebdd14d9 100644 (file)
@@ -1,14 +1,24 @@
 #!/bin/sh
 
+OLDDIR=$PWD
+
+if ! [ -f ./tool/ventoy_lib.sh ]; then
+    cd ${0%Ventoy2Disk.sh}
+fi
+
 . ./tool/ventoy_lib.sh
 
 print_usage() {
-    echo 'Usage:  VentoyInstaller.sh OPTION /dev/sdX'
-    echo '  OPTION:'
+    echo 'Usage:  Ventoy2Disk.sh CMD [ OPTION ] /dev/sdX'
+    echo '  CMD:'
     echo '   -i  install ventoy to sdX (fail if disk already installed with ventoy)'
     echo '   -u  update ventoy in sdX'
     echo '   -I  force install ventoy to sdX (no matter installed or not)'
     echo ''
+    echo '  OPTION: (optional)'
+    echo '   -s  enable secure boot support (default is disabled)'
+    echo ''
+    
 }
 
 echo ''
@@ -18,40 +28,69 @@ echo '*             longpanda  admin@ventoy.net                 *'
 echo '***********************************************************'
 echo ''
 
-vtdebug "############# Ventoy2Disk ################"
+vtdebug "############# Ventoy2Disk $0 ################"
+
+while [ -n "$1" ]; do
+    if [ "$1" = "-i" ]; then
+        MODE="install"
+    elif [ "$1" = "-I" ]; then
+        MODE="install"
+        FORCE="Y"
+    elif [ "$1" = "-u" ]; then
+        MODE="update"
+    elif [ "$1" = "-s" ]; then
+        SECUREBOOT="YES"
+    else
+        if ! [ -b "$1" ]; then
+            vterr "$1 is NOT a valid device"
+            print_usage
+            cd $OLDDIR
+            exit 1
+        fi
+        DISK=$1
+    fi
+    
+    shift
+done
 
-if ! [ -e ventoy/version ]; then
-    vterr "Please run under the correct directory!"
+if [ -z "$MODE" ]; then
+    print_usage
+    cd $OLDDIR
     exit 1
 fi
 
-if [ "$1" = "-i" ]; then
-    MODE="install"
-elif [ "$1" = "-I" ]; then
-    MODE="install"
-    FORCE="Y"
-elif [ "$1" = "-u" ]; then
-    MODE="update"
-else
-    print_usage
+if ! [ -b "$DISK" ]; then
+    vterr "Disk $DISK does not exist"
+    cd $OLDDIR
     exit 1
 fi
 
-if ! [ -b "$2" ]; then
-    print_usage
+if [ -e /sys/class/block/${DISK#/dev/}/start ]; then
+    vterr "$DISK is a partition, please use the whole disk"
+    cd $OLDDIR
     exit 1
 fi
 
-if [ -z "$SUDO_USER" ]; then
-    if [ "$USER" != "root" ]; then
-        vterr "EUID is $EUID root permission is required."
-        echo ''
-        exit 1
-    fi
+if dd if="$DISK" of=/dev/null bs=1 count=1 >/dev/null 2>&1; then
+    vtdebug "root permission check ok ..."
+else
+    vterr "Failed to access $DISK, maybe root privilege is needed!"
+    echo ''
+    cd $OLDDIR
+    exit 1
 fi
 
 vtdebug "MODE=$MODE FORCE=$FORCE"
 
+if ! [ -f ./boot/boot.img ]; then
+    if [ -d ./grub ]; then
+        vterr "Don't run me here, please download the released install package, and run there."
+    else
+        vterr "Please run under the right directory!" 
+    fi
+    exit 1
+fi
+
 #decompress tool
 cd tool
 chmod +x ./xzcat
@@ -67,34 +106,54 @@ cd ../
 
 if ! check_tool_work_ok; then
     vterr "Some tools can not run in current system. Please check log.txt for detail."
+    cd $OLDDIR
     exit 1
 fi
 
-
-DISK=$2
-
-if ! [ -b "$DISK" ]; then
-    vterr "Disk $DISK does not exist"
+testEF=$(echo -en '\xEF' | ./tool/hexdump -n 1 -e '1/1 "%02X"')
+if [ "$testEF" != "EF" ]; then
+    vtdebug "testEF=##${testEF}##"
+    vterr "There is something wrong with the interpreter !"
     exit 1
 fi
 
+grep "^$DISK" /proc/mounts | while read mtline; do
+    mtpnt=$(echo $mtline | awk '{print $2}')
+    vtdebug "Trying to umount $mtpnt ..."
+    umount $mtpnt >/dev/null 2>&1
+done
 
-if [ -e /sys/class/block/${DISK#/dev/}/start ]; then
-    vterr "$DISK is a partition, please use the whole disk"
-    exit 1
+if swapon -s | grep -q "^${DISK}[0-9]"; then
+    swapon -s | grep "^${DISK}[0-9]" | awk '{print $1}' | while read line; do
+        vtdebug "Trying to swapoff $line ..."
+        swapoff $line
+    done
 fi
 
+
 if grep "$DISK" /proc/mounts; then
     vterr "$DISK is already mounted, please umount it first!"
+    cd $OLDDIR
+    exit 1
+fi
+
+if swapon -s | grep -q "^${DISK}[0-9]"; then
+    vterr "$DISK is used as swap, please swapoff it first!"
+    cd $OLDDIR
     exit 1
 fi
 
 
 if [ "$MODE" = "install" ]; then
     vtdebug "install ventoy ..."
-    
-    if ! fdisk -v >/dev/null 2>&1; then
-        vterr "fdisk is needed by ventoy installation, but is not found in the system."
+
+    if parted -v > /dev/null 2>&1; then
+        PARTTOOL='parted'
+    elif fdisk -v >/dev/null 2>&1; then
+        PARTTOOL='fdisk'
+    else
+        vterr "Both parted and fdisk are not found in the sysstem, Ventoy can't create new partition."
+        cd $OLDDIR
         exit 1
     fi
     
@@ -105,6 +164,7 @@ if [ "$MODE" = "install" ]; then
             vtwarn "Use -u option to do a safe upgrade operation."
             vtwarn "OR if you really want to reinstall ventoy to $DISK, please use -I option."
             vtwarn ""
+            cd $OLDDIR
             exit 1
         fi
     fi
@@ -114,6 +174,7 @@ if [ "$MODE" = "install" ]; then
 
     if [ $disk_sector_num -gt 4294967296 ]; then
         vterr "$DISK is over 2TB size, MBR will not work on it."
+        cd $OLDDIR
         exit 1
     fi
 
@@ -150,12 +211,12 @@ if [ "$MODE" = "install" ]; then
         exit 1
     fi
 
-    if ! dd if=/dev/zero of=$DISK bs=1 count=512 status=none; then
+    if ! dd if=/dev/zero of=$DISK bs=1 count=512 status=none conv=fsync; then
         vterr "Write data to $DISK failed, please check whether it's in use."
         exit 1
     fi
 
-    format_ventoy_disk $DISK
+    format_ventoy_disk $DISK $PARTTOOL
 
     # format part1
     if ventoy_is_linux64; then
@@ -178,17 +239,54 @@ if [ "$MODE" = "install" ]; then
 
     chmod +x ./tool/vtoy_gen_uuid
 
-    dd status=none if=./boot/boot.img of=$DISK bs=1 count=446
-    ./tool/xzcat ./boot/core.img.xz | dd status=none of=$DISK bs=512 count=2047 seek=1
-    ./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start_sector
+    vtinfo "writing data to disk ..."
+    dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=446
+    ./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1
+    ./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start_sector
     
     #disk uuid
-    ./tool/vtoy_gen_uuid | dd status=none of=${DISK} seek=384 bs=1 count=16
+    ./tool/vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} seek=384 bs=1 count=16
     
     #disk signature
-    ./tool/vtoy_gen_uuid | dd status=none of=${DISK} skip=12 seek=440 bs=1 count=4
+    ./tool/vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} skip=12 seek=440 bs=1 count=4
 
+    vtinfo "sync data ..."
     sync
+    
+    vtinfo "esp partition processing ..."
+    
+    sleep 1
+    mtpnt=$(grep "^${DISK}2" /proc/mounts | awk '{print $2}')
+    if [ -n "$mtpnt" ]; then
+        umount $mtpnt >/dev/null 2>&1
+    fi
+    
+    if [ "$SECUREBOOT" != "YES" ]; then
+        mkdir ./tmp_mnt
+        
+        vtdebug "mounting part2 ...."
+        for tt in 1 2 3; do
+            if mount ${DISK}2 ./tmp_mnt; then
+                vtdebug "mounting part2 success"
+                break
+            fi
+            
+            mtpnt=$(grep "^${DISK}2" /proc/mounts | awk '{print $2}')
+            if [ -n "$mtpnt" ]; then
+                umount $mtpnt >/dev/null 2>&1
+            fi
+            sleep 2
+        done
+
+        rm -f ./tmp_mnt/EFI/BOOT/BOOTX64.EFI
+        rm -f ./tmp_mnt/EFI/BOOT/grubx64.efi
+        rm -f ./tmp_mnt/EFI/BOOT/MokManager.efi
+        rm -f ./tmp_mnt/ENROLL_THIS_KEY_IN_MOKMANAGER.cer
+        mv ./tmp_mnt/EFI/BOOT/grubx64_real.efi  ./tmp_mnt/EFI/BOOT/BOOTX64.EFI
+        
+        umount ./tmp_mnt
+        rm -rf ./tmp_mnt
+    fi
 
     echo ""
     vtinfo "Install Ventoy to $DISK successfully finished."
@@ -203,6 +301,7 @@ else
         echo ""
         vtwarn "Please use -i option if you want to install ventoy to $DISK"
         echo ""
+        cd $OLDDIR
         exit 1
     fi
 
@@ -214,21 +313,44 @@ else
     read -p "Update Ventoy  $oldver ===> $curver   Continue? (y/n)"  Answer
     if [ "$Answer" != "y" ]; then
         if [ "$Answer" != "Y" ]; then
+            cd $OLDDIR
             exit 0
         fi
     fi
 
     PART2=$(get_disk_part_name $DISK 2)
     
-    dd status=none if=./boot/boot.img of=$DISK bs=1 count=440
+    dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=440
     
-    ./tool/xzcat ./boot/core.img.xz | dd status=none of=$DISK bs=512 count=2047 seek=1  
+    ./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1  
 
     disk_sector_num=$(cat /sys/block/${DISK#/dev/}/size) 
     part2_start=$(expr $disk_sector_num - $VENTOY_SECTOR_NUM)
-    ./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start
+    ./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start
 
     sync
+    
+    if [ "$SECUREBOOT" != "YES" ]; then
+        mkdir ./tmp_mnt
+        
+        vtdebug "mounting part2 ...."
+        for tt in 1 2 3; do
+            if mount ${DISK}2 ./tmp_mnt; then
+                vtdebug "mounting part2 success"
+                break
+            fi
+            sleep 2
+        done
+              
+        rm -f ./tmp_mnt/EFI/BOOT/BOOTX64.EFI
+        rm -f ./tmp_mnt/EFI/BOOT/grubx64.efi
+        rm -f ./tmp_mnt/EFI/BOOT/MokManager.efi
+        rm -f ./tmp_mnt/ENROLL_THIS_KEY_IN_MOKMANAGER.cer
+        mv ./tmp_mnt/EFI/BOOT/grubx64_real.efi  ./tmp_mnt/EFI/BOOT/BOOTX64.EFI
+        
+        umount ./tmp_mnt
+        rm -rf ./tmp_mnt
+    fi
 
     echo ""
     vtinfo "Update Ventoy to $DISK successfully finished."
@@ -236,3 +358,5 @@ else
     
 fi
 
+cd $OLDDIR
+