Страницы

понедельник, 17 сентября 2012 г.

Загрузка по сети. PXE NFSROOT GRUB2

Изготовление окружения сетевой загрузки PXE, для виртуальных машин и контейнеров.


Долгое время, на обычном роутере DD-WRT у меня была доступна загрузка различных образов операционных систем через сеть, на любом компьютере, поддерживающим загрузку по сети.

Решил сделать это же на новом микросервере, но уже для целей виртуальных машин, а также для рабочей системы.

Сетевая загрузка вовлекает много компонентов программного обеспечения - dhcp-сервер, tftp-сервер, загрузчик, клиентский bios.

Замените, в соответствии со своими настройками, строки:
userserver - имя пользователя на сервере
username - имя пользователя на клиенте



Настройка DHCP/TFTP сервера DNSMasq для поддержки сетевой загрузки клиентов

Т.к. сейчас на микросервере используется DNSMasq в качестве DNS/DHCP/TFTP сервера, то укажем его опции настройки.

Опции, относящиеся к DHCP/PXE.
# Указываем загрузчик либо pxelinux.0, либо grub.pxe
dhcp-boot=pxelinux.0
# dhcp-boot=grub.pxe



Опции, относящиеся к настройке TFTP сервера в файле /etc/dnsmasq.conf

# Включение встроенного в dnsmasq TFTP сервера
enable-tftp
# Корень TFTP сервера
tftp-root=/home/userserver/tftproot

Создадим папку tftpboot в домашней папке под простым пользователем сервера "userserver":
userserver@microserver$ mkdir ~/tftproot

Также не забудем установить разрешение на изменение папки всем желающим:

root@microserver# chmod a+rw /home/userserver/tftproot

И для удобства пополнения и редактирования эту папку можно внести в список ресурсов SAMBA либо nfs.

Перезапустить DNSMasq сервис.
# service dnsmasq restart

Настройка PXE меню на основе PXELinux

Для минимальной работоспособности в корне TFTP сервера надо создать папку pxelinux.cfg, а в ней текстовый файл default.

root@microserver:~# ls tftproot/pxelinux.cfg/
default  vesamenu.c32

vesamenu.c32 из комплекта syslinux. Его можно найти на любом загрузочном диске Ubuntu в папке isolinux.

Минимальное содержимое главного меню сетевой загрузки - файл pxelinux.cfg/default. В нём также содержится пункт меню "Ubuntu Livecd 12.10 Gnome Shell Remix" для загрузки CD образа Ubuntu через сеть (см далее по тексту).
root@microserver:~# cat tftproot/pxelinux.cfg/default
DEFAULT vesamenu.c32
MENU title Microserver's network boot menu

LABEL Ubuntu Livecd 12.10 Gnome Shell Remix
MENU DEFAULT
KERNEL ubuntu/livecd/casper/vmlinuz
APPEND root=/dev/nfs boot=casper netboot=nfs nfsroot=192.168.3.1:/home/userserver/tftproot/ubuntu/livecd initrd=ubuntu/livecd/casper/initrd.lz  --
# Надо заметить, что параметр KERNEL и указан относительно корня TFTP сервера, также и начальная корневая файловая система initrd.


Сетевая загрузка livecd образа Ubuntu

Сделаем так, что будет возможно загрузить текущий (новейший) образ live cd ubuntu через сеть
Удобство будет заключаться в том, что достаточно будет скачать (а потом, будет автоматом) текущий iso образ и положить в папку. Заменить символическую ссылку и  перезапустить сервисы.

В каталоге tftpboot создадим папку ubuntu, в ней livecd.
userserver@microserver$ mkdir tftproot/ubuntu tftproot/ubuntu/livecd

в нее поместим образы ubuntu в виде файлов iso. и посмотрим:
userserver@microserver$ ls tftproot/ubuntu
ls tftproot/ubuntu/
quantal-ubuntu-gnome-amd64-20120902.iso
current-ubuntu.iso
livecd
где current-ubuntu.iso - символическая ссылка на файл quantal-ubuntu-gnome-amd64-20120902.iso.

На текущий загружаемый образ создадим символическую ссылку (команда ln -s): 
userserver@microserver$ ln -s quantal-ubuntu-gnome-amd64-20120902 current-ubuntu.iso
Примонтируем образ iso, доступный по символической ссылке, под root-пользователем (sudo -s):
root@microserver# mount -t auto -o loop current-ubuntu.iso livecd

Для того, чтобы образы монтировались при загрузке, надо подправить файл /etc/fstab, добавив в него. Все на одной строке, без переноса строк.

