Серийная установка Master

Олег Власенко

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

Требования

  • эталонный компьютер для создания системы, которую предполагается клонировать в дальнейшем;

  • дистрибутив Linux

  • FTP-сервер с анонимным или авторизованным доступом и достаточным объёмом свободного места, либо возможностью предоставления в сеть содержимого дисков CD-ROM или DVD-ROM.

Подготовка эталонного диска

Создание эталонной системы начинается с инициализации жёсткого диска с целью последующей минимизации архивированных образов. В данном случае под инициализацией понимается процесс записи одинаковых байтов на весь жёсткий диск. Для этого можно подключить его к любой работающей системе, в которой есть командная оболочка, устройство, соответствующее подключённому диску (например, /dev/hda), утилита dd и устройство /dev/zero. Всё необходимое предоставляет «спасательный» режим установочного компакт-диска.

Итак, если эталонным диском будет /dev/hda, то даём команду:

$ dd if=/dev/zero of=/dev/hda

и после достаточно продолжительного ожидания (время зависит от размера и производительности винчестера) получаем диск, полностью записанный байтами 0 (ноль). Время, необходимое на проведение данной процедуры, можно заметно сократить, используя опцию bs команды dd.

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

Создание загрузочных образов

Следующие действия производятся на любой доступной машине с уже установленной операционной системой Linux.

Изготовление загрузочной дискеты

Берём из дистрибутива файл image/network.img и монтируем его командой:

$ mount -t vfat -o loop=/dev/loop0 path/image/network.img /mnt/image

предполагая, что path — это путь до корневого каталога дистрибутива на CD-ROM. Изменим в образе установочной дискеты файл syslinux.cfg, записав в него следующие строчки:

default rescue
...
label rescue
kernel vmlinuz
append ramdisk_size=64000 initrd=network.rdz network rescue rw vga=788

Размер RAM-диска увеличиваем до 32 МБ. Этого должно хватить с избытком (обычно достаточно 20 МБ). Главное, чтобы он был не меньше, чем распакованный файл rescue_stage2.bz2.

Размонтируем /mnt/image и запишем образ на дискету командой:

$ umount /mnt/image && dd if=network.img of=/dev/fd0

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

Изготовление образа второго этапа

Поскольку нам придётся добавить некоторые модули интерпретатора Perl в файл rescue_stage2.bz2, то придётся увеличить размер последнего. Создаём новый файл, файловую систему в нем и монтируем полученный образ:

$ dd if=/dev/zero of=/mnt/image/rescue_stage2 ibs=1024 count=30000
$ mke2fs -qF /mnt/image/rescue_stage2
$ mount -o loop /mnt/image/rescue_stage2 /mnt/disk

Убедиться в том, что образ успешно создан и примонтирован, можно с помощью команды mount, вызванной без параметров. Предварительно распаковав оригинальный образ rescue_stage2.bz2 из дистрибутива, тоже монтируем его:

$ mkdir /mnt/disk.orig
$ bzip2 -dc <path>/Mandrake/base/rescue_stage2.bz2 > /tmp/rescue_stage2
$ mount -o loop /tmp/rescue_stage2 /mnt/disk.orig

Теперь копируем всё содержимое из /mnt/disk.orig в /mnt/disk, чтобы получить образ с содержимым оригинального, но большего размера.

$ umount /mnt/disk.orig
$ rm -f /tmp/rescue_stage2

Теперь так же монтируем установочный образ:

$ bzip2 -dc <path>/Mandrake/base/mdkinst_stage2.bz2 > /tmp/mdkinst_stage2
$ mount -o loop /tmp/mdkinst_stage2 /mnt/disk.orig

В каталоге /mnt/disk.orig нас интересует Perl:

$ cp -R /mnt/disk.orig/usr/lib/perl5 /mnt/disk/usr/lib/perl5

