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

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   ^
    ^ головняк с версиями лицензий  | нет        | ??       | да        |
    ^ красивый сайт с тонной рекламных лозунгов | нет | да | да |

Ограничения
-----------

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

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

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

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

* нет возможности отдельно настроить опции бэкапа для отдельных разделов, приходится полагаться на автоматику
* начальная поддержка 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, система при установке норовит выделить себе отдельный раздел под файлы загрузки[^fn2], так вот - не давайте ей это делать, иначе после перестановки разделов она не загрузится, поскольку определение раздела с системой происходит старым добрым способом - по номеру в mbr[^fn3].

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

**nix**:

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

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

**win**:

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

* используются «стандартные» драйвера для дисковых контроллеров 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

Где <offset> - смещение начала загрузочного раздела в байтах, 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 только переустанавливать снова.

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

[^fn2]: что-то мне это напоминает

[^fn3]: что линуксу - хорошо, то венде - смерть :-)

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