Linux自動運維:使用 PXE & Kickstart 自動安裝 CentOS === ###### tags: `Linux` `PXE` - Maintained by [魏礼謙](https://www.facebook.com/profile.php?id=100002588260959) and [Cheng Che Huang](https://www.facebook.com/profile.php?id=100006791086269&ref=ts&fref=ts) - PXE = **P**reboot-E**x**ecution **E**nvironment ## 零. 基本思路 在大規模部署執行環境時,首先架設一台 PXE 伺服器經由網路提供作業系統安裝所需資源,當 PXE 客戶端使用網路開機時,會自動透過 FTP 協定連線到 PXE 伺服器把 Kickstart 安裝設定檔和作業系統安裝映像檔 (以下簡稱映像檔) 下載到本機,並按照設定檔自動安裝作業系統。 ### 執行流程 ```sequence Note left of PXE客戶端:開機 Note left of PXE客戶端:向DHCP服務要求IP位址 PXE客戶端->PXE伺服器:連接DHCP伺服器 Note right of PXE伺服器:DHCP服務\n分配IP PXE伺服器->PXE客戶端:回傳IP位址和TFTP伺服器位址 Note left of PXE客戶端:向TFTP伺服器\n要求PXE Bootloader PXE客戶端->PXE伺服器:連接TFTP伺服器 Note right of PXE伺服器:TFTP服務\n準備PXE Bootloader PXE伺服器->PXE客戶端:下載PXE Bootloader Note left of PXE客戶端:PXE Bootloader\n執行開機選項 Note left of PXE客戶端:向FTP伺服器\n要求Kickstart設定檔 PXE客戶端->PXE伺服器:連接FTP伺服器 Note right of PXE伺服器:FTP服務\n準備Kickstart設定檔 PXE伺服器->PXE客戶端:下載Kickstart設定檔 Note left of PXE客戶端:初始化安裝程序 Note left of PXE客戶端:向FTP伺服器\n要求作業系統安裝映像檔 PXE客戶端->PXE伺服器:連接FTP伺服器 Note right of PXE伺服器:FTP服務\n準備作業系統安裝映像檔 PXE伺服器->PXE客戶端:下載作業系統安裝映像檔 Note left of PXE客戶端:自動執行作業系統安裝 Note left of PXE客戶端:安裝完成 ``` ## 一. 下載所需工具 - 虛擬機軟體:[Virtualbox](https://www.virtualbox.org/wiki/Downloads) - 作業系統安裝映像檔:[CentOS-7-x86_64-Minimal-1511.iso](http://archive.kernel.org/centos-vault/7.2.1511/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso) - 作業系統安裝映像檔:[CentOS-6.8-x86_64-minimal.iso](http://archive.kernel.org/centos-vault/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso) ## 二. 建立 PXE 伺服器 ( 使用 CentOS 7 1511 ) ### 1. 在 Virtualbox 內安裝 CentOS 7 1511 虛擬機 - 配置三張網路卡,分別為 NAT(enp0s3) 、 Host-only(enp0s8) 、 內部網路(enp0s9) - 指定開機順序為 1. 光碟機開機 2. 硬碟開機 - 配置參考圖 ![](https://i.imgur.com/Xa1sIyc.png) - 啟動並手動安裝虛擬機 ### 2. 調整 PXE 伺服器網路介面卡設定 - 伺服器通常採用靜態網路設定,故首先停用會動態調整網路設定的==NetworkManager==服務,稍後(在第5.小節)啟用設定靜態網路環境的==network==服務 `$ sudo systemctl stop NetworkManager` `$ sudo systemctl disable NetworkManager` - 然後`$ cd /etc/sysconfig/network-scripts` ,接著: - 修改 ==ifcfg-enp0s3== 檔案內容如下 ```shell= TYPE=Ethernet BOOTPROTO=dhcp NAME=enp0s3 DEVICE=enp0s3 ONBOOT=yes ``` - 修改 ==ifcfg-enp0s8== 檔案內容如下 ```shell= TYPE=Ethernet BOOTPROTO=dhcp NAME=enp0s8 DEVICE=enp0s8 ONBOOT=yes ``` - 修改 ==ifcfg-enp0s9== 檔案內容如下 ```shell= TYPE=Ethernet BOOTPROTO=static NAME=enp0s9 DEVICE=enp0s9 ONBOOT=yes IPADDR=10.1.1.1 NETMASK=255.255.255.0 ``` 設定檔欄位涵義可參考:[Interface Configuration File (CentOS)](https://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-networkscripts-interfaces.html) (英文) ### 3. 關閉防火牆服務 為簡化架設流程,避免防火牆擋住伺服器網路連線 :::warning !!關閉防火牆會讓伺服器沒有抵禦非法連線的能力!! 請儘量不要在機器有連上網際網路的情況下關閉防火牆 ::: - 關閉 ==firewalld== 服務 `$ sudo systemctl disable firewalld` `$ sudo systemctl stop firewalld` - 關閉 ==SELinux== 服務,修改 ==/etc/selinux/config== 檔案內容如下 ```shell= ... SELINUX=disabled #Here ... SELINUXTYPE=targeted ``` - 接著重啟 PXE 伺服器 `$ sudo reboot` - 確認 ==SELinux== 已經關閉 (Disabled) `$ getenforce` ### 4. 在 PXE 伺服器內安裝與設定 DHCP 服務、 FTP 服務、 TFTP 服務 **4.1** 首先安裝所需服務及工具 `$ sudo yum install dhcp tftp-server syslinux vsftpd xinetd` ,接著按照檔案相依性分別設定 DHCP 服務、 FTP 服務與 TFTP 服務 **4.2** **DHCP 服務**的設定 讓 PXE 客戶端使用網路開機後,能自動分配到IP位址,並得知 ==pxelinux.0== (PXE Bootloader) 檔案的網路位置 - 修改 ==/etc/dhcp/dhcpd.conf== 檔案內容如下 ```shell= subnet 10.1.1.0 netmask 255.255.255.0 { range 10.1.1.100 10.1.1.200; option routers 10.1.1.1; filename "pxelinux.0"; next-server 10.1.1.1; } ``` **4.3** **FTP 服務**的設定 FTP 服務負責把 kickstart 設定檔和映像檔內容提供給 PXE 客戶端 - 首先是 kickstart 設定檔的部分,編寫 ==/var/ftp/kickstart_centos7_1511.cfg== 檔案內容如下 - 針對*CentOS 6***需要**將 `xfs` **修改成** `ext4` ```shell= # version=DEVEL # Install OS instead of upgrade install # Keyboard layouts keyboard 'us' # Root password = "root" rootpw --iscrypted $6$cUZL21stZ2KFytWY$p7Kju/.wkeW/TSjGgvZQSFxBXqxOdqmB.l25CDcqqeqLbCpty6y1BVyfl2uK.IRFAnhEf1stNdUNPE1CoGs2H0 # Use network installation url --url="ftp://10.1.1.1/pub/centos7_1511" #7 #url --url="ftp://10.1.1.1/pub/centos6" #6 # System language lang en_US # Firewall configuration firewall --disabled # System authorization information auth --useshadow --passalgo=sha512 # Use graphical install(???) text firstboot --disable # SELinux configuration selinux --disabled # Reboot after installation reboot # System timezone timezone Asia/Taipei # System bootloader configuration bootloader --location=mbr # Clear the Master Boot Record zerombr # Partition clearing information clearpart --all --initlabel # Disk partitioning information part /boot --fstype="xfs" --size=1024 #7 #part /boot --fstype="ext4" --size=1024 #6 part swap --fstype="swap" --size=1024 part / --fstype="xfs" --grow --size=1 #7 #part / --fstype="ext4" --grow --size=1 #6 %packages #7 #%packages --nobase #6 #@base @core %end ``` - 映像檔的部分,先在 FTP 服務的 ==/var/ftp/pub/== 目錄下新增要掛載映像檔的資料夾 `$ mkdir /var/ftp/pub/centos7_1511` - 掛載映像檔到 ==/var/ftp/pub/centos7_1511/== 目錄下 - 先在虛擬機加入映像檔 (相當於在實體機放入安裝光碟) ![](https://i.imgur.com/2miVE29.png) - 取得映像檔的名稱 `$ lsblk` ![](https://i.imgur.com/qZV7xpD.png) Linux中映像檔是屬於區塊裝置 (Block device) 檔案,可在 ==/dev== 目錄下被找到。根據 ==lsblk== 的結果,在本例中映像檔的完整路徑及名稱為 ==/dev/sr0== - 掛載映像檔 `$ sudo mount -t auto /dev/sr0 /var/ftp/pub/centos7_1511` - 為了讓 PXE 伺服器每次啟動後,可以自動掛載映像檔到 FTP 服務的目錄下,新增掛載設定到 ==/etc/fstab== 檔案內容如下 ```shell= ... /dev/sr0 /var/ftp/pub/centos7_1511 iso9660 defaults 0 0 ... ``` ==fstab==欄位說明可參考:[Mounting File Systems Automatically with /etc/fstab (radhat)](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Introduction_To_System_Administration/s2-storage-mount-fstab.html) (英文) - 確認映像檔掛載的情況 (注意 MOUNTPOINT 欄位) `$ lsblk` ![](https://i.imgur.com/6iTIJge.png) - 完成後 ==/var/ftp/== 目錄示意圖 ![](https://i.imgur.com/XggrSMF.png) **4.4** **TFTP 服務**的設定 TFTP 服務負責提供 PXE Bootloader ==pxelinux.0== 、開機選項檔 ==default== 和 開機檔案 ==vmlinuz== 、 ==initrd.img== 給 PXE 客戶端使用。TFTP 服務是由 xinetd 服務管理,xinetd 只有當收到服務請求的時候才會將相應服務啟動,以減少系統資源占用 - 修改 ==/etc/xinetd.d/tftp== 檔案中 ==service tftp== 的 ==disable== 欄位如下 ```shell= service tftp { ... disable =no ... } ``` - 複製 ==pxelinux.0== 、 ==menu.c32== 、 ==vesamenu.c32== 這三個檔案到 TFTP 服務的 ==/var/lib/tftpboot/== 目錄下 `$ cp /usr/share/syslinux/pxelinux.0 /usr/share/syslinux/menu.c32 /usr/share/syslinux/vesamenu.c32 /var/lib/tftpboot/` - 建立用來放開機選項檔的資料夾 `$ sudo mkdir /var/lib/tftpboot/pxelinux.cfg` - 複製映像檔提供的開機選項檔 ==isolinux.cfg== 到 TFTP 服務的 ==/var/lib/tftpboot/pxelinux.cfg/== 目錄下,並調其整讀寫權限 `$ sudo cp /var/ftp/pub/centos7_1511/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default` `$ sudo chmod 644 /var/lib/tftpboot/pxelinux.cfg/default` - 修改 ==/var/lib/tftpboot/pxelinux.cfg/default== 檔案內容如下 (*for* **CentOS-7-x86_64-Minimal-1511.iso** & **CentOS-6.8-x86_64-minimal.iso**) ```shell= ... timeout 30 #改成等待3秒,以節省等待時間 (optional) ... label linux menu label ^Auto Install CentOS 7 menu default #新增 kernel vmlinuz #新增 append initrd=initrd.img ks=ftp://10.1.1.1/kickstart_centos7_1511.cfg #新增 ... label check menu label Test this ^media & install CentOS 7 #menu default #刪除 kernel vmlinuz append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet ... ``` - 建立用來放開機檔案 ==vmlinuz== (Linux Kernel執行檔) 和 ==initrd.img== (initial ramdisk) 的資料夾 `$ sudo mkdir /var/lib/tftpboot` - 複製開機檔案 ==vmlinuz== 和 ==initrd.img== 到 TFTP 服務的資料夾下 `$ cp /var/ftp/pub/centos7_1511/isolinux/vmlinuz /var/ftp/pub/centos7_1511/isolinux/initrd.img /var/lib/tftpboot/` - 完成後 ==/var/lib/tftpboot/== 目錄結構 ![](https://i.imgur.com/XWxRdo5.png) ### 5. 啟動所有 PXE 伺服器相關服務 - 啟動 **network 服務** `$ sudo systemctl enable network` `$ sudo systemctl start network` `$ sudo systemctl restart network` - 啟動 **DHCP 服務** `$ sudo systemctl enable dhcpd` `$ sudo systemctl start dhcpd` - 啟動 **TFTP 服務** `$ sudo systemctl enable xinetd` `$ sudo systemctl start xinetd` - 啟動 **FTP 服務** `$ sudo systemctl enable vsftpd` `$ sudo systemctl start vsftpd` ### 6. 在 virtualbox 調整 PXE 伺服器開機順序 - 將 PXE 伺服器關機 `$ sudo halt -p` - 重新指定開機順序為 1. 硬碟開機 - 配置參考圖 ![](https://i.imgur.com/oIZ9zvT.png) - 啟動 PXE 伺服器 - PXE 伺服器架設完成! ## 三. 建立 PXE 客戶端 - 配置一張網路卡,設定為內部網路 - 指定開機順序為 1. 硬碟開機 2. 網路開機 (即使用PXE) - 配置參考圖 ![](https://i.imgur.com/3Sfvy25.png) - 啟動虛擬機 - 然後它就會像隻小貓咪一樣安靜的把系統安裝好 - 安裝完成後使用==帳號:root== ==密碼:root==登入即可使用 CentOS 7 ![](https://i.imgur.com/gSq3Jpr.png) -------- *2017/05/04,已測試 CentOS 7 1511,流程沒有錯誤。 有任何問題請回報給[魏礼謙](https://www.facebook.com/profile.php?id=100002588260959),將持續更新。*
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up