因为公司要进行自动化部署几百台机器测试极限情况,因此我尝试进行使用BMC+PXE进行自动化部署。

下面是我学习的经历以及部署测试的所有流程。

以下所有流程均为BIOS引导,也就是Legacy启动的方式,公司未来将统一只用uefi,我在后面再改流程。

学习

PXE

首先要看个科普性教程:

PXE : Pre-Boot Execution Environment
PXE 通过网卡引导的技术,需要BIOS支持+网卡支持,现在均已支持。需要在BIOS内开启这个开关(新的服务器主板默认已经全部打开了。也可以用BMC打开并设置为第一启动项。)
需要在服务器上安装DHCP+tftp,DHCP提供IP地址,tftp提供无需验证的文件服务。PXE并不是无盘工作站,而是一种引导技术。

整个系统安装包括两个部分,一部分是引导部分,一部分是安装部分。
网卡从DHCP服务器获取信息---DHCP服务器除了分配IP,还会告诉服务器网络引导程序的名字(pxelinux.0)以及tftp服务器的IP地址---网卡会用tftp客户端把引导程序加载到内存中---BIOS会执行这个引导程序---引导程序会从tftp查找配置文件(pxelinux.cfg)---根据配置文件来引导

系统启动顺序

一、BIOS自检
二、读取引导程序
1.GRUB(一段固定的可执行代码)
2.BIOS执行引导程序
3.引导程序读取配置文件/boot/grub/grub.conf
4.从pxelinux.0引导,读取配置文件:pxelinux.cfg
5.pxelinux.cfg文件夹内存在一个叫default的文件,通过这个default启动项告诉客户机从什么内核引导, 以及在引导时向内核传递的任何选项,

部署pxe服务器

由于网卡带宽也就1G,因此我在这里不用内存盘,固态硬盘足够了。

有部分网卡的没有打开pxe功能,需要手动打开。例如Intel 82599需要手动通过工具打开PXE启动,才能通过PXE启动。

PXE

整个流程请不要跳着看,请按序号来。

准备底层系统

先在VMware安装一个Centos7 desktop kde版系统作为PXE服务器,实测Ubuntu20.04不太适合,并且我公司的系统是基于Centos版,因此兼容性比较好。我在这里是用的是CentOS-7-x86_64-Everything-2009.iso版本。不用公司的虚拟机是因为公司的虚拟机偶尔还要重置,等后面确定好流程后再用公司服务器进行部署操作。
旧版的centos可以在这个网站下载:https://vault.centos.org/
还得关闭防火墙与selinux

systemctl disable firewalld
systemctl stop firewalld
setenforce 0
vim /etc/selinux/config

改成

SELINUX=disabled

重启后使用以下命令检查

/usr/sbin/sestatus -v
systemctl status firewalld

确定使用的镜像

从公司网盘下载公司对外发布的镜像,后面使用这种镜像进行部署。我在这里使用的是zettakit_OS_3.1_20210531.iso版本。

配置PXE环境

新增网卡为仅主机模式,关闭VMware仅主机模式的DHCP服务,关闭系统内的firewalld服务。可以通过配置文件指定DHCP服务器使用的端口,因此就不用关闭所有的DHCP服务器了。

[root@centos ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

如果后面使用的是Kickstart Generator在线生成ks.cfg文件,那就不用配置这个了。

新增yum源配置文件,是为了后面好测试,在这里我在虚拟机内挂载CentOS-7-x86_64-Everything-2009.iso镜像,然后进行配置yum源,后面要用到这个源的。使用lsblk查看光盘硬件名称。

[root@centos /]# mount /dev/sr0 /media
mount: /dev/sr0 写保护,将以只读方式挂载
[root@centos /]# cd /etc/yum.repos.d/
[root@centos yum.repos.d]# ls
CentOS-Base.repo       CentOS-fasttrack.repo  CentOS-Vault.repo
CentOS-CR.repo         CentOS-Media.repo      CentOS-x86_64-kernel.repo
CentOS-Debuginfo.repo  CentOS-Sources.repo
[root@centos yum.repos.d]# vim dvd.repo

每次重启后要记得手动挂载喔。

输入:

[development]
name=centos7-desktop-pxe
baseurl=file:///media
enabled=1
gpgcheck=0

清理旧的缓存:

[root@centos yum.repos.d]# yum clean all
已加载插件:fastestmirror, langpacks
正在清理软件源: base development extras updates
Cleaning up list of fastest mirrors

安装dhcp与tftp

yum -y install dhcp tftp-server xinetd

配置DHCP,修改dhcpd.conf

[root@centos dhcp]# cd /etc/dhcp/
[root@centos dhcp]# ls
dhclient.d  dhclient-exit-hooks.d  dhcpd6.conf  dhcpd.conf  scripts
t@centos dhcp]# cp /usr/share/doc/dhcp*/dhcpd.conf.example dhcpd.conf
cp:是否覆盖"dhcpd.conf"? y
[root@centos dhcp]# vim dhcpd.conf 

