Tự động hóa máy chủ Network Boot với iPXE, dnsmasq và Nginx để triển khai hàng loạt hệ điều hành

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

Bài toán đặt ra: Vượt qua sự cố sập dàn Bare-Metal lúc 2 giờ sáng

Hãy hình dung tình huống này: lúc đó là 2 giờ 15 phút sáng Chủ nhật. Một sự cố lưu trữ vừa xóa sạch ổ cứng khởi động của toàn bộ 32 compute node trong một rack tủ mạng. Đội ngũ kỹ thuật viên trực tại datacenter đã hoàn tất việc thay mới các ổ NVMe cách đây 30 phút. Giờ là phần khó khăn nhất: 32 máy chủ bare-metal đang dừng lại ở màn hình BIOS trống trơn, chờ cài đặt hệ điều hành.

Đi dọc lối đi trong trung tâm dữ liệu với một nắm USB trên tay sẽ tiêu tốn hàng giờ đồng hồ quý giá mà bạn không có. Mô hình PXE truyền thống cũng chẳng thể cứu vãn tình thế. Phương pháp network boot cũ phụ thuộc hoàn toàn vào TFTP (Trivial File Transfer Protocol) để đẩy các file kernel và initrd dung lượng hàng trăm megabyte qua giao thức UDP. Cách này chạy ổn với một máy đơn lẻ. Nhưng nếu kéo cùng lúc 20 máy, tỷ lệ rớt gói tin UDP sẽ tăng vọt. Hiện tượng timeout liên tục xảy ra, quá trình truyền tải bị nghẽn, và việc cài đặt kéo dài lê thê suốt 40 phút trước khi thất bại hoàn toàn.

Kiến trúc boot hai giai đoạn (two-stage boot) giải quyết triệt để nút thắt cổ chai này. Đầu tiên, một dịch vụ nhẹ nhàng cấp phát địa chỉ IP và phân phối một bootloader trung gian siêu nhỏ. Sau đó, bootloader này chuyển đổi giao thức để kéo các file ISO và kernel dung lượng lớn qua giao thức HTTP tiêu chuẩn. Việc kết hợp dnsmasq để đảm nhiệm DHCP cùng tính năng nhận diện kiến trúc phần cứng với Nginx để phân phối dữ liệu qua HTTP cho phép bạn cấu hình và cấp phát cả tủ rack máy chủ chỉ trong chưa đầy 5 phút.

Khái niệm cốt lõi: Vì sao PXE truyền thống thất bại và iPXE khắc phục ra sao

Trước khi bắt tay chỉnh sửa các file cấu hình, hãy cùng tìm hiểu cách firmware card mạng, các DHCP option và giao thức truyền tải phối hợp với nhau trong quá trình khởi động.

Nút thắt cổ chai TFTP so với HTTP Streaming

Các ROM PXE tiêu chuẩn được nạp sẵn trên card mạng (NIC) của bo mạch chủ thường được tinh giản tối đa. Chúng chỉ hiểu giao thức DHCP cơ bản và TFTP thô sơ—ngoài ra không còn gì khác. TFTP sử dụng cơ chế xác nhận từng bước (lock-step acknowledgment): gửi đi một khối 512 byte, đợi gói tin ACK phản hồi, rồi mới gửi khối tiếp theo. Ngay cả trên hạ tầng mạng switch 10Gbps, độ trễ khứ hồi của gói tin vẫn giới hạn thông lượng của một luồng TFTP đơn lẻ ở mức khoảng 1.5 đến 2.5 MB/s. Việc tải image Ubuntu 24.04 live-server nặng 1.8GB theo cách này sẽ ngốn từ 20 đến 30 phút cho mỗi node mạng.

iPXE khắc phục điều này bằng cách nâng cấp bootloader trực tiếp ngay trên bộ nhớ RAM. Đây là một network bootloader mã nguồn mở trang bị đầy đủ stack TCP/IP, hỗ trợ HTTP, HTTPS, DNS và iSCSI. ROM PXE gốc chỉ cần tải một file nhị phân iPXE siêu nhẹ (khoảng 350KB cho UEFI, 65KB cho BIOS) qua TFTP trong vòng chưa đầy một giây. Sau khi kích hoạt, iPXE sẽ tiếp quản NIC và nạp kernel cùng ramdisk qua giao thức HTTP chuẩn từ Nginx, dễ dàng tận dụng tối đa băng thông đường truyền 1Gbps hoặc 10Gbps.

Chế độ khởi động Legacy BIOS và UEFI

Các môi trường production thực tế thường chạy song song cả các máy chủ Legacy BIOS đời cũ lẫn phần cứng UEFI 64-bit hiện đại. Nếu cấu hình cứng một tên file bootloader duy nhất, phân nửa số máy của bạn sẽ khởi động thất bại. Máy chủ boot cần kiểm tra DHCP Option 93 (Client System Architecture Type, RFC 4578) để phản hồi file nhị phân tương ứng:

  • undionly.kpxe: Dành cho các máy Legacy BIOS (Kiến trúc 00:00), sử dụng lệnh gọi driver UNDI tiêu chuẩn.
  • ipxe.efi: Dành cho hệ thống UEFI 64-bit (Kiến trúc 00:07, 00:09, và 00:10 cho HTTP-boot).

