Initial commit from Ventoy@7cbdc5c

This commit is contained in:
2026-08-23 00:38:40 -04:00
commit e9a7a16826
2848 changed files with 439164 additions and 0 deletions
Binary file not shown.
+585
View File
@@ -0,0 +1,585 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.2"/>
<object class="GtkImage" id="image_refresh">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<object class="GtkWindow" id="part_cfg_dlg">
<property name="can_focus">False</property>
<property name="resizable">False</property>
<property name="title" translatable="yes">Partition Configuration</property>
<property name="modal">True</property>
<property name="window_position">center</property>
<property name="default_width">460</property>
<property name="default_height">270</property>
<child>
<object class="GtkFixed" id="fixed_partcfg_1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkFrame" id="frame_space_check">
<property name="width_request">440</property>
<property name="height_request">50</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<child>
<object class="GtkFixed" id="fixed_space_check">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkCheckButton" id="space_check_btn">
<property name="width_request">380</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
<packing>
<property name="x">10</property>
<property name="y">10</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="x">10</property>
<property name="y">10</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame_space_value">
<property name="width_request">220</property>
<property name="height_request">60</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<child>
<object class="GtkFixed" id="fixed_space_value">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkEntry" id="entry_reserve_space">
<property name="width_request">200</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">*</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
<property name="width_chars">10</property>
</object>
<packing>
<property name="x">10</property>
<property name="y">10</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="x">10</property>
<property name="y">60</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame_space_unit">
<property name="width_request">220</property>
<property name="height_request">60</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<child>
<object class="GtkFixed" id="fixed_space_unit">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkComboBoxText" id="comboboxtext_unit">
<property name="width_request">200</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="active">1</property>
<items>
<item translatable="yes">MB</item>
<item translatable="yes">GB</item>
</items>
</object>
<packing>
<property name="x">10</property>
<property name="y">10</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="x">230</property>
<property name="y">60</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame_space_align">
<property name="width_request">440</property>
<property name="height_request">50</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<child>
<object class="GtkFixed" id="fixed_space_alian">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkCheckButton" id="space_align_btn">
<property name="width_request">380</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="active">True</property>
</object>
<packing>
<property name="x">10</property>
<property name="y">10</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="x">10</property>
<property name="y">140</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_partcfg_ok">
<property name="label" translatable="yes">OK</property>
<property name="width_request">100</property>
<property name="height_request">40</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="x">90</property>
<property name="y">210</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_partcfg_cancel">
<property name="label" translatable="yes">Cancel</property>
<property name="width_request">100</property>
<property name="height_request">40</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="has_default">True</property>
</object>
<packing>
<property name="x">270</property>
<property name="y">210</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame_dummy1">
<property name="width_request">460</property>
<property name="height_request">25</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
</object>
<packing>
<property name="x">10</property>
<property name="y">250</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkWindow" id="window">
<property name="can_focus">False</property>
<property name="resizable">False</property>
<property name="title" translatable="yes">Ventoy2Disk</property>
<property name="modal">False</property>
<property name="window_position">center</property>
<property name="default_width">480</property>
<property name="default_height">365</property>
<child>
<object class="GtkFixed" id="fixed_main">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuBar" id="menubar1">
<property name="width_request">480</property>
<property name="height_request">22</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="menu_option">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Options</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="submenu_option">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkCheckMenuItem" id="menu_item_secure">
<property name="label">Secure Boot Support</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="active">False</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_part_style">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Partition Style</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="submenu_part_style">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkRadioMenuItem" id="menu_item_mbr">
<property name="label">MBR</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="active">True</property>
</object>
</child>
<child>
<object class="GtkRadioMenuItem" id="menu_item_gpt">
<property name="label">GPT</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="active">False</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_item_part_cfg">
<property name="label">Partition Configuration</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_item_clear">
<property name="label">Clear Ventoy</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkCheckMenuItem" id="menu_item_show_all">
<property name="label">Show All Devices</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="active">False</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_language">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Language</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="submenu_language">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkFrame" id="frame_device">
<property name="width_request">460</property>
<property name="height_request">75</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<child>
<object class="GtkFixed" id="fixed5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkComboBoxText" id="combobox_devlist">
<property name="width_request">380</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="x">10</property>
<property name="y">5</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_refresh">
<property name="width_request">50</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="has_default">True</property>
<property name="image">image_refresh</property>
</object>
<packing>
<property name="x">398</property>
<property name="y">0</property>
</packing>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label_device">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes"> Device </property>
</object>
</child>
</object>
<packing>
<property name="x">10</property>
<property name="y">40</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame_pkg_ver">
<property name="width_request">228</property>
<property name="height_request">70</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0.5</property>
<child>
<object class="GtkFixed" id="fixed3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImage" id="image_secure_local">
<property name="width_request">10</property>
<property name="height_request">40</property>
<property name="visible">False</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="x">20</property>
<property name="y">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_local_ver_value">
<property name="width_request">120</property>
<property name="height_request">40</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes"></property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="x">45</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_local_part_style">
<property name="width_request">45</property>
<property name="height_request">20</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">MBR</property>
</object>
<packing>
<property name="x">180</property>
<property name="y">30</property>
</packing>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label_local_ver">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes"> Ventoy In Package </property>
<property name="use_markup">True</property>
</object>
</child>
</object>
<packing>
<property name="x">10</property>
<property name="y">132</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame3">
<property name="width_request">228</property>
<property name="height_request">70</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0.5</property>
<child>
<object class="GtkFixed" id="fixed4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImage" id="image_secure_dev">
<property name="width_request">10</property>
<property name="height_request">40</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="x">20</property>
<property name="y">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_dev_ver_value">
<property name="width_request">120</property>
<property name="height_request">40</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes"></property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="x">45</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_dev_part_style">
<property name="width_request">45</property>
<property name="height_request">20</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes"></property>
</object>
<packing>
<property name="x">180</property>
<property name="y">30</property>
</packing>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label_device_ver">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes"> Ventoy In Device </property>
<property name="use_markup">True</property>
</object>
</child>
</object>
<packing>
<property name="x">243</property>
<property name="y">132</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame4">
<property name="width_request">460</property>
<property name="height_request">50</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<child>
<object class="GtkFixed" id="fixed2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkProgressBar" id="progressbar1">
<property name="width_request">440</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="fraction">0.0</property>
</object>
<packing>
<property name="x">8</property>
<property name="y">10</property>
</packing>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label_status">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes"> Status - READY</property>
</object>
</child>
</object>
<packing>
<property name="x">10</property>
<property name="y">215</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_install">
<property name="label" translatable="yes">Install</property>
<property name="width_request">100</property>
<property name="height_request">40</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="x">100</property>
<property name="y">300</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_update">
<property name="label" translatable="yes">Update</property>
<property name="width_request">100</property>
<property name="height_request">40</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="x">280</property>
<property name="y">300</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame_dummy2">
<property name="width_request">460</property>
<property name="height_request">25</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
</object>
<packing>
<property name="x">10</property>
<property name="y">345</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
+643
View File
@@ -0,0 +1,643 @@
#!/bin/sh
. ./tool/ventoy_lib.sh
print_usage() {
echo 'Usage: Ventoy2Disk.sh CMD [ OPTION ] /dev/sdX'
echo ' CMD:'
echo ' -i install Ventoy to sdX (fails if disk already installed with Ventoy)'
echo ' -I force install Ventoy to sdX (no matter if installed or not)'
echo ' -u update Ventoy in sdX'
echo ' -l list Ventoy information in sdX'
echo ''
echo ' OPTION: (optional)'
echo ' -r SIZE_MiB preserve some space (MiB) at the bottom of the disk (only for install)'
echo ' -s/-S enable/disable secure boot support (default is enabled)'
echo ' -g use GPT partition style, default is MBR (only for install)'
echo ' -L Label of the 1st exfat partition (default is Ventoy)'
echo ' -n try non-destructive installation (only for install)'
echo ''
}
SECUREBOOT="YES"
VTNEW_LABEL='Ventoy'
RESERVE_SIZE_MB=0
while [ -n "$1" ]; do
if [ "$1" = "-i" ]; then
MODE="install"
elif [ "$1" = "-I" ]; then
MODE="install"
FORCE="Y"
elif [ "$1" = "-n" ]; then
NONDESTRUCTIVE="Y"
elif [ "$1" = "-u" ]; then
MODE="update"
elif [ "$1" = "-l" ]; then
MODE="list"
elif [ "$1" = "-s" ]; then
SECUREBOOT="YES"
elif [ "$1" = "-S" ]; then
SECUREBOOT="NO"
elif [ "$1" = "-g" ]; then
VTGPT="YES"
elif [ "$1" = "-L" ]; then
shift
VTNEW_LABEL=$1
elif [ "$1" = "-r" ]; then
RESERVE_SPACE="YES"
shift
RESERVE_SIZE_MB=$1
elif [ "$1" = "-V" ] || [ "$1" = "--version" ]; then
exit 0
elif [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
print_usage
exit 0
else
if ! [ -b "$1" ]; then
vterr "$1 is NOT a valid device"
print_usage
exit 1
fi
DISK=$1
# Resolve symlinks now, will be needed to look up information about the device in
# the /sys/ filesystem, for example /sys/class/block/${DISK#/dev/}/start
# The main use case is supporting /dev/disk/by-id/ symlinks instead of raw devices
if [ -L "$DISK" ]; then
DISK=$(readlink -e -n "$DISK")
fi
fi
shift
done
if [ -z "$MODE" ]; then
print_usage
exit 1
fi
if ! [ -b "$DISK" ]; then
vterr "Disk $DISK does not exist"
exit 1
fi
if [ -e /sys/class/block/${DISK#/dev/}/start ]; then
vterr "$DISK is a partition, please use the whole disk."
echo "For example:"
vterr " sudo sh Ventoy2Disk.sh -i /dev/sdb1 <=== This is wrong"
vtinfo " sudo sh Ventoy2Disk.sh -i /dev/sdb <=== This is right"
echo ""
exit 1
fi
if [ -n "$RESERVE_SPACE" -a "$MODE" = "install" ]; then
if echo $RESERVE_SIZE_MB | grep -q '^[0-9][0-9]*$'; then
vtdebug "User will reserve $RESERVE_SIZE_MB MiB disk space"
else
vterr "$RESERVE_SIZE_MB is invalid for reserved space"
exit 1
fi
fi
vtdebug "MODE=$MODE FORCE=$FORCE RESERVE_SPACE=$RESERVE_SPACE RESERVE_SIZE_MB=$RESERVE_SIZE_MB"
#check tools
if check_tool_work_ok; then
vtdebug "check tool work ok"
else
vterr "Some tools can not run on current system. Please check log.txt for details."
exit 1
fi
if [ "$MODE" = "list" ]; then
version=$(get_disk_ventoy_version $DISK)
if [ $? -eq 0 ]; then
echo "Ventoy Version in Disk: $version"
vtPart1Type=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
if [ "$vtPart1Type" = "EE" ]; then
echo "Disk Partition Style : GPT"
else
echo "Disk Partition Style : MBR"
fi
if check_disk_secure_boot $DISK; then
echo "Secure Boot Support : YES"
else
echo "Secure Boot Support : NO"
fi
else
echo "Ventoy Version: NA"
fi
echo ""
exit 0
fi
#check mountpoint
check_umount_disk "$DISK"
if grep "$DISK" /proc/mounts; then
vterr "$DISK is already mounted, please umount it first!"
exit 1
fi
#check swap partition
if swapon --help 2>&1 | grep -q '^ -s,'; then
if swapon -s | grep -q "^${DISK}[0-9]"; then
vterr "$DISK is used as swap, please swapoff it first!"
exit 1
fi
fi
#check access
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 ''
exit 1
fi
#check tmp_mnt directory
if [ -d ./tmp_mnt ]; then
vtdebug "There is a tmp_mnt directory, now delete it."
umount ./tmp_mnt >/dev/null 2>&1
rm -rf ./tmp_mnt
if [ -d ./tmp_mnt ]; then
vterr "tmp_mnt directory exists, please delete it first."
exit 1
fi
fi
if [ "$MODE" = "install" -a -z "$NONDESTRUCTIVE" ]; then
vtdebug "install Ventoy ..."
if [ -n "$VTGPT" ]; then
if parted -v > /dev/null 2>&1; then
PARTTOOL='parted'
else
vterr "parted is not found in the system, Ventoy can't create new partitions without it."
vterr "You should install \"GNU parted\" first."
exit 1
fi
else
if parted -v > /dev/null 2>&1; then
PARTTOOL='parted'
elif command -v fdisk > /dev/null 2>&1; then
PARTTOOL='fdisk'
else
vterr "Both parted and fdisk are not found in the system, Ventoy can't create new partitions."
exit 1
fi
fi
if [ "$PARTTOOL" = "parted" ]; then
if parted -s $DISK p 2>&1 | grep -i -q 'sector size.*4096.*4096'; then
vterr "Currently Ventoy does not support 4K native device."
exit 1
fi
else
if fdisk -l $DISK | grep -i -q 'sector size.*4096.*4096'; then
vterr "Currently Ventoy does not support 4K native device."
exit 1
fi
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 ""
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 ] && [ -z "$VTGPT" ]; then
vterr "$DISK is over 2TB size, MBR will not work on it."
exit 1
fi
if [ -n "$RESERVE_SPACE" ]; then
sum_size_mb=$(expr $RESERVE_SIZE_MB + $VENTOY_PART_SIZE_MB)
reserve_sector_num=$(expr $sum_size_mb \* 2048)
if [ $disk_sector_num -le $reserve_sector_num ]; then
vterr "Can't reserve $RESERVE_SIZE_MB MiB space from $DISK"
exit 1
fi
fi
#Print disk info
echo "Disk : $DISK"
parted -s $DISK p 2>&1 | grep Model
echo "Size : $disk_size_gb GiB"
if [ -n "$VTGPT" ]; then
echo "Style: GPT"
else
echo "Style: MBR"
fi
echo ''
if [ -n "$RESERVE_SPACE" ]; then
echo "You will reserve $RESERVE_SIZE_MB MiB disk space "
fi
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
# check and umount
check_umount_disk "$DISK"
if ! dd if=/dev/zero of=$DISK bs=64 count=512 status=none conv=fsync; then
vterr "Write data to $DISK failed, please check whether it's in use."
exit 1
fi
if [ -n "$VTGPT" ]; then
vtdebug "format_ventoy_disk_gpt $RESERVE_SIZE_MB $DISK $PARTTOOL ..."
format_ventoy_disk_gpt $RESERVE_SIZE_MB $DISK $PARTTOOL
else
vtdebug "format_ventoy_disk_mbr $RESERVE_SIZE_MB $DISK $PARTTOOL ..."
format_ventoy_disk_mbr $RESERVE_SIZE_MB $DISK $PARTTOOL
fi
# format part1
# 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
PART1=$(get_disk_part_name $DISK 1)
PART2=$(get_disk_part_name $DISK 2)
#clean part2
dd status=none conv=fsync if=/dev/zero of=$DISK bs=512 count=32 seek=$part2_start_sector
#format part1
wait_and_create_part ${PART1} ${PART2}
if [ -b ${PART1} ]; then
vtinfo "Format partition 1 ${PART1} ..."
mkexfatfs -n "$VTNEW_LABEL" -s $cluster_sectors ${PART1}
if [ $? -ne 0 ]; then
echo "mkexfatfs failed, now retry..."
mkexfatfs -n "$VTNEW_LABEL" -s $cluster_sectors ${PART1}
if [ $? -ne 0 ]; then
echo "######### mkexfatfs failed, exit ########"
exit 1
fi
else
echo "mkexfatfs success"
fi
else
vterr "${PART1} NOT exist"
fi
vtinfo "writing data to disk ..."
dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=446
if [ -n "$VTGPT" ]; then
echo -en '\x22' | dd status=none of=$DISK conv=fsync bs=1 count=1 seek=92
xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2014 seek=34
echo -en '\x23' | dd of=$DISK conv=fsync bs=1 count=1 seek=17908 status=none
else
xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1
fi
# check and umount
check_umount_disk "$DISK"
xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start_sector
#test UUID
testUUIDStr=$(vtoy_gen_uuid | hexdump -C)
vtdebug "test uuid: $testUUIDStr"
#disk uuid
vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} seek=384 bs=1 count=16
#disk signature
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
sleep 2
check_umount_disk "$DISK"
vtoycli partresize -s $DISK $part2_start_sector
fi
echo ""
vtinfo "Install Ventoy to $DISK successfully finished."
echo ""
elif [ "$MODE" = "install" -a -n "$NONDESTRUCTIVE" ]; then
vtdebug "non-destructive install Ventoy ..."
version=$(get_disk_ventoy_version $DISK)
if [ $? -eq 0 ]; then
if [ -z "$FORCE" ]; then
vtwarn "$DISK already contains a Ventoy with version $version."
vtwarn "You can not do and don not need non-destructive installation."
vtwarn ""
exit 1
fi
fi
disk_sector_num=$(cat /sys/block/${DISK#/dev/}/size)
disk_size_gb=$(expr $disk_sector_num / 2097152)
if vtoycli partresize -t $DISK; then
OldStyle="GPT"
else
OldStyle="MBR"
fi
#Print disk info
echo "Disk : $DISK"
parted -s $DISK p 2>&1 | grep Model
echo "Size : $disk_size_gb GiB"
echo "Style: $OldStyle"
echo ''
vtwarn "Attention:"
vtwarn "Ventoy will try non-destructive installation on $DISK if possible."
echo ""
read -p '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
PART1=$(get_disk_part_name $DISK 1)
PART2=$(get_disk_part_name $DISK 2)
#Part1 size in MB aligned with 4KB
PART1_SECTORS=$(cat /sys/class/block/${PART1#/dev/}/size)
PART1_4K=$(expr $PART1_SECTORS / 8)
PART1_MB=$(expr $PART1_4K / 256)
PART1_NEW_MB=$(expr $PART1_MB - 32)
echo "$PART1 is ${PART1_MB}MiB"
#check partition layout
echo "check partition layout ..."
vtoycli partresize -c $DISK
vtRet=$?
if [ $vtRet -eq 0 ]; then
exit 1
else
# check and umount
check_umount_disk "$DISK"
sleep 1
check_umount_disk "$DISK"
if [ $vtRet -eq 1 ]; then
echo "Free space enough, start install..."
part2_start_sector=$(expr $PART1_SECTORS + 2048)
elif [ $vtRet -eq 2 ]; then
echo "We need to shrink partition 1 firstly ..."
PART1_BLKID=$(blkid $PART1)
blkid $PART1
if echo $PART1_BLKID | grep -E -q -i 'TYPE=ntfs|TYPE=.ntfs'; then
echo "Partition 1 contains NTFS filesystem"
which ntfsresize
if [ $? -ne 0 ]; then
echo "###[FAIL] ntfsresize not found. Please install ntfs-3g package."
exit 1
fi
echo "ntfsfix -b -d $PART1 ..."
ntfsfix -b -d $PART1
echo "ntfsresize --size ${PART1_NEW_MB}Mi $PART1 ..."
ntfsresize -f --size ${PART1_NEW_MB}Mi $PART1
if [ $? -ne 0 ]; then
echo "###[FAIL] ntfsresize failed."
exit 1
fi
elif echo $PART1_BLKID | grep -E -q -i 'TYPE=ext[2-4]|TYPE=.ext[2-4]'; then
echo "Partition 1 contains EXT filesystem"
which resize2fs
if [ $? -ne 0 ]; then
echo "###[FAIL] resize2fs not found. Please install e2fsprogs package."
exit 1
fi
echo "e2fsck -f $PART1 ..."
e2fsck -f $PART1
echo "resize2fs $PART1 ${PART1_NEW_MB}M ..."
resize2fs $PART1 ${PART1_NEW_MB}M
if [ $? -ne 0 ]; then
echo "###[FAIL] resize2fs failed."
exit 1
fi
else
echo "###[FAIL] Unsupported filesystem in partition 1."
exit 1
fi
sync
PART1_NEW_END_MB=$(expr $PART1_NEW_MB + 1)
part2_start_sector=$(expr $PART1_NEW_END_MB \* 2048)
fi
fi
vtinfo "writing data to disk part2_start=$part2_start_sector ..."
dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=440
if [ "$OldStyle" = "GPT" ]; then
echo -en '\x22' | dd status=none of=$DISK conv=fsync bs=1 count=1 seek=92
xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2014 seek=34
echo -en '\x23' | dd of=$DISK conv=fsync bs=1 count=1 seek=17908 status=none
else
xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1
fi
xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start_sector
#test UUID
testUUIDStr=$(vtoy_gen_uuid | hexdump -C)
vtdebug "test uuid: $testUUIDStr"
#disk uuid
vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} seek=384 bs=1 count=16
vtinfo "sync data ..."
sync
vtinfo "esp partition processing ..."
if [ "$SECUREBOOT" != "YES" ]; then
vtoycli partresize -s $DISK $part2_start_sector
fi
vtinfo "update partition table $DISK $part2_start_sector ..."
vtoycli partresize -p $DISK $part2_start_sector
if [ $? -eq 0 ]; then
sync
echo ""
vtinfo "Ventoy non-destructive installation on $DISK successfully finished."
echo ""
else
echo ""
vterr "Ventoy non-destructive installation on $DISK failed."
echo ""
fi
else
vtdebug "update Ventoy ..."
oldver=$(get_disk_ventoy_version $DISK)
if [ $? -ne 0 ]; then
if is_disk_contains_ventoy $DISK; then
oldver="Unknown"
else
vtwarn "$DISK does not contain Ventoy or data corrupted"
echo ""
vtwarn "Please use -i option if you want to install ventoy to $DISK"
echo ""
exit 1
fi
fi
#reserve secure boot option
if [ -z "$SECUREBOOT" ]; then
if check_disk_secure_boot $DISK; then
SECUREBOOT="YES"
else
SECUREBOOT="NO"
fi
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
exit 0
fi
fi
PART2=$(get_disk_part_name $DISK 2)
SHORT_PART2=${PART2#/dev/}
part2_start=$(cat /sys/class/block/$SHORT_PART2/start)
PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
#reserve disk uuid
rm -f ./diskuuid.bin
dd status=none conv=fsync if=${DISK} skip=384 bs=1 count=16 of=./diskuuid.bin
dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=440
dd status=none conv=fsync if=./diskuuid.bin of=$DISK bs=1 count=16 seek=384
rm -f ./diskuuid.bin
#reserve data
rm -f ./rsvdata.bin
dd status=none conv=fsync if=${DISK} skip=2040 bs=512 count=8 of=./rsvdata.bin
if [ "$PART1_TYPE" = "EE" ]; then
vtdebug "This is GPT partition style ..."
echo -en '\x22' | dd status=none of=$DISK conv=fsync bs=1 count=1 seek=92
xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2014 seek=34
echo -en '\x23' | dd of=$DISK conv=fsync bs=1 count=1 seek=17908 status=none
else
vtdebug "This is MBR partition style ..."
PART1_ACTIVE=$(dd if=$DISK bs=1 count=1 skip=446 status=none | hexdump -n1 -e '1/1 "%02X"')
PART2_ACTIVE=$(dd if=$DISK bs=1 count=1 skip=462 status=none | hexdump -n1 -e '1/1 "%02X"')
vtdebug "PART1_ACTIVE=$PART1_ACTIVE PART2_ACTIVE=$PART2_ACTIVE"
if [ "$PART1_ACTIVE" = "00" ] && [ "$PART2_ACTIVE" = "80" ]; then
vtdebug "change 1st partition active, 2nd partition inactive ..."
echo -en '\x80' | dd of=$DISK conv=fsync bs=1 count=1 seek=446 status=none
echo -en '\x00' | dd of=$DISK conv=fsync bs=1 count=1 seek=462 status=none
fi
xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1
fi
dd status=none conv=fsync if=./rsvdata.bin seek=2040 bs=512 count=8 of=${DISK}
rm -f ./rsvdata.bin
check_umount_disk "$DISK"
xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start
sync
vtinfo "esp partition processing ..."
if [ "$SECUREBOOT" != "YES" ]; then
sleep 2
check_umount_disk "$DISK"
vtoycli partresize -s $DISK $part2_start
fi
if [ "$PART1_TYPE" = "EE" ]; then
vtinfo "update esp partition attribute"
vtoycli gpt -f $DISK
sync
fi
echo ""
vtinfo "Update Ventoy on $DISK successfully finished."
echo ""
fi
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+38
View File
@@ -0,0 +1,38 @@
#!/bin/sh
if [ "$(id -u)" -ne 0 ]; then
echo "Please run with sudo ..."
exit 1
fi
oldpwd=$(pwd)
VPART=""
if dmsetup -h > /dev/null 2>&1; then
VPART_MAJOR_MINOR=$(dmsetup table ventoy | head -n 1 | awk '{print $4}')
cd /sys/class/block/
for t in *; do
if grep -q "^${VPART_MAJOR_MINOR}$" $t/dev; then
VPART=$t
echo 0 $(cat /sys/class/block/$VPART/size) linear /dev/$VPART 0 | dmsetup create $VPART
dmsetup mknodes "$VPART" > /dev/null 2>&1
break
fi
done
cd $oldpwd
if [ -z "$VPART" ]; then
echo "$VPART_MAJOR_MINOR not found"
dmsetup ls; dmsetup info ventoy; dmsetup table ventoy
exit 1
else
if [ ! -b "/dev/mapper/$VPART" ]; then
udevadm trigger --type=devices --action=add > /dev/null 2>&1
udevadm settle > /dev/null 2>&1
fi
echo "Create /dev/mapper/$VPART success"
fi
else
echo "dmsetup program not avaliable"
exit 1
fi
+52
View File
@@ -0,0 +1,52 @@
[
{
"type": "env",
"name": "DESKTOP_SESSION",
"condition": "equal",
"expression": "deepin",
"gui": "qt5"
},
{
"type": "env",
"name": "DESKTOP_SESSION",
"condition": "equal",
"expression": "uos",
"gui": "qt5"
},
{
"type": "env",
"name": "DESKTOP_SESSION",
"condition": "equal",
"expression": "ukui",
"gui": "gtk3"
},
{
"type": "env",
"name": "DESKTOP_SESSION",
"condition": "equal",
"expression": "cinnamon",
"gui": "gtk3"
},
{
"type": "env",
"name": "DESKTOP_SESSION",
"condition": "equal",
"expression": "gnome",
"gui": "gtk3"
},
{
"type": "env",
"name": "DESKTOP_SESSION",
"condition": "equal",
"expression": "plasma",
"gui": "qt5"
},
{
"type": "env",
"name": "DESKTOP_SESSION",
"condition": "equal",
"expression": "xfce",
"gui": "gtk3"
}
]
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+513
View File
@@ -0,0 +1,513 @@
#!/bin/sh
#Ventoy partition 32MB
VENTOY_PART_SIZE=33554432
VENTOY_PART_SIZE_MB=32
VENTOY_SECTOR_SIZE=512
VENTOY_SECTOR_NUM=65536
ventoy_false() {
[ "1" = "2" ]
}
ventoy_true() {
[ "1" = "1" ]
}
vtinfo() {
echo -e "\033[32m$*\033[0m"
}
vtwarn() {
echo -e "\033[33m$*\033[0m"
}
vterr() {
echo -e "\033[31m$*\033[0m"
}
vtdebug() {
echo "$*" >> ./log.txt
}
vtoy_gen_uuid() {
if uuid -F BIN > /dev/null 2>&1; then
uuid -F BIN
elif uuidgen -V > /dev/null 2>&1; then
a=$(uuidgen | sed 's/-//g')
echo -en "\x${a:0:2}\x${a:2:2}\x${a:4:2}\x${a:6:2}\x${a:8:2}\x${a:10:2}\x${a:12:2}\x${a:14:2}\x${a:16:2}\x${a:18:2}\x${a:20:2}\x${a:22:2}\x${a:24:2}\x${a:26:2}\x${a:28:2}\x${a:30:2}"
elif python -V > /dev/null 2>&1; then
a=$(python -c 'import sys,uuid; sys.stdout.write(uuid.uuid4().hex)')
echo -en "\x${a:0:2}\x${a:2:2}\x${a:4:2}\x${a:6:2}\x${a:8:2}\x${a:10:2}\x${a:12:2}\x${a:14:2}\x${a:16:2}\x${a:18:2}\x${a:20:2}\x${a:22:2}\x${a:24:2}\x${a:26:2}\x${a:28:2}\x${a:30:2}"
elif [ -e /dev/urandom ]; then
dd if=/dev/urandom bs=1 count=16 status=none
else
datestr=$(date +%N%N%N%N%N)
a=${datestr:0:32}
echo -en "\x${a:0:2}\x${a:2:2}\x${a:4:2}\x${a:6:2}\x${a:8:2}\x${a:10:2}\x${a:12:2}\x${a:14:2}\x${a:16:2}\x${a:18:2}\x${a:20:2}\x${a:22:2}\x${a:24:2}\x${a:26:2}\x${a:28:2}\x${a:30:2}"
fi
}
check_tool_work_ok() {
if echo 1 | hexdump > /dev/null; then
vtdebug "hexdump test ok ..."
else
vtdebug "hexdump test fail ..."
ventoy_false
return
fi
if mkexfatfs -V > /dev/null; then
vtdebug "mkexfatfs test ok ..."
else
vtdebug "mkexfatfs test fail ..."
ventoy_false
return
fi
if vtoycli fat -T; then
vtdebug "vtoycli fat test ok ..."
else
vtdebug "vtoycli fat test fail ..."
ventoy_false
return
fi
vtdebug "tool check success ..."
ventoy_true
}
get_disk_part_name() {
DISK=$1
if echo $DISK | grep -q "/dev/loop"; then
echo ${DISK}p${2}
elif echo $DISK | grep -q "/dev/nvme[0-9][0-9]*n[0-9]"; then
echo ${DISK}p${2}
elif echo $DISK | grep -q "/dev/mmcblk[0-9]"; then
echo ${DISK}p${2}
elif echo $DISK | grep -q "/dev/nbd[0-9]"; then
echo ${DISK}p${2}
elif echo $DISK | grep -q "/dev/zd[0-9]"; then
echo ${DISK}p${2}
elif echo $DISK | grep -q "/dev/md[0-9]"; then
echo ${DISK}p${2}
else
echo ${DISK}${2}
fi
}
check_umount_disk() {
DiskOrPart="$1"
grep "^${DiskOrPart}" /proc/mounts | while read mtline; do
mtpnt=$(echo $mtline | awk '{print $2}')
vtdebug "Trying to umount $mtpnt ..."
umount $mtpnt >/dev/null 2>&1
done
}
get_ventoy_version_from_cfg() {
if grep -q 'set.*VENTOY_VERSION=' $1; then
grep 'set.*VENTOY_VERSION=' $1 | awk -F'"' '{print $2}'
else
echo 'none'
fi
}
is_disk_contains_ventoy() {
DISK=$1
PART1=$(get_disk_part_name $1 1)
PART2=$(get_disk_part_name $1 2)
if [ -e /sys/class/block/${PART2#/dev/}/size ]; then
SIZE=$(cat /sys/class/block/${PART2#/dev/}/size)
else
SIZE=0
fi
if ! [ -b $PART1 ]; then
vtdebug "$PART1 not exist"
ventoy_false
return
fi
if ! [ -b $PART2 ]; then
vtdebug "$PART2 not exist"
ventoy_false
return
fi
PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
PART2_TYPE=$(dd if=$DISK bs=1 count=1 skip=466 status=none | hexdump -n1 -e '1/1 "%02X"')
# if [ "$PART1_TYPE" != "EE" ]; then
# if [ "$PART2_TYPE" != "EF" ]; then
# vtdebug "part2 type is $PART2_TYPE not EF"
# ventoy_false
# return
# fi
# fi
# PART1_TYPE=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"')
# if [ "$PART1_TYPE" != "07" ]; then
# vtdebug "part1 type is $PART2_TYPE not 07"
# ventoy_false
# return
# fi
if [ -e /sys/class/block/${PART1#/dev/}/start ]; then
PART1_START=$(cat /sys/class/block/${PART1#/dev/}/start)
fi
if [ "$PART1_START" != "2048" ]; then
vtdebug "part1 start is $PART1_START not 2048"
ventoy_false
return
fi
if [ "$VENTOY_SECTOR_NUM" != "$SIZE" ]; then
vtdebug "part2 size is $SIZE not $VENTOY_SECTOR_NUM"
ventoy_false
return
fi
ventoy_true
}
check_disk_secure_boot() {
if ! is_disk_contains_ventoy $1; then
ventoy_false
return
fi
PART2=$(get_disk_part_name $1 2)
vtoycli fat -s $PART2
}
get_disk_ventoy_version() {
if ! is_disk_contains_ventoy $1; then
ventoy_false
return
fi
PART2=$(get_disk_part_name $1 2)
ParseVer=$(vtoycli fat $PART2)
if [ $? -eq 0 ]; then
vtdebug "Ventoy version in $PART2 is $ParseVer"
echo $ParseVer
ventoy_true
return
fi
ventoy_false
}
wait_and_create_part() {
vPART1=$1
vPART2=$2
echo 'Wait for partitions $vPART1 and $vPART2 ...'
for i in 0 1 2 3 4 5 6 7 8 9; do
if ls -l $vPART1 2>/dev/null | grep -q '^b'; then
if ls -l $vPART2 2>/dev/null | grep -q '^b'; then
break
fi
else
echo "Wait for $vPART1 and $vPART2 ..."
sleep 1
fi
done
if ls -l $vPART1 2>/dev/null | grep -q '^b'; then
echo "$vPART1 exist OK"
else
MajorMinor=$(sed "s/:/ /" /sys/class/block/${vPART1#/dev/}/dev)
echo "mknod -m 0660 $vPART1 b $MajorMinor ..."
mknod -m 0660 $vPART1 b $MajorMinor
fi
if ls -l $vPART2 2>/dev/null | grep -q '^b'; then
echo "$vPART2 exist OK"
else
MajorMinor=$(sed "s/:/ /" /sys/class/block/${vPART2#/dev/}/dev)
echo "mknod -m 0660 $vPART2 b $MajorMinor ..."
mknod -m 0660 $vPART2 b $MajorMinor
fi
if ls -l $vPART1 2>/dev/null | grep -q '^b'; then
if ls -l $vPART2 2>/dev/null | grep -q '^b'; then
echo "partition exist OK"
fi
else
echo "[FAIL] $vPART1/$vPART2 does not exist"
exit 1
fi
}
format_ventoy_disk_mbr() {
reserve_mb=$1
DISK=$2
PARTTOOL=$3
PART1=$(get_disk_part_name $DISK 1)
PART2=$(get_disk_part_name $DISK 2)
sector_num=$(cat /sys/block/${DISK#/dev/}/size)
part1_start_sector=2048
if [ $reserve_mb -gt 0 ]; then
reserve_sector_num=$(expr $reserve_mb \* 2048)
part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
else
part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 1)
fi
part2_start_sector=$(expr $part1_end_sector + 1)
modsector=$(expr $part2_start_sector % 8)
if [ $modsector -gt 0 ]; then
vtdebug "modsector:$modsector need to be aligned with 4KB"
part1_end_sector=$(expr $part1_end_sector - $modsector)
part2_start_sector=$(expr $part1_end_sector + 1)
fi
part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
export part2_start_sector
vtdebug "part1_start_sector=$part1_start_sector part1_end_sector=$part1_end_sector"
vtdebug "part2_start_sector=$part2_start_sector part2_end_sector=$part2_end_sector"
if [ -e $PART1 ]; then
echo "delete $PART1"
rm -f $PART1
fi
if [ -e $PART2 ]; then
echo "delete $PART2"
rm -f $PART2
fi
echo ""
echo "Create partitions on $DISK by $PARTTOOL in MBR style ..."
if [ "$PARTTOOL" = "parted" ]; then
vtdebug "format disk by parted ..."
parted -a none --script $DISK \
mklabel msdos \
unit s \
mkpart primary ntfs $part1_start_sector $part1_end_sector \
mkpart primary fat16 $part2_start_sector $part2_end_sector \
set 1 boot on \
quit
sync
echo -en '\xEF' | dd of=$DISK conv=fsync bs=1 count=1 seek=466 > /dev/null 2>&1
else
vtdebug "format disk by fdisk ..."
fdisk $DISK >>./log.txt 2>&1 <<EOF
o
n
p
1
$part1_start_sector
$part1_end_sector
n
p
2
$part2_start_sector
$part2_end_sector
t
1
7
t
2
ef
a
1
w
EOF
fi
udevadm trigger --name-match=$DISK >/dev/null 2>&1
partprobe >/dev/null 2>&1
partx -u $DISK >/dev/null 2>&1
sleep 3
echo "Done"
echo 'Wait for partitions ...'
for i in 0 1 2 3 4 5 6 7 8 9; do
if [ -b $PART1 -a -b $PART2 ]; then
break
else
echo "Wait for $PART1/$PART2 ..."
sleep 1
fi
done
if ! [ -b $PART1 ]; then
MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
echo "mknod -m 0660 $PART1 b $MajorMinor ..."
mknod -m 0660 $PART1 b $MajorMinor
fi
if ! [ -b $PART2 ]; then
MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
echo "mknod -m 0660 $PART2 b $MajorMinor ..."
mknod -m 0660 $PART2 b $MajorMinor
fi
if [ -b $PART1 -a -b $PART2 ]; then
echo "partition exist OK"
else
echo "[FAIL] $PART1/$PART2 does not exist"
exit 1
fi
echo "create efi fat fs $PART2 ..."
for i in 0 1 2 3 4 5 6 7 8 9; do
check_umount_disk "$PART2"
if mkfs.vfat -F 16 -n VTOYEFI -s 1 $PART2; then
echo 'success'
break
else
echo "$? retry ..."
sleep 2
fi
done
}
format_ventoy_disk_gpt() {
reserve_mb=$1
DISK=$2
PARTTOOL=$3
PART1=$(get_disk_part_name $DISK 1)
PART2=$(get_disk_part_name $DISK 2)
sector_num=$(cat /sys/block/${DISK#/dev/}/size)
part1_start_sector=2048
if [ $reserve_mb -gt 0 ]; then
reserve_sector_num=$(expr $reserve_mb \* 2048 + 33)
part1_end_sector=$(expr $sector_num - $reserve_sector_num - $VENTOY_SECTOR_NUM - 1)
else
part1_end_sector=$(expr $sector_num - $VENTOY_SECTOR_NUM - 34)
fi
part2_start_sector=$(expr $part1_end_sector + 1)
modsector=$(expr $part2_start_sector % 8)
if [ $modsector -gt 0 ]; then
vtdebug "modsector:$modsector need to be aligned with 4KB"
part1_end_sector=$(expr $part1_end_sector - $modsector)
part2_start_sector=$(expr $part1_end_sector + 1)
fi
part2_end_sector=$(expr $part2_start_sector + $VENTOY_SECTOR_NUM - 1)
export part2_start_sector
vtdebug "part1_start_sector=$part1_start_sector part1_end_sector=$part1_end_sector"
vtdebug "part2_start_sector=$part2_start_sector part2_end_sector=$part2_end_sector"
if [ -e $PART1 ]; then
echo "delete $PART1"
rm -f $PART1
fi
if [ -e $PART2 ]; then
echo "delete $PART2"
rm -f $PART2
fi
echo ""
echo "Create partitions on $DISK by $PARTTOOL in GPT style ..."
vtdebug "format disk by parted ..."
if [ "$TOOLDIR" != "aarch64" ]; then
vt_set_efi_type="set 2 msftdata on"
fi
parted -a none --script $DISK \
mklabel gpt \
unit s \
mkpart Ventoy ntfs $part1_start_sector $part1_end_sector \
mkpart VTOYEFI fat16 $part2_start_sector $part2_end_sector \
$vt_set_efi_type \
quit
sync
vtoycli gpt -f $DISK
sync
udevadm trigger --name-match=$DISK >/dev/null 2>&1
partprobe >/dev/null 2>&1
partx -u $DISK >/dev/null 2>&1
sleep 3
echo "Done"
echo 'Wait for partitions ...'
for i in 0 1 2 3 4 5 6 7 8 9; do
if [ -b $PART1 -a -b $PART2 ]; then
break
else
echo "Wait for $PART1/$PART2 ..."
sleep 1
fi
done
if ! [ -b $PART1 ]; then
MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev)
echo "mknod -m 0660 $PART1 b $MajorMinor ..."
mknod -m 0660 $PART1 b $MajorMinor
fi
if ! [ -b $PART2 ]; then
MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev)
echo "mknod -m 0660 $PART2 b $MajorMinor ..."
mknod -m 0660 $PART2 b $MajorMinor
fi
if [ -b $PART1 -a -b $PART2 ]; then
echo "partition exist OK"
else
echo "[FAIL] $PART1/$PART2 does not exist"
exit 1
fi
echo "create efi fat fs $PART2 ..."
for i in 0 1 2 3 4 5 6 7 8 9; do
check_umount_disk "$PART2"
if mkfs.vfat -F 16 -n VTOYEFI -s 1 $PART2; then
echo 'success'
break
else
echo "$? retry ..."
sleep 2
fi
done
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.