找到

# A slightly different configuration for an internal subnet.
subnet 10.5.5.0 netmask 255.255.255.224 {
  range 10.5.5.26 10.5.5.30;
  option domain-name-servers ns1.internal.example.org;
  option domain-name "internal.example.org";
  option routers 10.5.5.1;
  option broadcast-address 10.5.5.31;
  default-lease-time 600;
  max-lease-time 7200;
}

将其修改成

subnet 10.1.0.0 netmask 255.255.255.0 {
  range 10.1.0.1 10.1.0.253;
  option domain-name-servers 114.114.114.114;
  option domain-name "zettakit.com";
  option subnet-mask 255.255.255.0;
  option routers 10.1.0.254;
  option broadcast-address 10.1.0.255;
  default-lease-time 600;
  max-lease-time 7200;
}

含义如下:

subnet 10.1.0.0 netmask 255.255.255.0 {} ## 该子配置定义了子网信息,包括范围、默认网关、域名服务器等信息,需用{}括起来。
range 10.1.0.1 10.1.0.253; ## 租用地址的范围,最大范围由上面的信息计算出来。
option domain-name-servers 114.114.114.114; ## 指定上层域名服务器,此DHCP服务器通过这个域名服务器来获取公网dns服务器的解析内容。
option domain-name "zettakit.com"; ## 内网搜索域名称,公司的域是啥就用啥。
option subnet-mask 255.255.255.0; ## 子网掩码,其实这个不是必须项目,用来提供给用该dhcp服务器作为它的子网掩码的.
option routers 10.1.0.254; ## 网关地址
option broadcast-address 10.1.0.255; ## 广播地址
default-lease-time 600; ## 默认租赁期
max-lease-time 7200; ## 最大租赁期

修改完毕后,其他的东西就可以删掉了。

修改centos端口IP

因为我用的是桌面端,因此我直接在桌面修改即可。最好禁用IPv6
如下所示:

[root@centos network-scripts]# cat ifcfg-ens37
HWADDR=00:0C:29:86:C3:D8
MACADDR=DC:26:E5:62:AC:93
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=10.1.0.1
PREFIX=24
GATEWAY=10.1.0.254
DNS1=114.114.114.114
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=pxe-server
UUID=432fc212-c39f-3d29-b096-b238487123e0
ONBOOT=yes

10.1.0.1分配给本机的仅主机模式的端口
配置完成后记得重启。

然后配置dhcp服务使用的端口

cp /usr/lib/systemd/system/dhcpd.service /etc/systemd/system/
vi /etc/systemd/system/dhcpd.service

编辑 [Service],主要是在后面添加作为dhcp服务端口:

ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid ens37

保存并退出。

systemctl --system daemon-reload
systemctl enable dhcpd
systemctl restart dhcpd

能正常启动就行了。

[root@centos network-scripts]# systemctl status dhcpd
● dhcpd.service - DHCPv4 Server Daemon
   Loaded: loaded (/etc/systemd/system/dhcpd.service; disabled; vendor preset: disabled)
   Active: active (running) since 三 2021-06-02 16:44:45 CST; 8s ago
     Docs: man:dhcpd(8)
           man:dhcpd.conf(5)
 Main PID: 2834 (dhcpd)
   Status: "Dispatching packets..."
   CGroup: /system.slice/dhcpd.service
           └─2834 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pi...

