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

pxe server tftp dhcp kickstart

pxe server tftp dhcp kickstart

其它選項

加入 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
最後修改日期: 2021 年 07 月 13 日

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。