btrfs
によると破損したファイルがあります
BTRFS info (device sdb1): csum failed ino 367 off 310013952 csum 1601485211 expected csum 3692975992
Ino367はinode367を意味すると想定したので、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
オブジェクトIDに「btrfs-debug-tree」とgrepを使用してみることもできます。
./btrfs-debug-tree /btrfs/partition | grep -A2 257
出力からiノード/オブジェクトIDを見つけます。 objectid257に関連付けられたname
を確認できます。
ロケーションキー(257 INODE_ITEM 0)タイプFILE
namelen 13 datalen 0名前:100kbfile.txt
「find/path -inum xxx」メソッドは新しいカーネルで機能します。問題は、古いbrtfsカーネルコードのバグです。
複数のiノードのファイル名を出力する場合は、 この回答 に基づくスクリプトを次に示します。
#!/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