Назад | Перейти на главную страницу

Как найти файл в определенном inode btrfs

У меня поврежденный файл согласно btrfs

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

Я предположил, что ino 367 означает индекс 367, поэтому я могу использовать find и попытаться восстановить файл. тем не мение find /path -inum 367 ничего не находит. Кто-нибудь знает, как найти поврежденный файл?

Пример:

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

Я не уверен, почему у вас не сработала команда 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

Метод "find / path -inum xxx" работает с новыми ядрами, проблема заключается в ошибке в старом коде ядра brtfs.

Если вы хотите распечатать имена файлов нескольких inodes, вот сценарий, основанный на этот ответ.

#!/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