其他分享
首页 > 其他分享> > pxe网络装机与实战部署

pxe网络装机与实战部署

作者:互联网

干货 | PXE+kickstart无人值守批量装机(原理与架构)

原创 Cloud研习社 Cloud研习社 2022-06-28 13:33 发表于山东 收录于合集 #一站式教程119个 #实战经验31个 #linux46个 #devops2个

图片

 

图片图片图片

你有没有想过,公司新上一批服务器,这几百台服务器如果你用U盘,或者ipmi安装操作系统,这是不是要把你近几个星期喝茶的时间都搭进去了?~~~   别害怕,有办法让你快速搞定批量、自动化系统安装,省出来的时间喝个茶、吃个鸡它不香吗~~~

 

图片图片

本文分四部分:

 

 

图片

什么是pxe

 

 

PXE(Pre-boot Execution Environment),预启动执行环境。它是intel公司开发的,用于让计算机通过网络来启动操作系统(而不是用本地U盘或本地硬盘、光盘)。

 

图片

什么是kickstart

 

 

Kickstart是一种全自动化、全程无需人工干预的自动化安装系统的技术。其工作原理是预先把安装系统过程中需要人工选择、配置的选项,通过保存成一个配置文件(例如:ks.cfg),安装过程中需要配置一些选项时,通过读取这个配置文件中的参数来自动设置这些选项,从而实现全自动化安装。

比如,我们手动安装系统的时候,会让我们选择语言、时区、键盘等,如果我们把这些配置写入ks文件,需要的时候系统自动获取ks文件的信息并配置完成,那么我们不就可以做一边吃鸡了吗!

 

图片

PXE工作流程

 

 

图片


1. PXE客户端(PXE的功能一般在服务器的网卡上)从网卡启动,发起广播报文请求IP地址等信息。(这个广播报文只有DHCP服务才会响应)

2. DHCP侦测到报文,验证是否为合法的PXE客户端请求,验证通过,会给客户端发送响应,响应中包含如下信息:

3. pxe客户端收到回应后,根据地址和路径,请求ftp下载pxelinux.0文件,然后执行pxelinux.0文件,这个文件会要求去下载FTP服务器上的配置文件pxelinux.cfg/default 。

所以这一步至少下载了两个文件:pxelinux.0和default。

扩展:

其实,默认情况下并不会直接查找pxelinux.cfg/default文件:

首先查找根据MAC地址命名的引导文件,比如对于 MAC 地址“88:99:AA:BB:CC:DD”,它会搜索文件 01-88-99-aa-bb-cc-dd。

其次查找使用大写十六进制数字的 IP 地址(正在引导的机器的)命名的引导文件。例如,对于 IP 地址“192.0.2.91”,它会搜索文件“C000025B”。

上面的两种方法如果找不到引导文件,它会从末尾删除一个十六进制数字并重新搜索。

但是,如果还是找不到引导文件,它最终会寻找一个名为“default”的文件。

例如:正在引导的设备的以太网 MAC 地址为 88:99:AA:BB:CC:DD,IP 地址为 192.0.2.91,则查找顺序为:

/tftpboot/pxelinux.cfg/01-88-99-aa-bb-cc-dd
/tftpboot/pxelinux.cfg/C000025B
/tftpboot/pxelinux.cfg/C000025
/tftpboot/pxelinux.cfg/C00002
/tftpboot/pxelinux.cfg /C0000
/tftpboot/pxelinux.cfg/C000
/tftpboot/pxelinux.cfg/C00
/tftpboot/pxelinux.cfg/C0
/tftpboot/pxelinux.cfg/C
/tftpboot/pxelinux.cfg/default

 

4.ftp把配置文件发送给客户端

3-1.default是引导文件,它事先定义好了开机启动所需要的文件,所以需要再次向ftp服务器发起请求,获取以下两个文件: 4-1. ftp把vmlinuz和initrd.img文件发送给客户端5. default文件还定义了安装所需的系统文件在哪(inst.stage2),以及自动应答的ks文件在哪,如:
label linux
  menu label ^Install CentOS 7
  menu default
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=http://10.0.0.61/CentOS7/ inst.ks=http://10.0.0.61/ks_config/CentOS7-ks.cfg quiet

 

