基于PXE实现网络自动化安装LInux系统
What(能实现什么)
在工作的当中,作为运维人员如果要管理几十台或者上百台机器时,我们一定会用上自动化运维的思维。例如:boss限制我们一天内上线30台服务器。那我们不可能一台台去安装的,如果通过光驱或U盘的方式一个个安装,不仅效率低,也不利于维护,这是时候你就需要PXE的强大功能了。
Why(原理是什么)
操作系统安装流程
硬盘安装的流程:bios启动——MBR寻找grub——grub程序读取menu.list等配置文件,找到内核启动镜像和相关初始化程序,安装(或者启动)。
PXE(Pre-boot Execution Environment)是由Intel设计,可以使计算机通过网络启动的协议。基于C/S架构,PXE协议中的client在写入到网卡ROM中,当系统加电时:BIOS启动——系统把网卡中内置的PXE client中的程序调入内存中,显示内置的命令菜单。选择网络启动后程序开始寻找网络引导程序(boot loader 文件,这个文件的名字随着发行版的不同而不同,在centos中,它是pxelinux.0)——然后引导程序读取配置文件pxelinux.cfg(安装系统菜单),获得系统初始化的相关文件信息,系统启动开始安装。
PXE自动安装内部工作流程
现在的网卡一般都会支持PXE协议和tftp和dhcp协议,并在出厂时内置在ROM当中,不用手动写入;
- Client向PXE Server上的DHCP发送IP地址请求消息,DHCP检测Client是否合法(主要是检测Client的网卡MAC地址),如果合法则返回Client的IP地址,同时将启动文件pxelinux.0的位置信息一并传送给Client;
- Client向PXE Server上的TFTP发送获取pxelinux.0请求消息,TFTP接收到消息之后再向Client发送pxelinux.0大小信息,试探Client是否满意,当TFTP收到Client发回同意大小信息之后,正式向Client发送pxelinux.0;
- Client执行接收到的pxelinux.0文件;
- Client向TFTP Server发送针对本机的配置信息文件(在TFTP 服务的pxelinux.cfg目录下),TFTP将配置文件发回Client,继而Client根据配置文件执行后续操作;
- Client向TFTP发送Linux内核请求信息,TFTP接收到消息之后将内核文件发送给Client;
- Client向TFTP发送根文件请求信息,TFTP接收到消息之后返回Linux根文件系统;
- Client启动Linux内核;
- Client下载安装源文件,读取自动化安装脚本;
How(怎样做)
我把dhcp、tftp和http服务器都集中了一台Centos 8系统,当然生产环境也可以分开存在,最后就是指定地址的问题;
安装前准备:关闭防火墙和SELINUX,DHCP服务器设置为静态IP本机的IP为192.168.8.8;
1.安装相关的软件程序
[root@centos8 ~]#yum install httpd tftp-server dhcp syslinux-nonlinux system-config-kickstart httpd -y
#tftp服务 用来存储系统引导文件放置到tftp的根本目录下/var/lib/tftpboot;
#dhcp服务 用来给客机分发IP地址,和提供系统引导文件名及下载路径;
#httpd服务 用来存放系统安装的仓库包;
#syslinux-nonlinux 软件 存放系统引导文件和系统选项启动菜单(基于字符界面);
#system-config-kickstart 用来生成系统应答文件;
#Centos 8的 system-config-kickstart可能无法安装,可以参考/root/anaconda-ks.cfg文件修改;
2.dhcp.http,tftp加入开机启动;
[root@centos8 ~]#systemctl enable --now tftp-socket
[root@centos8 ~]#systemctl enable --now httpd
[root@centos8 ~]#systemctl enable --now dhcpd
dhcp默认是无法启用的,报错的信息就是dhcp服务,没有为本地提供服务的网段,因为刚安装的dhcp的配置文件默认是空的,需要重新配置;
[root@centos8 ~]#systemctl enable --now httpd
#省略.....
Nov 14 13:19:47 centos 7.localdomain dhcpd[5247]: Not configured to listen on any interfaces!
3.配置系统安装包下载路径和生成系统应答文件;
[root@centos8 ~]#mkdir /var/www/html/centos/{6,7,8}/isos/x86_64 -p #此文件是参照阿里云目录,可以自定义;
我在VM上操作的,添加了三个光驱,这时把对应的系统光盘挂载到对应的3个目录,例如:我插入Centos7的光盘,识别为/dev/sr0;
[root@centos8 ~]#mount /dev/sr0 /var/www/html/centos/7/isos/x86_64
[root@centos8 ~]#mkdir /var/www/html/ksdir #用来存放应答文件;
制作系统应答文件(以安装CentOS7为例)
[root@centos8 ~]#vim /var/www/html/ksdir/ks7.cfg #对应Centos7系统
#version=DEVEL
# System authorization information
install #新装系统
text #以text字符界面安装
auth --enableshadow --passalgo=sha512 #认证加密方式
url --url=http://192.168.8.8/centos/7/isos/x86_64/ #指定系统安装包存放路径,就是http服务器上存放;
selinux --disabled #关闭selinux
firewall --disabled #关闭防火墙
reboot #安装完成后重启
keyboard 'us' #指定键盘布局
lang en_US.UTF-8 #指定系统安装语言
network --bootproto=dhcp --device=eth0 --onboot=on --ipv6=auto # 指定本地网卡配置模式
network --hostname=CentOS7.localdomain #指定主机名
rootpw --iscrypted $1$zFgkn3Ku$YrI2DryWi0w2aZaPo2kNr1
#以md5加密方式加密的root账户的密码,此处密码为root;
services --enabled="chronyd" #开启chronyd同步服务
# System timezone
timezone Asia/Shanghai --isUtc --nontp #设置默认时区
bootloader --location=mbr # 设定引导记录的位置
zerombr #清除mbr信息,会同时清空系统用原有分区表
# Partition clearing information
clearpart --all --initlabel #--all 擦除系统上原有所有分区,--initlabel 初始化磁盘卷标为系统架构的默认卷标
# Disk partitioning information
part swap --fstype="swap" --size=2048 #--outdisk设定该分区创建在一个具体的磁盘上
part /boot --fstype="xfs" --size=1024 #分区形式
part / --fstype="xfs" --size=102400 #分区形式
part /data --fstype="xfs" --size=10240 #分区形式
%packages #指定安装那一些软件包;
@core
kexec-tools
autofs #加上@是安装包组,不加@是安装程序;
%end
%post #这里可以写系统安装后执行的命令,用来初始化系统
usradd 123 #新建123用户;
%end
文件修改后可以用ksvalidatora工具检查是否存在语法错误,此工具是在system-config-kickstart软件包当中;
[root@centos 7 ~]# vim ks7.cfg
[root@centos 7 ~]# ksvalidator ks7.cfg
[root@centos 7 ~]# echo $?
0
4.准备系统引导文件
cp /var/www/html/centos/7/isos/x86_64/{ldlinux.c32 libcom32.c32 libutil.c32} /var/lib/tftpboot -p
cp /var/www/html/centos/7/isos/x86_64/isolinux/{initrd.img vmlinuz} /var/lib/tftpboot/7 -p
cp /usr/share/syslinux/{menu.c32 pxelinux.0} /var/lib/tftpboot -p
mkdir /var/lib/tftpboot/pxelinux.cfg
cp /var/www/html/centos/7/isos/x86_64/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default -p
文件说明:
1.ldlinux.c32、 libcom32.c32、libutil.c32三个文件是安装Centos 8系统必须的文件,CentOS 6和7则不用;
2.initrd.img vmlinuz:系统安装时的引导文件及内核;
3.menu.c32 pxelinux.0:系统选项菜单及启动时的引导文件;
3.pxelinux.cfg : 生成系统选项的菜单;
5.修系统加载的菜单文件
[root@centos8 ~]#vim /var/lib/tftpboot/pxelinux.cfg/default
1 default menu.c32 #指定启动菜单的样式;
2 timeout 600 #超时时长,以10分之一秒为单位,如果不选择倒数结束后直接执行默认操作;
3
4 menu title CentOS #安装菜单抬头
5
6 label CentOS 6 #菜单标签
7 menu label Install CentOS ^6.0 #菜单选项内内容
8 kernel 6/vmlinuz #选择内核
9 append initrd=6/initrd.img ks=http://192.168.8.8/ksdir/ks6.cfg #指定应答文件的存放位置
10
11 label CentOS 7
12 menu label Install CentOS ^7.0
13 kernel 7/vmlinuz
14 append initrd=7/initrd.img ks=http://192.168.8.8/ksdir/ks7.cfg
15
16 label CentOS 8
17 menu label Install CentOS ^8.0
18 kernel 8/vmlinuz
19 append initrd=8/initrd.img ks=http://192.168.8.8/ksdir/ks8.cfg
20
21 label local
22 menu label Boot from ^local drive
23 menu default #如果不选择,倒数结束后直接执行此项;
24 localboot 0xffff
25
6.修改dhcp的配置文件,指向tftp的位置;
[root@centos8 ~]#vim /etc/dhcp/dhcpd.conf
1 option domain-name "example.org";
2 option domain-name-servers 182.76.76.76,114.114.114.114; #指定DNS
3 default-lease-time 600; #默认时长
4 max-lease-time 7200; #最大时长
5 log-facility local7;
6 subnet 192.168.8.0 netmask 255.255.255.0 {
7 range 192.168.8.100 192.168.8.200;
8 option routers 192.168.8.2;
9 filename "pxelinux.0"; #指定系统初始化引导文件的名称
10 next-server 192.168.8.8; #指定系统初始化引导文件存放的位置
11 }
[root@centos8 ~]#systemctl start httpd
到此所有的准备工作已结束下面是安装图,测试环境:VMware 15 Pro
7.安装Centos 7 的测试实例:
1.加载bios界面时,按下esc键进入以下界面,选择网卡启动;
2.如果DHCP服务器正常那会直接跳到此选择页面;
3.选择CentOS 7.0之后就自动从tftp服务器中下载initrd.img vmlinuz文件;
接下来就可以享受自动安装啦,如果出现问题,根据提示一般都可以解决;
本文结束,谢谢阅读!!