Система резервного копирования и быстрого развёртывания ОС - Clonezilla

Clonezilla - проект по созданию свободной системы резервного копирования, клонирования, восстановления и массового развертывания операционных систем и данных. Позиционируется как аналог и замена для Norton Ghost (упомянуто на оффсайте). Также, многие её возможности повторяют, а кое-в чем и обгоняют аналогичные проприетарные решения от Paragon и Acronis.

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

Возможности

Поддержка файловых систем:

  • FAT,
  • NTFS,
  • ext{2,3,4},
  • reiserfs{3,4},
  • XFS,
  • JFS,
  • VMFS (VMWare ESX)
  • UFS, (*BSD)
  • HFS+, (Mac)
  • все остальные (посекторно, с помощью dd)

Сравнение с аналогами

^ Основные параметры            ^ Clonezilla ^ Paragon  ^ Acronis   ^ 
^ требования к памяти           | 128-256m   | 512      | 160m      |
^ графический интерфейс         | нет        | да       | да        |
^ интеграция в другие продукты  | да         | нет      | нет       |
^ live-система основана         | linux      | vista    | linux     |
^ изменяемость live-системы     | да         | нет      | нет       |

^ Поддерживается загрузка с     ^ Clonezilla ^ Paragon  ^ Acronis   ^ 
^ * cd/dvd                      | да         | да       | да        |
^ * usb                         | да         | нет      | да (хак)  |
^ * pxe (по сети)               | да         | нет      | да (хак)  |

^ Сохранение образов дисков     ^ Clonezilla ^ Paragon  ^ Acronis   ^ 
^ локальное устройство          | +          | +        | +         |
^ smb (cifs)                    | +          | +        | +         |
^ nfs                           | +          | -        | ??        |
^ ssh                           | +          | -        | -         |
^ ftp                           | ~          | ??       | +         |
^ (unix-supported)              | ~          | -        | -         |

^ Дополнительные "возможности"  ^ Clonezilla ^ Paragon  ^ Acronis   ^
^ головняк с версиями лицензий  | нет        | ??       | да        |
^ красивый сайт с тонной рекламных лозунгов | нет | да | да |

Ограничения

Ограничений достаточно много, большая часть - из-за недостаточной гибкости интерфейса. Там описаны только типовые операции, для нестандартных случаев - готовьтесь принять управление на себя и использовать консоль.

Чисто технические ограничения:

  • поддержка восстановления только на раздел, больший или равный исходному. (это всё равно можно переопределить, но правильность восстановления в этом случае - не гарантируется)
  • нет возможности работать с данными внутри образа, даже несжатого1

Всё остальное - ограничения чисто интерфейса, например:

  • нет возможности отдельно настроить опции бэкапа для отдельных разделов, приходится полагаться на автоматику
  • начальная поддержка LVM, опять же, нет возможности бэкапить отдельные тома
  • разделение на «образы дисков» и «образы разделов». (отличие - в одном файле)
  • программа "видит" образы только в корневой директории примонтированного хранилища
  • и т.д.

Применимость

Смысл в изучении и использовании системы появляется при:

  • частом выполнении операции развертывания системы
  • большом парке обслуживаемой техники
  • неприемлемости/невозможности использования платных аналогов
  • необходимости гарантии максимально полного восстановления данных из бэкапа даже при его повреждении

Для типичного win-эникейщика с руками достаточной кучерявости - вещь практически неподъёмная или очень ограниченная в возможностях, поскольку с консолью он работать не умеет, а интерфейс позволяет только типовые операции. Тем не менее, при желании учиться, освоение системы займет от 3 дней (базовый уровень) - до месяца (поскольку потребуется объяснять, что на самом-то деле нет такого понятия как "буквы дисков").

Для линуксоида с хотя бы полугодовым опытом и базовыми навыками работы в консоли, обучение займет от одного до 5и дней до появления т.н. «чувства системы». После прочтения данного материала - смею надеяться - ещё меньше.

