ブロックアクセストレース
Linuxでデバイス(特にブロック)アクセスのトレースをとりたいがカーネルやシステムに変更は加えたくない。どうするか。 薄皮のブロックデバイスを作って、devfsを操作して同じデバイスに見えつつmake_request()がhookされているというのはどうだろうか。しかしdevfsはrenameを実装していないのでした。うーむ。fstabを書き換えろというのはだめだよなぁ。 やはりカーネルの一部に変更(hookを入れる)+データを持ちモジュールを使うしかない。となるとLTT(opersys.com)と何が違うというのか。 (追記) 2003-06-05 10:14 とりあえずパーティション毎ということで、以下のようなスクリプトを作ってみた。この程度ならどうにでも。
#! /usr/bin/python
import os
import sys
import time
import string
name=["rio", "rmerge", "rsect", "ruse", "wio", "wmerge", "wsect",
"wuse", "running", "use", "aveq"]
def read_part(fname="/proc/partitions"):
fd=open(fname, 'r')
lines=fd.readlines()
fd.close()
rst={}
for line in lines:
line=line.strip()
spl=line.split()
if len(spl)==15 and spl[3]!="name":
rst[spl[3]]=spl[4:]
return rst
def diff_part(src, dst):
rst={}
for key in src:
if dst.has_key(key):
#for i in range(len(src[key])):
for i in range(7):
if dst[key][i]!=src[key][i]:
diff=string.atoi(dst[key][i])-string.atoi(src[key][i])
if rst.has_key(key):
rst[key].append([i, diff])
else:
rst[key]=[[i, diff]]
#print key, name[i], string.atoi(dst[key][i])-string.atoi(src[key][i])
return rst
sleeptime=2
if len(sys.argv)>1:
sleeptime=string.atoi(sys.argv[1])
src=read_part()
while 1:
time.sleep(sleeptime)
dst=read_part()
rst=diff_part(src, dst)
if len(rst)>0:
t=time.time()
print "time:", t, time.ctime(t)
for key in rst:
#print "rst:", rst[key]
for i in rst[key]:
#print "i", i
print key, name[i[0]], i[1]
src=dst