web-dev-qa-db-ja.com

ラップトップbtrfsドライブを時々接続された外部USBディスクにミラーリング/バックアップ

Btrfs を使用する内蔵ドライブを備えたラップトップがあります。ここにはいくつかのサブボリュームとスナップショットがあります。このドライブのコピーを、ほぼ同じサイズの外付けUSBディスクに定期的に作成したいと思います。外部ドライブは起動可能で、内部ドライブとほぼ同じである必要があります。これにより、メインドライブに障害が発生した場合に、交換することができます。

これを達成するための最良の方法は何ですか?

以下に、私が検討したいくつかの方法を示します。

Btrfs RAID 1の使用を検討しましたが、これは実際には永続的に接続されたドライブ用に設計されているため、うまく機能しないと思われます。

同じディスクを使用して両方でExt4を使用した場合、このセットアップはRysncで管理しました。これはうまく機能しました。 rsyncはスナップショットを理解せず、すべてを何度もコピーするため、これは今は機能しないと思います。

Btrfsの送信/受信を使用して機能させることもできますが、ファイルシステムを送信するには、最初に読み取り専用のスナップショットを作成してから、このスナップショットの名前を外部ディスクで使用するため、それほど単純ではありません。 /でルートファイルシステムを受け取る方法はないと思います

6
river

Btrfsの送信/受信を使用して機能させることもできますが、ファイルシステムを送信するには、最初に読み取り専用のスナップショットを作成してから、このスナップショットの名前を外部ディスクで使用するため、それほど単純ではありません。 /でルートファイルシステムを受け取る方法はないと思います

これが最善の解決策です。スナップショットを使用して、サーバーの高速増分バックアップを作成しています。ルートサブボリュームは他のサブボリュームと同じようにバックアップできますが、ルートで受信できるとは思いません。さらに重要なことは、そうするべきではありません。そうすると、スナップショットの利点の1つである増分バックアップを享受できなくなるからです。適切に行われると、変更されたデータのみが送信され、変更されたデータのディスク領域のみが消費されます。

このスクリプトはcronジョブとして実行され、ルートパーティションのスナップショットを毎日取得してから、btrfs sendを使用して増分コピーをバックアップパーティションに送信します。記述されているスクリプトは pv を使用しますが、何らかの理由でインストールしたくない場合は、パイプの中央からpvを削除するだけです。

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
date=$(date +%Y-%m-%d)

# the path to the partition mount point that we are backing up
source_partition=/

# where backup snapshots will be stored on the local partition
# this is needed for incremental backups
source_snapshot_dir=/snapshots

# where backups will be stored on the backup drive
target_snapshot_dir=/mnt/media/backups/root

if [ ! -d $source_snapshot_dir ]; then
    echo 'Creating initial snapshot...'
    mkdir --parents $source_snapshot_dir $target_snapshot_dir

    # create a read-only snapshot on the local disk
    btrfs subvolume snapshot -r $source_partition $source_snapshot_dir/$date

    # clone the snapshot as a new subvolume on the backup drive
    # you could also pipe this through ssh to back up to a remote machine
    btrfs send $source_snapshot_dir/$date | pv | \
        btrfs receive $target_snapshot_dir
Elif [ ! -d $source_snapshot_dir/$date ]; then
    echo 'Creating root volume snapshot...'

    # create a read-only snapshot on the local disk
    btrfs subvolume snapshot -r $source_partition $source_snapshot_dir/$date

    # get the most recent snapshot
    previous=$(ls --directory $source_snapshot_dir/* | tail -n 1)

    # send (and store) only the changes since the last snapshot
    btrfs send -p $previous $source_snapshot_dir/$date | pv | \
        btrfs receive $target_snapshot_dir
fi

echo 'Cleaning up...'

# keep the 3 most recent snapshots on the source partition
ls --directory $source_snapshot_dir/* | \
    head --lines=-3 | \
    xargs --no-run-if-empty --verbose \
    btrfs subvolume delete --commit-after

# keep the 28 most recent snapshots on the backup partition
ls --directory $target_snapshot_dir/* | \
    head --lines=-28 | \
    xargs --no-run-if-empty --verbose \
    btrfs subvolume delete --commit-after

(注:スクリプトを一般的なソリューションにするために多少調整しましたが、記述どおりにテストしていません。必要に応じて、自由に改訂を送信してください。)

3
Mikkel