понедельник, 22 ноября 2010 г.

Резервное копирование таблицы разделов при помощи gpart

Добавил в gpart(8) возможность выполнять резервное копирование и восстановление таблицы разделов. Уже давно что-то такое вертелось на уме и знакомые просили. Но вот, собрались трое, кому это нужно, в IRC и окончательно сформулировалась задача :)

Резервное копирование выполняется при помощи команды "gpart backup", которая в специальном текстовом формате выводит информацию о таблице разделов. Эту информацию можно перенаправить в файл, либо отдать на вход команде "gpart restore". Небольшой пример:

# gpart backup ada0
MBR 4
1 freebsd       63 20964762   [active]
2    ntfs 20964825 40965750
3 freebsd 61930575 18362295
# gpart backup ada1
GPT 128
1   freebsd-boot        34       512 boot
2   freebsd-swap       546   8388608 swap
3    freebsd-zfs   8389154 311783869 zfs
Как можно догадаться, первоя строка в выводе - это опции команды "gpart create", следующие - для "gpart add". У команды restore есть несколько ключей:

gpart restore [-lF] [-f flags] provider [...]
Ключ "-l" указывает gpart восстанавливать символические метки разделов, которые по-умолчанию не восстанавливаются. С ключем "-F" gpart перед восстановлением уничтожит таблицу разделов на носителе, куда будет восстанвливаться резервная копия. Иначе, если там будет обнаружена какая-либо таблица разделов, он просто завершится с ошибкой. Ну и ключ -f выполняет те же функции, что и у дргих подкоманд - откладывает запись всех изменений на носитель до вызова команды commit. Т.е. если вы не уверены в своих действиях - этот ключ ваш лучший товарищ.
Теперь немного примеров по использованию. Типичные действия для резервного копирования:

# gpart backup ada0 > ada0.backup
# cat ada0.backup
MBR 4
1 freebsd       63 20964762   [active]
2    ntfs 20964825 40965750
3 freebsd 61930575 18362295
Теперь этот ada0.backup на ответственное хранение в сейф. И вдруг, после очередной пьянкисмены паролей, утром вы обнаружили что таблица разделов уничтожена =)
Бежите к сейфу, загружаетесь с livefs и восстанавливаете таблицу разделов:

# gpart restore ada0 < /mnt/ada0.backup
Теперь более реальный пример. Вы захотели к уже установленной системе подключить ещё один диск и сделать зеракало на ZFS:

# gpart backup ada0 | gpart restore ada1


Нет, вы параноик и вы подключили 2 жестких диска и хотите сделать тройное зеркало, не проблема:

# gpart backup ada0 | gpart restore ada1 ada2 
Теперь пример для неопытных пользователей:

# gpart backup ada0 | gpart restore -F -f x ada1
# gpart show 
О, боже! Не тот диск, вы уничтожили диск с фотографиями вашей жены! =) Спокойно, -f вас спас:

# gpart undo ada1

Вот так вот, немного шутя можно работать с gpart. А ещё у меня новость, мои менторы освободили меня от "надзора" :) Теперь я стал самостоятельным коммитером.

 PS. Ещё раз хочу заметить, что gpart backup/restore выполняют копирование и восстановление ТОЛЬКО таблицы разделов. Данные, находящиеся на этих разделах, бэкапить и восстанавливать нужно отдельно. В том числе, и содержимое в разделы freebsd-boot нужно записывать повторно.

6 комментариев:

  1. Добрый день! Вопрос такой:
    # gpart backup ada0 | gpart restore ada1
    работает без проблем, но не бэкапятся и не восстанавливаются метки разделов, т.е. после restore, приходится делать #> gpart delete -i ..., о потом создать заново #> gpart add ... .
    Или я не прав?

    ОтветитьУдалить
  2. у команды gpart restore есть ключик -l для восстановления меток. Просто восстанавливать метки бывает не всегда нужно, т.к. одинаковые метки на разных носителях конфликтуют.
    Есть ещё один подводный камень - у GPT есть ещё уникальные идентификаторы gptid, они не бэкапятся и не восстанавливаются.

    ОтветитьУдалить
  3. Да, и к тому же, для того чтобы установить метку, не нужно удалять и пересоздавать раздел, есть команда gpart modify

    ОтветитьУдалить
  4. Спасибо, то что надо, во всяком случае в моем варианте, для восстановления дисков в райд,е. А, gptid, я так понимаю, если не обращатся по ним, так они не очень и нужны?

    ОтветитьУдалить
  5. gpart modify - пробовал, но не добавляет в устройства, т.е. говорит что все ок, но в /dev/gpt/[label] не создается, только через пересоздание раздела.

    ОтветитьУдалить
  6. gptid генерируются уникальными, в этом их плюс и минус одновременно. Их можно использовать, когда есть необходимость использовать конкретную партицию на конкретном диске, не заботясь об изменении нумерации дисков, например.

    Проблема с непоявлением файла устройства в /dev/gpt/ известна. Вы можете заставить glabel проверить провайдер на наличие метки таким образом:
    # true > /dev/ada1p2

    Но если метка с таким именем уже существует, то вторая такая же, естественно, не появится.

    ОтветитьУдалить