5

У меня ноутбук с внутренним приводом, использующим Btrfs. Здесь есть несколько подразделов и снимков. Я хочу, чтобы копия этого диска периодически создавалась на внешний USB-диск примерно того же размера. Внешний диск должен быть загрузочным и достаточно близким к внутреннему, чтобы в случае сбоя основного диска я мог его просто заменить.

Каков наилучший способ достичь этого?

Ниже некоторые методы, которые я рассмотрел:

Я подумал об использовании Btrfs RAID 1, но он действительно предназначен для постоянно подключенного диска, поэтому я подозреваю, что он не будет работать хорошо.

Когда у меня был один и тот же диск и я использовал Ext4 на обоих, я управлял этой настройкой с помощью Rysnc, которая работала хорошо. Я ожидаю, что сейчас это не сработает, потому что rsync не будет понимать моментальные снимки и будет многократно копировать все.

Возможно, использование Btrfs send / receive можно заставить работать, но это не так просто, потому что для отправки файловой системы сначала необходимо сделать снимок только для чтения, а затем имя этого снимка используется на внешнем диске. Я не думаю, что есть способ получить корневую файловую систему, в /

2 ответа2

2

Возможно, использование Btrfs send / receive можно заставить работать, но это не так просто, потому что для отправки файловой системы сначала необходимо сделать снимок только для чтения, а затем имя этого снимка используется на внешнем диске. Я не думаю, что есть способ получить корневую файловую систему, в /

Это лучшее решение. Я использую моментальные снимки, чтобы быстро создавать резервные копии моих серверов. Вы можете создать резервную копию корневого подобъема, как и любой другой, но я не думаю, что вы можете получить в корне. Более того, вы не должны этого делать, потому что это мешает вам воспользоваться одним из преимуществ моментальных снимков: добавочное резервное копирование. Если все сделано правильно, он будет отправлять только измененные данные и использовать только дисковое пространство для измененных данных.

Этот скрипт запускается как задание 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

(Примечание: я несколько адаптировал скрипт, чтобы сделать его общим решением, и не тестировал его так, как написано. Пожалуйста, не стесняйтесь вносить изменения в случае необходимости.)

-1

Насколько я понимаю, вы хотите создать зеркало (или достаточно близкое к одному) жесткого диска ноутбука, чтобы заменить жесткий диск ноутбука в случае сбоя диска. Привод зеркала должен быть подключен через USB и не всегда может быть подключен, например, вы берете свой ноутбук в короткую поездку, но оставляете привод зеркала на работе или дома.

Для меня это выглядит как случай для RAID 1. Это можно сделать с помощью BTRFS или MDADM. В любом случае при подключении внешнего накопителя обратно к ноутбуку вам необходимо убедиться, что он рассматривается как «ведомый». Поскольку более поздние записи, вероятно, произошли бы на ноутбуке, это должно иметь место. Затем в btrfs можно запустить операцию очистки (btrfs-scrub).

В качестве альтернативы вы можете использовать fssync, хотя вам и будет предоставлен доступ к локальному хосту. Сообщается, что fssync со страницы руководства хорошо работает с btrfs.

Что касается моментальных снимков и использования rsync или другой такой синхронизации, вы могли бы при создании моментальных снимков создать их как на внешнем зеркале, так и на внутреннем диске, и просто не синхронизировать моментальные снимки, предполагая снимки только для чтения. Если не только для чтения, вам нужно будет выполнить синхронизацию, и, возможно, у вас возникнет проблема, о которой вы заявили.

Если у вас есть другая система, вы можете рассмотреть возможность использования DRBD в режиме с одним основным. Хотя вы, возможно, сможете заставить это работать с обоими дисками в одной системе, я видел отчеты, которые указывают, что это не работает.

Обратите внимание, что RAID, синхронизация и репликация многими считаются не подходящей заменой для системы резервного копирования.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .