1. 程式人生 > >Linux中硬盤物理扇區與文件系統文件對應關系(轉)

Linux中硬盤物理扇區與文件系統文件對應關系(轉)

通過命令 wid lsp www sta fdisk -l echo net 我們

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/sdc2文件系統上的 blocks值為: blocks=(41913499 – 分區起始扇區)/8 = (41913499 - 24595515)/8 = 2164748

2.4 第四步:通過文件系統的blocks值計算出inode值

debugfs <設備名> icheck 值>

對於/dev/sdb2上的文件系統來說,block 2164748對應的inode值為527790。如下圖。

技術分享圖片

2.5 第五步:通過inode值,找到具體文件名(是絕對路徑)

debugfs <設備名> ncheck

對於/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


技術分享圖片

From: http://www.ilinuxkernel.com/files/3/Sector_to_file.htm

Linux中硬盤物理扇區與文件系統文件對應關系(轉)