# Файлы образов для сетевой загрузки
/home/userserver/tftproot/ubuntu/current-ubuntu.iso /home/userserver/tftproot/ubuntu/livecd udf,iso9660 user,loop,ro 0 0

Т.к. в загрузочный образ Ubuntu встроена возможность загрузки через сеть, то также понадобиться NFS-папка с содержимым cdrom, которая будет монтироваться при сетевой загрузке.

На микросервере в файле /etc/exports указываем:

/home/userserver/tftpboot/ubuntu/livecd/ *(ro,sync,no_wdelay,insecure_locks,no_root_squash,insecure)

Перезапустим NFS-сервис:
root@microserver# service nfs-kernel-server restart

В меню PXE (pxelinux.cfg/default) добавим пункт меню, соответствующий нашей livecd системе

...
LABEL Ubuntu Livecd 12.10 Gnome Shell Remix
MENU DEFAULT
KERNEL ubuntu/livecd/casper/vmlinuz
INITRD ubuntu/livecd/casper/initrd.lz
APPEND root=/dev/nfs boot=casper netboot=nfs nfsroot=192.168.3.1:/home/userserver/tftproot/ubuntu/livecd  --
F1 livecd.txt
...

LABEL - это текстовая строка, видимая в меню
MENU DEFAULT - это меню выбрано по умолчанию.
KERNEL - ссылка на исполняемый код (Linux, иной), в данном случае на ядро Linux, путь к ядру указывается относительно корня TFTP-сервера. "ядро" не обязательно является ядром Linux; оно может быть загрузочным сектором или даже файлом COMBOOT. 
APPEND - параметры передаваемые ядру.

INITRD файл начальной корневой файловой системы, разворачиваемой в памяти.
Начиная с версии 3.71, initrd может быть указан отдельной директивой
(INITRD) вместо части директивы APPEND
F1 livecd.txt - справочная информация вызываемая по клавише F1



Попробуем загрузиться. Для этого в BIOS клиентского компьютера выберем в качестве первого устройства загрузки - сеть.
Обычно, если более менее правильно настроено, клиент может загрузить ядро linux. А вот дальнейшая загрузка может сломаться по различным причинам, уже относящимся к конфигурации системы (образа iso).


Преобразование установленной системы Ubuntu 12.10 на жестком диске - в вариант
сетевой загрузки

Заманчивая возможность - установить ubuntu обычным способом на жесткий диск, а затем, внеся некоторые изменения, подключить этот жесткий диск к серверу и обеспечить загрузку клиента по сети. Жесткий диск с usb-подключением.

Во время установки диск разбивается на 4 первичных раздела.
1. swap
2. ext4 - корневая файловая система для обычной загрузки, точка монтирования - /
3  ext4 - будущая корневая файловая система для сетевой загрузки (nfsroot)
4  ext4 - домашняя файловая система, /home

swap располагается в начале диска, т.к. скорость в этом месте выше.

Установка производится во второй раздел (например /dev/sda2) и в четвертый. Далее, после загрузки системы со второго раздела, его содержимое копируется на третий раздел. Настраивается загрузчик syslinux для загрузки с третьего раздела.Система загружается с третьего раздела. Вносятся изменения.

Изменения для сетевой загрузки

1. Изменение initramfs - начальной корневой файловой системы

Итак, установленная новая система Ubuntu Gnome Shell Remix 12.10 на жестком диске usb.

- надо загрузиться в систему, c третьего раздела
- надо скопировать каталог /etc/initramfs-tools/ в другое место
root@client# cp -R /etc/initramfs-tools/ /tmp/initramfs-tools

- отредактировать скопированный файл /tmp/initramfs-tools/initramfs.conf, исправляем опции:
BOOT=nfs

- отредактировать /etc/initramfs-tools/modules, внести драйверы сетевых карт, обычно встречающиеся на компьютерах, у меня forcedeth

- надо сгенерировать новый файл initramfs на основе скопированного каталога
например:
root@client# mkinitramfs -d /tmp/initramfs-tools/ -v -o /tmp/initrd.img-3.5.0-13-net
- скопировать в папку /boot третьего раздела, либо на tftp-сервер (непроверял).


. Настройки на сервере
В папке tftproot создадим папки system, system/root, system/home. Это будет папки рабочей системы, доступные через NFS.
Папку tftproot/system/root сделаем доступным через NFS, укажем в файле /etc/exports:


# Папка для сетевой загрузки рабочей системы
# 10 сентября 2012
# root - корневая файловая система
# home - домашний каталог
/home/userserver/tftproot/system/root *(ro,sync,no_wdelay,insecure_locks,no_root_squash,insecure)
/home/userserver/tftproot/system/home *(ro,sync,no_wdelay,insecure_locks,no_root_squash,insecure)


