Triển khai Netboot.xyz trên Docker: Xây dựng máy chủ PXE Boot cho HomeLab để cài đặt hệ điều hành và công cụ cứu hộ

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

Tạm biệt ngăn kéo chất đầy USB flash drive

Hầu hết các homelab đều có một “nghĩa địa” USB. Bạn hẳn cũng có một chiếc chứa MemTest86, một chiếc khác cài Clonezilla, hai chiếc 8GB cũ kỹ với các bản ISO Ubuntu lỗi thời, và một chiếc bí ẩn từ tận năm 2021. Mỗi khi một máy chủ Proxmox rơi vào emergency shell hoặc chiếc mini PC bị lỗi bootloader, việc khắc phục sự cố lại biến thành một cực hình.

Đầu tiên, bạn phải lục tung ngăn kéo để tìm một chiếc USB còn dùng được. Sau đó, bạn mất mười phút chờ BalenaEtcher ghi bản image 4GB với tốc độ USB 2.0 rùa bò. Cuối cùng, bạn lại phải bò ra sau tủ rack để cắm nó vào.

Những chiếc flash drive giá rẻ cũng thường lăn ra hỏng bất thình lình. Chúng giảm tuổi thọ chỉ sau vài chục lần ghi và rất hay báo lỗi I/O ngay giữa lúc giải nén Linux kernel. Nếu bạn quản lý một cụm gồm ba hay bốn node, sử dụng thiết bị cài đặt vật lý chỉ làm tốn thời gian của bạn.

Cách PXE Boot tách biệt phần cứng khỏi thiết bị lưu trữ cục bộ

Bo mạch chủ máy chủ và card mạng (NIC) desktop hiện đại không cần gắn thêm ổ flash để khởi động. Network boot đã là một phần trong thông số kỹ thuật PXE của Intel từ năm 1999 và được tích hợp trực tiếp vào các chip UEFI cũng như legacy BIOS. Thay vì đọc các block từ bộ điều khiển flash cục bộ, card mạng sẽ yêu cầu một bootloader thực thi từ mạng LAN trước khi hệ điều hành chính bắt đầu tải.

Quy trình bắt tay PXE 4 bước

  1. DHCP Discovery: Máy client bật nguồn, khởi tạo NIC và gửi broadcast một yêu cầu DHCP để xin địa chỉ IP cùng các tag cấu hình PXE.
  2. Next-Server Resolution: Máy chủ DHCP cấp phát một IP (ví dụ: 192.168.1.120) đồng thời trả về DHCP Option 66 (IP của máy chủ TFTP) và Option 67 (tên file bootloader).
  3. Tải Bootstrap: Client kết nối tới dịch vụ TFTP qua cổng UDP 69, tải về một chương trình bootstrap nhỏ gọn như netboot.xyz.efi (khoảng 1.5MB) và thực thi trực tiếp trên RAM.
  4. Chuyển tiếp tài nguyên qua HTTP: Bootloader chuyển từ giao thức TFTP chậm chạp sang HTTP tiêu chuẩn. Nó tải các kernel Linux, file initramfs và payload squashfs dạng live qua mạng 1Gbps hoặc 2.5Gbps của bạn với tốc độ tối đa của đường truyền.

Trước đây, để thiết lập hệ thống này, bạn phải quản lý các dịch vụ rời rạc gồm tftpd-hpa, Syslinux, ISC-DHCP và Nginx. Netboot.xyz gói gọn tất cả các thành phần phụ thuộc đó vào một bộ iPXE duy nhất do cộng đồng duy trì. Đóng gói bộ công cụ này trong một container Docker giúp quá trình triển khai chỉ mất chưa đầy năm phút.

Triển khai Netboot.xyz bằng Docker

Hãy chạy container này trên bất kỳ máy nào hoạt động 24/7—chẳng hạn như một máy chủ lưu trữ sẵn có, mini PC hoặc một máy ảo quản trị chạy Ubuntu 24.04 hay Debian 12. Mức tiêu thụ tài nguyên của container rất nhỏ, khi ở trạng thái nghỉ chỉ tốn dưới 150MB RAM.

Bước 1: Thiết lập thư mục và file Compose

Tạo các thư mục riêng trên máy chủ host để chứa cấu hình boot và các tài nguyên ISO được cache cục bộ:

sudo mkdir -p /opt/netbootxyz/config /opt/netbootxyz/assets
sudo chown -R 1000:1000 /opt/netbootxyz
cd /opt/netbootxyz

Tại đây, bạn bắt buộc phải dùng chế độ host networking. PXE dựa vào TFTP (UDP 69) và các gói relay DHCP broadcast—những thứ không thể truyền tải trơn tru qua mạng bridge mặc định của Docker vốn sử dụng NAT port forwarding. Tạo file docker-compose.yml của bạn:

cat <<'EOF' > docker-compose.yml
services:
  netbootxyz:
    image: ghcr.io/netbootxyz/netbootxyz:latest
    container_name: netbootxyz
    network_mode: host
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
      - PORT_RANGE=30000:30010
      - SUBFOLDER=/
    volumes:
      - /opt/netbootxyz/config:/config
      - /opt/netbootxyz/assets:/assets
    restart: unless-stopped
EOF

Khởi chạy stack ở chế độ chạy nền:

docker compose up -d
docker compose logs -f netbootxyz

Xác nhận rằng cả ba dịch vụ nội bộ đều đang lắng nghe trên máy host. Bạn sẽ thấy UDP 69 (TFTP), TCP 80 (HTTP asset server) và TCP 3000 (giao diện web quản trị):

