抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

本篇主要包含以下内容:

PXE 概述

Preboot Execution Environment 远程预启动执行环境,就是使计算机通过网络启动。

要达成 PXE 必须要有两个环节:

  • 客户端的网卡必须要支持 PXE 用户端功能,并且开机时选择从网卡启动,这样系统才会以网卡进入 PXE 客户端的程序
  • PXE 服务器必须要提供至少含有 DHCP 以及 TFTP 的服务
    • DHCP 服务必须要能够提供客户端的网络参数,还要告知客户端 TFTP 所在的位置;
    • TFTP 则提供客户端的boot loaderkernel file下载路径。

可选的其他服务:NFS、FTP、HTTP 等

完整的 PXE 交互过程:

  1. Client 向 DHCP 发送 IP 地址请求消息,DHCP 检测 Client 是否合法(主要是检测 Client 的网卡 MAC 地址),如果合法则返回 Client 的 IP 地址,同时将启动文件 pxelinux.0 的位置信息一并传送给 Client
  2. Client 向 TFTP 发送获取 pxelinux.0 请求消息,TFTP 接收到消息之后再向 Client 发送 pxelinux.0 大小信息,试探 Client 是否满意,当 TFTP 收到 Client 发回的同意大小信息之后,正式向 Client 发送 pxelinux.0,Client 接收并执行 pxelinux.0 文件
  3. Client 向 TFTP Server 发送获取针对本机的配置信息文件的请求(在 TFTP 服务的 pxelinux.cfg 目录下,这是系统菜单文件,格式和 isolinux.cfg 格式一样,功能也是类似),TFTP 将配置文件发回 Client,继而 Client 根据配置文件执行后续操作。
  4. Client 向 TFTP 发送 Linux 内核请求信息,TFTP 接收到消息之后将内核文件发送给 Client
  5. Client 向 TFTP 发送根文件请求信息,TFTP 接收到消息之后返回 Linux 根文件系统 Client 启动 Linux 内核
  6. Client 从 FTP 或 HTTP 下载安装源文件,读取自动化安装脚本

引用自Cobbler 原理解析

Kickstart

Kickstart 概述

Kickstart 是通过自动应答文件,将安装系统过程中手动设置的语言、密码、网络等参数自动设置。

Kickstart 文件有三种生成方式:

  • 手动书写
  • system-config-kickstart图形化配置
  • 红帽系系统自带的Anaconda生成

Kickstart 准备

服务分工介绍:

  • DHCP:为安装的新主机分配 IP 地址
  • TFTP:仅仅提供引导文件
  • VSFTP|HTTP|NFS:提供系统镜像中所有文件,然后会根据 Kickstart 文件自动选择要安装的软件,并配置

防止访问出现错误,先将 selinux 设为 Permissive。setenforce 0

DHCP 配置

首先配置 DHCP 服务。
yum install dhcp
修改配置文件/etc/dhcp/dhcpd.conf

# 日志级别
log-facility local7;
# DNS服务器域名
option domain-name-servers system1.example.com;
# 网关
option routers 192.168.10.2;
# 默认分配时间
default-lease-time 600;
# 最大分配时间
max-lease-time 7200;

subnet 192.168.10.0 netmask 255.255.255.0 {
# 地址分配范围
range 192.168.10.101 192.168.10.110;
# TFTP服务器(重要)
next-server 192.168.10.100;
# TFTP服务器上的共享启动文件名(重要)
filename "pxelinux.0";
}

重新加载并设置开机自启
systemctl restart dhcpd
systemctl enable dhcpd
若开启了防火墙应该放行服务

firewall-cmd --permanent --add-service=dhcp
firewall-cmd --permanent --add-port=67/tcp --add-port=67/udp
firewall-cmd --reload

TFTP 配置

配置 TFTP 服务,首先需要安装xinetd服务,因为 TFTP 是被 Xinetd 动态管理的服务。
yum install xinetd tftp-server
修改配置文件/etc/xinetd.d/tftp

service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
# server_args指定共享目录路径
server_args = -s /tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
disable的值默认为yes,表示禁用tftp,因此要改为no,开启tftp

重启 Xinted 服务systemctl restart xinetd.service

通过查看服务是否开启
# ss -aupt | grep xinetd
udp UNCONN 0 0 *:tftp *:* users:(("xinetd",pid=3490,fd=5))

若开启了防火墙,需要放行服务和端口

firewall-cmd --permanent --add-service=tftp
firewall-cmd --permanent --add-port=69/udp
firewall-cmd --reload

使用 VSFTP 搭建镜像源

安装 VSFTPD 服务yum install vsftpd
systemctl start vsftpd
systemctl enable vsftpd

将光盘镜像挂载在/var/ftp/pub中。mount /dev/cdrom /var/ftp/pub

若开启了防火墙,应该放行端口和服务

firewall-cmd --permanent --add-port=20/tcp --add-port=21/tcp
firewall-cmd --permanent --add-service=ftp
firewall-cmd --reload

在浏览器中输入ftp://192.168.10.100访问成功。

使用 HTTP 搭建镜像源

安装 HTTPD 服务yum install httpd
systemctl start httpd
systemctl enable httpd

将光盘镜像挂载在/var/www/html/centos7上。mount /dev/cdrom /var/www/html/centos7

若开启了防火墙,应该放行端口和服务

firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-service=http
firewall-cmd --reload

在浏览器中输入192.168.10.100/centos7访问成功。

Syslinux 配置

安装 syslinux 服务
syslinux 是一个功能强大的引导加载程序,用于获取引导文件。
yum install syslinux
将引导文件复制到 TFTP 主目录cp /usr/share/syslinux/pxelinux.0 /tftpboot
若要图形化菜单功能(仅仅是可以上下键切换,最好一起复制了),可将/usr/share/syslinux中的menu.32vesamenu.c32复制到/tftpboot。这里就复制vesamenu.c32,比menu.32更好。
并在/tftpboot中创建目录pxelinux.cfg用于存放默认开机选项,并在该目录中创建default文件

创建存放 CentOS7 内核文件的目录mkdir /tftpboot/centos7,并将挂载镜像目录/var/ftp/pub/isolinux/vmlinuzinitrd.img两个内核文件复制到该目录中。cp /var/ftp/pub/isolinux/{vmlinuz,initrd.img} /tftpboot/centos7/
最好将isolinux目录下的isolinux.cfg也复制过去,该文件提供了开机选项,可以以它作为修改开机选项和菜单的模板。可以直接将内容拷贝过去,cat /var/ftp/pub/isolinux/isolinux.cfg > /tftpboot/pxelinux.cfg/default

defaultisolinux.cfg简单解析

default vesamenu.c32    # 必须指定,填/tftpboot中复制的图形化文件
timeout 10 # 在选择界面停留的时间(若未操作)
display boot.msg    # 选项的说明文件

菜单的一些显示设置,不用改
menu clear
menu background splash.png
menu title CentOS 7 # 引导是显示的标题
menu vshift 8
menu rows 18
menu margin 8
#menu hidden
menu helpmsgrow 15
menu tabmsgrow 13
.....
在引导界面上显示的选项
label linux
menu label ^Install CentOS 7
kernel ./centos7/vmlinuz # vmlinuz是可引导的、压缩的内核,路径要设为相对路径(相对于tftp根目录)
append initrd=./centos7/initrd.img ks=ftp://192.168.10.100/ks_config/ks.cfg quiet
# 设置内核文件,要设置initrd.img的相对路径
# initrd.img全称boot loader initialized RAM disk, boot loader初始化的内存盘。在linux内核启动前,boot loader会将存储介质中的initrd文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的initrd文件系统
# 后面跟着ks=ks.cfg文件的路径,http或ftp都行
# 后面还可以跟上ksdevice=eth0,当客户端有多块网卡时,此项就会让系统不提示要选择哪块网卡

label check
menu label Test this ^media & install CentOS 7
menu default # 默认光标停留在此标签(选项)上
kernel ./centos7/vmlinuz
append initrd=./centos7/initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet

整个/tftpboot的目录结构如下

/tftpboot/
├── centos7
│   ├── initrd.img
│   └── vmlinuz
├── pxelinux.0
├── pxelinux.cfg
│   └── default
└── vesamenu.c32

网络安装试验

做这个实验时,要先修改/tftpboot/pxelinux.cfg/default

找到以下内容
label linux
menu label ^Install CentOS 7
menu default
kernel ./centos7/vmlinuz
append initrd=./centos7/initrd.img inst.stage2=ftp://192.168.10.100/pub quiet
net.ifnames=0 biosdevname=0

inst.stage2设置FTP镜像源
在quiet后再加上net.ifnames=0 biosdevname=0
让网卡名称为ethN,而不是默认的eno16777728这样的随机名称

创建一个新的虚拟机,不指定镜像。

进入虚拟机的 BIOS 设置

进入 Boot 菜单,通过-+改变启动顺序,将Network boot from Intel E1000移到最上面。


保存退出,会自动启动主机,通过网络读取 FTP 镜像源。

最后进入图形化安装界面

Kickstart 配置

手动配置

首先创建ks.cfg,存放在/var/ftp/ks_config(FTP 源)或/var/www/html/centos/ks_config(HTTP 源)。
修改/tftpboot/pxelinux.cfg/default

仍然找到这段内容,修改initrid后的内容
删除原来的inst.stage2,改为ks=fs.cfg路径,HTTP同理
label linux
menu label ^Install CentOS 7
menu default
kernel ./centos7/vmlinuz
append initrd=./centos7/initrd.img ks=ftp://192.168.10.100/ks_config/ks.cfg quiet
net.ifnames=0 biosdevname=0

在主目录中有系统自动创建的anaconda-ks.cfg,可以此为模板。在图像化配置安装时就是向该文件中添加配置,直到点击安装时,安装程序就会根据该配置文件安装。

anaconda-ks.cfg简单解析

分为三个部分:
1. 选项指令段,用于图形化安装时除包选择外的所有手动操作
2. %packages段,用于选择软件包
3. 脚本段,可选。分为两种:
%pre:预安装脚本段,在安装系统之前就执行的脚本。很少使用
%post:后安装脚本段,在系统安装完成后执行的脚本。

必选选项:
# auth验证选项
auth --enableshadow --passalgo=sha512
--enableshadow|--useshadow 开启shadow文件验证
--passalgo  指定密码加密算法

# bootloader指定如何安装引导程序
bootloader --append="crashkernel=auto" --location=mbr --boot-drive=sda
--append 指定内核参数
--location 指定引导程序的位置,默认为MBR
--boot-drive 指定grub安装的分区

# keyboard键盘类型
keyboard --vckeymap=us --xlayouts='us'
--vckeymap指定键盘分布,默认为us美式

# lang指定语言
lang en_US.UTF-8

# rootpw指定root密码
rootpw --iscrypted $6$D2fmDfXJI30ZbG0x$lenXfD98spplf7jHTmfiJ0m7CgQqJM.ddQ5hu07qiU3A5fJcRhSQA5KZolrWoSfGm2oIwJUglnRwoXth9rDGc0
--iscrypted 使用加密密码

可选选项:
install 表示是安装系统,若为install还需指定安装方式:
cdrom 表示从光盘安装
harddrive 硬盘安装,硬盘必须是VFAT或EXT文件系统
--dir 指定从包含安装树(install-tree)的目录安装
--partition 指定从哪个分区安装
nfs
--server 指定NFS服务器主机名或IP地址
--dir 指定安装树目录
--opts 指定NFS的挂载选项
url
--url 后面跟上地址
update 表示是升级系统

graphical 表示图形模式下执行kickstart安装,默认
text   文本模式下根据kickstart执行安装(手动创建一定是text)
firstboot 安装后第一次启动默认会有需要手动配置的界面,应该禁用
--enable|--disable 启用|禁用
ignoredisk 指定忽略的磁盘
--only-use=sda
network 配置网络
--bootproto 地址协议,dhcp或static。若为static需要配置IP、掩码、网关、DNS
--device=ens33 设置网卡名
--onboot=off 是否在引导系统时启用设备
--ipv6=auto    开启IPv6
--no-activate
--hostname=localhost.localdomain 主机名
若协议为static,则需要以下选项:
--ip=
--netmask=
--gateway=
--nameserver=

