by: 铁乐与猫
注: 此文暂不涉及kickstart方式的自动安装。
虚拟机:VirtualBox
虚拟网卡:VirtualBox Host-Only Network #2
cpu: 2核
内存:2G
磁盘:40GB
操作系统:centos 7.6
主机名:pxe-server.tielemao.com
镜像:CentOS-7-x86_64-DVD-1611.iso
ip:192.168.33.110
dhcp: 12:4.2.5-77.el7.centos
tftp-server: 5.2-22.el7
vsftpd: 3.0.2-25.el7
syslinux: 4.05-15.el7
这里你也可以server和client都使用virtualbox或都使用vmware,网络设置的方式又稍有不同,但原理是一样的.
同样是保证server和client在同一网络模式且关闭dhcp服务即可。
cpu: 1核
磁盘:20G
内存:3G或以上!这里我设置了4G.
着重要说一下内存的设置,因为这个我踩了一个大坑,且一般讲述pxe安装系统的各个官网都不会注明,因为那些文档是写给真实环境的,不太可能有低于3G的内存了。我之前设了1G,结果最后会碰到
/dev/root does not exist
的错误,想都想不到这个居然是调整一下虚拟机的内存就可以避免了。
这里要特别感谢一下以下博客,我是在这里才找到解决的办法的:
http://m.blog.chinaunix.net/uid-31555782-id-5819768.html
其它参数就没有什么好注意的了
[root@localhost ~]# hostnamectl set-hostname pxe-server.tielemao.com
[root@localhost ~]# hostname
pxe-server.tielemao.com
yum install -y dhcp
安装完成后进行配置,如下:
vim /etc/dhcp/dhcpd.conf
# 不使用DNS动态更新
ddns-update-style none;
# 忽略客户端DNS更新
ignore client-updates;
authoritative;
# 响应客户端的启动查询(开机时发送的DHCP请求)
allow booting;
allow bootp;
allow unknown-clients;
#DHCP configuration for PXE boot server
option space PXE;
option PXE.mtftp-ip code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option arch code 93 = unsigned integer 16; # RFC4578
subnet 192.168.33.0 netmask 255.255.255.0 {
range 192.168.33.100 192.168.33.199;
# 设置DNS服务器地址
option domain-name-servers 192.168.33.110;
# 设置DNS域
option domain-name "tielemao.com";
# 设置客户租的默认网关
option routers 192.168.33.1;
option broadcast-address 192.168.33.255;
# 默认租约时间,单位为秒
default-lease-time 3600;
# 设置最大租约时间,单位为秒
max-lease-time 7200;
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
next-server 192.168.33.110;
# UEFI x86-64 boot (RFC4578 architecture types 7, 8 and 9)
if option arch = 00:07 {
filename "uefi/bootx64.efi";
} else if option arch = 00:08 {
filename "uefi/bootx64.efi";
} else if option arch = 00:09 {
filename "uefi/bootx64.efi";
} else {
filename "pxelinux.0";
}
}
}
注:centos6的话可以使用service dhcpd configtest
测试文件是否有错误。
启动并启用dhcpd.service
[root@pxe-server]# systemctl start dhcpd.service && systemctl enable dhcpd.service
允许通过Linux防火墙的DHCP服务。同样,proxy-dhcp端口是传播TFTP服务器IP地址所必需的。
[root@pxe-server ~]# firewall-cmd --permanent --add-service={dhcp,proxy-dhcp}
success
[root@pxe-server ~]# firewall-cmd --reload
success
为某台主机设置IP地址保留,把要保留IP的MAC地址和要保留的IP地址写入dhcpd.conf的配置文件即可,然后设置客户机为自动获取IP。
例:
host fantasy {
hardware ethernet 00:0c:29:74:DF:C5;
fixed-address 192.168.33.151;
}
这里拆分说明一下全局配置中要增加以下配置以支持UEFI引导centos:
option space PXE;
option PXE.mtftp-ip code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option arch code 93 = unsigned integer 16; # RFC4578
上面的dhcp的配置,如果不考虑uefi引导的话,是直接如下配就可以的:
#PXE boot server
next-server 192.168.33.110;
filename "pxelinux.0";
因为要到uefi所以配置成如下:
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
next-server 192.168.33.110;
# UEFI x86-64 boot (RFC4578 architecture types 7, 8 and 9)
if option arch = 00:07 {
filename "uefi/bootx64.efi";
} else if option arch = 00:08 {
filename "uefi/bootx64.efi";
} else if option arch = 00:09 {
filename "uefi/bootx64.efi";
} else {
# PXE boot
filename "pxelinux.0";
}
}
当然针对其它系统你还得去查相应的match。我这里只示范centos的。
重新启动dhcpd.service以应用更改。
[root@pxe-server ~]# systemctl restart dhcpd.service
如果dhcpd.service在启动过程中出现错误,请在其中查找任何可能的语法错误,然后尝试重新启动该服务。
可以借助systemctl status dhcpd.service
查看。
另外上面的filename与之后的tftp放的efi引导文件密切相关。
yum 安装tftp
yum install -y tftp-server
同样启动并启用tftp.service
[root@pxe-server ~]# systemctl start tftp.service && systemctl enable tftp.service
同样允许linux防火墙通过
[root@pxe-server ~]# firewall-cmd --permanent --add-service=tftp
success
[root@pxe-server ~]# firewall-cmd --reload
success
这里更推荐使用xinetd的方式运行和设置tftp,不过测试环境就从简了,默认tftp的根目录就在/var/lib/tftpboot
需要FTP服务才能将OS安装介质共享到PXE引导客户端。一些系统管理员使用NFS代替FTP服务。但是,如果我们使用NFS,则当我们要将Microsoft Windows OS安装选项添加到PXE引导服务器时,也必须配置Samba。因此,最好使用一种通用技术来共享不同操作系统的OS安装介质。HTTP也是FTP的良好替代,可用于共享OS安装介质。
使用yum安装VSFTPD服务器。
yum install -y vsftpd
启动并启用vsftpd.service。
[root@pxe-server ~]# systemctl enable vsftpd.service && systemctl start vsftpd.service
允许通过Linux防火墙的FTP服务。
[root@pxe-server ~]# firewall-cmd --permanent --add-service=ftp
success
[root@pxe-server ~]# firewall-cmd --reload
success
以上如果只是为了单机测试,不在生产环境的话,大可systemctl stop firewalld
关闭防火墙。
selinux也可以关闭以防影响。
Syslinux软件包提供了各种引导程序,包括FAT文件系统,可以引导到Microsoft Windows环境。
通过yum安装syslinux软件包。
[root@pxe-server ~]# yum install -y syslinux
将必要的引导程序(由syslinux提供)复制到**/var/lib/ tftpboot**目录,非必要,主要是针对非uefi的。
[root@pxe-server ~]# cp -v /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
[root@pxe-server ~]# cp -v /usr/share/syslinux/menu.c32 /var/lib/tftpboot/
[root@pxe-server ~]# cp -v /usr/share/syslinux/mboot.c32 /var/lib/tftpboot/
[root@pxe-server ~]# cp -v /usr/share/syslinux/chain.c32 /var/lib/tftpboot/
wget http://mirrors.ustc.edu.cn/centos/7.3.1611/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso
# mount -o loop CentOS-7-x86_64-DVD-1611.iso /mnt/centos7
# cp /mnt/centos7/isolinux/{boot.cat,boot.msg,grub.conf,isolinux.bin,splash.png,TRANS.TBL,vesamenu.c32} /var/lib/tftpboot/
创建必要的目录。这里以centos7为例:
[root@pxe-server ~]# mkdir /var/lib/tftpboot/pxelinux.cfg
[root@pxe-server ~]# mkdir -p /var/lib/tftpboot/networkboot/centos7
[root@pxe-server ~]# mkdir /var/ftp/pub/centos7
将安装光盘目录中的启动文件复制到tftpboot(重点):
# cp /mnt/centos7/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/networkboot/centos7
从centos7光盘中copy内容到/var/ftp/pub/centos7
[root@pxe-server ~]# cp -rf /mnt/centos7 /var/ftp/pub/
创建一个pxe服务器的默认菜单,针对不是uefi的,传统LEGACY引导
# vim /var/lib/tftpboot/pxelinux.cfg/default
内容可以如下:
default menu.c32
prompt 0
timeout 300
ONTIMEOUT 1
menu title ########## CentOS 7 PXE Boot Menu ##########
label 1
menu label ^1) Install CentOS 7
menu default
kernel /networkboot/centos7/vmlinuz
append initrd=/networkboot/centos7/initrd.img inst.repo=ftp://192.168.33.110/pub/centos7
label 2
menu label ^2) Boot from local drive
localboot 0
创建用于uefi启动的目录
mkdir /var/lib/tftpboot/uefi
需要复制来自centos7的uefi启动的文件,可以先安装以下rpm包:
yum install grub2-efi-x64 shim-x64
这样会在本地目录中存放有相关uefi的启动文件:
/boot/efi/EFI/centos/
/boot/efi/EFI/redhat/
复制到**/var/lib/tftpboot**目录下的uefi并设置相应属性为755:
cp -p /boot/efi/EFI/centos/*.efi /var/lib/tftpboot/uefi/
chmod 755 /var/lib/tftpboot/uefi/*.efi
同样,bootx64.efi文件我们先安装如下rpm:
yum install grub2-efi-x64-modules
然后构建你自己的启动文件bootx64.efi:
grub2-mkstandalone -d /usr/lib/grub/x86_64-efi/ -O x86_64-efi --modules="tftp net efinet linux part_gpt efifwsetup" -o /var/lib/tftpboot/uefi/bootx64.efi
The grub2 modules are documented in https://www.linux.org/threads/understanding-the-various-grub-modules.11142/
我们的PXELINUX菜单不适用于UEFI系统,因此我们必须为UEFI客户端创建另一个菜单。
uefi/bootx64.efi
引导文件将在同一子目录中查找Grub配置文件grub.cfg。使用以下内容创建/var/lib/tftpboot/uefi/grub.cfg
:
set default="0"
function load_video {
insmod efi_gop
insmod efi_uga
insmod video_bochs
insmod video_cirrus
insmod all_video
}
load_video
set gfxpayload=keep
insmod net
insmod efinet
insmod tftp
insmod gzio
insmod part_gpt
insmod ext2
set timeout=60
menuentry 'Install UEFI CentOS Linux 7' --class fedora --class gnu-linux --class gnu --class os {
linuxefi (tftp)/uefi/vmlinuz ip=dhcp inst.repo=ftp://192.168.33.110/pub/centos7/
initrdefi (tftp)/uefi/initrd.img
}
重新启动tftp.service以应用更改:
[root@pxe-server ~]# systemctl restart tftp.service
UEFI配置己完成
要测试配置,请将基于UEFI的系统连接到网络,然后将其打开。
需要检查清楚对应系统镜像的vmlinuz和initrd.img的md5值一不一致。
来避免一些奇葩问题。比如不一致的话会出现进到pxe安装的时候一直dracut-initqueue timeout的情况。
http://m.blog.chinaunix.net/uid-31555782-id-5819768.html
http://hmli.ustc.edu.cn/doc/linux/centos-autoinstall.htm