У меня поврежденный файл согласно 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