http://www.ilinuxkernel.com/files/3/Sector_to_file.htm
    
   
    
     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 <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所占用的硬盘上物理扇区。
| 
 | 
     
   
 
