因为公司要进行自动化部署几百台机器测试极限情况,因此我尝试进行使用BMC+PXE进行自动化部署。
下面是我学习的经历以及部署测试的所有流程。
学习
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服务器
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)
新增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
版权属于:寒夜方舟
本文链接:https://www.wnark.com/archives/165.html
本站所有原创文章采用署名-非商业性使用 4.0 国际 (CC BY-NC 4.0)。 您可以自由地转载和修改,但请注明引用文章来源和不可用于商业目的。声明:本博客完全禁止任何商业类网站转载,包括但不限于CSDN,51CTO,百度文库,360DOC,AcFun,哔哩哔哩等网站。
1 条评论
牛逼啊