Интерпретатор (/usr/bin/perl) уже есть в rescue_stage2 и его версия та же, что и в mdkinst_stage2.

$ umount /mnt/disk.orig
$ rm -f /tmp/mdkinst_stage2

Теперь последний штрих — сценарий на языке Perl, который будет брать файлы с FTP-сервера и записывать их содержимое в STDOUT. Текст скрипта следующий:

<BEGIN>
#!/usr/bin/perl
use Net::FTP;
$addres=shift(@ARGV);
$file=shift(@ARGV);
$login='anonymous';
$passw='installer@rescue';
$prefix='/pub';
$ftp = Net::FTP->new($addres, Debug => 0) or die '';
$ftp->login($login, $passw) or die '';
$ftp->cwd($prefix);
$ftp->get($file, *STDOUT);
$ftp->quit;
<EOF>

Можно поместить его как /mnt/disk/bin/getftp с правами 0755. В этом скрипте нет проверок вводимых данных и обработок ошибок; если у вас будет желание, вы можете модифицировать этот скрипт по своему усмотрению. Главная рабочая строка этого скрипта:

$ftp->get($file, *STDOUT);

Теперь мы имеем полностью готовый к работе rescue_stage2; всё, что нам нужно, там уже есть.

$ umount /mnt/disk
$ bzip2 -9 /mnt/image/rescue_stage2
$ mkdir /var/ftp/pub/ALTLinux
$ mkdir /var/ftp/pub/ALTLinux/base
$ mv /mnt/image/rescue_stage2.bz2 /var/ftp/pub/ALTlinux/base/

Дальнейшие шаги предполагают, что в текущей системе установлен и работает FTP-сервер с корневым каталогом /var/ftp.

Использование созданных загрузочных образов

Теперь можно загрузить любой компьютер с подготовленной в самом начале дискеты и ввести адрес FTP-сервера, на котором в каталоге /pub лежит образ второго этапа установки. В используемом по умолчанию «спасательном» режиме можно произвести, например, следующие операции:

$ getftp <IP_FTP_SERVER> </path/filename.img.bz2> | \
bzip2 -d -c | dd of=/dev/hda

или:

$ mkfs.ext2 /dev/hda1
$ mount /dev/hda1 /mnt/disk
$ cd /mnt/disk
$ getftp <IP_FTP_SERVER> </path/filename.cpio.bz2> | \
bzip2 -d -c| cpio -i -make-directories
$ chroot /mnt/disk
$ lilo
$ vi /etc/passwd

В данном разделе эти команды приведены только в качестве примера. Ниже назначение этих команд и порядок их использования будут подробно описаны.

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

Эталонные образы системы можно создавать в виде файлов filename.img.bz2 или filename.cpio.bz2. Это лучше делать на размонтированных файловых системах, а потому необходимо взять эталонный диск и поставить его в достаточно мощный компьютер с работающей системой и достаточным количеством свободного дискового пространства.

Возможны два варианта получение эталонного образа.

Вариант 1

Если все компьютеры имеют одинаковые жёсткие диски, можно использовать утилиту dd для создания точной копии эталона. Чтобы после клонирования удостовериться, что полученный диск является точной копией, можно предварительно записать в файл геометрию эталонного командой sfdisk -l. Результат работы этой программы для диска, например, размером 10 ГБ может быть следующим:

Disk /dev/hdd: 1247 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0
Device Boot Start     End   #cyls   #blocks   Id  System
/dev/hdd1          0+    446     447-  3590496   83  Linux
/dev/hdd2        447     498      52    417690   82  Linux swap
/dev/hdd3        499    1246     748   6008310    5  Extended
/dev/hdd4          0       -       0         0    0  Empty
/dev/hdd5        499+   1246     748-  6008278+  83  Linux

Далее делаем сжатый образ:

$ dd if=/dev/hdd | bzip2 -9 -c > Master_hdd.img.bz2
20044080+0 records in
20044080+0 records out

