2021-05-12 14:32:11
自動化運維之-PXE實現系統批次自動安裝
本節索引
- 需求分析
- PXE簡介
- 整體方案
- 服務選擇
- 功能實現
- 安裝偵錯
- 錯誤分析
- 總結
1 需求分析
隨著網際網路技術的不斷壯大,伺服器數量也在不斷的增加,IT運維已經成為IT服務內涵中重要的組成部分。面對越來越複雜的業務,面對越來越多樣化的使用者需求,不斷擴充套件的IT應用需要越來越合理的模式來保障IT服務能靈活便捷、安全穩定地持續保障,這種模式中的保障因素就是IT運維。從初期的幾台伺服器發展到龐大的資料中心,單靠人工已經無法滿足在技術、業務、管理等方面的要求,那麼標準化、自動化、架構優化、過程優化等降低IT服務成本的因素越來越被人們所重視。而如何自動化批次部署安裝一個穩定的系統是實現自動化的第一步。
2 PXE簡介
PXE,就是預啟動執行環境,是一種引導啟動的方式。這種協定一般由兩部分構成,一部分是伺服器端,一個是用戶端。簡單來說,我們通過這種方式可以自己建立一個“安裝源”,在安裝系統的時候只要能找到這個“源”便可以實現系統的安裝。在實現無人值守的安裝前,我們必須要搭建一些服務,來實現“安裝源”的建立,例如ftp、http、tftp、dhcp等。當一台主機啟動時,標準輸入輸出會將PXE用戶端調入我們的記憶體中進行相關的操作,並提示相關的選項,在這裡我們可以進行選擇。PXE的用戶端通過網路下載(download)啟動檔案到本地執行。具體過程是,PXE用戶端通過網絡卡向區域網內傳送ip請求,然後DHCP伺服器會提供給給它一個ip地址和系統安裝所需要的檔案,接下使用接收到的檔案進行系統安裝。而安裝的過程又需要其他伺服器提供的資源,例如:yum源,核心檔案等,當主機拿到這些資源,便可以順利的安裝了。最終結果是:任意一台主機在選著網路啟動時會獲取DHCP伺服器分發的ip,通過通過獲取到的ip地址與區域網內的TFTP伺服器通訊並獲取啟動檔案,與FTP或者HTTP通訊並獲取yum原始檔及核心檔案等。之後開始自動安裝,而這個過程不需要人在做任何操作。
PXE安裝優點,這種安裝系統的方式可以不受光碟機,光碟以及一些外部裝置的限制,還可以做到無人值守,大大減輕了運維人員的工作負荷,像在一些主機數量龐大的機房進行批次安裝,PXE將是你不二的選擇。
3整體方案
這一小節我們主要介紹方案選擇,在說方案之前先來看看PXE部署思路。部署思路其實並不難,在實現PXE自動批次安裝系統時,首先我們需要有DHCP伺服器為我們提供IP地址,如果在一個網路中你連IP地址都獲取不到,何談自動化。其次我們要安裝一個系統,那麼需要的檔案必須要有人為我們提供才可以,應為是網路自動安裝,本地是沒有任何資源的,我們可以使用HTTP,FTP服務來實現。最後就是獲取我們的安裝檔案,這些檔案會引導我們的計算機如何啟動,如何設定,我們選擇TFTP服務起來提供。整體框架如下圖:
方案1:選則一台主機同時搭建HTTP、TFTP、DHCP服務,為該子網內的主機提供服務。
方案2:選擇一台主機搭建HTTP、TFTP服務,做提供資源的伺服器,另為一台主機單間DHCP服務,提供IP地址。
上述提供了兩種方案,當然了,如果你不怕資源浪費,你也可以選擇每種服務搭建在一台主機上,做相應服務的提供,不過個人並不建議。考慮到節約資源的目的,我們選擇方案一。
4 服務選型
4.1 DHCP服務
由於我們是實現自動化批次安裝部署,所以,能夠與其他主機通訊是前提,而要想獲取IP並實現通訊,我們必須要有DHCP伺服器為大量的主機提供ip地址才行。
DHCP就是動態主機設定協定,主要是為用戶端分發IP,並且是自動分發IP的,一台主機通過DHCP獲取的地址是動態的,每次獲取的地址都有可能不同,改地址是DHCP伺服器暫時分配給使用者使用的,當主機關機之後則會返回這個ip地址,此時如果有其他使用者請求,DHCP伺服器則會將該IP地址分配給他。區域網中的每台主機都可以充當DHCP伺服器,只要我們安裝DHCP服務,並做相應的設定即可,這裡的設定主要是子網的設定,設定其他主機能使用IP地址的範圍,例如:設定子網為192.168.14.0,該子網內主機獲取IP的範圍為192.168.14.1~192.168.14.100。那麼我們就可以開啟DHCP的組態檔/etc/dhcp/dhcpd.conf做如下設定:
subnet 192.168.14.0 netmask 255.255.255.0 {
range 192.168.25.50 192.168.25.100;
next-server 192.168.25.107;
# 指明tftp伺服器的地址
filename
"pxelinux.0"
;
# 指定PXE檔案
}
4.2 HTTP服務
由於我們要獲取安裝系統服務的yum源以及核心檔案,虛擬根檔案,這些檔案都是大檔案,在傳輸時我們必須保證其能夠安全傳輸,所以我們選擇了HTTP服務,當然了,選擇FTP服務也是可以的。
HTTP是Hyper Text Transfer Protocol(超文字傳輸協定)的縮寫。是網際網路上廣泛試用的協定。是用於從WWW伺服器傳輸超文字到本地瀏覽器的傳輸協定。它可以使瀏覽器更加高效,使網路傳輸減少。它不僅保證計算機正確快速地傳輸超文字文件,還確定傳輸文件中的哪一部分等。HTTP包含命令和傳輸資訊,不僅可用於Web存取,也可以用於其他因特網/內聯網應用系統之間的通訊,從而實現各類應用資源超媒體存取的整合。
4.3 TFTP服務
TFTP是一種檔案傳輸服務,用於伺服器與用戶端進行檔案的傳輸,不過他只能進行簡單的檔案傳輸,這個服務開銷不大,所以並不能進行大檔案的傳輸,多用於小檔案的傳輸。他沒有FTP那麼強大,但是TFTP使用UDP協定傳輸資料,有些時候比FTP更加方便,它所監聽的埠為69。由於我們是在區域網中,系統相對安全,而提供的資料也不是很大,所以TFTP是實現PXE的不二選擇。
5 功能實現
5.1安裝前準備
由於涉及到主機間不同基於不同協定的通訊,所以為了避免不必要的麻煩,我們選擇關閉防火牆以及selinux。生產場景中不建議這樣做。
[ root@vinsent ~ ]
#iptables -F # 關閉防火牆
[ root@vinsent ~ ]
#setenforce 0 # 臨時關閉selinux
[ root@vinsent ~ ]
#vim /etc/selinux/config # 修改檔案永久關閉selinux
...前面省略
SELINUX=disabled
# 設定SELINUX的值為disabled
...後面省略
5.2設定靜態IP地址
由於我們在前面方案分析中選擇了方案1,即將所有服務搭建在同一台伺服器上。由於做DHCP服務的主機的IP地址必須固定,所以我們要先設定伺服器的IP地址。由於我是在CentOS7系統上搭建的伺服器,所以有許多命令只有CentOS7才能使用。CentOS6及之前的版本請自行查閱相關文件。
[ root@vinsent ~ ]
#vim /etc/sysconfig/network-scripts/ifcfg-ens33 # 設定靜態IP
DEVICE=ens33
BOOTPROTO=static
IPADDR=192.168.14.201
PREFIX=24
ONBOOT=
yes
[ root@vinsent ~ ]
#systemctl restart network.service #重新啟動網路服務
[ root@vinsent ~ ]
#ip a # 檢視自己的IP是否設定成功
5.3安裝服務
由於我們需要HTTP、TFTP、DHCP服務來提供相應的服務,所以我們必須要在系統中安裝,相應的服務。這裡需要注意,如果你的系統時最小化安裝,那麼建議你先安裝一些包組,GCC等。如果安裝過程中出現包依賴問題,依次安裝相應的包即可。
[ root@vinsent ~ ]
#yum -y install dhcp tftp-server httpd syslimux #安裝相應的服務包
[ root@vinsent ~ ]
#yum -y install xinetd # 安裝超級守護行程xinetd
[ root@vinsent ~ ]
#systemctl enable dhcp # 設定dhcp開機啟動
[ root@vinsent ~ ]
#systemctl enable tftp # 設定tftp開機啟動
[ root@vinsent ~ ]
#systemctl start tftp # 啟動tftp服務
[ root@vinsent ~ ]
#systemctl enable httpd
[ root@vinsent ~ ]
#systemctl start httpd # 啟動http服務
[ root@vinsent ~ ]
#chkconfig tftp on # 如果這天命令不能使用,請修改組態檔
[ root@vinsent ~ ]
#vim /etc/xinetd.d/tftp
service tftp
{
...
disable =
yes
# 修改這一項為"disable =no"
...
}
[ root@vinsent ~ ]
#systemctl restart xinetd # 修改之後,一定要重新啟動xinetd服務
5.4設定DHCP服務
DHCP服務是保證我們能夠自動化批次安裝的前提,上面已經有提到過dhcp的設定,這裡做補充,詳細說明。主要是設定子網範圍,用於ip地址分配。
[ root@vinsent ~ ]
#rpm -ql dhcp # 查詢dhcp相關的檔案
...前面省略
/usr/share/doc/dhcp-4
.2.5
/dhcpd
.conf.example
/usr/share/doc/dhcp-4
.2.5
/dhcpd6
.conf.example
...後面省略
[ root@vinsent ~ ]
#cd /etc/dhcp/
[ root@vinsent ~ ]
#cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example . # 複製模板組態檔
[ root@vinsent ~ ]
#mv dhcpd.conf.example dhcpd.conf # 改名為dhcpd.conf,頂替以前的組態檔
[ root@vinsent ~ ]
#vim dhcpd.conf # 開啟模板檔案並新增一下內容
...前面省略...
subnet 192.168.14.0 netmask 255.255.255.0{
# 這裡寫的ip地址為子網的地址,故為192.168.14.0
range 192.168.14.10 192.168.14.200;
# 子網的範圍,之後主機請求獲取的ip地址就是這其中的一個
next-server 192.168.14.201;
# 指明tftp伺服器的地址
filename
"pxelinux.0"
# 指明PXE檔案位置,這個在申請ip的時候會傳送給安裝主機
}
...後面省略...
[ root@vinsent ~ ]
#systemctl dhcpd start # 重新啟動服務
注意:如果你設定的子網有問題,那麼你將不能重新啟動dhcp服務,請檢查你設定的子網是否正確。dhcp伺服器的地址必須固定,不能是自動獲取的ip。
5.5 準備yum原始檔及kickstart檔案
yum原始檔我們是放在http伺服器上的,由http服務來提供,所以我們要把相應的檔案複製到http伺服器上。並且我們安裝的主機系統可能是CentOS 6 也可能是CentOS7或者Ubantu等,所以我們在準備yum檔案時,需要準備不同系統、不同版本的檔案,我們這裡只提供CentOS 6 與CentOS 7的兩種系統的安裝。向我們先規劃一下目錄檔案,在進行複製。如下所示。
我們規劃好了目錄結構,接下來便是建立這些目錄結構,並提供相應的檔案。
[ root@vinsent ~ ]
#cd /var/www/html
[ root@vinsent html ]
#mkdir -p centos/{6,7}
[ root@vinsent html ]
#mkdir ksdir
[ root@vinsent html ]
#
提供yum原始檔,這裡有兩種方案來實現yum原始檔的提供,方案1:我們分別掛載CentOS 6和CentOS 7的關盤將光碟裡的Packages目錄與repodata目錄複製到對應的目錄下(如果複製,建議全部複製);方案2:我們建立兩個關盤驅動器,一個新增CentOS 6的ISO映象,一個新增CentOS 7的ISO映象,然後我們分別將對應的關盤掛載到/var/www/html/centos下對應的目錄上。綜上所述,我們選擇方案2。下面是一方案2為基礎來實現???。
[ root@vinsent html ]
#mount /dev/sr0 centos/6 # 掛載CentOS 6光碟值6目錄下
mount
:
/dev/sr0
is write-protected,mounting
read
-only
[ root@vinsent html ]
#mount /dev/sr1 centos/7 # 掛載CentOS 7光碟值7目錄下
mount
:
/dev/sr1
is write-protected,mounting
read
-only
接下來準備ksdir目錄下的安裝引導檔案ks#.cfg。ks#.cfg檔案的獲取方法有兩種,一種是通過工具來生成。不過這個工具需要自己安裝:
[ root@vinsent ~ ]
#yum install -y system-config-kickstart
[ root@vinsent ~ ]
#system-config-kickstart
另外這一種是複製/root目錄下的anaconda-ks.cfg檔案加以修改。我們選擇後者。
[ root@vinsent html ]
#cp /root/anaconda-ks.cfg ksdir/ks7.cfg
[ root@vinsent html ]
#vim ksdir/ks7.cfg
....
[ root@vinsent html ]
#chmod +r ksdir/ks7.cfg # "這裡的檔案需要加讀許可權,非常重要"
[ root@vinsent html ]
#cat ksdir/ks7.cfg # centos 7的kickstart檔案
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
url --url=
# 指明yum源的路徑
# Use graphical install
text
# 將cdrom修改為text,我們不是基於光碟安裝的,我們是基於字元介面安裝
# Run the Setup Agent on first boot
firstboot --
enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=us --xlayouts=
'us'
# System language
lang en_US.UTF-8
# Network information
network --bootproto=dhcp --device=ens33 --onboot=on --ipv6=auto --activate
# --bootproto必須是dhcp獲取,--onboot=on
network --
hostname
=centos7.magedu.com
# Root password
rootpw --iscrypted $6$Z7LBEUpwj3iQdYZ3$olYQ.Lj1xV2VAGS1UiNflKF0oMGip3b6tU9QFcp0i2JBjwKlY
/Yaexul57NHpIJc
.Y2V1hWAOueaqwjuWDGMk0
# System services
services --disabled=
"chronyd"
# System timezone
timezone Asia
/Shanghai
--isUtc --nontp
user --name=wang --password=$6$
v
.VphW
/puRblcrFB
$uaSrdEhGAwMXap27WIKTn5lyOOfoFyB
/SNxyyL3og6s9/VQoAKoL2KQjKmeYFmoYTuYkSNL7BBxgbJzeryKr9
. --iscrypted --gecos=
"wang"
# X Window System configuration information
xconfig --startxonboot
# System bootloader configuration
bootloader --append=
" crashkernel=auto"
--location=mbr --boot-drive=sda
# Partition clearing information
zerombr
# 新增zerombr ,表示清除舊磁碟上原有的mbr,新磁碟安裝可不寫
clearpart --all
# 清除所有分割區資訊,新磁碟安裝可不寫
# Disk partitioning information
part swap --fstype=
"swap"
--ondisk=sda --size=2048
# 分割區表資訊,如果你想新增分割區,可按照該格式新增
part
/app
--fstype=
"xfs"
--ondisk=sda --size=51200
part / --fstype=
"xfs"
--ondisk=sda --size=51200
part
/boot
--fstype=
"xfs"
--ondisk=sda --size=1024
reboot
# 安裝完成之後重新啟動
%packages
# 安裝軟體包
@^graphical-server-environment
@base
@core
@desktop-debugging
@dial-up
@fonts
@gnome-desktop
@guest-agents
@guest-desktop-agents
@hardware-monitoring
@input-methods
@internet-browser
@multimedia
@print-client
@x11
kexec-tools
autofs
# 安裝autofs服務包
%end
%end
%anaconda
pwpolicy root --minlen=6 --minquality=50 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=50 --notstrict --nochanges --notempty
pwpolicy luks --minlen=6 --minquality=50 --notstrict --nochanges --notempty
%end
%post
# 安裝後指令碼,我們設定了yum源
systemctl
enable
autofs
rm
-rf
/etc/yum
.repos.d/*
cat
>
/etc/yum
.repos.d
/base
.repo <<eof
[base]
name=base
baseurl=
file
:
///misc/cd
gpgcheck=0
eof
%end
************下面是CentOS 6的kickstart檔案*************
*******方法同上,這裡你到別的主機上複製一份過來*******
[ root@vinsent html ]
#cat ksdir/ks6.cfg
#version=DEVEL
install
text
# 基於字元介面安裝
lang en_US.UTF-8
keyboard us
network --onboot
yes
--device eth0 --bootproto dhcp --noipv6
rootpw --iscrypted $6$hfb25YOYZDU3YZTl$VxTkHGGJGGBbr59OPnY5kTJzvJ9hb9NRwrh5FMHLIAlXh9VQ74PYoK7QzPWYN0zaJrm3mv
/IP0fDkHxFglNi6/
firewall --service=
ssh
authconfig --enableshadow --passalgo=sha512
url --url=
# yum源的路徑
selinux --disabled
# 關閉selinux
timezone Asia
/Shanghai
bootloader --location=mbr --driveorder=sda --append=
"crashkernel=auto rhgb quiet"
# The following is the partition information you requested
# Note that any partitions you deleted are not expressed
# here so unless you clear all partitions first, this is
# not guaranteed to work
zerombr
# 清除mbr
clearpart --all
# 清除分割區資訊
reboot
# 安裝完成後重新啟動
part
/boot
--fstype=ext4 --size=1000
# 分割區資訊
part / --fstype=ext4 --size=50000
part
/app
--fstype=ext4 --size=40000
part swap --size=2048
#repo --name="CentOS" --baseurl=cdrom:sr0 --cost=100 # 注釋掉此行
%packages
@base
@core
@debugging
@basic-desktop
@desktop-debugging
@desktop-platform
@directory-client
@fonts
@general-desktop
@graphical-admin-tools
@input-methods
@internet-applications
@internet-browser
@Java-platform
@kde-desktop
@legacy-x
@network-
file
-system-client
@office-suite
@print-client
@remote-desktop-clients
@server-platform
@server-policy
@workstation-policy
@x11
mtools
pax
Python-dmidecode
oddjob
wodim
sgpio
genisoimage
device-mapper-persistent-data
abrt-gui
qt-mysql
samba-winbind
certmonger
pam_krb5
krb5-workstation
xterm
xorg-x11-xdm
libXmu
rdesktop
%end
%post
# 安裝後指令碼,安裝完系統後向做什麼設定,都可以寫在%post...%end中間
rm
-rf
/etc/yum
.repos.d/*
cat
>
/etc/yum
.repos.d
/base
.repo <<eof
[base]
name=base
baseurl=
file
:
///misc/cd
gpgcheck=0
eof
%end
5.6準備核心檔案選單檔案
核心檔案、虛擬根檔案以及選單檔案,我們都是通過tftp服務來提供的,由於系統及版本的不同,對於一個比較複製機群來說,我們需要準備不同系統,不同版本的核心檔案,initrd.img檔案。選單檔案只需要一份即可。/var/lib/tftpboot/目錄規劃如下:
規劃好了目錄結構,接下來自只需要按照目錄內容設定相關的檔案即可。選單風格檔案menu.c32、不同系統的核心檔案 vmlinuz 以及虛擬根檔案系統 initrd.img 我們可以從光碟中複製。選單檔案defaults需要手動寫
[ root@vinsent ~ ]
#cd /var/lib/tftpboot/
[ root@vinsent tftpboot ]
#mkdir -p centos{6,7} # 建立目錄檔案
[ root@vinsent tftpboot ]
#cp /var/www/html/centos/6/{vmlinuz,initrd.img} centos6/ # 複製核心,虛擬根檔案
[ root@vinsent tftpboot ]
#cp /var/www/html/centos/7/{vmlinuz,initrd.img} centos7/ # 由於之前掛載了不同系統,直接複製對應檔案即可
[ root@vinsent tftpboot ]
#cp /usr/share/syslinux/pxelinux.0 . # pxelinux檔案來自syslinux包,直接複製即可
[ root@vinsent tftpboot ]
#mkdir pxelinux.cfg
[ root@vinsent tftpboot ]
#cp /var/www/html/centos/6/isolinux/isolinux.cfg pxelinux.cfg/default # 複製並改名
[ root@vinsent tftpboot ]
#vim pxelinux.cfg/default
...
# 修改過程省略,
[ root@vinsent tftpboot ]
#cat pxelinux.cfg/default # 檢視修改過後的選單檔案內容
default menu.c32
# 指定選單風格
timeout 600
# 安裝倒計時,1/10 s為單位
menu title Auto Install | www.vinsent.cn
label centos7
menu label Auto Install CentOS Linux ^7
kernel centos7
/vmlinuz
append initrd=centos7
/initrd
.img ks=
# 指明ks檔案位置
label centos6
menu label Auto Install CentOS Linux ^6
kernel centos6
/vmlinuz
append initrd=centos6
/initrd
.img ks=http:
//192
.168.14.201
/ksdir/ks6
.cfg
label manual7
menu label ^Manual Install CentOS Linux 7
kernel centos7
/vmlinuz
append initrd=centos7
/initrd
.img inst.repo=http:
//192
.168.14.201
/centos/7
label manual6
menu label Manual ^Install CentOS Linux 6
kernel centos6
/vmlinuz
append initrd=centos6
/initrd
.img inst.repo=http:
//192
.168.14.201
/centos/6
label
local
menu default
# 預設游標停在這一行
menu label Boot from ^
local
drive
localboot 0xffff
menu end
到此所有的設定就完成了。
6 偵錯並安裝
新建立一台虛擬機器,設定網路段在上述DHCP服務所在的網路段,選擇使用物理驅動器。
點選啟動項開始安裝,選擇網路安裝。
點選網路安裝後,我們就能看到我們的選單了。
然後選擇你要啟動的項即可。
7 錯誤分析
最初還不是很熟悉PXE原理的時候,遇到了很多問題,在最後給處我與到的幾個問題,即解決方法。
問題1:ks.cfg檔案出錯
解決方法:檢查tftp服務是否啟動,ks#.cfg檔案路徑是否正確,ks#.cfg檔案是否具有讀許可權。出現這個問題大概就是這幾個地方出了問題
問題2:yum原始檔路徑出錯
解決方法:尋找yum源出現錯誤,該錯誤是ks.cfg檔案中url路徑寫錯了,修改該路徑為正確的yum源所在的地址即可。
問題3:iptables與selinux出問題
遺憾忘記截圖給大家了,見諒,安裝前檢查一下iptables與selinux是否關閉(實驗環境,生產中不建議這麼粗暴!)
8 總結
本文通過分析PXE實現批次自動化安裝的原理,再到一步步實現PXE的設定,再到後面的排錯思路。在這裡總結幾個要點:關閉selinux,iptables很重要,ks檔案讀許可權不可少,服務千萬不能down掉,檔案路徑不能亂抄。
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-10/147379.htm
相關文章