web-dev-qa-db-ja.com

Linux BTRFS-ドライブが故障したシングルに変換

少量の裏話:

私は、HTPCセットアップに使用されるさまざまな映画やテレビ番組を保存する小さなメディアファイルシステムを持っています。これは最初、btrfsを使用して1TB WD外付けドライブにセットアップされました。

後で、このファイルシステムのRAID1ミラーリング機能を提供するために、別のドライブを購入することにしました。このドライブは、Seagate Barracuda(2TB、BARRACUDA 7200.14 FAMILY)です。残念ながら、これはドライブの良い選択ではありませんでした。ドライブはすぐに大量の読み取りエラーの発生を開始しましたが、BTRFSはそれらを修正できました。

最近、このドライブからの読み取りエラーの量が急増し、その状態は着実に悪化しています。 BTRFSがクラッシュし始めています。

kernel: RSP: 0018:ffff88005f0e7cc0  EFLAGS: 00010282
kernel: RIP: 0010:[<ffffffffa0081736>]  [<ffffffffa0081736>] btrfs_check_repairable+0xf6/0x100 [btrfs]
kernel: task: ffff88001b5c4740 ti: ffff88005f0e4000 task.ti: ffff88005f0e4000
kernel: Workqueue: btrfs-endio btrfs_endio_helper [btrfs]
kernel: CPU: 1 PID: 3136 Comm: kworker/u8:3 Tainted: G           O    4.5.3-1-Arch #1
kernel: invalid opcode: 0000 [#1] PREEMPT SMP 
kernel: kernel BUG at fs/btrfs/extent_io.c:2309!
kernel: ------------[ cut here ]------------
kernel: BTRFS info (device sdc1): csum failed ino 73072 extent 1531717287936 csum 3335082470 wanted 3200325796 mirror 0
kernel: ata3: EH complete
kernel: BTRFS error (device sdc1): bdev /dev/sda3 errs: wr 0, rd 18, flush 0, corrupt 0, gen 0
kernel: blk_update_request: I/O error, dev sda, sector 2991635296

RAID1アレイから障害のあるドライブを削除して、単一のドライブで冗長性がない状態に戻したいのですが。残念ながら、これを行う方法に関するドキュメントが不足しているようです。

私は以下を実行できることを認識しています:

Sudo btrfs balance start -dconvert=single /media

データプロファイルをsingleモードに変換しますが、データが配置される場所がどこかだけはわかりません。ドライブの1つが故障しているので、BTRFSが正常なドライブ上のすべてのデータを忠実に消去せず、不良ドライブに1つのコピーを配置できるようにしたい-代わりに、単に他のドライブが存在しなかったかのように動作します(同じように、古いセットアップに戻します)。

これは機能しません:

$ Sudo btrfs device delete /dev/sda3 /media
ERROR: error removing device '/dev/sda3': unable to go below two devices on raid1

どうしようかな?助けをいただければ幸いです。

TL; DR:BTRFSの1つのドライブで開始single、別のドライブを追加、それをRAID1、他のドライブでエラーが発生しています。singleを使用して、1つのドライブ(具体的には既知の正常なドライブ)に戻す方法を教えてください。

12
eeeeeta

さて、私は このTrelloリンク の助けを借りてそれを理解しました。他の誰かがこれをしたい場合のために、ここに手順があります。

手順

2つのディスクのRAID1アレイから、1つは/dev/sdaが故障しており、もう1つは/dev/sdcが正常に動作している:

  1. /etc/fstabrebootでこのアレイの自動マウントを無効にします。基本的に、このアレイが存在しないことをbtrfsに知らせておきます。プラグが抜かれた場合でも、ドライブの1つを使用しようとするバグがあるためです。
  2. アレイがアンマウントされたので、次を実行:

    echo 1 | Sudo tee /sys/block/sda/device/delete

    sdaを障害のあるデバイス名に置き換えます。これにより、ディスクがスピンダウンし(dmesgでこれを確認する必要があります)、カーネルにアクセスできなくなります。

    または:起動する前にコンピュータからドライブを取り出してください!上記の方法でうまくいくので、この方法を選択しないことにしました。

  3. -o degradedモードでアレイをマウントします。
  4. Sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpointでリバランス操作を開始します。これにより、正常なドライブのエクステントが再編成され、single(非RAID)に変換されます。 これは、ドライブの速度とアレイのサイズに応じて、完了するまでにほぼ1日かかります。(鉱山は〜700 GiBで、毎分1 1GiBチャンクのレート)幸いなことに、この操作は一時停止することができ、発生中もアレイをオンラインに保ちます。
  5. これが完了したら、Sudo btrfs device remove missing /mountpointを発行して、「見つからない」障害のあるデバイスを削除できます。
  6. メタデータの冗長性を復元するには、Sudo btrfs balance start -mconvert=dup /mountpointを使用して2回目のリバランスを開始します。これは私のシステムで数分かかります。
  7. 完了です!これでアレイはsingleモードになり、すべての冗長性が削除されました。
  8. 故障したドライブを外に出し、ハンマーで叩きます。

トラブルシューティング

  • ヘルプ、btrfsが障害のあるディスクに書き込もうとしてエラーが発生し、読み取り専用に強制しました!
    • 手順1を実行し、続行する前に再起動しましたか?スピンダウンしたドライブが存在するとbtrfsがまだ認識している可能性があります。再起動すると、btrfsはエラーを忘れ、続行を許可します。
12
eeeeeta

投稿ありがとうございます。 RAIDをテストし、ホットスワップベイからドライブを取り外し、別のドライブを使用してから、RAIDドライブを再び取り付けられるという考えがありました。振り返ってみると、これは悪い考えでしたが、ホットスワップベイが必要になりました。

これが私が見つけたものです。ルートとして:

# Sudo btrfs fi show
Label: 'disk'  uuid: 12817aeb-d303-4815-8bba-a3440e36c62c
Total devices 2 FS bytes used 803.10GiB
    devid    1 size 931.51GiB used 805.03GiB path /dev/sda1
    devid    2 size 931.51GiB used 805.03GiB path /dev/sdb1

各ドライブにリストされているデバイスに注意してください。 brtrfsバランスの人が私をdevidオプションに導き、フィルターがどのように機能するかを理解するために2、3回試行しました(最初はdevid =/dev/sdb1を試しました)。したがって、最初の試みは次のようになります。

# btrfs balance start -dconvert=single,devid=2 -mconvert=single,devid=2 /mnt

エラーが発生しました。

ERROR: error during balancing '/media/.media': Invalid argument
There may be more info in syslog - try dmesg | tail    

Dmesgからのエラーは次のとおりです。

BTRFS error (device sdb1): balance will reduce metadata integrity, use force if you want this

だからこれはうまくいったファイナルです:

# btrfs balance start -f -dconvert=single,devid=2 -mconvert=single,devid=2 /mnt

うまくいけば、これは他の誰かを助けます。

9
P.G.