使用Vmware+CentOS7搭建PXE网络安装服务
使用Vmware+CentOS7搭建PXE网络安装服务
PXE(Pre-boot Execution Environment)是由Intel设计,可以使计算机通过网络启动的协议。协议分为client和server两端,PXE client在网卡的ROM中,当计算机启动时,BIOS把PXE client调入内存执行,并显示出命令菜单,经用户选择后,PXE client将放置在远端的操作系统通过网络下载到本地运行。
一、PXE工作原理、工作流程图
工作原理3句话说清楚:
-
客户机开机选择 PXE 网络引导后,会去找 DHCP服务器 来获得本机 ip地址,同时获得一个 pxelinux.0 文件,运行它。
-
pxelinux.0文件运行后,会继续去读取一些菜单配置参数,然后显示菜单,让用户选择。
-
用户选中某一菜单项后,对应这一项的内容,会去加载不同的 vmlinuz和initrd.img文件,运行它们,这就完成开机进入系统了。
绘制详细的流程图如下,虽然步骤很多,同样是很清晰的。 Hugo使用Markdown写序列图(时序图)、流程图、甘特图
二、PXE网络安装服务、PXE远程装机、PXE启动无盘工作站的说明
2.1. 客户端必须具备
- 主板支持网络启动
- 网卡支持PXE协议
这2个通过开机进入BIOS设置,以及仔细查看开机显示的文字,可以检查是否有这些功能。 如果有任一项不具备,请离开本文。不用继续看了。
2.2. 服务器端需要准备这些
-
有 dhcp服务,当PXE Client请求时,告诉它 ip地址和 pxelinux.0 文件的下载地址
-
有 tFtp服务(注意是 TFTP服务,不是ftp)。 tFtp是非常古老的通讯协议了,但很遗憾,网卡的PXE启动只支持这一种通讯协议。
-
编写好开机菜单项配置,也就是 pxelinux.cfg配置
-
准备好你想要安装的系统的2个开机引导文件,大部分情况下,他们叫 vmlinuz 和 initrd.img,不同操作系统可能略有差别。
-
准备好要安装操作系统的完整安装镜像 .iso 文件。
2.3. 各个文件的下载方式
-
pxelinux.0 pxelinux.cfg menu.c32 这几个文件,是必须通过tFtp服务下载。
-
vmlinuz initrd.img 这几个文件,是由pxelinux.cfg菜单配置项来说明通过什么方式下载。
-
安装镜像.iso是大文件(几百或几千MB),最好是使用http,ftp,nfs,samba等方式下载。
2.4. 关于 gPXE 和 iPXE
tFtp实在太古老了,它非常非常非常的慢!只能用于类似PXE远程开机加载几个简单小文件的情况,详见wiki:TFTP协议。
应该尽量避免使用tFtp。
为了让老版本的PXE启动方式,能够使用HTTP方式,快速下载文件,先后发展出来了gPXE和iPXE网络启动方式。其实质就是用gpxelinux.0 或 ipxelinux.0 文件来代替 pxelinux.0 文件。但这两个都存在一些问题,比如不稳定,网卡兼容性不好,配置复杂。
gPXE已经没有维护了,iPXE目前仍在进行中,这是iPXE官网
2.5. 关于 lpxelinux.0
现在是2020年了,推荐的做法是使用官方的syslinux软件最新版本。从5.10版本开始,就原生支持HTTP和FTP方式,而其它配置参数项都不变。只需要用 lpxelinux.0 文件来代替 pxelinux.0 (最前面多了一个小写字母L)。详见Syslinux官网说明
但非常遗憾,CentOS 7.7自带的syslinux版本号还是4.05。所以本文使用的是 CentOS 8.1安装好syslinux 6.04版本,只需要将其中几个文件拷过来使用。 点击这里,下载所需的这几个文件。
2.6. 关于无盘工作站
计算机没有硬盘,没有软盘,没有光驱,没有U盘,没有任何本地存储设备。开机启动方式是PXE网络启动,通过预设好的程序,加载操作系统直接运行(不能安装操作系统,因为没有本地磁盘)。启动系统后,自动加载远程存储设备(通过NFS,Samba之类远程共享),运行指定程序。运算的中间过程,结果产物,也都存储到远程目录上。这就是无盘工作站,也叫无盘网络系统。
无盘网络系统可以应用在网络教室,企业内部局域网、网吧、酒店、点歌娱乐行业及一切无盘网络的组建和改造。
无盘工作站优点:
- (省钱)节省网络部署成本,网络施工系统安装工作时间缩短。
- (省事)易于管理和维护,可统一管理网络中的所有的机器,软件部署与版本更新可以集中完成,节省管理成本。
- (安全)在普通用户模式下,无盘工作站操作系统上所进行的操作,在重新启动后均会还原初始,可以防止病毒入侵与误操作破坏,节省维护成本。
三、安装和设置好全部需要用到的软件
为简化操作以及避免出错,这里使用Vmware+CentOS7.7来搭建一个专门的PXE网络安装服务器。
3.1. 安装虚拟机和CentOS系统
本文使用的具体环境
Windows 10专业版 1909,18363.778
VMware Workstation Pro 15.5.0
VMware 安装 CentOS 7.7,最小化安装,ip为: 192.168.1.32, hostname: pxecentos7
这里下载 CentOS 7.7 安装包ISO文件,942MB
注意Vmware创建新的虚拟机,其中虚拟机网络,要选择 【桥接模式】,这样其它机子才能访问到虚拟机。(NAT模式只有宿主机能够访问到虚拟机,达不到PXE网络安装需要)
3.2. 关闭防火墙
永久关闭掉防火墙 和 SELINUX,这只是一个虚拟机,专门用来做PXE服务的。不需要这些防护,平常不用的时候,应该关掉这台虚拟机。
systemctl disable firewalld
systemctl stop firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
3.3. 安装全部需要用到的软件
安装所需软件包
yum -y install dhcp xinetd tftp-server tftp syslinux httpd samba samba-client nfs-utils rpcbind net-tools wget unzip
如果你使用yum速度很慢,请参考 安装完CentOS后必做设置-使用国内yum源加速
补充说明:在CentOS 8.x上面,没有 dhcp
安装包,它拆分为2个包,改名了,叫做 dhcp-server
dhcp-server.x86_64 : Provides the ISC DHCP server
dhcp-client.x86_64 : Provides the ISC DHCP client daemon and dhclient-script
3.4. 设置dhcp服务
vi /etc/dhcp/dhcpd.conf
添加如下内容
# 1. 整体的环境设定 其中192.168.1.32是本机IP地址
ddns-update-style none;
ignore client-updates;
default-lease-time 259200;
max-lease-time 518400;
option domain-name-servers 192.168.1.32;
# 2. 关于动态分配的 IP ,
# 其中192.168.1.32是本机IP地址
# 192.168.1.0 netmask 255.255.255.0是服务器所在的内网网段及子网掩码
# range 192.168.1.160 192.168.1.199 是可用的DHCP地址池范围
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.160 192.168.1.199;
option routers 192.168.1.32;
option subnet-mask 255.255.255.0;
# 指定去找哪一台服务下载文件,这里设置为本机相同IP
next-server 192.168.1.32;
# 这里使用带小写字母L开头的这个文件
filename "lpxelinux.0";
}
启动dhcp服务
systemctl enable dhcpd
systemctl start dhcpd
3.5. 设置tFtp服务
tFtp服务需要由xinetd服务来启动,这里需要修改 /etc/xinetd.d/tftp
文件,编辑disable = yes这一行,修改为 disable = no
sed -i 's@disable[\t ]*= yes@disable\t\t\t= no@g' /etc/xinetd.d/tftp
如果你发现根本不存在 /etc/xinetd.d/tftp
这个文件,那就手动创建它,这是完整文件内容
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
启动tFtp服务
systemctl enable xinetd
systemctl enable tftp
systemctl start xinetd
systemctl start tftp
tFtp文件存放位置为 /var/lib/tftpboot
3.6. 设置http服务
http直接使用安装完成后的默认配置就好,不用修改任何文件,可以直接启动http服务
systemctl enable httpd
systemctl start httpd
这样就能够访问 http://192.168.1.32
网站了,对应的web文件存放位置为 /var/www/html/
3.7. 设置NFS服务
Ubuntu,Deepin这些Debian系的只能使用NFS方式安装,如果你不需要设置安装这些系统,那可以跳过本节。
NFS服务只有一个配置文件,也不需要设置用户名密码什么的。
直接vi /etc/exports
添加以下内容,这里假设所有系统的安装文件都在/var/www/html/
各自的子目录下,设置为任何ip都可读。
/var/www/html/ubuntu1810 *(ro)
/var/www/html/ubuntu18044 *(ro)
/var/www/html/ubuntu2004 *(ro)
/var/www/html/deepin20b *(ro)
/var/www/html/proxmox *(ro)
这就可以启动NFS服务了
systemctl start rpcbind
systemctl start nfs-server
systemctl enable rpcbind
systemctl enable nfs-server
NFS服务更详细的安装与使用,可以参考 Windows访问CentOS搭建的NFS文件共享服务
3.8. 设置Samba服务
如果需要通过PXE远程安装Windows,就继续配置 Samba服务,如果只是安装Linux(CentOS/Ubuntu之类),可以跳过这一段设置。
修改配置文件
vi /etc/samba/smb.conf
删除掉原来全部内容,复制以下内容:
[global]
workgroup = WORKGROUP
server string = Samba Server Version %v
log file = /var/log/samba/log.%m
max log size = 50
map to guest = Bad User
passdb backend = tdbsam
security = USER
guest account = nobody
public = Yes
dns proxy = No
nt acl support = No
kernel oplocks = no
# hosts allow=192.168.1.0/255.255.255.0
[windows10]
comment = Windows 10 1909 Image
level2 oplocks = No
locking = No
oplocks = No
path = /mnt/windows10
read only = No
假设已经下载好Windows10的iso安装文件,并且放在 /mnt/hgfs/
目录下,需要加载它。
mkdir /mnt/windows10
mount -o loop /mnt/hgfs/Windows10-1909.iso /mnt/windows10
其它比如 Win 7, Win 8 之类系统,参考上面做相应修改。
Samba服务更详细的安装与使用,可以参考 Windows访问CentOS搭建的Samba文件共享服务
四、PXE网络安装服务(PXE远程装机)安装步骤
4.1. 下载文件
CentOS 8.1安装好syslinux 6.04版本,只需要将其中几个文件拷过来使用。 点击这里,下载所需的这几个文件。
里面包括有 lpxelinux.0
,menu.c32
,ldlinux.c32
,libutil.c32
,memdisk
这几个PXE引导需要用的文件。文件都很小,不嫌麻烦也可以自己找台 CentOS8系统的机子自己弄。
wget https://odinxu.com/res/syslinux/syslinux604files.tar.gz
tar xzf syslinux604files.tar.gz
cp syslinux604files/* /var/lib/tftpboot/
4.2. 编辑PXE启动菜单
mkdir /var/lib/tftpboot/pxelinux.cfg
vi /var/lib/tftpboot/pxelinux.cfg/default
客户机通过PXE引导后,显示的操作菜单内容,全部都是在这个配置文件中的。
这里先附上完整配置内容: (OdinXu验证以下配置真实可用,验证时间:2020-04-30)
DEFAULT menu.c32
PROMPT 0
TIMEOUT 600
ONTIMEOUT local
MENU title ############ PXE Boot Menu ############
LABEL 1
MENU label ^1) Install CentOS 7.8 x64 with HTTP
KERNEL http://192.168.1.32/centos7/images/pxeboot/vmlinuz
APPEND initrd=http://192.168.1.32/centos7/images/pxeboot/initrd.img method=http://192.168.1.32/centos7 devfs=nomount
LABEL 2
MENU label ^2) Install CentOS 8.1 x64 with HTTP
KERNEL http://192.168.1.32/centos8/images/pxeboot/vmlinuz
APPEND initrd=http://192.168.1.32/centos8/images/pxeboot/initrd.img method=http://192.168.1.32/centos8 devfs=nomount
LABEL 3
MENU label ^3) Install Ubuntu 18.04.4 LTS x64 with NFS
KERNEL http://192.168.1.32/ubuntu18044/casper/vmlinuz
INITRD http://192.168.1.32/ubuntu18044/casper/initrd
APPEND ip=dhcp boot=casper automatic-ubiquity netboot=nfs nfsroot=192.168.1.32:/var/www/html/ubuntu18044
LABEL 4
MENU label ^4) Install Ubuntu 20.04 LTS x64 with NFS
KERNEL http://192.168.1.32/ubuntu2004/casper/vmlinuz
INITRD http://192.168.1.32/ubuntu2004/casper/initrd
APPEND ip=dhcp boot=casper automatic-ubiquity netboot=nfs nfsroot=192.168.1.32:/var/www/html/ubuntu2004
LABEL 5
MENU label ^5) Install Deepin 20.0 Beta x64 with NFS
KERNEL http://192.168.1.32/deepin20b/live/vmlinuz
INITRD http://192.168.1.32/deepin20b/live/initrd.lz
APPEND ip=dhcp boot=live automatic-ubiquity netboot=nfs nfsroot=192.168.1.32:/var/www/html/deepin20b
LABEL 6
MENU label ^6) Install Proxmox-VE with HTTP
KERNEL http://192.168.1.32/proxmox-pxeboot/linux26
INITRD http://192.168.1.32/proxmox-pxeboot/initrd.iso.img
APPEND vga=791 video=vesafb:ywrap,mtrr ramdisk_size=16777216 rw live-installer/net-image=http://192.168.1.32/proxmox/boot/pve-base.squashfs
LABEL 7
MENU label ^7) Boot to Win8PE with HTTP
KERNEL http://192.168.1.32/memdisk
APPEND initrd=http://192.168.1.32/LMT8x64.ISO iso raw
LABEL local
MENU label ^0) Boot from local disk
LOCALBOOT 0
上面的配置说明: 其中CentOS是使用 HTTP安装的,而Ubuntu,Deepin这些Debian系的只能使用NFS方式安装(为什么?别问我,我也不知道。反正这样设置就能安装成功。)
Windows的安装,没办法直接进入安装界面,这里的办法是加载WinPE,成功引导进入PE系统后,再在里面操作安装Windows。这也是为什么前面必须配置Samba的原因,具体操作继续看文章后面。
最后一项配置,是引导本地硬盘。
如果PXE引导成功,你应该能够看到菜单长这个样子:
4.3. 准备各个系统安装盘
假设已经下载好的各个系统的iso安装文件,全部放在 /mnt/hgfs/
目录下,需要加载它。
mkdir /var/www/html/centos7
mount -o loop /mnt/hgfs/CentOS-7-x86_64-Minimal-2003.iso /var/www/html/centos7
mkdir /var/www/html/centos8
mount -o loop /mnt/hgfs/CentOS-8.1.1911-x86_64-dvd1.iso /var/www/html/centos8
mkdir /var/www/html/ubuntu18044
mount -o loop /mnt/hgfs/ubuntu-18.04.4-desktop-amd64.iso /var/www/html/ubuntu18044
mkdir /var/www/html/ubuntu2004
mount -o loop /mnt/hgfs/ubuntu-20.04-live-server-amd64.iso /var/www/html/ubuntu2004
mkdir /var/www/html/deepin20b
mount -o loop /mnt/hgfs/deepin-20Beta-desktop-amd64.iso /var/www/html/deepin20b
mkdir /mnt/windows10
mount -o loop /mnt/hgfs/Windows10-1909.iso /mnt/windows10
4.4. 准备WinPE
自己制作WinPE.iso 相对麻烦些,直接拿个现成的吧。 我这里用的是 老毛桃U盘装机软件,在Windows电脑,下载软件(大概500多MB)安装好。之后就可以到安装目录里,看到有2个WinPE的 .iso 镜像文件。
LMT8x64.ISO
LMT2003.ISO
带8的那个是 Win8 PE系统,而且还集成了一些其它软件在里面,正好方便我们使用。将LMT8x64.ISO
文件拷到/var/www/html/
目录下放好。
OK,这样就能够PXE启动进入WinPE了。
4.5. 微软官方Windows10安装文件
网上一大堆的Ghost安装盘,绿色的,电脑公司的,Windows之家的,xx花园的,这些乱七八糟的安装盘,都不建议使用。
我们可以直接到微软官网下载最最新的版本。而且速度还非常快。
-
从微信官网,下载 MediaCreationTool 工具,大概 18MB https://www.microsoft.com/zh-cn/software-download/windows10
-
运行它,选择保存到iso文件,他会自动下载最新版本的Win10 ISO文件保存到本地。
最终得到的 .iso 文件,大概 4GB。正好给前面的 Samba 使用。
4.6. 安装Windows10
从PXE开机菜单,进入Win8PE后,显示是这样子的:
直接关闭老毛桃装机工具,这里我们不使用这个软件,以避免被强制安装流氓软件。
打开桌面上的 【DiskGenius分区工具】,按你需要的规格分好区,格式化好硬盘。
打开运行,输入以下命令,挂载smb共享到z盘 (其它M盘K盘什么的都行)
net use z: \\192.168.1.32\windows10
挂载成功后,之前我们设置的Samba共享,里面的内容,就会成为Win8PE里面的Z:盘(网络盘)。
接着,打开桌面上的 【WinNTSetup】,如下图所示步骤,选择 Z:\sources\install.esd
文件,再选择安装到 C: 盘,选择安装 “Windows 10 专业版”,点右下角的“开始安装”。
等全部文件安装完成后,重启,从硬盘启动,按Windows 10的开机设置操作就行。
相关资源下载
CentOS 7.8 最小化安装 CentOS-7-x86_64-Minimal-2003.iso 1.01GB
CentOS 8.1 启动盘(不带安装包) CentOS-8.1.1911-x86_64-boot.iso 597 MB
CentOS 8.1 DVD完整安装 CentOS-8.1.1911-x86_64-dvd1.iso 7.03 GB
Ubuntu 18.04.4 LTS ubuntu-18.04.4-desktop-amd64.iso 1.98 GB
Ubuntu 20.04 LTS ubuntu-20.04-desktop-amd64.iso 2.53GB
Deepin 20.beta 很好用的国产Linux系统 deepin-20Beta-desktop-amd64.iso 1.97 GB