Linux

如何確定哪個文件/索引節點佔用給定扇區

  • November 26, 2015

我收到/var/log/kern.log指示驅動器故障的消息。$HOME在驅動器(ext4 -> ext3)之間複製我時出現的消息:

[ 5733.186033] sd 4:0:0:0: [sdb] Unhandled sense code
[ 5733.186038] sd 4:0:0:0: [sdb]  Result: hostbyte=invalid driverbyte=DRIVER_SENSE
[ 5733.186042] sd 4:0:0:0: [sdb]  Sense Key : Medium Error [current] 
[ 5733.186048] sd 4:0:0:0: [sdb]  Add. Sense: Unrecovered read error
[ 5733.186053] sd 4:0:0:0: [sdb] CDB: Read(10): 28 00 05 b7 2e 40 00 00 08 00
[ 5733.186064] end_request: critical target error, dev sdb, sector 95891008

消息成批出現,這是其中之一。sdb是源驅動器。

如何找出扇區屬於哪個文件/inode?我只想知道,這樣我就可以從備份中恢復有問題的文件。有什麼比下面的程式碼加上隨後的輸出分析更快?

find . -type f -print \
              -exec cp \{\} /dev/null \; \
              -exec tail -n 1 /var/log/kern.log \;

作業系統:Ubuntu Oneiric。

編輯:上面的命令也輸出到stderr無法讀取的文件。

粗略的想法是

  1. 做一些計算,根據物理扇區號找出文件系統的塊號
  2. 使用debugfstestb/ncheck/icheck 命令來確定塊是否正在使用以及正在使用它的文件的名稱

smartmontools 項目站點上有一個壞塊 HOWTO更詳細地描述了該過程。

  1. 通過執行找到該扇區所在的分區fdisk -lu /dev/sdb。假設它是從扇區 45612307 開始的“sdb2”。
  2. 從 95891008 中減去它,得到 50278701。
  3. 接下來確定每個塊有多少個扇區:tune2fs -l /dev/sdb2 | grep Block. 假設它是 4096。
  4. 計算塊/扇區比率:512字節/扇區/4096字節/塊=0.125塊/扇區。
  5. 從扇區計算塊:50278701 * 0.125 = 6284837.625。
  6. 使用 debugfs 找出哪個正在使用該塊。如果icheck 6284837返回 inode 12345 則執行ncheck 12345.

注意事項:您可能需要關閉日記功能。這可能不適用於 ext4。

引用自:https://serverfault.com/questions/315700