Установка убунту из по сети. PXE — грузим всё! Осваиваем мультизагрузку по локальной сети. Настройка динамического получения IP-адреса
В статье он упомянул о возможности установки «С помощью загрузки по сети (PXE boot)», благодаря чему я решил наконец написать материал по созданию сервера pxe boot.
Повествование будет вестись на примере всё той же ОС - Debian (так что пути и команды у вас могут отличаться).
Для начала - поставим tftp -сервер. Смотрим доступные варианты (apt-cache search tftp | fgrep server
):
- atftpd
- dnsmasq
- tftpd
- tftpd-hpa
- tftpd-hpa:
Устанавливаем пакет, редактируем файл /etc/default/tftpd-hpa , дабы демон знал, что ему стоит жить:#Defaults for tftpd-hpa
RUN_DAEMON="yes"
OPTIONS="-l -s /var/lib/tftpboot"Создаём нужный каталог: mkdir /var/lib/tftpboot , и стартуем сервис invoke-rc.d tftpd-hpa start
- atftpd:
После установки обнаруживаем, что по-умолчанию этот сервис работает через inetd. Я, почему-то, не фанат этого метода, поэтому первым делом закомментировал соответствующую строку в /etc/inetd.conf . Затем редактируем /etc/default/atftpd :USE_INETD=false
OPTIONS="--daemon --tftpd-timeout 1500 --no-multicast --retry-timeout 20 --logfile /var/log/atftpd.log --maxthread 100 --verbose=5 /var/lib/tftpboot"--tftpd-timeout - время жизни потока, при отсутствии запросов
--retry-timeout - таймаут отдачи файла
у меня установлены большие таймауты, т.к. сервис транслируется в городскую локальную сеть, которая периодически прогибается от обилия абонентов, и не справляется с потоком запросов.
Ну и, как и в предыдущем пункте, - создаём нужный каталог: mkdir /var/lib/tftpboot , и стартуем сервис invoke-rc.d atftpd start
Далее - настройка dhcp:
- dhcp3:
В конфигурационный файл /etc/dhcp3/dhcpd.conf добавляем информацию о загрузке:Filename "pxelinux.0";
next-server; Если tftpd установлен на том же сервере, что и dhcpd - директиву next-server можно опустить. И перезапускаем dhcp3-server: invoke-rc.d dhcp3-server restart
- dnsmasq:
В конфиг /etc/dnsmasq.conf дописываем:Dhcp-boot=pxelinux.0,
, Опять же, если сервера tftp и dhcp совпадают - последние 2 атрибута можно не заполнять. Перезапускаем: invoke-rc.d dnsmasq restart
Идём на ftp.debian.org , выбираем каталог installer-* , соответствующий необходимой архитектуре. Затем переходим в директорию current/images/netboot внутри мы найдём файлы netboot.tar.gz и gtk/netboot.tar.gz - это файлы текстовой и графической установки соответственно. Выбираем понравившийся, качаем и распаковываем в /var/lib/tftpboot .
Осталось убедиться, что зазрешён доступ на 69 UDP порт, и можно пользоваться прелестями сетевой установки.
В качестве бонуса прилагаю меню, которое получилось у меня в результате нескольких дней издевательств:
В текущей конфигурации возможна установка нескольких ОС (установка Debian возможна как в текстовом, так и в графическом режиме), загрузка xUbuntu (через nfs), SystemRescueCD (через http-boot), memtest86 (через tftp). Установка всех ОС возможна для 2 архитектур - x86 и x64. Т.к. у меня лежит внутрисетевое зеркало репозиториев Ubuntu 8.10 и Debian 5.0, то установщики не предлают выбор репозитория, а автоматически сливают всё с него.
Скриншоты.
В данной статье будет рассмотрена установка Ubuntu Linux из репозитория с сетевой загрузкой.
Итак, на клиентские компьютеры будем устанавливать Ubuntu 10.04 с сервера 192.168.0.3, на котором находится сервер сетевой загрузки и dhcpd. Для установки в репозитории обязательно должен быть каталог dists/lucid/main/debian-installer. Если добавить подобные каталоги для других репозиториев (multiverse, universe, restricted), то на этапе «Выбор и установка программного обеспечения» список ПО будет больше. В данном руководстве рассмотрю именно этот вариант. Если вы делали зеркало debmirror, то у вас его, скорее всего, этих каталогов вообще нет. Скачать их можно, например, с ftp://mirror.yandex.ru. Так же во время установки инсталлятор вне зависимости от выбранного репозитория часто обращается к security.ubuntu.com.
Шаг 1: Установка сервера
Установка необходимых приложений:
apt-get install tftpd-hpa openbsd-inetd
Скачиваем и распаковываем образ для сетевой установки:
tar -xvzf netboot.tar.gz -C /var/lib/tftpboot/
chown -R nobody:nogroup /var/lib/tftpboot
Для сетевой загрузки необходимо передать клиенту 2 параметра: имя файла загрузки и сервер загрузочного файла (в dhcpd это параметры filename и next-server) :
next-server 192.168.0.3;
filename «pxelinux.0»;
Сервер установлен, можно ставить систему.
Шаг 2: Установка системы
Для установки системы с сервера в сети необходимо разрешить в BIOS загрузку по сети (PXE). Если ваш bios поддерживает boot menu, то лучше для выбора загрузочного устройства воспользоваться именно им — чтобы не было проблем, если забудешь изменить порядок загрузки.
Если всё хорошо, то перед вами будет экран приветствия установщика:
- Basic Ubuntu Server
- Сервер имён (DNS)
- Edubuntu server
- LAMP server
- Почтовый сервер
- OpenSSH server
- PostgreSQL database
- Сервер печати
- Samba file server
- Ubuntu Enterprise Cloud
- Virtual Machine host
- 2D/3D creation and editing suite
- Audio creation and editing suite
- Edubuntu KDE desktop
- Edubuntu desktop
- Kubuntu desktop
- Kubuntu netbook
- LADSPA and DSSI audio plugins
- Large selection of font packages
- Mythbuntu additional roles
- Mythbuntu frontend
- Mythbuntu master backend
- Mythbuntu slave backend
- Ubuntu Netbook
- Ubuntu Desktop
- Video creation and editing suite
- Xubuntu desktop
- Manual package selection
В статье он упомянул о возможности установки «С помощью загрузки по сети (PXE boot)», благодаря чему я решил наконец написать материал по созданию сервера pxe boot.
Повествование будет вестись на примере всё той же ОС - Debian (так что пути и команды у вас могут отличаться).
Для начала - поставим tftp -сервер. Смотрим доступные варианты (apt-cache search tftp | fgrep server
):
- atftpd
- dnsmasq
- tftpd
- tftpd-hpa
- tftpd-hpa:
Устанавливаем пакет, редактируем файл /etc/default/tftpd-hpa , дабы демон знал, что ему стоит жить:#Defaults for tftpd-hpa
RUN_DAEMON="yes"
OPTIONS="-l -s /var/lib/tftpboot"Создаём нужный каталог: mkdir /var/lib/tftpboot , и стартуем сервис invoke-rc.d tftpd-hpa start
- atftpd:
После установки обнаруживаем, что по-умолчанию этот сервис работает через inetd. Я, почему-то, не фанат этого метода, поэтому первым делом закомментировал соответствующую строку в /etc/inetd.conf . Затем редактируем /etc/default/atftpd :USE_INETD=false
OPTIONS="--daemon --tftpd-timeout 1500 --no-multicast --retry-timeout 20 --logfile /var/log/atftpd.log --maxthread 100 --verbose=5 /var/lib/tftpboot"--tftpd-timeout - время жизни потока, при отсутствии запросов
--retry-timeout - таймаут отдачи файла
у меня установлены большие таймауты, т.к. сервис транслируется в городскую локальную сеть, которая периодически прогибается от обилия абонентов, и не справляется с потоком запросов.
Ну и, как и в предыдущем пункте, - создаём нужный каталог: mkdir /var/lib/tftpboot , и стартуем сервис invoke-rc.d atftpd start
Далее - настройка dhcp:
- dhcp3:
В конфигурационный файл /etc/dhcp3/dhcpd.conf добавляем информацию о загрузке:Filename "pxelinux.0";
next-server; Если tftpd установлен на том же сервере, что и dhcpd - директиву next-server можно опустить. И перезапускаем dhcp3-server: invoke-rc.d dhcp3-server restart
- dnsmasq:
В конфиг /etc/dnsmasq.conf дописываем:Dhcp-boot=pxelinux.0,
, Опять же, если сервера tftp и dhcp совпадают - последние 2 атрибута можно не заполнять. Перезапускаем: invoke-rc.d dnsmasq restart
Идём на ftp.debian.org , выбираем каталог installer-* , соответствующий необходимой архитектуре. Затем переходим в директорию current/images/netboot внутри мы найдём файлы netboot.tar.gz и gtk/netboot.tar.gz - это файлы текстовой и графической установки соответственно. Выбираем понравившийся, качаем и распаковываем в /var/lib/tftpboot .
Осталось убедиться, что зазрешён доступ на 69 UDP порт, и можно пользоваться прелестями сетевой установки.
В качестве бонуса прилагаю меню, которое получилось у меня в результате нескольких дней издевательств:
В текущей конфигурации возможна установка нескольких ОС (установка Debian возможна как в текстовом, так и в графическом режиме), загрузка xUbuntu (через nfs), SystemRescueCD (через http-boot), memtest86 (через tftp). Установка всех ОС возможна для 2 архитектур - x86 и x64. Т.к. у меня лежит внутрисетевое зеркало репозиториев Ubuntu 8.10 и Debian 5.0, то установщики не предлают выбор репозитория, а автоматически сливают всё с него.
Скриншоты.
В серверных всё чаще попадаются сервера без CD/DVD-приводов. Время от времени на них нужно ставить операционную систему, и в этом может сильно помочь установка по сети. Вы просто включаете сервер и начинаете установку. Сетевая карта должна поддерживать технологию PXE. PXE - Pre-Boot Execution Environment - позволяет осуществлять загрузку по сети.
Но PXE недостаточно для полного счастья, технология, которая позволит полностью автоматизировать установку - kickstart (разработчиком которой является компания Red Hat). Суть её проста - мы заранее составляем файл, содержащий значения всех опций, которые могут понадобиться в ходе установки. Более того, мы можем выполнять свои скрипты до установки и после, тем самым задавая настройки будущей ОС.
Установка с помощью kickstart типового комплекта Linux занимает 5-7 минут.
Для Install-сервера нужно 3 службы и 1 пакет.
- DHCP предоставляет клиентам сетевые реквизиты
- TFTP - простой способ предоставить доступ к файлам по сети
- Syslinux содержит загрузчик pxelinux.0 и некоторые другие файлы
- NFS предоставляет доступ к файловой системе по сети
- pxe - прошивка pxe начинает свою работу, когда мы в BIOS выставляем установку по сети, или когда на HDD не найдена MBR.
- DHCP фаза 1 - клиент получает сетевые реквизиты и адрес tftp-сервера, а также название файла-загрузчика (pxelinux.0). По умолчанию TFTP-сервер - это DHCP-сервер.
- TFTP - загрузчик pxelinux.0 обращается к TFTP-серверу и запрашивает у него initrd.img (Initial RAM disk, временная файловая система), ядро Linux.
- Kernel - передача управления ядру Linux.
- DHCP фаза 2 - ядро Linux делает запрос к DHCP-серверу, чтобы получить сетевые реквизиты и в дальнейшем адрес NFS-сервера.
- NFS - этап, когда монтируется NFS-раздел
- init - происходит запуск /sbin/init, и управление передаётся ему. Init - это главный процесс в системе, другие процессы являются дочерними процессами init.
DHCP-сервер ожидает bootp-запросы в своей сети; после того, как он получает запрос, он смотрит MAC-адрес источника, и если о таком MAC-адресе у него имеется соответствующая запись, он начинает с ним работать. DHCP-сервер выдаёт клиенту сетевые реквизиты (IP-адрес, gateway, DNS-сервера,...) и по протоколу TFTP, с помощью TFTP-сервера, отправляет загрузочный образ pxelinux.0. Этого образа хватает, чтобы вывести меню выбора ОС.
Выбрав ОС, мы начинаем загрузку ядра и начинаем инсталляцию, в процессе выбрав источник установки — NFS-сервер. На NFS-сервер нужно выложить подготовленный контент будущей операционной системы и убедиться, что соответствующие каталоги экспортированы.
DHCP
Устанавливаем DHCPD и добавляем его в автозагрузку:# yum -y install dhcp
# chkconfig dhcpd on
Файл /etc/dhcpd.conf делаем такой:
Ddns-update-style interim;
ignore client-updates;
subnet 192.168.146.0 netmask 255.255.255.0 {
option routers 192.168.146.1;
option subnet-mask 255.255.255.0;
option domain-name «domain.local»;
option domain-name-servers 192.168.146.1;
default-lease-time 21600;
max-lease-time 43200;
Allow bootp;
Allow booting;
host unixbox {
hardware ethernet 00:0c:29:77:9c:9c;
fixed-address 192.168.146.128;
filename «pxelinux.0»;
option host-name «unixbox»;
next-server 192.168.146.1;
}
}
Запускаем DHCPD или перезагружаем, если он был запущен:
# service dhcpd restart
Отключаем файрвол, включённый по умолчанию (иначе на целевом компьютере при загрузке будет ошибка "ICMP Destination unreachable (Host administratively prohibited)"):
# service iptables stop
# chkconfig iptables off
TFTP
Устанавливаем пакет tftp-server из репозитория:# yum -y install tftp-server
Теперь необходимо включить tftp в конфигурацию xinetd, для этого в файле /etc/xinetd.d/tftp меняем “disable = yes” на “disable = no” и включаем xinetd:
# service xinetd start
Проверяем, что порт tftp-сервера прослушивается (tftp работает на порту 69):
# netstat -nlp | grep:69
udp 0 0 0.0.0.0:69 0.0.0.0:* 3105/xinetd
Syslinux
Пакет содержит набор файлов для загрузки по сети. Нам нужны pxelinux.0 , который как загрузочный образ мы будем отдавать через DHCP, и menu.c32 , с помощью которого будет рисоваться более привлекательное меню пользователя. (Для CentOS 4 обновлённый syslinux с зависимостями надо скачать с rpmfind.net .) # cp $(rpm -ql syslinux | grep menu.c32) /tftpboot/
# cp $(rpm -ql syslinux | grep pxelinux.0) /tftpboot/
NFS
По умолчанию в системе, скорее всего, есть NFS, если нет, то поставьте с помощью yum.# chkconfig nfs on
В файл /etc/exports добавляем запись:
echo “/var/install-server/ *(ro,no_root_squash)” >> /etc/exports
Запускаем nfs-сервер:
# service nfs start
Проверяем, что каталог экспортирован:
# exportfs
/var/install-server
Создаём структуру tftp-сервера, добавляем контент на сервер:
# mkdir -p /tftpboot/{pxelinux.cfg,centos5_x86}
# mkdir -p /var/install-server/centos5_x86
Монтируем наш DVD с CentOS 5 и закачиваем содержимое в /var/install-server/centos5_x86:
# mount /dev/cdrom /mnt/
# cp -r /mnt/* /var/install-server/centos5_x86/
# cp /var/install-server/centos5_x86/images/p xeboot/* /tftpboot/centos5_x86/
В каталоге /tftpboot/pxelinux.cfg создаём файл default и заполняем его как показано ниже:
default menu.c32
prompt 0
timeout 100
kernel /centos5_x86/vmlinuz
append initrd=/centos52_x86/initrd.img
label Quit
localboot 0
Устанавливаем ОС по сети
После всех манипуляций, описанных выше, можем приступить к установке ОС. Стартуем нашу машину с MAC-адресом 00:0c:29:77:9c:9c, включив в BIOS загрузку по сети. Когда начнётся установка, всё делаем стандартным образом, кроме того, что в списке, откуда ставить ОС, нужно выбрать NFS, и далее, когда попросят, указать:NFS server name: 192.168.146.1
CentOS directory: /var/install-server/centos5_x86
Автоматизация установки с помощью Kickstart
Для автоматизации нужно создать файл, содержащий всю нужную информацию, которая может потребоваться в процессе установки. Такой файл создаётся программой system-config-kickstart (GUI tool) в любой CentOS с X Window:# yum -y install system-config-kickstart
# system-config-kickstart
После того, как мы создали файл с помощью system-config-kickstart, его нужно перенести на Install-сервер и сделать доступным по одному из протоколов HTTP, NFS или FTP. Поскольку в работе Install-сервера активно используется NFS, то и будем использовать её.
В моём случае kickstart-файл лежит в /var/install-server/centos5_x86/centos5_ x86_ks.cfg .
В файл /tftpboot/pxelinux.cfg/default нужно всего лишь добавить директиву ks с указанием местоположения kickstart-файла. Пример с kickstart-файлом:
default menu.c32
menu title Linux Install Server. Please choose OS to install.
prompt 0
timeout 100
label CentOS 5 x86 Custom install
kernel /centos5_x86/vmlinuz
append initrd=/centos5_x86/initrd.img
label CentOS 5 x86 Kickstart Install
kernel /centos52_x86/vmlinuz
append initrd=/centos5_x86/initrd.img ks=nfs:192.168.146.1:/var/install-server/c entos5_x86/centos5_x86_ks.cfg
label Quit
localboot 0
Теперь, выбрав «CentOS 5 x86 Kickstart Install» в меню выбора ОС, нам останется только подождать сервера с установленной на нём ОС.
Ниже пример моего Kickstart-файла. Мне захотелось, чтобы в установленной ОС в настройках sshd была опция «PermitRootLogin yes» . Kickstart-файл позволяет не только задавать параметры установки ОС, но и выполнять скрипты, до инсталляции (%pre) и после (%post). Таким образом можно написать массу скриптов по тюнингу и за 5-10 минут инсталляции получить полностью готовую ОС.
#platform =x86, AMD64, or Intel EM64T
# System authorization information
auth --useshadow --enablemd5
# System bootloader configuration
bootloader --location=mbr
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
# Use text mode install
text
# Firewall configuration
firewall --disabled
# Run the Setup Agent on first boot
firstboot --disable
# System keyboard
keyboard us
# System language
lang en_US
# Installation logging level
logging --level=info
# Use NFS installation media
nfs --server=192.168.146.1 --dir=/var/install-server/centos5_x86
# Network information
network --bootproto=dhcp --device=eth0 --onboot=on
#Root password
rootpw --iscrypted $1$Bz09jb2I$hfzh2vApqMjG0sEPsAwNr/
# SELinux configuration
selinux --disabled
# Do not configure the X Window System
skipx
# System timezone
timezone Europe/Moscow
# Install OS instead of upgrade
install
# Disk partitioning information
part swap --bytes-per-inode=4096 --fstype=”swap” --size=512
part / --bytes-per-inode=4096 --fstype=”ext3” --grow --size=1
%post --interp /bin/bash
PATH=/somework
/bin/mkdir $PATH
/bin/sed -e ‘s/#PermitRootLogin yes/PermitRootLogin yes/g’ /etc/ssh/sshd_config > $PATH/sshd_config_edited
/bin/cp $PATH/sshd_config_edited /etc/ssh/sshd_config
/bin/rm -rf $PATH