-
Notifications
You must be signed in to change notification settings - Fork 40
Expand file tree
/
Copy pathcommonfunc.sh
More file actions
210 lines (176 loc) · 6.48 KB
/
Copy pathcommonfunc.sh
File metadata and controls
210 lines (176 loc) · 6.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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
170
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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
ventoy_check_efivars() {
if [ -e /sys/firmware/efi ]; then
if grep -q efivar /proc/mounts; then
:
else
if [ -e /sys/firmware/efi/efivars ]; then
mount -t efivarfs efivarfs /sys/firmware/efi/efivars >/dev/null 2>&1
fi
fi
fi
}
ventoy_log() {
echo "$@" >> /tmp/vtoy.log
}
ventoy_need_dm_patch() {
if vtoydump -R > /dev/null 2>&1; then
[ 1 -eq 1 ]; return
fi
if grep -q "VTOY_LINUX_REMOUNT=1" /proc/cmdline; then
[ 1 -eq 1 ]; return
fi
[ 1 -eq 0 ]
}
ventoy_check_insmod() {
if [ -f /bin/kmod ]; then
[ -f /bin/insmod ] || ln -s /bin/kmod /bin/insmod
[ -f /bin/lsmod ] || ln -s /bin/kmod /bin/lsmod
fi
}
ventoy_do_dm_patch() {
ventoy_log 'ventoy_do_dm_patch'
if [ -f /tmp/dm_patch.ko ]; then
if grep -q 'dm_patch' /proc/modules; then
ventoy_log "dm_patch already exist"
else
ventoy_log "dm_patch reinstall"
insmod /tmp/dm_patch.ko >>/tmp/vtoy.log 2>&1
if grep -q 'dm_patch' /proc/modules; then
ventoy_log "dm_patch reinstall success"
else
ventoy_log "dm_patch reinstall failed"
fi
fi
return
fi
if [ -f /bin/vtoydump ]; then
vtHeadSize=$(stat -c '%s' /bin/vtoydump)
dd if=/bin/vtoydmpatch of=/tmp/dm_patch.ko bs=1 skip=$vtHeadSize >/dev/null 2>&1
elif [ -f /sbin/vtoydump ]; then
vtHeadSize=$(stat -c '%s' /sbin/vtoydump)
dd if=/sbin/vtoydmpatch of=/tmp/dm_patch.ko bs=1 skip=$vtHeadSize >/dev/null 2>&1
else
ventoy_log 'vtoydump not found'
return
fi
if ! grep -m1 -q dm_get_table_device /proc/kallsyms; then
ventoy_log "modprobe dm_mod"
modprobe dm_mod >>/tmp/vtoy.log 2>&1
fi
cat /proc/kallsyms | sort > /tmp/kallsyms
if grep -m1 -q 'open_table_device.isra' /tmp/kallsyms; then
vtLine=$(vtoytool vtoyksym open_table_device.isra /tmp/kallsyms)
else
vtLine=$(vtoytool vtoyksym dm_get_table_device /tmp/kallsyms)
fi
get_addr=$(echo $vtLine | awk '{print $1}')
get_size=$(echo $vtLine | awk '{print $2}')
if grep -m1 -q 'close_table_device.isra' /tmp/kallsyms; then
vtLine=$(vtoytool vtoyksym close_table_device.isra /tmp/kallsyms)
else
vtLine=$(vtoytool vtoyksym dm_put_table_device /tmp/kallsyms)
fi
put_addr=$(echo $vtLine | awk '{print $1}')
put_size=$(echo $vtLine | awk '{print $2}')
ro_addr=$(grep ' set_memory_ro$' /proc/kallsyms | awk '{print $1}')
rw_addr=$(grep ' set_memory_rw$' /proc/kallsyms | awk '{print $1}')
kprobe_reg_addr=$(grep ' register_kprobe$' /proc/kallsyms | awk '{print $1}')
kprobe_unreg_addr=$(grep ' unregister_kprobe$' /proc/kallsyms | awk '{print $1}')
if [ "$VTOY_DEBUG_LEVEL" = "01" ]; then
printk_addr=$(grep ' printk$' /proc/kallsyms | awk '{print $1}')
vtDebug="-v"
elif grep -q "vtdebug" /proc/cmdline; then
printk_addr=$(grep ' printk$' /proc/kallsyms | awk '{print $1}')
vtDebug="-v"
else
printk_addr=0
fi
#printk_addr=$(grep ' printk$' /proc/kallsyms | awk '{print $1}')
#vtDebug="-v"
ventoy_log get_addr=$get_addr get_size=$get_size
ventoy_log put_addr=$put_addr put_size=$put_size
ventoy_log kprobe_reg_addr=$kprobe_reg_addr kprobe_unreg_addr=$kprobe_unreg_addr
ventoy_log ro_addr=$ro_addr rw_addr=$rw_addr printk_addr=$printk_addr
if [ "$get_addr" = "0" -o "$put_addr" = "0" ]; then
ventoy_log "Invalid symbol address"
return
fi
if [ "$ro_addr" = "0" -o "$rw_addr" = "0" ]; then
ventoy_log "Invalid symbol address"
return
fi
vtKv=$(uname -r)
if [ ! -d /lib/modules/$vtKv ]; then
ventoy_log "No modules directory found"
return
elif [ -d /lib/modules/$vtKv/kernel/fs ]; then
vtModPath=$(find /lib/modules/$vtKv/kernel/fs/ -name "*.ko*" | head -n1)
else
vtModPath=$(find /lib/modules/$vtKv/kernel/ -name "xfs.ko*" | head -n1)
fi
if [ -z "$vtModPath" ]; then
vtModPath=$(find /lib/modules/$vtKv/kernel/ -name "*.ko*" | head -n1)
fi
vtModName=$(basename $vtModPath)
[ -f /tmp/$vtModName ] && rm -f /tmp/$vtModName
ventoy_log "template module is $vtModPath $vtModName"
if [ -z "$vtModPath" ]; then
ventoy_log "No template module found"
return
elif echo $vtModPath | grep -q "[.]ko$"; then
cp -a $vtModPath /tmp/$vtModName
elif echo $vtModPath | grep -q "[.]ko[.]xz$"; then
xzcat $vtModPath > /tmp/$vtModName
elif echo $vtModPath | grep -q "[.]ko[.]gz$"; then
zcat $vtModPath > /tmp/$vtModName
else
ventoy_log "unsupport module type"
return
fi
#step1: modify vermagic/mod crc/relocation
vtoytool vtoykmod -u /tmp/dm_patch.ko /tmp/$vtModName $vtDebug >>/tmp/vtoy.log 2>&1
#step2: fill parameters
vtPgsize=$(vtoytool vtoyksym -p)
vtoytool vtoykmod -f /tmp/dm_patch.ko $vtPgsize 0x$printk_addr 0x$ro_addr 0x$rw_addr $get_addr $get_size $put_addr $put_size 0x$kprobe_reg_addr 0x$kprobe_unreg_addr $vtKv $vtDebug >>/tmp/vtoy.log 2>&1
ventoy_check_insmod
insmod /tmp/dm_patch.ko >>/tmp/vtoy.log 2>&1
if grep -q 'dm_patch' /proc/modules; then
ventoy_log "dm_patch success"
fi
}
ventoy_dm_patch_proc_begin() {
if ventoy_need_dm_patch; then
export vtLevel1=$(cat /proc/sys/kernel/printk | awk '{print $1}')
export vtLevel2=$(cat /proc/sys/kernel/printk | awk '{print $2}')
export vtLevel3=$(cat /proc/sys/kernel/printk | awk '{print $3}')
export vtLevel4=$(cat /proc/sys/kernel/printk | awk '{print $4}')
#suppress printk message
echo 0 $vtLevel2 0 $vtLevel4 > /proc/sys/kernel/printk
fi
}
ventoy_dm_patch_install() {
if ventoy_need_dm_patch; then
ventoy_do_dm_patch
fi
}
ventoy_dm_patch_remove() {
if ventoy_need_dm_patch; then
if grep -q 'dm_patch' /proc/modules; then
ventoy_log "remove dm_patch"
rmmod dm_patch
fi
fi
}
ventoy_dm_create_ventoy() {
ventoy_dm_patch_install
dmsetup create ventoy /ventoy_table
vret=$?
ventoy_dm_patch_remove
return $vret
}
ventoy_dm_patch_proc_end() {
if ventoy_need_dm_patch; then
#recover printk level
echo $vtLevel1 $vtLevel2 $vtLevel3 $vtLevel4 > /proc/sys/kernel/printk
fi
}