
無人職守自動安裝linux作業系統
無人職守自動安裝linux作業系統
-
• -
• 1. 大規模部署案例 -
• 2. PXE 技術 -
• 3. Kickstart 技術 -
• 4. 配置安裝伺服器 -
• -
• 4.1 DHCP服務 -
• 4.2 TFTP 服務 -
• 4.3 NFS服務 -
• 5. 示例 -
• -
• 5.1 搭建server -
• -
• 1. 啟動dhcp並設為開機自啟 -
• 2. 設定並啟動tftp -
• 3. 將客戶端所需啟動檔案複製到TFTP伺服器 -
• 4. 建立Kickstart自動應答檔案 -
• 5. 部署NFS服務 -
• 6. 將系統光碟或ISO檔案透過NFS共享 -
• 5.2 客戶端 -
• -
• 1. 設定虛擬機器 -
• 2. 啟動安裝 -
• 6. 問題彙總 -
• -
• 1. 卡在dracut -
• 2. 卡在沒有選擇磁碟 -
• 3. 卡在DHCP分配地址 -
• 4. tftp open timeout -
• 5. 服務端缺少pxelinux.0 -
• 6. 服務端缺少指定核心的配置檔案 -
• 7. 提供ks.cfg檔案的服務宕機 -
• 8. 客戶機記憶體不夠
1. 大規模部署案例

這種無人職守的解決方案需要提前部署一臺包含DHCP、TFTP和NFS等伺服器的安裝伺服器。

-
• 客戶端首先需要在BIOS中設定透過網路啟動 -
• 當客戶端啟動後,會透過傳送廣播包的方式尋找DHCP伺服器 -
• 當找到DHCP伺服器,即可向該伺服器申請獲得包括IP地址在內的網路引數等,並透過DHCP獲得TFTP的位置 -
• 當客戶端獲得TFTP伺服器的地址後,即可從TFTP伺服器上將啟動檔案下載至本機記憶體並執行,最終實現無盤啟動的功能 -
• 我們可以在啟動檔案中設定Kickstart檔案的共享的位置,這樣客戶端啟動後,即可自動尋找Kickstart檔案實現無人職守安裝系統
2. PXE 技術
PXE
( preboot execute environment)是由Intel公司開發的基於C/S
(客戶端/伺服器)模式的一種技術,其核心功能讓客戶端透過網路從遠端伺服器下載啟動映象,從而實現網路啟動。整個過程中,客戶端要求伺服器分配IP地址,再用TFTP協議下載位於伺服器上的啟動映象到本機記憶體中並執行,由這個啟動檔案完成客戶端軟體的設定。-
1. pxe client
必須支援pxe使用者端功能,並且開機時選擇網路啟動,才能確保以網路的方式進入pxe啟動程式; -
2. pxe server
必須至少提供DHCP、TFTP、HTTPD(vsftpd 或 nfs)的服務,且還需滿足如下要求: -
• DHCP
伺服器除了必須滿足為pxe client分配ip地址之外,還需告知tftp所在的位置(即告訴pxelinux.0的檔案位置) -
• TFTP
伺服器則為pxe client 提供bootloader 及 kernel 等重要檔案下載服務 -
• 使用 httpd/vsftpd/nfs
伺服器提供pxe client所需程式及軟體來源(共享源)
Kickstart
技術3. Kickstart 技術
-
• 手動書寫(僅需要一個文字編輯工具即可) -
• 透過 system-config-kickstart
圖形工具 -
• 透過紅帽的安裝程式 Anaconda 自動生成
system-config-kickstart
圖形工具為主,介紹如何生成一份自動應答檔案,具體步驟如下注意該系統需要有桌面,否則無法啟動該圖形工具
system-config-kickstart
圖形工具,命令如下:yum install system-config-kickstart.noarch
安裝完成後,輸入system-config-kickstart
執行該工具

