首頁 > 軟體

PXE+Kickstart無人值守安裝CentOS 7

2020-06-16 17:09:29

本文目錄:

1.1 PXE說明

1.2 PXE流程

1.3 部署環境說明

1.4 部署DHCP服務

1.5 部署FTP

1.6 提供pxe的boot loader和相關組態檔

1.7 從安裝映象中獲取Linux核心檔案

1.8 設定開機選單並提供系統安裝檔案

1.9 開機測試

1.10 通過pxe+kickstart實現無人值守批次安裝作業系統


本文是PXE+kickstart無人值守安裝CentOS6的續篇,主要是為了突出CentOS7和CentOS6設定kickstart時的不同點,例如pxelinux.cfg/default檔案的變化,kickstart使用nfs提供時的bug等。為了文章的完整性和獨立性,將很多CentOS6上直接複製搬到了本文。

1.1 PXE說明

所謂的PXE是Preboot Execution Environment的縮寫,字面上的意思是開機前的執行環境。

要達成PXE必須要有兩個環節:

(1)一個是用戶端的網絡卡必須要支援PXE使用者端功能,並且開機時選擇從網絡卡啟動,這樣系統才會以網絡卡進入PXE用戶端的程式;

(2)一個是PXE伺服器必須要提供至少含有DHCP以及TFTP的服務!

且其中:

    · DHCP服務必須要能夠提供用戶端的網路引數,還要告知用戶端TFTP所在的位置;

    · TFTP則提供用戶端的boot loader及kernel file下載路徑。

還要加上NFS/FTP/HTTP(選擇一樣即可)等提供安裝檔案(安裝映象的解壓檔案),才算是比較完整的PXE伺服器。一般TFTP和DHCP服務都由同一台伺服器提供,且大多數時候還提供NFS/FTP/HTTP服務,所以PXE伺服器一般是提供3合一的服務。

1.2 PXE流程

如下圖:圖片來源於網路,雖不易理解,但細節描述的很好。

(1).Client向PXE Server上的DHCP傳送IP地址請求訊息,DHCP檢測Client是否合法(主要是檢測Client的網絡卡MAC地址),如果合法則返回Client的IP地址,同時將pxe環境下的Boot loader檔案pxelinux.0的位置資訊傳送給Client。

(2).Client向PXE Server上的TFTP請求pxelinux.0,TFTP接收到訊息之後再向Client傳送pxelinux.0大小資訊,試探Client是否滿意,當TFTP收到Client發回的同意大小資訊之後,正式向Client傳送pxelinux.0。

(3).Client執行接收到的pxelinux.0檔案

(4).Client向TFTP請求pxelinux.cfg檔案(其實它是目錄,裡面放置的是是啟動選單,即grub的組態檔),TFTP將組態檔發回Client,繼而Client根據組態檔執行後續操作。

(5).Client向TFTP傳送Linux核心請求資訊TFTP接收到訊息之後將核心檔案傳送給Client。

(6).Client向TFTP傳送根檔案請求資訊,TFTP接收到訊息之後返回Linux根檔案系統。

(7).Client載入Linux核心(啟動引數已經在4中的組態檔中設定好了)。

(8).Client通過nfs/ftp/http下載系統安裝檔案進行安裝。如果在4中的組態檔指定了kickstart路徑,則會根據此檔案自動應答安裝系統。

1.3 部署環境說明

如下圖,172..16.10.10是PXE伺服器,提供dhcp+tftp+nfs服務。其他該網段內的主機為待安裝系統的主機群。

1.4 部署DHCP服務

首先安裝dhcp伺服器端程式。

yum -y install dhcp

DHCP主要是提供用戶端網路引數與TFTP的位置,以及boot loader的檔名。同時,我們僅針對內網來告知TFTP的相關位置,所以可以編輯/etc/dhcp/dhcpd.conf在subnet的區塊內加入兩個引數即可。其中PXE上專門為PXE用戶端下載的boot loader檔名稱為pxelinux.0。

vim /etc/dhcp/dhcpd.conf
ddns-update-style none;
default-lease-time 259200;
max-lease-time 518400;    
option routers 172.16.10.10;
option domain-name-servers 172.16.10.10;
subnet 172.16.10.0 netmask 255.255.255.0 {
        range 172.16.10.11 172.16.10.100;
        option subnet-mask 255.255.255.0;
        next-server 172.16.10.10;            # 就是TFTP的位置
        filename "pxelinux.0";               # 告知得從TFTP根目錄下載的boot loader檔名
}

