Welcome to docker.ru hosting provider linux mirror located at Moscow, Russian Federation.
Server configuration: Linux with OpenZFS, 2 x E5-2670v2, 128 GB ECC memory, 12 x 4 TB raidz2 + 1 TB SSD for L2ARC.
Network: 20 gbps uplink, IPv4 (185.253.23.31), IPv6 (2a04:8580:ffff:fffe::2).
My hostname is mirror.docker.ru
В этом разделе описывается клонирование полностью готовых к эксплуатации рабочих станций и серверов. Этот более производительный способ приводится здесь в качестве альтернативы клонирования с помощью программы установки.
эталонный компьютер для создания системы, которую предполагается клонировать в дальнейшем;
дистрибутив 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. Это лучше делать на размонтированных файловых системах, а потому необходимо взять эталонный диск и поставить его в достаточно мощный компьютер с работающей системой и достаточным количеством свободного дискового пространства.
Возможны два варианта получение эталонного образа.
Если все компьютеры имеют одинаковые жёсткие диски, можно использовать утилиту 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
и получить точную копию эталонной машины.
Если на компьютерах установлены разные диски, работать на уровне жёсткого диска (/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-дисками, в «спасательном» режиме придётся загрузить соответствующие модули для доступа к /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 либо все работы проводить с диском, переставленным в рабочую систему (хотя это и не так удобно, как по сети).
При распаковке и записи образа через dd может иметь место ситуация, когда многие гигабайты (например нулей) могли быть сжаты в сотни байт. В этом случае getftp может достаточно долго не запрашивать данные с сервера, пока эти гигабайты будут записаны на целевой диск. В такие моменты сервер может сбросить соединение по тайм-ауту из-за отсутствия активности клиента. Решение проблемы достаточно тривиально: в настройках FTP-сервера увеличьте время тайм-аута или вообще запретите отключение клиентов.