В данной статье будет рассмотрена установка 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.
Установка необходимых приложений:
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»;
Сервер установлен, можно ставить систему.
Для установки системы с сервера в сети необходимо разрешить в BIOS загрузку по сети (PXE). Если ваш bios поддерживает boot menu, то лучше для выбора загрузочного устройства воспользоваться именно им — чтобы не было проблем, если забудешь изменить порядок загрузки.
Если всё хорошо, то перед вами будет экран приветствия установщика:
Для меня долгое время оставалось загадкой, почему в Ubuntu только два варианта установочного диска – Desktop и Alternate. В Debian кроме обычных полных установочных дисков, устанавливающих сразу полный GNOME или KDE, существует также NetInstall диск, предназначенный для установки системы по сети.
Загрузочный CD в таком варианте предназначен для запуска инсталлятора, устанавливающего минимальный необходимый набор пакетов. Все остальное при необходимости выкачивается и устанавливается из сети. Такой вариант предполагает большую квалификацию пользователя, выполняющего установку, но зато обеспечивает гибкость в установке только необходимых компонентов системы. Это также позволяет экономить дисковое пространство.
Оказалось, что в Ubuntu тоже есть вариант установочного диска, предназначенный для установки по сети. Просто ссылка для его закачки не расположена на главной странице сайта. А спрятана по следующему адресу .
Меня интересовал вопрос, какого минимального размера можно получить установленную Ubuntu без совершения специальных трюков. Для теста было решено установить Ubuntu c минимального диска в VirtualBox.
Размер имиджа минимального диска составляет 11Mб. Это немного, и позволяет выкачать его на любой, даже самой маленькой скорости.
А вот при установке желательно иметь канал в интернет побыстрее. Потому что минимальный диск, кроме собственно инсталлятора, не содержит ничего. Поэтому в процессе установки будет качаться все. Действительно всё!
Первую попытку выполнить установку Ubuntu с минимального диска я предпринял, подключившись к интернету по ADSL на скорости 128 кбит/с. Установка (в основном закачка пакетов) растянулась на несколько часов.
Для повторного эксперимента удалось найти подключение на существенно большей скорости.
При загрузке с минимального диска нас встречает cначала текстовое приглашение:
а затем стандартное загрузочное графическое(!) меню Ubuntu:
Имеющийся пункт "Command-line install" не означает, что установка будет производиться из командной стоки. В любом случае запускается инсталятор в текстовом режиме.
Пункт «Advanced options» содержит дополнительное меню:
позволяющее выполнить Expert install. При его выборе появляется меню с действиями по установке, позволяющее выполнить их в почти произвольном порядке:
Я же выбираю пункт – «Install».
Текстовый инсталятор обычный. Такой же, как и в Alternate диске. С тем лишь отличием, что пакеты берутся не с диска, а закачиваются по сети.
Инсталятор традиционно спрашивает язык:
настраивает раскладку клавиатуры:
потом предлагает выбрать репозиторий:
который по умолчанию предлагается локальный для выбраной страны:
В серверных всё чаще попадаются сервера без CD/DVD-приводов. Время от времени на них нужно ставить операционную систему, и в этом может сильно помочь установка по сети. Вы просто включаете сервер и начинаете установку. Сетевая карта должна поддерживать технологию PXE. PXE - Pre-Boot Execution Environment - позволяет осуществлять загрузку по сети.
Но PXE недостаточно для полного счастья, технология, которая позволит полностью автоматизировать установку - kickstart (разработчиком которой является компания Red Hat). Суть её проста - мы заранее составляем файл, содержащий значения всех опций, которые могут понадобиться в ходе установки. Более того, мы можем выполнять свои скрипты до установки и после, тем самым задавая настройки будущей ОС.
Установка с помощью kickstart типового комплекта Linux занимает 5-7 минут.
Для Install-сервера нужно 3 службы и 1 пакет.
DHCP-сервер ожидает bootp-запросы в своей сети; после того, как он получает запрос, он смотрит MAC-адрес источника, и если о таком MAC-адресе у него имеется соответствующая запись, он начинает с ним работать. DHCP-сервер выдаёт клиенту сетевые реквизиты (IP-адрес, gateway, DNS-сервера,...) и по протоколу TFTP, с помощью TFTP-сервера, отправляет загрузочный образ pxelinux.0. Этого образа хватает, чтобы вывести меню выбора ОС.
Выбрав ОС, мы начинаем загрузку ядра и начинаем инсталляцию, в процессе выбрав источник установки — NFS-сервер. На NFS-сервер нужно выложить подготовленный контент будущей операционной системы и убедиться, что соответствующие каталоги экспортированы.
Файл /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 в конфигурацию 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
# cp $(rpm -ql syslinux | grep menu.c32) /tftpboot/
# cp $(rpm -ql syslinux | grep pxelinux.0) /tftpboot/
В файл /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
После того, как мы создали файл с помощью 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
Сегодня автоматизируется все больше задач, для максимальной отдачи серверов все шире используют виртуализацию. Но устанавливать операционки по-прежнему приходится. Каждый делает это по-своему: у кого-то полные карманы различных образов на все случаи жизни, кто-то по старинке носит с собой «барсетку» с дисками, а то и две. Как правило, администраторы выполняют эту работу с невеликим удовольствием. Давай посмотрим, как сократить время на тривиальные задачи, как научить компьютеры устанавливать системы самостоятельно, вообще без участия админа, используя при этом только локальную сеть.
Итак, сегодня мы научимся: устанавливать Windows и Linux по сети, грузить небольшие ISO-образы, полезный софт (всяких там Касперских, Акронис, WinPE, мемтесты), разворачивать тонкие клиенты и рулить ими. Чтобы, например, бухгалтер, работающая с 1С по RDP, не прибила тебя за то, что у нее слетела винда, а отчет нужно было подготовить еще вчера... Или скупой начальник, который не хочет обновлять свой комп, восхитился твоим профессионализмом, когда увидит, как на стареньких компах летает Windows 8... В достижении наших коварных целей нам поможет сервер, предоставляющий загрузку по сети (PXE).
У любого системного администратора в заначке есть универсальный USB-диск для экстренной реанимации компьютера. Согласись, было бы куда лучше иметь ту же функциональность, используя одну лишь сетевую карту. Нельзя при этом не отметить возможность одновременной работы с несколькими узлами сразу. Итак, исходя из наших потребностей у нас есть два пути решения: использовать PXE или LTSP.
LTSP нам не очень подходит: он призван грузить по сети ОС, установленную на самом сервере, что позволяет использовать приложения сервера LTSP. Это не совсем то, что нам нужно. PXE - инструмент для загрузки компьютера по сети без использования локальных носителей данных, так же как и LTSP. PXE позволяет организовать мультизагрузочное меню загрузки, аналогичное универсальному «USB-реаниматору».
Началось все с необходимости иметь под рукой инструмент для удаленной установки Ubuntu/Debian Server по сети, с возможностью загрузки Live CD маленькой системы, вроде SliTaz или Kolibri OS.
Как говорится, аппетит приходит во время еды: намеченное не успели реализовать, а к плану добавился еще ряд «хотелок». В итоге список получился весьма внушительным.
В качестве дистрибутива для сервера выбор пал на Ubuntu Server 14.04.2 LTS. Можно остановиться на любой другой ОС, разница будет только в синтаксисе. Итак, приступим. Нам потребуется TFTP, DHCP (необязательно установленный на этом же сервере, в роли DHCP-сервера может выступить роутер), сервис для организации сетевой файловой системы NFS. Рассматривать будем только те настройки, которые нас интересуют в рамках темы. Первым делом установим все необходимое, предварительно сделав все обновления:
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score!
Это придумано давным давно. Во всяком случае в статье , написанной в конце прошлого века (1998 год), идею сетевой загрузки автор называет старой. И это не удивительно, загрузка операционной системы по сети - мечта любого администратора. Ведь операционная система загруженная с сервера всегда будет «белой и пушистой», а изменения и обновления достаточно будет внести в загрузочный образ на сервере, вместо того, чтобы бегать с флешкой по всему парку компьютеров.
Почему же такая хорошая идея не получила широкого распространения? Из-за сложности? Нет! Серверы для сетевой загрузки настраиваются довольно просто, как правило одним конфигурационным текстовым файлом, и, забегая вперёд, скажу, что в lanboot_server создание файлов конфигурации производится автоматически. На практике это сводится к «включил, и готово».
Если локальная сеть не настроена - настройте её. После этого смело командуйте lanboot start и клиенты могут загружаться.
Для остановки соответственно lanboot stop. В ALTLinux и Ubuntu придётся поработать руками, доустановить необходимое и настроить.
Впрочем, не всё так страшно. Скрипт запуска lanboot (/usr/sbin/lanboot) должен работать и в других линуксах, например в Simply Linux (ALT) скрипт создал правильные файлы конфигурации и сервер запустился, только загружаемых файлов в «TFTP directory» (/var/lib/tftpboot) не оказалось, и это не удивительно, ведь откуда взяться файлам PuppyRus в ALTLinux.
Для загрузки Linux по сети нам потребуется tftp-сервер (используется tftp-hpa-5.0), bootp или dhcp (я выбрал dhcp-4.1.1, хотя сначала использовал bootp) и inetd или xinetd (я выбрал inetd, он проще).
Самый простой.
Выдаёт IP привязанный к MAC-адресу клиента.
Поэтому может применяться только в сетях с постоянным парком машин.
Используемые параметры:
Td -- TFTP directory (отсюда будут загружаться файлы) - rp -- root path (путь к корню сервера) - bf -- bootfile (загружаемый файл) - sa -- boot server address (IP TFTP-сервера) - sm -- subnet mask (маска подсети) - gw -- gateways (шлюз) - to -- time offset (seconds) - ha -- hardware address (аппаратный, он же MAC адрес) # Можно писать либо в столбик, либо в одну строку. # Настройки, общие для всех клиентов: .default:td=/var/lib/tftpboot:rp=/var/lib/tftpboot:bf=pxelinux.0:sa=192.168.1.2:sm=255.255.255.0:gw=192.168.1.1:to=auto: #или так.default:\ td=/var/lib/tftpboot:\ rp=/var/lib/tftpboot:\ bf=pxelinux.0:\ sa=192.168.1.2:\ sm=255.255.255.0:\ gw=192.168.1.1:\ to=auto: # Настройки для клиентов в других подсетях: #.subnet1:sm=255.255.255.0:gw=192.168.0.1:tc=.default: # Индивидуальные настройкм каждого клиента (примеры): #notick:tc=.default:ha=00140B016592:ip=192.168.1.4: #sharick:tc=.default:ha=0123456789ab:ip=192.168.1.2 #bobick:tc=.default:ha=ba9876543210:ip=192.168.1.5 # и т.д.
Полноценный dhcp-сервер.
# dhcpd.conf # # Use this to enble / disable dynamic dns updates globally. ddns-update-style none; subnet 192.168.1.0 netmask 255.255.255.0 { option routers 192.168.1.1; option subnet-mask 255.255.255.0; option broadcast-address 192.168.1.255; range dynamic-bootp 192.168.1.10 192.168.1.200; default-lease-time 21600; max-lease-time 43200; filename "pxelinux.0"; }
Файловый сервер с упрощённым протоколом.
#Каталоги, разрешённые для tftp-загрузки и nfs-монтирования (no_root_squash - разрешён пользователь root) /var/lib/tftpboot 192.168.1.0/255.255.255.0(ro,no_root_squash,sync)
У нас служит для запуска tftp-сервера и bootp-сервера. Но может запускать и другие службы. Файл конфигурации /etc/inetd.conf. Файл длинный, «на все случаи жизни». Поэтому привожк только нужные строки.
# Эта строка запускает tftp-сервер tftp dgram udp wait root /usr/sbin/in.tftpd in.tftpd -s /var/tftpboot # Эта строка запускает bootp-сервер bootps dgram udp wait root /usr/sbin/bootpd bootpd -i
Функции те же, что и у inetd, но настройки сложнее. Установлен в Альтлинуксе.
# # Simple configuration file for xinetd # # Some defaults, and include /etc/xinetd.d/ defaults { log_type = SYSLOG authpriv info; log_on_success = PID HOST DURATION; log_on_failure = HOST; instances = 100; per_source = 5; only_from = 127.0.0.1; } includedir /etc/xinetd.d Для каждой запускаемой программы отдельный файл конфигурации кладётся в /etc/xinetd.d Пример /etc/xinetd.d/tftp # default: off # description: The tftp server serves files using the trivial file transfer \ # protocol. The tftp protocol is often used to boot diskless \ # workstations, download configuration files to network-aware printers, \ # and to start the installation process for some operating systems. service tftp { disable = no; socket_type = dgram; protocol = udp; wait = yes; user = root; server = /usr/sbin/in.tftpd; server_args = -u tftp -s /var/lib/tftpboot; per_source = 11 cps = 100 2 flags = IPv4 only_from = 192.168.1.0; }
Для автоматической настройки переменные берутся из вывода стандартных linux-команд ifconfig и route. Поэтому их можно получить в любом Linux.
Serv=$(ifconfig | grep inet | grep -v 127.0.0.1 | cut -f 2 -d ":" | cut -f 1 -d " ") mask=$(ifconfig | grep inet | grep -v 127.0.0.1 | cut -f 4 -d ":") gate=$(route | grep UG | cut -f 10 -d " ") subnet=$(route | grep " U " | cut -f1 -d " ")
Эти переменные вписаны в соответствующие места шаблонов конфигурационных файлов содержащихся в скрипте lanboot. При выполнении скрипта значения переменных подставляются в шаблон и сгенерированный таким образом файл конфигурации отправляется «по месту назначения». Это избавляет вас от рутинной работы и человеческих ошибок тоже. Единственное непременное условие: сеть должна быть настроена, иначе откуда брать значения переменных.
Скрипт lanboot так же копирует в TFTP directory файлы PuppyRus: vmlinuz, initrd.gz и pup*-200.sfs, необходимые для запуска. Файлы берутся из операционной системы, на которой запущен сервер, и, если эта система не PuppyRus, то их взять неоткуда. Поэтому на других Linux вышеперечисленные файлы необходимо поместить в /var/lib/tftpboot вручную (копированием).