重新啟動dhcp

systemctl start dhcpd

1.5 部署TFTP

從流程圖中可以看出,boot loader檔案pxelinux.0以及核心相關的組態檔(目錄pxelinux.cfg下)主要都是由TFTP來提供的!

TFTP的安裝很簡單,直接使用yum即可。不過要告訴用戶端TFTP的根目錄在哪裡,這樣用戶端才能找到相關檔案。另外要注意,TFTP是由xinetd這個super daemon所管理的,因此設定好TFTP之後,要啟動的是xinetd。

yum install tftp-server
yum -y install xinetd

預設TFTP服務的根目錄是/var/lib/tftpboot/,為了少寫些字母,將tftp的根目錄修改為/tftpboot/。修改tftp的組態檔,主要是TFTP的根目錄。

vim /etc/xinetd.d/tftp

service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s /tftpboot    # 重點在這裡!修改tftp的chroot根目錄
        disable                 = no
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

建立tftp的根目錄。

mkdir /tftpboot

啟動TFTP並觀察之:

systemctl start tftp

netstat -tulnp | grep xinetd
udp        0      0 0.0.0.0:69              0.0.0.0:*                           28465/xinetd 

接下來的檔案必須要放置於/tftpboot/目錄下。

PXE+Kickstart實現無人值守批次安裝Linux  http://www.linuxidc.com/Linux/2015-11/125040.htm

RHEL7/CentOS7 PXE+Kickstart自???化系統安裝  http://www.linuxidc.com/Linux/2017-07/145399.htm

PXE+Kickstart安裝CentOS 7.3  http://www.linuxidc.com/Linux/2017-06/144789.htm

Linux運維自動化工具 Kickstart  http://www.linuxidc.com/Linux/2016-04/129978.htm

PXE+Kickstart無人值守安裝CentOS 7  http://www.linuxidc.com/Linux/2017-08/146169.htm

RHCE認證之無人值守安裝Linux系統(FTP+TFTP+DHCP+Kickstart+PXE) http://www.linuxidc.com/Linux/2013-10/91013.htm

CentOS Kickstart及引導映象檔案製作  http://www.linuxidc.com/Linux/2017-05/143714.htm

Kickstart 全自動安裝部署RHEL 7.0  http://www.linuxidc.com/Linux/2015-09/123312.htm

1.6 提供pxe的bootloader和相關組態檔

如果要使用PXE的開機引導的話,需要使用CentOS提供的syslinux包,從中copy兩個檔案到tftp的根目錄/tftpboot下即可。整個過程如下:

yum -y install syslinux
cp -a /usr/share/syslinux/{menu.c32,vesamenu.c32,pxelinux.0}  /tftpboot/
mkdir /tftpboot/pxelinux.cfg
ls -l /tftpboot/
-rw-r--r-- 1 root root  61796 Oct 16  2014 menu.c32      # 提供圖形化選單功能
-rw-r--r-- 1 root root  26759 Oct 16  2014 pxelinux.0    # boot loader檔案
drwxr-xr-x 2 root root   4096 Feb 24 20:02 pxelinux.cfg  # 開機的選單設定在這裡
-rw-r--r-- 1 root root 163728 Oct 16  2014 vesamenu.c32  # 也是提供圖形化選單功能,但介面和menu.c32不同

pxelinux.cfg是個目錄,可以放置預設的開機選項,也可以針對不同的用戶端主機提供不同的開機選項。一般來說,可以在pxelinux.cfg目錄內建立一個名為default的檔案來提供預設選項。

如果沒有menu.c32或vesamenu.c32時,選單會以純文字模式一行一行顯示。如果使用menu.c32或vesamenu.c32,就會有類似反白效果出現,此時可以使用上下鍵來選擇選項,而不需要看著螢幕去輸入數位鍵來選擇開機選項。經過測試,使用vesamenu.c32比menu.c32更加好看些。

這部分設定完畢後,就是核心相關的設定了。

1.7 從安裝映象中獲取Linux核心檔案

要安裝Linux系統,必須提供Linux核心檔案和initrd檔案,這裡以64位元版本的CentOS 7.2為例。

這裡計劃將核心相關檔案放在/tftpboot/CentOS7.2/目錄下。既然要從安裝映象中獲取核心相關檔案,首先得要掛載映象。

