Thiết lập máy chủ PXE Boot trên Linux với Dnsmasq và iPXE

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Việc nhét đầy USB vào túi rồi chạy đi chạy lại giữa các tủ rack máy chủ thực sự rất mệt mỏi. Nếu bạn quản lý năm hay mười node vật lý, việc ghi từng file ISO ra USB sẽ ngốn hàng giờ đồng hồ. Đó là chưa kể USB rất dễ thất lạc, lỗi dữ liệu hoặc hỏng hóc sau nhiều lần cắm rút.

Network boot (khởi động qua mạng) sẽ loại bỏ hoàn toàn phiền phức đó. Máy chủ Preboot Execution Environment (PXE) sẽ truyền trực tiếp bộ cài đặt hệ điều hành đến phần cứng bare-metal qua mạng LAN. Khi kết hợp Dnsmasq (một daemon DHCP và TFTP gọn nhẹ) với iPXE (bootloader mã nguồn mở hỗ trợ HTTP và HTTPS), bạn sẽ có một máy chủ provisioning tập trung, tốc độ cao mà không cần thay thế router chính.

Bắt đầu nhanh (5 phút)

Bài hướng dẫn này sử dụng Debian 12 hoặc Ubuntu 22.04/24.04 LTS. Chúng ta sẽ cấu hình Dnsmasq ở chế độ ProxyDHCP. Chế độ này sẽ chèn các chỉ dẫn boot qua mạng vào broadcast domain trong khi vẫn để router chính toàn quyền cấp phát địa chỉ IP.

1. Cài đặt Dnsmasq

sudo apt update
sudo apt install -y dnsmasq wget

2. Tạo thư mục gốc TFTP và tải các binary iPXE

Môi trường hiện đại cần hỗ trợ cả các node chạy BIOS legacy lẫn firmware UEFI 64-bit hiện nay:

sudo mkdir -p /var/lib/tftpboot
cd /var/lib/tftpboot

# Tải về các bootloader iPXE đã được build sẵn từ upstream
sudo wget http://boot.ipxe.org/undionly.kpxe
sudo wget http://boot.ipxe.org/ipxe.efi
sudo chmod -R 755 /var/lib/tftpboot

3. Cấu hình Dnsmasq làm ProxyDHCP

Thêm cấu hình này vào /etc/dnsmasq.d/pxe.conf. Hãy thay đổi 192.168.1.50 thành IP tĩnh của máy chủ và 192.168.1.0 sao cho khớp với subnet của bạn:

# /etc/dnsmasq.d/pxe.conf

# Tắt dịch vụ DNS để tránh xung đột cổng 53
port=0

# Bật máy chủ TFTP tích hợp
enable-tftp
tftp-root=/var/lib/tftpboot

# Lắng nghe ở chế độ ProxyDHCP trên subnet nội bộ
dhcp-range=192.168.1.0,proxy

# Kiểm tra DHCP option 93 (Kiến trúc hệ thống của Client)
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

# Cấp bootloader tương ứng với firmware được phát hiện
dhcp-boot=tag:bios,undionly.kpxe,,192.168.1.50
dhcp-boot=tag:efi-x86_64,ipxe.efi,,192.168.1.50

# Quảng bá dịch vụ PXE tới các client trong mạng
pxe-service=tag:bios,X86PC,"Boot qua mạng (BIOS)",undionly.kpxe
pxe-service=tag:efi-x86_64,X86-64_EFI,"Boot qua mạng (UEFI)",ipxe.efi

4. Khởi động lại và kiểm tra daemon

sudo systemctl restart dnsmasq
sudo systemctl status dnsmasq

Cắm một máy thử nghiệm vào cùng switch mạng. Mở menu chọn thiết bị boot (thường nhấn F12, F11 hoặc Del trong quá trình POST), chọn card mạng onboard và quan sát màn hình banner của iPXE shell xuất hiện.

Nguyên lý hoạt động chi tiết

Hiểu rõ cách thức trao đổi giao thức sẽ giúp bạn xử lý sự cố nhanh chóng khi client bị treo trong quá trình khởi tạo mạng.

Cơ chế hoạt động của ProxyDHCP

PXE tiêu chuẩn yêu cầu bạn phải chỉnh sửa DHCP Option 66 (Next-Server IP) và Option 67 (Bootfile Name) trên gateway chính. Tuy nhiên, các modem nhà mạng hay router phổ thông giá rẻ hiếm khi cho phép bạn can thiệp vào các trường này.

ProxyDHCP giúp vượt qua rào cản đó. Router chính của bạn vẫn cấp phát thông tin IP bình thường qua cổng UDP 67. Đồng thời, Dnsmasq sẽ giám sát cổng UDP 4011 để bắt các gói tin DHCPDISCOVER có gắn vendor class PXEClient. Dnsmasq sẽ phản hồi bằng một gói tin thứ hai chỉ chứa địa chỉ TFTP và con trỏ bootfile. Phía client sẽ tự động kết hợp cả hai gói tin này một cách liền mạch.

Tại sao kỹ thuật chainloading lại quan trọng

Firmware tích hợp sẵn trên card mạng thường rất thô sơ. Hầu hết các ROM xuất xưởng chỉ hỗ trợ giao thức TFTP cơ bản. Do TFTP dựa trên các khối dữ liệu nhỏ chỉ 512 byte và phải chờ xác nhận (ACK) cho từng gói tin, tốc độ truyền tải chỉ lẹt đẹt ở mức 1 đến 2 MB/s. Việc kéo một file ISO cài đặt Linux hiện đại dung lượng 2.4 GB qua TFTP có thể mất tới hơn 25 phút dù chạy trên mạng Gigabit.

