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

 

Введение

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

  • Клонирование итоговой установки одного компьютера на несколько дисков с помощью dd/Clonezilla. Плюс у этого метода очевиден — он универсален и не надо заморачиваться с изучением дистроспецифичных методов развертывания. Минусы, тем не менее, тоже имеют место. Во-первых, конфигурация железа должна совпадать. Во-вторых, при клонировании мы получаем абсолютно точную копию системы — копируются в том числе пароли/SSH-ключи. В случае компрометации одной системы будут скомпрометированы и все остальные.
  • Клонирование по сети. Преимущество перед первым методом — не надо отключать и подключать жесткие диски к клонируемой системе или бегать с флешкой, содержащей клонируемый образ, что для большого числа компьютеров довольно монотонно и смысла не имеет. Минус же, помимо тех, что у предыдущего способа, — сеть может отвалиться, что приведет к простою в развертывании. Впрочем, время простоя всяко меньше, чем если бы устанавливали вручную.
  • Наконец, дистроспецифичные методы. Плюсы — возможно установить по сети, в том числе используя PXE, возможность гибкой конфигурации (в случае разных классов компьютеров, например компы для офиса, компы разработчиков, сервер) — для этого необходимо указать другой файл конфигурации, различие данных, которые клонироваться не должны. Минусы — для каждого дистрибутива способ развертывания свой и синтаксис конфигурационных файлов, соответственно, разный.

В этой статье мы рассмотрим третий метод для RHEL/Fedora и Debian/Ubuntu — эти дистрибутивы, в общем-то, самые распространенные в корпоративной среде, и в них предусмотрены средства автоматизации развертывания.

 

Развертывание Fedora/RHEL с помощью Kickstart

Средство автоматической установки Kickstart в Red Hat появилось очень давно — во всяком случае, в Red Hat Linux 6.2 (не Enterprise!) оно уже присутствовало. Существует три способа создания конфигурационного файла, и их можно комбинировать:

  • Использовать готовый файл, который создается по завершении каждой установки дистрибутивов, основанных на RHEL/Debian.
  • Использовать графический инструмент system-config-kickstart.
  • Наконец, написать ручками.

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

Структура конфигурационного файла kickstart и пример

Условно можно выделить следующие части конфигурационного файла kickstart:

  • тип инсталляции: установка или обновление;
  • выбор языка и раскладки клавиатуры;
  • аутентификация;
  • конфигурация загрузчика;
  • разбиение на разделы;
  • наборы пакетов;
  • постинсталляционные действия.

Вот и пример конфига kickstart (anaconda-ks.cfg) с комментариями:

# Устанавливаем с CD/DVD
install
cdrom
# Конфигурация языка и клавиатуры
lang ru_RU.UTF-8
keyboard us
# Конфигурация сети — используется eth0, адрес IPv4 получаем по DHCP
network --onboot=yes --device=eth0 --ACTIVATE --bootproto=dhcp --noipv6
# Пароль root. В данном примере — 12345
rootpw  --iscrypted $6$tl/40ovclGKvu.em$ozESAVNBRlVVT61DxUpnu72XMAHdDEFv1eOKg9ip9yvbA9a6GkRJi0OiSlMhq8FBtRlF5oi1irV4EInTb7HLo1
# Брандмауэр. Разрешаем доступ к машине по SSH, все остальные входящие подключения запрещаем
firewall --service=ssh
# Пароли хранятся в файле /etc/shadow, алгоритм хеширования — SHA-512
authconfig --enableshadow --passalgo=sha512
# Временная зона
timezone Asia/Omsk
# Конфигурация загрузчика. Ставим в MBR, а в качестве параметров ядра передаем строку через опцию --append
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
# Отключаем постинсталляционную настройку
firstboot --disable
# Разметка диска (исключительно в качестве примера)
clearpart --all --drives=disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0 --initlabel
part --ondisk=disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0 /boot --fstype=ext2 --label=boot --asprimary --size=128
part --ondisk=disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0 swap --fstype=swap --label=swap --size=512
part --ondisk=disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0 / --fstype=ext4 --label=root --size=2048
part --ondisk=disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0 /var --fstype=ext4 --label=var --size=2048
part --ondisk=disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0 /usr --fstype=ext4 --label=usr --size=4096
part --ondisk=disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0 /home --fstype=ext4 --label=home --size=1 --grow
# Создаем нового пользователя. Пароль — 123
user --name=rom --password=$6$V.WpsK6y.OKRmwcC$wFfX8bi5LimfOaXWo1uAaWhf1cQzXQ1vtafQGhU61ri9c2j1t1m.9B4oeCedGWWCqXgwCH0bbuSLHy3lkiy0// --iscrypted

