• Установка убунту из по сети. PXE — грузим всё! Осваиваем мультизагрузку по локальной сети. Настройка динамического получения IP-адреса

    В статье он упомянул о возможности установки «С помощью загрузки по сети (PXE boot)», благодаря чему я решил наконец написать материал по созданию сервера pxe boot.

    Повествование будет вестись на примере всё той же ОС - Debian (так что пути и команды у вас могут отличаться).
    Для начала - поставим tftp -сервер. Смотрим доступные варианты (apt-cache search tftp | fgrep server ):

    • atftpd
    • dnsmasq
    • tftpd
    • tftpd-hpa
    Сначала я поставил tftpd-hpa, т.к. о нём рассказывалось в мануале , с которого я начинал создание сервера. Затем я перешёл на atftpd, т.к. мне потребовалось логирование. Рассмотрим оба варианта:
    • 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

    Теперь у нас есть tftp-сервер. Один шаг мы сделали:)
    Далее - настройка 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

    Шаг второй пройден. Дальше - непосредственно настройка pxe-boot.
    Идём на 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, т.к. о нём рассказывалось в мануале , с которого я начинал создание сервера. Затем я перешёл на atftpd, т.к. мне потребовалось логирование. Рассмотрим оба варианта:
    • 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

    Теперь у нас есть tftp-сервер. Один шаг мы сделали:)
    Далее - настройка 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

    Шаг второй пройден. Дальше - непосредственно настройка pxe-boot.
    Идём на 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 предоставляет доступ к файловой системе по сети
    Процесс установки можно разбить на этапы:

    1. pxe - прошивка pxe начинает свою работу, когда мы в BIOS выставляем установку по сети, или когда на HDD не найдена MBR.

    2. DHCP фаза 1 - клиент получает сетевые реквизиты и адрес tftp-сервера, а также название файла-загрузчика (pxelinux.0). По умолчанию TFTP-сервер - это DHCP-сервер.

    3. TFTP - загрузчик pxelinux.0 обращается к TFTP-серверу и запрашивает у него initrd.img (Initial RAM disk, временная файловая система), ядро Linux.

    4. Kernel - передача управления ядру Linux.

    5. DHCP фаза 2 - ядро Linux делает запрос к DHCP-серверу, чтобы получить сетевые реквизиты и в дальнейшем адрес NFS-сервера.

    6. NFS - этап, когда монтируется NFS-раздел

    7. 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