web-dev-qa-db-ja.com

btrfsエクステントの問題を修正する方法

私はbtrfsの既知のバグに見舞われたと思います:

https://www.spinics.net/lists/linux-btrfs/msg60984.html

確かに、エラーメッセージは似ているようです。同じ問題である場合、2年前の問題の修正がV4.9安定カーネル(Debian 9が使用しているもの)に移植されていないのは少し残念なようです。

現在、ファイルシステムのiノードの1つにエクステントの問題がある状況にあります(btrfs checkによって報告されています)。

root 257 inode 2607184 errors 100, file extent discount
Found file extent holes:
       start: 0, len: 81920

このような状況から抜け出す方法についてのアドバイスやドキュメントはあまりないようです(幸い、関係するファイルシステムのバックアップがあるので、最悪の場合は再フォーマットして復元できます)

btrfs check --repairは、実際に修正せずに、同じエラーを繰り返し出力することをループしているようです。

既存のファイルシステムを修正する方法はありますか、それとも再作成してバックアップを復元するのが最善ですか?

2
Michael Firth

おもう root 257はサブボリュームIDを参照し、次にinode 2607184問題のあるiノードを指します。 iノードにリンクされているすべてのパスを削除(リンク解除)しようとします。

  1. サブボリュームをマウントします。

    mount /dev/sdXN -o subvolid=257 /mnt/mountpoint
    
  2. Iノード番号が一致するすべてのエントリを見つけます。

    find /mnt/mountpoint -xdev -inum 2607184
    
  3. オブジェクトを調査します。うまくいけば、それらを削除する余裕があります。

    • (あなたの場合、それがディレクトリであるかどうかはわかりません)。ディレクトリの場合、リストが不完全である可能性があります。
      1. その内容(ある場合)を別の新しいディレクトリに移動します(同じ所有権、おそらくアクセス許可で作成します)。古いディレクトリを削除します。 mv新しいディレクトリを古い名前に変更します。
      2. バックアップと比較して、不足しているオブジェクトを復元します。
    • 1つ以上のファイルの場合–
      1. それらをすべて削除します。
      2. バックアップからファイルを復元します。
  4. アンマウント:

    umount /mnt/mountpoint
    
  5. ファイルシステムを確認してください。問題のあるiノードはもうないはずです。


または、サブボリューム全体を削除することもできます。これはやり過ぎのように見えますが、問題のあるiノードを取り除く必要があります。

  1. ファイルシステムのルートをマウントします。

    mount /dev/sdXN -o subvol=/ /mnt/mountpoint
    
  2. サブボリュームのリスト:

    btrfs subvolume list /mnt/mountpoint
    

    iD257のものを見つけます。

  3. サブボリュームを削除します。

    btrfs subvolume delete -c /mnt/mountpoint/path/to/the/subvolume/with/ID/257
    
  4. アンマウント:

    umount /mnt/mountpoint
    
  5. ファイルシステムを確認してください。問題のあるiノードはもうないはずです。

  6. バックアップからデータを復元します。
4