%packages
@base
@client-mgmt-tools
@core
@debugging
@basic-desktop
# <...>
mtools
pax
# <...>
%end
Графическая утилита для создания файлов kickstart
Графическая утилита для создания файлов kickstart

Еще раз хочу отметить, что это всего лишь простейший пример, — в файлах kickstart можно использовать целые сценарии, которые будут выполняться перед установкой и после нее — %pre и %post. В %pre-скрипте, к примеру, можно разметить диск более гибко, чем это позволяют делать штатные методы kickstart, а в %post — совершить некоторые действия по конфигурированию.

 

Создание хешей паролей

Для хеширования паролей можно использовать несколько методов. Наиболее универсальный из них — применение следующего скрипта-однострочника:

$ perl -e 'print crypt("password", q($6$salt$)), "\n";'

Вместо password необходимо задать свой пароль, а вместо salt — случайный набор символов. Результатом будет хеш по алгоритму SHA-512, о чем говорит цифра 6 между знаками доллара (если хочется использовать SHA-256 — используй 5, если MD5 — 1).

Хеширование пароля
Хеширование пароля

Сложная разбивка дисков в kickstart

Для разбиения на разделы используются следующие команды kickstart: autopart, part, raid, volgroup и logvol. Если требуется автоматическая разметка, воспользуйся autopart — к тому же ты можешь выправить размеры разделов ручками с помощью команды part. Однако я бы предпочел полностью ручное разбиение. Порядок создания разделов LVM такой: сперва создаем раздел /boot (обязательно вне LVM), затем с помощью part физический том, потом уже поверх него группу томов, для чего применяем volgroup, и, наконец, используем logvol для создания логических томов с файловыми системами. Программный RAID-массив создается примерно по такой же схеме.

Поскольку разбиение дисков довольно сложная тема, имеет смысл привести фрагмент файла kickstart, где описан вариант создания массива RAID5 с одним запасным устройством, поверх которого создан LVM:

clearpart --all --initlabel --drives=sda,sdb,sdc,sde
# Создаем разделы /boot и swap
part /boot --fstype=ext2 --size=128 --asprimary --ondrive=sda
part swap --hibernation --fstype=swap --asprimary --ondrive=sda
# Создаем разделы для RAID
part raid.01 --size=1 --grow --ondrive=sda
part raid.02 --size=1 --grow --ondrive=sdb
part raid.03 --size=1 --grow --ondrive=sdc
part raid.04 --size=1 --grow --ondrive=sde
# Создаем массив RAID5 с одним резервным диском, поверх которого будет создан физический том LVM
raid pv.01 --device=md0 --level=5 --spares=1 raid.01 raid.02 raid.03 raid.04
# Создаем группу томов LVM и уже поверх нее создаем сами тома
volgroup sysvg pv.01
logvol / --fstype=ext4 --vgname=sysvg --size=2048
logvol /usr --fstype=ext4 --vgname=sysvg --size=4096
logvol /var --fstype=ext4 --vgname=sysvg --size=4096 --maxsize=16384 --grow
logvol /home --fstype=ext4 --vgname=sysvg --size=1 --grow
Итоговый конфиг ks.cfg
Итоговый конфиг ks.cfg

