. ./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 ''
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"
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
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
exit 1
fi
- format_ventoy_disk $DISK
+ format_ventoy_disk $DISK $PARTTOOL
# format part1
if ventoy_is_linux64; 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
#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."
./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."