Ventoy2Disk.sh 6.59 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
        exit 1
    fi
fi

vtdebug "MODE=$MODE FORCE=$FORCE"

longpanda's avatar
longpanda committed
59
60
61
62
63
64
65
66
67
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

longpanda's avatar
longpanda committed
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#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
83
    cd $OLDDIR
longpanda's avatar
longpanda committed
84
85
86
87
88
89
90
91
    exit 1
fi


DISK=$2

if ! [ -b "$DISK" ]; then
    vterr "Disk $DISK does not exist"
longpanda's avatar
longpanda committed
92
    cd $OLDDIR
longpanda's avatar
longpanda committed
93
94
95
96
97
98
    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
99
    cd $OLDDIR
longpanda's avatar
longpanda committed
100
101
102
    exit 1
fi

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

    #Print disk info
    echo "Disk : $DISK"
longpanda's avatar
longpanda committed
148
    parted -s $DISK p 2>&1 | grep Model
longpanda's avatar
longpanda committed
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
    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
179
    if ! dd if=/dev/zero of=$DISK bs=1 count=512 status=none conv=fsync; then
longpanda's avatar
longpanda committed
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
        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
205
206
    chmod +x ./tool/vtoy_gen_uuid

longpanda's avatar
longpanda committed
207
208
209
    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
210
211
    
    #disk uuid
longpanda's avatar
longpanda committed
212
    ./tool/vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} seek=384 bs=1 count=16
longpanda's avatar
longpanda committed
213
214
    
    #disk signature
longpanda's avatar
longpanda committed
215
    ./tool/vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} skip=12 seek=440 bs=1 count=4
longpanda's avatar
longpanda committed
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231

    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
232
        cd $OLDDIR
longpanda's avatar
longpanda committed
233
234
235
236
237
238
239
240
241
242
243
        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
244
            cd $OLDDIR
longpanda's avatar
longpanda committed
245
246
247
248
249
250
            exit 0
        fi
    fi

    PART2=$(get_disk_part_name $DISK 2)
    
longpanda's avatar
longpanda committed
251
    dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=440
longpanda's avatar
longpanda committed
252
    
longpanda's avatar
longpanda committed
253
    ./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1  
longpanda's avatar
longpanda committed
254
255
256

    disk_sector_num=$(cat /sys/block/${DISK#/dev/}/size) 
    part2_start=$(expr $disk_sector_num - $VENTOY_SECTOR_NUM)
longpanda's avatar
longpanda committed
257
    ./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
258
259
260
261
262
263
264
265
266

    sync

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

longpanda's avatar
longpanda committed
267
268
cd $OLDDIR