Een tijd geleden heb ik daar een script voor geschreven, die alle disk access logt. De log bevat de programmanaam die de access plegen, en als je geluk hebt ook de filenaam die geaccessed word. Maar misschien ook allee maar bloknummers.
Het is niet geschreven voor een Synology, maar ik heb geen reden om te denken dat het daar niet op werkt.
Bovenin staat een logdir gedefinieerd, het is belangrijk dat die op een ramdisk staat, anders ben je je logger aan het loggen. Of bij jouw /tmp een ramdisk is kun je zien met
Als /tmp er niet bijstaat, kun je waarschijnlijk /run gebruiken.
Het script moet draaien als root, en heeft als neven effect dat de kernel log buffer leeg zal zijn na de run.
Je kunt de log uitlezen met
of gewoon manueel ${logdir}/log1 bekijken
code:
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
| #!/bin/sh
logdir=/tmp/disklog
statusfile=${logdir}/status
pidfile=${logdir}/pid
InitialWait()
{
local startdelay=$1
local minutes=0
while [ $startdelay -gt $minutes ] ; do
for seconds in 00 05 10 15 20 25 30 35 40 45 50 55
do
if [ -f ${pidfile} ] ; then
echo "Start delay active ${minutes}:${seconds}/$startdelay:00" >${statusfile}
sleep 5
else
exit 0
fi
done
let minutes=minutes+1
done
}
Log()
{
# Clear logbuffer and create files
dmesg -c >/dev/null
local logfile=${logdir}/log1
local tmpfile=${logdir}/tmp
touch ${logfile}
exec 2>${logfile}
# Enable kernel logging
echo 1 > /proc/sys/vm/block_dump
echo "Logging active" >${statusfile}
local oldstamp=HHMM
while [ -f ${pidfile} ] ; do
sleep 1
filesize=` du ${logfile} | awk '{print $1}' `
if [ $filesize -gt 2048 ] ; then
[ -f ${logdir}/log2 ] && rm ${logdir}/log2
mv ${logfile} ${logdir}/log2
touch ${logfile}
fi
# Filter out message about blockdevices we're not interested in
dmesg -c | grep -v "proc\|rootfs\|sysfs\|tmpfs\|devpts\|sda\|cgroup" >${tmpfile}
if [ ` wc -c ${tmpfile} | cut -d ' ' -f 1 ` -gt 0 ] ; then
local stamp=` date +%H%M `
[ "$stamp" != "$oldstamp" ] && oldstamp=$stamp && echo "==== ` date ` ====" >>${logfile}
cat ${tmpfile} >>${logfile}
fi
done
}
Cleanup()
{
echo 0 >/proc/sys/vm/block_dump
[ -f ${pidfile} ] && rm ${pidfile}
echo "Logging stopped : ` date `" >>${logdir}/log1
echo "Logging stopped" >${statusfile}
}
Daemon()
{
mkdir -p ${logdir}
echo $$ >${pidfile}
trap "Cleanup" INT TERM EXIT
[ "$1" != "0" ] && InitialWait $1
Log $2
}
Start()
{
local minutes=0
local foreground=0
while [ "$1" != "" ] ; do
case "$1" in
"--wait="*)
minutes=$(echo "$1" | cut -d '=' -f 2 )
;;
"--foreground")
foreground=1
;;
*)
echo "Unknown parameter ${1}"
exit 1
;;
esac
shift
done
if [ "${foreground}" = "0" ] ; then
/bin/sh ${0} "__DAEMON__" "--wait=${minutes}" >/dev/null 2>&1 &
return
fi
Daemon ${minutes}
}
Status()
{
[ -f ${pidfile} ] || return 1
local pid=`cat ${pidfile}`
if [ -d /proc/${pid} ] ; then
if grep "$1" /proc/${pid}/cmdline
then
return 0
fi
fi
# Dangling pid file
rm ${pidfile}
return 1
}
case $1 in
"__DAEMON__")
shift
Start "$@" --foreground
;;
"start")
if Status $(basename $0)
then
echo "Already running"
exit 0
fi
shift
Start "$@"
;;
"stop")
if [ -f ${pidfile} ] ;
then
kill $(cat ${pidfile})
else
echo "Not running"
fi
;;
"status")
if Status $(basename $0)
then
cat ${statusfile}
else
echo "Not running"
fi
;;
"log")
cat ${logdir}/log2 ${logdir}/log1
;;
*)
cat <<__EOS__
Use: $(basename $0) [start|stop|status|log] <arguments>
Arguments:
--wait=n Wait n minutes before starting, to wait for the disks to be asleep
--foreground Do not deamonize
__EOS__
;;
esac |