Preboot Execution Environment (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи PXE. Дата последней синхронизации: 1 сентября 2018. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Ваш ноутбук поставляется без дисковода, и не позволяет загружаться с USB-накопителя? Не бойтесь, вы можете загрузиться с помощью PXE.

Из Википедии:Preboot Execution Environment:

PXE (англ.Preboot eXecution Environment произносится пикси) — среда для загрузки компьютеров с помощью сетевой карты без использования жёстких дисков, компакт-дисков и других устройств, применяемых при загрузке операционной системы.

В этом руководстве PXE используется для загрузки установочного носителя с соответствующей опцией-rom, которая поддерживает PXE в целевом объекте. Это хорошо работает, когда у вас уже установлен сервер.

Как это работает

Грубое описание процесса загрузки с помощью PXE:

  • клиент (тот компьютер на который вы хотите установить) подключается к сети и опрашивает DHCP-сервера для аренды IP.
  • DHCP-сервер передает клиенту IP и другую, необходимую для сетевой загрузки, информацию.
  • затем клиент, на основе полученной информации, подключается к TFTP-серверу по протоколу TFTP (который очень похож на обычный FTP) и загружает файлы.

после этого клиент загружает систему со скаченных файлов. После загрузки системы можно отключить сетевое соединение (образ полностью загружается в память).

Подготовка

Загрузите последний официальный установочный образ со страницы загрузки.

Затем смонтируйте образ:

# mkdir -p /mnt/archiso
# mount -o loop,ro archlinux-2017.12.01-x86_64.iso /mnt/archiso

Настройка сервера

Вам необходимо установить DHCP, TFTP и HTTP-сервер для настройки сети, загрузки pxelinux/kernel/initramfs, и, наконец, загрузки корневой файловой системы (соответственно).

На данный момент Arch поддерживает загрузку PXE только в стиле BIOS. Для получения дополнительной информации смотрите FS#50188.

Сеть

Подключите проводную сетевую карту и назначьте ее соответствующим образом.

# ip link set eth0 up
# ip addr add 192.168.0.1/24 dev eth0

DHCP + TFTP

Для настройки сети на устройстве вам потребуется как DHCP, так и TFTP-сервер, чтобы облегчить передачу файлов между сервером PXE и клиентом; dnsmasq делает и то, и другое, и очень прост в настройке.

Установите пакет dnsmasq.

Настройте dnsmasq:

# /etc/dnsmasq.conf
port=0
interface=eth0
bind-interfaces
dhcp-range=192.168.0.50,192.168.0.150,12h
dhcp-boot=/arch/boot/syslinux/lpxelinux.0
dhcp-option-force=209,boot/syslinux/archiso.cfg
dhcp-option-force=210,/arch/
dhcp-option-force=66,192.168.0.1
enable-tftp
tftp-root=/mnt/archiso

Запустите dnsmasq.service.

HTTP

Благодаря недавним изменениям в archiso, теперь можно загрузиться с HTTP (archiso_pxe_http initcpio hook) или NFS (archiso_pxe_nfs initcpio hook); среди всех альтернатив, darkhttpd на сегодняшний день является самым тривиальным (и самым легким) для настройки.

Сначала, установите пакет darkhttpd.

Затем запустите darkhttpd, используя наш /mnt/archiso в качестве корневого документа:

# darkhttpd /mnt/archiso
darkhttpd/1.8, copyright (c) 2003-2011 Emil Mikulic.
listening on: http://0.0.0.0:80/

Обратите внимание, что важно, чтобы сервер работал на 80 порту. Если вы запустите darkhttpd без доступа суперпользователя, по умолчанию он будет 8080. Клиент попытается получить доступ к 80 порту, и загрузка завершится неудачно.

Установка

Для этой части вам нужно выяснить, как сообщить клиенту выбрать загрузку PXE; в углу экрана вместе с обычными сообщениями обычно появляется подсказка о том, какую клавишу нажать, чтобы сначала запустить загрузку PXE. На IBM x3650 при нажатии F12 появляется меню загрузки, первым вариантом которого является Network; на Dell PE 1950/2950 нажатие F12 инициирует загрузку PXE напрямую.

Загрузка

Просмотр journald на сервере PXE даст дополнительную информацию о том, что именно происходит на ранних этапах процесса загрузки PXE:

# journalctl -u dnsmasq.service -f
dnsmasq-dhcp[2544]: DHCPDISCOVER(eth1) 00:1a:64:6a:a2:4d 
dnsmasq-dhcp[2544]: DHCPOFFER(eth1) 192.168.0.110 00:1a:64:6a:a2:4d 
dnsmasq-dhcp[2544]: DHCPREQUEST(eth1) 192.168.0.110 00:1a:64:6a:a2:4d 
dnsmasq-dhcp[2544]: DHCPACK(eth1) 192.168.0.110 00:1a:64:6a:a2:4d 
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/pxelinux.0 to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso.cfg to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/whichsys.c32 to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_pxe_choose.cfg to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/ifcpu64.c32 to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_pxe_both_inc.cfg to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_head.cfg to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_pxe32.cfg to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_pxe64.cfg to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/archiso_tail.cfg to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/vesamenu.c32 to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/syslinux/splash.png to 192.168.0.110

После загрузки pxelinux.0 и archiso.cfg через TFTP вам (надеюсь) будет представлено меню загрузки syslinux с несколькими параметрами, в которых вы можете выбрать Boot Arch Linux (x86_64) (HTTP).

Затем ядро и initramfs (подходящие для выбранной вами архитектуры) будут переданы снова через TFTP:

dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/x86_64/vmlinuz to 192.168.0.110
dnsmasq-tftp[2544]: sent /mnt/archiso/arch/boot/x86_64/archiso.img to 192.168.0.110

Если все пойдет хорошо, вы должны увидеть активность на darkhttpd исходящую от PXE-target; на этом этапе ядро будет загружено на PXE-target и инициализировано:

1348347586 192.168.0.110 "GET /arch/aitab" 200 678 "" "curl/7.27.0"
1348347587 192.168.0.110 "GET /arch/x86_64/root-image.fs.sfs" 200 107860206 "" "curl/7.27.0"
1348347588 192.168.0.110 "GET /arch/x86_64/usr-lib-modules.fs.sfs" 200 36819181 "" "curl/7.27.0"
1348347588 192.168.0.110 "GET /arch/any/usr-share.fs.sfs" 200 63693037 "" "curl/7.27.0"

После того, как корневая файловая система загружается через HTTP, вы в конечном итоге окажетесь в обычном запросе суперпользователя zsh.

После загрузки

Если вы не хотите, чтобы весь трафик маршрутизировался через ваш PXE-сервер (который не будет работать в любом случае, если вы не настроите его правильно), вы захотите остановить dnsmasq.service и получить новую аренду на цели установки, в зависимости от вашего сетевого расположения.

Вы также можете убить darkhttpd; объект уже загрузил корневую файловую систему, поэтому он больше не нужен. Пока он активен, вы также можете размонтировать установочный образ:

# umount /mnt/archiso

На этом этапе вы можете следовать Руководство по установке.

Альтернативные способы

Как видно из меню syslinux, существует несколько других альтернатив:

NFS

Вам нужно будет настроить сервер NFS с экспортом в корне вашего смонтированного установочного носителя, который будет /mnt/archiso, если вы следовали за разделом #Подготовка. После настройки сервера добавьте следующую строку в файл /etc/exports:

/etc/exports
mnt/archiso 192.168.0.0/24(ro,no_subtree_check)

Если сервер уже запущен, повторно экспортируйте файловые системы с помощью exportfs -r -a -v.

Настройки по умолчанию в установщике ожидают найти NFS в /run/archiso/bootmnt, поэтому вам нужно будет отредактировать параметры загрузки. Для этого нажмите вкладку в соответствующем выборе меню загрузки и отредактируйте параметр archiso_nfs_srv соответственно:

archiso_nfs_srv=${pxeserver}:/mnt/archiso

Кроме того, вы можете использовать /run/archiso/bootmnt для всего процесса.

После загрузки образа ядра начальной загрузки Arch скопирует корневую файловую систему через NFS на загрузочный хост. Это может занять некоторое время. Как только это завершится, у вас появится работающая система.

NBD

Установите пакет nbd и настройте его:

/etc/nbd-server/config
[generic]
[archiso]
    readonly = true
    exportname = /srv/archlinux-2017.12.01-x86_64.iso

Запустите nbd.service.

Существующий сервер PXE

Если у вас есть PXE-сервер с настроенной системой PXELINUX (например, комбинация DHCP и TFTP), вы можете добавить в файл pxelinux.cfg следующие пункты меню, чтобы загрузить Arch предпочтительным для вас способом:

LABEL 2
        MENU LABEL Arch Linux x86_64
        LINUX /путь/до/распакованного/Arch/ISO/arch/boot/x86_64/vmlinuz
        INITRD /путь/до/распакованного/Arch/ISO/arch/boot/intel_ucode.img,/путь/до/распакованного/Arch/ISO/arch/boot/amd_ucode.img,/путь/до/распакованного/Arch/ISO/arch/boot/x86_64/archiso.img
        APPEND archisobasedir=arch archiso_http_srv=http://httpserver/путь/до/распакованного/Arch/ISO/ ip=::
        SYSAPPEND 2
        TEXT HELP
        Arch Linux 2018.09.01 x86_64
        ENDTEXT

Вы можете заменить archiso_http_srv на archiso_nfs_srv для NFS или archiso_nbd_srv для NBD. Добавление инструкции ip= необходимо, чтобы дать указание ядру вызвать сетевой интерфейс, прежде чем попытаться смонтировать установочный носитель по сети. Смотрите README.bootparams, чтобы узнать доступные параметры загрузки.

Ошибка переименования интерфейса DHCP

FS#36749 вызывает предсказуемое переименование сетевого интерфейса по умолчанию, а затем отказ клиента dhcp из-за него. Обходным путем является добавление параметра загрузки ядра net.ifnames=0, чтобы отключить предсказуемые имена интерфейсов.

Системы с небольшим объемом памяти

Опция copytoram initramfs может использоваться для контроля того, должна ли корневая файловая система полностью копироваться в оперативную память в полном объеме в начале загрузки.

Настоятельно рекомендуется оставить этот параметр в покое, и его следует отключать только в случае необходимости (системы с физической памятью размером менее 256 МБ). Если вы хотите это сделать, добавьте copytoram=n в строку ядра.

Примечание: Поскольку для этого требуются loop-mounting squashfs из смонтированной удаленной файловой системе, copytoram=n и archiso_pxe_http являются взаимоисключающими.

Смотрите также