思路和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公开目录

    PXE批量部署Linux之一:原理和最简环境搭建_bios


第四部:搭建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都需要调整,两年后再部署的时候又踩了这个坑,示例参考http://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

PXE批量部署Linux之一:原理和最简环境搭建_uefi_02

后面的界面和普通装linux就很类似了

PXE批量部署Linux之一:原理和最简环境搭建_syslinux_03