Запуск автоматической установки

Для того чтобы передать установщику, что процедура установки должна производиться с помощью kickstart, нужно указать местонахождение файла kickstart. Для этого используется опция ks=, передаваемая при загрузке с установочного носителя. Варианты местоположения могут быть следующими:

  • Какой-либо накопитель. Указывается так: hd:<имя накопителя>:/ks.cfg. Например,ks=hd:sda1:/ks.cfg. Также допустимо размещение на CD/DVD ks=cdrom:/ks.cfg, что, впрочем, имеет смысл только в случае самосборного образа.
  • NFS. В данном случае указывается через nfs:<имя сервера>:/<путь к файлу ks.cfg>.
  • HTTP/HTTPS. ks=http://192.168.0.1/ks.cfg.

Инфраструктура для развертывания виртуальных машин

Kickstart можно использовать и для развертывания ВМ. Далее я опишу их развертывание на примере VirtualBox и Scientific Linux. Создаем VM из командной строки:

$ VM="SciLinux6"
$ VBoxManage createvm --name "${VM}" --ostype "RedHat" --register

Создаем диски:

$ VBoxManage createhd --filename "VirtualBox/${VM}/${VM}.vdi" --size 32768
$ VBoxManage storagectl "${VM}" --name "SATA Controller" --add sata --controller IntelAHCI
$ VBoxManage storageattach "${VM}" --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium "VirtualBox/${VM}/${VM}.vdi"

512 Мб — минимальный объем памяти, необходимый для установки Scientific Linux:

$ VBoxManage modifyvm "${VM}" --memory 512

Изменяем тип сетевого адаптера — тот адаптер, который стоит по умолчанию, не поддерживает загрузку по сети:

$ VBoxManage modifyvm "${VM}" --nictype1 Am79C973

Установим порядок загрузки:

$ VBoxManage modifyvm "${VM}" --boot1 disk --boot2 net --boot3 none --boot4 none

Не станем рассматривать процесс конфигурирования TFTP. Конфиг pxelinux.cfg/defaultбудет выглядеть следующим образом:

LABEL sl64
KERNEL /sl64/vmlinuz
APPEND initrd=/sl64/initrd.img ks=http://10.0.2.2/ks-vm.cfg

Изменения в файле ks-vm.cfg минимальны:

install
url --url=http://10.0.2.2/sl64
Установка пакета debconf-utils для получения файла ответов на свежеустановленной системе
Установка пакета debconf-utils для получения файла ответов на свежеустановленной системе

INFO

Kickstart доступен и для Ubuntu.
 

Preseed в Ubuntu

В системах на основе Debian есть свое средство автоматизации установки под названием preseed. Существует три способа загрузки файла с заданными параметрами установки:

  • файл в initrd (наиболее сложный способ);
  • файл на самосборном CD или флешке;
  • по сети.

WWW

Документация по preseed: bit.ly/168711o Установка с использованием preseed на VirtualBox: bit.ly/1f5BLYR

В последнем случае необходимо указать как файл, так и его MD5-сумму. Опишем кратко, как грузить файл по сети, а затем создадим самосборный CD со своим файлом preseed. Для загрузки файла по сети в параметрах загрузчика необходимо указать параметр preseed/url=, который можно сократить до url=. Файл рекомендую размещать на внутреннем веб-сервере. Конечный набор параметров будет выглядеть примерно так:

url=http://192.168.0.3/oem.seed preseed/checksum=0adf69ba731d9eeebf468036c9a0c82

А вот для загрузки файла preseed с локального установочного носителя необходимо, во-первых, чтобы он там присутствовал. Во-вторых, нужно опять же указать путь к файлу. И если второе проще простого — для этого используем опцию file=/cdrom/seed/oem.seed в случае установки с CD или file=/media-hd/preseed.cfg в случае установки с флеш-накопителя, — то первое требует более подробного описания. Расскажу, как подготовить ISO-образ с файлом автоматической установки.

Для того чтобы это сделать, нужно перепаковать уже готовый ISO-образ.

### unpack.sh — скрипт для распаковки образа
#!/bin/bash

BUILD=iso
IMAGE=$1
TMPDIR="$(mktemp -d)"

rm -rf $BUILD/
mkdir $BUILD/

# Монтируем образ и копируем файлы
sudo mount -o loop $IMAGE $TMPDIR/
rsync -av $TMPDIR/ $BUILD/
chmod -R u+w $BUILD/
# Подчищаем
sudo umount $TMPDIR
rmdir $TMPDIR

### pack.sh — скрипт для упаковки образа
#!/bin/bash

IMAGE=$1
BUILD=iso

# Вычисляем контрольные суммы
rm $BUILD/md5sum.txt
(cd $BUILD/ && find . -type f -print0 | xargs -0 md5sum | grep -v "boot.cat" | grep -v "md5sum.txt" > md5sum.txt)

# Запаковываем содержимое iso/ в образ
mkisofs -r -V "Ubuntu OEM install" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o $IMAGE $BUILD/

Ну а теперь самое время перейти к описанию файла preseed.cfg.

preseed.cfg — структура и пример

Технология preseed основана на debconf — то есть фактически можно управлять не только процессом установки, но и некоторыми другими вещами. Каждая инструкция preseed вмещается, как правило, в одну строку и состоит обычно из четырех частей, разделенных пробелами: владельца параметра, его имени, типа параметра и его значения. В большинстве случаев в первой части будет стоять d-i, то есть debian installer. А вот вторая часть, собственно, и является, в терминологии debconf, «вопросом», на который в четвертой части задается ответ. Третья же часть инструкции указывает тип вопроса/ответа:

  • string — самый распространенный тип вопроса; строка, содержащая (относительно) произвольные данные;
  • boolean — ответ может быть либо true, либо false;
  • select и multiselect — поскольку вопросы фактически те же самые, что задает программа установки, то среди них могут быть вопросы на выбор одного или нескольких вариантов. Ответ в случае multiselect разделяется запятой и пробелом;
  • password — используется для паролей;
  • note — предупреждение пользователя. Установщик иногда выводит информационные сообщения данного типа. В общем-то, это некритичные предупреждения, но если их проигнорировать в файле ответов, то на них придется отвечать ручками. В данном типе параметра ответа не предусмотрено.

Необходимо учесть также, что стандартный live-дистрибутив для создания своего образа не подходит, поскольку в нем запускается графический установщик ubiquity, а нам необходим Debian Installer. Для этой цели необходимо использовать ISO-образ с постфиксом alternate. Я использовал Xubuntu 12.04.3.

Переупаковываем содержимое ISO-образа
Переупаковываем содержимое ISO-образа

Далее будет приведен урезанный пример файла preseed.cfg с комментариями (файл должен быть в кодировке UTF-8):

# Локализация
d-i debian-installer/locale string ru_RU.UTF-8

# Клавиатура
d-i localechooser/shortlist select RU
d-i console-setup/ask_detect boolean false
d-i console-setup/layoutcode string ru
d-i console-setup/varian select Russia
d-i console-setup/toggle select Ctrl+Shift

# Сеть
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string ubuntu
d-i netcfg/dhcp_failed note
d-i netcfg/dhcp_options select Do not configure the network at this time
# <...>

# Пользователи
d-i passwd/root-login boolean false
d-i passwd/make-user boolean true
d-i passwd/user-fullname string Roman
d-i passwd/username string ubuntu
d-i passwd/user-password-crypted password $6$JZPLyQ9Qx/1$JE9Vk25Ttm4cNiz1/huQ..2xARrB4RrFiFWTXIkk1ojW5dDN5fIisHXUx9Zl.ewceLUQ1Ebw4WPUZvtIVctUd1
d-i user-setup/allow-password-weak boolean true
d-i user-setup/encrypt-home boolean false