6月 02 16:44:45 centos dhcpd[2834]: Internet Systems Consortium DHCP Server 4.2.5
6月 02 16:44:45 centos dhcpd[2834]: Copyright 2004-2013 Internet Systems Consortium.
6月 02 16:44:45 centos dhcpd[2834]: All rights reserved.
6月 02 16:44:45 centos dhcpd[2834]: For info, please visit https://www.isc.org/software/dhcp/
6月 02 16:44:45 centos dhcpd[2834]: Not searching LDAP since ldap-server, ldap-port and ld...ile
6月 02 16:44:45 centos dhcpd[2834]: Wrote 1 leases to leases file.
6月 02 16:44:45 centos dhcpd[2834]: Listening on LPF/ens37/a8:3c:80:c7:7d:d0/10.1.0.0/24
6月 02 16:44:45 centos dhcpd[2834]: Sending on   LPF/ens37/a8:3c:80:c7:7d:d0/10.1.0.0/24
6月 02 16:44:45 centos dhcpd[2834]: Sending on   Socket/fallback/fallback-net
6月 02 16:44:45 centos systemd[1]: Started DHCPv4 Server Daemon.
Hint: Some lines were ellipsized, use -l to show in full.

查看dhcp是否开始监听端口

[root@centos ~]# netstat -tulnp | grep :67
udp        0      0 0.0.0.0:67              0.0.0.0:*                           2834/dhcpd 

配置tftp

编辑

vim /etc/xinetd.d/tftp

把里面的disable=yes改成disable=no
并且得知tftp访问根目录在centos的位置/var/lib/tftpboot

使用:

systemctl enable xinetd

配置tftp下次开机自动启动。
查看tftp是否启动。

netstat -tulnp | grep :69

随后对接dhcpd与tftp

编辑dhcpd配置文件

vim /etc/dhcp/dhcpd.conf

在前两行输入:

next-server 10.1.0.1;
filename "/pxelinux.0";

其中,10.1.0.1为tftp服务器的ip,/pxelinux.0为引导程序的文件,它是将tftp的根目录作为系统根目录。
由于启动需要使用pxelinux.0作为一个小型的操作系统,可以认为其为一个操作系统的底层,因此搜索系统中是否存在pxelinux.0

locate pxelinux.0

发现系统内没有这个文件,然后搜索哪个包有这个文件。

yum provides "*/pxelinux.0"

确定pxelinux.0在syslinux这个包内。
进行安装,并将pxelinux.0转移到tftp的根目录内

yum install syslinux
rpm -ql syslinux | grep pxe
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/pxelinux.0

这样,在tftp根目录内就有这个文件了。

创建pxelinux.cfg

创建一个pxelinux.cfg文件夹,然后在里面新建一个default。这样系统会到pxelinux.cfg文件夹内查找default文件用来引导。(当然会引导失败,因为这个default实际上没有配置。)

cd /var/lib/tftpboot
mkdir pxelinux.cfg
cd pxelinux.cfg
touch default

再次重启pxe启动测试的机器,会发现依然找不到配置文件,因为default内没有内容。因此需要到光盘内查找

cd /media/
cd isolinux
vim isolinux.cfg

可以观察到这个文件其实就是开机引导菜单。因此可以使用这个文件。

cp isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default

重启pxe机器,可以观察到进入配置文件了。但由于缺少isolinux.cfg内定义的文件,因此无法引导,提示:could not find kernel image:vesamenu.c32
isolinux.cfg内定义的文件均在isolinux内。当系统读/var/lib/tftpboot/pxelinux.cfg/default,然后被引导读取isolinux内的文件,因此需要移动文件。

cd /media/isolinux
cp vesamenu.c32 boot.msg memtest splash.png /var/lib/tftpboot/

再次重启pxe启动测试机器可以观察到出现菜单了。

配置default文件

根据需求配置default文件。

配置内核与驱动程序

在tftpboot目录下注意是否存在内核:vmlinuz 与 驱动程序:initrd.img
内核:vmlinuz 与 驱动程序:initrd.img一定要与操作系统相匹配。这两个文件一定不通用。
如果需要安装对应的操作系统,去光盘找images文件夹,里面一定有这两个文件。

自定义系统

创建对应系统的目录,将这两个文件放入进去,比如在这里创建centos7

cd /var/lib/tftpboot
mkdir centos7.9
cd /media/images/pxeboot
cp vmlinuz initrd.img /var/lib/tftpboot/centos7.9

然后修改配置文件

vim /var/lib/tftpboot/pxelinux.cfg/default

模仿它的启动菜单填写新增内容。

label centos7.9
  menu label ^Install CentOS 7.9
  ## 根目录为tftp的目录,因此内核在/centos7.9/vmlinuz
  kernel /centos7.9/vmlinuz
  append initrd=/centos7.9/initrd.img

