本文目錄: 1.1 PXE說明 1.2 PXE流程 1.3 部署環(huán)境說明 1.4 部署DHCP服務(wù) 1.5 部署FTP 1.6 提供pxe的boot loader和相關(guān)配置文件 1.7 從安裝鏡像中獲取Linux內(nèi)核文件 1.8 設(shè)置開機(jī)菜單并提供系統(tǒng)安裝文件 1.9 開機(jī)測試 1.10 通過pxe+kickstart實(shí)現(xiàn)無人值守批量安裝操作系統(tǒng) 本文是PXE+kickstart無人值守安裝CentOS6的續(xù)篇,主要是為了突出CentOS7和CentOS6配置kickstart時(shí)的不同點(diǎn),例如pxelinux.cfg/default文件的變化,kickstart使用nfs提供時(shí)的bug等。為了文章的完整性和獨(dú)立性,將很多CentOS6上直接復(fù)制搬到了本文。 1.1 PXE說明 所謂的PXE是Preboot Execution Environment的縮寫,字面上的意思是開機(jī)前的執(zhí)行環(huán)境。 要達(dá)成PXE必須要有兩個(gè)環(huán)節(jié): (1)一個(gè)是客戶端的網(wǎng)卡必須要支持PXE用戶端功能,并且開機(jī)時(shí)選擇從網(wǎng)卡啟動,這樣系統(tǒng)才會以網(wǎng)卡進(jìn)入PXE客戶端的程序; (2)一個(gè)是PXE服務(wù)器必須要提供至少含有DHCP以及TFTP的服務(wù)! 且其中: · DHCP服務(wù)必須要能夠提供客戶端的網(wǎng)絡(luò)參數(shù),還要告知客戶端TFTP所在的位置; · TFTP則提供客戶端的boot loader及kernel file下載路徑。 還要加上NFS/FTP/HTTP(選擇一樣即可)等提供安裝文件(安裝鏡像的解壓文件),才算是比較完整的PXE服務(wù)器。一般TFTP和DHCP服務(wù)都由同一臺服務(wù)器提供,且大多數(shù)時(shí)候還提供NFS/FTP/HTTP服務(wù),所以PXE服務(wù)器一般是提供3合一的服務(wù)。 1.2 PXE流程 如下圖:圖片來源于網(wǎng)絡(luò),雖不易理解,但細(xì)節(jié)描述的很好。
(1).Client向PXE Server上的DHCP發(fā)送IP地址請求消息,DHCP檢測Client是否合法(主要是檢測Client的網(wǎng)卡MAC地址),如果合法則返回Client的IP地址,同時(shí)將pxe環(huán)境下的Boot loader文件pxelinux.0的位置信息傳送給Client。 (2).Client向PXE Server上的TFTP請求pxelinux.0,TFTP接收到消息之后再向Client發(fā)送pxelinux.0大小信息,試探Client是否滿意,當(dāng)TFTP收到Client發(fā)回的同意大小信息之后,正式向Client發(fā)送pxelinux.0。 (3).Client執(zhí)行接收到的pxelinux.0文件。 (4).Client向TFTP請求pxelinux.cfg文件(其實(shí)它是目錄,里面放置的是是啟動菜單,即grub的配置文件),TFTP將配置文件發(fā)回Client,繼而Client根據(jù)配置文件執(zhí)行后續(xù)操作。 (5).Client向TFTP發(fā)送Linux內(nèi)核請求信息,TFTP接收到消息之后將內(nèi)核文件發(fā)送給Client。 (6).Client向TFTP發(fā)送根文件請求信息,TFTP接收到消息之后返回Linux根文件系統(tǒng)。 (7).Client加載Linux內(nèi)核(啟動參數(shù)已經(jīng)在4中的配置文件中設(shè)置好了)。 (8).Client通過nfs/ftp/http下載系統(tǒng)安裝文件進(jìn)行安裝。如果在4中的配置文件指定了kickstart路徑,則會根據(jù)此文件自動應(yīng)答安裝系統(tǒng)。 1.3 部署環(huán)境說明 如下圖,172..16.10.10是PXE服務(wù)器,提供dhcp+tftp+nfs服務(wù)。其他該網(wǎng)段內(nèi)的主機(jī)為待安裝系統(tǒng)的主機(jī)群。
1.4 部署DHCP服務(wù) 首先安裝dhcp服務(wù)端程序。 yum -y install dhcp DHCP主要是提供客戶端網(wǎng)絡(luò)參數(shù)與TFTP的位置,以及boot loader的文件名。同時(shí),我們僅針對內(nèi)網(wǎng)來告知TFTP的相關(guān)位置,所以可以編輯/etc/dhcp/dhcpd.conf在subnet的區(qū)塊內(nèi)加入兩個(gè)參數(shù)即可。其中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以及內(nèi)核相關(guān)的配置文件(目錄pxelinux.cfg下)主要都是由TFTP來提供的! TFTP的安裝很簡單,直接使用yum即可。不過要告訴客戶端TFTP的根目錄在哪里,這樣客戶端才能找到相關(guān)文件。另外要注意,TFTP是由xinetd這個(gè)super daemon所管理的,因此設(shè)定好TFTP之后,要啟動的是xinetd。 yum install tftp-server yum -y install xinetd 默認(rèn)TFTP服務(wù)的根目錄是/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 # 重點(diǎn)在這里!修改tftp的chroot根目錄 disable = no per_source = 11 cps = 100 2 flags = IPv4 } 創(chuàng)建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實(shí)現(xiàn)無人值守批量安裝Linux http://www.linuxidc.com/Linux/2015-11/125040.htm RHEL7/CentOS7 PXE+Kickstart自動化系統(tǒng)安裝 http://www.linuxidc.com/Linux/2017-07/145399.htm PXE+Kickstart安裝CentOS 7.3 http://www.linuxidc.com/Linux/2017-06/144789.htm Linux運(yùn)維自動化工具 Kickstart http://www.linuxidc.com/Linux/2016-04/129978.htm PXE+Kickstart無人值守安裝CentOS 7 http://www.linuxidc.com/Linux/2017-08/146169.htm RHCE認(rèn)證之無人值守安裝Linux系統(tǒng)(FTP+TFTP+DHCP+Kickstart+PXE) http://www.linuxidc.com/Linux/2013-10/91013.htm CentOS Kickstart及引導(dǎo)鏡像文件制作 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和相關(guān)配置文件 如果要使用PXE的開機(jī)引導(dǎo)的話,需要使用CentOS提供的syslinux包,從中copy兩個(gè)文件到tftp的根目錄/tftpboot下即可。整個(gè)過程如下: 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 # 開機(jī)的菜單設(shè)定在這里 -rw-r--r-- 1 root root 163728 Oct 16 2014 vesamenu.c32 # 也是提供圖形化菜單功能,但界面和menu.c32不同 pxelinux.cfg是個(gè)目錄,可以放置默認(rèn)的開機(jī)選項(xiàng),也可以針對不同的客戶端主機(jī)提供不同的開機(jī)選項(xiàng)。一般來說,可以在pxelinux.cfg目錄內(nèi)建立一個(gè)名為default的文件來提供默認(rèn)選項(xiàng)。 如果沒有menu.c32或vesamenu.c32時(shí),菜單會以純文字模式一行一行顯示。如果使用menu.c32或vesamenu.c32,就會有類似反白效果出現(xiàn),此時(shí)可以使用上下鍵來選擇選項(xiàng),而不需要看著屏幕去輸入數(shù)字鍵來選擇開機(jī)選項(xiàng)。經(jīng)過測試,使用vesamenu.c32比menu.c32更加好看些。 這部分設(shè)定完畢后,就是內(nèi)核相關(guān)的設(shè)定了。 1.7 從安裝鏡像中獲取Linux內(nèi)核文件 要安裝Linux系統(tǒng),必須提供Linux內(nèi)核文件和initrd文件,這里以64位版本的CentOS 7.2為例。 這里計(jì)劃將內(nèi)核相關(guān)文件放在/tftpboot/CentOS7.2/目錄下。既然要從安裝鏡像中獲取內(nèi)核相關(guān)文件,首先得要掛載鏡像。 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 其實(shí)僅需要vmlinuz和initrd.img兩個(gè)文件即可,不過這里還將isolinux.cfg這個(gè)文件拷貝出來了,這個(gè)文件里提供了開機(jī)選項(xiàng),可以以它作為修改開機(jī)選項(xiàng)和菜單的模板,這樣修改起來比較容易,也更便捷! 1.8 設(shè)置開機(jī)菜單并提供系統(tǒng)安裝文件 以下是CentOS 7.2中syslinux包中提供的isolinux.cfg中提供的默認(rèn)內(nèi)容。 [root@linuxidc ~]# cat /tftpboot/pxelinux.cfg/default default vesamenu.c32 # 這是必須項(xiàng),或者使用menu.c32 timeout 600 # 超時(shí)等待時(shí)間,60秒內(nèi)不操作將自動選擇默認(rèn)的菜單來加載 display boot.msg # 這是為選項(xiàng)提供一些說明的文件 # 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 # 大標(biāo)題 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 # 內(nèi)核文件路徑,注意相對路徑是從tftp的根路徑/tftpboot開始的,所以要改為"./CentOS7.2/vmlinuz" append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet # 內(nèi)核啟動選項(xiàng),其中包括initrd的路徑,同樣要改為"./CentOS7.2/initrd.img" # stage2文件的搜索路徑,搜索的文件一般是".treeinfo",找不到該文件則找LiveOS/squashfs.img # 一般pxe環(huán)境下此路徑直接指向系統(tǒng)安裝文件的路徑,具體做法見下文示例 label check menu label Test this ^media & install CentOS 7 menu default # menu default表示開機(jī)時(shí)光標(biāo)一開始默認(rèn)停留在此label上 kernel vmlinuz append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet menu separator # insert an empty line # utilities submenu # 子菜單項(xiàng)的設(shè)置方法 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=CentOS\x207\x20x86_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=CentOS\x207\x20x86_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"這兩個(gè)內(nèi)核啟動參數(shù)是為了讓網(wǎng)卡名稱為ethN,而不是默認(rèn)的eno16777728這樣的隨機(jī)名稱。 注意示例中stage2的路徑是放在ftp的路徑下(vsftpd根目錄/var/ftp/),所以先將鏡像文件中的系統(tǒng)安裝文件提取出來放到/var/ftp/下。當(dāng)然,除了ftp,還支持nfs/http。但是,CentOS7.2在pxe+kickstart時(shí)對NFS的支持出現(xiàn)了bug,所以不建議使用nfs,當(dāng)使用nfs出現(xiàn)各種疑難雜癥時(shí)請換回ftp或http。 yum -y install vsftpd cp -a /test/* /var/ftp/ systemctl start vsftpd 1.9 開機(jī)測試 新開一個(gè)虛擬機(jī),進(jìn)入bios界面設(shè)置從網(wǎng)卡啟動。將首先搜索DHCP服務(wù)器,找到DHCP后搜索bootloader文件,啟動菜單設(shè)置文件等,然后進(jìn)入啟動菜單等待選擇要啟動的項(xiàng)。如下:
因?yàn)橹辉O(shè)置了一個(gè)啟動項(xiàng),所以菜單中只有一項(xiàng)。啟動它,將加載一系列文件,直到出現(xiàn)安裝操作界面。
然后就可以直接操作安裝系統(tǒng)了。但這樣畢竟是手動操作,無法實(shí)現(xiàn)批量系統(tǒng)安裝,所以要提供一個(gè)自動應(yīng)答文件,每一次的手動操作步驟都由自動應(yīng)答文件中給定的項(xiàng)來應(yīng)答,這樣就能實(shí)現(xiàn)自動安裝操作系統(tǒng),也就能實(shí)現(xiàn)批量系統(tǒng)安裝。 1.10 通過pxe+kickstart實(shí)現(xiàn)無人值守批量安裝操作系統(tǒng) 所謂的無人值守,就是自動應(yīng)答,當(dāng)安裝過程中需要人機(jī)交互提供某些選項(xiàng)的答案時(shí)(如如何分區(qū)),自動應(yīng)答文件可以根據(jù)對應(yīng)項(xiàng)自動提供答案。但是,無人值守并不完全是無人值守,至少設(shè)置bios從網(wǎng)卡啟動是必須人為設(shè)置的,且安裝完系統(tǒng)后設(shè)置不從網(wǎng)卡啟動也是需要人為設(shè)置的。除此之外,其他的基本上都可以實(shí)現(xiàn)無人值守安裝。 要配置無人值守的系統(tǒng)安裝環(huán)境,需要提供安裝過程中需要的各種答案,這些答案在kickstart的配置文件中設(shè)置,一般正常安裝完Linux系統(tǒng)在root用戶的家目錄下有一個(gè)anaconda-ks.cfg,該文件的選項(xiàng)說明見kickstart文件詳細(xì)說明。http://www.linuxidc.com/Linux/2017-08/146168.htm 以下是修改后該文件中的內(nèi)容,將用來做kickstart應(yīng)答文件。并設(shè)置由ftp服務(wù)來提供該文件,所以將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分區(qū),則考慮以下分區(qū) # 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 設(shè)置后,修改/tftpboot/pxelinux.cfg/default文件,在其中的內(nèi)核啟動參數(shù)上加上一項(xiàng)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參數(shù)必須使用nfs4協(xié)議,即使使用了nfs4,仍然無法實(shí)現(xiàn)無人值守,這是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,否則在安裝系統(tǒng)時(shí)將報(bào)錯(cuò),如下。不知道為什么到CentOS7.2還需要明確指定nfs4,算是bug吧,在redhat的bug提交區(qū)已經(jīng)有用戶提交相關(guān)問題。 但即使使用nfs4協(xié)議,雖然能夠讀取kickstart文件,但卻無法生效,即無法實(shí)現(xiàn)自動應(yīng)答,仍然需要手動操作。 所以,建議使用ftp或者h(yuǎn)ttp,暫時(shí)不要使用NFS。但這個(gè)bug只針對CentOS 7,CentOS 6是沒有任何問題的。 回歸正題,現(xiàn)在已經(jīng)設(shè)置好/tftpboot/pxelinux.cfg/default和/var/ftp/pub/ks.cfg,所以可以進(jìn)行無人值守安裝Linux了。
聯(lián)系客服