使用 iPXE 通过网络安装

本指南介绍如何通过网络使用 PXE 安装 Clear Linux* OS。

概述

PXE 是描述客户端-服务器与网络引导软件交互的行业标准,并使用 DHCP 和 TFTP 协议。本指南介绍了一种使用 PXE 环境安装 Clear Linux OS 的方法。

名为 iPXE 的 PXE 扩展新增了对 HTTP、iSCSIAoEFCoE 等协议的支持。iPXE 支持在没有内置 PXE 支持的计算机上使用网络引导。

要通过 iPXE 安装 Clear Linux OS,必须创建一个 PXE 客户端。图 1 描述了 PXE 服务器和 PXE 客户端之间的信息流。

PXE information flow

图 1:PXE 信息流。

警告

通过 PXE 过程引导的 Clear Linux OS 映像会自动擦除 PXE 客户端系统上的所有数据和分区,并创建 3 个新分区来安装该映像。

必备条件

使用 iPXE 引导之前,请做好以下准备。

将 PXE 服务器和 PXE 客户端连接到专用网络上的交换机,如图 2 所示。

Network topology

图 2:网络拓扑。

在 PXE 客户端的引导顺序中,网络引导选项需要优先于磁盘引导选项。

PXE 服务器必须:

  • 具有以太网/局域网引导选项。
  • 具有至少两个网络适配器。
  • 连接到公共网络。
  • 禁用安全引导选项。

注解

您必须在 BIOS 中禁用安全引导选项,因为用于引导 Clear Linux OS 的 UEFI 二进制文件未经签名。

配置

要使用 iPXE 自动设置 Clear Linux OS,请使用随 ICIS 附带的 configure-ipxe.sh 脚本。有关该脚本的其他说明,请参阅 ister-cloud-init-svc GitHub* 存储库中的指南。

