如何在特定的btrfs inode中find该文件

根据btrfs我有一个损坏的文件

 BTRFS info (device sdb1): csum failed ino 367 off 310013952 csum 1601485211 expected csum 3692975992 

我假设ino 367意味着inode 367,所以我可以使用find并尝试恢复文件。 然而find /path -inum 367找不到任何东西。 任何人都知道如何find损坏的文件?

我不知道为什么find命令不适合你。 可能是ino#367删除? 对我来说, findbtrfs-debug-tree似乎工作正常。

 $ find /btrfs/ -inum 257 /btrfs/100kbfile.txt $ ls -li /btrfs/100kbfile.txt 257 -rw-r--r--. 1 root root 102400 Nov 25 21:07 /btrfs/100kbfile.txt 

您也可以尝试使用“btrfs-debug-tree”和grep作为objectid。

 ./btrfs-debug-tree /btrfs/partition | grep -A2 257 

从输出中find你的inode / objectid。 你可以看到与objectid 257相关的name

位置键(257 INODE_ITEM 0)键入FILE

namelen 13 datalen 0名称:100kbfile.txt

“find / path -inum xxx”方法适用于较新的内核,问题是旧的brtfs内核代码中的一个错误。

例:

 sudo btrfs inspect-internal inode-resolve 15380 /home 

man btrfs-inspect-internal说:

  inode-resolve [-v] <ino> <path> (needs root privileges) resolve paths to all files with given inode number ino in a given subvolume at path, ie. all hardlinks Options -v verbose mode, print count of returned paths and ioctl() return value 

如果你想打印出多个inode的文件名,这里有一个基于这个答案的脚本。

 #!/bin/bash set -eu usage() { printf "Usage: %s /filesytem inode(s)\n" "$(basename "$0")" 2>&1 } if [[ $# -lt 2 ]]; then usage; exit 1 fi fs=$1 shift if [[ ! -e $fs ]]; then usage; exit 1 fi for i in "$@"; do # printf "%s " "$i" sudo btrfs inspect-internal inode-resolve "$fs" "$i" done