使用Vmware+CentOS7搭建PXE网络安装服务

使用Vmware+CentOS7搭建PXE网络安装服务

PXE(Pre-boot Execution Environment)是由Intel设计,可以使计算机通过网络启动的协议。协议分为client和server两端,PXE client在网卡的ROM中,当计算机启动时,BIOS把PXE client调入内存执行,并显示出命令菜单,经用户选择后,PXE client将放置在远端的操作系统通过网络下载到本地运行。

一、PXE工作原理、工作流程图

工作原理3句话说清楚:

  1. 客户机开机选择 PXE 网络引导后,会去找 DHCP服务器 来获得本机 ip地址,同时获得一个 pxelinux.0 文件,运行它。

  2. pxelinux.0文件运行后,会继续去读取一些菜单配置参数,然后显示菜单,让用户选择。

  3. 用户选中某一菜单项后,对应这一项的内容,会去加载不同的 vmlinuz和initrd.img文件,运行它们,这就完成开机进入系统了。

绘制详细的流程图如下,虽然步骤很多,同样是很清晰的。 Hugo使用Markdown写序列图(时序图)、流程图、甘特图

sequenceDiagram participant DHCP_Server participant PXE_Client participant TFTP_Server rect rgba(100, 100, 220, .3) PXE_Client ->> DHCP_Server: 请求IP地址 DHCP_Server ->> DHCP_Server: 是来自PXE请求吗? DHCP_Server ->> PXE_Client: 返回IP地址和bootstrap的位置 end rect rgba(200, 0, 255, .3) PXE_Client ->> TFTP_Server: 请求传送bootstrap(pxelinux.0) TFTP_Server -->> PXE_Client: 同意指定传输块大小(blksize)? PXE_Client -->> TFTP_Server: 同意 TFTP_Server ->> PXE_Client: 发送 pxelinux.0 PXE_Client ->> PXE_Client: 执行 pxelinux.0 end rect rgba(0, 200, 255, .1) PXE_Client ->> TFTP_Server: 请求传送配置文件 pxelinux.cfg TFTP_Server ->> PXE_Client : 发送配置文件 PXE_Client ->> PXE_Client: 读配置文件 PXE_Client ->> TFTP_Server: 请求传送menu.c32等各种文件 TFTP_Server ->> PXE_Client : 发送menu.c32 end Note over PXE_Client,TFTP_Server: 显示pxelinux.cfg中设定好的菜单选项 Note over PXE_Client,TFTP_Server: 用户根据菜单选择其中一项 rect rgba(200, 50, 50, .5) PXE_Client ->> TFTP_Server: 请求传送Linux内核 vmlinuz TFTP_Server ->> PXE_Client : 发送 vmlinuz PXE_Client ->> TFTP_Server: 请求传送Linux初始系统 initrd.img TFTP_Server ->> PXE_Client : 发送 initrd.img PXE_Client ->> PXE_Client: 启动Linux系统(带参数) end

二、PXE网络安装服务、PXE远程装机、PXE启动无盘工作站的说明

2.1. 客户端必须具备

  1. 主板支持网络启动
  2. 网卡支持PXE协议

这2个通过开机进入BIOS设置,以及仔细查看开机显示的文字,可以检查是否有这些功能。 如果有任一项不具备,请离开本文。不用继续看了。

2.2. 服务器端需要准备这些

  1. 有 dhcp服务,当PXE Client请求时,告诉它 ip地址和 pxelinux.0 文件的下载地址

  2. 有 tFtp服务(注意是 TFTP服务,不是ftp)。 tFtp是非常古老的通讯协议了,但很遗憾,网卡的PXE启动只支持这一种通讯协议。

  3. 编写好开机菜单项配置,也就是 pxelinux.cfg配置

  4. 准备好你想要安装的系统的2个开机引导文件,大部分情况下,他们叫 vmlinuz 和 initrd.img,不同操作系统可能略有差别。

  5. 准备好要安装操作系统的完整安装镜像 .iso 文件。

2.3. 各个文件的下载方式

  1. pxelinux.0 pxelinux.cfg menu.c32 这几个文件,是必须通过tFtp服务下载。

  2. vmlinuz initrd.img 这几个文件,是由pxelinux.cfg菜单配置项来说明通过什么方式下载。

  3. 安装镜像.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之类远程共享),运行指定程序。运算的中间过程,结果产物,也都存储到远程目录上。这就是无盘工作站,也叫无盘网络系统。

无盘网络系统可以应用在网络教室,企业内部局域网、网吧、酒店、点歌娱乐行业及一切无盘网络的组建和改造。

无盘工作站优点:

  1. (省钱)节省网络部署成本,网络施工系统安装工作时间缩短。
  2. (省事)易于管理和维护,可统一管理网络中的所有的机器,软件部署与版本更新可以集中完成,节省管理成本。
  3. (安全)在普通用户模式下,无盘工作站操作系统上所进行的操作,在重新启动后均会还原初始,可以防止病毒入侵与误操作破坏,节省维护成本。

三、安装和设置好全部需要用到的软件

为简化操作以及避免出错,这里使用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引导后,显示的操作菜单内容,全部都是在这个配置文件中的。

Syslinux官方的配置文件参数说明

这里先附上完整配置内容: (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引导成功,你应该能够看到菜单长这个样子:

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花园的,这些乱七八糟的安装盘,都不建议使用。

我们可以直接到微软官网下载最最新的版本。而且速度还非常快。

  1. 从微信官网,下载 MediaCreationTool 工具,大概 18MB https://www.microsoft.com/zh-cn/software-download/windows10

  2. 运行它,选择保存到iso文件,他会自动下载最新版本的Win10 ISO文件保存到本地。 制作微软官方Windows10安装文件

最终得到的 .iso 文件,大概 4GB。正好给前面的 Samba 使用。

4.6. 安装Windows10

从PXE开机菜单,进入Win8PE后,显示是这样子的:

从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 专业版”,点右下角的“开始安装”。

在Win8PE中安装Windows10

在Win8PE中安装Windows10

等全部文件安装完成后,重启,从硬盘启动,按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

其它相关文章:

CentOS访问Windows10的共享目录

Windows访问CentOS搭建的Samba文件共享服务

Windows访问CentOS搭建的NFS文件共享服务

在VMWARE虚拟机中使用宿主机的共享目录