. Опции ядра, передаваемые загрузчиком, относящиеся к NFS, указываются в строке APPEND.

root=/dev/nfs - опция, указывает ядру, на то, что надо использовать NFS для монтирования корневой файловой системы, а не обычное блочное устройство

nfsroot=192.168.3.1:/home/userserver/tftproot/system/root, <options>
где <options> - разнообразные опции NFS, через запятую.

nfsrootdebug - включает отладочные сообщения
netboot=nfs - опция casper, указывает ему выполнять монтирование сетевого ресурса.
ip=dhcp - автоконфигурирование ip-адреса.

Сформируем пункт меню "Testing netboot system" для файла меню pxelinux.cfg/default
...

LABEL Testing netboot system
KERNEL system/root/vmlinuz
INITRD system/root/boot/initrd.img-3.5.0-13-net
APPEND root=/dev/nfs nfsroot=192.168.3.1:/home/userservertftproot/system/root ip=dhcp rw noswap nosplash --

...

Если не удается преобразовать существующую систему для загрузки по сети, то возможно имеет смысл использовать debootstrap для установки на NFS том.






Опция. Установка на NFS посредством debootstrap

Debootstrap - стандартный способ установки системы Debian Linux из запущенной системы Linux.




Опция. PXE загрузка с помощью GRUB 2

Pxelinux не единственный загрузчик, способный загружать систему по сети. GRUB 2 предлагает не менее интересную альтернативу.

Команда grub-mkimage создает загрузочный образ и этот образ может быть сконфигурирован для использования с PXE.

Чтобы образ был доступен для PXE загрузки, надо указать опции:

root@microserver# grub-mkimage --verbose --format=i386-pc-pxe --output=tftproot/grub.pxe --prefix='(pxe)/boot/grub' pxe pxecmd

Здесь предполагается, что Grub 2 установлен обычным способом в системе. В Ubuntu это так.

Итак, непонятные опции, нам разъяснит руководство по Grub.
--format=i386-pc-pxe, специфический формат загрузчика, для поддержки pxe-загрузки
--output=tftproot/grub.pxe, выходной файл загрузчика, будет сразу расположен в корне TFTP-сервера.

--prefix='(pxe)/boot/grub' pxe pxecmd, (pxe)- псевдоустройство, означающее корень TFTP-сервера. При использовании из конфигурационного файла, позволяет ссылаться на файлы TFTP-сервера.

Далее, надо создать в корне TFTP сервера, структуру папок для поддержки Grub 2. Можно просто скопировать файлы, а можно воспользоваться встроенной в пакет Grub 2 командой grub-mknetdir.
Что копировать?
1. Сам загрузчик grub.pxe, можно положить в корень TFTP сервера
2. Содержимое папки /boot/grub
3. Файл меню /boot/grub.cfg


Настройть dhcp-сервер (в нашем случае - dnsmasq) на выдачу вместо pxelinux.0 файла grub.pxe, в файле /etc/dnsmasq.conf
...
dhcp-boot=grub.pxe
...

Либо выполним команду grub-mknetdir на микросервере (можно и на клиенте):
root@microserver# grub-mknetdir --net-directory=tftproot
т.к. tftproot находится в домашней папке, поэтому полный путь не указывается, в иных конфигурациях, надо указать полный путь. В результате будет сформирован каталог с содержимым /boot/grub/i386-pc/. Не очень удачно, но можно перенести файлы в /boot/grub.

Надо вручную отредактировать файл  tftproot/boot/grub.cfg, т.к. нет возможности создавать его автоматически.
В принципе, можно взять за основу, системный файл /boot/grub/grub.cfg и изменить часть файла, где находятся пункты меню.
Например, вот пункт меню, для загрузки live cd:

...
menuentry 'Remote boot live CD' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
linux  (pxe)/ubuntu/livecd/casper/vmlinuz root=/dev/nfs boot=casper netboot=nfs nfsroot=192.168.3.1:/home/userserver/tftproot/ubuntu/livecd ro
initrd (pxe)/ubuntu/livecd/casper/initrd.lz
}
...



После того, как загрузчик стартовал, файлы TFTP-сервера доступны через псевдо-устройство (pxe), относительно корня.




Опция. Расширение системного загрузчика на диске, для загрузки по сети

Можно добавить в обычный загрузчик GRUB, меню для сетевой загрузки. Это приятная особенность, чтобы не перезагружать компьютер, т.к. BIOS иногда достаточно долго отрабатывает.

Опция. Пакет syslinux
Последние версии пакета syslinux можно получить по адресу:
http://www.kernel.org/pub/linux/utils/boot/syslinux/

