debian.org / О Debian Где взять Debian Поддержка Уголок разработчика Новости Wiki

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

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

Оффлайн gardarea51

  • Старожил
  • ****
  • Topic Author
  • Сообщений: 661
  • Jabber: gard.area51@jabber.ru
Здравствуйте!
Решил я наконец-то облегчить себе жизнь и сделать возможным запуск 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 тоже. Надеюсь, что эта хаутушка окажется полезной.
 

Оффлайн ogost

  • Главный модератор
  • Ветеран
  • *****
  • Сообщений: 2835
  • Linux Registered User #547151
спасибо, закинул себе в вкладки

Оффлайн gardarea51

  • Старожил
  • ****
  • Topic Author
  • Сообщений: 661
  • Jabber: gard.area51@jabber.ru
 

Оффлайн gardarea51

  • Старожил
  • ****
  • Topic Author
  • Сообщений: 661
  • Jabber: gard.area51@jabber.ru
Небольшое дополнение.
В меню 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), до которого необходимо знать путь. Вышеописанным способом мы это видимо обходим.
 

Русскоязычное сообщество Debian GNU/Linux



Теги:
 

Установка и обновление драйверов Nvidia/ATI с помощью sgfxi

Автор Udachnik

Ответов: 6
Просмотров: 26431
Последний ответ 30 Март 2011, 14:39:19
от paulcarroty
HOW-TO: установка и запуск MediaTomb на Debian 8 "Jessie" с Systemd

Автор saint-denis

Ответов: 0
Просмотров: 1791
Последний ответ 17 Июнь 2017, 15:20:51
от saint-denis
Автоматический бэкап с помощью снапшотов lvm и tar (lvm snapshots tar backup)

Автор gardarea51

Ответов: 2
Просмотров: 6483
Последний ответ 19 Февраль 2016, 13:51:26
от gardarea51
DEBIAN Полезные ресурсы в сети.

Автор BULATUS

Ответов: 24
Просмотров: 15596
Последний ответ 05 Октябрь 2016, 19:17:38
от Ogis1975
LibreOffice Draw топология сети

Автор pa_

Ответов: 0
Просмотров: 1707
Последний ответ 01 Ноябрь 2017, 21:18:26
от pa_