# Разбиение диска. Выбираем автоматическое
d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string regular
partman-auto partman-auto/init_automatically_partition select Guided - use entire disk
partman-auto partman-auto/automatically_partition select
d-i partman-auto/purge_lvm_from_device boolean true
d-i partman/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

# Загрузчик
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true

# Настройка репозиториев
d-i apt-setup/restricted boolean true
d-i apt-setup/universe boolean true
# <...>

# Перезагрузка
d-i finish-install/reboot_in_progress note

Для проверки соответствия формату можно использовать команду

$ debconf-set-selections -c preseed.cfg

Чтобы установка была полностью автоматической, необходимо также задать некоторые параметры загрузки — поскольку не все параметры debconf могут быть прочтены установщиком из preseed-файла на ранних стадиях загрузки. Параметры могут дублировать аналогичные строки в файле preseed. Для этого необходимо в распакованном ISO-образе отредактировать файл isolinux/txt.cfg, добавив в него новый пункт меню. У меня получилось примерно следующее:

label oem-install
menu label ^OEM install
kernel /install/vmlinuz
append file=/cdrom/preseed/oem.seed debian-installer/locale=ru_RU.UTF-8    keyboard-configuration/modelcode=SKIP keyboard-configuration/layout=Russian keyboard-configuration/variant=Russian console-setup/toggle=Ctrl+Shift initrd=/install/initrd.gz quiet --

В случае если тебе нужна полностью автоматическая загрузка, измени default install на default oem-install.

Запаковываем образ и, по необходимости записав его на диск, загружаемся с него.

Конфиг isolinux для preseed-установки Ubuntu
Конфиг isolinux для preseed-установки Ubuntu

Обновление Debian до новой версии с помощью preseed

Существует возможность обновить свежеустановленный дистрибутив со старой ветки до новой, используя firstboot-скрипт. Для этого необходимо иметь, во-первых, в локальной сети веб-сервер, с которого скрипты будут загружаться, а во-вторых, сами скрипты и немного подправленный файл preseed. В последнем необходима примерно такая строка:

d-i preseed/late_command string chroot /target sh -c "/usr/bin/curl -o /tmp/postinstall http://webserver/postinstall && /bin/sh -x /tmp/postinstall"

Скрипт же postinstall содержит следующее:

#!/bin/sh

# Скачиваем firstboot-скрипт
/usr/bin/curl -o /root/firstboot http://webserver/firstboot
chmod +x /root/firstboot

# Создаем init-скрипт, который выполняет firstboot-скрипт. Разумеется, это будет работать только при классическом `/sbin/init`, но никак не при новых системах инициализации.
cat > /etc/init.d/firstboot <<EOF
### BEGIN INIT INFO
# Provides:        firstboot
# Required-Start:  $networking
# Required-Stop:   $networking
# Default-Start:   2 3 4 5
# Default-Stop:    0 1 6
# Short-Description: A script that runs once
# Description: A script that runs once
### END INIT INFO

cd /root ; /usr/bin/nohup sh -x /root/firstboot &

EOF

chmod +x /etc/init.d/firstboot
update-rc.d firstboot defaults

echo "finished postinst"

А вот, собственно, и сам скрипт firstboot — в него можно записать что угодно, но ниже будет рассмотрен только скрипт обновления до Wheezy.

#!/bin/sh

# Задержка необходима, поскольку это первый запуск — некоторые службы еще не инициализированы как следует
sleep 30

# Добавляем новый репозиторий apt-get
cat > /etc/apt/sources.list <<EOF
deb http://my-debian-mirror.mydomain.com/debian wheezy main
EOF

/usr/bin/apt-get update