Выкладываем образ на свой FTP-сервер:

$ cp Master_hdd.img.bz2 /var/ftp/pub/

Загрузив компьютер, на который нужно установить систему, с подготовленной дискеты и получив образ второго этапа установки с FTP-сервера, можно дать команду:

$ getftp <IP_FTP_SERVER> /pub/Master_hdd.img.bz2 | \
bzip2 -d -c | dd of=/dev/hda

и получить точную копию эталонной машины.

Вариант 2

Если на компьютерах установлены разные диски, работать на уровне жёсткого диска (/dev/hda) нельзя и придётся перейти на уровень разделов (/dev/hda1, /dev/hda2 и т.д.). В этом может помочь утилита cpio, которая архивирует все типы файлов (в том числе устройства и сокеты) со всеми свойствами и правами. При использовании cpio необязательно обнулять диск, поскольку она работает уже поверх файловой системы.

Делаем архив эталонного корневого раздела, предполагая, что он находится в /dev/hdd1, и выкладываем его на FTP-сервер:

$ mount /dev/hdd1 /mnt/disk
$ cd /mnt/disk
$ find ./ | cpio -o | bzip2 -9 -c > /tmp/hda1.cpio.bz2
$ cp /tmp/hda1.cpio.bz2 /var/ftp/pub/

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

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

Чтобы воссоздать раздел /, смонтированный в /mnt/disk, нужно сделать следующее:

$ cd /mnt/disk
$ getftp <IP_FTP_SERVER> /pub/hda1.cpio.bz2 | \ 
bzip2        -d -c|  cpio -i -make-directories

Далее нужно повторить аналогичные операции для остальных разделов. По окончании копирования не забудьте про установку LILO или GRUB в новую систему.

Размещение эталонных образов

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

Потенциальные проблемы

Используя данный метод, можно столкнуться с рядом проблем.

SCSI-диски

Чтобы работать со SCSI-дисками, в «спасательном» режиме придётся загрузить соответствующие модули для доступа к /dev/sda, /dev/sdb:

$ modprobe <имя_модуля_для_SCSI_адаптера>
$ modprobe sd_mod

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

Ограничение на размер файла

Если результирующий сжатый образ окажется больше 2 ГБ, то возможны проблемы с хранением таких файлов на сервере со старой реализацией файловой системы Ext2. В этом случае рассмотрите возможность использования программы split в конце конвейера архивации и вызова утилиты cat в скрипте getftp для сборки при записи на диск. Программы split и cat уже есть в образе rescue_stage2.bz2.

Другой вариант создания больших образов — размещение их на ReiserFS 3.6[3] или выше.

Существенные различия в аппаратной комплектации между эталонным и создаваемыми на его основе компьютерами

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

Наличие сбойных или нестабильных секторов на эталонном и/или целевом диске

В этом случае работа через cpio теоретически должна быть менее чувствительна к подобным неприятностям.

Экзотическая сетевая карта

Если ядро, загруженное с дискеты с network.img, не смогло «поднять» интерфейс eth0 и это не удалось сделать в ручном режиме — вам не повезло. В качестве решения можно предложить модифицировать содержимое network.img либо все работы проводить с диском, переставленным в рабочую систему (хотя это и не так удобно, как по сети).

Тайм-ауты сброса соединения на FTP-сервере

При распаковке и записи образа через dd может иметь место ситуация, когда многие гигабайты (например нулей) могли быть сжаты в сотни байт. В этом случае getftp может достаточно долго не запрашивать данные с сервера, пока эти гигабайты будут записаны на целевой диск. В такие моменты сервер может сбросить соединение по тайм-ауту из-за отсутствия активности клиента. Решение проблемы достаточно тривиально: в настройках FTP-сервера увеличьте время тайм-аута или вообще запретите отключение клиентов.



[3] ReiserFS версии 3.5.х также обладает этим неприятным ограничением