雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

在 Ubuntu 或 Debian 上设置 netboot.xyz iPXE 服务器

2024-06-26 65

您是否厌倦了每次要安装基于 Linux 的操作系统时都使用可启动 USB 介质?在这里,我们向您展示一个解决方案,可帮助您轻松在裸机或虚拟化环境中自动化安装 Linux 和 Unix 系统。这肯定会节省您大量时间,并使操作系统安装过程变得有趣且快速。

我们所说的工具正是netboot.xyz。该软件的创建是为了使用户能够通过其轻量级工具启动多种类型的操作系统,根据互联网的速度,您可以在几秒钟或几分钟内启动并运行。您可以探索和测试任何操作系统,而无需一遍又一遍地下载 ISO 和重写介质。 netboot.xyz 还可用于救援操作系统,这对于系统管理员角色至关重要。

netboot.xyz 工具使用 iPXE 项目在 BIOS 中提供用户友好的菜单,您可以在其中选择要安装的操作系统,同时自定义启动标志。这是通过网络上大多数系统上可用的预启动执行环境 (PXE) 实现的。我们创建这篇文章是为了演示如何在 Ubuntu 或 Debian 上执行安装、配置和使用 netboot.xyz iPXE

在我们的安装中,我们充分利用 Docker 或 ansible 在 Ubuntu 或 Debian Linux 机器上设置 netboot.xyz iPXE 环境。这些方法会自动从默认配置生成自定义模板,但您可以覆盖它们。这使您能够自定义 netboot.xyz 环境以满足您的规范。

1. 更新您的系统

登录到要配置 netboot.xyz 的服务器并更新它。

sudo apt update && sudo apt upgrade -y

有时更新后需要重新启动。

[ -f /var/run/reboot-required ] && sudo reboot -f

2. 设置netboot.xyz环境

我们将考虑两种方法来实现这一目标。

方法一:使用Docker容器(推荐

要安装 Docker Engine,请运行以下命令,如如何在 Linux 系统上安装 Docker Engine 一文中所述。

Ubuntu:

sudo apt update
sudo apt -y install lsb-release gnupg apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker $USER
newgrp docker

Debian:

sudo apt update
sudo apt install lsb-release gnupg2 apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/debian.gpg
sudo add-apt-repository "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker $USER
newgrp docker

检查 docker 版本以确认安装成功。

$ docker --version
Docker version 25.0.0, build e758fe5

创建将包含容器内容的目录。

mkdir ~/netboot_xyz && ~/netboot_xyz

创建 docker 撰写文件

vim docker-compose.yml

以下是您可以修改的内容。

---
services:
  netbootxyz:
    image: ghcr.io/netbootxyz/netbootxyz
    container_name: netbootxyz
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - ./config:/config
      - ./assets:/assets #optional
    ports:
      - 3000:3000
      - 69:69/udp
      - 80:80 #optional
    restart: unless-stopped

使用的参数:

端口 (-p)

环境变量 (-e)

体积映射 (-v)

拉取容器镜像。

jkmutai@pxe:~/netboot_xyz$ docker compose pull
[+] Pulling 4/4
 ✔ netbootxyz 3 layers [⣿⣿⣿]      0B/0B      Pulled                                                                                                                                             31.2s
   ✔ 661ff4d9561e Pull complete                                                                                                                                                                  3.2s
   ✔ c5bf41c866f3 Pull complete                                                                                                                                                                 26.2s
   ✔ 6bd6a73a9b6f Pull complete                                                                                                                                                                  2.3s

使用以下命令启动容器。

$ docker compose up -d
[+] Running 1/2
 ⠼ Network netboot_xyz_default  Created                                                                                                                                                          0.4s
 ✔ Container netbootxyz         Started

您可以如下检查命令的状态。

$ docker compose ps
NAME         IMAGE                           COMMAND          SERVICE      CREATED              STATUS              PORTS
netbootxyz   ghcr.io/netbootxyz/netbootxyz   "sh /start.sh"   netbootxyz   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:69->69/udp, :::69->69/udp, 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp

访问http://serverIP:3000上的Web配置界面

接下来转到步骤3

方法 2:使用 Ansible Playbook(仅供参考

安装 Python 3 和 pip 模块。

sudo apt install python3 python3-pip

使用 pip python 包管理器安装 Ansible。

pip3 install --user ansible

~/.local/bin 添加到默认情况下不存在的 PATH 中。

### Bash ###
echo 'export PATH=$PATH:~/.local/bin' >>~/.bashrc

### Zsh ###
echo 'export PATH=$PATH:~/.local/bin' >>~/.zshrc

获取 bash 或 zsh 配置文件以使用已安装的 ansible 二进制文件。

### Bash ###
source ~/.bashrc

### Zsh ###
source ~/.zshrc

通过检查ansible版本来测试安装是否成功。

$ ansible --version
ansible [core 2.16.2]
  config file = None
  configured module search path = ['/home/jkmutai/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/jkmutai/.local/lib/python3.10/site-packages/ansible
  ansible collection location = /home/jkmutai/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/jkmutai/.local/bin/ansible
  python version = 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] (/usr/bin/python3)
  jinja version = 3.0.3
  libyaml = True

安装 git,它用于从 github 克隆 netboot.xyz 代码。

sudo apt install git

查看 netboot.xyz github 存储库。

git clone https://github.com/netbootxyz/netboot.xyz.git

将工作目录切换到 netboot.xyz。

cd netboot.xyz

这是 Ansible 角色结构

用于设置 netbootxyz 环境的 ansible 角色具有以下主要组件;

  • defaults/main.yml – 包含部署、操作系统版本、实用程序和引导加载程序的默认设置
  • tasks/* – 包含渲染模板和编译 iPXE 引导加载程序的所有任务
  • 模板/磁盘 – iPXE 引导加载程序的模板
  • 模板/菜单 – netboot.xyz 菜单的模板
  • vars/* – 包含支持编译和部署 netboot.xyz 所需的软件包列表

要覆盖默认值,请在 user_overrides.yml 中提供您的覆盖。有关示例,请参阅 user_overrides.yml。

# set desired site name
site_name: ipxe.lab.example.com

# set desired boot domain
boot_domain: lab.example.com

bootloader_tftp_enabled: true
bootloader_https_enabled: true
bootloader_http_enabled: true

使用以下命令运行 ansible playbook,在 Ubuntu 或 Debian 系统上设置 netbootxyz 环境。

### Running as root user ###
ansible-playbook -i inventory site.yml

### Running as normal user with sudo password ###
ansible-playbook -i inventory site.yml --become --ask-become-pass 

执行的剧本将执行以下操作;

  • 使用默认配置设置为 netboot.xyz 环境生成菜单
  • 生成 iPXE 引导加载程序以引导到该环境
  • 为那些想要添加其他选项的人生成自定义菜单选项

成功安装将在输出中包含 failed=0

所有生成的内容将放置在默认的 Web 服务器根目录中 - /var/www/html

ls -lh /var/www/html

Ubuntu Linux 的 iPXE 文件示例。

cat /var/www/html/ubuntu.ipxe

您可以在浏览器中打开http://serverIPhttp://serverIP/ipxe/来查看以图形方式显示内容。

安装TFTP服务器

需要 tftp 服务器来托管 iPXE 文件。我们还可以使用 dnsmasq

sudo apt -y install dnsmasq

然后将配置编辑到 /etc/dnsmasq.conf 并设置如下。

$ sudo vim /etc/dnsmasq.conf
enable-tftp
tftp-root=/var/www/html/
dhcp-boot=netboot.xyz.kpxe

更改 systemd 解析的链接以避免端口 53 上发生冲突

sudo ln -fs /run/systemd/resolve/resolv.conf /etc/resolv.conf

重新启动这两个服务

sudo systemctl restart dnsmasq systemd-resolved

3. 在 DHCP 服务器上配置 TFTP

要以 PXE 方式引导系统,您需要一个现有的 DHCP 服务器,您可以在其中将此 TFTP 服务器设置为 DHCP 引导目标。我们的设置仅提供托管来自 netboot.xyz 的最新 IPXE 内核版本的 TFTP 服务器。

有一个选项可以设置您自己的 DHCP 服务器并在设置中配置下一个服务器参数。请参见下面的示例。

option arch code 93 = unsigned integer 16;

subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.34 192.168.0.254;       # Change this range as appropriate for your network
  next-server 192.168.1.254;               # Change this to the address of your netboot.xyz TFTP server
  option subnet-mask 255.255.255.0;
  option routers 192.168.1.1;             # Change this to the address of your router
  option broadcast-address 192.168.1.255;
  option domain-name "mylab.example.com";     # This is optional
  option domain-name-servers 1.1.1.1;
  if exists user-class and ( option user-class = "iPXE" ) {
    filename "http://boot.netboot.xyz/menu.ipxe";
  } elsif option arch = encode-int ( 16, 16 ) {
    filename "http://boot.netboot.xyz/ipxe/netboot.xyz.efi";
    option vendor-class-identifier "HTTPClient";
  } elsif option arch = 00:07 {
    filename "netboot.xyz.efi";
  } else {
    filename "netboot.xyz.kpxe";
  }
}

其中 192.168.1.254 是 netboot.xyz 服务器的 IP 地址。

一些路由器设置示例

让我们考虑一些路由器示例,了解如何更新 DHCP 服务器设置,以配置指向具有启动文件名的 TFFP 服务器的下一个服务器地址。

netboot.xyz 引导文件类型

以下是您可以在 DHCP 配置中设置为启动文件的启动文件名称列表。

奥普森感

导航至服务 -> DHCP 服务器,然后选择要更改 DHCP 设置的网络名称。设置TFTP服务器IP

在“网络启动”>高级部分下设置服务器的IP地址。

设置如下。

  • 勾选启用网络启动
  • 将下一个服务器 IP 设置为您的服务器 IP 地址
  • 将默认 BIOS 文件名设置为 netboot.xyz.kpxe
  • 将 UEFI 32 和 64 位文件名设置为 netboot.xyz.efi

PFSense

设置与 OPNsense 类似。请参阅下面的屏幕截图。

Unifi 安全网关(带控制器)

导航至网络 -> LAN(或您需要启动的其他网络)-> <高级 DHCP 选项

  • 勾选启用网络启动
  • 服务器 – 设置 YOURSERVERIP
  • 文件名- netboot.xyz.kpxe

4.使用netboot.xyz安装操作系统

对于裸机,在 BIOS 设置中启用网络启动并打开服务器电源。

对于虚拟机环境,创建一个没有 ISO 的 VM,然后更改启动顺序以通过网络启动启动。

接下来启动 VM,PXE 启动过程应立即开始。

接下来,您将看到 netboot.xyz 菜单。

如果您需要启动实时映像并执行系统修复或数据恢复,请选择要安装的分发版或工具映像。


更新于:5个月前
赞一波!

文章评论

评论问答