Trong quá trình nghiên cứu về máy ảo và quản trị mạng, mình đã nhiều lần chạm mặt thuật ngữ PXE Boot nhưng không biết nó là gì và nguyên lý hoạt động ra sao. Hiện tại, mình đang muốn cài đặt cho 3 cái máy Lenovo mini để mò về Cluster / Kubernetes nên mới bắt đầu tìm hiểu về PXE và cách cài đặt.
1. PXE là gì?
PXE (Preboot eXecution Environment) là một môi trường cho phép khởi động máy tính bằng việc sử dụng card mạng cùng với RAM. Hiểu một cách đơn giản PXE là cơ chế cho phép khởi động một phần mềm thông qua mạng.
Với PXE, các máy trạm có thể khởi động và cài đặt hệ điều hành thông qua mạng, không cần phải sử dụng Bootable USB hay CD/DVD như cách thông thường.

Yêu cầu cần thiết để thực hiện PXE Boot
-
Hệ thống mạng có máy chủ DHCP, HTTP và TFTP. Có thể cài đặt tất cả trên cùng 1 máy chủ Boot Server
-
Máy trạm (client) được trang bị card mạng NIC hỗ trợ PXE Boot.
Bài viết này mình sẽ hướng dẫn cách thiết lập PXE Boot Server để cài đặt Ubuntu 20.04 qua mạng dành cho máy trạm / máy ảo sử dụng Legacy BIOS.
Thao tác thực hiện sẽ gồm các bước chính như sau
-
Tải Ubuntu ISO (ubuntu-20.04.5-live-server-amd64.iso)
-
Cài đặt và cấu hình Apache HTTP server
-
Cài đặt và cấu hình TFTP server
-
Cài đặt và cấu hình DHCP server
-
Thực hiện PXE Boot
2. Chuẩn bị môi trường lab
Mình sẽ sử dụng 2 máy ảo để thực hiện các hướng dẫn trong bài viết hôm nay.
-
Một máy ảo chạy Ubuntu 20.04 sẽ đóng vai trò làm PXE Boot Server. Mình sẽ gọi là PXE Server. (IP: 192.168.0.150)
-
Một máy ảo sử dụng Legacy BIOS sẽ được khởi động bằng PXE để cài đặt Ubuntu 20.04 qua mạng.. Mình sẽ gọi là PXE Client.
Bạn có thể tạo máy ảo trên bất kỳ nền tảng nào Hyper-V, Proxmox, XCP-ng,… hoặc nếu có máy tính vật lý thì càng tốt.
Ngoài ra, cần phải có kết nối Internet để tải Ubuntu ISO về PXE Server. PXE Server và PXE Client cần phải kết nối vào cùng mạng LAN nội bộ.
3. Tải Ubuntu ISO về PXE Server
Mình sẽ tải Ubuntu Server về PXE Server, lưu ở thư mục /images
mkdir /imagescd imageswget https://mirrors.nhanhoa.com/ubuntu-releases/20.04/ubuntu-20.04.5-live-server-amd64.iso4. Cài đặt và cấu hình Apache Server
Apache sẽ đóng vai trò làm HTTP Server để PXE Client có thể kết nối khi khởi động và tải về các file cấu hình và file ISO của Ubuntu.
apt install apache2 -yChỉnh sửa lại cấu hình mặc định của Apache
nano /etc/apache2/sites-available/000*Sửa lại nội dung như sau và lưu lại
<VirtualHost *:80>
ServerAdmin webmaster@localhost DocumentRoot /
<Directory /images> Options Indexes MultiViews AllowOverride All Require all granted </Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>Kích hoạt Apache
systemctl enable apache2 --nowKiểm tra lại xem Apache đã hoạt động chưa
systemctl status apache2● apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2022-12-21 10:58:52 UTC; 13h ago Docs: https://httpd.apache.org/docs/2.4/ Main PID: 5621 (apache2) Tasks: 55 (limit: 1065) Memory: 65.9M CGroup: /system.slice/apache2.service ├─5621 /usr/sbin/apache2 -k start ├─5622 /usr/sbin/apache2 -k start └─5623 /usr/sbin/apache2 -k startTruy cập vào địa chỉ http://192.168.0.150/images, sẽ thấy hiện ra file ubuntu-20.04.05-live-server-amd64.iso trong danh sách.

5. Cài đặt TFTP Server
Tiếp theo, mình sẽ cài đặt TFTP Server để lưu trữ các file boot của PXE dùng để kích hoạt cài đặt qua mạng.
apt install tftpd-hpa -ysystemctl enable tftpd-hpa --now6. Cấu hình PXE Boot Server
Để máy trạm có thể khởi động qua mạng, chúng ta cần phải chuẩn bị PXE Boot files. Mình sẽ lấy các file này từ file ISO của Ubuntu đã tải về trước đó.
Mount file ISO vào thư mục /mnt
mount /iamges/ubuntu-20.04.5-live-server-amd64.iso /mntCopy 3 tập tin initrd, vmlinux, and ldlinux.c32 vào thư mục /srv/tftp/
find /mnt/ \( -name "initrd" -o -name "vmlinuz" -o -name "ldlinux.c32" \) -exec cp -apv {} /srv/tftp/ \;Tiếp theo, cần phải có thêm file pxelinux.0 để hoàn tất cấu hình PXE Server. Cài đặt pxelinux bằng lệnh
apt install pxelinux -yTìm đường dẫn chứa pxelinux.0 bằng lệnh find /usr/ -name pxelinux.0. Kết quả trả về
/usr/lib/PXELINUX/pxelinux.0Copy file này vào thư mục /srv/tftp/
cp -apv /usr/lib/PXELINUX/pxelinux.0 /srv/tftp/Thư mục /srv/tftp/ sẽ gồm các file như dưới đây
root@ubuntu:/mnt# ls -l /srv/tftptotal 97940-r--r--r-- 1 root root 86448612 Aug 31 07:04 initrd-r--r--r-- 1 root root 120820 Aug 31 07:37 ldlinux.c32-rw-r--r-- 1 root root 43140 Dec 23 2019 pxelinux.0-r--r--r-- 1 root root 13660416 Aug 31 07:04 vmlinuzTiếp theo, tạo file cấu hình PXE
mkdir /srv/tftp/pxelinux.cfgnano /srv/tftp/pxelinux.cfg/defaultNhập vào nội dung sau và lưu lại
timeout 60ontimeout 1default 1prompt 0
label 1 menu label ^Install Ubuntu 20.04 kernel vmlinuz initrd initrd append url=http://192.168.0.150/images/ubuntu-20.04.5-live-server-amd64.iso cloud-config-url=/dev/null ip=dhcp fsck.mode=skip ---
menu end7. Cấu hình DHCP Server
Tiếp theo, cần phải cấu hình thông số Next Server và Boot File Name trên DHCP Server. Mình đang dùng Mikrotik, truy cập vào DHCP Server và sửa lại như hình bên dưới.

Nếu router đang sử dụng không có tính năng cấu hình Next Server và Boot File Name, bạn có thể cài đặt DHCP Server lên PXE Server.
apt install isc-dhcp-server -yCấu hình DHCP Server bằng cách chỉnh sửa file dhcpd.conf
nano /etc/dhcp/dhcpd.confBạn cần chỉnh lại thông số ở các mục subnet, netmask, routers, next-server cho phù hợp với mạng nội bộ đang sử dụng.
allow bootp;allow booting;max-lease-time 1200;default-lease-time 900;log-facility local7;
option ip-forwarding false;option mask-supplier false;
subnet 192.168.0.0 netmask 255.255.255.0 {
option routers 192.168.0.1; option domain-name-servers 1.1.1.1; range 192.168.0.200 192.168.0.222; next-server 192.168.0.150; filename "pxelinux.0"; }Kích hoạt DHCP Server
systemctl enable isc-dhcp-server.service --now8. Thực hiện PXE Boot
Máy sử dụng máy ảo tạo trên ESXI 7.0, sử dụng Legacy BIOS. Hệ thống khởi động qua mạng PXE thành công và hiện ra trình cài đặt Ubuntu 20.04.
Mình có thể cấu hình thêm cài đặt tự động Ubuntu sử dụng tính năng Cloud-init. Từ từ rãnh có thời gian mò sẽ chia sẻ tiếp.
Chúc bạn thực hiện thành công!
Nguồn: golinuxcloud, Ubuntu