如何在特定的 btrfs inode 上找到文件

如何在特定的 btrfs inode 上找到文件

我有一个损坏的文件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没有找到任何内容。有人知道如何找到损坏的文件吗?

答案1

例子:

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

答案2

我不确定为什么 find 命令对您不起作用。可能是 ino#367 被删除了?对我来说,和find似乎btrfs-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

从输出中找到您的 inode/objectid。您可以看到name与 objectid 257 关联的。

位置键(257 INODE_ITEM 0)类型 FILE

namelen 13 datalen 0 名称:100kbfile.txt

答案3

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

答案4

如果你想打印出多个 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

相关内容