要手动设置 Clear Linux OS,请执行以下步骤。

  1. 定义 iPXE 引导配置使用的变量。

    ipxe_app_name=ipxe
    ipxe_port=50000
    web_root=/var/www
    ipxe_root=$web_root/$ipxe_app_name
    tftp_root=/srv/tftp
    external_iface=eno1
    internal_iface=eno2
    pxe_subnet=192.168.1
    pxe_internal_ip=$pxe_subnet.1
    pxe_subnet_mask_ip=255.255.255.0
    pxe_subnet_bitmask=16
    
  2. 登录并获得 root 特权。

    sudo -s
    
  3. pxe-server 捆绑包添加到 Clear Linux OS 系统。该捆绑包含有运行 PXE 服务器所需的所有文件。

    sudo swupd bundle-add pxe-server
    
  4. 下载 Clear Linux OS 的最新网络引导版本,并提取文件。

    sudo mkdir -p $ipxe_root
    sudo curl -o /tmp/clear-pxe.tar.xz \
      https://cdn.download.clearlinux.org/current/clear-$(curl \
      https://cdn.download.clearlinux.org/latest)-pxe.tar.xz
    sudo tar -xJf /tmp/clear-pxe.tar.xz -C $ipxe_root
    sudo ln -sf $(ls $ipxe_root | grep 'org.clearlinux.*') $ipxe_root/linux
    

    注解

    确保初始 ramdisk 文件命名为 initrd,内核文件命名为 linux (这是一个指向实际内核文件的符号链接)。

  5. 创建包含以下内容的 iPXE 引导脚本。在 iPXE 引导过程中,iPXE 引导脚本会指示 PXE 客户端下载引导和安装 Clear Linux OS 所需的文件。使用先前提供给初始 ramdisk 和内核文件的名称。

    sudo cat > $ipxe_root/ipxe_boot_script.ipxe << EOF
    #!ipxe
    kernel linux quiet init=/usr/lib/systemd/systemd-bootchart \
    initcall_debug tsc=reliable no_timer_check noreplace-smp rw \
    initrd=initrd
    initrd initrd
    boot
    EOF
    
  6. pxe-server 捆绑包含一个名为 nginx 的轻量级 Web 服务器。为 nginx 创建一个配置文件,以便 Clear Linux OS 为 PXE 客户端提供以下内容:

    sudo mkdir -p /etc/nginx/conf.d
    sudo cat > /etc/nginx/conf.d/$ipxe_app_name.conf << EOF
    server {
      listen $ipxe_port;
      server_name localhost;
      location /$ipxe_app_name/ {
        root $web_root;
        autoindex on;
      }
    }
    EOF
    
    sudo cp /usr/share/nginx/conf/nginx.conf.example /etc/nginx/nginx.conf
    

    注解

    创建一个单独的 nginx 配置文件,以便在非标准端口号上提供网络引导映像。此操作会保存现有的 nginx 配置。

  7. 启动 nginx 并启用引导时启动选项。

    sudo systemctl start nginx
    sudo systemctl enable nginx
    
  8. pxe-server 捆绑包包含一个轻量级 DNS 服务器,该服务器与 systemd-resolved 中提供的 DNS 存根侦听器冲突。请禁用 DNS 存根侦听器,并暂时停止 systemd-resolved

    sudo mkdir -p /etc/systemd
    sudo cat > /etc/systemd/resolved.conf << EOF
    [Resolve]
    DNSStubListener=no
    EOF
    
    sudo systemctl stop systemd-resolved
    
  9. 为专用网络的网络适配器分配一个静态 IP 地址,并使用以下命令重新启动 systemd-networkd

    sudo mkdir -p /etc/systemd/network
    sudo cat > /etc/systemd/network/70-internal-static.network << EOF
    [Match]
    Name=$internal_iface
    [Network]
    DHCP=no
    Address=$pxe_internal_ip/$pxe_subnet_bitmask
    EOF
    
    sudo systemctl restart systemd-networkd
    
  10. 配置 NAT,将流量从专用网络路由到公共网络。此操作会让 PXE 服务器充当路由器。要使这些更改在重启期间保持不变,请使用以下命令将更改保存到防火墙:

    sudo iptables -t nat -F POSTROUTING
    sudo iptables -t nat -A POSTROUTING -o $external_iface -j MASQUERADE
    sudo systemctl enable iptables-save.service
    sudo systemctl restart iptables-save.service
    sudo systemctl enable iptables-restore.service
    sudo systemctl restart iptables-restore.service
    

    注解

    防火墙会遮掩数据包,使其看起来像来自 PXE 服务器,并对公共网络隐藏 PXE 客户端。

  11. 配置内核,将网络数据包转发到不同的接口。否则,NAT 将不起作用。

    sudo mkdir -p /etc/sysctl.d
    sudo echo net.ipv4.ip_forward=1 > /etc/sysctl.d/80-nat-forwarding.conf
    sudo echo 1 > /proc/sys/net/ipv4/ip_forward
    
  12. pxe-server 捆绑包包含 iPXE 固件映像,这些映像允许没有 iPXE 实现的计算机执行 iPXE 引导。创建一个 TFTP 托管目录,并用以下命令用 iPXE 固件映像填充该目录:

    sudo mkdir -p $tftp_root
    sudo ln -sf /usr/share/ipxe/undionly.kpxe $tftp_root/undionly.kpxe
    
  13. pxe-server 捆绑包包含一个名为 dnsmasq 的轻量级 TFTP、DNS 和 DHCP 服务器。为 dnsmasq 创建一个配置文件,以便监听这些功能的专用 IP 地址。专用网络上的 PXE 客户端将使用此 IP 地址。

    sudo cat > /etc/dnsmasq.conf << EOF
    listen-address=$pxe_internal_ip
    EOF
    
  14. 将通过 TFTP 向 PXE 客户端提供 iPXE 固件映像的选项添加到 dnsmasq 配置文件中。

    sudo cat >> /etc/dnsmasq.conf << EOF
    enable-tftp
    tftp-root=$tftp_root
    EOF
    
  15. 将为 PXE 客户端托管 DHCP 服务器的选项添加到 dnsmasq 配置文件中。

    sudo cat >> /etc/dnsmasq.conf << EOF
    dhcp-leasefile=/var/db/dnsmasq.leases
    
    dhcp-authoritative
    dhcp-option=option:router,$pxe_internal_ip
    dhcp-option=option:dns-server,$pxe_internal_ip
    
    dhcp-match=set:pxeclient,60,PXEClient*
    dhcp-range=tag:pxeclient,$pxe_subnet.2,$pxe_subnet.253,$pxe_subnet_mask_ip,15m
    dhcp-range=tag:!pxeclient,$pxe_subnet.2,$pxe_subnet.253,$pxe_subnet_mask_ip,6h
    
    dhcp-match=set:ipxeboot,175
    dhcp-boot=tag:ipxeboot,http://$pxe_internal_ip:$ipxe_port/$ipxe_app_name/ipxe_boot_script.ipxe
    dhcp-boot=tag:!ipxeboot,undionly.kpxe,$pxe_internal_ip
    EOF
    

    该配置提供以下重要功能:

    • 将没有 iPXE 实现的 PXE 客户端定向到 TFTP 服务器,以获取特定于体系结构的 iPXE 固件映像,从而允许这些客户端执行 iPXE 引导。
    • 仅在具有指定子网中 IP 地址的网络适配器上激活。
    • 将 PXE 客户端定向到 DNS 服务器。
    • 将 PXE 客户端定向到 PXE 服务器,以便通过 NAT 进行路由。
    • 将专用网络分成两个 IP 地址池。一个地址池用于网络引导,一个地址池在引导后使用。每个地址池都有自己的租赁时间。
  16. dnsmasq 创建一个文件,记录它向 PXE 客户端提供的 IP 地址。

    sudo mkdir -p /var/db
    sudo touch /var/db/dnsmasq.leases
    
  17. 启动 dnsmasq 并启用引导时启动。

    sudo systemctl enable dnsmasq
    sudo systemctl restart dnsmasq
    
  18. 启动 systemd-resolved

    sudo systemctl start systemd-resolved
    

    注解

    如果使用 dnsmasq DNS 服务器,systemd-resolved 会动态更新专用网络的 DNS 服务器列表。该设置会创建一个直通 DNS 服务器,该服务器依赖于 /etc/resolv.conf 中列出的 DNS 服务器。

  19. 打开 PXE 客户端的电源,观看客户端引导并安装 Clear Linux OS。

    引导后,Clear Linux OS 会自动对硬盘分区,自行安装,更新到最新版本,然后重新引导。

祝贺您!您已成功安装并配置了 PXE 服务器,使 PXE 客户端能够通过网络引导并安装 Clear Linux OS。