Linux - 无人值守安装服务
# 需求分析
- 使用光盘镜像来安装 Linux 系统的方式; 坦白讲, 该方法适用于只安装少量 Linux 系统的情况, 如果生产环境中有数百台服务器都需安装系统, 这种方式就不太适合;
# 解决方案
- 使用 无人值守安装系统 完成数百台服务器的系统安装;
- 无人值守安装(Unattended Setup)指软件安装时无需任何用户干预, 直接按默认或通过应答文件设置安装, 这对于无特殊需求的用户或企业大批量部署安装操作系统及软件时非常方便;
# 简介
- 本节将介绍可以实现无人值守安装服务的 PXE+Kickstart 服务程序, 并手动安装部署 PXE + TFTP + FTP + DHCP + Kickstart 等服务程序, 从而搭建出一套可批量安装 Linux 系统的无人值守安装系统;
# 部署步骤
- 安装 DHCP、TFTP、SYSLinux、vsftpd、xinetd、KickStart 服务程序
- 挂载 ISO 文件
- 配置 DHCP、TFTP、SYSLinux、vsftpd、xinetd、KickStart
- 测试&上线
# 部署软件
- PXE (Preboot eXecute Environment, 预启动执行环境)
- TFTP (Trivial File Transfer Protocol, 简单文件传输协议)
- DHCP (Dynamic Host Configuration Protocol, 动态主机配置协议)
- FTP (FileTransferProtocol, 文件传输协议)
- Kickstart (RedHat红帽公司提供的应答文件)
简介
PXE(Preboot eXecute Environment,预启动执行环境)是由 Intel 公司开发的技术, 可以让计算机通过网络来启动操作系统(前提是计算机上安装的网卡支持 PXE 技术), 主要用于在无人机值守安装系统中引导客户端主机安装 Linux 操作系统;
Kickstart 是一种无人值守的安装方式, 其工作原理是预先把原本需要运维人员手工填写的参数保存成一个ks.cfg 文件, 当安装过程中需要填写参数时则自动匹配 Kickstart 生成的文件;
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是一种基于UDP协议在客户端和服务器之间进行简单文件传输的协议;TFTP提供不复杂、开销不大的文件传输服务,可将其当作FTP协议的简化版本;
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 是一种基于UDP协议且仅限于在局域网内部使用的网络协议;该协议用于自动管理局域网内主机的IP地址、子网掩码、网关地址及DNS地址等参数,可以有效地提升IP地址的利用率,提高配置效率,并降低管理与维护成本;
FTP(FileTransferProtocol, 文件传输协议)是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20、21号端口,其中端口20用于进行数据传输,端口21用于接受客户端发出的相关FTP命令与参数;
xinetd(eXtended InterNET services daemon,扩展的InterNET服务守护程序)常用来管理多种轻量级 Internet 服务;xinetd 提供类似于 inetd+tcp_wrapper 的功能;
# 配置文件 简介
- /var/lib/ftfpboot/vmlinuz: 可引导的压缩的内核;
- /var/lib/ftfpboot/initrd.img: 启动内存文件;
- /var/lib/ftfpboot/pxelinux.0: PXE引导程序;
- /var/lib/ftfpboot/pxelinux.cfg/default: 客户机启动安装时选择项;
安装&卸载
# 方式一:
# 一条命令安装所需服务
$ sudo yum install -y dhcp tftp-server vsftpd syslinux xinetd
# 方式二:
# 按照一步一步安装
# 安装dhcp
$ sudo yum install -y dhcp
# 安装tftp
$ sudo yum install -y tftp-server
# 安装vsftpd
$ sudo yum install -y vsftpd
# 安装syslinux
$ sudo yum install -y syslinux
# 安装xinetd
$ sudo yum install -y xinetd
DHCP
- 安装
# 安装
$ sudo yum install -y dhcp
- 卸载
# 卸载
$ sudo yum remove dhcp
TFTP
- 安装
# 安装
$ sudo yum install -y tftp-server
- 卸载
# 卸载
$ sudo yum remove tftp-server
vsftpd
- 安装
# 安装
$ sudo yum install -y vsftpd
- 卸载
# 卸载
$ sudo yum remove vsftpd
SYSLinux
- 安装
# 安装
$ sudo yum install -y syslinux
- 卸载
# 卸载
$ sudo yum remove syslinux
xinetd
- 安装
# 安装
$ sudo yum install -y xinetd
- 卸载
# 卸载
$ sudo yum remove xinetd
配置
网络配置
- 配置 vmware 网络
- 配置文件
ifcfg-ensxx
$ vi /etc/sysconfig/network-scripts/ifcfg-ens32
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static # 静态配置
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens32
UUID=53eb3239-d967-4079-9e11-28c7ccd12821
DEVICE=ens32
ONBOOT=yes # 开启网络配置
IPADDR=192.168.158.2 # IP地址
NETWASK=255.255.255.0 # 子网掩码
GATEWAY=192.168.158.1 # 网关
ISO挂载
挂载光盘镜像方式:在服务器使用wget下载iso到服务器上、下载iso文件,通过光驱挂载到服务器上;
将虚拟机的 CD/DVD 光盘选项设置为“使用 ISO 镜像文件”,并选择已经下载好的系统 镜像;
# 创建挂载点 /media/cdrom
$ mkdir -p /media/cdrom
# 挂载 ISO 到 /media/cdrom
$ mount /dev/cdrom /media/cdrom/
DHCP
DHCP配置文件中允许 BOOTP 引导程序协议, 旨在让局域网内暂时没有操作系统的主机也能获取静态 IP地址;在配置文件的最下面加载了引导驱动文件 pxelinux.0(这个文件会在下面的步骤中创建), 其目的是让客户端主机获取到 IP 地址后主动获取引导驱动文件;
$ vi /etc/dhcp/dhcpd.conf
allow booting;
allow bootp;
ddns-update-style interim;
ignore client-updates;
subnet 192.168.158.0 netmask 255.255.255.0 {
option subnet-mask 255.255.255.0;
option domain-name-servers 192.168.158.2;
range dynamic-bootp 192.168.158.100 192.168.158.200;
default-lease-time 21600;
max-lease-time 43200;
next-server 192.168.158.2;
filename "pxelinux.0";
}
在确认 DHCP 服务程序的参数都填写正确后,重新启动该服务程序,并将其添加到开机启动 项中;这样在设备下一次重启之后,在无须人工干预的情况下,自动为客户端主机安装系统;
$ systemctl restart dhcpd
$ systemctl enable dhcpd
TFTP
vsftpd 是一款功能丰富的文件传输服务程序,允许多种认证方式来进行访问认证;但是,当前的客户端主机没有安装操作系统,无法进行登录认证;而 TFTP 作为一种基于 UDP 协议的简单文件传输协议,不需要进行用户认证即可获取到所需的文件资源;配置 TFTP 服务程序,为客户端主机提供引导及驱动文件;当客户端主机有了基本的驱动程序之后,再通过 vsftpd 服务程序将完整的光盘镜像文件传输过去;
TFTP 是一种非常精简的文件传输服务程序, 它的运行和关闭是由 xinetd 网络守护进程服务来管理的;xinetd 服务程序会同时监听系统的多个端口, 然后根据用户请求的端口号调取相应的服务程序来响应用户的请求;
$ vi /etc/xinetd.d/tftp
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot
disable = no # 将 YES 改为 NO
per_source = 11
cps = 100 2
flags = IPv4
}
$ systemctl restart xinetd
$ systemctl enable xinetd
TFTP 服务程序默认使用的是 UDP 协议, 占用的端口号为 69, 所以在生产环境中还需要在 firewalld 防火墙管理工具中写入使其永久生效的允许策略, 以便让客户端主机顺利获取到引导文件;
# 添加 TFTP 端口
$ firewall-cmd --permanent --add-port=69/udp
# 重启防火墙
$ firewall-cmd --reload
SYSLinux
SYSLinux 是一个用于提供引导加载的服务程序;与其说 SYSLinux 是一个服务程序, 不如说更需要里面的引导文件, 在安装好 SYSLinux 服务程序软件包后, /usr/share/syslinux 目录中会出现很多引导文件;
将 SYSLinux 提供的引导文件复制到 TFTP 服务程序的默认目录中,也就是文件 pxelinux.0,这样客户端主机就能够顺利地获取到引导文件了;
$ cd /var/lib/tftpboot
# 复制 pxelinux.0 文件到 /var/lib/tftpboot
$ cp /usr/share/syslinux/pxelinux.0 .
# 需进行 ISO 挂载, 否则出现 `No such file or directory`
$ cp /media/cdrom/images/pxeboot/{vmlinuz,initrd.img} .
$ cp /media/cdrom/isolinux/{vesamenu.c32,boot.msg} .
在 TFTP 服务程序的目录中新建 pxelinux.cfg 目录;将系统光盘中的开机选项菜单复制到该目录中,并命名为 default, 这个 default 文件就是开机时的选项菜单;
$ mkdir /var/lib/tftpboot/pxelinux.cfg
$ cp /media/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
Centos 镜像默认的开机菜单中有两个选项,安装系统 |安装介质检验
;采用无人值守的方式安装系统,所以编辑 default 文件,把第 1 行的 default 参数 修改为 linux,这样系统在开机时就会默认执行那个名称为 linux 的选项;对应的 linux 选项 大约在 64 行,将默认的光盘镜像安装方式修改成 FTP 文件传输方式,并指定好光盘镜像的获取网址以及 Kickstart 应答文件的获取路径;
$ vi /var/lib/tftpboot/pxelinux.cfg/default
1 default linux # 将 这个修改为 default linux
64 append initrd=initrd.img inst.stage2=ftp://192.168.158.2 ks=ftp://192.168.158.2/pub/ks.cfg quiet # 镜像安装方式改成FTP传输方式
vsftpd
参考文档:https://www.cnblogs.com/HOsystem/p/16629572.html
无人值守安装系统的服务中,光盘镜像是通过 FTP 协议传输的,因此要用到 vsftpd 服务程序;当然,也可以使用 httpd 服务程序来提供 Web 网站访问的方式,只要能确保将光盘镜像顺利传输给客户端主机即可;
打算使用 Web 网站服务来提供光盘镜像,一定记得将上面配置文件中的光盘镜像获取网址和 Kickstart 应答文件获取网址 修改一下;
在确认系统光盘镜像已经正常挂载到/media/cdrom 目录后,把目录中的光盘镜像文件全部复制到 vsftpd 服务程序的工作目录中;
$ cp -r /media/cdrom/* /var/ftp
$ firewall-cmd --permanent --add-service=ftp
$ firewall-cmd --reload
$ setsebool -P ftpd_connect_all_unreserved=on
# 开启vsftpd服务
$ systemctl start vsftpd
# 加入vsftpd至开机启动项
$ systemctl enable vsftpd
KickStart
Kickstart 其实并不是一个服务程序,而是一个应答文件;Kickstart 应答文件中包含了系统安装过程中需要使用的选项和参数 信息,系统可以自动调取这个应答文件的内容,从而彻底实现了无人值守安装系统;
在 root 管理员的家目录中有一个名为 anaconda-ks.cfg 的文件,它就是应答文件;下面将这个文件复制到 vsftpd 服务程序的工作目 录中(在开机选项菜单的配置文件中已经定义了该文件的获取路径,也就是 vsftpd 服务程序 数据目录中的 pub 子目录中);使用 chmod 命令设置该文件的权限,确保所有人都有可读的权 限,以保证客户端主机可以顺利获取到应答文件及里面的内容;
$ cp ~/anaconda-ks.cfg /var/ftp/pub/ks.cfg
$ chmod +r /var/ftp/pub/ks.cfg
Kickstart 应答文件并没有想象中的那么复杂,它总共只有 46 行左右的参数和注释内容, 完全可以通过参数的名称及介绍来快速了解每个参数的作用;
把第 6 行的光盘镜像安装方式修改成 FTP 协议,仔细填写好 FTP 服务器的 IP 地址,并 用本地浏览器尝试打开下检查有没有报错。然后把第 21 行的时区修改成上海(Asia/Shanghai),再把 29 行的磁盘选项设置为清空所有磁盘内容并初始化磁盘,最后再把
$ vi /var/ftp/pub/ks.cfg
# Use CDROM installation media
url --url=ftp://192.168.158.2 # 在Use CDROM 下添加 url
# System timezone
timezone Asia/Shanghai --isUtc --nontp
# Partition clearing information
clearpart --all --initlabel
reboot
如果觉得系统默认自带的应答文件参数较少,不能满足生产环境的需求,则可以通过 Yum软件仓库来安装 system-config-kickstart 软件包;这是一款图形化的 Kickstart 应答文件生成工具,可以根据自己的需求生成自定义的应答文件,然后将生成的文件放到/var/ftp/pub 目录中并将名字修改为 ks.cfg 即可。
问题汇总
问题一:
问题描述:
在配置 dhcpd.conf
后,使用 systemctl restart dhcpd
时,出现以下错误:
Sep 23 00:29:39 localhost.localdomain dhcpd[9744]: Please report for this software via the CentOS Bugs Database:
Sep 23 00:29:39 localhost.localdomain dhcpd[9744]: http://bugs.centos.org/
Sep 23 00:29:39 localhost.localdomain dhcpd[9744]: nt
Sep 23 00:29:39 localhost.localdomain dhcpd[9744]: exiting.
Sep 23 00:29:39 localhost.localdomain systemd[1]: dhcpd.service: main process exited, code=exited, status=1/FAILUR
Sep 23 00:29:39 localhost.localdomain systemd[1]: Failed to start DHCPv4 Server Daemon.
-- Subject: Unit dhcpd.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit dhcpd.service has failed.
--
-- The result is failed.
Sep 23 00:29:39 localhost.localdomain systemd[1]: Unit dhcpd.service entered failed state.
Sep 23 00:29:39 localhost.localdomain systemd[1]: dhcpd.service failed.
Sep 23 00:29:39 localhost.localdomain polkitd[8602]: Unregistered Authentication Agent for unix-process:9738:3132
问题原因:
虚拟机网卡 ensxxx
和dhcpd.conf的网段不一致;总的来说,就是 dhcpd.conf
配置中出现错误;
问题解决:
重新配置 dhcpd.conf
文件;
$ vi /etc/dhcp/dhcpd.conf
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.example
# see dhcpd.conf(5) man page
#
allow booting; # 允许 booting 模式
allow bootp;
ddns-update-style interim;
ignore client-updates;
# subnet: 子网IP段
# netmask: 子网掩码
# subnet-mask: 子网掩码
# option domain-name-servers: 无人值守系统IP地址
# range dynamic-bootp: 客户端主机可获取的IP范围
# default-lease-time:
# max-lease-time:
# next-server:
# filename:
subnet 192.168.158.0 netmask 255.255.255.0 {
option subnet-mask 255.255.255.0;
option domain-name-servers 192.168.158.2;
range dynamic-bootp 192.168.158.100 192.168.158.200;
default-lease-time 21600;
max-lease-time 43200;
next-server 192.168.158.2;
filename "pxelinux.0";
}
问题二:
问题描述:
在 进行无人值守安装时,启动系统时,出现PXE-E32: TFTP open timeout
错误;
问题原因:
- 原因一:
TFTP配置文件错误,将disable = yes
改为 disable = no
;
- 原因二:
xinetd 服务未安装或未开启
- 原因三:
防火墙未放行ftp服务
问题解决:
- 原因一解决:修改TFTP配置文件
$ vi /etc/xinetd.d/tftp
disable = no
- 原因二解决:安装xinetd或开启xinetd
$ yum install -y xinetd
$ systemctl start xinetd
- 原因三解决:放行ftp服务
$ firewall-cmd --permanent --add-service=ftp
$ firewall-cmd --reload
$ setsebool -P ftpd_connect_all_unreserved=on
问题三:
问题描述:
在 进行无人值守安装时,启动系统时,出现以下错误
Warning: /dev/root does not exist
Generaing "/run/initramfs/rdsosreport.txt"
Entering emergency mode. Exit the shell to continue
Type "journalctl" to view system logs.
You might want to save "/run/initramfs/rdsosreport.txt" to a USB stick or /boot
after moounting them and attach it to a bug report.
问题原因:
default
文件中,append行没设置正确;
问题解决:
重新配置 default文件;
问题四:
问题描述:
在 进行无人值守安装时,启动系统时,出现以下错误:
PXE-E51: No DHCP or proxyDHCP offers were received.
PXE-M0F: Exiting Intel PXE ROM.
Operating System not found
问题原因:
dhcp服务未配置正确
问题解决:
重新配置 dhcpd.conf
文件;
$ vi /etc/dhcp/dhcpd.conf
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.example
# see dhcpd.conf(5) man page
#
allow booting; # 允许 booting 模式
allow bootp;
ddns-update-style interim;
ignore client-updates;
# subnet: 子网IP段
# netmask: 子网掩码
# subnet-mask: 子网掩码
# option domain-name-servers: 无人值守系统IP地址
# range dynamic-bootp: 客户端主机可获取的IP范围
# default-lease-time:
# max-lease-time:
# next-server:
# filename:
subnet 192.168.158.0 netmask 255.255.255.0 {
option subnet-mask 255.255.255.0;
option domain-name-servers 192.168.158.2;
range dynamic-bootp 192.168.158.100 192.168.158.200;
default-lease-time 21600;
max-lease-time 43200;
next-server 192.168.158.2;
filename "pxelinux.0";
}
# 重启DHCP服务
$ systemctl restart dhcpd