Необходимый уровень знаний - на уровне

  • записать N байт из заданного смещения многогигабайтного файла по заданному смещению на диске,
  • настроить сеть из консоли,
  • редактирование mbr fdisk'ом и понимание отличия между сектором и цилиндром диска
  • не промахнуться мимо нужного диска/раздела

Особенности клонирования

Вещи, на которые стоит обратить внимание при массовом развертывании систем.

nix:

  • ssh-ключи
  • ip-адрес и настройки сети (неактуально для dhcp)
  • hostname
  • UUID дисков
  • имена и uid пользователей, если используется авторизация на локальной машине
  • имена групп lvm
  • имена сетевых интерфейсов (для случая, когда их больше одного)

Первые 3 - рекомендованы к изменению, остальные - по желанию.

win:

  • SID машины и пользователей
  • netbios-имя
  • настройки сети

SID, судя по статье Руссиновича, менять необязательно, но рекомендовано. NB-имя - менять обязательно, если машины будут работать в одной сети, иначе получите гарантированные глюки и медленную работу win-сети.

Подготовка систем к развертыванию

Иначе говоря - создание образов установленных и настроенных систем.

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

Также, старайтесь делать образы дисков минимального размера - это автоматически обходит ограничения clonezilla на невозможность развертывания образа на меньший по размеру раздел диска и экономит время на развертывание за счет передачи меньшего объема данных.

Разметка дисков

nix:

Здесь всё просто - выделяется 100Мб раздел под «/boot», выделяется второй раздел под всё остальное (рекомендуемый объем для работы системы).

Первый раздел нужен, чтобы использовать lvm на втором, поскольку поддержку его в самом загрузчике имеет только grub2. Кроме того, так проще будет проводить исправление проблем с загрузчиком и редактирование его конфигурации. Рекомендуемый размер - 70-150Мб

Второй раздел полностью отводится под физический том lvm и уже в нём динамически выделяется место под различные нужды. Рекомендуемый размер - 4-8 Гб, в зависимости от ДЕ, дистрибутива и количества софта. Этот раздел должен использоваться для работы системы, хранение на нем пользовательских данных - крайне нежелательно.

Для себя я определил такую схему логических томов:

  • tmp - 256-512 Мб, noexec,nodev,nosuid. Этот раздел можно впоследствии выделить целиком в оперативной памяти, а логический том - удалить.
  • home - 512Мб, relatime, по желанию - noexec
  • swap - 256-1024Мб
  • root - всё остальное

Почему именно так: конечно, будучи бывалым гуру, вы бы выделили /var/log и /var/run в память, возможно разбили бы /usr ещё на несколько разделов. Но здесь основная задача - чтобы система проработала максимально долго без внешнего вмешательства. И чтобы когда её принесли с диагнозом "не работает, хз почему" - можно было бы максимально быстро установить по логам что именно случилось. Ситуации «в разделе с логами кончилось место, поэтому всё поотваливалось» - недопустимы.

Небольшой раздел с «/home» - это своего рода заглушка, для демонстрации работы системы, в дальнейшем этот раздел переносится на другой, более вместительный, а место - возвращается под системные нужды. В случае, когда *nix используется второй системой - он не удаляется, но в домашнюю директорию монтируется раздел с данными (не поверх, а отдельно и на видном месте).

Итоговая разбивка диска будет такой:

[boot][XXXXXXXXXXXXXX LVM XXXXXXXXXXXXXXXX]
      ^                                   ^
      [[tmp][swap][      root      ][home]]

На реальный диск это может быть развернуто так:

[boot][XXX LVM XXX][             data               ]

или так:

[system1][         data          ][boot][XXX LVM XXX]

или даже так:

[XXX LVM XXX][             data               ][boot]

В последних 2х случаях есть вероятность того, что система не сможет загрузиться, поскольку нужный раздел может находится за пределами пространства на диске, которое может адресовать BIOS.

win:

Здесь всё проще и одновременно - сложнее.

Поскольку путь к профилям пользователя привязывается к абстрактной «букве диска», которые после развертывания назначаются для остальных разделов произвольно, таких фокусов как с /home - выше - мы позволить себе не можем. Поэтому оставляем всё как есть, после развертывания вручную переносим особо «злачные» места на раздел с данными, обычно это «рабочий стол» и «документы». Кроме того, не существует очевидного способа перенести их так, чтобы сохранились все права на файлы. (да, я знаю про переназначение путей, проблему с файлами это не снимает). монтирование раздела с данными в папку профиля вызывает засорение его настройками, кроме того, это порочная практика для win*.

В новых версиях, начиная с Vista, система при установке норовит выделить себе отдельный раздел под файлы загрузки2, так вот - не давайте ей это делать, иначе после перестановки разделов она не загрузится, поскольку определение раздела с системой происходит старым добрым способом - по номеру в mbr3.

Операции внутри системы

nix:

Как правило необходимы только для данных, идентифицирующих систему - те же ssh-ключи и необходимость убедиться, что initrd собран со всеми возможными драйверами.

Для данных можно написать скриптик, делающий всю работу при первой загрузке и прописать его куда-нибудь в «/etc/rc.local». Важно, чтобы потом он себя оттуда удалил.

win:

Здесь потребуется намного больше действий4. Как минимум нужно убедиться в следующем:

  • используются «стандартные» драйвера для дисковых контроллеров ide.
  • установлен как минимум один sata-контроллер со «стандартными» драйверами ahci-sata
  • отключена вся периферия и оставлено минимум устройств
  • отключены все «сетевые» диски, и очищены все записи в реестре и ссылки, могущие ссылаться на них
  • файловая система раздела не содержит ошибок

Создание эталонного образа

После выполнения всех указанных выше действий можно приступать к сохранению образа системы. Можно довериться автоматике, можно всё сделать вручную. В случае, если вы этот образ планируете разворачивать мультикастом сразу на несколько машин - делайте «автоматически».

В первом случае - выбираем режим сохранения разделов, выбираем нужные, жмем «сохранить» и идем пить чай с доширакой. На выходе получим директорию с десятком файлов, или жуткое сообщение об ошибке.

Во втором случае - придется потратить 5 минут на введение команд. Для случая linux/sdb(sdb1(ext3) sdb2(lvm) <del>sdb3</del>) они будут следующими:

T="/path/to/save/image"
mount "$T" /mnt
fdisk -u -l /dev/sdb >> "$T"
# чтобы впоследствии смотреть геометрию диска и размеры разделов
partclone.ext3 -c -s /dev/sdb1 -o "$T/sda1.ptcl.ext3.uncomp"
# имя может быть любое, но предложенная разработчиками схема достаточно неплоха
partclone.dd   -c -s /dev/sdb2 | gzip -5 - > "$T/sda2.ptcl.lvm-raw.gz"
# в отличие от предыдущей команды - здесь используется несильное сжатие
dd if=/dev/sdb of="$T/mbr.bin" bs=446 count=1
# сохраняем начальный загрузчик
dd if=/dev/sdb of="$T/data-arfer-mbr.bin" bs=512 count=2047 skip=1
# сохраняем данные за mbr.
# 2047 - количество секторов до начала первого раздела
# 512 - размер сектора в байтах
# skip=1 - значит, что мы пропускаем один сектор (т.к. это mbr)

Образ, сделанный "вручную" придется разворачивать так же - вручную. Из плюсов - ничего лишнего.

Развертывание образа / исправление загрузки

По умолчанию - поддерживается только grub (обе ветки) и ntldr, остальные - настраиваются и исправляются вручную.

Теоретическое отступление. Загрузка типового IBM-PC-совместимого компьютера происходит в несколько этапов:

  • BIOS определяет порядок устройств для загрузки, считывает первый сектор с первого доступного устройства в очереди загрузки и передает ему управление.
  • Загруженный сектор (mbr) ищет у себя запись о разделе диска с пометкой 0x80 (загрузочный), опять читает с него один сектор и передает управление ему. Это - вторичный загрузчик.
  • Вторичный загрузчик уже производит необходимые действия для загрузки. Как правило - выводит меню выбора вариантов загрузки, ищет по необходимому смещению на разделе ядро операционной системы, загружает код для обеспечения работы ядра на начальном этапе (тот самый initrd) проводит модификацию флагов разделов в загруженной mbr и т.д..