Vai trò điều phối khởi động của dnsmasq

Thay vì phải chắp vá giữa isc-dhcp-server và tftpd-hpa, dnsmasq tích hợp sẵn DNS, cơ chế gắn tag DHCP linh hoạt và một TFTP engine nội tại trong một tiến trình duy nhất cực kỳ gọn nhẹ. Nó phân tích các định danh vendor-class theo thời gian thực. Nhờ đó, bạn có thể thiết lập các quy tắc boot có điều kiện dựa trên việc máy trạm đang khởi động lần đầu hay đã quay lại với user class iPXE.

Thực hành: Xây dựng hệ thống triển khai với iPXE

Hướng dẫn này được thực hiện trên máy chủ Ubuntu Server 22.04 hoặc 24.04 LTS có card mạng cấp phát chuyên dụng (eth1) gán IP tĩnh 192.168.10.10/24 thuộc subnet triển khai 192.168.10.0/24.

Bước 1: Cài đặt các gói phần mềm cần thiết

Cài đặt dnsmasq, Nginx và các file nhị phân iPXE biên dịch sẵn trực tiếp từ kho repository:

sudo apt update
sudo apt install -y dnsmasq nginx ipxe syslinux pxelinux

Bước 2: Chuẩn bị cấu trúc thư mục TFTP

Tạo thư mục gốc TFTP và sao chép các file nhị phân iPXE tiêu chuẩn dành cho BIOS và UEFI:

sudo mkdir -p /srv/tftp

# Sao chép image iPXE cho Legacy BIOS
sudo cp /usr/lib/ipxe/undionly.kpxe /srv/tftp/

# Sao chép file nhị phân iPXE cho UEFI 64-bit
sudo cp /usr/lib/ipxe/ipxe.efi /srv/tftp/

sudo chown -R nobody:nogroup /srv/tftp
sudo chmod -R 755 /srv/tftp

Bước 3: Cấu hình dnsmasq để Chainload động

Tạo file cấu hình riêng tại /etc/dnsmasq.d/ipxe.conf. Lưu ý chỉ thị port=0: thiết lập này sẽ vô hiệu hóa cổng lắng nghe DNS để dnsmasq không bao giờ xung đột với tiến trình stub listener systemd-resolved mặc định trên port 53 của Ubuntu.

sudo bash -c 'cat > /etc/dnsmasq.d/ipxe.conf' << "EOF"
# Chỉ bind vào interface cấp phát (provisioning)
interface=eth1
bind-interfaces
port=0

# Dải IP cấp phát DHCP và gateway
dhcp-range=192.168.10.100,192.168.10.200,255.255.255.0,12h
dhcp-option=option:router,192.168.10.1
dhcp-option=option:dns-server,1.1.1.1,8.8.8.8

# Cấu hình TFTP tích hợp sẵn
enable-tftp
tftp-root=/srv/tftp

# Khớp kiến trúc máy trạm (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

# Nhận biết nếu máy trạm đã chạy iPXE
dhcp-userclass=set:ipxe,iPXE

# GIAI ĐOẠN 1: Máy trạm khởi động PXE mặc định -> phân phối bootloader iPXE qua TFTP
dhcp-boot=tag:!ipxe,tag:bios,undionly.kpxe
dhcp-boot=tag:!ipxe,tag:efi-x86_64,ipxe.efi

# GIAI ĐOẠN 2: Máy trạm quay lại bằng iPXE -> chuyển giao script boot qua HTTP
dhcp-boot=tag:ipxe,http://192.168.10.10/boot.ipxe
EOF

Kiểm tra cú pháp và khởi động lại dịch vụ:

sudo dnsmasq --test
sudo systemctl restart dnsmasq
sudo systemctl status dnsmasq

Bước 4: Cấu hình Nginx để phục vụ tài nguyên Boot

Tạo các thư mục chứa file ISO, kernel đã trích xuất và các file tự động hóa cloud-init:

sudo mkdir -p /var/www/netboot/os/ubuntu24
sudo mkdir -p /var/www/netboot/scripts

Cấu hình một server block Nginx tối ưu hóa tại /etc/nginx/sites-available/netboot:

server {
    listen 80;
    server_name 192.168.10.10;
    root /var/www/netboot;

    access_log /var/log/nginx/netboot_access.log;
    error_log /var/log/nginx/netboot_error.log;

    location / {
        autoindex on;
        sendfile on;
        sendfile_max_chunk 2m;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
    }
}

Kích hoạt website, xóa cấu hình mặc định và reload lại Nginx:

sudo ln -s /etc/nginx/sites-available/netboot /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl reload nginx

Bước 5: Trích xuất OS Kernel và tạo Menu iPXE

