前言
一般情況下,新服務器上架。都需要系統管理員手工安裝系統,配置IP地址,然后遠程登陸服務器進行軟件安裝、配置之類的管理。這種方式,在服務器數量還不多的情況下,是正常的。試想,如果一次上架上百台服務器,再依次安裝操作系統,將是一種災難。很難在規定的時間內將服務器順利上架並配置完畢。
這就需要在大型機房中,以DHCP+DNS模式管理服務器IP地址和主機名。服務器上架前,以其MAC地址為依據,在DHCP中配置主機保留並分配主機名。DHCP結合TFTP提供的PXE服務,提供PXE引導Linux內核和啟動鏡像,通過自動應答文件來實現操作系統的自動安裝和配置。就Linux來說,安裝后啟動saltstack客戶端salt-minion服務即可實現新服務器的自動受控。其余的安裝服務便可以通過saltstack來完成。自始至終,將不用通過ssh形式登陸新服務器,且可以實現軟件包的自動化安裝和配置管理。
理論描述
自動啟動安裝過程
服務器從第一次加電到連接到salt-master主機,受其集中管理,將經過以下一系列過程:
- 系統管理員在DHCP服務器中將其MAC地址綁定到特定IP地址和主機名,並指定PXE啟動文件。
- 服務器加電啟動,通過PXE獲取IP地址並加載PXEClient,以TFTP的形式獲取Linux內核和初始化啟動映像。
- 服務器加載自動應答腳本,通過網絡獲取軟件包,來自動安裝Linux系統。安裝並開機啟動salt-minion服務。
- 服務器安裝完成並重新啟動后,自動獲取IP地址,連接salt-master請求受控。
- salt-master控制新服務器后,以管理員配置模板自動安裝軟件包配置服務,管理新主機。
以上過程我們需要架設的服務有DNS、DHCP、TFTP、HTTP/FTP服務。其中,DHCP和DNS提供地址和主機名分配,TFTP提供PXE啟動映像,HTTP/FTP作為Linux軟件倉庫提供安裝過程中需要的軟件包。
DHCP Option 60
DHCP Option 60 Vendor class identifier為廠商類標識符。這個選項作用於客戶端可選地識別客戶端廠商類型和配置。這個信息是N個8位編碼,由DHCP服務端解析。廠商可能會為客戶端選擇定義特殊的廠商類標識符信息,以便表達特殊的配置或者其他關於客戶端的信息。比如:這個標識符可能編碼了客戶端的硬件配置。客戶端發送過來的服務器不能解析的類規范信息必須被忽略(盡管可能會有報告)。服務器響應廠商規范信息到客戶端應該僅僅通過Option 43來完成。
此信息需要在DHCP服務器上定義,DHCP服務器通過其判斷客戶端是不是PXEClient。並通過其Arch代碼來判斷其平台,以此為依據提供不同的PXE引導程序給客戶端。
PXE和gPXE
PXE:
(preboot execute environment,預啟動執行環境)是由Intel公司開發的最新技術,工作於Client/Server的網絡模式,支持工作站通過網絡從遠端服務器下載映像,並由此支持通過網絡啟動操作系統。在啟動過程中,BIOS把PXEClient調入內存中執行,然后由PXEClient向DHCP服務器請求分配IP地址,再用TFTP或MTFTP協議下載一個啟動軟件包到本機內存中執行,由這個啟動軟件包完成終端基本軟件設置,從而引導預先安裝在服務器中的終端操作系統。
gPXE:
是一個開源的網絡啟動器。它提供了一個直接的PXE替代方案,並且提供DNS、HTTP、iSCSI等多種額外功能。另外,由於gPXE存在商業收購風險。其開發者又啟動了一個名為iPXE的開源項目。作為gPXE的一個分支。iPXE支持HTTP、ISCSI、FCoE、Wi-Fi、InfiniBand等多種啟動方式。且支持通過腳本來控制啟動過程。
BIOS和UEFI
BIOS:
(Basic Input/Output System的縮寫、中文:基本輸入輸出系統),在IBM PC兼容機上,是一種業界標准的固件接口。BIOS這個字眼是在1975第一次由CP/M操作系統中出現。BIOS是個人電腦啟動時加載的第一個軟件。
BIOS用於計算機開機時執行系統各部分的的自檢,並啟動引導程序或裝載在內存的操作系統。此外,BIOS還向操作系統提供一些系統參數。系統硬件的變化是由BIOS隱藏,程序使用BIOS服務而不是直接訪問硬件。現代操作系統會忽略BIOS提供的抽象層並直接訪問硬件組件。
UEFI:
全稱“統一的可擴展固件接口”(Unified Extensible Firmware Interface),是一種詳細描述類型接口的標准。這種接口用於操作系統自動從預啟動操作環境,加載到一種操作系統上。
可擴展固件接口(Extensible Firmware Interface,EFI)是 Intel 為 PC 固件的體系結構、接口和服務提出的建議標准。其主要目的是為了提供一組在 OS 加載之前(啟動前)在所有平台上一致的、正確指定的啟動服務,被看作是有近20多年歷史的 BIOS 的繼任者。
另外,由於UEFI不支持32位,所以UEFI部分只討論x64平台。由於沒有實驗環境,不支持安騰架構。
安裝所需全部服務
yum install tftp tftp-server dhcp xinetd syslinux
dhcpd配置文件
option space PXE;
option PXE.mtftp-ip code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option client-system-arch code 93 = unsigned integer 16;
allow booting;
allow bootp;
default-lease-time 6000;
max-lease-time 72000;
subnet 10.1.1.0 netmask 255.255.255.0 {
range 10.1.1.50 10.1.1.70;
option routers 10.1.1.11;
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
next-server 10.1.1.11;
if option client-system-arch = 00:07 or option client-system-arch = 00:09 {
filename "BOOTX64.efi";
} else {
filename "pxelinux.0";
}
}
}
tftp配置文件
sed -i '/disable/s/yes/no/' /etc/xinetd.d/tftp
{
socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /var/lib/tftpboot disable = no per_source = 11 cps = 100 2 flags = IPv4 }
在 tftpboot 中創建需要的目錄
- mkdir /var/lib/tftpboot/pxelinux.cfg/
- BIOS引導所使用的 default 菜單文件目錄
-
1 UI pxelinux.cfg/vesamenu.c32 2 prompt 1 3 timeout 60 4 5 display pxelinux.cfg/boot.msg 6 menu background pxelinux.cfg/splash.jpg 7 menu title Welcome to PXE+kickstart auto install systems 8 menu color border 0 #ffffffff #00000000 9 menu color sel 7 #ffffffff #ff000000 10 menu color title 0 #ffffffff #00000000 11 menu color tabmsg 0 #ffffffff #00000000 12 menu color unsel 0 #ffffffff #00000000 13 menu color hotsel 0 #ff000000 #ffffffff 14 menu color hotkey 7 #ffffffff #ff000000 15 menu color scrollbar 0 #ffffffff #00000000 16 17 18 label linux 19 menu label ^Install CentOS7.4 Minimal 20 menu default 21 kernel cores/CentOS/7.4/vmlinuz 22 append initrd=cores/CentOS/7.4/initrd.img ip=dhcp inst.repo=ftp://10.1.1.11/CentOS/7.4 inst.ks=ftp://10.1.1.11/kickstart.cfgs/CentOS-7.x-min.cfg 23 24 label linux 25 menu label ^Install CentOS6.9 Minimal 26 kernel cores/CentOS/6.9/vmlinuz 27 append initrd=CentOS6/initrd.img ip=dhcp repo=ftp://10.1.1.11/CentOS/6.9 ks=ftp://10.1.1.11/kickstart.cfgs/CentOS-6.x-min.cfg 28 29 label linux 30 menu label ^Install Windows10 31 kernel memdisk raw iso 32 append initrd=ftp://10.1.1.11/Windows/10/W10X32_CN_PE.iso 33 34 label local 35 menu label Boot from ^local drive 36 localboot 0xffff
- mkdir -p /var/lib/tftpboot/cores/{CentOS,Ubuntu,Windows}
- 各的系統的內核文件目錄
- cd /var/lib/tftpboot/cores/
- mkdir CentOS/{6.9,7.4}
- mkdir Ubuntu/{16,17}
- mkdir Windows/{7,10}
這里只例舉無人職守CentOS 7 Minimaul
掛載鏡像文件
mount /dev/cdrom /mnt
復制內核文件
cp -rf /mnt/isolinux/{initrd.img,vmlinuz} /var/lib/tftpboot/cores/CentOS/7.4
BIOS
復制需要的文件到/var/lib/tftpboot/目錄下
cp /usr/share/syslinux/{pxelinux.0,vesamenu.c32,memdisk,gpxelinux.0} /var/lib/tftpboot/
- pxelinux.0 即為PXE啟動引導程序,
- gpxelinux 為gPXE引導程序
- 通過它可以使用快速的HTTP協議,而非較慢的TFTP協議來下載Linux鏡像,以加速安裝。不過有些硬件對gPXE支持不好。例如,IBM X3650 M4。
- memdisk 用來引導ISO文件
- vasamenu.c32 用來在繪制PXE菜單
UEFI
復制Centos6 中的 BOOTX64.efi 、BOOTX64.conf 、splash.xpm.gz , conf 文件改名為efidefault也就是UEFI的引導菜單
(Centos7 中用是grub2的方式)
- BOOTX64.efi
- efidefault
-
default=0 splashimage=(nd)/splash.xpm.gz timeout 10 hiddenmenu title CentOS 7.4 UEFI root (nd) kernel /cores/CentOS/7.4/vmlinuz ip=dhcp ks=ftp://10.1.1.11/kickstart.cfgs/CentOS-7.x-min_UEFI.cfg repo=ftp://10.1.1.11/CentOS/7.4 initrd /cores/CentOS/7.4/initrd.img title CentOS 6.9 UEFI root (nd) kernel /cores/CentOS/6.9/vmlinuz ip=dhcp ks=ftp://10.1.1.11/kickstart.cfgs/CentOS-6.x-min_UEFI.cfg repo=ftp://10.1.1.11/CentOS/6.9 initrd /cores/CentOS/6.9/initrd.img title Install system with basic video driver kernel /images/pxeboot/vmlinuz nomodeset askmethod initrd /images/pxeboot/initrd.img title rescue kernel /images/pxeboot/vmlinuz rescue askmethod initrd /images/pxeboot/initrd.img
-
- splash.xpm.gz
vsftp
創建需要的系統目錄
- mkdir -p /var/ftp/{CentOS,Ubuntu,Windows,cfgs}
- cd /var/ftp
- mkdir CentOS/{6.9,7.4}
- mkdir Ubuntu/{16,17}
- mkdir Windows/{7,10}
復制完整的鏡像文件
cp -rf /mnt/* /var/tfp/CentOS/7.4
二級目錄結構
tree /var/ftp . ├── CentOS │ ├── 6.9 │ └── 7.4 ├── kickstart.cfgs ├── Ubuntu │ ├── 16 │ └── 17 └── Windows ├── 10 └── 7
Kickstart

1 install 2 url --url=ftp://10.1.1.104/CentOS/7.4 3 text 4 lang en_US.UTF-8 5 keyboard us 6 zerombr 7 bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet" --location=mbr --driveorder=sda 8 network --bootproto=dhcp --device=enp0s3 --onboot=yes --noipv6 --hostname=CentOS7 9 timezone --utc Asia/Shanghai 10 authconfig --enableshadow --passalgo=sha512 11 rootpw --iscrypted $6$Ivywr2J3hw9DVOyM$YSNpObpKiJ7iRvOL9wpJf/mEY29cAuMG3drIvcXc56pQkyQIR68RuwfonNVSkt2CZMcgLwITASS/tlX98SfTZ0 12 clearpart --all --initlabel 13 part /boot --fstype xfs --size 1024 14 part swap --size 1024 15 part / --fstype xfs --size 8192 16 part /home --fstype xfs --size 1 --grow 17 services --enabled="chronyd" 18 firstboot --disable 19 selinux --disabled 20 firewall --disabled 21 logging --level=info 22 reboot 23 24 %packages 25 @^minimal 26 @core 27 chrony 28 kexec-tools 29 30 %end

1 install 2 url --url=ftp://10.1.1.11/CentOS/7.4 3 text 4 keyboard us 5 lang en_US.UTF-8 6 bootloader --location=mbr 7 zerombr 8 clearpart --all --initlabel 9 part /boot/efi --fstype efi --size 200 --asprimary --ondisk sda 10 part /boot --fstype xfs --size 500 --ondisk sda 11 part swap --size 1024 --ondisk sda 12 part / --fstype xfs --size 8192 --ondisk sda 13 part /home --fstype xfs --size 1 --grow --ondisk sda 14 network --bootproto=dhcp --device=enp0s3 --onboot=yes --noipv6 --hostname=CentOS7 15 timezone --utc Asia/Shanghai 16 authconfig --enableshadow --passalgo=sha512 17 rootpw --iscrypted $6$Ivywr2J3hw9DVOyM$YSNpObpKiJ7iRvOL9wpJf/mEY29cAuMG3drIvcXc56pQkyQIR68RuwfonNVSkt2CZMcgLwITASS/tlX98SfTZ0 18 logging --level=info 19 20 %pre 21 parted -s /dev/sda mklabel gpt 22 %end 23 24 %packages 25 @^minimal 26 @core 27 chrony 28 kexec-tools 29 %end 30 31 reboot
因詳細的kickstart配置文件參數過多,這里不一一表明。
tftp結構目錄
tree /var/lib/tftpboot
.
├── BOOTX64.efi
├── cores
│ ├── CentOS
│ │ ├── 6.9
│ │ │ ├── initrd.img
│ │ │ └── vmlinuz
│ │ └── 7.4
│ │ ├── initrd.img
│ │ └── vmlinuz
│ ├── Ubuntu
│ │ ├── 16
│ │ └── 17
│ └── Windows
│ ├── 10
│ └── 7
├── efidefault
├── gpxelinux.0
├── memdisk
├── pxelinux.0
├── pxelinux.cfg
│ ├── boot.msg
│ ├── default
│ ├── splash.jpg
│ └── vesamenu.c32
└── splash.xpm.gz
啟動服務
- systemctl start dhcpd
- systemctl start tftp
- systemctl start xinetd
- systemctl start vsftpd
加入開機自啟動
- systemctl enable dhcpd
- systemctl enable tftp
- systemctl enable xinetd
- systemctl enable vsftpd
經過測試CentOS7 PXE無人職守安裝並無問題,BIOS 和 UEFI 均可。