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


12

少量のバックストーリー:

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

後で、このファイルシステムRAID1ミラーリング機能を提供するために、別のドライブを購入することにしました。このドライブはシーゲイトバラクーダ(2TB、BARRACUDA 7200.14ファミリー)です。残念ながら、これはドライブの良い選択ではありませんでした。ドライブはすぐに大量の読み取りエラーの発生を開始しましたが、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が正常なドライブのすべてのデータを忠実に消去しないようにし、不良なドライブに単一のコピーを配置できるようにしたい-代わりに、単純に他のドライブが存在しなかったかのように振る舞う(たとえば、以前の設定に戻す)

これは機能しません:

$ 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、他のドライブがエラーになりました。1つのドライブ(特に既知の正常なドライブ)に戻るにはどうすればよいsingleですか?


更新:dconvert=single1つのチャンクに対してそれを試しても、恐れていることだけが行われ、既知の正常なコピーが削除されます。:(
eeeeeta

回答:


11

さて、このTrelloリンクの助けを借りてそれを理解しました。他の誰かがこれを実行したい場合の手順は次のとおりです。

手順

2つのディスクのRAID1アレイから。1つ/dev/sdaは故障しており、もう1つは正常であることが判明しています/dev/sdc

  1. 無効に自動マウントこの配列の中の/etc/fstabリブート。基本的に、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はエラーをすべて忘れ、続行できます。

2
これは機能しません。Ubuntu 16.04(カーネル4.4)を使用しています。dmesgは、「欠落しているデバイス(1)が制限(0)を超えています。書き込み可能なマウントは許可されていません」と言います。したがって、「マウント-o劣化」ステップ
-HelloSam

@HelloSam:これはバグかもしれません。参照してくださいbbs.archlinux.org/viewtopic.php?id=210541
jaltek

,softそれぞれの後に追加しconvert=て、すでにターゲットプロファイルがあるチャンク(すべてのチャンクである必要があります)をスキップすることを検討してください。
トム・ヘイル

9

投稿いただきありがとうございます。レイドをテストし、ホットスワップベイからドライブを取り出し、別のドライブを使用してから、レイドドライブをポップインできるという考えがありました。振り返ってみると、これは悪い考えでした。

ここに私が見つけたものがあります。ルートとして:

# 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オプションに私を導き、フィルターがどのように機能するかを数回試してみました(最初は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

これが他の人の助けになることを願っています。


あるドライブを別のドライブと交換したいだけであれば、を使用して実行できますbtrfs replace
dma_k

これは一年ほど前に私のために働いてきましたが、今日はそうではありません。私が何を入力したかは関係ありません。devid=結果の単一データはデバイス1に配置されます
。– YtvwlD

-sconvertシステムチャンクの変換も確認してください。
トム・ヘイル

使用を検討して|代わりに,バランスのmanページが言うように:profiles=<profiles> Balances only block groups with the given profiles. Parameters are a list of profile names separated by "|" (pipe)
トム・ヘイル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.