mount /dev/cdrom /test
mkdir /tftpboot/CentOS7.2
cp /test/isolinux/{vmlinuz,initrd.img} /tftpboot/CentOS7.2
cp /test/isolinux/isolinux.cfg /tftpboot/pxelinux.cfg/default

其實僅需要vmlinuz和initrd.img兩個檔案即可,不過這裡還將isolinux.cfg這個檔案拷貝出來了,這個檔案裡提供了開機選項,可以以它作為修改開機選項和選單的模板,這樣修改起來比較容易,也更便捷!

1.8 設定開機選單並提供系統安裝檔案

以下是CentOS 7.2中syslinux包中提供的isolinux.cfg中提供的預設內容。

[root@linuxidc ~]# cat /tftpboot/pxelinux.cfg/default
default vesamenu.c32   # 這是必須項,或者使用menu.c32
timeout 600            # 超時等待時間,60秒內不操作將自動選擇預設的選單來載入

display boot.msg       # 這是為選項提供一些說明的檔案

# Clear the screen when exiting the menu, instead of leaving the menu displayed.
# For vesamenu, this means the graphical background is still displayed without
# the menu itself for as long as the screen remains in graphics mode.
menu clear
menu background splash.png   # 背景圖片
menu title CentOS 7          # 大標題
menu vshift 8
menu rows 18
menu margin 8
#menu hidden
menu helpmsgrow 15
menu tabmsgrow 13

# Border Area
menu color border * #00000000 #00000000 none

# Selected item
menu color sel 0 #ffffffff #00000000 none

# Title bar
menu color title 0 #ff7ba3d0 #00000000 none

# Press [Tab] message
menu color tabmsg 0 #ff3a6496 #00000000 none

# Unselected menu item
menu color unsel 0 #84b8ffff #00000000 none

# Selected hotkey
menu color hotsel 0 #84b8ffff #00000000 none

# Unselected hotkey
menu color hotkey 0 #ffffffff #00000000 none

# Help text
menu color help 0 #ffffffff #00000000 none

# A scrollbar of some type? Not sure.
menu color scrollbar 0 #ffffffff #ff355594 none

# Timeout msg
menu color timeout 0 #ffffffff #00000000 none
menu color timeout_msg 0 #ffffffff #00000000 none

# Command prompt text
menu color cmdmark 0 #84b8ffff #00000000 none
menu color cmdline 0 #ffffffff #00000000 none

# Do not display the actual menu unless the user presses a key. All that is displayed is a timeout message.

menu tabmsg Press Tab for full configuration options on menu items.

menu separator # insert an empty line
menu separator # insert an empty line

label linux
  menu label ^Install CentOS 7   # 選單文字
  kernel vmlinuz        # 核心檔案路徑,注意相對路徑是從tftp的根路徑/tftpboot開始的,所以要改為"./CentOS7.2/vmlinuz"
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOSx207x20x86_64 quiet  
                        # 核心啟動選項,其中包括initrd的路徑,同樣要改為"./CentOS7.2/initrd.img"
                        # stage2檔案的搜尋路徑,搜尋的檔案一般是".treeinfo",找不到該檔案則找LiveOS/squashfs.img
                        # 一般pxe環境下此路徑直接指向系統安裝檔案的路徑,具體做法見下文範例

label check
  menu label Test this ^media & install CentOS 7
  menu default          # menu default表示開機時游標一開始預設停留在此label上
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOSx207x20x86_64 rd.live.check quiet

menu separator # insert an empty line

# utilities submenu          # 子選單項的設定方法
menu begin ^Troubleshooting
  menu title Troubleshooting

label vesa
  menu indent count 5
  menu label Install CentOS 7 in ^basic graphics mode
  text help
        Try this option out if you're having trouble installing
        CentOS 7.
  endtext
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOSx207x20x86_64 xdriver=vesa nomodeset quiet

label rescue
  menu indent count 5
  menu label ^Rescue a CentOS system
  text help
        If the system will not boot, this lets you access files
        and edit config files to try to get it booting again.
  endtext
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOSx207x20x86_64 rescue quiet

label memtest
  menu label Run a ^memory test
  text help
        If your system is having issues, a problem with your
        system's memory may be the cause. Use this utility to
        see if the memory is working correctly.
  endtext
  kernel memtest

menu separator # insert an empty line

label local
  menu label Boot from ^local drive
  localboot 0xffff

menu separator # insert an empty line
menu separator # insert an empty line

label returntomain
  menu label Return to ^main menu
  menu exit

menu end

所以,將其稍作修改,使其適合做pxe的選單組態檔。

default vesamenu.c32  
timeout 600           

display boot.msg      

menu clear
menu background splash.png
menu title CentOS 7 menu
menu vshift 8
menu rows 18
menu margin 8
#menu hidden
menu helpmsgrow 15
menu tabmsgrow 13

menu color border * #00000000 #00000000 none
menu color sel 0 #ffffffff #00000000 none
menu color title 0 #ff7ba3d0 #00000000 none
menu color tabmsg 0 #ff3a6496 #00000000 none
menu color unsel 0 #84b8ffff #00000000 none
menu color hotsel 0 #84b8ffff #00000000 none
menu color hotkey 0 #ffffffff #00000000 none
menu color help 0 #ffffffff #00000000 none
menu color scrollbar 0 #ffffffff #ff355594 none
menu color timeout 0 #ffffffff #00000000 none
menu color timeout_msg 0 #ffffffff #00000000 none
menu color cmdmark 0 #84b8ffff #00000000 none
menu color cmdline 0 #ffffffff #00000000 none

label linux
  menu label ^Install CentOS 7.2 through pxe
  menu default
  kernel "./CentOS7.2/vmlinuz"
  append initrd="./CentOS7.2/initrd.img" inst.stage2=ftp://172.16.10.10 quiet net.ifnames=0 biosdevname=0

其中"net.ifnames=0 biosdevname=0"這兩個核心啟動引數是為了讓網絡卡名稱為ethN,而不是預設的eno16777728這樣的隨機名稱。

注意範例中stage2的路徑是放在ftp的路徑下(vsftpd根目錄/var/ftp/),所以先將映象檔案中的系統安裝檔案提取出來放到/var/ftp/下。當然,除了ftp,還支援nfs/http。但是,CentOS7.2在pxe+kickstart時對NFS的支援出現了bug,所以不建議使用nfs,當使用nfs出現各種疑難雜症時請換回ftp或http。

yum -y install vsftpd
cp -a /test/* /var/ftp/
systemctl start vsftpd

1.9 開機測試

新開一個虛擬機器,進入bios介面設定從網絡卡啟動。將首先搜尋DHCP伺服器,找到DHCP後搜尋bootloader檔案,啟動選單設定檔案等,然後進入啟動選單等待選擇要啟動的項。如下:

 

因為只設定了一個啟動項,所以選單中只有一項。啟動它,將載入一系列檔案,直到出現安裝操作介面。

 

然後就可以直接操作安裝系統了。但這樣畢竟是手動操作,無法實現批次系統安裝,所以要提供一個自動應答檔案,每一次的手動操作步驟都由自動應答檔案中給定的項來應答,這樣就能實現自動安裝作業系統,也就能實現批次系統安裝。

1.10 通過pxe+kickstart實現無人值守批次安裝作業系統

所謂的無人值守,就是自動應答,當安裝過程中需要人機互動提供某些選項的答案時(如如何分割區),自動應答檔案可以根據對應項自動提供答案。但是,無人值守並不完全是無人值守,至少設定bios從網絡卡啟動是必須人為設定的,且安裝完系統後設定不從網絡卡啟動也是需要人為設定的。除此之外,其他的基本上都可以實現無人值守安裝。

要設定無人值守的系統安裝環境,需要提供安裝過程中需要的各種答案,這些答案在kickstart的組態檔中設定,一般正常安裝完Linux系統在root使用者的家目錄下有一個anaconda-ks.cfg,該檔案的選項說明見kickstart檔案詳細說明http://www.linuxidc.com/Linux/2017-08/146168.htm

以下是修改後該檔案中的內容,將用來做kickstart應答檔案。並設定由ftp服務來提供該檔案,所以將kickstart檔案儲存到ftp的pub目錄中。

[root@linuxidc ~]# cp -a ~/anaconda-ks.cfg /var/ftp/pub/ks.cfg
[root@linuxidc ~]# chmod +r /var/ftp/pub/ks.cfg     # 必須要保證ks.cfg是全域性可讀的
[root@linuxidc ~]# cat anaconda-ks.cfg
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Install OS instead of upgrade
install
# Use network installation
url --url="ftp://172.16.10.10"
#url --url="http://192.168.100.53/cblr/links/CentOS7.2-x86_64"
#nfs --server=172.16.10.10 --dir=/install
# Use text mode install
text
# Firewall configuration
firewall --disabled
firstboot --disable
ignoredisk --only-use=sda
# Keyboard layouts
# old format: keyboard us
# new format:
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8

# Network information
network  --onboot=yes --bootproto=dhcp --device=eth0 --noipv6
network  --hostname=node1.linuxidc.com
# Reboot after installation
reboot
# Root password
rootpw --iscrypted $6$KIPkwGVYqtjHln80$quxmkE5MKKA2LyzLOAc/s3FWH/jX76sObq6hqwOsEBoeMc/wIrzGG4xm72lkXwLeOfRLS/sl5vdajY9j34D4J. 
# SELinux configuration
selinux --disabled
# Do not configure the X Window System
skipx
# System timezone
timezone Asia/Shanghai
# System bootloader configuration
bootloader --append="quiet crashkernel=auto" --location=mbr --boot-drive=sda
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part /boot --asprimary --fstype="xfs" --size=250
part swap --fstype="swap" --size=2000
part / --asprimary --fstype="xfs" --grow --size=5000

# 如果是要LVM分割區,則考慮以下分割區
# part /boot --fstype ext4 --size=100
# part swap --fstype=swap --size=2048
# part pv26 --size=100 --grow
# volgroup VG00 --pesize=32768 pv26
# logvol / --fstype ext4 --name=LVroot --vgname=VG00 --size=29984
# logvol /data --fstype ext4 --name=LVdata --vgname=VG00 --size=100 --grow

%post
rm -f /etc/yum.repos.d/*
cat >>/etc/yum.repos.d/base.repo<<eof
[base]
name=sohu
baseurl=http://mirrors.sohu.com/centos/7/os/x86_64/
gpgcheck=0
enable=1
[epel]
name=epel
baseurl=http://mirrors.aliyun.com/epel/7Server/x86_64/
enable=1
gpgcheck=0
eof
sed -i "s/rhgb //" /boot/grub2/grub.cfg
sed -i "s/ONBOOT.*$/ONBOOT=yes/" /etc/sysconfig/network-scripts/ifcfg-eth0
sed -i "/UUID/d" /etc/sysconfig/network-scripts/ifcfg-eth0
echo "DNS1=114.114.114.114" >> /etc/sysconfig/network-scripts/ifcfg-eth0
echo "UseDNS no" >> /etc/ssh/sshd_config
sed -i "s/^SELINUX=.*$/SELINUX=disabled/" /etc/sysconfig/selinux
systemctl disable firewalld
%end

%packages
@base
@core
@development
@platform-devel
kexec-tools
lftp
tree
lrzsz

%end

%addon com_RedHat_kdump --enable --reserve-mb='auto'

%end

設定後,修改/tftpboot/pxelinux.cfg/default檔案,在其中的核心啟動引數上加上一項kickstart檔案的尋找路徑。

vim /tftpboot/pxelinux.cfg/default
label linux
  menu label ^Install CentOS 7.2 through pxe
  menu default
  kernel "./CentOS7.2/vmlinuz"
  append initrd="./CentOS7.2/initrd.img" inst.stage2=ftp://172.16.10.10 ks=ftp://172.16.10.10/pub/ks.cfg quiet net.ifnames=0 biosdevname=0

# 如果使用nfs提供安裝檔案和kickstart檔案,則ks引數必須使用nfs4協定,即使使用了nfs4,仍然無法實現無人值守,這是bug append initrd="./CentOS7.2/initrd.img" inst.stage2=nfs:172.16.10.10:/install ks=nfs4:172.16.10.10:/install/ks.cfg quiet net.ifnames=0 biosdevname=0

注意注釋行中使用nfs4而不是nfs,否則在安裝系統時將報錯,如下。不知道為什麼到CentOS7.2還需要明確指定nfs4,算是bug吧,在redhat的bug提交區已經有使用者提交相關問題。

 

但即使使用nfs4協定,雖然能夠讀取kickstart檔案,但卻無法生效,即無法實現自動應答,仍然需要手動操作。

所以,建議使用ftp或者http,暫時不要使用NFS。但這個bug只針對CentOS 7,CentOS 6是沒有任何問題的。

回歸正題,現在已經設定好/tftpboot/pxelinux.cfg/default和/var/ftp/pub/ks.cfg,所以可以進行無人值守安裝Linux了。

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-08/146169.htm


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