X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/Ventoy.git/blobdiff_plain/05a1b863a66bf72b26e5d87570c4e0e61b9736cd..af1222be428fc00f0fe795e30ce6ccbcdcb630a4:/INSTALL/Ventoy2Disk.sh diff --git a/INSTALL/Ventoy2Disk.sh b/INSTALL/Ventoy2Disk.sh index 38cd002..29e3071 100644 --- a/INSTALL/Ventoy2Disk.sh +++ b/INSTALL/Ventoy2Disk.sh @@ -1,5 +1,11 @@ #!/bin/sh +OLDDIR=$PWD + +if ! [ -f ./tool/ventoy_lib.sh ]; then + cd ${0%Ventoy2Disk.sh} +fi + . ./tool/ventoy_lib.sh print_usage() { @@ -18,27 +24,33 @@ echo '* longpanda admin@ventoy.net *' echo '***********************************************************' echo '' -vtdebug "############# Ventoy2Disk ################" - -if ! [ -e ventoy/version ]; then - vterr "Please run under the correct directory!" - 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 - exit 1 -fi +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 + print_usage + cd $OLDDIR + exit 1 + fi + DISK=$1 + fi + + shift +done -if ! [ -b "$2" ]; then +if [ -z "$MODE" ]; then print_usage + cd $OLDDIR exit 1 fi @@ -46,12 +58,22 @@ if [ -z "$SUDO_USER" ]; then if [ "$USER" != "root" ]; then vterr "EUID is $EUID root permission is required." echo '' + cd $OLDDIR exit 1 fi 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,25 +89,33 @@ 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" + 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 +grep "^$DISK" /proc/mounts | while read mtline; do + mtpnt=$(echo $mtline | awk '{print $DISK}') + vtdebug "Trying to umount $mtpnt ..." + umount $mtpnt >/dev/null 2>&1 +done + if grep "$DISK" /proc/mounts; then vterr "$DISK is already mounted, please umount it first!" + cd $OLDDIR exit 1 fi @@ -95,6 +125,7 @@ if [ "$MODE" = "install" ]; then if ! fdisk -v >/dev/null 2>&1; then vterr "fdisk is needed by ventoy installation, but is not found in the system." + cd $OLDDIR exit 1 fi @@ -105,6 +136,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,12 +146,13 @@ 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 #Print disk info echo "Disk : $DISK" - parted $DISK p 2>&1 | grep Model + parted -s $DISK p 2>&1 | grep Model echo "Size : $disk_size_gb GB" echo '' @@ -150,7 +183,7 @@ 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 @@ -176,15 +209,44 @@ if [ "$MODE" = "install" ]; then $cmd -n ventoy -s $cluster_sectors ${DISK}1 - 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 - - chmod +x ./tool/vtoy_gen_uuid - ./tool/vtoy_gen_uuid | dd status=none of=${DISK} seek=384 bs=1 count=16 + 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 conv=fsync of=${DISK} seek=384 bs=1 count=16 + + #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 ..." + + 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 + 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." @@ -199,6 +261,7 @@ else echo "" vtwarn "Please use -i option if you want to install ventoy to $DISK" echo "" + cd $OLDDIR exit 1 fi @@ -210,21 +273,43 @@ 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=446 + 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 + 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." @@ -232,3 +317,5 @@ else fi +cd $OLDDIR +