Выполнение установки по сети позволяет производить установку на большом количестве ПК одновременно. Не нужно подходить к каждому ПК с загрузочным носителем, содержащим дистрибутив ОС. Можно настроить процесс установки таким образом, что достаточно будет только выбрать тип ОС, которую необходимо установить, запустить установку и забыть про этот процесс. На выходе получаем готовый ПК со всеми необходимыми настройками и набором ПО. Системы будут загружаться при помощи PXE (Preboot Execution Environment) с использованием загрузочного образа, расположенного на сервере, после чего будет запущена программа установки.
Для того, что бы настроить такую систему нужно произвести три основных шага:
- Настроить сервер (
NFS
,HTTPS
,HTTP
,FTP
), на котором размещается установочная структура (сам дистрибутив ОС) - Настроить сервер TFTP, который будет отвечать за PXE загрузку.
- Настроить сервер DHCP, для того, что бы клиенты знали, где находится PXE сервер.
Для решения поставленной задачи будем использовать сервера с ОС CentOS 7. В принципе все можно сделать на одном сервере, но т.к. у нас в сети уже есть DHCP сервер (о его настройках рассказывалось здесь), то нам останется только поднять сервер, на котором будут храниться дистрибутивы ОС и настроить TFTP и HTTP сервисы.
Сервер хранения дистрибутивов.
Дистрибутивы ОС могут раздаваться различными способами : NFS, HTTP или FTP. В случае использования NFS дистрибутив достаточно хранить в виде ISO файла. Но здесь мы рассмотрим способ раздачи по HTTP. Т.к. для этих целей не требуется каких-либо "навороченных" настроек web-сервера, я решил использовать в NGINX с самыми простыми настройками.
Создаем корневой каталог web-сервера:
# mkdir -p /opt/PXE/www
Устанавливаем ПО:
# yum install nginx
Редактируем файл конфигурации /etc/nginx/nginx.conf
. Файл должен будет иметь примерно такой вид:
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /opt/PXE/www; # Корневая папка web-сервера # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { autoindex on; # включаем просмотр каталога через браузер } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } }
Запускаем сервис и разрешаем его автозапуск:
# systemctl start nginx # systemctl enable nginx
Далее необходимо поместить установочные файлы в папку на вновь созданном web-сервере. Допустим у на имеется iso файл с ОС Centos centos.iso
. Необходимо смонтировать его и скопировать содержимое в указанное место неа web-сервере.
Создаем папку, куда поместим содержимое установочного диска:
# mkdir /opt/PXE/www/CentOS
Смонтируем iso файл в папку /mnt:
# mount mount -o loop,ro -t iso9660 /путь/к/centos.iso /mnt
Копируем содержимое iso в папку на web-сервере. После этого не забываем отмонтировать iso файл:
# cp -r /mnt/ /opt/PXE/www/CentOS/ # umount /mnt
Теперь при заходе браузером на сервер дистрибутивов http://server/CentOS мы сможем увидеть все содержимое установочного диска.
Настраиваем TFTP сервер.
Следующитй шаг - настройка TFTP-сервера. Его можно так же назвать PXE-сервером. Этот сервер предназначен для того, что бы выдавать загрузочные образы клиентам, выбравшим сетевую загрузку ПК.
Устанавливаем ПО TFTP-сервера:
# yum install tftp-server
Приводим файл /etc/xinetd.d/tftp
к виду (если хотим работать посредством xinetd
):
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = /opt/PXE/tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
Т.е. задаем папку, где будут храниться файлы раздаваемые tftp-сервером и разрешаем сервис как таковой.
Мне не очень хочется завязывать на xinetd, поэтому вносим изменения в файл /usr/lib/systemd/system/tftp.service
:
[Unit]
Description=Tftp Server
Requires=tftp.socket
Documentation=man:in.tftpd
[Service]
ExecStart=/usr/sbin/in.tftpd -s /opt/PXE/tftpboot
StandardInput=socket
[Install]
Also=tftp.socket
Т.е. так же задаем папку для хранения раздаваемых файлов.
Затем запускаем сервис tftpd и разрешаем его автозапуск при старте системы.
# systemctl start tftp.socket # systemctl enable tftp.socket
Далее настраиваем сервер для ответов по PXE.
Нам понадобится файл pxelinux.0
из пакета SYSLINUX, который включен в ISO-образ. Чуть раньше мы скопировали дистрибутив в папку сервера /opt/PXE/www/CentOS
. Копируем файл пакета syslinux
в какую-либо папку папку:
# cp -pr /opt/PXE/www/CentOS/Packages/syslinux-версия-архитектура.rpm /рабочая_папка
Распаковываем пакет:
# cd /рабочая_папка # rpm2cpio syslinux-версия-архитектура.rpm | cpio -dimv
Копируем файл pxelinux.0 в корневую папку tftp-сервера
# cp /рабочая_папка/usr/share/syslinux/pxelinux.0 /opt/PXE/tftpboot/
Для создания меню выбора загрузки PXE понадобятся еще некоторые файлы. Они находятся в той же папке распакованного пакета SYSLINUX. Копируем их в корень TFTP-сервера:
# cp /рабочая_папка/usr/share/syslinux/menu.c32 /opt/PXE/tftpboot/ # cp /рабочая_папка/usr/share/syslinux/memdisk /opt/PXE/tftpboot/ # cp /рабочая_папка/usr/share/syslinux/mboot.c32/opt/PXE/tftpboot/ # cp /рабочая_папка/usr/share/syslinux/chain.c32 /opt/PXE/tftpboot/ # cp /рабочая_папка/usr/share/syslinux/vesamenu.c32 /opt/PXE/tftpboot/
Если необходимо использовать в меню кирилицу, то так же понадобиться файл кирилических шрифтов. Можно использовать например этот: Cyr_a8x16.psf.gz. Распаковываем и копируем в корень TFTP-сервера.
Так же понадобятся загрузочные файлы ядра, находящиеся в папке images/pxeboot
установочного диска ОС. Создаем в корне TFTP-сервера папку CentOS и коипруем туда соответствующие файлы:
# mkdir /opt/PXE/tftpboot/CentOS # cp /opt/PXE/www/CentOS/images/pxeboot/{vmlinuz,initrd.img} /opt/PXE/tftpboot/CentOS/
Создаем файл конфигурации в pxelinux.cfg/
(именно там сервер будет искать свою конфигурацию). Имя файла может быть определено как default
или сформировано на основе IP-адреса системы. Например, компьютеру с адресом 10.0.0.1 будет соответствовать файл 0A000001
. Создаем папку конфигурации в корне tftp-сервера и помещаем туда файл примерно со следующего содержания:
default vesamenu.c32 FONT Cyr_a8x16.psf prompt 0 timeout 300 ONTIMEOUT local MENU TITLE PXE Menu #Local HHD0 Boot LABEL local MENU LABEL Boot From Local HDD0 LOCALBOOT 0 LABEL CentOS 7 x86_64 MENU LABEL Установка CentOS 7 x86_64 (интерактивный режим) KERNEL CentOS/vmlinuz APPEND initrd=CentOS/initrd.img ramdisk_size=100000 ip=dhcp inst.repo=http://ip_адрес_сервера_tftp/CentOS
В получившемся конфиге указано, что надо подгружать файл кирилических шрифтов и два пункта меню: загрузка с локального HDD и "Установка CentOS 7 x86_64". Если в течении задонного таймаута не происходит нажатия клавиш, то загружается пункт меню, отвечающий за загрузку ПК с локального диска без установки ОС.
Настраиваем DHCP сервер
Для того, что бы новый ПК смог увидеть PXE сервер и, соответственно, смог запустить установку ОС, необходимо в настройках DHCP сервера указать соответствующие параметры.
Предусмотрим, что ПК имеют два типа Firmware: классический BIOS и UEFI. Соответственно DHCP сервер по разному определяет эти ПК. В файл /etc/dhcp/dhcpd.conf
вносим соответствующие строки (в глобальные настройки или в раздел, отвечающий за конкретный диапазон IP):
allow booting; allow bootp; option space pxelinux; option pxelinux.magic code 208 = string; option pxelinux.configfile code 209 = text; option pxelinux.pathprefix code 210 = text; option pxelinux.reboottime code 211 = unsigned integer 32; class "pxeclients" { match if substring (option vendor-class-identifier, 0, 9) = "PXEClient"; next-server 172.28.130.148; #Адрес сервера PXE if substring (option vendor-class-identifier, 15, 5) = "00000" { # BIOS client filename "pxelinux.0"; } elsif substring (option vendor-class-identifier, 15, 5) = "00006" { # EFI client 32 bit filename "UEFI/shim.efi"; } else { # default to EFI 64 bit filename "UEFI/shimx64.efi"; } }
О том где взять и куда положить файл pxelinux.0
говорилось чуть выше в разделе настройки TFTP сервера. Сейчас поговорим о том, где взять файлы для UEFI.
Понадобятся файлы shim.efi
, shimx64.efi
(из пакета shim) и grubx64.efi
(из пакета grub2-efi). Эти пакеты включены в ISO-образ. Мы уже имеем развернутый образ дистрибутива на нашем сервере. Поэтому просто копируем необходимые пакеты в рабочую папку и извлекаем необходимые файлы:
# rpm2cpio shim-x64-версия-архитектура.rpm | cpio -dimv
# rpm2cpio grub2-efi-версия-архитектура.rpm | cpio -dimv
Создаем в папке TFTP сервера еще одну папку UEFI
и копируем в нее файлы shim.efi
, shimx64.efi
и grubx64.efi
.
# mkdir /opt/PXE/tftpboot/UEFI # cp рабочий_каталог/boot/efi/EFI/centos/shim.efi /opt/PXE/tftpboot/UEFI # cp рабочий_каталог/boot/efi/EFI/centos/shimx64.efi /opt/PXE/tftpboot/UEFI # cp рабочий_каталог/boot/efi/EFI/centos/grubx64.efi /opt/PXE/tftpboot/UEFI
Создаем в этом же каталоге создаем файл конфигурации grub.cfg
приблизительно такого содержания:
set timeout=1 menuentry 'CentOS' { linuxefi uefi/vmlinuz ip=dhcp inst.repo=http://ip_адрес_сервера_tftp/CentOS initrdefi uefi/initrd.img }
Копируем загрузочные образы в папку uefi/
:
# cp /opt/PXE/www/CentOS/images/pxeboot/{vmlinuz,initrd.img} /opt/PXE/tftpboot/UEFI/
Далее перезапускаем TFTP сервер и загружаем ПК при помощи PXE.
При данном методе установки ОС можно автоматизировать процесс до нажатия одной кнопки (выбор ОС в меню загрузки PXE). Т.е. все параметры ПК, список устанавливаемого ПО и т.д. можно задать в файле автоответов. Как это зделать - в одной из следующих статей.