我們可以透過圖形介面進行系統基本設定、安裝方式管理、啟動方式配置、分割槽配置、網路配置、認證配置、防火牆設定、顯示配置、安裝包配置。除此之外,還可以編寫系統安裝前及安裝後所需執行的指令碼。
4. 配置安裝伺服器
4.1 DHCP服務
-
1. 安裝DHCP服務
[root@localhost ~]# yum install -y dhcp
-
2. 修改配置檔案其主要配置檔案為 /etc/dhcp/dhcpd.conf
,以下為簡單配置樣本:
[root@node-139 ~]# cat /etc/dhcp/dhcpd.conf## DHCP Server Configuration file.# see /usr/share/doc/dhcp*/dhcpd.conf.example# see dhcpd.conf(5) man pagesubnet 192.168.0.0 netmask 255.255.0.0 { interface "ens34"; range 192.168.17.202 192.168.17.240; option domain-name-servers 8.8.8.8; option routers 192.168.17.1; default-lease-time 600; max-lease-time 7200; next-server 192.168.17.139; filename "pxelinux.0";}
-
• subnet 指為哪個網段分配網路引數, -
• range設定為客戶端分配的IP地址池,這個可以分配客戶端分配從 192.168.17.201
到192.168.17.240
之間的IP地址。 -
• domain-name-servers設定為客戶端分配的DNS伺服器地址, -
• routers設定為客戶端分配的閘道器地址。 -
• 對網路啟動至關重要的引數是next-server和filename,從安裝部署流程可以看出,客戶端啟動計算機透過DHCP獲得IP地址後,還需要從TFTP下載啟動檔案,而next-server設定的即TFTP伺服器的地址,filename設定的是在該TFTP檔案伺服器上共享的啟動檔名稱,客戶端透過這兩個引數連線TFTP伺服器,並從中下載啟動檔案
可以複製/usr/share/doc/dhcp-4.2.5/dhcpd.conf.example
進行修改,或者手動編寫
4.2 TFTP 服務
-
1. 安裝TFTP服務
[root@localhost dhcp]# yum install -y tftp-server
-
2. 修改配置檔案預設的配置檔案為 /etc/xinetd.d/tftp
。該檔案中,disable
預設值為yes
,也就是說,該服務預設為停用狀態
,需要手動修改為no
來啟動服務。該配置檔案中server_args
的值定義了共享的目錄,也就是我們共享的檔案要存放的路徑。
service tftp{ socket_type = dgram protocol = udpwait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /var/lib/tftpbootdisable = yes per_source = 11 cps = 100 2 flags = IPv4}
4.3 NFS服務
Network File System
的簡寫,即網路檔案系統。NFS服務的特點是伺服器配置簡單,客戶端透過網路訪問NFS檔案系統就像訪問自己的本地磁碟一樣方便。這裡使用它作為CentOS系統檔案的共享服務平臺,當客戶端從網路啟動正式進入安裝介面後,還需要讀取CentOS光碟中的系統檔案,以完成最後的安裝。這些檔案就是透過NFS共享給網路使用者。linux預設安裝NFS系統,可以透過修改配置檔案提供共享檔案。-
1. 啟動服務
[root@localhost dhcp]# systemctl start nfs-server[root@localhost dhcp]# systemctl status nfs-server● nfs-server.service - NFS server and services Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled) Active: active (exited) since Mon 2023-12-25 22:17:18 CST; 2s ago Process: 78263 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi (code=exited, status=0/SUCCESS)
-
2. 修改配置檔案預設配置檔案為 /etc/exports
,該檔案的內容預設為空
[root@localhost dhcp]# cat /etc/exports/media 192.168.0.0/255.255.0.0(ro)
/media
目錄,後面的IP地址表示僅192.168.0.0
網路可以訪問該共享目錄,ro
表示客戶端訪問許可權為只讀。這裡共享映象還可以使用vsftpd
或者httpd
作為替代方案
5. 示例
|
|
|
|
|
|
|
|
|
|
|
5.1 搭建server
dhcp
,tftp
,nfs
,並透過Kickstart
技術生成自動應答的相關檔案1. 啟動dhcp並設為開機自啟
[root@node-139 ~]# systemctl start dhcpd[root@node-139 ~]# systemctl enable dhcpdCreated symlink from /etc/systemd/system/multi-user.target.wants/dhcpd.service to /usr/lib/systemd/system/dhcpd.service.
2. 設定並啟動tftp
[root@node-139 ~]# cat /etc/xinetd.d/tftp# default: off# description: The tftp server serves files using the trivial file transfer \# protocol. The tftp protocol is often used to boot diskless \# workstations, download configuration files to network-aware printers, \# and to start the installation process for some operating systems.service tftp{ socket_type = dgram protocol = udpwait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /var/lib/tftpbootdisable = no per_source = 11 cps = 100 2 flags = IPv4}[root@node-139 ~]# systemctl start tftp[root@node-139 ~]# systemctl status tftp● tftp.service - Tftp Server Loaded: loaded (/usr/lib/systemd/system/tftp.service; indirect; vendor preset: disabled) Active: active (running) since Mon 2023-12-25 23:44:38 CST; 3s ago Docs: man:in.tftpd Main PID: 85504 (in.tftpd) Tasks: 1 CGroup: /system.slice/tftp.service └─85504 /usr/sbin/in.tftpd -s /var/lib/tftpbootDec 25 23:44:38 node-139 systemd[1]: Started Tftp Server.
/var/lib/tftpboot
3. 將客戶端所需啟動檔案複製到TFTP伺服器
[root@node-139 ~]# yum install -y syslinux[root@node-139 ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
vmlinuz
、isolinux.cfg
和initrd.img
複製到共享路徑initrd.img檔案就是個ram disk的映像檔案。ram disk是標準核心檔案認識的裝置(/dev/ram0)檔案系統也是標準核心認識的檔案系統。可以參考 https://blog.csdn.net/u010230019/article/details/131450815isolinux.cfg啟動選單的配置檔案
[root@node-139 tftpboot]# cp /home/yurq/isolinux.cfg pexlinux.cfg/default[root@node-139 tftpboot]# chmod 644 pexlinux.cfg/default[root@node-139 tftpboot]# ll pexlinux.cfg/default-rw-r--r--. 1 root root 3032 Dec 25 23:59 pexlinux.cfg/default
[root@node-139 tftpboot]# cat pexlinux.cfg/defaultdefault linuxtimeout 600display boot.msgmenu title Welcome to CentOS7 by Yurqlabel linux menu label ^Install CentOS 7 menu default kernel vmlinuz append initrd=initrd.img ks=nfs:192.168.17.139:/ks/ks.cfglabel rescue menu label ^Rescue a CentOS system kernel vmlinuz append initrd=initrd.img rescuemenu end
default
指定預設引導方式,從配置檔案可以看出,有一種以label
開始的名稱為linux
的正常引導方式,另一種是名稱為rescue
的救援引導方式,而default
決定了預設採用哪種引導方式引導安裝程式。此外,kernel指定的是系統核心檔案,在上面的步驟中,我們已將該檔案複製到TFTP共享目錄中。如果沒有後面的ks
引數,至此,我們可以實現無盤啟動,後面的安裝步驟需要我們手動進行,設定ks
引數可以指定自動應答檔案的位置,從而實現無人職守自動安裝。本文中設定192.168.17.139
的NFS共享方式讀取Kickstart
檔案。[root@node-139 ~]# ll /var/lib/tftpboottotal 60480-rw-r--r--. 1 root root 55129656 Dec 25 23:56 initrd.img-rw-r--r--. 1 root root 26759 Dec 25 23:47 pxelinux.0drwxr-xr-x. 2 root root 21 Dec 26 23:08 pxelinux.cfg-rw-r--r--. 1 root root 6769256 Dec 25 23:56 vmlinuz
[root@node-139 tftpboot]# systemctl restart tftp[root@node-139 tftpboot]# systemctl stop firewalld
4. 建立Kickstart自動應答檔案
-
1. 基本設定 在這裡插入圖片描述 包括:預設語言,鍵盤,時區,root密碼(可選)
-
2. 設定安裝方法 在這裡插入圖片描述 配置安裝方式可以選擇全新安裝或者升級安裝,本文中為全新安裝,設定安裝過程中所需安裝檔案(Centos7 系統光碟中的內容)透過NFS讀取,這裡的NFS伺服器為192.168.17.139,共享目錄為/media
-
3. 引導設定 在這裡插入圖片描述 此處配置系統載入程式,安裝方式選擇全新安裝GRUB載入程式,GRUB引導密碼未設定,將系統載入程式安裝於MBR區域,核心引數未設定任何特殊引數
-
4. 分割槽設定 在這裡插入圖片描述 分割槽選擇移除所有的現有分割槽後重新分割槽,並初始化磁碟標籤
注意:透過圖形介面生成的Kickstart檔案無法使用LVM邏輯卷分割槽,需要使用LVM邏輯卷分割槽,則需要手動修改生成後的Kickstart檔案
/
和/boot
-
5. 網路設定 在這裡插入圖片描述 新增網路裝置
ens33
,並設定透過DHCP獲得網路引數 -
6. 認證設定 在這裡插入圖片描述 所有的使用者密碼都使用
SHA512
演算法加密
如果需要將本機加入活動目錄的化,可以修改LDAP引數加入活動目錄
-
7. SELinux和防火牆 在這裡插入圖片描述 SELinux和防火牆均被設定為啟用狀態,並設定防火牆開放HTTP和SSH服務
-
8. 顯示設定 在這裡插入圖片描述 這裡不勾選安裝圖形環境(可自行選擇)
-
9. 安裝包選擇 在這裡插入圖片描述 正常可以選擇,筆者這裡可能是版本問題沒有顯示內容
在這裡插入圖片描述 安裝軟體時根據自己實際需求進行選擇後來筆者構建本地源,不過可選內容較少,可能匯入的是mini.iso的原因
在這裡插入圖片描述 構建本地源,需要注意源名稱必須為
development
,因為這個是ks程式碼內固定讀取的:[development]name=centos cdrombaseurl=file:///media/gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7enabled=1
-
10. 安裝前執行指令碼 在這裡插入圖片描述 若沒有特殊需求,可以為空
-
11. 安裝後執行的指令碼 在這裡插入圖片描述 常用指令碼為建立YUM源,初始化使用者賬號,部署軟體服務等,如果沒有特殊需求,可以為空
/ks/
目錄中,取名為ks.cfg
[root@node-139 ~]# cat /ks/ks.cfg#platform=x86, AMD64, or Intel EM64T#version=DEVEL# Install OS instead of upgradeinstall# Keyboard layoutskeyboard 'us'# Root passwordrootpw --iscrypted $1$2ZdAsgIv$xBtWTquTEb5prUaMEgk.G/# System languagelang zh_CN# System authorization informationauth --useshadow --passalgo=sha512# Use graphical installgraphicalfirstboot --disable# SELinux configurationselinux --enforcing# Use NFS installation medianfs --server=192.168.17.139 --dir=/media# Firewall configurationfirewall --enabled --http --ssh# Network informationnetwork --bootproto=dhcp --device=ens33# Halt after installationhalt# System timezonetimezone Africa/Abidjan# System bootloader configurationbootloader --location=mbr --boot-drive=sda# Partition clearing informationclearpart --all --initlabel# Disk partitioning informationpart swap --fstype="swap" --size=1000part /boot --fstype="ext4" --size=200part / --fstype="ext4" --grow --size=1%post/usr/bin/hostname yurq%end%packages@core%end
注意:bootloader –location=mbr –boot-drive=sda 預設用圖形工具編寫完成沒有--boot-drive=sda
這個選項,所以需要手動加上否則會卡在anaconda的配置介面
5. 部署NFS服務
[root@node-139 ~]# cat /etc/exports/ks 192.168.0.0/255.255.0.0(ro)/media 192.168.0.0/255.255.0.0(ro)
[root@node-139 ~]# systemctl start nfs[root@node-139 ~]# systemctl enable nfs
6. 將系統光碟或ISO檔案透過NFS共享
/media
目錄下umount /dev/cdrommount /dev/cdrom /media
/media
目錄,[root@node-139 ~]# mount -o loop -t iso9660 /root/CentOS-7-x86_64-Minimal-2009.iso /mediamount: /dev/loop0 is write-protected, mounting read-only[root@node-139 ~]# ll /media/total 110-rw-r--r--. 2 root root 14 Oct 30 2020 CentOS_BuildTagdrwxr-xr-x. 3 root root 2048 Oct 27 2020 EFI-rw-rw-r--. 15 root root 227 Aug 30 2017 EULA-rw-rw-r--. 15 root root 18009 Dec 10 2015 GPLdrwxr-xr-x. 3 root root 2048 Oct 27 2020 imagesdrwxr-xr-x. 2 root root 2048 Nov 3 2020 isolinuxdrwxr-xr-x. 2 root root 2048 Oct 27 2020 LiveOSdrwxr-xr-x. 2 root root 73728 Nov 3 2020 Packagesdrwxr-xr-x. 2 root root 4096 Nov 3 2020 repodata-rw-rw-r--. 15 root root 1690 Dec 10 2015 RPM-GPG-KEY-CentOS-7-rw-rw-r--. 15 root root 1690 Dec 10 2015 RPM-GPG-KEY-CentOS-Testing-7-r--r--r--. 1 root root 2883 Nov 3 2020 TRANS.TBL
5.2 客戶端
1. 設定虛擬機器

由於筆者的伺服器是雙網絡卡,所以指定客戶端機器未僅主機模式,讀者可自行選擇,能讓DHCP分配到IP就可以了另外,雙網絡卡需要注意在DHCP設定時指定interface
2. 啟動安裝


由於映象是mini版本的,所以只有命令列介面

6. 問題彙總
1. 卡在dracut
-
• 不像已經存在的initramfs框架,dracut的框架嘗試有儘可能更少的硬編碼進入initramfs。initramfs在生命中有一個基本的目標:獲取已經掛載的rootfs,以致我們能夠過渡到真正的rootfs。這是所有驅動裝置的可用性。因此,取代指令碼硬編碼去做各種事情,dracut的 initramfs 依賴 udev 去建立符號連結到裝置節點,接著,當rootfs的裝置節點出現的時候,它被掛載和根切換到rootfs裝置。 這個有助於保持在initramfs裡要求的時間儘可能的少,以致一些事情,如5s鍾啟動,作為一個initramfs的存在結果不是不可能的。 -
• 在dracut中,大部分的initramfs生成器功能由一群生成模組提供,這些模組是被主要的dracut工具採購,來安裝特定的功能進入initramfs。他們存在於這些模組的子目錄。和使用由dracut-functions提供的功能去做他們的工作。 -
• dracut 作為新一代的 initramfs 系統,和前一代的initramfs系統的 mkinitrd 的不同點在於, dracut設計上就考慮到了映像尺寸的問題,儘量避免硬編碼,以提高生成的 cpio 映像載入記憶體的速度。實際上,由於initramfs的唯一作用就是掛載rootfs(因此不需要把一堆無用的比如 plymouth 等都裝進去),它主要依賴 udev 去獲取 rootfs 的裝置節點,一旦 rootfs 節點出現則立刻切換過去。按照官方維基的說法:5秒啟動不是夢。另外它採用了模組化的方式,使用者可自由在 %{_libdir}/dracut/modules.d 下建立他需要的特殊模組,可擴充套件性很強。最後它的使用方式和 mkinitrd 非常接近,遷移成本較低。
-
1. 映象未掛載
mount -o loop -t iso9660 /root/CentOS-7-x86_64-Minimal-2009.iso /media
-
2. 記憶體不足建議大於2G
2. 卡在沒有選擇磁碟
-
1. 卡在anaconda安裝介面的 沒有選擇磁碟
,需要手動在ks.cfg檔案指定磁碟名稱
bootloader --location=mbr --boot-drive=sda #注意
-
2. 在製作 ks.cfg
分割槽設定時,需要手動新增(ADD)至少/
和/boot
3. 卡在DHCP分配地址

-
1. 伺服器是否是雙網絡卡,是否指定了具體使用的網絡卡,在編輯 /etc/dhcp/dhcpd.conf
時,指定interface
```bash[root@node-139 ~]# cat /etc/dhcp/dhcpd.conf## DHCP Server Configuration file.# see /usr/share/doc/dhcp*/dhcpd.conf.example# see dhcpd.conf(5) man pagesubnet 192.168.0.0 netmask 255.255.0.0 { interface "ens34"; #網絡卡 range 192.168.17.202 192.168.17.240; option domain-name-servers 8.8.8.8; option routers 192.168.17.1; default-lease-time 600; max-lease-time 7200; next-server 192.168.17.139; filename "pxelinux.0";}
-
2. 客戶端機器如果是虛擬機器,指定網路模式 -
3. 提示 no dhcp or proxydhcp
,檢視伺服器的dhcpd
服務是否啟動
4. tftp open timeout

可以看到客戶端已經獲取到了IP,但是準備向tftp服務獲取pxelinux.0,但是無法連線tftp服務,這時現象是顯示開啟tftp超時,並且一直嘗試連線。
-
• 檢查tftp服務是否啟動。
5. 服務端缺少pxelinux.0
file not found | tftp error
可以看到客戶端已經獲取到了IP,並且tftp連線也沒有報錯。但是準備向tftp服務獲取pxelinux.0檔案失敗,提示檔案沒有發現。-
• 檢查/var/lib/tftpboot/目錄下是否有pxelinux.0檔案。
6. 服務端缺少指定核心的配置檔案
unable to locate configuration file
可以看到客戶端已經獲取到了IP,並且tftp連線也沒有報錯。但是準備向tftp服務獲取default檔案失敗,提示檔案沒有發現。-
• 檢查/var/lib/tftpboot/pxelinux.cfg/default是否存在。
7. 提供ks.cfg檔案的服務宕機

提示failed connect | failed to fetch kisckstart
到這一步,表示核心與偽檔案系統已經載入完畢,準備根據ks.cfg應答檔案進行自動安裝,但是提示連線服務,請求檔案失敗。
-
• 檢查web服務是否宕機,該檔案可能是由其他服務(ftp|nfs)提供,所以需要檢查對應的服務是否宕機。
8. 客戶機記憶體不夠

提示no space left on device
到這一步,表示核心與偽檔案系統已經載入完畢,沒有缺少什麼檔案,但是空間不夠。
-
• 檢查虛擬機器或者客戶機的記憶體是否足夠,記憶體設定至少2G。