PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端基本软件设置,从而引导预先安装在服务器中的终端操作系统。PXE可以引导多种操作系统,如:Windows95/98/2000/windows2003/windows2008/win7/win8,linux等。
1. 系统环境介绍
虚拟机软件:VirtualBox
虚拟机网络连接方式:仅主机(Host-Only)网络
配置服务:DHCP+TFTP+FTP(也可以使用HTTP、NFS等)
完成目标:搭建pxe环境,结合kickstart响应文件,完成CentOS 7系统的自动化安装。
1.1 服务器及引导文件介绍
-
主要文件
系统安装时,由引导文件加载内核文件后才可以看到系统安装界面。
-
pxelinux.0 - 系统引导文件
-
vmlinuz、initrd.img - 内核文件
-
-
DHCP 服务器
为客户端提供必要的网络信息,如IP、netmask、gateway、dns等,并向客户端提供引导文件(pxelinux.0)的位置及TFTP服务器地址等。
-
TFTP 服务器
主要为客户端提供内核文件和引导文件。
-
FTP 服务器
为客户端提供kickstart响应文件和系统镜像文件。
pxe系统安装时,首先由dhcp服务器向客户端提供IP、引导文件位置、tftp地址等信息,客户端获取相关信息后,通过TFTP下载引导文件和内核文件,引导系统启动,并通过ftp服务器下载系统安装过程中所需的各项软件包和kickstart响应文件。
kickstart响应文件主要用来自动设置时区、密码、系统分区、软件包选择等信息。
1.2 服务端详细环境
详细系统环境为:
[root@pxe1 ~]# uname -a Linux pxe1 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux [root@pxe1 ~]# [root@pxe1 ~]# hostnamectl Static hostname: pxe1 Icon name: computer-vm Chassis: vm Machine ID: 18ef8dea83044565b82bf6bed368cdab Boot ID: 9beedf23c4e14016a0a458ddcd9c487b Virtualization: kvm Operating System: CentOS Linux 7 (Core) CPE OS Name: cpe:/o:centos:centos:7 Kernel: Linux 3.10.0-514.el7.x86_64 Architecture: x86-64 [root@pxe1 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.56.14 pxe1 [root@pxe1 yum.repos.d]# ifconfig enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.56.14 netmask 255.255.255.0 broadcast 192.168.56.255 inet6 fe80::a00:27ff:fe43:c11d prefixlen 64 scopeid 0x20<link> ether 08:00:27:43:c1:1d txqueuelen 1000 (Ethernet) RX packets 1441 bytes 121057 (118.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 928 bytes 98905 (96.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ...
1.3 服务端初始环境准备
关闭SELinux和防火墙:
# 为了后续配置方便,首先关闭系统SELinux和防火墙 # 关闭SELinux,修改文件使SELINUX=disabled [root@pxe1 ~]# vim /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted #重启系统后配置生效,查看SELinux的状态。 [root@pxe1 ~]# sestatus SELinux status: disabled #关闭防火墙 [root@pxe1 ~]# systemctl stop firewalld [root@pxe1 ~]# systemctl disable firewalld [root@pxe1 ~]# 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)
1.4 客户端环境准备
在VirtualBox中新建linux虚拟机:
-
名称:随便填写
-
类型:linux
-
虚拟硬盘:
现在创建虚拟硬盘,注意分配足够的硬盘大小,避免因硬盘空间不足造成安装失败。我这里选择20G,动态分配。
-
开机启动顺序:网络启动排第一位。
设置方法:选中新建虚拟机,设置--系统--主板--启动顺序--设置网络为第一位
-
网络:仅主机(Host-Only)网络
设置方法:选中新建虚拟机,设置--网络--网卡1--启用网络连接--连接方式:Host-Only
2. 配置yum源
这里主要介绍使用系统光盘配置本地yum源的方法。
首先挂载系统光盘:
在虚拟机右下角单击光盘图标,选择需要挂载的系统镜像文件。
创建yum源配置文件:
# 首先将光盘挂载到/mnt目录下 [root@pxe1 ~]# umount /dev/cdrom -l [root@pxe1 ~]# mount /dev/cdrom /mnt/ mount: /dev/sr0 is write-protected, mounting read-only #创建yum配置文件 [root@pxe1 ~]# cd /etc/yum.repos.d/ [root@pxe1 yum.repos.d]# ls CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Sources.repo CentOS-fasttrack.repo CentOS-CR.repo CentOS-Media.repo CentOS-Vault.repo #避免系统中的repo文件影响,首先将其备份 [root@pxe1 yum.repos.d]# mkdir bak [root@pxe1 yum.repos.d]# mv *.repo bak/ [root@pxe1 yum.repos.d]# ls bak [root@pxe1 yum.repos.d]# vim my.repo [development] <--注意:这里一定要写development name=my-centos7-dvd baseurl=file:///mnt enabled=1 gpgcheck=0
注意:my.repo文件中第一行[development],中括号中建议填写development
,填写其他内容会导致后面system-config-kickstart命令生成kickstart文件文件时,出现以下问题:
由于下载软件包信息失败,软件包选择被禁止
创建yum缓存:
[root@pxe1 yum.repos.d]# yum clean all Failed to set locale, defaulting to C Loaded plugins: fastestmirror, langpacks Cleaning repos: development Cleaning up everything [root@pxe1 yum.repos.d]# yum makecache Failed to set locale, defaulting to C Loaded plugins: fastestmirror, langpacks development | 3.6 kB 00:00:00 (1/4): development/filelists_db | 3.0 MB 00:00:00 (2/4): development/group_gz | 155 kB 00:00:00 (3/4): development/other_db | 1.3 MB 00:00:00 (4/4): development/primary_db | 3.0 MB 00:00:00 Determining fastest mirrors Metadata Cache Created
3. DHCP服务器配置
dhcp为客户端提供必要的网络信息,如IP、netmask、gateway、dns等,并向客户端提供引导文件(pxelinux.0)的位置及TFTP服务器地址等。
3.1 安装dhcp软件包
[root@pxe1 yum.repos.d]# yum install -y dhcp ... Installed: dhcp.x86_64 12:4.2.5-47.el7.centos Complete!
3.2 修改dhcp配置文件
dhcp配置文件位置:/etc/dhcp/dhcpd.conf
[root@pxe1 yum.repos.d]# cat /etc/dhcp/dhcpd.conf # # DHCP Server Configuration file. # see /usr/share/doc/dhcp*/dhcpd.conf.example # see dhcpd.conf(5) man page subnet 192.168.56.0 netmask 255.255.255.0 { range 192.168.56.10 192.168.56.20; default-lease-time 600; max-lease-time 7200; filename "pxelinux.0"; next-server 192.168.56.14; } # subnet 192.168.56.0 netmask 255.255.255.0 服务端IP网段及掩码 # range 192.168.56.10 192.168.56.20; dhcp分发的地址范围,最好将本机IP包含在内。 # default-lease-time 600;max-lease-time 7200; IP地址租约时间。 # filename "pxelinux.0"; 指定引导文件位置,这里是TFTP根目录下的pxelinux.0。 # next-server 192.168.56.14; TFTP服务器地址。
3.3 启动dhcp服务
[root@pxe1 yum.repos.d]# systemctl restart dhcpd [root@pxe1 yum.repos.d]# systemctl enable dhcpd Created symlink from /etc/systemd/system/multi-user.target.wants/dhcpd.service to /usr/lib/systemd/system/dhcpd.service. [root@pxe1 yum.repos.d]# systemctl status dhcpd ● dhcpd.service - DHCPv4 Server Daemon Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2017-05-25 11:00:26 CST; 26s ago Docs: man:dhcpd(8) man:dhcpd.conf(5) Main PID: 11849 (dhcpd) Status: "Dispatching packets..." CGroup: /system.slice/dhcpd.service └─11849 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid May 25 11:00:26 pxe1 dhcpd[11849]: No subnet declaration for virbr0 (192.168.122.1). May 25 11:00:26 pxe1 dhcpd[11849]: ** Ignoring requests on virbr0. If this is not what May 25 11:00:26 pxe1 dhcpd[11849]: you want, please write a subnet declaration May 25 11:00:26 pxe1 dhcpd[11849]: in your dhcpd.conf file for the network segment May 25 11:00:26 pxe1 dhcpd[11849]: to which interface virbr0 is attached. ** May 25 11:00:26 pxe1 dhcpd[11849]: May 25 11:00:26 pxe1 dhcpd[11849]: Listening on LPF/enp0s3/08:00:27:43:c1:1d/192.168.56.0/24 May 25 11:00:26 pxe1 dhcpd[11849]: Sending on LPF/enp0s3/08:00:27:43:c1:1d/192.168.56.0/24 May 25 11:00:26 pxe1 dhcpd[11849]: Sending on Socket/fallback/fallback-net May 25 11:00:26 pxe1 systemd[1]: Started DHCPv4 Server Daemon. [root@pxe1 yum.repos.d]# netstat -nulp | grep dhcp udp 0 0 0.0.0.0:67 0.0.0.0:* 11849/dhcpd udp 0 0 0.0.0.0:16465 0.0.0.0:* 11849/dhcpd udp6 0 0 :::31651 :::* 11849/dhcpd
注意:如果启动dhcp服务报错,请查看
/var/log/messages
日志,会有明显的错误提示,多数是配置文件格式或内容错误造成的。
3.4 验证DHCP服务配置
dhcp服务器配置完成后,便可启动之前准备的客户端虚拟机查看是否可以获取到IP地址,能正常获取IP则说明配置正常,如下:
至此,dhcp服务器配置完成。
4. TFTP服务器配置
TFTP服务器主要为客户端提供内核文件和引导文件。
4.1 安装TFTP服务器
安装方法:
[root@pxe1 /]# yum install -y tftp-server ... Installed: tftp-server.x86_64 0:5.2-13.el7 Complete! # 安装tftp命令,可用来测试TFTP服务能否正常运行 [root@pxe1 /]# yum install -y tftp
4.2 启动TFTP服务器
# 编辑配置文件/etc/xinetd.d/tftp [root@pxe1 /]# vim /etc/xinetd.d/tftp disable = no <--将yes修改为no
启动tftp服务:
# 首先确保tftp.socket正常 [root@pxe1 /]# systemctl start tftp.socket [root@pxe1 /]# systemctl enable tftp.socket Created symlink from /etc/systemd/system/sockets.target.wants/tftp.socket to /usr/lib/systemd/system/tftp.socket. [root@pxe1 /]# systemctl status tftp.socket ● tftp.socket - Tftp Server Activation Socket Loaded: loaded (/usr/lib/systemd/system/tftp.socket; enabled; vendor preset: disabled) Active: active (listening) since 四 2017-05-25 14:57:33 CST; 1h 0min ago Listen: [::]:69 (Datagram) 5月 25 14:57:33 pxe1 systemd[1]: Listening on Tftp Server Activation Socket. 5月 25 14:57:33 pxe1 systemd[1]: Starting Tftp Server Activation Socket. # 然后启动tftp.service [root@pxe1 ~]# systemctl restart tftp.service [root@pxe1 ~]# systemctl enable tftp.service Created symlink from /etc/systemd/system/sockets.target.wants/tftp.socket to /usr/lib/systemd/system/tftp.socket. [root@pxe1 ~]# systemctl status tftp.service ● tftp.service - Tftp Server Loaded: loaded (/usr/lib/systemd/system/tftp.service; indirect; vendor preset: disabled) Active: active (running) since 四 2017-05-25 14:57:33 CST; 20s ago Docs: man:in.tftpd Main PID: 14621 (in.tftpd) CGroup: /system.slice/tftp.service └─14621 /usr/sbin/in.tftpd -s /var/lib/tftpboot 5月 25 14:57:33 pxe1 systemd[1]: Started Tftp Server. 5月 25 14:57:33 pxe1 systemd[1]: Starting Tftp Server...
4.3 导入必要文件
需要导入TFTP服务器的主要文件有:
-
引导文件 - pxelinux.0
-
内核文件:vmlinuz initrd.img
-
引导菜单:isolinux.cfg -- 开机后选择启动项的菜单文件
4.3.1 导入引导文件
引导文件pxelinux.0由软件包syslinux生成,首先要安装syslinux软件包:
[root@pxe1 ~]# yum install -y syslinux # 将pxelinux.0拷贝至TFTP根目录下 [root@pxe1 ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
4.3.2 导入内核及菜单文件
内核文件:vmlinuz initrd.img,一般存在于系统光盘的pxeboot目录下:
[root@pxe1 syslinux]# cd /mnt/images/pxeboot/ [root@pxe1 pxeboot]# ls initrd.img TRANS.TBL vmlinuz
但是我们可以发现,在isolinux目录下也有相同的内容,同时,还包括引导菜单(isolinux.cfg)及其启动时用到的文件:
isolinux.cfg - 引导菜单配置文件
vesamenu.c32 - 系统自带的两种窗口模块之一
boot.msg - 窗口提示信息文件,提示信息在菜单出现前出现,显示时间较短,可以添加些艺术字之类的信息。
splash.png - 窗口背景图片
因此,我们可以从系统光盘的images/pxeboot/目录下复制内核文件,也可以从isolinux下复制,为了方便起见,这里从isolinux目录下复制,可以只复制我们需要的文件,如:
isolinux.cfg
vesamenu.c32
boot.msg
splash.png
也可以将isolinux目录下的文件全部复制到TFTP根目录/var/lib/tftpboot
:
[root@pxe1 /]# cp -rf /mnt/isolinux/* /var/lib/tftpboot/
然后准备pxe引导菜单:
[root@pxe1 /]# mkdir /var/lib/tftpboot/pxelinux.cfg [root@pxe1 /]# mv /var/lib/tftpboot/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default [root@pxe1 /]# cd /var/lib/tftpboot/pxelinux.cfg [root@pxe1 pxelinux.cfg]# ls default
修改引导菜单选项:
[root@pxe1 pxelinux.cfg]# vim /var/lib/tftpboot/pxelinux.cfg/default # 首先修改菜单等待时间 timeout 600 <--菜单显示等待时间,单位为1/10秒,默认等待60秒。 #修改菜单等待时间为60,即等待6秒,若无操作则进入默认菜单; timeout 600 # 然后修改显示菜单 # ----------------------------------------------------------------- # 找到文件中的以下部分 label linux menu label ^Install CentOS Linux 7 kernel vmlinuz append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet label check menu label Test this ^media & install CentOS Linux 7 menu default kernel vmlinuz append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet # 将其修改为 label linux menu label ^Install CentOS Linux 7 by kickstart menu default kernel vmlinuz append initrd=initrd.img inst.repo=ftp://192.168.56.14/pub inst.ks=ftp://192.168.56.14/ks.cfg label linux 2 menu label ^Install CentOS Linux 7 by vnc kernel vmlinuz append initrd=initrd.img inst.repo=ftp://192.168.56.14/pub inst.vnc inst.vncpassword=password label linux 3 menu label ^Install CentOS Linux 7 by vnc -listen kernel vmlinuz append initrd=initrd.img inst.repo=ftp://192.168.56.14/pub inst.vnc inst.vncconnect=192.168.56.1 # 本文中其他内容无需进行修改,有兴趣可自己尝试修改其他选项进行测试。
4.4 验证TFTP服务
4.4.1 验证TFTP服务配置
下面来验证TFTP服务配置是否正确:
[root@pxe1 kk]# ls /var/lib/tftpboot/ boot.cat grub.conf isolinux.bin pxelinux.0 splash.png vesamenu.c32 boot.msg initrd.img memtest pxelinux.cfg TRANS.TBL vmlinuz [root@pxe1 kk]# [root@pxe1 kk]# tftp 192.168.56.14 tftp> get boot.msg tftp> quit [root@pxe1 kk]# [root@pxe1 kk]# ls boot.msg # 成功get到boot.msg文件,说明TFTP服务正常。
4.4.2 验证菜单及引导文件配置
启动之前准备的客户端虚拟机查看是否可以正常显示引导菜单,是否可以正常获取initrd.img和vmlinuz内核文件。
若配置正常,会看到之前配置的引导菜单出现:
在对应的引导菜单上按TAB
键会显示出该菜单项的具体配置:
按Enter
键后,会出现获取内核文件的界面:
最后系统提示获取ks文件失败,原因是尚未进行ftp服务器的配置: