Клонируем ОС автоматически без дополнительных серверов и пакетов

NOTES 21.03.22 21.03.22 77
Бесплатные курсына главную сниппетов

Как-то раз мне пришлось собирать несколько серверов виртуализации, и на них надо было установить порядка 500 машин, каждая из которых должна была быть клонирована.

Самые разношёрстные машины. Некоторые из них жили на Windows, а некоторые на Linux. Машины достаточно самостоятельные. В них уже установлены клиенты, которые занимались подключением и настройкой ОС, но сами ОС необходимо было доустанавливать.И если с Linux у нас всё ещё более-менее просто — rsync и grub, и всё готово, то Windows не настолько “переносимая” ОС (меня ждало создание sysprep образ и клонирование именно его).

Мне не хотелось устанавливать различные инструменты, такие как Puppet или Ansible. Более того, диски различных машин имели разный размер. К сожалению, надо было именно клонировать, а не просто копировать образы qcow дисков.

В итоге, просидев несколько дней над достаточно разрозненной документацией старого, надёжного и проверенного временем инструмента, я нашёл способ легко и безболезненно, а главное — автоматически, клонировать ОС.

Более того, в сети не пришлось устанавливать и настраивать никакие инструменты. Единственное, что мне потребовалось — это SSH сервер, на который были сложены образы ОС.

Итак, под кат.

Пользоваться мы сегодня будем замечательным, но подзабытым инструментом под названием Clonezilla. В своё время Clonezilla была одним из основных инструментов любого системного администратора. Со временем надобность в таком инструменте начала отпадать. Современные VPS предоставляют доступ к уже склонированным серверам, а установка ОС перестала быть занятием, которое отнимает полдня. Но когда вы пытаетесь установить систему на сотни компьютеров, вам не захочется клацать кнопками туда-сюда целый день.

Clonezilla имеет очень обширный инструментарий для заботливого переноса дисковой разметки с одного компьютера на другой. Это не просто dd пространства диска в image где-то на файловой системе. Clonezilla сама обследует наличествующие разметки дискового пространства и предложит воспользоваться partclone, ntfsclone или dd, в зависимости от ситуации.

Всё это происходит с пониманием того, как правильно переносить загрузчики различных ОС на другие разделы. Grub будет аккуратно пересобран под chroot после клонирования, а Winboot соответственно поправлен и ткнут носом туда, откуда его надо грузить.

Более того, несмотря на свой возраст, система не имеет никаких проблем с UEFI, GPT и другими современными системами загрузки, BIOS и разметками дисков.

И что ещё было немаловажно для меня — Clonezilla умеет заботливо изменять конечную файловую систему, чтобы та аккуратно занимала всё доступное место на диске. Вам не надо будет заниматься ресайзингом файловой системы в работающей ОС. В случае Linux это просто лишний скрипт, а в случае с Windows — это та ещё возня.

Самое приятное, вам нужно будет всего лишь расшарить одну папку где-нибудь в сети, чтобы поднять систему клонирования. Не нужно поднимать сервер или писать конфиги к чему-нибудь ещё, есть image, бери и клонируй.

Кстати, до того как клонировать виртуальные ОС, мы склонировали ОС на самих хостах виртуализации. Уж очень всё просто получалось.

Что ж, приступим. Для начала идём на сайт Clonezilla и загружаем рабочий стабильный образ самой Clonezilla. Загрузите iso и zip. Они оба нам понадобятся.

Также я рекомендую вставить iso в какую-нибудь виртуалку и попробовать склонировать её. Clonezilla не прощает людей, которые не читают документацию. Например, с первого раза Linux у меня не запустился. Пришлось пробовать два раза, перед тем как всё действительно нормально заработало.

В интернетах полно инструкций о том, как всё это делать. Можно, например, почитать вот это.

Для простоты я опишу вам, что такое процесс клонирования в Clonezilla.


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

Более благородным и продвинутым вариантом был PXE-boot сервер, который запускал эту Clonezilla по сети и позволял устанавливать ОС по сети.

Сегодня мы попробуем другой подход. Мы создадим iso образ, который будет без каких-либо телодвижений со стороны пользователя устанавливать определённую систему на компьютер.

Итак, первым делом вам нужно будет освоиться с Clonezilla и склонировать хотя бы одну ОС руками. Вам всё равно придётся это сделать хотя бы один раз, перед тем как переходить на клонирование всего этого дела автоматически.


Если вы посмотрите внимательно, то перед самым последним вопросом, перед тем как приступить к клонированию, Clonezilla объявит вам зелёным текстом, что к клонированию готовы, сейчас будем прожигать диски. В следующий раз, если хочется такое повторить, то пользуйтесь вот такой-то командой.

ocs-sr -g auto -e1 auto -e2 -batch -p poweroff -nogui -r -j2 -k1 -scr -icds -p true restoredisk ubuntu-disk-20.04-2022.03.01 vda

Вот это пример того, как я клонирую свои линуксы. Вы можете обратиться к инструкции по ocs-sr, которую кто-то заботливо выложил вот здесь. Все эти мелкие и нечитабельные параметры описываются в документе.

Опять же, эти параметры отражают то, что вы выбрали в TUI интерфейсе перед началом клонирования.

Итак, у вас есть клон, и вы знаете, как его правильно запускать, используя скрипт ocs-sr. Теперь мы можем приступать к созданию нашего собственного образа.

Варианта у нас два:


Я пройдусь по второму варианту, чтобы показать вам, что даже он не так-то и страшен.

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

Начнём.

Первым делом установите все инструменты:

apt install -y xorriso p7zip-full fakeroot binutils isolinux squashfs-tools

После этого вам нужно будет распаковать ZIP архив с Clonezilla. А потом найти файл
live/filesystem.squashfs. Это и есть те самые бинарники и скрипты Live Linux, которые запускает Clonezilla.

Команда unsquashfs распакует файловую систему в заданную директорию.

После этого можно создавать и записывать SSH ключи куда только захочется. Я оставил их в /opt/, потому что директория ~/.ssh для пользователя partimag (который является дефолтным пользователем с id 1000 в Live версии) ещё не создана.

Особое внимание уделяем тому, как и какие права мы раздаём на этот файл. Для того чтобы SSH смог подключиться, вы должны предоставить доступ к файлу для пользователя с id 1000, но ни в коем случае не пытаться делать chmod 777.

Далее давайте подкрутим кое-какие гайки в самом ssh. Конечно же, при подключении к серверу нас будут спрашивать о том, хотим ли мы добавить этот сервер в список надёжных серверов. И нас не просто попросят нажать y на клавиатуре, а ещё и напечатать yes. Это никак не будет считаться автоматической установкой. Посему в /etc/ssh/ssh_config мы добавляем следующие строчки:

    StrictHostKeyChecking no
IdentityFile /opt/ssh/keys/id_rsa
User partimag
IdentitiesOnly yes
UserKnownHostsFile /dev/null

Тут всё понятно, мы просто объяснили ssh, как правильно подключиться к нашему хранилищу образов и при этом не задавать глупых вопросов.

Идём далее.

mksquashfs squashfs-root filesystem.squashfs -b 1024k -comp xz -Xbcj x86 -e boot

После того как мы закончили менять сам Live дистрибутив, мы можем его упаковать обратно с помощью этой команды. Внимательно относитесь ко всем параметрам в этом вызове. Моя копия squashfs была распакована в squashfs-root. А параметры были найдены в непроходимых дебрях документации. С другими параметрами Clonezilla не хотела грузиться.

Отлично. Теперь наш live образ понимает, что такое SSH, и в нём установлен сертификат. Это можно проверить, загрузившись в live и выбрав CMD в TUI. После чего вы просто попадаете в консоль.

ssh-copy-id 10.10.10.1

Все выполняется на ура и правильно копирует публичный ключ на удалённый сервер. Отлично. Теперь мы можем продолжать колдовство.

Все остальные настройки можно проводить без издевательств над squashfs, а просто производя изменения в /syslinux/isolinux.cfg

Давайте туда и заглянем.

(Кстати, если вы захотите сделать подобные изменения в USB версии дистрибутива, то вам придётся производить их в syslinux.cfg)

Итак, смотрим в большой и объёмный файл конфигурации.

Первым делом заменим timeout. Нам не нужно ждать 30 секунд в меню загрузки. Одной — и то много.

timeout 10

Далее находим самую первую строку загрузки и серьёзно поработаем над ней.