Всё вышесказанное относится к типовому IBM-PC-совместимому компьютеру с BIOS. На машинах с [U]EFI, думаю всё будет немного по другому. Специфичные шаги для загрузчиков:

grub:

Внимание! grub хранит часть своих данных в области непосредственно за mbr и до начала первого раздела, обычно это - 62 сектора (т.е. 32кб), первый раздел же начинается с 63го. Во второй ветке grub'а - 62х секторов ему уже мало, так что выделяйте 2048 - это рекомендуется по умолчанию большинством дистрибутивов перешедших на него.

При необходимости - редактируется конфиг загрузчика (например - при указании корневого устройства как /dev/hda1, а систему развернули на sda2). Это можно выполнить и в самом меню загрузки, главное - до него добраться.

Коды ошибок: stage1 - первый сектор раздела, stage1.5 - данные за mbr, stage2 - данные и конфигурация основного загрузчика на загрузочном разделе.

ext/syslinux:

Исправляются элементарно:

Для syslinux'а:

syslinux -i -t <offset> [-d dir/] /dev/sdX 
syslinux [-d dir/] -i /dev/sdXY

Где - смещение начала загрузочного раздела в байтах, sdX - устройство, с которого будем грузится. (Обратите внимание - в этом случае - не раздел, а само устройство). Во втором случае - offset - не нужен. Обе команды выше - делают то же самое. Важно! если конфиг лежит не в корне ФС раздела, а в поддиректории - мы должны указать её с помощью параметра «-d» при установке загрузчика.

Для extlinux'а:

extlinux -i /boot/[dir/]

Здесь важно указать правильный путь до директории, где лежит конфиг загрузчика. Символические ссылки поддерживаются. Обратите внимание, что все пути в конфигах пишутся относительно директории с первичным конфигом загрузчика.

Для syslinux загрузочный раздел должен быть отформатирован в ФС FAT, для extlinux, соответственно, - в ext2/3/4/btrfs

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

lilo:

Самый вредный и непредсказуемый из описываемых загрузчиков.

Для установки и изменения параметров требует подобия загруженной системы: как минимум корень с конфигом в /etc/, /boot/ с ядрами и initrd (если он на отдельном разделе), /dev/ для доступа к устройствам и /proc/ для чтения разделов.

Чинится так:

mount /dev/sda2 /mnt/new_root
mount /dev/sda1 /mnt/new_root/boot
mount --bind /dev /mnt/new_root/dev
chroot /mnt/new_root
mount -t proc none /proc
{vi, nano, ed, ...} /etc/lilo.conf
lilo
exit
reboot

Если промахнулись в опциях ядра - вспоминаем, дописываем в приглашении, иначе - вышеуказанное - повторить.

Грабли возможны с параметрами:

  • bigmem - если размер initrd достаточно велик - он перепишет часть кода ядра со всеми вытекающими
  • lba32 - если режим адресации на диске отличается от указанного - longjump промахнется мимо ядра

ntldr:

Второй по вредности и непредсказуемости. Зависит от 3х файлов в корне раздела - ntldr, ntdetect и boot.ini. Первый читается с раздела напрямую по заранее заданному смещению, исправить его можно так:

partclone.ntfsfixboot -w /dev/sdXY

Также, в boot.ini должен быть прописан правильный номер раздела (partition(X), счет начинается с единицы).

ntldr в системах Vista и выше:

Терминальный звиздец, руками из под доса исправлению не поддается, настройки хранит в отдельной ветке реестра. С вероятностью 70% исправляется загрузочным диском/встроенной графической утилиткой. В остальных 30% - в морг^W^W только переустанавливать снова.


  1. наработки [[http://www.idealworldinc.com/partclone-utils/|есть]], но это ещё глубокая альфа ↩

  2. что-то мне это напоминает ↩

  3. что линуксу - хорошо, то венде - смерть :-) ↩

  4. Фактически, подготовка к клонированию здесь начинается с создания своего установочного образа и интеграции драйверов в него. Т.е. поставив систему с «официального» диска, добится нормальной переносимости системы мы не сможем ↩