前言
为了面对安装大量的相同的操作系统,我们需要掌握如何快速,并且自动的将新的虚拟机安装上对应的操作系统。
对于Linux来说,我们通常使用PXE KickStart的方式进行操作系统的自动化安装。那么首先需要先了解一下KickStart。灵活使用以后,可以用Cobbler进行部署
PXE Kickstart介绍
KickStart工作原理
KickStart是Linux的一种无人职守的安装方式。KickStart的工作原理是通过记录典型的安装过程中所需人工干预填写的各种参数,并生成一个名为 ks.cfg的文件;这样在后面安装过程中当出现要求填写参数的情况时,安装程序会首先去查找 KickStart生成的文件,当找到合适的参数时,就采用找到的参数,当没有找到合适的参数时,才需要安装者手工干预。如果KickStart文件涵盖了安装过程中出现的所有需要填写的参数时,那么就完全不需要人工干预,安装程序会根据ks.cfg中设置的选项自动进行安装,并通过设置重启选项来重启系统,并结束安装。那么如何让服务器开机就开始自动安装操作系统呢,我们要借助开机启动选项,比如从PXE启动。
PXE工作原理
不管是服务器还是普通的PC机都支持多种启动方式,例如从硬盘、从U盘、从网络启动。而PXE是服务器开机启动的一种方式,也可以称之为网卡启动,因为进行PXE安装的必要条件是计算机上的网卡要支持PXE,即网卡中必须要有 PXE Client,不过不用担心基本上我们常见的服务器都支持这种方式。首先我们需要了解下PXE的工作方式:PXE (Pre-boot Execution Environment)协议使计算机可以通过网络启动。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。PXE Client 通过 TFTP 协议到 TFTP Server 上下载所需的文件。
PXE Kickstart工作流程
下图显示了PXE Kickstart的工作流程
1.PXE Client发送DHCP请求到DHCP Server
2.DHCP Server提供相关信息包括IP地址和TFTP服务器的位置,以及要下载的文件。
3.PXE Client请求TFTP Server。
4.TFTP Server响应请求并将文件发送给PXE Client
5.PXE Client去下载对应的Kickstart文件,并根据Kickstart文件中的内容开始进行安装
6.安装操作系统。
准备服务程序
需要用到SYSLinux引导服务、DHCP服务、vsftpd文件传输服务(或httpd网站服务)、TFTP服务以及KickStart应答文件。
制作本地Yum仓库
下面我们就要准备先手动来通过PXE Kickstart来实现自动化的系统安装,那么首先需要有一个YUM仓库,而且是本地的。下面我就拿CentOS 7为例:
准备安装源
安装需要软件包
安装EPEL源
代码语言:javascript复制[root@linux-node1 ~]# rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
我们使用HTTP的方式作为YUM仓库的安装源,需要首先安装Apache,其中createrepo 是一个对rpm 文件进行索引建立的工具。
代码语言:javascript复制[root@linux-node1 ~]# yum install -y httpd createrepo
[root@linux-node1 ~]# systemctl start httpd.service
下载iso镜像
代码语言:javascript复制[root@linux-node1 ~]# cd /usr/local/src
# wget https://mirrors.aliyun.com/centos/7.7.1908/isos/x86_64/CentOS-7-x86_64-DVD-1908.iso
创建yum仓库
代码语言:javascript复制[root@linux-node1 ~]# mount -o loop /usr/local/src/CentOS-7-x86_64-DVD-1908.iso /mnt/
如果你使用VMWare Workstation创建虚拟机的时候设置了ISO镜像,可以不用下载,直接挂载使用。
代码语言:javascript复制[root@linux-node1 ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 is write-protected, mounting read-only
在默认Apache的家目录下创建目录
代码语言:javascript复制[root@linux-node1 ~]# mkdir /var/www/html/CentOS-7-x86_64
[root@linux-node1 ~]# cp -a /mnt/* /var/www/html/CentOS-7-x86_64/
准备Kickstart安装文件
代码语言:javascript复制[root@linux-node1 ~]# cd /var/www/html/CentOS-7-x86_64/
[root@linux-node1 CentOS-7-x86_64]# vim CentOS-7-x86_64.cfg
#Kickstart Configurator by liuluanyi
#platform=x86, AMD64, or Intel EM64T
#System language
lang en_US
#System keyboard
keyboard us
#Sytem timezone
timezone Asia/Shanghai
#Root password
rootpw --iscrypted $1$example$I.i3m26O7QYNja8p5Cj9.0
#Use text mode install
text
#Install OS instead of upgrade
install
#Use NFS installation Media
url --url=http://192.168.80.11/CentOS-7-x86_64
#System bootloader configuration
bootloader --location=mbr --driveorder=sda --append="net.ifnames=0 biosdevname=0"
#Clear the Master Boot Record
zerombr
#Partition clearing information
clearpart --all --initlabel
#Disk partitioning information
part /boot --fstype=xfs --size=1024
part swap --asprimary --fstype="swap" --size=1024
part / --fstype=xfs --size=1 --grow
#System authorization infomation
auth --useshadow --enablemd5
#Network information
network --bootproto=dhcp --device=eth0 --onboot=on --activate
# Reboot after installation
reboot
#Firewall configuration
firewall --disabled
#SELinux configuration
selinux --disabled
#Service configuration
services --disabled=postfix
#Do not configure XWindows
skipx
#Package install information
%packages
@ base
@ core
bash-completion
sysstat
ntp
lrzsz
openssl-devel
zlib-devel
OpenIPMI-tools
screen
%end
上述的rootpw可以使用下面命令生成:
代码语言:javascript复制[root@linux-node1 ~]# openssl passwd -1 -salt 'password' '123456'
$1$password$7ZK8mMeLGXxbNPeJEFJOU0
上述cfg文件的一些参数解释:
- url:值为我自有的镜像地址
- text:使用text模式安装而不加载GUI
- 分区:分为3个区
- swap:1GB
- boot:1GB
- /:剩下的空间
- packages:最小化安装(core)并安装wget与curl
- addon:关闭kdump
- post:
- text: 使用文本模式安装。
- zerombr: 清除mbr引导信息。
- bootloader: 系统引导相关配置。
- rootpw: root密码
- part: 磁盘分区。
- --fstype= :为分区设置文件系统类型.有效的类型为ext2,ext3,swap和xfs。
- --size= : 以MB为单位的分区最小值.在此处指定一个整数值,如500.不要在数字后面加MB。
- --grow: 告诉分区使用所有可用空间(若有),或使用设置的最大值。
配置TFTP-Server
我们已经了解了PXE Kickstart的原理,那么我们需要准备相关dhcp、tftp-server等。
安装配置tftp-server
代码语言:javascript复制[root@linux-node1 ~]# yum install -y tftp-server xinetd
[root@linux-node1 ~]# vim /etc/xinetd.d/tftp
disable = no(修改为no)
准备安装需要的文件
代码语言:javascript复制[root@linux-node1 ~]# yum install -y syslinux
[root@linux-node1 ~]# mkdir /var/lib/tftpboot/pxelinux
[root@linux-node1 ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/pxelinux
[root@linux-node1 ~]# cp /mnt/isolinux/* /var/lib/tftpboot/pxelinux
[root@linux-node1 ~]# cp /mnt/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/pxelinux/
在上述的isolinux文件文件作用:
- chain.c32:引导系统
- mboot.c32:通过内存引导
- memdisk:将内存模拟为磁盘
- menu.c32:菜单文件
- pxelinux.0:引导程序,用于加载kernel和initrd
- vmlinuz:内核
- initrd.img:虚拟根文件
在tftpboot下创建pxelinux.cfg目录
代码语言:javascript复制[root@linux-node1 ~]# mkdir /var/lib/tftpboot/pxelinux/pxelinux.cfg
[root@linux-node1 ~]# cp /mnt/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux/pxelinux.cfg/default
修改default配置,指定网站安装的kickstart文件
代码语言:javascript复制[root@linux-node1 ~]# vim /var/lib/tftpboot/pxelinux.cfg/default
…省略…
#在label linux上面增加自动化安装的配置
label ks
menu label ^Auto Install CentOS 7
kernel vmlinuz
append initrd=initrd.img ip=dhcp inst.repo=http://192.168.80.11/CentOS-7-x86_64/ inst.ks=http://192.168.80.11/CentOS-7-x86_64/CentOS-7-x86_64.cfg net.ifnames=0 biosdevname=0
因为我是通过网络进行自动安装,需要在“inst.ks”中指定kickstart生成的自动安装配置文件。因为我有自建的源镜像,所以地址如上。
配置DHCP Server
如果是自身网卡开启了DHCP功能,建议关闭。否则地址分配得到的是自身网卡DHCP分配的网段,或者分配不成功。
代码语言:javascript复制[root@linux-node1 ~]# yum install -y dhcp
[root@linux-node1 ~]# /bin/cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
[root@linux-node1 ~]# vim /etc/dhcp/dhcpd.conf
option domain-name "liuluanyi.com";
option domain-name-servers 192.168.80.2;
#请删除其他的subnet配置
subnet 192.168.80.0 netmask 255.255.255.0 {
range dynamic-bootp 192.168.80.90 192.168.80.100;
option subnet-mask 255.255.255.0; #设置子网掩码
option routers 192.168.80.2; #设置网关
next-server 192.168.80.11; #设置TFTP-Server地址
filename "pxelinux/pxelinux.0"; #设置TFTP需要下载的文件
}
启动httpd、tftp和dhcpd服务
代码语言:javascript复制[root@linux-node1 ~]# systemctl start xinetd.service dhcpd.service httpd.service
检查服务是否启动
代码语言:javascript复制[root@linux-node1 ~]# netstat -ntulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1112/master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 949/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1112/master
tcp6 0 0 :::22 :::* LISTEN 949/sshd
udp 0 0 0.0.0.0:67 0.0.0.0:* 1487/dhcpd
udp 0 0 0.0.0.0:69 0.0.0.0:* 974/xinetd
自动化安装和流程总结
现在就可以新创建一台虚拟机来进行测试了,记着选择网卡启动。DHCP后,就可以看到安装页面。我们刚才添加的Auto Install CentOS 也可以看到了。
下面我们可以来总结下PXE KickStart的安装流程了:需要经历以下的过程:
1.网卡上的PXE芯片有512字节,存放了DHCP和TFTP的客户端。
2.启动计算机选择网卡启动。
3.PXE上的DHCP客户端会向DHCP服务器,申请IP地址
4.DHCP服务器分配给它IP地址的同时通过以下字段,告诉pxe,TFTP的地址和它要下载的文件
代码语言:javascript复制next-server 192.168.80.11;
filename "pxelinux.0";
5.pxelinux.0告诉PXE要下载的配置文件是pxelinux.cfg目录下面的default
6.pxe下载并依据配置文件的内容下载启动必须的文件,并通过ks.cfg配置内容开始系统安装。