Mount file ISO Ubuntu 24.04 Server. Trích xuất kernel (vmlinuz) cùng initial ramdisk (initrd), sau đó chuyển toàn bộ file ISO vào web root để trình cài đặt Subiquity có thể mount từ xa:

sudo mount -o loop /root/ubuntu-24.04-live-server-amd64.iso /mnt
sudo cp /mnt/casper/vmlinuz /var/www/netboot/os/ubuntu24/
sudo cp /mnt/casper/initrd /var/www/netboot/os/ubuntu24/
sudo cp /root/ubuntu-24.04-live-server-amd64.iso /var/www/netboot/os/ubuntu24/
sudo umount /mnt

Tạo các file metadata giả lập trong /var/www/netboot/scripts/ để trình cài đặt Ubuntu không bị lỗi khi kiểm tra cloud-init:

sudo touch /var/www/netboot/scripts/meta-data
sudo touch /var/www/netboot/scripts/user-data

Bây giờ, tạo script boot tại /var/www/netboot/boot.ipxe. Chú ý tham số tường minh initrd=initrd trên dòng lệnh nạp kernel, giúp EFI stub loader nhận diện chính xác ramdisk:

sudo bash -c 'cat > /var/www/netboot/boot.ipxe' << "EOF"
#!ipxe

set server_ip 192.168.10.10
set base_url http://${server_ip}
set menu-timeout 10000

:start
menu Hệ thống Boot qua Mạng - Cấp phát Bare-Metal
item --gap --             ---------------- Hệ điều hành ----------------
item ubuntu24             Cài đặt Ubuntu Server 24.04 LTS (Tự động)
item --gap --             ---------------- Cứu hộ & Công cụ -----------------
item shell                Mở Shell tương tác iPXE
item reboot               Khởi động lại máy chủ
item exit                 Boot từ ổ cứng cục bộ
choose --timeout ${menu-timeout} --default ubuntu24 target && goto ${target}

:ubuntu24
echo Đang tải Kernel và Initrd của Ubuntu 24.04 qua HTTP...
kernel ${base_url}/os/ubuntu24/vmlinuz initrd=initrd ip=dhcp url=${base_url}/os/ubuntu24/ubuntu-24.04-live-server-amd64.iso autoinstall ds=nocloud-net;s=${base_url}/scripts/ cloud-config-url=/dev/null
initrd ${base_url}/os/ubuntu24/initrd
echo Đang khởi động Linux kernel...
boot

:shell
shell

:reboot
reboot

:exit
exit
EOF

Kiểm thử và gỡ lỗi theo thời gian thực

Khởi động một máy trạm đã bật tính năng PXE. Mở hai cửa sổ terminal trên máy chủ để quan sát toàn bộ quy trình boot hai giai đoạn diễn ra.

Ở terminal đầu tiên, theo dõi log của dnsmasq:

sudo journalctl -u dnsmasq -f

Bạn sẽ thấy hai yêu cầu DHCP tuần tự gửi từ địa chỉ MAC của máy trạm:

  1. Yêu cầu DHCPDISCOVER ban đầu không mang user class. Dnsmasq đối chiếu Option 93 và phản hồi file ipxe.efi hoặc undionly.kpxe qua TFTP.
  2. Yêu cầu DHCPDISCOVER tiếp theo chứa User-Class: iPXE. Dnsmasq nhận diện tag này và bàn giao đường dẫn http://192.168.10.10/boot.ipxe.

Ở terminal thứ hai, quan sát Nginx truyền tải các file hệ điều hành:

sudo tail -f /var/log/nginx/netboot_access.log

Bạn sẽ thấy GET /os/ubuntu24/vmlinuz và GET /os/ubuntu24/initrd trả về mã 200 OK. Trên đường truyền mạng 1Gbps tiêu chuẩn, việc tải file initrd nặng 90MB chỉ mất chưa đầy một giây—nhanh vượt trội so với gần hai phút khi dùng TFTP truyền thống.

Tổng kết: Tự động hóa sẵn sàng cho môi trường Production

Việc thay thế cách khởi động TFTP thuần túy bằng chuỗi xử lý kết hợp iPXE và HTTP sẽ biến tác vụ cấp phát bare-metal từ một quy trình chậm chạp, mệt mỏi thành một luồng công việc nhanh chóng và đáng tin cậy. Dnsmasq tự động xử lý khác biệt giữa các máy trạm Legacy BIOS và UEFI hiện đại mà không cần can thiệp thủ công, trong khi Nginx gánh vác việc truyền tải các file dung lượng lớn ở tốc độ tối đa của hạ tầng mạng.

Với nền tảng vững chắc này, bạn có thể tích hợp menu iPXE trực tiếp vào các cấu hình cloud-init tùy biến, các script Kickstart tự động hoặc hệ thống quét kiểm kê phần cứng. Kết quả đạt được là một quy trình triển khai hoàn toàn tự động (zero-touch): chỉ cần cắm nguồn và cắm cáp mạng, các máy chủ sẽ tự động hoàn tất quá trình cài đặt.

Share: