Filesystems

在 XFS 文件系統上查找與 inode 編號關聯的文件名

  • January 15, 2020

我們有一個 inode 編號,我們試圖將其與實際文件名相關聯。文件系統是 XFS。看看有一些範例聲稱能夠通過xfs_db和/或來實現這一點,xfs_ncheck但到目前為止,我們還沒有成功地做到這一點。

例子

我們正在分類一個問題,我們希望找到與 inode 編號相關聯的文件名,這些文件名顯示在 .procsfdinfo文件中/proc

$ grep inotify /proc/9652/fdinfo/23 | head
inotify wd:58eb9 ino:cfd30c7 sdev:20 mask:3c0 ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:c730fd0c00000000
inotify wd:58eb8 ino:cfd1f09 sdev:1e mask:3c0 ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:091ffd0c00000000
inotify wd:58eb7 ino:cfd1ee9 sdev:1a mask:3c0 ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:e91efd0c00000000
inotify wd:58eb6 ino:cfd1ec8 sdev:1c mask:3c0 ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:c81efd0c00000000
inotify wd:58eb5 ino:cfd1eb9 sdev:19 mask:3c0 ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:b91efd0c00000000
inotify wd:58eab ino:cfd24cf sdev:20 mask:3c0 ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:cf24fd0c00000000
inotify wd:58eaa ino:cfdbc51 sdev:1e mask:3c0 ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:51bcfd0c00000000
inotify wd:58ea9 ino:cfdbc31 sdev:1a mask:3c0 ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:31bcfd0c00000000
inotify wd:58ea8 ino:cfdbc0f sdev:1c mask:3c0 ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:0fbcfd0c00000000
inotify wd:58ea7 ino:cfdb000 sdev:19 mask:3c0 ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:00b0fd0c00000000

這些 inode 採用 HEX 格式,因此我們需要將它們轉換為 DEC:

$ echo $((16#cfd30c7))
217919687

使用xfs_ncheck

$ xfs_ncheck -i $(echo $((16#cfd30c7))) /dev/mapper/vg0-dockerlv
ERROR: The filesystem has valuable metadata changes in a log which needs to
be replayed.  Mount the filesystem to replay the log, and unmount it before
re-running xfs_ncheck.  If you are unable to mount the filesystem, then use
the xfs_repair -L option to destroy the log and attempt a repair.
Note that destroying the log may cause corruption -- please attempt a mount
of the filesystem before doing this.
must run blockget -n first

問題

  • 我們如何使用 XFS 做到這一點?
  • 我已經使用 debugfs 和 ext3/4 文件系統做過類似的事情,但是這對於 XFS 來說似乎並不容易?

參考

理論上該命令應該可以工作,但實際上,xfs_ncheck它是一個 shell 腳本,xfs_db並且xfs_db非常喜歡完全解除安裝的文件系統:

# xfs_db /dev/SSD/root 
xfs_db: /dev/SSD/root contains a mounted filesystem
fatal error -- couldn't initialize XFS library

因此,預設情況下,對於掛載的文件系統,它甚至根本不執行,需要額外的選項來忽略掛載狀態xfs_ncheckxfs_db由然後你會收到關於需要重播的日誌等的一些不清楚的消息。

因此,您必須解除安裝或重新安裝只讀,或使用寫時複製快照來生成乾淨的文件系統映像以成功執行這些命令。

但是,如果它只是正常的 inode 編號,對於已掛載的文件系統,您也可以使用

find /path/to/mountpoint -xdev -inum X

但這不會找到已刪除的文件,並且還可能會失去隱藏在其他掛載點下的文件(在這種情況下,請考慮mount --bind代替-xdev)。

另請注意,在硬連結等情況下,inum 文件名相關性可能有些隨意。

引用自:https://unix.stackexchange.com/questions/562280