Preboot Execution Environment (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态:本文是 PXE翻译。上次翻译日期:2014-08-31。如果英文版本有所更改,则您可以帮助同步翻译。

维基百科:预启动执行环境

预启动执行环境(Preboot eXecution Environment,PXE,也被称为预执行环境)提供了一种使用网络接口(Network Interface)启动计算机的机制。这种机制让计算机的启动可以不依赖本地数据存储设备(如硬盘)或本地已安装的操作系统。

在本指南中,PXE 用于通过支持 PXE 的 Option ROM 在目标机器上启动安装介质。

准备

here 这里下载最新的官方安装镜像并挂载:

# mkdir -p /mnt/archiso
# mount -o loop,ro archlinux-2013.11.01-dual.iso /mnt/archiso

服务器搭建

为了配置网络、加载 pxelinux/kernel/initramfs 并最终加载根文件系统,您需要分别搭建 DHCP、IFTP 和 HTTP 服务器。

网络

激活网卡,并分配一个合适的地址。

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

DHCP + TFTP

为了在安装目标上配置网络并在 PXE 服务端和客户端之间传输文件,需要搭建 DHCP 和 TFTP 服务器;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 systemd 服务.

HTTP

ArchISO的改进使其能从 HTTP(archiso_pxe_http initcpio hook)或 NFS(archiso_pxe_nfs initcpio hook)启动;在所有备选方案中,darkhttpd 是最容易设置的(也是最轻量的)。

首先,从官方软件仓库安装 darkhttpd

然后用/mnt/archiso作文件根目录并启动 darkhttpd

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

安装

在本小节,您需要知道如何让客户端进行 PXE 启动。屏幕显示 POST 信息时,某个角落通常会有提示,按哪个键进行 PXE 启动。在 IBM x3650 上,F12 会调出启动菜单,第一个选项就是 Network;在 Dell PE 1950/2950 上,按下 F12 会直接开始 PXE 启动。

启动

通过journald,可以查看 PXE 服务器早期 PXE 启动过程的信息:

# journalctl -u dnsmasq -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.0archiso.cfg 文件后,您会看到 syslinux 启动菜单。

根据 CPU 构架,选择 Boot Arch Linux (x86_64) (HTTP)Boot Arch Linux (i686) (HTTP)

接着会传送内核和 initramfs:

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

如果一切顺利,就能从 PXE 目标机器上看到 darkhttpd 活动了:这时,内核就能在 PXE 目标机器上加载并初始化:

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"

根文件系统下载完后就能看到使用 grmlzsh 的提示符了。

启动后工作

除非想让所有流量都走 PXE 服务器(没有恰当的配置这是不可能的),请停止 dnsmasq 服务并在新安装的系统上重新获取适合当前网络架构的租约。

systemctl stop dnsmasq.service

您也可以关闭 darkhttpd;因为目标机器已经下载好根文件系统了,它也就不再需要了。同时您也可以卸载安装镜像了:

# umount /mnt/archiso

接着请跳转至安装指南

备用方法

syslinux 菜单中暗含着其他方法:

NFS

您需搭建 NFS 服务器并将安装镜像的挂载点作为出口(export)。如果您按照#准备 段落做了的话,出口就是 /mnt/archiso。服务器搭建起来后,往 /etc/exports 写入这行:

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

如果服务器已经在运行了,用exportfs -r -a -v 重新导入文件系统。

安装程序会在 /run/archiso/bootmnt 查找 NFS,因此您需要编辑启动选项。在启动菜单按下 Tab 修改 archiso_nfs_srv

archiso_nfs_srv=${pxeserver}:/mnt/archiso

或者,您也可以整个过程中都使用 /run/archiso/bootmnt

在内核加载后,Arch bootstrap 镜像会复制根文件系统到引导主机(booting host)。这需要一定的额时间。一旦复制完成,您就有可运作的系统了。

NBD

安装 nbd 并配置:

# vim /etc/nbd-server/config
[generic]
[archiso]
    readonly = true
    exportname = /srv/archlinux-2013.02.01-dual.iso

启动 服务 nbd

已有的 PXE 服务器

如果已经有了 syslinux 系统的 PXE 服务器(BIND+DHCPd+TFTPd), 可以将下面内容加入 pxelinux.cfg 配置文件,这样就可以用需要的方式启动 Arch。

# vim /srv/tftp/arch.menu
LABEL 2
        MENU LABEL Arch Linux x86_64
        LINUX /path/to/extracted/Arch/ISO/arch/boot/x86_64/vmlinuz
        INITRD /path/to/extracted/Arch/ISO/arch/boot/intel_ucode.img,/path/to/extracted/Arch/ISO/arch/boot/x86_64/archiso.img
        APPEND archisobasedir=arch archiso_nfs_srv=${nfsserver}:/path/to/extracted/Arch/ISO/ ip=:::::eth0:dhcp
        SYSAPPEND 3
        TEXT HELP
        Arch Linux 2016.03 x86_64
        ENDTEXT

要启动 32 位系统,将 x86_64 替换为 i686。还可以将 archiso_nfs_srv 替换为其它支持的方式。为了在挂载安装介质前启动网络,需要使用 ip= 参数。

DHCP interface rename bug

As of November 2015 there is FS#36749 that causes default predictable network interface renaming to fail and then dhcp client to fail because of it. A workaround is to add the kernel boot parameter net.ifnames=0 to disable predictable interface names.

小内存

copytoram initramfs 选项可以控制是否在启动时将根文件系统整个复制到内存中。

强烈建议不去改动该选项,且只在必要的时候禁用(物理内存小于 ~256MB)。 如果要这么做,向内核参数加入 copytoram=n。请注意,该选项不支持通过 HTTP 传输文件;必须使用 NFS 或 NBD。