append initrd=/live/initrd.img boot=live union=overlay username=user config components quiet noswap edd=on nomodeset enforcing=0 locales=en_US.UTF-8 keyboard-layouts=NONE ocs_prerun1="dhclient -v eth0" ocs_prerun2="sleep 2" ocs_prerun3="sshfs 10.10.10.1:/home/partimag /home/partimag"  ocs_live_run="ocs-sr -g auto -e1 auto -e2 -batch -p poweroff -nogui -r -j2 -k1 -scr -icds -p true restoredisk ubuntu-disk-20.04-2022.03.01 vda" ocs_live_extra_param="" ocs_live_batch="yes" ocs_overwrite_postaction="poweroff-on-restoredisk" noeject vga=788 ip= net.ifnames=0  nosplash i915.blacklist=yes radeonhd.blacklist=yes nouveau.blacklist=yes vmwgfx.enable_fbdev=1

Давайте разберёмся, что тут происходит.

locales=en_US.UTF-8 keyboard-layouts=NONE

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

ocs_prerun1="dhclient -v eth0"
ocs_prerun2="sleep 2"
ocs_prerun3="sshfs 10.10.10.1:/home/partimag /home/partimag"

Следующими тремя опциями мы говорим, что нужно подключиться к dhcp на eth0, подождать пару секунд, а после смонтировать /home/partimag на удалённом сервере по SSH в live образе.

Вы можете добавить ещё ocs_prerun команд, если, например, вам нужно будет смонтировать nfs или samba шару. Но вы учтите, я заморачивался с SSH, потому что мне не хотелось извращаться с запихиванием паролей в систему на этом этапе. Ведь большинство подобных систем не позволяют вводить пароль из консоли, и приходится заниматься чёрт знает чем.

Итак, результатом prerun у нас становится смонтированный раздел с образами ОС.

Далее, собственно говоря, мы запускаем сам скрипт клонирования:

ocs_live_run="ocs-sr -g auto -e1 auto -e2 -batch -p poweroff -nogui -r -j2 -k1 -scr -icds -p true restoredisk ubuntu-disk-20.04-2022.03.01 vda"

(Как раз та команда, на которую я просил вас обратить внимание ранее.)

А после мы добавляем две очень полезные настройки.

ocs_live_batch="yes" ocs_overwrite_postaction="poweroff-on-restoredisk"

Первая подавляет запросы на ввод от пользователя. Учтите, что работает эта команда только с самим скриптом клонирования. Если mount или sshfs попросят вас ввести что-то из консоли, то тут ничего не поможет.

Последняя команда говорит, что систему после успешного клонирования надо выключить.

Давайте теперь соберём всё это воедино:

-as mkisofs -R -r -J -joliet-long -l -cache-inodes -iso-level 3 -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin -partition_offset 16 -A 'Clonezilla live CD' -b syslinux/isolinux.bin -c syslinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot --efi-boot boot/grub/efi.img -isohybrid-gpt-basdat -isohybrid-apm-hfsplus ./ > ../clonezilla-altered.iso

Эта команда создаст новый образ iso со всеми параметрами, которые вы записали в ваш isolinux.cfg.

Теперь у вас в руках бомба.

Будьте аккуратны. Попытка загрузиться с этого диска на работающем компьютере приведёт к полной и безвозвратной потере всех данных. Так что не сохраняйте этот диск в общую папку и не разбрасывайте его направо и налево.

Проверяем.

Загружаем QEMU, создаём новую ОС. Говорим, что будет у нас Linux. Настраиваем размер жёсткого диска. В настройках выбираем “установить ОС из ISO” и указываем ISO, который мы только что создали.

А теперь — добро пожаловать в страну чудес. Всё произойдёт автоматически. Вы просто наблюдаете за тем, как Linux достаточно быстро появляется на новой виртуальной машине.

Изначальный размер диска составлял 25 гигабайт. После клонирования я получил image размером в 8 гигабайт. Установка по сети заняла 3 минуты от начала до конца. (Обычно Ubuntu ставится порядка пяти минут, потому что все пакеты обычно грузятся с репозиториев.)

Но самое главное — вся установка произошла полностью автоматически. Машина выключена, диск из машины изъят.

Теперь просто включаем виртуалку ещё раз и — ура! У вас в руках работающая система.

И вам не нужно было ничего, кроме хранилища файлов.

Естественно, минус этого способа заключается в том, что вам придётся создавать отдельный ISO для каждой системы, которую вы хотите установить. Но, в моём случае это даже упростило установку новых ОС.

Надеюсь это вам поможет.

 

на главную сниппетов
Курсы