Linux 使用PXE批量自动化装Centos.
前言!
- 这即将是
最振奋人心的技术. - 你即将GET多种技术的产物…
- 这可花费了我不少时间…
- 在你即将批量给
上千台服务器装系统时… 考虑请我喝杯奶茶吧!
环境介绍.
- 宿主机
Arch Linux - 虚拟化
KVM - 实验机器
Centos7
PXE简介.
PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服 务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端基本软件设置,从而引导预先安装在服务器中的终端操作系统.
严格来说,PXE 并不是一种安装方式,而是一种引导方式.进行 PXE 安装的必要条件是在要安装的计算机中必须包含一个 PXE 支持的网卡(NIC),即网卡中必须要有 PXE Client.PXE 协议可以使计算机通过网络启动,此协议分为 Client端和 Server 端,而PXE Client则在网卡的 ROM 中,当计算机引导时,BIOS 把 PXE Client 调入内存中执行,然后由 PXE Client 将放置在远端的文件通过网络下载到本地运行,运行 PXE 协议需要设置 DHCP 服务器和 TFTP 服务器,DHCP 服务器会给 PXE Client(将要安装系统的主机)分配一个 IP 地址,由于是给 PXE Client 分配 IP 地址,所以在配置 DHCP 服务器时需要增加相应的 PXE 设置.此外,在 PXE Client 的 ROM 中,已经存在了 TFTP Client,那么它就可以通过 TFTP 协议到 TFTP Server 上下载所需的文件了.
Preboot Excution Environment 预启动执行环境.
Intel公司研发
基于Client/Server的网络模式,支持远程主机通过网络从远端服务器下载映像,并由此支持安装Windows,Linux等多种操作系统.
PXE工作原理简述(BIOS引导方式).

0,按下开机键.BIOS载入PXE Client.
1,Clent向Server上的DHCP发送IP地址请求信息,DHCP检测Client是否合法(主要检测Client的网卡MAC地址),如果合法则返回Clent的IP地址,同时将启动文件pxelinux.0的位置信息一并发送pxelinux.0
2,Clent向PXE Server上的TFTP发送获取pxelinux.0请求消息之后在向Client发送pxelinux.0大小信息,试探Client是否满意,当TFTP收到Client发回的同意大小信息之后,正式向Client发送pxelinux.0
3,Client执行接收到的pxelinux.0文件.
4,Client向TFTP Server发送针对本机的配置信息文件(在TFTP服务的pxelinux.cfg目录下),TFTP将配置文件发回Client,继而Client根据配置文件执行后续操作.
5,Client向TFTP发送linux内核请求信息,TFTP接收到消息之后将内核文件发送给Client.
6,Client向TFTP发送根文件请求信息,TFTP接受消息之后返回Linux根文件系统.
7,Clent启动Linux内核.
8,Client下载安装源文件,读取自动化安装脚本.
PXE工作原理简述(UEFI引导方式).
0,按下开机键.BIOS载入PXE Client.
1,Clent向Server上的DHCP发送IP地址请求信息,DHCP检测Client是否合法(主要检测Client的网卡MAC地址),如果合法则返回Clent的IP地址,同时将启动文件syslinux.efi的位置信息一并发送syslinux.efi
2,Clent向PXE Server上的TFTP发送获取syslinux.efi请求消息之后在向Client发送syslinux.efi大小信息,试探Client是否满意,当TFTP收到Client发回的同意大小信息之后,正式向Client发送syslinux.efi
3,Client执行接收到的syslinux.efi文件.
4,Client向TFTP Server发送针对本机的配置信息文件(在TFTP服务的pxelinux.cfg目录下),TFTP将配置文件发回Client,继而Client根据配置文件执行后续操作.
5,Client向TFTP发送linux内核请求信息,TFTP接收到消息之后将内核文件发送给Client.
6,Client向TFTP发送根文件请求信息,TFTP接受消息之后返回Linux根文件系统.
7,Clent启动Linux内核.
8,Client下载安装源文件,读取自动化安装脚本.

