]> glassweightruler.freedombox.rocks Git - Ventoy.git/blob - Vlnk/VentoyVlnk.sh
1.0.66 release
[Ventoy.git] / Vlnk / VentoyVlnk.sh
1 #!/bin/sh
2
3 print_usage() {
4 echo 'Usage: sudo sh VentoyVlnk.sh CMD FILE'
5 echo ' CMD:'
6 echo ' -c FILE create vlnk for FILE'
7 echo ' -l VLNK parse vlnk file'
8 echo ' -v print verbose info'
9 echo ' -h print this help'
10 echo ''
11 }
12
13 verbose_flag=0
14
15 vlog() {
16 if [ $verbose_flag -eq 1 ]; then
17 echo "$@"
18 fi
19 }
20
21 vlnk_suffix() {
22 echo $1 | egrep -q '.*(.vlnk.iso|.vlnk.img|.vlnk.wim|.vlnk.vhd|.vlnk.vhdx|.vlnk.efi|.vlnk.vtoy|.vlnk.dat)$'
23 }
24
25
26 uid=$(id -u)
27 if [ $uid -ne 0 ]; then
28 echo "Please use sudo or run the script as root."
29 exit 1
30 fi
31
32 #check system tools used bellow
33 for t in 'mountpoint' 'readlink' 'xzcat'; do
34 if ! which "$t" > /dev/null 2>&1; then
35 echo "$t command not found in current system!"
36 exit 1
37 fi
38 done
39
40 machine=$(uname -m)
41 if echo $machine | egrep -q 'aarch64|arm64'; then
42 TOOLDIR=aarch64
43 elif echo $machine | egrep -q 'x86_64|amd64'; then
44 TOOLDIR=x86_64
45 elif echo $machine | egrep -q 'mips64'; then
46 TOOLDIR=mips64el
47 elif echo $machine | egrep -q 'i[3-6]86'; then
48 TOOLDIR=i386
49 else
50 echo "Unsupported machine type $machine"
51 exit 1
52 fi
53
54 fullsh=$(readlink -f "$0")
55 vtoydir=${fullsh%/*}
56
57 if [ -f "$vtoydir/tool/$TOOLDIR/vlnk.xz" ]; then
58 xzcat "$vtoydir/tool/$TOOLDIR/vlnk.xz" > "$vtoydir/tool/$TOOLDIR/vlnk"
59 rm -f "$vtoydir/tool/$TOOLDIR/vlnk.xz"
60 fi
61
62 if [ -f "$vtoydir/tool/$TOOLDIR/vlnk" ]; then
63 chmod +x "$vtoydir/tool/$TOOLDIR/vlnk"
64 else
65 echo "$vtoydir/tool/$TOOLDIR/vlnk does not exist! "
66 exit 1
67 fi
68
69 PATH="$vtoydir/tool/$TOOLDIR":$PATH
70
71 VLNKCMD=vlnk
72 while [ -n "$1" ]; do
73 if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
74 print_usage
75 exit 0
76 elif [ "$1" = "-c" ]; then
77 shift
78 CMD='c'
79 IMG="$1"
80 elif [ "$1" = "-o" ]; then
81 shift
82 OUT="$1"
83 elif [ "$1" = "-l" ]; then
84 shift
85 CMD='l'
86 VLNK="$1"
87 elif [ "$1" = "-v" ]; then
88 verbose_flag=1
89 VLNKCMD="vlnk -v"
90 else
91 echo "invalid option $1"
92 exit 1
93 fi
94
95 shift
96 done
97
98 if [ "$CMD" = "c" ]; then
99 vlog "Create vlnk for $IMG"
100
101 if [ ! -f "$IMG" ]; then
102 echo "$IMG does not exist!"
103 exit 1
104 fi
105
106 if echo $IMG | egrep -q -i '.*(.iso|.img|.wim|.vhd|.vhdx|.efi|.vtoy|.dat)$'; then
107 :
108 else
109 echo "This file is not supported for vlnk!"
110 exit 1
111 fi
112
113 if vlnk_suffix "$IMG"; then
114 echo "This is already a vlnk file!"
115 exit 1
116 fi
117
118 if $VLNKCMD -t "$IMG"; then
119 echo "This is already a vlnk file!"
120 exit 1
121 fi
122
123 FULLIMG=$(readlink -f "$IMG")
124 if [ ! -f "$FULLIMG" ]; then
125 echo "$FULLIMG does not exist!"
126 exit 1
127 fi
128 vlog "Full file path is $FULLIMG"
129
130
131 #check img file position is a valid mountpoint
132 FULLDIR=${FULLIMG%/*}
133 while [ -n "${FULLDIR}" ]; do
134 if mountpoint -q "${FULLDIR}"; then
135 break
136 fi
137 FULLDIR="${FULLDIR%/*}"
138 done
139
140 if [ -z "${FULLDIR}" ]; then
141 FULLDIR=/
142 IMGPATH="${FULLIMG}"
143 else
144 IMGPATH="${FULLIMG#$FULLDIR}"
145 fi
146
147 IMGFILE=$(basename "$IMGPATH")
148 vlog "IMGPATH=$IMGPATH IMGFILE=$IMGFILE"
149
150
151 mntdev=$(mountpoint -d "${FULLDIR}")
152 vlog "mountpoint is ${FULLDIR} dev $mntdev"
153
154 #check fs
155 if grep -q " ${FULLDIR} " /proc/mounts; then
156 FS=$(grep " ${FULLDIR} " /proc/mounts | awk '{print $3}')
157 vlog "File system is $FS"
158
159 if echo $FS | egrep -q "ext2|ext3|ext4|exfat|vfat|fat32|fat16|fat12|ntfs|xfs|udf"; then
160 vlog "FS OK"
161 else
162 echo "$FS is not supported!"
163 exit 1
164 fi
165 else
166 echo "${FULLDIR} not found in /proc/mounts"
167 exit 1
168 fi
169
170
171 Major=$(echo $mntdev | awk -F: '{print $1}')
172 Minor=$(echo $mntdev | awk -F: '{print $2}')
173 vlog "Major=$Major Minor=$Minor"
174
175 IMGPARTITION=""
176 while read line; do
177 M1=$(echo $line | awk '{print $1}')
178 M2=$(echo $line | awk '{print $2}')
179 if [ "$Major" = "$M1" -a "$Minor" = "$M2" ]; then
180 IMGPARTITION=$(echo $line | awk '{print $4}')
181 vlog "disk partition is $IMGPARTITION"
182 break
183 fi
184 done < /proc/partitions
185
186 if [ -z "$IMGPARTITION" ]; then
187 echo "Disk partition not found for $FULLDIR"
188 grep " $FULLDIR " /proc/mounts
189 exit 1
190 fi
191
192 if [ -f "/sys/class/block/$IMGPARTITION/start" ]; then
193 PARTSTART=$(cat "/sys/class/block/$IMGPARTITION/start")
194 if echo $IMGPARTITION | egrep -q 'mmc|nbd|nvme'; then
195 DISK=$(echo /dev/$IMGPARTITION | sed "s/^\(.*\)p[0-9][0-9]*$/\1/")
196 else
197 DISK=$(echo /dev/$IMGPARTITION | sed "s/^\(.*[^0-9]\)[0-9][0-9]*$/\1/")
198 fi
199
200 if [ ! -b $DISK ]; then
201 echo "Device $DISK not exist!"
202 exit 1
203 fi
204
205 vlog "PARTSTART=$PARTSTART DISK=$DISK"
206 else
207 if echo $IMGPARTITION | grep -q '^dm-[0-9][0-9]*'; then
208 echo "LVM/DM is not supported!"
209 fi
210 echo "/sys/class/block/$IMGPARTITION/start not exist!"
211 exit 1
212 fi
213
214
215 if [ -n "$OUT" ]; then
216 lowersuffix=$(echo ${IMG##*.} | tr 'A-Z' 'a-z')
217 OUT="${OUT}.vlnk.${lowersuffix}"
218 else
219 name=${IMGFILE%.*}
220 lowersuffix=$(echo ${IMGFILE##*.} | tr 'A-Z' 'a-z')
221 OUT="${name}.vlnk.${lowersuffix}"
222 fi
223
224 echo "Output VLNK file is $OUT"
225 [ -f "${OUT}" ] && rm -f "${OUT}"
226
227 touch "${OUT}"
228 if [ -f "${OUT}" ]; then
229 rm -f "${OUT}"
230 else
231 echo "Failed to create ${OUT}"
232 exit 1
233 fi
234
235 if $VLNKCMD -c "$IMGPATH" -d $DISK -p $PARTSTART -o "${OUT}"; then
236 echo "====== Vlnk file create success ========="
237 echo ""
238 else
239 echo "====== Vlnk file create failed ========="
240 echo ""
241 exit 1
242 fi
243 elif [ "$CMD" = "l" ]; then
244 vlog "Parse vlnk for $VLNK"
245
246 if [ ! -f "$VLNK" ]; then
247 echo "$VLNK does not exist!"
248 exit 1
249 fi
250
251 if vlnk_suffix "$VLNK"; then
252 :
253 else
254 echo "Invalid vlnk file suffix!"
255 exit 1
256 fi
257
258 if $VLNKCMD -t "$VLNK"; then
259 vlog "Vlnk data check OK"
260 else
261 echo "This is not a valid vlnk file!"
262 exit 1
263 fi
264
265 $VLNKCMD -l "$VLNK"
266 echo ""
267 else
268 echo "invalid cmd"
269 print_usage
270 exit 1
271 fi