# Предустанавливаем параметры апгрейда
cat > /tmp/wheezy.preseed <<EOF
libc6 glibc/upgrade boolean true
libc6 glibc/restart-services string
libc6 libraries/restart-without-asking boolean true
EOF

/usr/bin/debconf-set-selections /tmp/wheezy.preseed

# Собственно апгрейд дистрибутива
/usr/bin/apt-get -y dist-upgrade

# Удаляем init-скрипт и перезагружаемся
update-rc.d firstboot remove
/sbin/reboot

Preseed и виртуальные машины

Можно установить Debian с помощью virt-install, при этом полностью автоматически:

$ sudo virt-install --connect=qemu:///system     --location=http://ftp.us.debian.org/debian/dists/stable/main/installer\-i386     --initrd-inject=/path/to/preseed.cfg --extra-args="auto" --name d-i --ram=512     --disk=pool=default,size=5,format=qcow2,bus=virtio

Данная команда, хоть и выглядит устрашающе, делает следующее: грузит инсталлятор, инжектит файл preseed.cfg (он должен называться именно так) в initrd и передает аргумент auto инсталлятору. Остальные опции в описании не нуждаются.

К слову, можно легко клонировать уже существующую ВМ KVM, используя следующую команду:

$ sudo virt-clone -o vm1 -n vm2 -m 52:54:00:7A:DF:08 -f /var/lib/libvirt/images/vm2.img

Она создает точный клон (за исключением MAC-адреса) машины vm1, именует ее vm2 и копирует образ диска. Замечу, что, во-первых, гостевая система должна быть остановлена, а во-вторых (и это крайне важно!), на гостевой системе нужно перегенерировать SSH-ключи.

 

Развертывание SUSE Linux Enterprise

Как корпоративный дистрибутив, SUSE также поддерживает автоматическое развертывание. Кратко опишу процесс.

В самом простом случае нужно создать профиль autoyast и при загрузке с помощью PXE указать в файле MARKDOWN_HASHf16a93e4b496631740212f97e1926536MARKDOWN_HASH примерно следующее:

default linux

# default label linux
kernel linux
append initrd=initrd install=http://192.168.1.115/install/suse-enterprise/       autoyast=nfs://192.168.1.110/profiles/autoyast.xml

В более сложных случаях, например для развертывания в гетерогенной сети, нужно создать файл правил MARKDOWN_HASHdf8349fb8855426b967bf1c00a5dbf80MARKDOWN_HASH с описанием условий выбора профиля. Файл этот позволяет очень гибко конфигурировать те или иные условия, но именно эта гибкость и делает развертывание SUSE достаточно сложным.


 

UDPCast — рассылаем файлы по сети

Утилита UDPCast предназначена для одновременной рассылки файлов в локальной сети, для чего используется multicast-рассылка. Эта утилита может быть использована для клонирования систем. Вкратце опишу основные шаги для клонирования:

  • На один компьютер устанавливаем ОС, которая затем будет клонирована.
  • Подготавливаем флешку с UDPCast.
  • Все компьютеры — и клонируемый, и чистые — подключаем к сети. Рекомендуется использовать DHCP.
  • Загружаем клонируемый компьютер с флешки. При этом выбираем клонируемое устройство, а UDPCast переводим в режим передатчика (sender).
  • С этой же флешки загружаются все остальные машины, но вместо режима передатчика нужно выбрать режим приемника (receiver) — при этом на экране машины-передатчика видно, как к ней подключаются приемники.
  • После загрузки всех приемников для запуска процесса клонирования нужно нажать пробел на передатчике.

 

Заключение

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

1 комментарий

  1. 06.10.2014 at 17:31

    За preseed отдельное спасибо

Оставить мнение

Check Also

Конкурс хаков: пишем на PowerShell скрипт, который уведомляет о днях рождения пользователей Active Directory

В компаниях часто встречается задача уведомлять сотрудников о приближающихся днях рождения…