重启pxe启动测试机器,选择centos7.9菜单,按tab键,可以观察到上面已有的内容。
在教学视频中的rhel里则会提示输入网络安装的网址。 但在centos安装会卡住,提示:/dev/root does not exist。这是因为没有ks文件,安装文件没有正确的识别到硬盘。使用下面的方法可以获取到ks文件。

自动化部署

部署安装源

随便什么文件服务器都行。假设pxe文件服务器为10.1.0.1
在这里用httpd(其实就是apache),也可以用nginx。

yum install httpd -y
systemctl enable --now httpd

修改配置文件。

vim /etc/httpd/conf/httpd.conf

可以观察到默认网站位置在/var/www/html下。

mkdir pub
mount /dev/sr0 /var/www/html/pub

访问ip/pub即可。

配置system-config-kickstart

需要使用system-config-kickstart配置无人值守安装。

yum install -y system-config-kickstart

这个软件专门提供无人值守安装脚本。
在终端输入system-config-kickstart会弹出一个界面。选择填写菜单。
1.默认语言:英文。键盘布局:英文。时区:Asia/Shanghai。密码:root密码。安装架构:X86(或者其他)。安装完成后是否重启 。
2.可以输入安装源为pxe服务器ip,目录为pub
3.安装引导程序到mbr分区还是第一个分区,还有内核调优参数。
4.分区,在使用自动化安装的时候别装双系统,因此分区直接清除所有分区就行。
按照如下最基础方式进行分区,使用ext4分区。还可以根据需求进行设置分区。使用mbr分区的时候要求硬盘要低于2t,高于2t需要新增一个。如果大于2t得用biosboot,实现legacy启动gpt硬盘。批量部署raid要其他软件,比如华为的FusionDirector。

/boot  500M
swap 8G
/    剩余空间

5.自动化部署网卡。(由于公司是搞openstack的,所以就在这里不配置网卡了)。
可以配置eth0使用dhcp访问网络。
即使centos用ip a显示的不是eth0,但内核中依然是eth0。只是加了一个规则,将eth改名了,通过这个命令可以观察到。

dmesg | grep eth

6.认证。也可以自动化配置。
7.关闭selinux与防火墙。
8.是否安装图形界面。
9.配置软件源

cd /etc/yum.repos.d/
vim dvd.repo

修改成:

[development]
name=centos7-desktop-pxe
baseurl=http://10.1.0.1/pub
enabled=1
gpgcheck=0

仓库的名称之所以为:development,是因为kickstart只识别这个名字。
10.装桌面
需要System-Base,Desktops-Fonts、GNOME、X Window System。
11.安装后脚本,系统装完以后执行脚本。

保存kickstart创建的文件

将kickstart创建文件,文件格式为cfg文件,也可以直接修改这个cfg文件。
在root目录下也有相同的文件。里面有手动安装系统的时候所有操作的文件。


将这个cfg文件保存到http目录下。

mkdir /var/www/html/ks
cp ks.cfg /var/www/html/ks/

为了将来客户端可以读到这个脚本,还得修改启动配置文件。

vim /var/lib/tftpboot/pxelinux.cfg/default

将之前的内容改成

label centos7.9
  menu label ^Install CentOS 7.9
  ## 根目录为tftp的目录,因此内核在/centos7.9/vmlinuz
  kernel /centos7.9/vmlinuz
  ## 驱动为initrd.img,自动化配置部署文件为ks.cfg
  append initrd=/centos7.9/initrd.img ks=http://10.1.0.1/ks/ks.cfg

然后重启pxe测试的机器就行了。
就开始自动化安装,安装完成后系统默认从硬盘启动。
如果有的系统必须要有个非root用户,那就在kickstart配置的安装后脚本内自动创建一个用户并设密码。

ipmi设置引导项

由于现在的服务器都有BMC控制芯片,也就是可以支持IPMI启动,因此可以通过ipmitool命令来控制服务器下一次从pxe启动。

ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) chassis bootdev pxe 

这样,服务器就在下一次从pxe启动了。
如果不确定服务器是支持UEFI还是legacy的,那就用

ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) chassis bootparam get 5

查看前五个引导项顺序

临时设置从uefi pxe启动,如果不带options=efiboot那就是从传统bios启动了。

ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) chassis bootdev pxe options=efiboot

