Ventoy2Disk.sh 6.36 KB
Newer Older
longpanda's avatar
longpanda committed
1
2
#!/bin/sh

longpanda's avatar
longpanda committed
3
4
5
6
7
8
OLDDIR=$PWD

if ! [ -f ./tool/ventoy_lib.sh ]; then
    cd ${0%Ventoy2Disk.sh}
fi

longpanda's avatar
longpanda committed
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
. ./tool/ventoy_lib.sh

print_usage() {
    echo 'Usage:  VentoyInstaller.sh OPTION /dev/sdX'
    echo '  OPTION:'
    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 ''
echo '***********************************************************'
echo '*                Ventoy2Disk Script                       *'
echo '*             longpanda  admin@ventoy.net                 *'
echo '***********************************************************'
echo ''

longpanda's avatar
longpanda committed
27
vtdebug "############# Ventoy2Disk $0 ################"
longpanda's avatar
longpanda committed
28
29
30
31
32
33
34
35
36
37

if [ "$1" = "-i" ]; then
    MODE="install"
elif [ "$1" = "-I" ]; then
    MODE="install"
    FORCE="Y"
elif [ "$1" = "-u" ]; then
    MODE="update"
else
    print_usage
longpanda's avatar
longpanda committed
38
    cd $OLDDIR
longpanda's avatar
longpanda committed
39
40
41
42
43
    exit 1
fi

if ! [ -b "$2" ]; then
    print_usage
longpanda's avatar
longpanda committed
44
    cd $OLDDIR
longpanda's avatar
longpanda committed
45
46
47
48
49
50
51
    exit 1
fi

if [ -z "$SUDO_USER" ]; then
    if [ "$USER" != "root" ]; then
        vterr "EUID is $EUID root permission is required."
        echo ''
longpanda's avatar
longpanda committed
52
        cd $OLDDIR
longpanda's avatar
longpanda committed
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
        exit 1
    fi
fi

vtdebug "MODE=$MODE FORCE=$FORCE"

#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."
longpanda's avatar
longpanda committed
74
    cd $OLDDIR
longpanda's avatar
longpanda committed
75
76
77
78
79
80
81
82
    exit 1
fi


DISK=$2

if ! [ -b "$DISK" ]; then
    vterr "Disk $DISK does not exist"
longpanda's avatar
longpanda committed
83
    cd $OLDDIR
longpanda's avatar
longpanda committed
84
85
86
87
88
89
    exit 1
fi


if [ -e /sys/class/block/${DISK#/dev/}/start ]; then
    vterr "$DISK is a partition, please use the whole disk"
longpanda's avatar
longpanda committed
90
    cd $OLDDIR
longpanda's avatar
longpanda committed
91
92
93
    exit 1
fi

longpanda's avatar
longpanda committed
94
95
96
97
98
99
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

longpanda's avatar
longpanda committed
100
101
if grep "$DISK" /proc/mounts; then
    vterr "$DISK is already mounted, please umount it first!"
longpanda's avatar
longpanda committed
102
    cd $OLDDIR
longpanda's avatar
longpanda committed
103
104
105
106
107
108
109
110
111
    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."
longpanda's avatar
longpanda committed
112
        cd $OLDDIR
longpanda's avatar
longpanda committed
113
114
115
116
117
118
119
120
121
122
        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 ""
longpanda's avatar
longpanda committed
123
            cd $OLDDIR
longpanda's avatar
longpanda committed
124
125
126
127
128
129
130
131
132
            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."
longpanda's avatar
longpanda committed
133
        cd $OLDDIR
longpanda's avatar
longpanda committed
134
135
136
137
138
        exit 1
    fi

    #Print disk info
    echo "Disk : $DISK"
longpanda's avatar
longpanda committed
139
    parted -s $DISK p 2>&1 | grep Model
longpanda's avatar
longpanda committed
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
    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

longpanda's avatar
longpanda committed
170
    if ! dd if=/dev/zero of=$DISK bs=1 count=512 status=none conv=fsync; then
longpanda's avatar
longpanda committed
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
        vterr "Write data to $DISK failed, please check whether it's in use."
        exit 1
    fi

    format_ventoy_disk $DISK

    # 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

longpanda's avatar
longpanda committed
196
197
    chmod +x ./tool/vtoy_gen_uuid

longpanda's avatar
longpanda committed
198
199
200
    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
longpanda's avatar
longpanda committed
201
202
    
    #disk uuid
longpanda's avatar
longpanda committed
203
    ./tool/vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} seek=384 bs=1 count=16
longpanda's avatar
longpanda committed
204
205
    
    #disk signature
longpanda's avatar
longpanda committed
206
    ./tool/vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} skip=12 seek=440 bs=1 count=4
longpanda's avatar
longpanda committed
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222

    sync

    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 ""
longpanda's avatar
longpanda committed
223
        cd $OLDDIR
longpanda's avatar
longpanda committed
224
225
226
227
228
229
230
231
232
233
234
        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
longpanda's avatar
longpanda committed
235
            cd $OLDDIR
longpanda's avatar
longpanda committed
236
237
238
239
240
241
            exit 0
        fi
    fi

    PART2=$(get_disk_part_name $DISK 2)
    
longpanda's avatar
longpanda committed
242
    dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=440
longpanda's avatar
longpanda committed
243
    
longpanda's avatar
longpanda committed
244
    ./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1  
longpanda's avatar
longpanda committed
245
246
247

    disk_sector_num=$(cat /sys/block/${DISK#/dev/}/size) 
    part2_start=$(expr $disk_sector_num - $VENTOY_SECTOR_NUM)
longpanda's avatar
longpanda committed
248
    ./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start
longpanda's avatar
longpanda committed
249
250
251
252
253
254
255
256
257

    sync

    echo ""
    vtinfo "Update Ventoy to $DISK successfully finished."
    echo ""
    
fi

longpanda's avatar
longpanda committed
258
259
cd $OLDDIR