ss -tuln | grep -E ':(69|80|3000)'

Bước 2: Trỏ router về Netboot.xyz

Các máy client trong mạng sẽ không thể boot cho đến khi máy chủ DHCP của bạn công bố các endpoint PXE. Hãy đăng nhập vào router/gateway của bạn—dù là pfSense, OPNsense, OpenWrt hay UniFi Dream Machine.

Giả sử Docker host của bạn sử dụng IP tĩnh 192.168.1.50, hãy cấu hình các tùy chọn sau trong máy chủ DHCP:

  • Next Server / Boot Server (Option 66): 192.168.1.50
  • Bootfile Name (Option 67): netboot.xyz.efi (cho máy UEFI 64-bit hiện đại) hoặc netboot.xyz.kpxe (cho legacy BIOS).

Nếu router của bạn chạy Dnsmasq (phổ biến trên OpenWrt, DD-WRT và Pi-hole), bạn không cần phải lựa chọn thủ công giữa UEFI và BIOS. Bạn có thể nhận diện cờ kiến trúc một cách linh hoạt:

# Nhận diện kiến trúc client (Option 93)
dhcp-match=set:bios,option:client-arch,0
dhcp-match=set:efi-x86_64,option:client-arch,7
dhcp-match=set:efi-x86_64,option:client-arch,9

# Điều hướng client tới file nhị phân phù hợp
dhcp-boot=tag:bios,netboot.xyz.kpxe,,192.168.1.50
dhcp-boot=tag:efi-x86_64,netboot.xyz.efi,,192.168.1.50

Áp dụng các cài đặt và tải lại dịch vụ DHCP.

Bước 3: Giao diện Web và tùy chỉnh Menu

Mở http://192.168.1.50:3000 trên trình duyệt của bạn. Bảng điều khiển sẽ hiển thị các phiên bản menu và cho phép bạn tải về các bản cập nhật tài nguyên mới nhất trực tiếp từ GitHub.

Theo mặc định, Netboot.xyz sẽ tải các bộ cài đặt từ các mirror công khai trên internet. Tuy nhiên, bạn hoàn toàn có thể lưu trữ các bản image cứu hộ cục bộ ngay trên máy chủ Docker để tiết kiệm băng thông và tăng tốc độ khởi động. Ví dụ: một bản live image GParted dung lượng 1.2GB chỉ mất khoảng 10 giây để tải qua mạng LAN Gigabit. Tải kernel và initrd vào thư mục /opt/netbootxyz/assets/gparted/, sau đó thêm mục tùy chỉnh vào /opt/netbootxyz/config/menus/custom.ipxe:

cat <<'EOF' > /opt/netbootxyz/config/menus/custom.ipxe
#!ipxe

:custom
clear custom_choice
menu Công cụ cứu hộ HomeLab cục bộ
item --gap -- Cong cu cuu ho
item gparted GParted Live 1.6 (HTTP cuc bo)
item shell Chuyen sang iPXE Shell
item return Quay lai Menu chinh
choose custom_choice || goto custom_exit
eval ${custom_choice}
goto custom

:gparted
echo Dang tai GParted Live qua HTTP...
set base-url http://192.168.1.50/assets/gparted
kernel ${base-url}/vmlinuz boot=live config components union=overlay noswap net.ifnames=0 nosplash fetch=${base-url}/filesystem.squashfs
initrd ${base-url}/initrd.img
boot || goto custom

:shell
shell
goto custom

:return
chain --autofree boot.cfg ||
exit

:custom_exit
exit
EOF

Bước 4: Khởi động các Node Bare-Metal và Máy ảo

Bật nguồn máy đích—chẳng hạn như một chiếc Dell OptiPlex, Lenovo Tiny hoặc một máy ảo Proxmox mới tạo. Nhấn F12 (hoặc F11 tùy thuộc vào bo mạch chủ của bạn) trong màn hình POST để mở menu boot tạm thời. Chọn UEFI Network Boot.

Chỉ trong vòng ba giây, client sẽ nhận địa chỉ IP, nạp netboot.xyz.efi qua TFTP và hiển thị menu văn bản iPXE. Giờ đây, bạn có thể cài đặt Debian 12, khởi tạo node Proxmox VE, xóa sạch ổ cứng bằng DBAN hoặc sao lưu phân vùng bằng Clonezilla mà không cần chạm vào bất kỳ chiếc USB nào.

Trong một phòng lab thử nghiệm với năm máy chủ vật lý, mô hình này giúp rút ngắn thời gian cài đặt lại máy từ một việc tốn hàng giờ đồng hồ xuống chỉ còn một lần reboot mất đúng hai phút. Bạn sẽ không còn phải bận tâm về USB lỗi, file ISO cũ hay những lần phải chạy đi chạy lại đến tủ rack.

Những điểm cốt lõi dành cho quản trị Lab

Network booting biến việc cài đặt hệ điều hành thành một dịch vụ theo yêu cầu. Chỉ với Netboot.xyz chạy trong Docker container và hai cấu hình DHCP tag trên router, bất kỳ hệ thống nào kết nối vào switch đều có thể cài đặt hệ điều hành hoặc khởi động môi trường cứu hộ ngay lập tức. Hãy giữ các file squashfs thường dùng trong volume /assets cục bộ để tối đa hóa tốc độ truyền tải, đảm bảo cổng 80 không bị xung đột trên host và cho ngăn kéo USB của bạn nghỉ hưu vĩnh viễn.

Share: