#!/bin/sh
+OLDDIR=$PWD
+
+if ! [ -f ./tool/ventoy_lib.sh ]; then
+ cd ${0%Ventoy2Disk.sh}
+fi
+
. ./tool/ventoy_lib.sh
print_usage() {
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
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
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
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
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
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 ''
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
$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."
echo ""
vtwarn "Please use -i option if you want to install ventoy to $DISK"
echo ""
+ cd $OLDDIR
exit 1
fi
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."
fi
+cd $OLDDIR
+