ブロックアクセストレース

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です