这时候就会去http服务器上找对应的安装资源,并根据ks文件自动应答。6. 把第五步找到的资源发送给pxe客户端。
参考文献:
https://docs.oracle.com/cd/E24628_01/em.121/e27046/appdx_pxeboot.htm#EMLCM12198
https://blog.csdn.net/weixin_41982957/article/details/118982859
https://www.zyops.com/autoinstall-kickstart/

图片

ks文件解析

 


先来个例子:
[root@m01 ks_config]# cat CentOS7-ks.cfg
install
url --url="http://10.0.0.61/CentOS7/"
text
lang en_US.UTF-8
keyboard us
zerombr
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet net.ifnames=0 biosdevname=0"
network --bootproto=dhcp --device=ens33 --onboot=yes --hostname=pxetest --activate
timezone --utc Asia/Shanghai
authconfig --enableshadow --passalgo=sha512
rootpw --iscrypted $6$UoRe81QPnOaqc5Yi$E7OL7FF6ez0QHqg2ZVuBgPZ/wdzywUwkjs2jZ0uwZw8/ISlp6E92tPlUcF3Ac3EmxXh46EHB7KV1DTVu.mtyX. # 设置root用户的密码
clearpart --all --initlabel
part /boot --fstype xfs --size 1024
part swap --size 1024
part / --fstype xfs --grow
firstboot --disable
selinux --disabled
firewall --disabled

%packages
@^minimal
@compat-libraries
@debugging
@development
tree
nmap
sysstat
net-tools
dos2unix
telnet
wget
vim
bash-completion
%end

%post
systemctl disable postfix.service
%end

参数解读:

https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html-single/installation_guide/index#sect-kickstart-introduction
https://docs.centos.org/en-US/centos/install-guide/Kickstart2/#sect-kickstart-syntax

 

install (可选项):默认安装模式。必须从cdrom、harddrive、nfs、liveimg或url(对于 FTP、HTTP 或 HTTPS 安装)指定安装类型。且install和安装类型分列两行,例如:

install
url --url="http://10.0.0.61/CentOS7/"

 

text (可选项):指定以文本模式执行kickstart安装。如果不指定text,默认是图形化安装。

Lang(必选项)指定语言

Keyboard(必选项)指定键盘布局

Zerombr(可选项) 是否清楚mbr

BootLoader(必选项):用来指定如何安装引导加载程序。

network(可选项) 网络设置。

timezone(必选项) 设置时区

rootpw(必选项)    设置root用户的密码。

$ python -c 'import crypt,getpass;pw=getpass.getpass();print(crypt.crypt(pw) if (pw==getpass.getpass("Confirm: ")) else exit())'

 

Clearpart(可选项)  创建新分区之前从系统中删除原来的分区

Part(必选项) 创建分区。上例中创建了三个分区:/boot  /swap  /

%packages 这是软件包段的开始,用来指定安装的软件包(组)。%end命令结尾

%post    指定安装完成后需要做的动作。%end命令结尾。

本文就到这了,下一期我们开始 介绍实战。

推荐阅读

ifconfig已淘汰,ip登场

Linux 云计算 学习路线(建议收藏)放后台的Linux任务没有了,试试这个命令

Linux 网络状态工具 ss 命令详解

这次终于搞明白VLAN技术了

终于有人把敏捷、DevOps、CI、CD讲清楚了

 

 

除每周二、四、六定期更新的《Linux云计算一站式教程》以外,其余时间雷哥会推送一些工作中遇到的小知识、实战经验总结的文章。后续都会收录在“实战经验”合集中。

图片

 


Cloud研习社 为Linux云计算零基础同学服务,致力于打造一套完整的linux云计算教程。包括新手学习路线、linux、存储、集群架构以及Docker,K8S,DevOps等 144篇原创内容 公众号

图片

Cloud研习社

赞赏二维码喜欢作者

收录于合集 #一站式教程  119个 上一篇最全Linux 云计算学习资源入口下一篇干货 | PXE+kickstart无人值守批量装机(实战部署)   ...  

干货 | PXE+kickstart无人值守批量装机(实战部署)

Cloud研习社 Cloud研习社 2022-06-29 13:33 发表于山东 收录于合集 #一站式教程119个 #实战经验31个 #linux46个 #IT23个 图片

在这里,白嫖有罪。把它转给有你身边的朋友。共同进步。

 

 

图片

安装环境


DHCP、ftp、http共用一个服务器:10.0.0.61.

 

图片

安装dhcp服务器

 

[root@localhost ~]# yum -y install dhcp
[root@localhost ~]# vim /etc/dhcp/dhcpd.conf
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.sample
# see 'man 5 dhcpd.conf'

subnet 10.0.0.0 netmask 255.255.255.0 {
        range 10.0.0.180 10.0.0.200;
        option subnet-mask 255.255.255.0;
        default-lease-time 21600;
        max-lease-time 43200;
        next-server 10.0.0.61; # 这里是tfp服务器的地址
        filename "/pxelinux.0";
}

(这一步一般不用做,除非你有特殊要求)如果有多个网卡,默认监听第一个,当然也可以指定监听网卡:

[root@localhost ~]# vim /etc/sysconfig/dhcpd
……
DHCPDARGS=ens34 # 指定监听网卡


图片

启动dhcp服务

 

[root@localhost ~]# systemctl start dhcpd
[root@localhost ~]# systemctl status dhcpd
● dhcpd.service - DHCPv4 Server Daemon
   Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Sun 2022-06-26 17:19:25 CST; 4s ago
     Docs: man:dhcpd(8)
           man:dhcpd.conf(5)
 Main PID: 1724 (dhcpd)
   Status: "Dispatching packets..."
   CGroup: /system.slice/dhcpd.service
           └─1724 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid

Jun 26 17:19:25 localhost.localdomain dhcpd[1724]: No subnet declaration for ens34 (172.16.1.3).
Jun 26 17:19:25 localhost.localdomain dhcpd[1724]: ** Ignoring requests on ens34. If this is not what
Jun 26 17:19:25 localhost.localdomain dhcpd[1724]: you want, please write a subnet declaration
Jun 26 17:19:25 localhost.localdomain dhcpd[1724]: in your dhcpd.conf file for the network segment
Jun 26 17:19:25 localhost.localdomain dhcpd[1724]: to which interface ens34 is attached. **
Jun 26 17:19:25 localhost.localdomain dhcpd[1724]:
Jun 26 17:19:25 localhost.localdomain dhcpd[1724]: Listening on LPF/ens33/00:0c:29:12:6c:14/10.0.0.0/24  # 如果你的机器有多块网卡,注意这里dhcp是监听的哪块网卡。
Jun 26 17:19:25 localhost.localdomain dhcpd[1724]: Sending on   LPF/ens33/00:0c:29:12:6c:14/10.0.0.0/24
Jun 26 17:19:25 localhost.localdomain dhcpd[1724]: Sending on   Socket/fallback/fallback-net
Jun 26 17:19:25 localhost.localdomain systemd[1]: Started DHCPv4 Server Daemon.

再次验证dhcp服务是否启动

[root@localhost ~]# ss -lntup | grep 67
udp UNCONN 0      0         *:67                    *:* users:(("dhcpd",pid=1724,fd=7))

[root@localhost ~]# tail -f /var/log/messages
Jun 26 17:19:25 localhost dhcpd: No subnet declaration for ens34 (172.16.1.3).
Jun 26 17:19:25 localhost dhcpd: ** Ignoring requests on ens34. If this is not what
Jun 26 17:19:25 localhost dhcpd: you want, please write a subnet declaration
Jun 26 17:19:25 localhost dhcpd: in your dhcpd.conf file for the network segment
Jun 26 17:19:25 localhost dhcpd: to which interface ens34 is attached. **
Jun 26 17:19:25 localhost dhcpd:
Jun 26 17:19:25 localhost dhcpd: Listening on LPF/ens33/00:0c:29:12:6c:14/10.0.0.0/24  # 再次确认dhcp用的是哪块网卡
Jun 26 17:19:25 localhost dhcpd: Sending on   LPF/ens33/00:0c:29:12:6c:14/10.0.0.0/24
Jun 26 17:19:25 localhost dhcpd: Sending on   Socket/fallback/fallback-net
Jun 26 17:19:25 localhost systemd: Started DHCPv4 Server Daemon. t

 

图片

安装tftp服务器

 

[root@localhost ~]# yum -y install tftp-server xinetd
[root@localhost ~]# vim /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
        disable = no          #开启tftp服务
        per_source = 11
        cps = 100 2
        flags = IPv4
}


[root@localhost ~]# systemctl start xinetd # 启动ftp服务
[root@localhost ~]# systemctl enable xinetd

 

图片

安装http服务

 

 

# 把光盘连接到服务器上,然后:
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# mkdir -p /var/www/html/CentOS7
[root@localhost ~]# mount /dev/cdrom /var/www/html/CentOS7
mount: block device /dev/sr0 is write-protected, mounting read-only
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl enable httpd

 

图片

准备预启动文件

 

[root@localhost ~]# cd /var/lib/tftpboot
[root@localhost tftpboot]# yum -y install syslinux # 为了得到pxelinux.0预启动文件
[root@localhost tftpboot]# cp /usr/share/syslinux/pxelinux.0 .
[root@localhost tftpboot]# ls
pxelinux.0

 

 

图片

配置default引导文件:

 

[root@localhost ~]# mkdir -p /var/lib/tftpboot/pxelinux.cfg

#把安装镜像里的引导文件拷贝过来,方便修改。注意,pxelinux.cfg/default这个相对路径和名称不能修改,因为他是pxelinux.0定义好的。
[root@localhost ~]# cp /var/www/html/CentOS7/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default   

# 拷贝其他引导文件
[root@localhost ~]# cp /var/www/html/CentOS7/isolinux/* /var/lib/tftpboot/

 

 


 

图片

确认http是否部署成功

 

查看http://10.0.0.61/CentOS7/如下

 

图片

使用curl也可以正确返回:

curl http://10.0.0.61/CentOS7/

 

 

图片

修改引导文件

 

[root@localhost ~]# cat /var/lib/tftpboot/pxelinux.cfg/default
default linux
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 clear7L, 247C 1,1           All
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

label linux
  menu label ^Install CentOS 7
  menu default
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=http://10.0.0.61/CentOS7/ inst.ks=http://10.0.0.61/ks_config/CentOS7-ks.cfg quiet

# 其余label全部删除
menu separator # insert an empty line


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


menu end

 

 

图片

准备自动应答文件

 

这个文件可以用这里的实例,也可以用你已经安装好的系统下的/root/anaconda-ks.cfg文件。
[root@localhost ~]# cd /var/www/html/

# 下面这个ks_config目录可以不创建,但是创建的ks文件放在哪,要和default文件中inst.ks配置项保持一致并且保证可以通过http访问到。
[root@localhost html]# mkdir ks_config
[root@localhost html]# cd ks_config/

# 生成密码
[root@localhost ks_config]# python -c 'import crypt; print(crypt.crypt("123456"))'
$6$UoRe81QPnOaqc5Yi$E7OL7FF6ez0QHqg2ZVuBgPZ/wdzywUwkjs2jZ0uwZw8/ISlp6E92tPlUcF3Ac3EmxXh46EHB7KV1DTVu.mtyX.

# 编辑kickstart文件。(根据root目录的anaconda-ks.cfg文件改写)
[root@m01 ks_config]# cat CentOS7-ks.cfg
install
url --url="http://10.0.0.61/CentOS7/"
text
lang en_US.UTF-8
keyboard us
zerombr
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet net.ifnames=0 biosdevname=0"
network --bootproto=dhcp --device=ens33 --onboot=yes --hostname=pxetest --activate
#network --bootproto=static --device=ens34 --ip=10.0.0.120 --netmask=255.255.255.0 --activate
#network --hostname=Cobbler
#network --bootproto=dhcp --device=eth1 --onboot=yes --noipv6 --hostname=CentOS7
timezone --utc Asia/Shanghai
authconfig --enableshadow --passalgo=sha512
rootpw --iscrypted $6$UoRe81QPnOaqc5Yi$E7OL7FF6ez0QHqg2ZVuBgPZ/wdzywUwkjs2jZ0uwZw8/ISlp6E92tPlUcF3Ac3EmxXh46EHB7KV1DTVu.mtyX. # 设置root用户的密码
clearpart --all --initlabel
part /boot --fstype xfs --size 1024
part swap --size 1024
part / --fstype xfs --grow
firstboot --disable
selinux --disabled
firewall --disabled
logging --level=info
reboot

%packages
@^minimal
@compat-libraries
@debugging
@development
tree
nmap
net-tools
iproute
telnet
wget
vim
bash-completion
%end

%post
echo "export PS1='[\u@\h \w]\$ '" >>/etc/profile
systemctl disable postfix.service
systemctl disable NetworkManager
%end

 

到此,pxe+kickstart环境全部搭建完成。

此时,创建一个空的虚拟机(至少2GB内存,如果报错,尝试调大内存后再测试),开机即可自动完成系统安装。

 

图片

错误解决:

 

 

https://bugzilla.redhat.com/show_bug.cgi?id=1595369

在安装新系统的时候会报错

 

93  342M   93  319M    0     0  4955k      0  0:01:10  0:01:06  0:00:04 3326k
[ 117.030748] dracut-initqueue[629]: curl: (23) Failed writing body (10176 != 16176)
[ 118.551988] dracut-initqueue[629]: mount: wrong fs type, bad option, bad superblock on /dev/loop0,
[ 118.553728] dracut-initqueue[629]: missing codepage or helper program, or other error
[ 118.557054] dracut-initqueue[629]: In some cases useful info is found in syslog - try
[ 118.558610] dracut-initqueue[629]: dmesg | tail or so.
[ 118.572160] dracut-initqueue[629]: umount: /run/initramfs/squashfs: not mounted
[ 118.607805] dracut-initqueue[629]: /lib/anaconda-lib.sh: line 110: printf: write error: No space left on device

 

解决办法:

调高虚拟机的内存,至少2GB。

 

自行练习:

自动化安装时,显示图形界面。

 

参考文档:

https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html-single/installation_guide/#chap-kickstart-installationshttps://www.linuxprobe.com/chapter-19.htmlhttps://www.zyops.com/autoinstall-kickstart/https://docs.centos.org/en-US/centos/install-guide/Kickstart2/#sect-kickstart-syntax

 

推荐阅读

干货 | PXE+kickstart无人值守批量装机(原理与架构)

ifconfig已淘汰,ip登场

Linux 云计算 学习路线(建议收藏)放后台的Linux任务没有了,试试这个命令

Linux 网络状态工具 ss 命令详解

这次终于搞明白VLAN技术了

终于有人把敏捷、DevOps、CI、CD讲清楚了

 

 

除每周二、四、六定期更新的《Linux云计算一站式教程》以外,其余时间雷哥会推送一些工作中遇到的小知识、实战经验总结的文章。后续都会收录在“实战经验”合集中。

图片

 


Cloud研习社 为Linux云计算零基础同学服务,致力于打造一套完整的linux云计算教程。包括新手学习路线、linux、存储、集群架构以及Docker,K8S,DevOps等 144篇原创内容 公众号

图片

 

 

收录于合集 #一站式教程  119个 上一篇干货 | PXE+kickstart无人值守批量装机(原理与架构)下一篇TCP/IP协议栈(1) 阅读 105 收藏此内容的人还喜欢   开源低代码企业应用平台Odoo-基础(4)-启用开发者模式   ... 老李物语 阅读 155 不看的原因   如何在 Linux 命令行中按大小对文件进行排序   ... TIAP 阅读 136 不看的原因   「开源」首个使用全响应式编程的企业级后台管理系统基础项目   ... 一飞开源 阅读 1041 不看的原因

标签:实战,--,cfg,ks,pxe,dhcpd,装机,root,localhost
来源: https://www.cnblogs.com/qiangfenger/p/16586026.html