]> glassweightruler.freedombox.rocks Git - Ventoy.git/blob - IMG/cpio/ventoy/init
Update README.md
[Ventoy.git] / IMG / cpio / ventoy / init
1 #!/ventoy/busybox/sh
2 #************************************************************************************
3 # Copyright (c) 2020, longpanda <admin@ventoy.net>
4 #
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License as
7 # published by the Free Software Foundation; either version 3 of the
8 # License, or (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, see <http://www.gnu.org/licenses/>.
17 #
18 #************************************************************************************
19
20
21 ###################################################################
22 # #
23 # Step 1 : parse kernel debug parameter #
24 # #
25 ####################################################################
26 [ -d /proc ] || mkdir /proc; mount -t proc proc /proc
27 vtcmdline=$(cat /proc/cmdline)
28 vtkerver=$(cat /proc/version)
29 umount /proc; rm -rf /proc
30
31 echo "kenel version=$vtkerver" >>$VTLOG
32 echo "kenel cmdline=$vtcmdline" >>$VTLOG
33
34 #break here for debug
35 if [ "$VTOY_BREAK_LEVEL" = "01" ] || [ "$VTOY_BREAK_LEVEL" = "11" ]; then
36 sleep 5
37 echo -e "\n\n\033[32m ################################################# \033[0m"
38 echo -e "\033[32m ################ VENTOY DEBUG ################### \033[0m"
39 echo -e "\033[32m ################################################# \033[0m \n"
40
41 if [ "$VTOY_BREAK_LEVEL" = "11" ]; then
42 cat $VTLOG
43 fi
44 exec $BUSYBOX_PATH/sh
45 fi
46
47
48 ####################################################################
49 # #
50 # Step 2 : extract real initramfs to / #
51 # #
52 ####################################################################
53 cd /
54 rm -rf /init /linuxrc /sbin /dev/ /root
55
56 ventoy_is_initrd_ramdisk() {
57 #As I known, PCLinuxOS use ramdisk
58 if echo $vtkerver | grep -i -q 'PCLinuxOS'; then
59 true
60 else
61 false
62 fi
63 }
64
65 # param: file skip magic tmp
66 ventoy_unpack_initramfs() {
67 vtfile=$1; vtskip=$2; vtmagic=$3; vttmp=$4
68 echo "=====ventoy_unpack_initramfs: #$*#" >> $VTLOG
69
70 #special process
71 #if [ "${vtmagic:0:4}" = '5678' ]; then
72 # echo -en '\x1F\x8B' | dd status=none of=$vtfile bs=1 count=2 conv=notrunc
73 # vtmagic='1F8B'
74 #fi
75
76 for vtx in '1F8B zcat' '1F9E zcat' '425A bzcat' '5D00 lzcat' 'FD37 xzcat' '894C lzopcat' '0221 lz4cat' '28B5 zstdcat' '3037 cat'; do
77 if [ "${vtx:0:4}" = "${vtmagic:0:4}" ]; then
78 echo "vtx=$vtx" >> $VTLOG
79 if [ $vtskip -eq 0 ]; then
80 ${vtx:5} $vtfile | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
81 else
82 dd if=$vtfile skip=$vtskip iflag=skip_bytes status=none | ${vtx:5} | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
83 fi
84 break
85 fi
86 done
87 }
88
89 # param: file magic tmp
90 ventoy_unpack_initrd() {
91 vtfile=$1; vtmagic=$2; vttmp=$3
92 echo "=====ventoy_unpack_initrd: #$*#" >> $VTLOG
93
94 for vtx in '1F8B zcat' '1F9E zcat' '425A bzcat' '5D00 lzcat' 'FD37 xzcat' '894C lzopcat' '0221 lz4cat' '28B5 zstdcat' '3037 cat'; do
95 if [ "${vtx:0:4}" = "${vtmagic:0:4}" ]; then
96 echo "vtx=$vtx" >> $VTLOG
97 ${vtx:5} $vtfile > $vttmp
98 break
99 fi
100 done
101 }
102
103
104 # This export is for busybox cpio command
105 export EXTRACT_UNSAFE_SYMLINKS=1
106
107 # special process
108 need_xzminidec() {
109 if [ -e /initrd001 ]; then
110 testmagic=$(hexdump -n 2 -e '2/1 "%02X"' /initrd001)
111 else
112 testmagic='xxxx'
113 fi
114
115 if [ "FD37" = "${testmagic:0:4}" ]; then
116 if echo $vtkerver | grep -q 'kaspersky'; then
117 true
118 elif echo $vtkerver | grep -q 'kiosk.*Gentoo'; then
119 true
120 elif echo $vtkerver | grep -q 'porteus '; then
121 true
122 else
123 false
124 fi
125 else
126 false
127 fi
128 }
129
130 if need_xzminidec; then
131 echo "use xzminidec" >> $VTLOG
132 cat /initrd001 | xzminidec | cpio -idmu 2>>$VTLOG
133 rm -f /initrd001
134 else
135 for vtfile in $(ls /initrd*); do
136 #decompress first initrd
137 vtmagic=$(hexdump -n 2 -e '2/1 "%02X"' $vtfile)
138
139 if ventoy_is_initrd_ramdisk; then
140 ventoy_unpack_initrd $vtfile $vtmagic ${vtfile}_tmp
141 mv ${vtfile}_tmp $vtfile
142 break
143 else
144 ventoy_unpack_initramfs $vtfile 0 $vtmagic ${vtfile}_tmp
145 fi
146
147 #only for cpio,cpio,...,initrd sequence, initrd,cpio or initrd,initrd sequence is not supported
148 while [ -e ${vtfile}_tmp ] && [ $(stat -c '%s' ${vtfile}_tmp) -gt 512 ]; do
149 mv ${vtfile}_tmp $vtfile
150 vtdump=$(hexdump -n 512 -e '512/1 "%02X"' $vtfile)
151 vtmagic=$(echo $vtdump | sed 's/^\(00\)*//')
152 let vtoffset="(${#vtdump}-${#vtmagic})/2"
153
154 if [ -z "$vtmagic" ]; then
155 echo "terminate with all zero data file" >> $VTLOG
156 break
157 fi
158
159 ventoy_unpack_initramfs $vtfile $vtoffset ${vtmagic:0:4} ${vtfile}_tmp
160 done
161
162 rm -f $vtfile ${vtfile}_tmp
163 done
164 fi
165
166 #break here for debug
167 if [ "$VTOY_BREAK_LEVEL" = "02" ] || [ "$VTOY_BREAK_LEVEL" = "12" ]; then
168 sleep 5
169 echo -e "\n\n\033[32m ################################################# \033[0m"
170 echo -e "\033[32m ################ VENTOY DEBUG ################### \033[0m"
171 echo -e "\033[32m ################################################# \033[0m \n"
172 if [ "$VTOY_BREAK_LEVEL" = "12" ]; then
173 cat $VTOY_PATH/log
174 fi
175 exec $BUSYBOX_PATH/sh
176 fi
177
178
179 ####################################################################
180 # #
181 # Step 3 : Hand over to ventoy.sh #
182 # #
183 ####################################################################
184 echo "Now hand over to ventoy.sh" >>$VTLOG
185 . $VTOY_PATH/tool/vtoytool_install.sh
186
187 export PATH=$VTOY_ORG_PATH
188 exec $BUSYBOX_PATH/sh $VTOY_PATH/ventoy.sh