利用PXE自动化安装centos7
前言
PXE的功能及原理。大概解释一下意思就是:
- 启动计算机的时候如果没有插入U盘以及光驱等介质的话,boot启动项是有一个从PXE启动的选项,如果都没有则会从pxe启动。
- PXE上的DHCP客户端会向DHCP服务器,申请IP地址,DHCP服务器分配一个IP址地给它,同时DHCP服务器还会告诉客户端配置文件名称以及TFTP服务器的地址,让PXE客户端去下载。
- 配置文件(一般是pxelinux.0)告诉PXE客户端系统的安装启动项是在pxelinux.cfg目录下面的default这个文件里。
- PXE下载并依据配置文件的内容下载启动必须的文件,并通过kickstart.cfg 配置文件开始安装系统
- 使用cobbler 也可以自动化安装,这个是二次封装,用着相对简单一点,感兴趣的可以自行搜索。有时间我会再写一篇。
环境准备
这里我提前安装了一台centos7,来当服务器。
服务器需要安装:
dhcp服务:用来给刚开机的客户端分配ip地址以及告知配置文件和tftp服务器的IP地址。
tftp服务:用来给客户端提供所需配置文件的下载路径。
httpd/vsftpd服务:两者选一即可,用来让客户端下载镜像。
xinetd服务:用来接管tftp服务,来做一些策略。
syslinux: 需要从这里来拷贝pxelinux.0等文件。
总之一条命令:
[root@localhost tftpboot]# yum install dhcpd tftp-server httpd syslinux xinetd -y
#其中httpd可换成vsftpd,我这里就用httpd做了,就不安装vsftpd了
服务器需要的配置:
- 关闭防火墙
关闭防火墙
systemctl stop firewalld.service
#关闭防火墙
systemctl disable firewalld.service
#取消防火墙开机自启动
setenforce 0
#临时关闭防火墙
getenforce
#获取防火墙状态
把/etc/selinux/config 里的SELINUX=enforcing 改成 SELINUX=disabled
#来永久关闭selinux
#centos 7 现在使用firewalld.service代替iptables,并且使用systemctl来管理比较方便#
- 配置静态ip
因为dhcp服务器需要,所以需要把服务器更改成静态ip
[root@localhost ~]#vim /etc/sysconfig/network-scripts/ifcfg-ens37
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPADDR=192.168.2.1
NETMASK=255.255.255.0
NAME="ens37"
DEVICE="ens37"
ONBOOT="yes"
#我这里是第二块网卡。
#然后ifdown ens37;ifup ens37 来使网卡生效。
#通过ip a来查看是否成功
- 配置dhcp服务
[root@localhost ~]# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
#把dhcp 样例文件拷贝到文件夹里做修改,核心内容如下:
subnet 192.168.2.0 netmask 255.255.255.0 {
range 192.168.2.10 192.168.2.100;
option routers 192.168.2.1;
option subnet-mask 255.255.255.0;
default-lease-time 600;
max-lease-time 7200;
next-server 192.168.2.1; #告诉客户端pxelinux.0从哪里下载
filename "pxelinux.0"; #告诉客户端有个配置文件可以下载
#然后重启服务systemctl restart dhcpd
#开机自启动服务 systemctl enable dhcpd(后面不再一一重复)
}
- 挂载镜像
mkdir /var/www/html/media
mount /dev/sr0 /var/www/html/media
也可以把镜像所有文件复制进这个目录里,看自己选择
这只是临时挂载点,如果需要开机自动的话,需要写fstab文件
这里就不说这么多了
- 配置tftp目录和服务
1)首先配置一下tftp的文件目录
mkdir /tftpboot
mkdir /tftpboot/pxelinux.cfg
cp /usr/share/syslinux/pxelinux.0 /tftpboot/
cp /usr/share/syslinux/chain.c32 /tftpboot/
cp /usr/share/syslinux/mboot.c32 /tftpboot/
cp /usr/share/syslinux/memdisk /tftpboot/
cp /usr/share/syslinux/menu.c32 /tftpboot/
cp /var/www/html/media/images/pxeboot/vmlinuz /tftpboot/
cp /var/www/html/media/images/pxeboot/initrd.img /tftpboot/
cp /var/www/html/media/isolinux/isolinux.cfg /tftpboot/pxelinux.cfg/default
最后文件的目录结构是
/tftpboot/
├── boot.msg
├── chain.c32
├── initrd.img
├── mboot.c32
├── memdisk
├── menu.c32
├── pxelinux.0
├── pxelinux.cfg
│ └── default
└── vmlinuz
2)配置tftp服务使用xinetd托管,更改内容我用#号注释
vi /etc/xinetd.d/tftp 内容如下
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot #更改tftp目录
disable = no #启动服务
per_source = 11
cps = 100 2
flags = IPv4
}
然后 systemctl stop tftp.socket 关闭tftp
使用xinetd打开tftp systemctl restart xinetd.service
- 配置tftp目录里pxelinux.cfg/default的文件内容
[root@localhost ~]# vi //tftpboot/pxelinux.cfg/default
default menu.c32
#首先这里需要改成menu.c32 从isolinux拷贝的文件配置默认是vesamenu.c32
timeout 100
prompt 0
menu title PXE MENU
label linux
menu label ^Install CentOS 7
kernel vmlinuz
append initrd=initrd.img ks=http://192.168.2.1/centos7.cfg
# 这里需要写http里的.cfg 的路径,可以自己检查是否能打开
上面是我找到简单的一个配置,注意#号
- 配置http文件,及kickstart.cfg(文件名没有特殊要求,上下一致即可,我这里写的是centos7.cfg)配置文件内容。
获取这个文件有两种方式,一种是从安装好的系统复制, 一种是使用图形页面获取,在linux中用yum安装system-config-kickstart就行了(但是需要现有系统安装了桌面,我这边是最小化安装的,没有桌面),选项也有些限制(比如分区不能使用lvm),这里就不演示了。
首先来看下http 目录结构
[root@localhost ~]# cp /root/anaconda-ks.cfg /var/www/html/centos7.cfg
[root@localhost ~]# tree -L 2 /var/www/html/
/var/www/html/
├── centos7.cfg #这里是配置文件
├── index.html
└── media
├── CentOS_BuildTag
├── EFI
├── EULA
├── GPL
├── images
├── isolinux
├── LiveOS
├── Packages
├── repodata
├── RPM-GPG-KEY-CentOS-7
├── RPM-GPG-KEY-CentOS-Testing-7
└── TRANS.TBL
**查看copy过来的文件**
#version=DEVEL
# System authorization information
install
#(1)添加 告知安装程序,这是一次全新安装,而不是升级upgrade
text
#(2)添加 使用text文本安装方式
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
# cdrom (3)这里需要注释
url --url="http://192.168.2.1/media"
# (4)配置镜像所在位置
# Use graphical install
# graphical (5)这里需要注释
# Run the Setup Agent on first boot
firstboot --disable
# (6) 关闭自启动
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8
# Network information
network --bootproto=dhcp --device=link --activate
#(7) 配置网卡为自动获取
network --hostname=localhost.localdomain
# Root password 设置root密码
rootpw 123456
# System services
services --disabled="chronyd"
# System timezone
timezone Asia/Shanghai --isUtc --nontp
# System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
#(8) BootLoader 更改为如上
# Partition clearing information
zerombr
clearpart --all --initlabel
reboot
#(9) 清空分区信息,然后设定安装完成后重启,此选项必须存在,不然kickstart显示一条消息,并等待用户按任意键后才重新引导,也可以选择halt关机。
# Disk partitioning information (设置分区)
part pv.311 --fstype="lvmpv" --ondisk=sda --size=50175
part /boot --fstype="xfs" --ondisk=sda --size=1024
volgroup centos --pesize=4096 pv.311
logvol / --fstype="xfs" --grow --maxsize=51200 --size=1024 --name=root --vgname=centos
logvol swap --fstype="swap" --size=3968 --name=swap --vgname=centos
%packages #要安装的软件包,不做配置的话,是按照你当前系统的配置
@^minimal
@core
%end
%addon com_redhat_kdump --disable --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
%post #可选,安装完成后要执行的脚本
最后通过工具检查配置文件是否正确
yum install system-config-kickstart
ksvalidator /var/www/html/centos7.cfg
注意:
如果开机未获取到IP地址,请检查启动项,以及dhcp服务
如果出现 vesamenu.c32 notfound 请检查pxelinux.cfg/default 配置文件的第一行,是否更改为menu.c32
如果出现
PXE-T01:File not found
请检查tftp是否配置好
[root@localhost ~]# ss -nul | grep 69
UNCONN 0 0 *:69 *:*
检查端口。或检查配tftp目录
如果出现
dracut-initqueue timeout
/dev/root does not exist
请检查tftp里配置文件