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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM