使用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写序列图(时序图)、流程图、甘特图
image.png

二、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. 各个文件的下载方式

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

  7. vmlinuz initrd.img 这几个文件,是由pxelinux.cfg菜单配置项来说明通过什么方式下载。
  8. 安装镜像.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之类远程共享),运行指定程序。运算的中间过程,结果产物,也都存储到远程目录上。这就是无盘工作站,也叫无盘网络系统。
    无盘网络系统可以应用在网络教室,企业内部局域网、网吧、酒店、点歌娱乐行业及一切无盘网络的组建和改造。
    无盘工作站优点:

  9. (省钱)节省网络部署成本,网络施工系统安装工作时间缩短。

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

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

    为简化操作以及避免出错,这里使用Vmware+CentOS7.7来搭建一个专门的PXE网络安装服务器。

    3.1. 安装虚拟机和CentOS系统

    本文使用的具体环境
    1. Windows 10专业版 190918363.778
    2. VMware Workstation Pro 15.5.0
    3. 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](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 memdisk INITRD http://172.21.9.87/Win8PE.iso APPEND iso raw

LABEL local MENU label ^0) Boot from local disk LOCALBOOT 0

上面的配置说明: 其中CentOS是使用 HTTP安装的,而Ubuntu,Deepin这些Debian系的只能使用NFS方式安装(为什么?别问我,我也不知道。反正这样设置就能安装成功。)<br />Windows的安装,没办法直接进入安装界面,这里的办法是加载WinPE,成功引导进入PE系统后,再在里面操作安装Windows。这也是为什么前面必须配置Samba的原因,具体操作继续看文章后面。<br />最后一项配置,是引导本地硬盘。<br />如果PXE引导成功,你应该能够看到菜单长这个样子:<br />![](https://cdn.nlark.com/yuque/0/2021/png/449800/1611023497219-9584452f-9e55-44bf-a898-b8cd939dcd57.png#align=left&display=inline&height=333&margin=%5Bobject%20Object%5D&originHeight=333&originWidth=556&size=0&status=done&style=none&width=556)
<a name="RXflb"></a>
## 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

<a name="RJ7TD"></a>
## 4.4. 准备WinPE
自己制作WinPE.iso 相对麻烦些,直接拿个现成的吧。 我这里用的是 老毛桃U盘装机软件,在Windows电脑,下载软件(大概500多MB)安装好。之后就可以到安装目录里,看到有2个WinPE的 .iso 镜像文件。

LMT8x64.ISO LMT2003.ISO

带8的那个是 Win8 PE系统,而且还集成了一些其它软件在里面,正好方便我们使用。将`LMT8x64.ISO`文件拷到`/var/www/html/`目录下放好。<br />OK,这样就能够PXE启动进入WinPE了。
<a name="szT02"></a>
## 4.5. 微软官方Windows10安装文件
网上一大堆的Ghost安装盘,绿色的,电脑公司的,Windows之家的,xx花园的,这些乱七八糟的安装盘,都不建议使用。<br />我们可以直接到微软官网下载最最新的版本。而且速度还非常快。

1. 从微信官网,下载 MediaCreationTool 工具,大概 18MB [https://www.microsoft.com/zh-cn/software-download/windows10](https://www.microsoft.com/zh-cn/software-download/windows10)<br />
1. 运行它,选择保存到iso文件,他会自动下载最新版本的Win10 ISO文件保存到本地。![](https://cdn.nlark.com/yuque/0/2021/png/449800/1611023497959-a9291803-358c-4220-b222-b00c32626be7.png#align=left&display=inline&height=546&margin=%5Bobject%20Object%5D&originHeight=546&originWidth=697&size=0&status=done&style=none&width=697)<br />

最终得到的 .iso 文件,大概 4GB。正好给前面的 Samba 使用。
<a name="Wdd80"></a>
## 4.6. 安装Windows10
从PXE开机菜单,进入Win8PE后,显示是这样子的:<br />![](https://cdn.nlark.com/yuque/0/2021/png/449800/1611023497227-4693ba29-62d2-46cf-8e2c-3d71fbe53abb.png#align=left&display=inline&height=634&margin=%5Bobject%20Object%5D&originHeight=634&originWidth=965&size=0&status=done&style=none&width=965)<br />直接关闭老毛桃装机工具,这里我们不使用这个软件,以避免被强制安装流氓软件。<br />打开桌面上的 【DiskGenius分区工具】,按你需要的规格分好区,格式化好硬盘。<br />打开运行,输入以下命令,挂载smb共享到z盘 (其它M盘K盘什么的都行)

net use z: \192.168.1.32\windows10 `` 挂载成功后,之前我们设置的Samba共享,里面的内容,就会成为Win8PE里面的Z:盘(网络盘)。<br />接着,打开桌面上的 【WinNTSetup】,如下图所示步骤,选择Z:\sources\install.esd` 文件,再选择安装到 C: 盘,选择安装 “Windows 10 专业版”,点右下角的“开始安装”。
使用Vmware CentOS7搭建PXE网络安装服务 - 图2
使用Vmware CentOS7搭建PXE网络安装服务 - 图3
等全部文件安装完成后,重启,从硬盘启动,按Windows 10的开机设置操作就行。