PXE服务构建.
安装syslinux启动文件.
pacman -Syy syslinuxvmlinuz指的是内核,作用:进程管理,内存管理,文件管理,驱动管理,网络管理.initrd.img是一个小的映象, 放的是和启动相关的驱动模块.通常的步骤是先启动内核,然后内核挂载initrd.img,并执行里面的脚本来进一步挂载各种各样的模块.其中最重要的就是根文件系统驱动模块,有了它才能挂载根文件系统,继而运行用户空间的第一个应用程序init或者systemd,完成系统后续的启动
TFTP服务器搭建配置.
pacman -Syy tftp-hpa- 👉 配置TFTP服务.
echo 'TFTPD_ARGS="--secure /opt/tftpboot/Centos7"' >/etc/conf.d/tftpd- 👉 挂载Centos7 ISO镜像,并复制启动文件
mount -o loop Centos7.iso /mnt/cd-rom/0
cp -vr /mnt/cd-rom/0/EFI /opt/tftpboot/Centos7_efi
cp -vr /mnt/cd-rom/0/images /opt/tftpboot/Centos7_efi- 👉 配置UEFI启动文件
mkdir -p /opt/tftpboot/Centos7_efi/
mkdir /opt/tftpboot/Centos7_efi/{pxelinux.cfg,ks,iso,centos7}
for i in "/usr/lib/syslinux/efi64/{ldlinux.e64,libutil.c32,menu.c32,syslinux.efi}"; do
cp -v ${i} /opt/tftpboot/Centos7_efi/
done- 👉 配置BIOS启动文件
mkdir -p /opt/tftpboot/Centos7_efi/
mkdir /opt/tftpboot/Centos7_efi/{pxelinux.cfg,ks,iso,centos7}
for i in "/usr/lib/syslinux/efi64/{ldlinux.e64,libutil.c32,menu.c32,syslinux.efi}"; do
cp -v ${i} /opt/tftpboot/Centos7_efi/
done- 👉 启动TFTP服务
systemctl daemon-reload && \
systemctl restart tftpd.socket
DHCP服务器搭建配置.
pacman -Syy dnsmasq- 👉 UEFI引导方式.
cat << "EOF" >>/etc/dnsmasq.conf
port=0
interface=vir-host
bind-interfaces
dhcp-range=192.168.222.2,192.168.222.254,12h
dhcp-boot=syslinux.efi
enable-tftp
tftp-root=/opt/tftpboot/Centos7_efi
EOF- 👉 BIOS引导方式.
cat << "EOF" >>/etc/dnsmasq.conf
port=0
interface=vir-host
bind-interfaces
dhcp-range=192.168.222.2,192.168.222.254,12h
dhcp-boot=pxelinux.0
enable-tftp
tftp-root=/opt/tftpboot/Centos7
EOFinterface– 服务器需要监听并提供服务的网络接口.bind-interfaces– 取消注释来绑定到该网络接口.domain– 替换为你的域名.dhcp-range– 替换为你的网络掩码定义的网段.dhcp-boot– 替换该IP地址为你的网络接口IP地址.dhcp-option=3,192.168.1.1– 替换该IP地址为你的网段的网关.dhcp-option=6,92.168.1.1– 替换该IP地址为你的DNS服务器IP——可以定义多个IP地址.server=8.8.4.4– 这里放置DNS转发服务器IP地址.dhcp-option=28,10.0.0.255– 替换该IP地址为网络广播地址——可选项.dhcp-option=42,0.0.0.0– 这里放置网络时钟服务器——可选项(0.0.0.0地址表示参考自身).pxe-prompt– 保持默认——按F8进入菜单,60秒等待时间.pxe=service– 使用x86PC作为32为/64位架构,并在字符串引述中输入菜单描述提示。其它类型值可以是:PC98,IAEFI,Alpha,Arcx86,IntelLeanClient,IA32EFI,BCEFI,XscaleEFI和X86-64EFI.enable-tftp– 启用内建TFTP服务器.tftp-root– 使用/var/lib/tftpboot——所有网络启动文件所在位置.启动DHCP服务
systemctl daemon-reload && \
systemctl restart dnsmasq.service
NFS服务器搭建配置.
pacman -Syy nfs-utils- 配置NFS服务器.
cat << "EOF" >>/etc/exports
/opt/tftpboot/Centos7/iso 0.0.0.0 (ro,no_subtree_check)
/opt/tftpboot/Centos7/ks 0.0.0.0 (ro,no_subtree_check)
/opt/tftpboot/Centos7_efi/ks 0.0.0.0 (ro,no_subtree_check)
EOF- 启动NFS服务
systemctl daemon-reload && \
systemctl restart nfs-server.service
pxelinux.cfg配置
cat << "EOF" >>/opt/tftpboot/Centos7_efi/pxelinux.cfg/default
default menu.c32
prompt 0
timeout 30
MENU TITLE example.com PXE Menu
LABEL CentOS7_x64
MENU LABEL CentOS 7.2 X86_64
KERNEL centos7/vmlinuz
APPEND initrd=/centos7/initrd.img inst.repo=nfs://192.168.223.1/opt/tftpboot/Centos7/iso ks=nfs://192.168.223.1/opt/tftpboot/Centos7_efi/ks/ks.cfg
label 2
menu label ^2) Boot from local drive
EOFkickstart自动应答文件配置.
kickstart简介.
Kickstart是一项功能,使您能够基于预定义的列表(kickstart文件)安装完整的操作系统.每当您在Red Hat Enterprise Linux,CentOS,Fedora或其他基于Red Hat的Linux发行版上安装操作系统时,您的安装选择都会自动记录在名为anaconda-ks.cfg的kickstart文件中.该文件位于root用户的本地目录:/root/anaconda-ks.cfg
如果在执行安装后查看此文件,您将看到它反映了在安装过程中输入的条目.这些条目将是安装类型(新安装/升级),键盘和时区的目录设置,网络信息(例如dhcp或静态信息),磁盘分区信息,软件包选择等等.我们将更详细地介绍许多这些选项.
kickstart文件的主要功能是使管理员能够快速进行Linux的网络安装,另一个优点是,您可以基于经过验证的构建(标准构建配置)来创建服务器.如果必须频繁创建大量具有相同构建的服务器,则此功能非常有用.您甚至可以指定要在安装后运行的命令,例如创建新帐户.使用kickstart文件的通常方法是从导出的nfs目录中找到该文件或通过Web服务器使其可用,但是,还有其他选项可用.在以下示例中,我们将介绍使用nfs和Web服务器所涉及的过程.
在下面的示例中,我将使用VirtualBox作为测试环境,并使用CentOS 6.5作为Linux操作系统.在这里,我将创建一个服务器,该服务器将充当我们安装的nfs服务器和Web服务器.该服务器将包含定制的kickstart配置文件.
kickstart文件配置(UEFI引导方式)
cat << "EOF" >/opt/tftpboot/Centos7_efi/ks/ks.cfg
#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Firewall configuration
firewall --disabled
# Install OS instead of upgrade
install
# 使用nfs作为安装介质.
url --url="nfs://192.168.223.1/opt/tftpboot/Centos7/iso"
# Root password [i used here 000000]
rootpw --iscrypted $6$An9sv4lvnbw3/g.u$VVoVB3SCUG7.UDvRlOwP2daES3v.Tbp59pw.k1AZAC9YbkTaJIEsAqmwwZYs7GZKAvFzY4FnpIT/mL.6dD8hl0
# System authorization information
auth useshadow passalgo=sha512
# Use graphical install
graphical
reboot
firstboot disable
# System keyboard
# keyboard us
keyboard --vckeymap=cn --xlayouts='cn'
# System language
# 语言中文
lang zh_CN.UTF-8
# SELinux configuration
selinux disabled
# Installation logging level
logging level=info
# System timezone
timezone Asia/Shanghai --isUtc
# System bootloader configuration
#指定引导安装位置
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=vda
#清除硬盘分区表
zerombr
#删除硬盘上的所有分区并初始化磁盘标签
clearpart --all --initlabel
#这里是指定硬盘分区方式,划重点!!!
#因为是UEFI引导,必须指定efi分区且分区的类型必须是efi,挂载到/boot/efi
#size的单位: M --fstype是指定文件系统类型,例如:ext4、xfs
part /boot/efi --fstype="efi" --ondisk=vda --size=1024 --fsoptions="defaults,uid=0,gid=0,umask=0077,shortname=winnt"
part /app --fstype="xfs" --size=20480
part swap --fstype="swap" --size=2048
part / --fstype="xfs" --size=51200
part /boot --fstype="ext4" --size=1024
#将磁盘格式转换成gpt.
%pre
parted -s /dev/vda mklabel gpt
%end
%packages
@core
wget
net-tools
%end
%post
%end
EOFkickstart文件配置(BIOS引导方式)
cat << "EOF" >/opt/tftpboot/Centos7/ks/ks.cfg
#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Firewall configuration
firewall --disabled
# Install OS instead of upgrade
install
# Use NFS installation media
url --url="nfs://192.168.223.1/opt/tftpboot/Centos7/iso"
# Root password [i used here 000000]
rootpw --iscrypted $6$An9sv4lvnbw3/g.u$VVoVB3SCUG7.UDvRlOwP2daES3v.Tbp59pw.k1AZAC9YbkTaJIEsAqmwwZYs7GZKAvFzY4FnpIT/mL.6dD8hl0
# System authorization information
auth useshadow passalgo=sha512
# Use graphical install
graphical
#安装完毕后重启.
reboot
firstboot disable
# System keyboard
# keyboard us
keyboard --vckeymap=cn --xlayouts='cn'
# System language
# lang en_US
lang zh_CN.UTF-8
# SELinux configuration
selinux disabled
# Installation logging level
logging level=info
# System timezone
timezone Asia/Shanghai --isUtc
# System bootloader configuration
bootloader location=mbr
clearpart --all --initlabel
part swap --asprimary --fstype="swap" --size=1024
part /boot --fstype xfs --size=200
part pv.01 --size=1 --grow
volgroup rootvg01 pv.01
logvol / --fstype xfs --name=lv01 --vgname=rootvg01 --size=1 --grow
%packages
@core
wget
net-tools
%end
#--安装完毕后执行的脚本.
%post
# 配置ssh密钥登录服务器.
if ! [ -d /root/.ssh ]; then
mkdir /root/.ssh
fi
cat << "EOF" >/root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDtsqSSs25RVmffaQ8WfzAE6aei3+a3twhHhRssUtN2TdoB9SoIOca3VCw+Du235ukYbAdQRdEdPihqE4HknJFQEGTdtF/S0K4DbJtOMUvXmBtjI4IlV8jXsQ/HqGt7iKYCmIUJwWqEO6Xkh2owmhaMY0NA+ABjkVOVT+hBA8oj3GC1KJl+yB+dX5a42vams2h7chKBZZ/827Hyy7J3pkGQcwLaMGmPdGigfdfNGGUUCl5PzeOsNynYYYnIH7rX8Q3tKMArUjuAyehEcrrF2lfLu1Wx0qXVlIc5S1QuLlRj+NqThiwiBz+HQTmaAyGPk8rW78tfO22EyarWy7FoFySAxAhnoeqNLOawXqIUdknvCT1iT3s1O/kLtmKmStb3rMoS0AwKPORjwpYIaUAvAKR95Wr5jPr0KzxbAC/Btn42JGTG5RhSRcmc6EIUX5LhdER8+tN1hTaRbWudBVBLSlL61+Hd5WsOPmZDf1tpeTPXMfX+L/bCeRpAKbSE3fQG96ogjnX4p8iaYkP7LirOyJGPUZbjB6nAwFeTuLw+yoThE23Y9uPa1UGgPCcByBHdq7J/B2lFc3Ku9YlfdcOVMsftqqKoqEijcPPEZWyHrAiX5pPKpTmyZ/oxu36G9xFZ+gdb+HzaOOUN/UrC3oJfFO6SQVvOgBwvKMJE16SEHXs/vQ==
EOF
sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config
%end
EOF防火墙配置.
systemctl stop firewalld.service && \
iptables -F







