查找与 XFS 文件系统上的索引节点号关联的文件名

查找与 XFS 文件系统上的索引节点号关联的文件名

我们有一个索引节点号,我们试图将其与实际的文件名关联起来。文件系统是XFS。看看有一些例子声称能够使用xfs_dband/or来实现这一点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 是十六进制的,所以我们需要将它们转换为十进制:

$ 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 似乎并不那么容易?

参考

答案1

理论上,该命令应该有效,但实际上,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_ncheck),但即便如此,在已挂载或其他不干净的文件系统中,xfs_db相关命令通常无法按预期工作,然后您会收到有关需要重播的日志等的不清楚的消息。

因此,您必须卸载或重新以只读方式挂载,或使用写时复制快照来生成干净的文件系统映像才能成功运行这些命令。

但如果它只是常规的 inode 号,对于已安装的文件系统,您也可以使用

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

但这不会找到已删除的文件,并且还可能会丢失隐藏在其他安装点下的文件(在这种情况下请考虑mount --bind而不是-xdev)。

另请注意,在硬链接等情况下,inum-文件名关联可能有些任意。

相关内容