X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/Ventoy.git/blobdiff_plain/9f57cb392969d5be08c7d30235406f5569883cd4..73c196a823e4cd86812eeddaa76a76997d2aa0fc:/INSTALL/Ventoy2Disk.sh diff --git a/INSTALL/Ventoy2Disk.sh b/INSTALL/Ventoy2Disk.sh index 8e05b58..96dd77f 100644 --- a/INSTALL/Ventoy2Disk.sh +++ b/INSTALL/Ventoy2Disk.sh @@ -9,12 +9,16 @@ 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 '' @@ -26,32 +30,54 @@ echo '' vtdebug "############# Ventoy2Disk $0 ################" -if [ "$1" = "-i" ]; then - MODE="install" -elif [ "$1" = "-I" ]; then - MODE="install" - FORCE="Y" -elif [ "$1" = "-u" ]; then - MODE="update" -else +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 [ -z "$MODE" ]; then print_usage cd $OLDDIR exit 1 fi -if ! [ -b "$2" ]; then - print_usage +if ! [ -b "$DISK" ]; then + vterr "Disk $DISK does not exist" cd $OLDDIR exit 1 fi -if [ -z "$SUDO_USER" ]; then - if [ "$USER" != "root" ]; then - vterr "EUID is $EUID root permission is required." - echo '' - cd $OLDDIR - exit 1 - fi +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 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" @@ -84,19 +110,10 @@ if ! check_tool_work_ok; then exit 1 fi - -DISK=$2 - -if ! [ -b "$DISK" ]; then - vterr "Disk $DISK does not exist" - cd $OLDDIR - exit 1 -fi - - -if [ -e /sys/class/block/${DISK#/dev/}/start ]; then - vterr "$DISK is a partition, please use the whole disk" - cd $OLDDIR +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 @@ -106,18 +123,36 @@ grep "^$DISK" /proc/mounts | while read mtline; do umount $mtpnt >/dev/null 2>&1 done +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 @@ -181,7 +216,7 @@ if [ "$MODE" = "install" ]; then exit 1 fi - format_ventoy_disk $DISK + format_ventoy_disk $DISK $PARTTOOL # format part1 if ventoy_is_linux64; then @@ -204,6 +239,7 @@ if [ "$MODE" = "install" ]; then chmod +x ./tool/vtoy_gen_uuid + 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 @@ -214,7 +250,43 @@ if [ "$MODE" = "install" ]; then #disk signature ./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." @@ -257,6 +329,28 @@ else ./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."