前言:
正常安装系统的话使用u盘一个一个安装会非常慢,所以批量安装的技术就出来了。
一、 概念
- PXE (Preboot eXecute Environment,预启动执行环境)是由 Intel 公司开发的技术,可以让计算机通过网络来启动操作系统(前提是计算机上安装的网卡支持 PXE 技术)主 要用于在无人机值守安装系统中引导客户端主机安装 Linux 操作系统。
- Kickstart 是一种无 人值守的安装方式,其工作原理是预先把原本需要运维人员手工填写的参数保存成一个 ks.cfg 文件,当安装过程中需要填写参数时则自动匹配 Kickstart 生成的文件。所以只要Kickstart 文件包含了安装过程中需要人工填写的所有参数,那么从理论上来讲完全不需要 运维人员的干预,就可以自动完成安装工作。
二、 实现方式
PXE服务端涉及到的软件有: dhcp,tftp-server,vsftpd,syslinux
- dhcp 为客户端网卡提供地址,并返回pxe(pxelinux.0 引导程序文件),指定tftp服务器地址
- tftp-server 为客户端提供 驱动程序(操作系统镜像文件),引导程序,内核程序,开机执行配置文件 下载。客户端使用网卡作为tftp的客户端进行下载
- vsftpd 将光盘安装介质传输给客户机,并使用Kickstart应答文件进行配置客户机(不用配置账号,应该是使用匿名账号进行传输 )
- syslinux 提供 pxelinux.0 引导程序 文件
具体实现如下:
- 网卡需要查找相关的dhcp服务器(获取地址时间)
- 找到后dhcp服务器提供ip地址,和引导程序(boot loader)的地址 还提供给客户机TFTPserver地址(dhcp本身不提供tftp服务)
- 网卡使用tftp客户端吧引导程序加载到内存中来
- bios执行引导程序
- 引导程序会去TFTP去查找配置文件
- 根据配置文件去引导安装系统
- 系统安装过程
三、 实验开始
这里我使用“VMware Workstation”作为实验环境。
客户机只需要和PXE服务端在一个物理网络就是,其他不用配置,下面主要是配置PXE服务端
1. 关闭虚拟机的DHCP功能,并记录下IP范围和网关地址,为后面配置静态地址上网使用。(如果是真实的生产环境,这步可以跳过)
这里我选择的网络模式是NAT
a) 关闭DHCP功能
编辑-- > 虚拟网络编辑器
b) 记录ip范围和网关地址
编辑-- > 虚拟网络编辑器 --> NAT设置
c) 打开虚拟机配置静态地址
tip:根据自己的情况配置
cd /etc/sysconfig/network-scripts/
vi ifcfg-ens33
重启一下网络
systemctl restart network
测试一下是否联通外网。
可以连通外网,接下来的操作就可以使用xshell来操作了。
2. 下载所需的软件
[root@localhost ~]# yum -y install tftp tftp-server dhcp syslinux vsftpd
3. 服务配置文件修改
3.1. tftp配置
[root@localhost ~]# 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 = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot tftp 默认 / 目录
disable = no # 将yes修改为no 启用tftp
per_source = 11
cps = 100 2
flags = IPv4
}
启动tftp-server服务
[root@localhost ~]# systemctl enable tftp --now
Created symlink from /etc/systemd/system/sockets.target.wants/tftp.socket to /usr/lib/systemd/system/tftp.socket.
关闭防火墙和selinux
[root@localhost ~]#systemctl disable firewalld --now
[root@localhost ~]#setenforce 0
[root@localhost ~]#sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
3.2. dhcp服务配置
[root@localhost ~]# cat /etc/dhcp/dhcpd.conf
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.example
# see dhcpd.conf(5) man page
ddns-update-style interim; # 支持DNS动态更新
ignore client-updates; # 忽略客户端更新DNS记录
subnet 192.168.92.0 netmask 255.255.255.0 {
option subnet-mask 255.255.255.0; # 客户端地址掩码
option domain-name-servers 192.168.92.2; # 客户端dns地址
option routers 192.168.92.2; # 客户端网关地址
range dynamic-bootp 192.168.92.100 192.168.92.200; # 客户端ip地址池
default-lease-time 21600; # 默认租约
max-lease-time 43200; # 最大租约时间
next-server 192.168.92.10; # tftp地址
filename "pxelinux.0"; # 引导程序文件
}
启动dhcp服务
[root@localhost ~]# systemctl enable dhcpd --now
Created symlink from /etc/systemd/system/multi-user.target.wants/dhcpd.service to /usr/lib/systemd/system/dhcpd.service.
3.3. vsftpd 服务配置
只需启动即可,默认 / 目录在 /var/ftp/
[root@localhost ~]# systemctl enable vsftpd --now
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
4. 文件准备
4.1. 将pxe
引导程序放到 tftp / 目录
pxe 引导文件由 syslinux 提供
[root@localhost ~]# rpm -ql syslinux | grep pxelinux.0
/usr/share/syslinux/gpxelinux.0
/usr/share/syslinux/pxelinux.0
[root@localhost ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
4.2. 将内核文件放到 tftp / 目录下
1) 内核程序在 光盘镜像中,需要使用的话需要将光盘镜像挂载到 对应目录。
[root@localhost ~]# ll /dev/sr0
brw-rw----. 1 root cdrom 11, 0 May 8 20:38 /dev/sr0
[root@localhost ~]# mount /dev/sr0 /mnt
mount: /dev/sr0 is write-protected, mounting read-only
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 900M 0 900M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.6M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda2 20G 1.6G 19G 8% /
/dev/sda1 197M 120M 77M 61% /boot
tmpfs 182M 0 182M 0% /run/user/0
/dev/sr0 4.4G 4.4G 0 100% /mnt
2) 将vmlinuz
内核程序放到 tftp / 目录下
[root@localhost ~]# cp /mnt/isolinux/vmlinuz /var/lib/tftpboot/
4.3. 将initrd.img
文件(操作系统镜像)放到 tftp / 目录下
[root@localhost ~]# cp /mnt/isolinux/initrd.img /var/lib/tftpboot/
4.4. 将开机执行配置文件放到 tftp / 目录下
在 tftp / 目录下创建 pxelinux.cfg 目录,将开机执行配置文件放到 tftp / 下的pxelinux.cfg目录中并重名了为default
[root@localhost ~]# cp /mnt/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
现在查看 tftp / 目录下 有哪些文件
[root@localhost ~]# ll /var/lib/tftpboot/ -R
/var/lib/tftpboot/:
total 60480
-rw-r--r--. 1 root root 55129656 May 8 21:35 initrd.img
-rw-r--r--. 1 root root 26759 May 8 21:27 pxelinux.0
drwxr-xr-x. 2 root root 21 May 8 21:39 pxelinux.cfg
-rwxr-xr-x. 1 root root 6769256 May 8 21:33 vmlinuz
/var/lib/tftpboot/pxelinux.cfg:
total 4
-rw-r--r--. 1 root root 3032 May 8 21:39 default
4.5. 将安装光盘文件放到 vsftp 目录,提供给客户端下载
在 4,2 已经将光盘文件挂载到了 /mnt 目录,所以现在只需要将 /mnt 目录下的文件 拷贝到 vsftp 目录即可。
创建ftp存放光盘文件的目录
[root@localhost ~]# mkdir /var/ftp/Centos7.9
将光盘文件拷贝到ftp对应目录
[root@localhost ~]# cp -rp /mnt/* /var/ftp/Centos7.9/
4.6. 将Kickstart 应答文件放到ftp / 目录下,并重名了为ks.cfg
如果我们刚装完系统,在 /root 目录下就会生成一个 anaconda-ks.cfg 文件,这个就是
Kickstart 应答文件,只需要稍微修改就可以使用,下篇将介绍使用system-config-kickstart
图形化工具,定义Kickstart 应答文件,当然这需要你的操作系统有 GUI。
[root@localhost ~]# cp /root/anaconda-ks.cfg /var/ftp/ks.cfg
# 授权,如果权限不够,客户机就无法通过这个文件进行配置
[root@localhost ~]# chmod 777 /var/ftp/ks.cfg
5. 修改开机配置文件和Kickstart应答文件
现在所有的文件都准备就绪了,现在只需要修改 这两个文件,就大功告成了
5.1. 修改开机配置文件
默认的开机菜单中有两个选项,要么是安装系统,要么是对安装介质进行检验。
default 文件,把第 1 行的 default 参数 修改为 linux,这样系统在开机时就会默认执行那个名称为 linux的选项了。我们将默认的光盘镜像安装方式修改成 FTP 文件传输方式,并指定好光盘镜像的获取网址以及 Kickstart 应答文件的获取路径:
default linux
... ...
label linux
menu label ^Install CentOS 7
kernel vmlinuz
append initrd=initrd.img inst.stage3=ftp://192.168.92.10/Centos7.9 ks=ftp://192.168.92.10/ks.cfg quiet
... ...
5.2. 修改Kickstart 应答文件
5.2.1. kickstart应答文件的组成部分
kickstart文件主要包括三个部分:命令段,程序包段,脚本段
命令段:指明各种安装前配置,如键盘类型等
命令段中的常见命令:
- keyboard: 设定键盘类型
- lang: 语言类型
- zerombr:清除mbr
- clearpart:清除分区
- part: 创建分区
- rootpw: 指明root的密码
- timezone: 时区
- text: 文本安装界面
- network:指定网络设置
- firewall:设置防火墙设置
- selinux:设置selinux设置
- reboot:安装完自动重启
- user:安装完成后为系统创建新用户
- url: 指明安装源
程序包段:指明要安装的程序包组或程序包,不安装的程序包等
%packages
@core:这个子部分表示基础系统的软件包,包括操作系统内核、文件系统和基本工具等。
@base:这个子部分表示基本软件包,包括一些命令行工具和基本服务。
@<package_group>:这个子部分表示需要安装的软件包组,可以是预定义的软件包组,也可以是自定义的软件包组。
<package_name>:这个子部分表示需要单独安装的软件包,可以是操作系统提供的软件包,也可以是第三方软件包。
%end
下面是一个简单的Kickstart文件%packages部分的例子:
# 如下示例安装了基础系统软件包、命令行工具、Web服务器、MySQL数据库和OpenSSH服务器。同时也单独安装了openssh-server软件包。
%packages
@core
@base
@web-server
@mysql
openssh-server
%end
在 kickstart 应答文件的 %packages 部分中,可以使用 " - 软件包名称" 的格式来指定不安装某个软件包。例如,如果你想要安装所有的 “@core” 软件包,但不想安装 “emacs” 软件包,可以这样写:
# 这样在安装系统时,kickstart 将会安装 “@core” 软件包组中的所有软件包,但不会安装 “emacs” 软件包。请注意,软件包名称前面的 “-” 符号非常重要,它指示 kickstart 不要安装这个软件包。
%packages
@core
-emacs
%end
查看系统安装的软件包组:
yum grouplist
安装软件包组:yum groupinstall
卸载软件包组:yum groupremove
脚本段:
#安装前脚本
%pre
%end
#安装后脚本
%post
%end
%post
useradd wang # 安装完创建用户
%end
5.2.2. kickstart修改
对密码进行加密:
openssl passwd -1 "adm@123"
可参考链接:https://www.cnblogs.com/panwenbin-logs/p/9340430.html
对参数的了解可参考链接:https://www.cnblogs.com/dinmin/articles/15348374.html
[root@localhost ~]# cat /var/ftp/ks.cfg
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
url --url=ftp://192.168.92.10/Centos7.9 # 获取镜像文件的方式
# Use graphical install
graphical # 在 图像化界面下安装
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8 # 系统语言
# Network information
network --bootproto=dhcp --device=ens33 --ipv6=auto --no-activate
network --hostname=localhost.localdomain
# Root password
rootpw --iscrypted $1$WriG9jbZ$3HCtLDoIqcDg3juOGUrXK0 # 加密后的密码
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Shanghai --isUtc # 时区设置
# System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda # 设置启动盘
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part /boot --fstype="xfs" --ondisk=sda --size=200 # boot 分区设置大小,默认为M,不可设置单位
part / --fstype="xfs" --ondisk=sda --grow # --grow 将剩余的容量全部划分
%packages #安装的软件包
@^minimal
@core
chrony
kexec-tools
%end
%addon com_redhat_kdump --enable --reserve-mb='auto'
%end
%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end
firewall --disable # 不启动防护墙,默认是启动
selinux --disable # 不启动selinux,默认是启动
reboot # 安装完系统后重启
6. 客户机测试
需要注意事项:
a. 客户机下载软件包是存放在内存中,所以至少需要2G
b. 必须和PXE服务器处理同一个物理网络
c. PXE服务器所有服务端口必须是开放的。
下篇将使用 system-config-kickstart 图形化的方式创建 应答文件,使用Cobbler来快速建立Linux网络安装环境
参考链接:https://www.cnblogs.com/panwenbin-logs/p/9340430.html
https://www.cnblogs.com/dinmin/articles/15348374.html
https://blog.csdn.net/G_D0120/article/details/135631769