Опция. "Раскраска" меню PXE загрузчика
Берем кисть и ....

Опция. Загрузка iso-образа посредством memdisk (диска в памяти)

Memdisk (входит в состав syslinux, копируем в /tftproot/).
Загрузочный образ копируется в память и загружается.

...
LABEL Test memdisk
KERNEL memdisk
APPEND initrd=ubuntu/current-ubuntu.iso
...

Опция. Загрузка iso-образа посредством Grub II. Loopback booting

Grub 2  умеет загружать iso-образы, находящиеся на любом разделе, с любой файловой системой (практически).

Чтобы освоить данную возможность, надо создать папку, например /opt/boot-images и поместить туда образы дисков.
Далее, в Grub 2 существует файл /etc/grub.d/40_custom, который позволяет добавлять пользовательские пункты меню.

Синтаксис несколько отличается от syslinux и предыдущего Grub I. Возможно использование русских букв, в меню.

menuentry "Локальный образ Ubuntu 12.10" {
 iso_path=/opt/boot-images/ubuntu.iso
 export iso_path
 search --set --file $iso_path
 loopback loop $iso_path
 root=(loop)
 linux  /casper/vmlinuz boot=casper iso-scan/filename=$iso_path quiet splash --
 initrd /casper/initrd.lz
}

menuentry "Локальный образ Ubuntu 12.10 консольный режим" {
 iso_path=/opt/boot-images/ubuntu.iso
 export iso_path
 search --set --file $iso_path
 loopback loop $iso_path
 root=(loop)
 linux  /casper/vmlinuz boot=casper iso-scan/filename=$iso_path text --
 initrd /casper/initrd.lz
}

Для диагностики можно использовать консольный режим (опция text or textonly) и режим отключения граф.загрузки (удалить опции quiet splash).

Потом даем команду:
root@mir#update-grub

Перезагружаемся и выбираем iso-образ в меню Grub II.

Также возможно сделать загрузку iso-образа при использовании PXE загрузчика Grub II.
Например, добавить пункт меню в файл tftproot/boot/grub/grub.cfg:

...
menuentry "Test network boot ISO live CD" --class ubuntu --class gnu-linux --class gnu --class os {
 iso_path=/ubuntu/current-ubuntu.iso
 export iso_path
 search --set --file $iso_path
 loopback loop $iso_path
 root=(loop)
 linux  /casper/vmlinuz boot=casper iso-scan/filename=$iso_path --
 initrd /casper/initrd.lz
}
...
В данном пункте ссылка на iso-образ, уже ранее настроенный для pxelinux загрузчика. 

Недостаток этого способа - очень долгая загрузка образа, без отображения прогресса.
Для небольших образов, вполне работоспособное решение.



Опция. Утилита графической настройки Grub Customizer

Команды для установки:
sudo add-apt-repository ppa:danielrichter2007/grub-customizer
sudo apt-get update
sudo apt-get install grub-customizer


 Ресурсы
-. http://xgu.ru/wiki/PXE
 - .http://www.3dnews.ru/workshop/625306/print
- . http://www.bog.pp.ru/work/PXE.html
- Netboot TCP/IP DOS disk. http://netbootdisk.com/index.htm
- Руководство по Syslinux. http://greenflash.su/Syslinux/Syslinux.htm
- Конфигурационные параметры syslinux(pxelinux). http://greenflash.su/Syslinux/files/config.htm
Mounting the root filesystem via NFS (nfsroot).  http://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt
Ramfs, rootfs and initramfs. http://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
- Опции ядра. http://www.kernel.org/doc/Documentation/kernel-parameters.txt
- . http://www.syslinux.org/wiki/index.php/PXELINUX
- Boot firmware. Open-source PXE alternative. http://ipxe.org/
http://www.syslinux.org/wiki/index.php/PXELINUX
- Загрузчик GRUB 2. http://ru.wikibooks.org/wiki/Grub_2
- Загрузчик GRUB 2 в Ubuntu. http://help.ubuntu.ru/wiki/grub
- Grub 2 Network. http://www.gnu.org/software/grub/manual/html_node/Network.html
- Debian GNU/Linux Installation Guide. http://d-i.alioth.debian.org/manual/en.i386/index.html
- Этапы загрузки Linux. http://www.k-max.name/linux/nachalo-etapy-zagruzki-os-linux-v-sxeme/
- Магия загрузки. http://www.xakep.ru/magazine/xa/134/084/1.asp
- Grub customizer. https://launchpad.net/grub-customizer
- Опции каспера. http://manpages.ubuntu.com/manpages/lucid/man7/casper.7.html

Комментариев нет: