什麼是 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

留言