1概述
系統讀寫文件過程中,如下面內核打印信息,報告讀寫某個扇區錯誤。那麼我們如何能夠通過sector找到讀寫哪個文件錯誤?
kernel: end_request: I/O error, dev sdb, sector 41913499
2物理扇區與文件對應關係計算
以下面打印信息爲例。
kernel: end_request: I/O error, dev sdb, sector 41913499
2.1第一步:通過sector找到所在分區
內核打印的sector是硬盤上的物理扇區。如上例,我們可以知道磁盤是/dev/sdb。而 sector 41913499屬於哪個分區?/dev/sdb1?/dev/sdb2?還是其他?
通過命令fdisk -lu /dev/sdb,可以看到各個分區的容量大小,也就知道每個分區的起始sector和結束sector。
這樣就可計算出sector 41913499屬於哪個分區/dev/sdb2。
2.2第二步:計算分區上文件系統起始sector
對於ext2文件系統/dev/sdb2,該分區上文件系統起始sector爲24595515
Device Boot Start End Blocks Id System
/dev/sdb1 63 24595514 12297726 83 Linux
/dev/sdb2 24595515 41929649 8667067+ 83 Linux
2.3第三步:計算報錯扇區在分區文件系統內的blocks值(即文件系統內的偏移量)
Blocks值 = (出錯扇區– 分區起始扇區)/ 8
dev sdb, sector 41913499,該扇區在/dev/sdb2文件系統上的 blocks值爲: blocks=(41913499 – 分區起始扇區)/8 = (41913499 - 24595515)/8 = 2164748
2.4第四步:通過文件系統的blocks值計算出inode值
debugfs <設備名> icheck <block值>
對於/dev/sdb2上的文件系統來說,block 2164748對應的inode值爲527790。如下圖。
2.5第五步:通過inode值,找到具體文件名(是絕對路徑)
debugfs <設備名> ncheck <inode>
對於/dev/sdb2上的文件系統來說,inode 527790對應的文件爲/e2fsprogs-1.41.14/version.h。也就是訪問文件version.h時出現讀寫錯誤。
3轉換方法驗證
我們通過blktrace來驗證訪問/e2fsprogs-1.41.14/version.h所佔用的硬盤上物理扇區。
root@ubuntu:/data2/e2fsprogs-1.41.14# echo 1 > /proc/sys/vm/drop_caches
root@ubuntu:/data2/e2fsprogs-1.41.14# md5sum version.h
6173fbb937f8dc3b315ff8853007d490 version.h