无人职守自动安装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. 大规模部署案例
当组织有服务器需要部署linux系统时,需要通过网络方式安装并结合自动应答文件,实现无人职守自动安装部署操作系统。这种方式需要我们至少配置一台服务器,所有需要安装系统的客户端通过网络的方式连接服务器端启动安装程序,再根据服务器中存放的自动应答文件实现大规模自动安装部署系统。整个环境的拓扑结构:
这种无人职守的解决方案需要提前部署一台包含DHCP、TFTP和NFS等服务器的安装服务器。
安装部署流程:
- 客户端首先需要在BIOS中设置通过网络启动
- 当客户端启动后,会通过发送广播包的方式寻找DHCP服务器
- 当找到DHCP服务器,即可向该服务器申请获得包括IP地址在内的网络参数等,并通过DHCP获得TFTP的位置
- 当客户端获得TFTP服务器的地址后,即可从TFTP服务器上将启动文件下载至本机内存并运行,最终实现无盘启动的功能
- 我们可以在启动文件中设置Kickstart文件的共享的位置,这样客户端启动后,即可自动寻找Kickstart文件实现无人职守安装系统
注意:Kickstart文件需要事先通过网络共享,在Kickstart文件中描述了如何安装设置操作系统、运行部署脚本等
2. PXE 技术
PXE
( preboot execute environment)是由Intel公司开发的基于C/S
(客户端/服务器)模式的一种技术,其核心功能让客户端通过网络从远端服务器下载启动镜像,从而实现网络启动。整个过程中,客户端要求服务器分配IP地址,再用TFTP协议下载位于服务器上的启动镜像到本机内存中并执行,由这个启动文件完成客户端软件的设置。
pxe client
必须支持pxe用户端功能,并且开机时选择网络启动,才能确保以网络的方式进入pxe启动程序;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 技术
Kickstart 安装是目前主要的一种无人职守自动部署安装操作系统的方式。这种技术的核心是自动应答文件(Kickstart文件),即将本来在安装过程中需要我们手动设置的语言、密码和网络参数等,通过读取自动应答文件实现自动设置。所以,我们需要事先将对操作系统的设置写入自动应答文件,开始安装操作系统时,指定安装程序读取自动应答文件实现自动安装及部署操作系统。
Kickstart文件可以通过三种方式生成:
- 手动书写(仅需要一个文本编辑工具即可)
- 通过
system-config-kickstart
图形工具 - 通过红帽的安装程序 Anaconda 自动生成
本文以system-config-kickstart
图形工具为主,介绍如何生成一份自动应答文件,具体步骤如下
注意该系统需要有桌面,否则无法启动该图形工具
首先安装system-config-kickstart
图形工具,命令如下:
yum install system-config-kickstart.noarch
安装完成后,输入system-config-kickstart
运行该工具
我们可以通过图形界面进行系统基本设置、安装方式管理、启动方式配置、分区配置、网络配置、认证配置、防火墙设置、显示配置、安装包配置。除此之外,还可以编写系统安装前及安装后所需运行的脚本。
4. 配置安装服务器
最终要实现无人职守自动安装部署操作系统,需要提前定制安装服务器,其中包括:DHCP、TFTP及NFS服务。
4.1 DHCP服务
DHCP服务器主要实现在企业内部网络为客户端分配IP地址等网络参数。在我们无人职守环境中,当客户端选择从网络启动后,就会通过发送广播数据包的形式寻找DHCP服务器,从DHCP获得IP地址等参数后才可以通过TFTP共享读取启动文件,简单步骤如下:
- 安装DHCP服务
[root@localhost ~]# yum install -y dhcp
- 修改配置文件
其主要配置文件为/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 page
subnet 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 服务
TFTP服务器为客户端提供一种简单的文件共享,它不具备FTP那样丰富的功能。由于其简单的设计,TFTP非常适用于传输小且简单的PXE启动文件。
- 安装TFTP服务
[root@localhost dhcp]# yum install -y tftp-server
- 修改配置文件
默认的配置文件为/etc/xinetd.d/tftp
。该文件中,disable
默认值为yes
,也就是说,该服务默认为禁用状态
,需要手动修改为no
来启动服务。该配置文件中server_args
的值定义了共享的目录,也就是我们共享的文件要存放的路径。
service tftp
{socket_type = dgramprotocol = udpwait = yesuser = rootserver = /usr/sbin/in.tftpdserver_args = -s /var/lib/tftpbootdisable = yesper_source = 11cps = 100 2flags = IPv4
}
4.3 NFS服务
NFS是Network File System
的简写,即网络文件系统。NFS服务的特点是服务器配置简单,客户端通过网络访问NFS文件系统就像访问自己的本地磁盘一样方便。这里使用它作为CentOS系统文件的共享服务平台,当客户端从网络启动正式进入安装界面后,还需要读取CentOS光盘中的系统文件,以完成最后的安装。这些文件就是通过NFS共享给网络用户。linux默认安装NFS系统,可以通过修改配置文件提供共享文件。
- 启动服务
[root@localhost dhcp]# systemctl start nfs-server
[root@localhost dhcp]# systemctl status nfs-server
● nfs-server.service - NFS server and servicesLoaded: 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 agoProcess: 78263 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi (code=exited, status=0/SUCCESS)
- 修改配置文件
默认配置文件为/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. 示例
我们尝试搭建一个自动化安装部署操作系统的模拟案例,使用的操作系统及安装系统均为Centos7。
服务器 | IP | 安装服务 |
---|---|---|
server | 192.168.17.139 | dhcp,tftp,nfs |
client1 | 192.168.17.201(计划) | |
client2 | 192.168.17.202(计划) |
5.1 搭建server
在前文中,我们在server已经安装了dhcp
,tftp
,nfs
,并通过Kickstart
技术生成自动应答的相关文件
1. 启动dhcp并设为开机自启
[root@node-139 ~]# systemctl start dhcpd
[root@node-139 ~]# systemctl enable dhcpd
Created 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 = dgramprotocol = udpwait = yesuser = rootserver = /usr/sbin/in.tftpdserver_args = -s /var/lib/tftpbootdisable = noper_source = 11cps = 100 2flags = IPv4
}
[root@node-139 ~]# systemctl start tftp
[root@node-139 ~]# systemctl status tftp
● tftp.service - Tftp ServerLoaded: loaded (/usr/lib/systemd/system/tftp.service; indirect; vendor preset: disabled)Active: active (running) since Mon 2023-12-25 23:44:38 CST; 3s agoDocs: man:in.tftpdMain PID: 85504 (in.tftpd)Tasks: 1CGroup: /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/131450815
isolinux.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
修改启动配置文件default(isolinux.cfg)
[root@node-139 tftpboot]# cat pexlinux.cfg/default
default linux
timeout 600display boot.msgmenu title Welcome to CentOS7 by Yurqlabel linuxmenu label ^Install CentOS 7menu defaultkernel vmlinuzappend initrd=initrd.img ks=nfs:192.168.17.139:/ks/ks.cfglabel rescuemenu label ^Rescue a CentOS systemkernel vmlinuzappend 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/tftpboot
total 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.0
drwxr-xr-x. 2 root root 21 Dec 26 23:08 pxelinux.cfg
-rw-r--r--. 1 root root 6769256 Dec 25 23:56 vmlinuz
重启TFTP服务,并关闭防火墙
[root@node-139 tftpboot]# systemctl restart tftp
[root@node-139 tftpboot]# systemctl stop firewalld
4. 创建Kickstart自动应答文件
-
基本设置
包括:默认语言,键盘,时区,root密码(可选) -
设置安装方法
配置安装方式可以选择全新安装或者升级安装,本文中为全新安装,设置安装过程中所需安装文件(Centos7 系统光盘中的内容)通过NFS读取,这里的NFS服务器为192.168.17.139,共享目录为/media -
引导设置
此处配置系统引导程序,安装方式选择全新安装GRUB引导程序,GRUB引导密码未设置,将系统引导程序安装于MBR区域,内核参数未设置任何特殊参数 -
分区设置
分区选择移除所有的现有分区后重新分区,并初始化磁盘标签
注意:通过图形界面生成的Kickstart文件无法使用LVM逻辑卷分区,需要使用LVM逻辑卷分区,则需要手动修改生成后的Kickstart文件
这里需要手动添加(ADD)至少/
和/boot
- 网络设置
添加网络设备ens33
,并设置通过DHCP获得网络参数 - 认证设置
所有的用户密码都使用SHA512
算法加密
如果需要将本机加入活动目录的化,可以修改LDAP参数加入活动目录
-
SELinux和防火墙
SELinux和防火墙均被设置为激活状态,并设置防火墙开放HTTP和SSH服务 -
显示设置
这里不勾选安装图形环境(可自行选择) -
安装包选择
正常可以选择,笔者这里可能是版本问题没有显示内容
安装软件时根据自己实际需求进行选择后来笔者构建本地源,不过可选内容较少,可能导入的是mini.iso的原因
构建本地源,需要注意源名称必须为development
,因为这个是ks代码内固定读取的:[development] name=centos cdrom baseurl=file:///media/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 enabled=1
-
安装前执行脚本
若没有特殊需求,可以为空 -
安装后运行的脚本
常用脚本为创建YUM源,初始化用户账号,部署软件服务等,如果没有特殊需求,可以为空
完成所有设置后,通过File菜单选择Save,即可保存生成Kickstart文件,本文中将其保存至/ks/
目录中,取名为ks.cfg
[root@node-139 ~]# cat /ks/ks.cfg
#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard 'us'
# Root password
rootpw --iscrypted $1$2ZdAsgIv$xBtWTquTEb5prUaMEgk.G/
# System language
lang zh_CN
# System authorization information
auth --useshadow --passalgo=sha512
# Use graphical install
graphical
firstboot --disable
# SELinux configuration
selinux --enforcing# Use NFS installation media
nfs --server=192.168.17.139 --dir=/media# Firewall configuration
firewall --enabled --http --ssh
# Network information
network --bootproto=dhcp --device=ens33
# Halt after installation
halt
# System timezone
timezone Africa/Abidjan
# System bootloader configuration
bootloader --location=mbr --boot-drive=sda
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part swap --fstype="swap" --size=1000
part /boot --fstype="ext4" --size=200
part / --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服务
修改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)
启动NFS并设置为开机自启
[root@node-139 ~]# systemctl start nfs
[root@node-139 ~]# systemctl enable nfs
6. 将系统光盘或ISO文件通过NFS共享
如果有光盘或光驱可以通过mount的方式将光盘直接挂载在/media
目录下
umount /dev/cdrom
mount /dev/cdrom /media
如果没有光盘,仅有ISO镜像文件,亦可以将ISO镜像文件挂载至/media
目录,
[root@node-139 ~]# mount -o loop -t iso9660 /root/CentOS-7-x86_64-Minimal-2009.iso /media
mount: /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_BuildTag
drwxr-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 GPL
drwxr-xr-x. 3 root root 2048 Oct 27 2020 images
drwxr-xr-x. 2 root root 2048 Nov 3 2020 isolinux
drwxr-xr-x. 2 root root 2048 Oct 27 2020 LiveOS
drwxr-xr-x. 2 root root 73728 Nov 3 2020 Packages
drwxr-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 客户端
正常来说,在所有客户端主机的BIOS中,将第一启动方式设置为PXE网络启动,或通过类似于开机按F12键这样的快捷方式设置启动方式。不同型号的主机设置网络启动的方式不同,用户可自行选择。
本文中使用虚拟机模拟真实场景,所以还需要设置虚拟机
1. 设置虚拟机
由于笔者的服务器是双网卡,所以指定客户端机器未仅主机模式,读者可自行选择,能让DHCP分配到IP就可以了
另外,双网卡需要注意在DHCP设置时指定interface
2. 启动安装
由于镜像是mini版本的,所以只有命令行界面
6. 问题汇总
1. 卡在dracut
dracut 是一个事件驱动的 initramfs 基础设施。dracut(工具)被用来通过拷贝工具和文件,从一个已经安装的系统创建一个 initramfs 镜像,并将镜像与dracut框架结合在一起。通常发现在 /usr/lib/dracut/modules.d/.
- 不像已经存在的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 非常接近,迁移成本较低。
dracut 用于制作initrd启动镜像文件, dracut-network会为镜像内添加nfs等网络支持.
- 镜像未挂载
mount -o loop -t iso9660 /root/CentOS-7-x86_64-Minimal-2009.iso /media
- 内存不足
建议大于2G
2. 卡在没有选择磁盘
- 卡在anaconda安装界面的
没有选择磁盘
,需要手动在ks.cfg文件指定磁盘名称
bootloader --location=mbr --boot-drive=sda #注意
- 在制作
ks.cfg
分区设置时,需要手动添加(ADD)至少/
和/boot
3. 卡在DHCP分配地址
这里需要注意:
- 服务器是否是双网卡,是否指定了具体使用的网卡,在编辑
/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 page
subnet 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";
}
- 客户端机器如果是虚拟机,指定网络模式
- 提示
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。