思路和WDS部署windows一样,支持PXE启动的网卡从DHCP服务器获得IP、下一跳TFTP服务器地址和网络引导程序。引导程序从TFTP服务器读取配置文件,并下载kernel和其它文件。红帽系使用kickstart自动应答安装过程中选项从而实现0接触部署。
TFTP使用UDP协议69端口实现最小开销的文件传输,因消耗系统资源少常用于打印机、路由器或小内存嵌入式设备,PXE部署过程中主要用来传输NBP即网络启动文件。
我们先在传统BIOS平台上搭建一个最简环境:关闭防火墙,停用selinux,只安装/配置两个工具。用dnsmasq承担DHCP/TFTP功能,FTP承担大文件传输。后续的实验会陆续实现多UEFI平台、同一台p服务器部署多个不同发行版、及cabbler。
以下实验在CENTOS 7.2,kerne 3.10上完成。
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@localhost ~]# uname -r
3.10.0-327.10.1.el7.x86_64
首先关掉防火墙
[root@localhost ~]# systemctl stop firewalld
遮盖防火墙服务,防止意外开启
[root@localhost ~]# systemctl mask firewalld
ln -s '/dev/null' '/etc/systemd/system/firewalld.service'
第二步:停用selinux
[root@localhost ~]# setenforce
usage: setenforce [ Enforcing | Permissive | 1 | 0 ]
[root@localhost ~]# setenforce 0
重启系统
[root@localhost ~]# systemctl reboot
第三步:搭建FTP服务器,拷贝系统安装文件。
安装vsftpd
[root@localhost ~]# yum -y install vsftpd
拷贝安装光盘内所有文件到FTP共享
[root@localhost ~]# cp -rv /mnt/iso/centos/71/ /var/ftp/pub/iso/centos/
启用ftp服务
[root@localhost ~]# systemctl restart vsftpd.service
确认匿名用户可以访问FTP公开目录
第四部:搭建DHCP/TFTP服务器。
安装dnsmasq
[root@localhost ~]# yum -y install dnsmasq
编辑配置文件,指定DHCP参数。
这儿如果NBP文件没有放在上TFTP根目录下面,比如 /var/lib/tftpboot/lab
则dhcp-boot项需写为 lab/pxelinux.0。
[root@localhost ~]# cat /etc/dnsmasq.conf
interface=eth0,lo #指定DHCP监听的网卡
#bind-interfaces
domain=it.lab
# DHCP range-leases
dhcp-range= eth0,192.168.254.100,192.168.254.254,255.255.255.0,1h #DHCP地址范围
# PXE
dhcp-boot=pxelinux.0,pxeserver,192.168.254.2 #NBP文件名,TFTP服务器地址
# Gateway
dhcp-option=3,192.168.254.2
# DNS
dhcp-option=6,192.168.254.2
server=192.168.254.2
# Broadcast Address
dhcp-option=28,10.0.0.255
# NTP Server
dhcp-option=42,0.0.0.0
#pxe-prompt="Press F8 for menu.", 10
#pxe-service=x86PC, "Install CentOS 7 from network server 192.168.254.2", pxelinux
enable-tftp #启用TFTP服务
tftp-root=/var/lib/tftpboot #TFTP主目录
第五步:准备TFTP目录和文件。
安装syslinux获得nbp文件pxelinux.0
[root@localhost ~]# yum -y install syslinux
拷贝nbp文件到tftp根目录。
注意:后续配置文件的路径都是以nbp文件在的目录为根,多级目录的文件需要加和nbp同级目录的前缀。比如pxelinux.0所在目录为根目录 /var/lib/tftpboot,内核文件我们按照不同的发行版本整理,centos/71/vmlinuz,指定内核文件时我们就需要写成centos/7/vmlinuz。
[root@localhost ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
PXE客户端从DHCP服务器获取到IP,TFTP服务器地址和NBP文件后就会使用内置的TFTP客户端和TFTP服务器通讯下载NBP文件,NBP文件直接加载进内存执行。具体到这里就是pxelinux.0,这个引导程序从到TFTP服务器和自己同级目录下寻找pxelinux.cfg目录并读取配置文件。
创建pxelinux.cfg,此目录一定要放在和pxelinux.0同一级目录的位置。
[root@localhost ~]# mkdir /var/lib/tftpboot/pxelinux.cfg
pxelinux.0在pxelinux.cfg目录下首先寻找UUID对应的文件,找不到再是01跟自己的MAC地址同名的文件,如果还找不到就是16进制的IP地址同名的文件,都找不到的话会去寻找default文件。
我们可以从下面的log看到detail的信息。
sent /var/lib/tftpboot/pxelinux.0 to 192.168.254.227
file /var/lib/tftpboot/pxelinux.cfg/e5be4c55-d319-4649-8fbe-1576397361dc not found
file /var/lib/tftpboot/pxelinux.cfg/01-00-15-5d-01-65-3f not found
file /var/lib/tftpboot/pxelinux.cfg/C0A8FEE3 not found
file /var/lib/tftpboot/pxelinux.cfg/C0A8FEE not found
file /var/lib/tftpboot/pxelinux.cfg/C0A8FE not found
file /var/lib/tftpboot/pxelinux.cfg/C0A8F not found
file /var/lib/tftpboot/pxelinux.cfg/C0A8 not found
file /var/lib/tftpboot/pxelinux.cfg/C0A not found
file /var/lib/tftpboot/pxelinux.cfg/C0 not found
file /var/lib/tftpboot/pxelinux.cfg/C not found
sent /var/lib/tftpboot/pxelinux.cfg/default to 192.168.254.227
编辑配置文件
[root@localhost ~]# cat /var/lib/tftpboot/pxelinux.cfg/default
default vesamenu.c32 #PXE启动时绘制界面
prompt 0 #0不显示boot提示符 1会有boot提示符
timeout 60 #无操作超时时间
display boot.msg
menu background splash.jpg #界面背景图片,后面有一篇翻译的博文详细介绍如果自定义制作此文件
menu title Welcome to IT Lab PXE Linux !#菜单栏标题
menu color border 0 #ffffffff #00000000
menu color sel 7 #ffffffff #ff000000
menu color title 0 #ffffffff #00000000
menu color tabmsg 0 #ffffffff #00000000
menu color unsel 0 #ffffffff #00000000
menu color hotsel 0 #ff000000 #ffffffff
menu color hotkey 7 #ffffffff #ff000000
menu color scrollbar 0 #ffffffff #00000000
label 1 #第一个选单
menu default #无选择时默认启动菜单
menu label ^1) Install CentOS 7 x64 with Local Repo #菜单名字
kernel centos/71/vmlinuz #指定下载的内核路径
append initrd=centos/71/initrd.img inst.repo=ftp://192.168.254.2/pub/iso/centos/71 inst.ks=ftp://192.168.254.2/pub/ks/centos/71/co.cfg #指定initrd镜像路径和内核参数
2019 Jan 6 update: inst.repo可以省略 inst.ks也可以写成ks
拷贝PXE启动需要的文件到TFTP目录
[root@localhost ~]# cp /var/ftp/pub/iso/centos/71/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/centos/71/
[root@localhost ~]# cp /var/ftp/pub/iso/centos/71/isolinux/{vesamenu.c32,splash.png} /var/lib/tftpboot/
修改TFTP共享文件权限为755
[root@localhost ~]# chmod -Rv 755 /var/lib/tftpboot/
理好的目录是这样的。
[root@localhost ~]# tree /var/lib/tftpboot/
/var/lib/tftpboot/
├── centos
│ ├── 63
│ │ ├── initrd.img
│ │ └── vmlinuz
│ ├── 66
│ │ ├── initrd.img
│ │ └── vmlinuz
│ └── 71
│ ├── initrd.img
│ └── vmlinuz
├── pxelinux.0
├── pxelinux.cfg
│ └── default
├── splash.jpg
└── vesamenu.c32
NBP下载内核文件释放到内存,内核开始接管操作系统控制权限,内核根据指定的参数进行下一步任务。
红帽使用kickstart自动应答安装过程的参数。kickstart文件可从~root/anaconda-ks.cfg复制修改也可使用图形界面工具system-config-kickstart生成。
system-config-kickstart.noarch : A graphical interface for making kickstart files
6和7的语法变化导致append和ks都需要调整,两年后再部署的时候又踩了这个坑,示例参考https://blog.51cto.com/jerkou/1751638 详细语法参考
https://access.redhat.com/documentation/zh_cn/red_hat_enterprise_linux/6/html/installation_guide/sn-automating-installation
https://access.redhat.com/documentation/zh_cn/red_hat_enterprise_linux/6/html/installation_guide/s1-kickstart2-options#s2-kickstart2-options-part-examples
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/installation_guide/sect-kickstart-syntax
编辑kickstart文件
[root@localhost ~]# cat /var/ftp/pub/ks/centos/71/co.cfg
#version=RHEL7
# System authorization information
auth --enableshadow --passalgo=sha512
url --url ftp://192.168.254.2/pub/iso/centos/71 #指定安装源共享方式及路径
# Use text install
text #使用字符化界面安装
ignoredisk --only-use=sda #只使用发现的第一块硬盘
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'#键盘布局
# System language
lang en_US.UTF-8 #语言
reboot #安装完成后自动重启
# Network information
network --bootproto=dhcp --device=eth0 --onboot=off --ipv6=auto
#network --bootproto=dhcp --device=eth1 --onboot=off --ipv6=auto
#network --hostname=localhost.localdomain
# Root password centos
rootpw --iscrypted $6$0QkjgF3KxsOAQ/xW$22aDZoYi.5fSWNqvPQn/VJEMWRKNcgmsWUjIrBYH4x/sXUQQ5eT1zew7LPTGi3OJE8SaX8tx/OQUWt2r3Loxb1
# System timezone
timezone Asia/Shanghai --isUtc #时区
# System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda #MBR安装位置
autopart --type=lvm #lvm格式自动分区,无此参数安装会卡在硬盘分区
# Partition clearing information
clearpart --all --initlabel #删除所有已有分区
zerombr #删除原有MBR记录
%packages #安装包选项
@core #最小化安装
sudo
gawk
openssh-server
%end #
%addon com_redhat_kdump --enable --reserve-mb='auto'
%end
第六步:启用服务,开始调试
[root@localhost ~]# systemctl enable dnsmasq
[root@localhost ~]# systemctl enable vsftpd
[root@localhost ~]# systemctl restart dnsmasq
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# journalctl -f
后面的界面和普通装linux就很类似了