web-dev-qa-db-ja.com

特定のbtrfsinodeでファイルを見つける方法

btrfsによると破損したファイルがあります

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

Ino367はinode367を意味すると想定したので、findを使用してファイルの復元を試みることができます。しかしながら find /path -inum 367何も見つかりません。誰かが破損したファイルを見つける方法を知っていますか?

5
user192749

例:

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
3
Tom Hale

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

オブジェクト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

1
webminal.org

「find/path -inum xxx」メソッドは新しいカーネルで機能します。問題は、古いbrtfsカーネルコードのバグです。

1
user192749

複数の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
0
Tom Hale