什麼是 PXE
WIKI 說的 : 預啟動執行環境(Preboot eXecution Environment,PXE,也被稱為預執行環境)提供了一種使用網路介面(Network Interface)啟動電腦的機制。這種機制讓電腦的啟動可以不依賴本地資料儲存裝置(如硬碟)或本地已安裝的作業系統。
簡而言之就是我想快速、簡單、自動地安裝完成一個 Linux 作業系統
環境
PXE Server Client 1.1.1.1 1.1.1.33 +---------------+ +---------------+ | CentOS 7 or 8 | | | | DHCP |<--UDP 67-->| | | TFTP |<--UDP 69-->| | | HTTPD |<--TCP 80-->| | | Kickstart | | | +---------------+ +---------------+
流程
Client 網路卡開機,DHCP 提供 IP 給 Client ,Clinet 從 TFTP 進到選單,再從 HTTPD 拿到 Kickstart 及 linux source,進而安裝系統
目錄結構
/var/lib/tftpboot/ chain.c32 images\ centos7\ initrd.img vmlinuz ldlinux.c32 libcom32.c32 libutil.c32 mboot.c32 memdisk menu.c32 pxelinux.0 pxelinux.cfg\ default vesamenu.c32
安裝套件
yum install dhcp tftp-server syslinux httpd xinetd -y
編輯 DHCP 設定檔
vi /etc/dhcp/dhcpd.conf
ddns-update-style none; ignore client-updates; allow booting; allow bootp; subnet 1.1.1.0 netmask 255.255.255.0 { range 1.1.1.33 10.1.1.55; option subnet-mask 255.255.255.0; option domain-name "cross.dev"; option domain-name-servers 8.8.8.8,8.8.4.4; option routers 1.1.1.254; default-lease-time 14400; max-lease-time 43200; next-server 1.1.1.1; # pxe server filename "pxelinux.0"; # boot loader,等於是 /var/lib/tftpboot/pxelinux.0 }
使用 syslinux 提供的 boot loader
複製相關檔案到 /var/lib/tftpboot/
cp -rp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot cp -rp /usr/share/syslinux/menu.c32 /var/lib/tftpboot cp -rp /usr/share/syslinux/memdisk /var/lib/tftpboot cp -rp /usr/share/syslinux/mboot.c32 /var/lib/tftpboot cp -rp /usr/share/syslinux/chain.c32 /var/lib/tftpboot cp -rp /usr/share/syslinux/ldlinux.c32 /var/lib/tftpboot cp -rp /usr/share/syslinux/libutil.c32 /var/lib/tftpboot cp -rp /usr/share/syslinux/vesamenu.c32 /var/lib/tftpboot cp -rp /usr/share/syslinux/libcom32.c32 /var/lib/tftpboot
或者可以安裝 syslinux-tftpboot 套件 (路徑直接指到 /tftpboot),裡面已包含了需要的檔案
建立目錄
# 要放開機相關檔案 mkdir /var/lib/tftpboot/images/ # 選單設定放置目錄 mkdir /var/lib/tftpboot/pxelinux.cfg/
編輯選單
vi /var/lib/tftpboot/pxelinux.cfg/default
# 選單單色藍 default menu.c32 # 選單亮麗 #default vesamenu.c32 prompt 0 # 等於 15 秒 (=150/10), 倒數時間 timeout 150 # 訊息說明 #display boot.msg MENU TITLE ---------- CROSS PXE Boot Menu ---------- LABEL local MENU DEFAULT # 代表開機選單預設是會跑這個 #MENU HIDE # 如果不用這個選單可把它穩藏 MENU LABEL Boot from ^local drive localboot 0 LABEL centos7 MENU LABEL Install CentOS ^7 via Kickstart KERNEL /images/centos7/vmlinuz APPEND initrd=/images/centos7/initrd.img ks=http://1.1.1.1/kickstart/ks7.cfg ksdevice=eth0 biosdevname=0 net.ifnames=0 # ks 使用 kickstart 檔 # ksdevice 指定那張網卡 # biosdevname=0 net.ifnames=0 讓網卡名稱為 ethX TEXT HELP # 以下為說明 Install CentOS 7 via Kickstart ENDTEXT # 以上為說明
掛載 ISO
這次要安裝的系統是 CentOS 7 ,所以要把 ISO source 攤開了,在 kickstart 裡設定安裝 source 來源是這裡 http://1.1.1.1/ISO/centos7/
mkdir -p /var/www/html/ISO/centos7/ mount -t iso9660 -o loop /path/ISO/CentOS-7-x86_64-DVD-2009.iso /var/www/html/ISO/centos7/
複製開機需要用到的檔案到 tftp 目錄
/var/lib/tftpboot/ 是根目錄,所以選單設定 (/var/lib/tftpboot/pxelinux.cfg/default) 裡的檔案、路徑都是帶目錄底下的檔案、或 /images/xxxxx
mkdir -p /var/lib/tftpboot/images/centos7 cp -rp /var/www/html/ISO/centos7/images/pxeboot/vmlinuz /var/lib/tftpboot/images/centos7 cp -rp /var/www/html/ISO/centos7/images/pxeboot/initrd.img /var/lib/tftpboot/images/centos7
編輯 tftp 啟動檔
vi /etc/xinetd.d/tftp
service tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /var/lib/tftpboot disable = no # 把 yes 改成 no per_source = 11 cps = 100 2 flags = IPv4 }
啟用服務
systemctl restart xinetd.service systemctl status xinetd.service systemctl restart dhcpd.service systemctl status dhcpd.service systemctl restart httpd.service systemctl status httpd.service
成功時,DHCP 會 listen udp 67 port
成功時,TFTP 會 listen udp 69 port
成功時,HTTP 會 listen tcp 80 port
開放防火牆
iptables -I INPUT -p udp --dport 67 -j ACCEPT iptables -I INPUT -p udp --dport 67 -j ACCEPT iptables -I INPUT -p tcp --dport 80 -j ACCEPT
建立 kickstart 檔
mkdir /var/www/html/kickstart
vi /var/www/html/kickstart/ks7.cfg
(內容省略)
最後
讓主機使用網卡開機 ,成功時會進 PXE 選單
CentOS 7 至少記憶體 2 GB 以上 (如果遇到 no space left on device)
其它選項
加入 Gparted
mkdir -p /var/www/html/ISO/gparted/ mount -t iso9660 -o loop /data3/linux_package/ISO/gparted-live-1.3.0-1-amd64.iso /var/www/html/ISO/gparted/
mkdir -p /var/lib/tftpboot/images/gparted cp -rp /var/www/html/ISO/gparted/live/{vmlinuz,initrd.img} /var/lib/tftpboot/images/gparted
label gparted MENU LABEL ^GParted Live KERNEL /images/gparted/vmlinuz APPEND initrd=/images/gparted/initrd.img boot=live config components union=overlay username=user noswap noeject vga=788 fetch=http://1.1.1.1/ISO/gparted/live/filesystem.squashfs
加入救援模式
LABEL centos7rescue MENU LABEL CentOS 7 ^Rescue via HTTP KERNEL /images/centos7/vmlinuz APPEND initrd=/images/centos7/initrd.img text rescue
留言