[How-To] Запуск LiceCD Ubuntu (и не только) с любого ПК в сети с помощью PXE

Автор gardarea51, 24 ноября 2014, 18:35:51

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

gardarea51

Здравствуйте!
Решил я наконец-то облегчить себе жизнь и сделать возможным запуск Ubuntu LiveCD с любого компьютера в офисе с помощью PXE, то есть сделать сетевую загрузку без дисков, флешек и пр. Мне это нужно конкретно того, чтобы запуститься, разметить диск компьютера с помощью Gparded и развернуть образ Windows-системы с помощью nftsclone. Можно найти и другие применения liveCD. Просто удобно всегда иметь его под рукой, а тут еще и носить с собой необязательно. Все действия я выполнял на сервере под управлением Debian 7.

Сразу отмечу, что загружать с помощью PXE можно не только Ubuntu, а к примеру Debian или другие системы, но настройки загрузки будут несколько отличаться. Если я все правильно понимаю (если нет - поправьте меня), то загружать по PXE можно только ядро (PXE-загрузчик обращается на сервер tftp и заправшивает ядро linux, которое загружается). А дальше уже все зависит от сборки дистрибутива, то есть от конкретной реализации initrd, можно ли передать ядру некие параметры, которые позволят при определенных условиях загрузить саму систему с пользовательским окружением. К примеру загрузить liveCD Убунты можно только при использовании NFS или Samba сетевой файловой системы, адрес сервера сетевой ФС указывается только как IP, а не как доменное имя. Вот такие вот ограничения, есть еще сетевая ФС NBD, но с нее загрузиться не получится, ибо просто не предусмотрено. Для другого дистрибутива linux это может быть не так.

Это было небольшое отступление. Теперь к делу. Для того, чтобы выполнить задачу потребуется:
1) донастроить работающий dhcp-сервер (или установить его с последующей настройкой).
2) установить настроить tftp-сервер (там же, где работает dhcp-сервер)
3) установить и настроить nfs-сервер
4) настроить grub2 для загрузки систем по PXE (можно использовать syslinux)

Первым делом нужно установить tftp-сервер.
apt-get install tftp-hpa
Теперь настроим его через файл конфигурации /etc/default/tftp, который по-умолчанию выглядит так:
root@area51:/srv/tftp# cat /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

Здесь указано размещение корневой директории tftp-сервера, а данном случае /srv/tftp, можно сменить к примеру на /mnt/data/pxe-boot, тут уже дело вкуса. Главное просто выбрать директорию, с которой в дальнейшем будет происходить работа. Доступ к серверу по порту 69 тоже следует открыть, если этого не сделано. После изменения конфигурационного файла сервер нужно перезапустить командой service tftpd-hpa restart

Итак, настало время создать pxe-загрузчик. Я сделал это с помощью grub2, так как он это умеет (и я надеюсь он у вас установлен). Переходим в каталог tftp-сервера и выполняем команду:
grub-mknetdir --net-directory=./

В результате в корне tftp-сервера появится директория boot, в которой расположились файлы, необходимые grub для загрузки компьютеров по pxe, кстати будет выведено и соответствующее сообщение о том, что нужно теперь настроить dhcp-сервер. Что-ж, примемся за его настройку.

Вот кусочек моего конфига для dhcp-сервера:

subnet 192.168.3.0 netmask 255.255.255.0 {
   option subnet-mask 255.255.255.0;
   option broadcast-address 192.168.3.255;
   option routers 192.168.3.1;
   option ntp-servers 192.168.3.1;
   option domain-name-servers 192.168.3.1;
   option domain-name "office";
   range 192.168.3.2 192.168.3.254;

   class "pxeclients" {
      match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
      filename "/boot/grub/i386-pc/core.0";
      next-server 192.168.3.1;
   }
}

В секции class "pxeclients"  указывается месторасположение pxe-загрузчика, который был создан командой grub-mknetdir и адрес tftp-сервера. Все адреса вам необходимо будет поменять на свои.

Уже сейчас можно попробовать загрузиться по протоколу pxe с любого другого компьютера в сети (или с вирт. машины, если вы делаете это на домашнем ПК в целях эксперимента), при загрузке будет выведено сообщение об ошибке grub, это хорошо, загрузчик работает. Теперь необходимо скачать ubuntu live cd (я еще скачал и xubuntu для запуска на старых ПК), смонтировать его во временный каталог, скажем так:
mount -o loop /mnt/iso /srv/tftp/ubuntu-14.04.1-desktop-i386.iso и скопировать все содержимое образа в каталог /srv/tftp/ubuntu (ну или в другой, смотря какой каталог вы использовали в качестве корня tftp). После копирования образ можно отмонтировать и удалять. Я сделал также с xubuntu, поместив файлы в одноименный каталог /srv/tftp/xubuntu.

Чтобы загружать эти системы настало время в директории tftp-сервера создать файл boot/grub/grub.cfgКоманда grub-mknetdir --net-directory=./ создала каталог со всеми необходимыми файлами, но grub.cfg придется создать самостоятельно. И теперь начинаются специфические особенности описания загрузки ОС, как я уже говорил в данном Убунту-случае потребуется использование сетевой ФС, в роли которой могут выступать samba или nfs. Вот мое содержимое этого файла:
menuentry "Memtest86+" {linux16 (pxe)/ubuntu/install/mt86plus}
menuentry "Reboot..." {reboot}

menuentry "Ubuntu 14.04 i386 Live" {
   set root=(pxe)
   linux   /ubuntu/casper/vmlinuz root=/dev/nfs ip=dhcp netboot=nfs nfsroot=192.168.3.1:/srv/tftp/ubuntu boot=casper locale=ru_RU splash=verbose
   initrd  /ubuntu/casper/initrd.lz
}
menuentry "Xubuntu 14.04 i386 Live" {
   set root=(pxe)
   linux   /xubuntu/casper/vmlinuz root=/dev/nfs ip=dhcp netboot=nfs nfsroot=192.168.3.1:/srv/tftp/xubuntu boot=casper locale=ru_RU splash=verbose
   initrd  /xubuntu/casper/initrd.lz
}

Здесь для grub мы указываем, что система расположена на (pxe)-устройстве (поправьте меня, если я выразился не так), это аналог чего-то типа set root (hd0,1). Дальше относительно этого указывается расположение образа linux-ядра и initrd с опциями, nfsroot ссылается на ip-адрес, доменное имя тут не сработает. Все параметры специфичны. Уже сейчас вы можете попробовать загрузить систему по pxe, вы успешно сможете загрузить ядро, которое опросит оборудование, но дальше процесс не пойдет.

Чтобы процесс пошел дальше, требуется настроить nfs, указанный в grub.cfg (я пробовал использовать samba, но настройка с nfs оказалась намного проще). Устанавливаем nfs-сервер:
apt-get install nfs-kernel-server nfs-common
Затем отредактируем файл /etc/exports, приведя его к примерно такому виду (насчет опций можете почитать отдельно):
/srv/tftp 192.168.3.0/24(ro,async,all_squash,no_subtree_check)
Тем самым мы экспортируем каталог /srv/tftp клиентам из указанной подсети только для чтения. Для применения изменений перезапускаем сервис nfs:
service nfs-kernel-server restart
Посмотреть экспортированные ФС можно командой exportfs.

Если теперь попробовать загрузить систему по pxe - она успешно запустится, так как ядро сможет запустить /sbin/init, который запустит все остальное. Теперь загрузка по сети прекрасно работает. Как приятный бонус - можно установить пароль на нужные меню загрузки grub (выбор меню и его изменение). Для создания хэша пароля выполним:
grub-mkpasswd-pbkdf2
Полученную строку можно скопировать, к примеру он вот такая grub.pbkdf2.sha512.10000.AAE7A54B67F186673C8C2212....

Далее изменим наш файл boot/grub/grub.cfg следующим образом:
set superusers="admin"
password_pbkdf2 admin grub.pbkdf2.sha512.10000.AAE7A54B67F186673C8C2212A.....
menuentry "Memtest86+" {linux16 (pxe)/ubuntu/install/mt86plus}
menuentry "Reboot..." {reboot}

menuentry "Ubuntu 14.04 i386 Live" --users ""{
   set root=(pxe)
   linux   /ubuntu/casper/vmlinuz root=/dev/nfs ip=dhcp netboot=nfs nfsroot=192.168.3.1:/mnt/data/pxe-boot/ubuntu boot=casper local$
   initrd  /ubuntu/casper/initrd.lz
}
menuentry "Xubuntu 14.04 i386 Live" --users ""{
   set root=(pxe)
   linux   /xubuntu/casper/vmlinuz root=/dev/nfs ip=dhcp netboot=nfs nfsroot=192.168.3.1:/mnt/data/pxe-boot/xubuntu boot=casper loc$
   initrd  /xubuntu/casper/initrd.lz
}


Здесь мы задали пользователя admin, указали его пароль в неявном виде и добавили к двум пунктам меню опцию --users. Теперь при выборе пунктов меню с этой опцией у пользователя будет запрашиваться имя и пароль, без их указания пользователь не сможет ни загрузить пункт меню ни изменить его. Вот такое приятное дополнение. Конечно, хитрый пользователь всегда может смонтировать русурс nfs и посмотреть что там, однако, только посмотреть, так как русурс экспортирован только для чтения и к тому же адрес ресурса нужно узнать, а узнать его без пароля на пункт меню будет не так просто.

Для загрузки других систем нужно смотреть руководства по этим системам, и что приятно, grub умеет загружать даже .iso файлы. Впрочем, syslinux тоже. Надеюсь, что эта хаутушка окажется полезной.



gardarea51

Небольшое дополнение.
В меню grub2 можно воспользоваться средствами syslinux, если взять из его пакета memdisk (который я положил в каталог boot grub2), к примеру так:
menuentry "Victoria 3.5 HDD tool" {
   linux16 (pxe)/boot/memdisk iso raw
   initrd16 (pxe)/vcr35r.iso
}

Что соответствует таким строкам при использовании syslinux:
LABEL Victoria 3.5 HDD tool
kernel memdisk
append iso initrd=vcr35r.iso


Для загрузки других .iso может потребоваться указать linux и initrd вместо linux16 и initrd16. Grub2 очевидно не умеет передавать управление загрузчику самого .iso-образа, только загрузчику расположенной в образе ОС (через chainloader), до которого необходимо знать путь. Вышеописанным способом мы это видимо обходим.