重启服务器

ipmitool –H (BMC的管理IP地址) –I lanplus –U (BMC登录用户名) –P (BMC 登录用户名的密码) power reset

isolinux.cfg

isolinux/isolinux.cfg即为/var/lib/tftpboot/pxelinux.cfg/default
其内容如下所示:

## 从DHCP获取IP,访问tftp根目录作为pxe系统根目录后,开始执行vesamenu.c32文件
default vesamenu.c32
## 代表1/10秒,则600是60s
timeout 600
## 菜单的内容,里面包括启动使用的图片
display boot.msg

# Clear the screen when exiting the menu, instead of leaving the menu displayed.
# For vesamenu, this means the graphical background is still displayed without
# the menu itself for as long as the screen remains in graphics mode.
menu clear
menu background splash.png
menu title CentOS 7
menu vshift 8
menu rows 18
menu margin 8
#menu hidden
menu helpmsgrow 15
menu tabmsgrow 13

# Border Area
menu color border * #00000000 #00000000 none

# Selected item
menu color sel 0 #ffffffff #00000000 none

# Title bar
menu color title 0 #ff7ba3d0 #00000000 none

# Press [Tab] message
menu color tabmsg 0 #ff3a6496 #00000000 none

# Unselected menu item
menu color unsel 0 #84b8ffff #00000000 none

# Selected hotkey
menu color hotsel 0 #84b8ffff #00000000 none

# Unselected hotkey
menu color hotkey 0 #ffffffff #00000000 none

# Help text
menu color help 0 #ffffffff #00000000 none

# A scrollbar of some type? Not sure.
menu color scrollbar 0 #ffffffff #ff355594 none

# Timeout msg
menu color timeout 0 #ffffffff #00000000 none
menu color timeout_msg 0 #ffffffff #00000000 none

# Command prompt text
menu color cmdmark 0 #84b8ffff #00000000 none
menu color cmdline 0 #ffffffff #00000000 none

# Do not display the actual menu unless the user presses a key. All that is displayed is a timeout message.

menu tabmsg Press Tab for full configuration options on menu items.

menu separator # insert an empty line
menu separator # insert an empty line

## 开始菜单中回车就加载这行内容
## 最开始是没菜单(menu),只有label。在安装菜单界面的时候按esc键就进入了老式安装界面,直接输入linux、centos7.9就可以直接进入了,结果是一样的。
label linux
  menu label ^Install CentOS 7
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet

label centos7.9
  menu label ^Install CentOS 7.9
  ## 根目录为tftp的目录,因此内核在/centos7.9/vmlinuz,驱动在/centos7.9/initrd.img,inst.stage2为安装来源
  kernel /centos7.9/vmlinuz
  append initrd=/centos7.9/initrd.img

label check
  menu label Test this ^media & install CentOS 7
  ## menu default有这个代码的启动目录即为开机默认选择的菜单。
  menu default
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet

menu separator # insert an empty line

# utilities submenu
menu begin ^Troubleshooting
  menu title Troubleshooting

label vesa
  menu indent count 5
  menu label Install CentOS 7 in ^basic graphics mode
  text help
    Try this option out if you're having trouble installing
    CentOS 7.
  endtext
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 xdriver=vesa nomodeset quiet

label rescue
  menu indent count 5
  menu label ^Rescue a CentOS system
  text help
    If the system will not boot, this lets you access files
    and edit config files to try to get it booting again.
  endtext
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rescue quiet

label memtest
  menu label Run a ^memory test
  text help
    If your system is having issues, a problem with your
    system's memory may be the cause. Use this utility to
    see if the memory is working correctly.
  endtext
  kernel memtest

menu separator # insert an empty line

label local
  menu label Boot from ^local drive
  localboot 0xffff

menu separator # insert an empty line
menu separator # insert an empty line

label returntomain
  menu label Return to ^main menu
  menu exit

menu end

参考:
How to setup DHCP server on Ubuntu
DHCP_Server
CONFIGURING A DHCP SERVER
kickstart配置文件详解和system-config-kickstart
【超级详细】使用 PXE+Kickstart 实现无人值守批量部署系统
远程管理卡:ipmi命令详解
Changing network boot order (pxe) using ipmitool

最后修改:2021 年 07 月 03 日
如果觉得我的文章对你有用,请随意赞赏