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值=
(出錯扇區
– 分割槽起始扇區)
/ 8dev 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所占用的硬碟上物理扇區。
硬碟的物理扇區
1980s早期,把硬碟的物理扇區製作成512位元組成為主流標準 1956年硬碟發明的時候扇區容積更小 1998年,nsic提出使用更大容積的物理扇區,因為傳統的512位元組的扇區標準對日益增長的磁碟密度已經是限制了 隨之而來的是advanced format.第一代advanced format選用...
檔案系統中的邏輯塊 物理塊和扇區之間的關係
扇區 sector 硬體 磁碟 上的最小的操作單位,是作業系統和塊裝置 硬體 磁碟 之間傳送資料的單位。block由乙個或多個sector組成,檔案系統中最小的操作單位 os的虛擬檔案系統從硬體裝置上讀取乙個block,實際為從硬體裝置讀取乙個或多個sector。對於檔案管理來說,每個檔案對應的多個...
通過檔案的方式對硬碟扇區進行直接讀寫操作
createfile physicaldrive0 generic read,file share write,0,open existing,0,0 功能 讓物理磁碟0以檔案,唯讀,共享寫的方式開啟,開啟後會返回乙個檔案控制代碼,其實就是物理磁碟的控制代碼。readfile hdev,buffer...