/etc/init.d/syslog stop
echo 1 > /proc/sys/vm/block_dump
sleep 60
dmesg | awk '/(READ|WRITE|dirtied)/ {process[$1]++} END {for (x in process) \
print process[x],x}' |sort -nr |awk '{print $2 " " $1}' | \
head -n 10
#dmesg | egrep "READ|WRITE|dirtied" | egrep -o '([a-zA-Z]*)' | sort | uniq -c | sort -rn | head
echo 0 > /proc/sys/vm/block_dump
/etc/init.d/syslog start
dmesg -c && echo 1 >/proc/sys/vm/block_dump && sleep 3 && echo 0 > /proc/sys/vm/block_dump&& dmesg | grep sda
dmesg -c && echo 1 >/proc/sys/vm/block_dump && sleep 3 && echo 0 > /proc/sys/vm/block_dump&& dmesg | grep sdh
flush-8:48(1199): dirtied inode 18942347 (00016C30) on sdd1
flush-8:48(1199): WRITE block 151972088 on sdd1
flush-8:48(1199): WRITE block 151972096 on sdd1
通过dmesg信息可以看到IO正在写那些文件,有进程号,inode号,文件名和磁盘设备名;但每个文件写了多少呢,仅仅通过dirtied inode就看不出来了,还需要分析WRITE block,后面的数字并不是真正的块号,而是内核IO层获取的扇区号,除以8即为块号,然后根据debugfs工具的icheck和ncheck选项,就可以获取该文件系统块属于哪个具体文件,具体请google之。
1.通过debugfs查看指定文件的块号
①df ./ 查看文件系统
②debugfs 文件系统

通过 blocks 文件路径 看文件的块号。一个文件占据的块号并不一定连续。

2. dd命令读指定块号的内容
dd if=文件系统路径 of=输出路径 bs=4096 count=1 skip=块号
例如:dd if=/dev/sda5 of=/root/out.txt bs=4096 count=1 skip=10086
/root/out.txt文件内容就是从块号中读到的内容 bs是块大小(这里为4K) count表示连续读几块 skip是从第几块开始读

一个块一般是4K大小,也可以在磁盘分区格式化时指定大小。一个文件可能对应多个块,但一个块的内容只能属于一个文件,不足的地方用00占据。我们查看out2.txt的内容:

注意:这里读指定块号内容的写入方式是会覆盖掉原文件的内容的(如果原本有内容的话)