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