repo 设置repo源
--name=
--baseurl=
services 设置服务是否启用
--disabled=
--enabled=
timezone Asia/Shanghai --isUtc --nontp 指定时区
selinux 设置selinux
--enforcing
--permissive
--disabled
firewall 是否开启防火墙
--disable|--enable
xconfig --startxonboot
autostep 交互式,和interactive类似
interactive 使用kickstart文件指定的参数交互式安装,但仍会给出每一步的选择项,如果直接下一步就使用kickstart参数
cmdline 在完全非交互的命令行模式下进行安装
driverdisk 指定驱动程序所在位置
--source=
autopart 自动分区
--type=lvm
zerombr 清除磁盘的MBR
clearpart 在安装系统前清除分区
--all 清除所有分区
--initlabel 创建标签,对于没有MBR或者GPT的新硬盘,该选项是必须的
--drives=sda 清除指定的分区
--Linux 清除Linux分区
--none 不清除分区
常用cleanpart --all --initlabel

part [分区]  创建分区
--fstype 文件系统类型
--asprimary 强制为主分区
--size 设置大小(单位Mb)
--grow 使用所有可用空间,即为其分配所有剩余空间。
对于根分区至少需要3G空间(即使是--grow,也还是需要指定--size)

user 在系统中生成一个新用户
--name 指定用户名
--groups 指定辅助组,非默认组
--homedir 用户家目录,如果不指定则默认为/home/<username>
--password 该用户的密码,如果不指定或省略则创建后该用户处于锁定状态
--shell 用户的shell,不指定则默认
--uid 用户UID,不指定则自动分配一个非系统用户的UID
loggin 指定安装过程中的错误日志位置
--host 指定日志将发送到那台主机上
--port 如果远程主机的rsyslog使用非默认端口,则应该指定该端口选项
--level 指定日志级别
halt|reboot 安装完成后操作,halt为关机,reboot为重启,默认是halt

# 软件包或软件包组
# @表示包组,@base和@core默认包含
%packages
@^graphical-server-environment
@base
@core
@desktop-debugging
@dial-up
@fonts
@gnome-desktop
@guest-agents
@guest-desktop-agents
@hardware-monitoring
@input-methods
@internet-browser
@multimedia
@print-client
@x11
kexec-tools
%end

%addon com_redhat_kdump --enable --reserve-mb='auto'
%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

注:%addon%anaconda%packages%onerror%pre%post必须以%end结尾

官方并不建议手工创建 kickstart 文件,因为太过复杂,且容易出错。因此,可通过system-config-kickstart图形化工具快速生成 kickstart 文件。

system-config-kickstart 配置

需要安装该工具yum install system-config-kickstart
打开工具后,按照以下界面配置即可。








若需要修改,则直接打开修改即可。若图形化无法添加安装软件包,就在生成的ks.cfg中添加。最终修改后的ks.cfg文件如下

install
keyboard 'us'
rootpw --iscrypted $1$8.DdzSgf$UIjrFmFh/4Mavb/4q7z8U.
url --url="ftp://192.168.10.100/pub"
lang en_US
firewall --disabled
auth --useshadow --passalgo=sha512
graphical
selinux --disabled
skipx

network --bootproto=dhcp --device=eth0
network --hostname=system10.example.com
reboot
timezone Asia/Shanghai
bootloader --location=mbr
zerombr
clearpart --all --initlabel
part /boot --fstype="xfs" --size=200
part / --fstype="xfs" --size=5
part /var --fstype="xfs" --size=10
services --enabled=httpd

%packages
@base
@core
tree
nmap
wget
httpd
%end

再次进行安装,进入下面画面时,发现配置已根据 kickstart 文件填写完成。

Cobbler

Cobbler 与 Kickstart 类似,是一个 Linux 服务器快速网络安装的服务,可以通过 PXE 快速安装、重装物理服务器和虚拟机。基于 Python 开发,支持命令行管理、web 界面管理、提供 API 接口。可以管理 DHCP,DNS,TFTP、RSYNC 以及 yum 仓库、构造系统 ISO 镜像。

Cobbler 会在请求内核文件后,再请求 Kickstart 文件(即 ks.cfg)和 OS 镜像。然后 Cobbler 加载 Kickstart 文件并接收安装 OS 镜像。

Cobbler 常见术语:

  • distro:发行版,相当于一个操作系统镜像,包含内核和 initrd 信息以及软件包等
  • repository:保存一个 yum 或 rsync 存储库的镜像信息
  • profile:配置文件,包含 distro、kickstart 文件和 repository 等信息,作用为了修改/tftpboot/pxelinux.cfg/default文件,每生成或修改一次 profile,都会在 default 文件中修改或追加对应的 label
  • system:目标系统,即要安装的主机,包含配置文件或镜像,IP 地址等信息
  • image:系统镜像

system、image、repository 用的很少,主要用 distro 和 profile。

Cobbler 安装

仍然使用之前 Kickstart 的环境。必须关闭 selinux
首先安装epel-release,因为 Cobbler 位于 epel 源中。
然后安装 Cobbler 及其他工具程序
yum install cobbler cobbler-web pykickstart
其中 cobbler-web 是 cobbler 的网页端配置工具,可不用安装。
pykickstart 是用于检查 kickstart 文件语法的工具
cobbler 的运行依赖于 dhcp、tftp、rsync 及 dns 服务,因此在现有环境下还要安装 rsync。yum install rsync
systemctl enable rsyncd
systemctl start rsyncd
systemctl enable cobblerd.service
systemctl start cobblerd.service

使用命令cobbler check进行检查,对查出的错误一一解决。

1 : The 'server' field in /etc/cobbler/settings must be set to something other than localhost,
or kickstarting features will not work.
This should be a resolvable hostname
or IP for the boot server as reachable by all machines that will use it.
2 : For PXE to be functional, the 'next_server' field in /etc/cobbler/settings
must be set to something other than 127.0.0.1,
and should match the IP of the boot server on the PXE network.

这两个问题需要设置/etc/cobbler/settings,修改以下内容:

# 将127.0.0.1修改为本机的IP地址
next_server: 192.168.10.100
server: 192.168.10.100
3 : Some network boot-loaders are missing from /var/lib/cobbler/loaders, you may run 'cobbler get-loaders' to download them, or, if you only want to handle x86/x86_64 netbooting, you may ensure that you have installed a *recent* version of the syslinux package installed and can ignore this message entirely.  Files in this directory, should you want to support all architectures, should include pxelinux.0, menu.c32, elilo.efi, and yaboot. The 'cobbler get-loaders' command is the easiest way to resolve these requirements.

问题是需要获取 bootloaders 文件,执行cobbler get-loaders自动下载,但要求联网。也可复制,但需要的文件很多,有的不好找,最好直接执行命令。

4 : debmirror package is not installed, it will be required to manage debian deployments and repositories

安装debmirror软件包并将/etc/debmirror.conf中的distsarches注释。

#@dists="sid";
#@arches="i386";
5 : The default password used by the sample templates for newly installed machines (default_password_crypted in /etc/cobbler/settings) is still set to 'cobbler' and should be changed, try: "openssl passwd -1 -salt 'random-phrase-here' 'your-password-here'" to generate new one

需要使用 openssl 生成加密密码来取代默认的密码。

openssl passwd -1 -salt 'cobbler' '123456'
passwd 表示生成密码
-1 表示使用MD5加密
-salt 表示使用后面提供的参数生成,后面跟上用户名和密码
会生成一个加密密码,将这串字符替换掉原来的默认密码
default_password_crypted: "$1$cobbler$52QDrGSqGlT9d5qbjg7QY/"
6 : fencing tools were not found, and are required to use the (optional) power management features. install cman or fence-agents to use them

安装cmanfence-agentscman可能会找不到这个包,但只安装fence-agents就够了。

最后使用命令cobbler sync应用调整的参数或重启cobblerd服务,再执行一次cobbler check检查,若还有错就继续排错,若没有错误就会显示No configuration problems found. All systems go.

Cobbler 默认管理 tftp 服务,默认不管理 dhcp,因此 tftp 的根目录变为/var/lib/tftpboot。如果让 Cobbler 管理 DHCP,则 Cobbler 管理 DHCP 的模板文件/etc/cobbler/dhcp.template会覆盖/etc/dhcp/dhcpd.conf

将光盘挂载到本地,mount /dev/cdrom /mnt/mirror,然后执行cobbler import --name=CentOS7 --path=/mnt/mirror生成 distro,从本地导入的过程实际上是将系统镜像中的文件复制到/var/www/cobbler/ks_mirror/CentOS7中。在/var/www/cobbler/images中也会生成一个CentOS7-x86_64的目录,其中存放了initrd.imgvmlinuz文件。

然后,需要提供 kickstart 文件,这里继续使用 Kickstart 实验用的ks.cfg文件,将文件移动到/var/lib/cobbler/kickstarts中,并改名为CentOS7.ks,需要修改以下内容。

#如果存在ignoredisk设置,一定要注释掉,cobbler编译时不支持此语法
修改镜像安装源
url --url="http://http://192.168.10.100/cobbler/ks_mirror/CentOS7/"

在导入镜像生成 distro 的过程中,会自动生成一个 profile。使用cobbler profile list查看。使用cobbler profile report --name=CentOS7-x86_64查看 profile 信息。

# cobbler profile report --name=CentOS7-x86_64
其中profile默认使用的kickstart文件有误
Kickstart : /var/lib/cobbler/kickstarts/sample_end.ks

需要通过cobbler profile edit --name=CentOS7-x86_64 --kickstart=/var/lib/cobbler/kickstarts/CentOS7.ks修改。

最好再修改内核启动参数net.ifnamesbiosdevname使网卡名为ethN系列而不是用enoXXXXXX随机名。cobbler profile edit --name=CentOS7-x86_64 --kopts="net.ifnames=0 biosdevname=0"

若要手动添加一个 profile,可使用cobbler profile add --name=XXX --distro=distro名 --kickstart=ks文件路径。每添加一个 profile,就是在/var/lib/tftpboot/pxelinux.cfg/default中添加一个 label,一个 label 就是开机启动时的引导选项。

LABEL CentOS7-x86_64
kernel /images/CentOS7-x86_64/vmlinuz
MENU LABEL CentOS7-x86_64
append initrd=/images/CentOS7-x86_64/initrd.img ksdevice=bootif lang= text net.ifnames=0 biosdevname=0 kssendmac ks=http://192.168.10.100/cblr/svc/op/ks/profile/CentOS7-x86_64
ipappend 2

在配置完成后,执行cobbler sync同步设置。

通过浏览器访问default文件中ks参数指定的 ks 文件路径,看是否能访问,若能显示文件内容,则配置没有问题。

重启xinetdcobblerddhcpd服务,以防配置未刷新。

仍然使用一台裸机进行安装,会自动进入安装界面。

使用 cobbler-web 图形化配置

如果开启了防火墙,需要放行 443 端口和 https 服务,因为 Cobbler 在 CentOS7 只支持 https。

在浏览器访问https://IP地址/cobbler_web即可,输入账号密码,均为cobbler

首先进行镜像的导入,左侧菜单的Import DVD选项配置。

菜单的Events查看事件日志。

进入distros配置,添加内核选项。也可以通过profiles配置。

设置网卡名为 ethN 系列

修改或编写 ks 文件

也可进入菜单system进行 system 配置。

参考文章

骏马金龙–无人值守 CentOS7 > kickstart 文件详解 > KICKSTART 无人值守安装 > Cobbler-自动化部署神器 > cobbler 无人值守批量安装 Linux 系统 > Cobbler 原理解析
Linux 就该这么学
Linux 运维之道(第二版)