web-dev-qa-db-ja.com

スナップショットの共有データを保持するbtrfsファイルシステムを別のメディアに複製する方法

私はbtrfs raid機能を試してみることにしました。私はbtrfsを設定しました

Sudo mkfs.btrfs -m raid10 -d raid10 /dev/sda9 /dev/sdb9 /dev/sdc9 /dev/sdd9

次に、既存のbtrfsパーティション(linux-raidの上にある)のクローンを作成します。単純なcp -aを使用することはできません。40を超えるスナップショットベースのバックアップ(保持したい)があり、複数回使用できるすべてのストレージを単純にいっぱいにしてしまうためです。

これまでのところ、2つのオプションがあります。

partclone.btrfs -s /path/to/original/fs -o /dev/sda9 -b

私もbtrfs balance start /dev/sda9が必要になると思います

そして

実行:ストレージに収まる範囲でcp -aを使用して増分コピーし、次に bedup を使用してファイルの重複を排除し、ループします。

推奨される(つまり、ベストプラクティス)方法は何ですか?私は最初のものをはるかに好みます。それははるかに少ない時間がかかるはずです。または、おそらくこの手順のいずれかに潜んでいるいくつかの邪悪な「落とし穴」があります(もちろん、btrfsが実験的であるという事実に加えて)


最初の質問は問題外です。 partclone.btrfsがどんなに素晴らしいツールであっても、マルチデバイスファイルシステムをサポートしていないことは明らかです。 :-(

9
Adam Ryczkowski

私は尋ねた 同様の質問 2年前。

ただし、私の場合は、raid0に1つのデバイスをコピーすることだけを計画していました。

私は最終的に a solution を見つけました。当時、raid0からraid10に変換することはできませんでしたが、カーネル3.3以降ではそのように見えます。したがって、その解決策は最終的にはうまくいくかもしれません。

そのアプローチの問題は、それがfsuidをコピーすることです。つまり、FSとそのコピーの両方を同じマシンにマウントすることはできません。その当時、FSのfsuidを変更するツールはありませんでしたが、今は変わったかもしれません。

アイデアは、元のデバイスの上にコピーオンライトレイヤーを追加して書き込みできるようにすることですが、変更は後で破棄できる別の場所で行われます。つまり、追加のストレージスペースが必要になります(たとえば、外付けドライブ上)。

次に、そのCOWをマウントしますFSオリジナルの代わりに、FSコピー用のデバイスを追加して、COWのデバイスを削除します。

コピーオンライトの場合は、デバイスマッパーを使用できます。

書き込み領域の使い捨てコピーには、ここではループデバイスを使用しています。

/dev/sda/dev/sd[bcde]に複製するとします。

COWバックストアを作成します。

truncate -s 100G /media/STORE/snap-store
losetup /dev/loop0 /media/STORE/snap-store

次に、OriginをアンマウントしますFSマウントされている場合、およびmodprobe -r btrfsが干渉しないようにし、デバイススキャンを忘れないようにします。

次に、COWされたデバイスを作成します。

echo "echo 0 $(blockdev --getsize /dev/sda) snapshot /dev/sda /dev/loop0 N 8 | dmsetup create cowed

現在、/dev/mapper/cowed/dev/sdaに似ていますが、書き込まれたものはすべて/dev/loop0になり、/dev/sdaは変更されません。

これでマウントできます:

mount /dev/mapper/cowed /mnt

他のデバイスを追加します。

btrfs dev add /dev/sd[bcde] /mnt

そして古いものを削除します:

btrfs dev del /dev/mapper/cowed /mnt

それが終わったら、シャットダウンしてプラグを抜くか、/dev/sdaを他のファイルと同じfsuidにしているのでbtrfsがまだ失敗する可能性があるため、読み取り専用にすることができます。

今、私が正しく理解していれば、最近のbtrfs-progを持っているとすれば、次のことができるはずです。

btrfs balance start -d convert=raid10 /mnt

Raid10に変換します。理論的には、すべてのデータチャンクが少なくとも2つのディスクにコピーされるようにする必要があります。

最初はループデバイスでダミーのbtrfsをテストすることを強くお勧めします。すべてメモリからのものであり、間違っている可能性があるためです(たとえば、編集前の最初の回答を参照してください)。

カーネル3.6以降、btrfsはzfsのように少し送受信を実装することに注意してください。それはあなたのためのオプションかもしれません。

7

Stephaneのアイデアは、btrfs組み込みツールを介して実行できます(これがクールな理由です)。古いbtrfsを シードデバイスbtrfstune -S 1 /dev/device、デバイスを追加、シードデバイスを削除、実行btrfs balance start。シードデバイスは、読み取り/書き込み可能なファイルシステムの一部である読み取り専用デバイスです。

4
ignis

@ignisの提案に従ってシードを使用しようとしましたが、問題がありました。シードデバイスを削除しようとしたときにシステムがエラーをスローし、これを克服できませんでした。次に、(現在-btrfs-progs v3.19-64-g19a806f、おそらく以前ではない)コマンドがあることがわかりました:

  btrfs replace start [-Bfr] <srcdev>|<devid> <targetdev> <path>

これにより、既存のbtrfsファイルシステム(LVM論理ボリューム内にあった)を新しいパーティションに複製することが楽になりました。 2015年5月現在、RAID5/6プロファイルでは機能しないことに注意してください。詳細については、manページを確認してください。

1
gogoud

オプション1-データをコピーしてからUUIDを変更する

ソースパーティションがマウント解除されており、自動マウントされないことを確認します。

dd(遅い、ダム)またはpartclone.btrfs -b -s /dev/src -o /dev/targetを使用します

btrfstune -uを使用して、コピー後およびマウント前にUUIDを変更します。

データ損失の警告Do[〜#〜] not [〜#〜] UUIDが変更されるまで(自動)マウントどちらかオリジナルまたはコピーを試みます


オプション2-btrfs-clone

私は個人的には試していません btrfs-clone ですが、既存のBTRFSファイルシステムを新しいものに複製し、各サブボリュームを順番に複製することを目的としています。

0
Tom Hale