mirror of
https://github.com/ventoy/Ventoy.git
synced 2024-12-26 15:15:59 -05:00
363 lines
9.4 KiB
Bash
363 lines
9.4 KiB
Bash
#!/bin/sh
|
|
|
|
OLDDIR=$PWD
|
|
|
|
if ! [ -f ./tool/ventoy_lib.sh ]; then
|
|
cd ${0%Ventoy2Disk.sh}
|
|
fi
|
|
|
|
. ./tool/ventoy_lib.sh
|
|
|
|
print_usage() {
|
|
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 ''
|
|
echo '***********************************************************'
|
|
echo '* Ventoy2Disk Script *'
|
|
echo '* longpanda admin@ventoy.net *'
|
|
echo '***********************************************************'
|
|
echo ''
|
|
|
|
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 [ -z "$MODE" ]; then
|
|
print_usage
|
|
cd $OLDDIR
|
|
exit 1
|
|
fi
|
|
|
|
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
|
|
|
|
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
|
|
for file in $(ls); do
|
|
if [ "$file" != "xzcat" ]; then
|
|
if [ "$file" != "ventoy_lib.sh" ]; then
|
|
./xzcat $file > ${file%.xz}
|
|
chmod +x ${file%.xz}
|
|
fi
|
|
fi
|
|
done
|
|
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
|
|
|
|
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 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 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
|
|
|
|
version=$(get_disk_ventoy_version $DISK)
|
|
if [ $? -eq 0 ]; then
|
|
if [ -z "$FORCE" ]; then
|
|
vtwarn "$DISK already contains a Ventoy with version $version"
|
|
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
|
|
|
|
disk_sector_num=$(cat /sys/block/${DISK#/dev/}/size)
|
|
disk_size_gb=$(expr $disk_sector_num / 2097152)
|
|
|
|
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 -s $DISK p 2>&1 | grep Model
|
|
echo "Size : $disk_size_gb GB"
|
|
echo ''
|
|
|
|
vtwarn "Attention:"
|
|
vtwarn "You will install Ventoy to $DISK."
|
|
vtwarn "All the data on the disk $DISK will be lost!!!"
|
|
echo ""
|
|
|
|
read -p 'Continue? (y/n)' Answer
|
|
if [ "$Answer" != "y" ]; then
|
|
if [ "$Answer" != "Y" ]; then
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
vtwarn "All the data on the disk $DISK will be lost!!!"
|
|
read -p 'Double-check. Continue? (y/n)' Answer
|
|
if [ "$Answer" != "y" ]; then
|
|
if [ "$Answer" != "Y" ]; then
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
|
|
if [ $disk_sector_num -le $VENTOY_SECTOR_NUM ]; then
|
|
vterr "No enough space in disk $DISK"
|
|
exit 1
|
|
fi
|
|
|
|
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 $PARTTOOL
|
|
|
|
# format part1
|
|
if ventoy_is_linux64; then
|
|
cmd=./tool/mkexfatfs_64
|
|
else
|
|
cmd=./tool/mkexfatfs_32
|
|
fi
|
|
|
|
chmod +x ./tool/*
|
|
|
|
# DiskSize > 32GB Cluster Size use 128KB
|
|
# DiskSize < 32GB Cluster Size use 32KB
|
|
if [ $disk_size_gb -gt 32 ]; then
|
|
cluster_sectors=256
|
|
else
|
|
cluster_sectors=64
|
|
fi
|
|
|
|
$cmd -n ventoy -s $cluster_sectors ${DISK}1
|
|
|
|
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 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 ..."
|
|
|
|
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."
|
|
echo ""
|
|
|
|
else
|
|
vtdebug "update ventoy ..."
|
|
|
|
oldver=$(get_disk_ventoy_version $DISK)
|
|
if [ $? -ne 0 ]; then
|
|
vtwarn "$DISK does not contain ventoy or data corupted"
|
|
echo ""
|
|
vtwarn "Please use -i option if you want to install ventoy to $DISK"
|
|
echo ""
|
|
cd $OLDDIR
|
|
exit 1
|
|
fi
|
|
|
|
curver=$(cat ./ventoy/version)
|
|
|
|
vtinfo "Upgrade operation is safe, all the data in the 1st partition (iso files and other) will be unchanged!"
|
|
echo ""
|
|
|
|
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 conv=fsync if=./boot/boot.img of=$DISK bs=1 count=440
|
|
|
|
./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 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."
|
|
echo ""
|
|
|
|
fi
|
|
|
|
cd $OLDDIR
|
|
|