Chainloading giải quyết triệt để nút thắt cổ chai về băng thông này:

  1. NIC của client tải file binary iPXE siêu nhẹ (~350 KB) qua TFTP chỉ trong chưa đầy một giây.
  2. iPXE khởi tạo và giành quyền kiểm soát card mạng vật lý.
  3. iPXE tải kernel hệ điều hành, các gói initrd và image cloud-init qua HTTP với tốc độ tối đa của đường truyền (112 MB/s trên mạng Gigabit). File ISO 2.4 GB tương tự giờ đây chỉ mất chưa đầy 25 giây để tải về.

Triển khai cài đặt hệ điều hành tự động

Khi iPXE đã hoạt động, bạn có thể điều hướng các máy đến một menu boot tương tác được lưu trữ qua HTTP để kích hoạt quá trình cài đặt tự động (unattended install).

1. Cài đặt Nginx và tạo script iPXE

Cài đặt một web server tiêu chuẩn:

sudo apt install -y nginx

Tạo một menu script tại /var/www/html/boot.ipxe:

#!ipxe

set server_ip 192.168.1.50
set base_url http://${server_ip}

:menu
menu Menu Boot qua mang
item --gap --             ---------------- Cac ban phan phoi ----------------
item ubuntu24            Ubuntu 24.04 LTS (Cai dat tu dong)
item debian12            Debian 12 Bookworm (Netboot)
item --gap --             ---------------- Tien ich -------------------
item shell               Mo iPXE Shell
item reboot              Khoi dong lai may
choose --timeout 10000 --default ubuntu24 target && goto ${target}

:ubuntu24
echo Dang tai kernel bo cai dat Ubuntu 24.04...
kernel ${base_url}/ubuntu/vmlinuz ip=dhcp url=${base_url}/ubuntu/noble-live-server-amd64.iso autoinstall ds=nocloud-net;s=${base_url}/ubuntu/
initrd ${base_url}/ubuntu/initrd
boot

:debian12
echo Dang tai kernel bo cai dat Debian 12...
kernel http://deb.debian.org/debian/dists/bookworm/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux initrd=initrd.gz
initrd http://deb.debian.org/debian/dists/bookworm/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz
boot

:shell
shell

:reboot
reboot

2. Ngăn chặn vòng lặp boot bằng tag matching

Khi iPXE khởi động, nó sẽ tự gửi một yêu cầu DHCP mới. Nếu không lọc, Dnsmasq sẽ liên tục gửi lại file binary TFTP ban đầu, tạo thành vòng lặp vô tận. Hãy cập nhật /etc/dnsmasq.d/pxe.conf để Dnsmasq nhận diện được iPXE và gửi script HTTP thay thế:

# Nhan dien neu client gui yeu cau da dang chay iPXE
dhcp-userclass=set:ipxe,iPXE

# Dieu huong client iPXE den menu web
dhcp-boot=tag:ipxe,http://192.168.1.50/boot.ipxe

# Chi phan phoi cac file binary tho cho yeu cau phan cung ban dau
dhcp-boot=tag:!ipxe,tag:bios,undionly.kpxe,,192.168.1.50
dhcp-boot=tag:!ipxe,tag:efi-x86_64,ipxe.efi,,192.168.1.50

# An prompt menu PXE doi voi cac client da vao iPXE
pxe-service=tag:!ipxe,tag:bios,X86PC,"Boot qua mang (BIOS)",undionly.kpxe
pxe-service=tag:!ipxe,tag:efi-x86_64,X86-64_EFI,"Boot qua mang (UEFI)",ipxe.efi

Tải lại dịch vụ bằng lệnh sudo systemctl restart dnsmasq. Khởi động lại client của bạn, máy sẽ chuyển thẳng từ PXE phần cứng vào menu do Nginx lưu trữ.

Kinh nghiệm thực tế và xử lý sự cố

Cấu hình sai DHCP trên mạng production có thể làm gián đoạn toàn bộ subnet văn phòng. Hãy kiểm tra kỹ cấu hình trong môi trường thử nghiệm cô lập trước khi kết nối vào hệ thống thực tế.

  • Kiểm thử bằng máy ảo QEMU bridged: Kiểm tra thiết lập Dnsmasq cục bộ trước khi can thiệp vào phần cứng thật:
    # Boot mot may ao x86_64 qua PXE tren interface bridge (br0)
    qemu-system-x86_64 -m 2048 -boot n \
      -netdev bridge,id=net0,br=br0 \
      -device virtio-net-pci,netdev=net0
  • Bắt gói tin mạng trực tiếp: Nếu máy đích bị treo ở thông báo “Searching for DHCP server…”, hãy bắt các gói tin đến trên máy chủ của bạn:
    sudo tcpdump -i eth0 -n "port 67 or port 68 or port 69 or port 4011"

    Bạn sẽ thấy một gói broadcast ban đầu trên cổng 67, phản hồi ngay lập tức trên cổng 4011 và các yêu cầu đọc TFTP (RRQ) tiếp theo trên cổng 69.

  • Kiểm tra quy tắc tường lửa: Đảm bảo tường lửa trên máy chủ cho phép các cổng UDP 67, 69 và 4011, cùng cổng TCP 80 cho Nginx:
    sudo ufw allow 67/udp
    sudo ufw allow 69/udp
    sudo ufw allow 4011/udp
    sudo ufw allow 80/tcp
  • Lưu ý về UEFI Secure Boot: File ipxe.efi dựng sẵn từ upstream chưa được ký bởi khóa CA UEFI tiêu chuẩn của Microsoft. Nếu bo mạch chủ của máy đích dừng lại với lỗi vi phạm bảo mật (security violation), hãy tắt Secure Boot trong cài đặt UEFI hoặc tự ký binary bằng Machine Owner Key (MOK) của doanh nghiệp bạn.
Share: