首頁 > 軟體

基於PXE網路啟動的Linux系統自動化安裝

2020-06-16 16:29:59

  在實際工作中,傳統純手動安裝作業系統的方式是有一定的局限性的,例如:現在大多數的伺服器都不自帶光碟機,若要安裝系統需要外接光碟機插入光碟,整個安裝過程中需要人工互動確認,手動設定每一個安裝設定項,人必須要在機器前值守,時間大多花費在安裝的等待過程中。假如有一大批伺服器需要安裝作業系統,這種傳統手動的方式去逐台安裝系統的方式,效率是極其低下的,而且由於需要人工互動式設定系統的安裝設定項,無法確保每一台機器的系統安裝設定都是完全一致的,即無法做到完全的統一標準化。(在大量重複的操作過程中,人工方式是極易出錯的)

  為了解決上述問題,可以採用PXE網路的方式來實現系統自動化安裝,整個安裝過程中無需人工干預,極大的提供了工作效率。

一、PXE的基本概念

PXE(Pre-boot Execution Environment,預啟動執行環境)是由Inter公司開發的網路引導技術,工作在Client/Server模式,PXE網絡卡的ROM內建了對dhcp和tftp協定的支援,允許客戶機通過網路從遠端伺服器下載引導映象,並載入安裝檔案或者整個作業系統。

二、PXE伺服器的相關元件及基本原理

PXE伺服器需要的服務:

    DHCP服務:為用戶端分配IP地址,定位啟動引導檔案

    TFTP服務:提供網絡卡啟動載入程式、系統核心檔案及initrd映象檔案下載

    FTP服務(或http/nfs):提供系統映象的yum安裝源及ks應答檔案下載


用戶端機應具備的條件:

    網絡卡必須支援PXE協定(現在大多數的網絡卡都已支援)

    主機板BIOS支援從網路啟動

1、通過PXE伺服器安裝系統原理示意圖:

  通常情況下,為了節省資源我們也可以將上述原理圖中的提供DHCP服務、TFTP服務、FTP(或HTTP、NFS)服務的3台不同伺服器整合部署到同一台伺服器,作為PXE的伺服器端,視具體情況而定。

2、PXE網路安裝系統的優勢:

規模化:高效率,同時安裝多台伺服器,輕鬆應對大規模批次安裝

自動化:安裝過程中無需人工干預、實現自動化無人值守安裝

標準化:按照自設定的系統安裝規則設定硬碟分割區及系統元件包,實現系統安裝的統一標準化

遠端實現:不需要光碟機光碟、U盤等外部安裝媒介

三、PXE伺服器搭建步驟詳解

  本文以CentOS7為例,對PXE伺服器的搭建過程總結如下:

1、準備作業系統映象YUM源,並通過HTTP服務對外發布

安裝httpd服務:

[root@centos7 ~]#yum -y install httpd 
[root@centos7 ~]#systemctl start httpd.service  #啟動httpd服務
[root@centos7 ~]#systemctl enable httpd.service #設定httpd服務開機啟動

建立系統映象ISO檔案存放目錄

[root@centos7 ~]#mkdir -p /data/myios  #建立 /data/myios 作為系統映象檔案存放目錄

通過xftp等工具將系統映象ISO檔案上傳到 /data/myios 目錄

[root@centos7 myiso]#ll
total 14390272
-rw-r--r-- 1 root root  3991928832 Sep  7 13:51 CentOS-6.10-x86_64-bin-DVD1.iso
-rw-r--r-- 1 root root 10743709696 Sep  7 13:54 CentOS-7-x86_64-Everything-1810.iso

在httpd預設的documentroot目錄 /var/www/html 下建立各個系統映象源的子目錄

[root@centos7 ~]#mkdir -pv /var/www/html/centos/{6,7}/os/x86_64/
mkdir: created directory ‘/var/www/html/centos’
mkdir: created directory ‘/var/www/html/centos/6’
mkdir: created directory ‘/var/www/html/centos/6/os’
mkdir: created directory ‘/var/www/html/centos/6/os/x86_64/’
mkdir: created directory ‘/var/www/html/centos/7’
mkdir: created directory ‘/var/www/html/centos/7/os’
mkdir: created directory ‘/var/www/html/centos/7/os/x86_64/’
[root@centos7 ~]#

掛載系統ISO映象檔案到httpd對應的目錄下

vim編輯修改 /etc/fstab檔案
[root@centos7 ~]#vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sat Sep  7 12:12:42 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=4d76f02b-0ebf-4238-89a6-e18709a1025d /                       xfs     defaults        0 0
UUID=b2d24305-3936-4e25-8a40-18b53cd4d809 /boot                   xfs     defaults        0 0
UUID=e5586dc6-a9e2-453b-90da-c009996214ad /data                   xfs     defaults        0 0
UUID=3417eb37-c6ee-4c17-aea5-153413c631c6 swap                    swap    defaults        0 0
/data/myiso/CentOS-6.10-x86_64-bin-DVD1.iso /var/www/html/centos/6/os/x86_64 iso9660 defaults 0 0
/data/myiso/CentOS-7-x86_64-Everything-1810.iso /var/www/html/centos/7/os/x86_64 iso9660 defaults 0 0

新增最後兩行,將/data/myiso 目錄中的2個iso映象檔案以iso映象檔案系統掛載到httpd的對應documentroot目錄下
[root@centos7 ~]#mount -a
mount: /dev/loop0 is write-protected, mounting read-only
mount: /dev/loop1 is write-protected, mounting read-only
[root@centos7 ~]#

df檢視一下,ISO映象已經掛載到httpd對應目錄下

說明:10.10.10.254為PXE伺服器的IP,需提前設定好,且設定為靜態IP。

設定本機IP與PXE伺服器同網段,通過URL存取 http://10.10.10.254/centos/ 可以到yum源已經發布成功。


2、準備系統自動安裝ks應答檔案(kickstart),並使用HTTP發布

kickstart檔案用途:

ks應答檔案的作用就是實現系統安裝過程中的無人值守,自動安裝的。系統安裝的時候就是依靠讀取KS檔案裡面預先定義的各項安裝設定,如硬碟分割區、系統語言、安裝哪些元件包等。

ks檔案的設定方式:

(1)從現有已經安裝好的系統中獲取anaconda-ks.cfg(此檔案是anaconda系統安裝嚮導在系統安裝完成後生成的),然後根據anaconda-ks.cfg裡面的設定項來修改設定為自己需要的ks檔案(需要注意的是centos6和centos7系統的ks設定不通用,需要使用對應的系統的anaconda檔案來修改設定)

ks檔案檔案的格式範例和設定項說明如下(適用centos7)

[root@centos7 ksdir]#cat ks7_desktop.cfg 
#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install                                                     #全新安裝
# Keyboard layouts
keyboard 'us'                                               #鍵盤模式,美式US
# Root password
rootpw --iscrypted $1$7Q46UR0F$uZjZh2p9X.MlrV0dW8euj.       #設定root賬號口令並採用加密
# Use network installation
url --url="http://10.10.10.254/centos7/os/x86_64"           #系統映象yum源的URL地址
# System language
lang en_US                                                  #系統預設語言,en_US
# System authorization information
auth  --useshadow  --passalgo=sha512                        #系統預設使用shadow檔案作為賬號登入驗證
# Use text mode install
text                                                        #安裝過程預設使用text文字的tui介面
firstboot --disable
# SELinux configuration
selinux --disabled                                          #禁用selinux

# Firewall configuration
firewall --disabled                                         #禁用系統防火牆
# Network information
network  --bootproto=dhcp --device=eth0                     #系統預設的網絡卡設定
# Reboot after installation
reboot                                                      #安裝完成後自動重新啟動系統
# System timezone
timezone Asia/Shanghai                                      #設定系統預設時區 Asia/Shanghai
# System bootloader configuration
bootloader --append="net.ifnames=0" --location=mbr          #安裝新的bootload程式,並新增核心啟動引數 net.ifnames=0
# Clear the Master Boot Record
zerombr                                                     #清除原有的MBR引導記錄
# Partition clearing information
clearpart --all --initlabel                                 #清除原有的硬碟分割區標籤
# Disk partitioning information                             #硬碟分割區資訊,按實際需求設定
part /boot --fstype="xfs" --size=1024
part / --fstype="xfs" --size=51200
part swap --fstype="swap" --size=4096
part /data --fstype="xfs" --grow --size=1                   # /data分割區使用所有剩餘硬碟空間


%packages       #要安裝的包組,以%packages行開始,到%end結尾,包組以@符號開頭,單個包直接寫包名
@desktop-debugging
@fonts
@gnome-desktop
@input-methods
@legacy-x
@remote-desktop-clients
@x11
vinagre

%end              #需要注意的是,centos6中,如果選擇最小化安裝,ks檔案最後需要寫上 %packages開始行%end結尾行的2行,否則系統會預設安裝所有的包組,centos7系統如果最小化安裝,則可以不用寫這2行
[root@centos7 ksdir]#

通過anaconda檔案為模板修改生成的ks檔案,可以使用命令 ksvalidator /PATH/KICKSTART_FILE 來檢查ks檔案語法是否正確。

(2)使用system-config-kickstart工具,通過圖形介面設定嚮導來設定生成(需要伺服器帶有圖形介面的包組,如果是最小化安裝的系統,需要安裝x11圖形包組)

[root@centos7 ~]#yum -y install system-config-kickstart  #此工具包來自epel源
[root@centos7 ~]#yum -y groupinstall x11         #最小化安裝的系統需要安裝x11圖形包組才能支援system-config-kickstart工具調出圖形介面的ks檔案設定向導視窗 

執行system-config-kickstart工具調出kickstart圖形設定向導視窗

[root@centos7 ~]#system-config-kickstart 

system-config-kickstart工具的設定如下:










設定完成後,點選左上角save儲存

修改ks檔名稱,指定存放路徑,點選右下角save儲存

注意:如果是通過system-config-kickstart工具生成centos6系統最小化安裝的ks檔案,需要手動修改ks檔案,在最後新增%package開始行和%end結束行的2行,否則安裝嚮導會預設安裝所有包組,如下圖:

在http伺服器documentroot目錄下建立 ksdir目錄,作為ks檔案的專用存放路徑

[root@centos7 ksdir]#cd /var/www/html/
[root@centos7 html]#mkdir ksdir/

將通過上述任一方式設定好的ks檔案,上傳到http伺服器專用的ks檔案存放路徑下,對外發布,並確保所有ks檔案通過url可以正常存取

[root@centos7 ksdir]#ll
total 16
-rw-r--r-- 1 root root 2109 Sep  7 20:00 ks6_desktop.cfg #centos6帶gnome桌面安裝
-rw-r--r-- 1 root root 1757 Sep  7 22:13 ks6_mininal.cfg #centos6最小化安裝
-rw-r--r-- 1 root root 1809 Sep  7 20:02 ks7_desktop.cfg #centos7帶gnone桌面安裝
-rw-r--r-- 1 root root 1695 Sep  7 20:02 ks7_mininal.cfg #centos7最小化安裝

3、安裝設定TFTP服務,並部署網絡卡引導檔案、系統核心檔案及系統初始化映象檔案

設定並啟用TFTP服務,安裝tftp-server軟體包,監聽埠為UDP 69

TFTP根目錄:/var/lib/tftpboot/

[root@centos7 ~]#yum -y install tftp-server
[root@centos7 ~]#systemctl start tftp.socket 
[root@centos7 ~]#systemctl enable tftp.socket

TFTP根目錄需要部署的檔案如下:

[root@centos7 tftpboot]#ll
total 84
drwxr-xr-x 2 root root    39 Sep  7 14:48 centos6       
drwxr-xr-x 2 root root    39 Sep  7 14:48 centos7
-rw-r--r-- 1 root root 55140 Sep  7 14:46 menu.c32
-rw-r--r-- 1 root root 26759 Sep  7 14:46 pxelinux.0
drwxr-xr-x 2 root root    21 Sep  7 21:36 pxelinux.cfg

[root@centos7 tftpboot]#tree 
.
├── centos6                        #centos6系統核心檔案和intrd.img存放目錄
│   ├── initrd.img
│   └── vmlinuz
├── centos7                        #centos7系統核心檔案和intrd.img存放目錄
│   ├── initrd.img
│   └── vmlinuz
├── menu.c32                       #PXE啟動選單介面背景圖
├── pxelinux.0                     #網絡卡啟動引導檔案
└── pxelinux.cfg                   #PXE啟動選單檔案存放目錄,目錄名必須為pxelinux.cfg 
    └── default                    #PXE啟動選單檔案,檔名必須為default

準備網絡卡啟動引導檔案pxelinux.0和PXE啟動選單介面背景圖片檔案menu.c32

yum安裝syslinux包
[root@centos7 ~]#yum -y install syslinux

複製pxelinux檔案到tftp的根目錄下
[root@centos7 ~]#cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/

複製PXE啟動選單介面背景圖片檔案到tftp根目錄下
[root@centos7 ~]#cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot/

在tftp根目錄建立系統核心檔案及initrd映象檔案的存放目錄,並從系統ISO映象yum源目錄複製對應的檔案到tftp中對應的目錄

在tftp根目錄建立centos6和centos7系統核心檔案及initrd映象檔案的存放目錄
[root@centos7 ~]#mkdir -pv /var/lib/tftpboot/centos{6,7}
mkdir: created directory ‘/var/lib/tftpboot/centos6’
mkdir: created directory ‘/var/lib/tftpboot/centos7’

分別從centos6和centos7映象yum源路徑複製系統核心檔案和initrd映象檔案到tftp根目錄中對應的目錄
[root@centos7 ~]#cp /var/www/html/centos/6/os/x86_64/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/centos6/

[root@centos7 ~]#cp /var/www/html/centos/7/os/x86_64/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/centos7/

準備安裝選單檔案並放到tftp指定目錄中

在tftp根目錄中建立安裝選單檔案存放目錄 pexlinux.cfg/
[root@centos7 ~]#mkdir /var/lib/tftpboot/pxelinux.cfg/

從系統ISO映象yum源路徑複製啟動選單檔案到對應目錄中,並改為為default

vim編輯修改pxe啟動選單default檔案,修改為如下內容:

[root@centos7 pxelinux.cfg]#vim default
default menu.c32        #使用menu.c32作為背景圖片
timeout 600             #預設等待時間60秒(600的十分之一)

menu title Auto Install CentOS      #啟動選單的標題

label CentOS6_Mininal                           #label標籤說明
  menu label Install CentOS 6.10 Mininal        #安裝選項選單
  kernel centos6/vmlinuz                        #系統核心檔案在tftp中的相對路徑
  append initrd=centos6/initrd.img ks=http://10.10.10.254/ksdir/ks6_mininal.cfg  #boot啟動引導的引數,指定系統initrd映象檔案在tftp中的相對路徑以及ks應答檔案的存取地址

label CentOS6_Desktop
  menu label Install CentOS 6.10 Desktop
  kernel centos6/vmlinuz
  append initrd=centos6/initrd.img ks=http://10.10.10.254/ksdir/ks6_desktop.cfg

label CentOS7
  menu label Install CentOS 7.6 Mininal
  kernel centos7/vmlinuz
  append initrd=centos7/initrd.img ks=http://10.10.10.254/ksdir/ks7_mininal.cfg

label CentOS7
  menu label Install CentOS 7.6 Desktop
  kernel centos7/vmlinuz
  append initrd=centos7/initrd.img ks=http://10.10.10.254/ksdir/ks7_desktop.cfg

label Local                           
  menu label Boot from Local drive  #從本地硬碟啟動
  menu default        #預設啟動選項,游標預設選中此項,timeout時間後預設從此項啟動,建議預設設定為此項,防止60秒等待時間後未經過人工選擇,造成直接進入系統安裝
  localboot 0xffff

4、安裝設定DHCP服務

安裝dhcp服務

[root@centos7 ~]#yum -y install dhcp

dhcp服務安裝完成後,預設無法啟動,需要對組態檔進行修改,否則啟動報錯。

預設的組態檔中無內容,根據提示從範例檔案複製組態檔進行修改

複製dhcp服務的範例組態檔覆蓋預設組態檔
[root@centos7 ~]#cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf 

vim編輯修改dhcp服務組態檔,並新增如下內容

[root@centos7 ~]#vim /etc/dhcp/dhcpd.conf
subnet 10.10.10.0 netmask 255.255.255.0 {     #dhcp伺服器分配的網段需要與本機的固定IP地址位於同一網段 (本機IP為 10.10.10.254)
    range 10.10.10.200 10.10.10.250;    #指定自動分配的IP地址範圍
    option routers 10.10.10.1;          #指定閘道器地址
    option domain-name-servers 114.114.114.114,8.8.8.8;  #指定DNS伺服器地址
    option domain-name "test.org";   #DNS搜尋域名
    next-server 10.10.10.254;      #指定TFTP伺服器IP(關鍵設定項)
    filename "pxelinux.0";         #指定網絡卡pxe啟動引導檔名(關鍵設定項)
}

啟動dhcp服務,並設定開機啟動

[root@centos7 ~]#systemctl start dhcpd.service
[root@centos7 ~]#systemctl enable dhcpd.service

如啟動成功,dhcp服務將監聽udp 67埠,如發生報錯,則需檢查組態檔。

四、使用用戶端機器安裝系統測試PXE環境

設定用戶端機器BIOS預設從網絡卡啟動

如能順利進入到啟動選單選擇介面,則證明DHCP服務工作正常

根據選單專案,選擇安裝對應的系統,例如選擇centos7.6最小化安裝:

安裝選項及磁碟分割區介面

可以看到centos7.6最小化安裝需要裝310個包

centos6.10最小化安裝的過程介面:

至此,整個PXE伺服器的搭建過程完成。

注意事項:

1、預先設定關閉並禁用PXE伺服器selinux

2、預先關閉並禁用系統防火牆,如考慮安全,需要保持系統防火牆開啟,則需要將HTTP服務、TFTP服務、DHCP服務需要使用到的網路埠在防火牆中開啟,否則用戶端將無法通過網路存取相關服務

3、不可在已存在DHCP伺服器的網路內再設定新的DHCP伺服器,否則會造成一個網路內多個DHCP伺服器,造成IP地址獲取混亂導致網路故障。可以直接使用現有的DHCP伺服器,修改新增相應的組態檔即可。

4、如通過虛擬機器來使用PXE安裝centos7系統,則虛擬機器的記憶體分配需要大於1G以上,否則會出現下圖中錯誤:

  鑑於水平有限,本文相關表述難免會存在紕漏之處,歡迎大家指出並糾正。


IT145.com E-mail:sddin#qq.com