PXE+kickstart 无人值守安装 CentOS 6
1.1 PXE 说明
所谓的 PXE 是 Preboot Execution Environment 的缩写,字面上的意思是开机前的执行环境。
要达成 PXE 必须要有两个环节:
(1) 一个是客户端的网卡必须要支持 PXE 用户端功能,并且开机时选择从网卡启动,这样系统才会以网卡进入 PXE 客户端的程序;
(2) 一个是 PXE 服务器必须要提供至少含有 DHCP 以及 TFTP 的服务!
且其中:
・DHCP 服务必须要能够提供客户端的网络参数,还要告知客户端 TFTP 所在的位置;
・TFTP 则提供客户端的 boot loader 及 kernel file 下载路径。
还要加上 NFS/FTP/HTTP (选择一样即可) 等提供安装文件 (安装镜像的解压文件),才算是比较完整的 PXE 服务器。一般 TFTP 和 DHCP 服务都由同一台服务器提供,且大多数时候还提供 NFS/FTP/HTTP 服务,所以 PXE 服务器一般是提供 3 合一的服务。
1.2 PXE 流程
[
(1).Client** 向 PXE Server 上的 DHCP 发送 IP 地址请求消息 **,DHCP 检测 Client 是否合法(主要是检测 Client 的网卡 MAC 地址),如果合法则返回 Client 的 IP 地址,同时将 pxe 环境下的 Boot loader 文件 pxelinux.0 的位置信息传送给 Client。
(2).Client** 向 PXE Server 上的 TFTP 请求 pxelinux.0**,TFTP 接收到消息之后再向 Client 发送 pxelinux.0 大小信息,试探 Client 是否满意,当 TFTP 收到 Client 发回的同意大小信息之后,正式向 Client 发送 pxelinux.0。
(3).Client** 执行接收到的 pxelinux.0 文件 **。
(4).Client** 向 TFTP 请求 pxelinux.cfg 文件 **(其实它是目录,里面放置的是是启动菜单,即 grub 的配置文件),TFTP 将配置文件发回 Client,继而 Client 根据配置文件执行后续操作。
(5).Client** 向 TFTP 发送 Linux 内核请求信息 **,TFTP 接收到消息之后将内核文件发送给 Client。
(6).Client** 向 TFTP 发送根文件请求信息 **,TFTP 接收到消息之后返回 Linux 根文件系统。
(7).Client** 加载 Linux 内核 **(启动参数已经在 4 中的配置文件中设置好了)。
(8).Client** 通过 nfs/ftp/http 下载系统安装文件进行安装。如果在 4 中的配置文件指定了 kickstart 路径,则会根据此文件自动应答安装系统。**
1.3 部署环境说明
1.4 部署 DHCP
首先安装 dhcp 服务端程序。
DHCP 主要是提供客户端网络参数与 TFTP 的位置,以及 boot loader 的文件名。同时,我们仅针对内网来告知 TFTP 的相关位置,所以可以编辑 /etc/dhcp/dhcpd.conf 在 subnet 的区块内加入两个参数即可。其中 PXE 上专门为 PXE 客户端下载的 boot loader 文件名称为 pxelinux.0。
重启 dhcp。
1.5 部署 TFTP
从流程图中可以看出,boot loader 文件 pxelinux.0 以及内核相关的配置文件 (目录 pxelinux.cfg 下) 主要都是由 TFTP 来提供的!
TFTP 的安装很简单,直接使用 yum 即可。不过要告诉客户端 TFTP 的根目录在哪里,这样客户端才能找到相关文件。另外要注意,TFTP 是由 xinetd 这个 super daemon 所管理的,因此设定好 TFTP 之后,要启动的是 xinetd。
yum install tftp-server
默认 TFTP 服务的根目录是 /var/lib/tftpboot/,为了少写些字母,将 tftp 的根目录修改为 /tftpboot/。修改 tftp 的配置文件,主要是 TFTP 的根目录。
vim /etc/xinetd.d/tftp
创建 tftp 的根目录。
mkdir /tftpboot
启动 TFTP 并观察之:
/etc/init.d/xinetd restart
chkconfig xinetd on
chkconfig tftp on
netstat -tulnp | grep xinetd
接下来的文件必须要放置于 /tftpboot/ 目录下。
1.6 提供 pxe 的 bootloader 和相关配置文件
如果要使用 PXE 的开机引导的话,需要使用 CentOS 提供的 syslinux 包,从中 copy 两个文件到 tftp 的根目录 /tftpboot 下即可。整个过程如下:
pxelinux.cfg 是个目录,可以放置默认的开机选项,也可以针对不同的客户端主机提供不同的开机选项。一般来说,可以在 pxelinux.cfg 目录内建立一个名为 default 的文件来提供默认选项。
如果没有 menu.c32 或 vesamenu.c32 时,菜单会以纯文字模式一行一行显示。如果使用 menu.c32 或 vesamenu.c32,就会有类似反白效果出现,此时可以使用上下键来选择选项,而不需要看着屏幕去输入数字键来选择开机选项。经过测试,使用 vesamenu.c32 比 menu.c32 更加好看些。
这部分设定完毕后,就是内核相关的设定了。
1.7 从安装镜像获取 Linux 内核文件
要安装 Linux 系统,必须提供内核文件,这里以 64 位版本的 CentOS 6.6 为例。
这里计划将内核相关文件放在 /tftpboot/centos6.6 / 目录下。
既然要从安装镜像中获取内核相关文件,首先得要挂载镜像。
其实仅需要 vmlinuz 和 initrd.img 两个文件即可,不过这里还将 isolinux.cfg 这个文件拷贝出来了,这个文件里提供了开机选项,可以以它作为修改开机选项和菜单的模板,这样修改起来比较容易,也更便捷!
1.8 选项设置
修改开机配置文件 isolinux.cfg。由于拷贝它的时候重命名为 default,所以修改 default 即可。修改的地方标红色了。
vim /tftpboot/default
default vesamenu.c32 #这是必须项,或者改为 menu.c32
timeout 10
*[
1.9 从网卡安装系统 —— 开机测试
设置 Bios 从网卡启动。
[
[
[
[
由于到这里我还没有提供 Linux 的安装文件,所以选择 URL 从互联网来获取系统安装。
[
由于要从互联网上获取系统安装文件,所以需要设置 IP 等网络参数,但要注意,这里的网络参数和前面设置的 PXE 网络参数是无关的,这里设置的 IP 仅是为了联上互联网。由于已经配置了 DHCP,所以这里选择 DHCP。
[
设置一个获取 Linux 系统的站点。上图设置的是 163 的站点。
如果没什么问题,到这里就开始进行安装直到完成了。以下是进度图片。
[
1.10 通过 http/ftp/nfs 来提供系统安装文件
现在在本地服务器上安装 http 或 ftp 或 nfs 来作为系统文件的来源。
首先挂载 Linux 的镜像光盘(前文已经挂载过了),假设挂载到 /mnt 目录上。
mount /dev/cdrom /mnt
注意,要提供的是镜像中的所有文件,而不是简单的提供一个镜像。所以将 /mnt 中的所有文件复制出来,假设复制到目录 /install 目录下。
mkdir /install
cp -a /mnt/* /install
其实也可以不用复制出来的,只需要将镜像挂载到某个目录下,只要 nfs/http/ftp 能够找到它就行了。
(1). 使用 NFS 提供安装文件
yum -y install rpcbind nfs-utils
启动 rpcbind 和 nfs。
service rpcbind start
service nfs start
然后导出 /install 目录给需要安装系统的客户端,这里导出给整个网段。
exportfs -o ro,async,no_root_squash 192.168.100.0/24:/install
showmount -e
(2). 使用 http 提供安装文件
安装 httpd。
yum -y install httpd
service httpd start
由于 http 的 DocumentRoot "/var/www/html",所以系统的安装文件需要在此目录下或其子目录才能找到,假设在 /var/www/html/centos6.6 目录下,只需要简单的将镜像挂载到此目录即可。
mkdir /var/www/html/centos6.6
mount /dev/cdrom /var/www/html/centos6.6
(3). 使用 vsftpd 来提供安装文件
yum -y install vsftpd
由于这里仅用来提供下系统的安装文件,所以就没必要对 vsftpd 多多配置了,使用它最简单的匿名用户模式即可,但是匿名用户的根目录为 /var/ftp,所以要将镜像挂载到此目录或此目录下的子目录下,假设放在 /var/ftp/centos6.6。
mkdir /var/ftp/centos6.6
mount /dev/cdrom /var/ftp/centos6.6
(4). 测试并填写安装文件的路径地址
到此,就可以启动虚拟机来测试了。和前面的一样,直到下面这里。
对于 ftp 和 http,直接填写即可。
ftp://192.168.100.100/centos6.6
http://192.168.100.100/centos6.6
对于 NFS 写这样的路径,因为在上面 NFS 的设定上是导出了 /install 目录,安装文件也是复制到此文件中的。
[
然后就会进入安装画面,但是这样还是有些地方需要手动指定的。无法实现非交互时无人值守的方式安装。
所以下文就介绍 kickstart 实现无人值守的方式。
1.11 kickstart+PXE 无人值守大量部署 Linux
所谓的无人值守,就是自动应答,当安装过程中需要人机交互提供某些选项的答案时(如如何分区),自动应答文件可以根据对应项自动提供答案。但是,无人值守并不完全是无人值守,在设置 bios 从网卡启动是必须人为设置的,且安装完系统后设置不从网卡启动也是需要人为设置的。此处之外,其他的都可以无人值守。
要配置无人值守的系统安装,需要提供安装过程中需要的各种选择,这些选择在 kickstart 的配置文件中,一般正常安装完 Linux 系统在 root 用户的家目录下有一个 anaconda-ks.cfg,该文件的配置说明见 kickstart 文件详解。以下是该文件中的部分内容。
[
不难发现,装系统时很多选项在这里面都记录了。
那么,要使用 kickstart 来批量部署操作系统,就需要提供该文件。以下是我提供的配置文件 /install/ks.cfg (因为我是使用 NFS 作为文件提供源的,所以我将其放在 nfs 的导出目录中,让客户端能够找到)。其中 rootpw 的加密密码要使用 grub-crypt 生成。
vim /install/ks.cfg
nfs --server=192.168.100.100 --dir=/install
然后修改 defalut 文件,让客户端能够找到 ks.cfg 文件。
vim /tftpboot/pxelinux.cfg/default
append initrd=./centos6.6/initrd.img ks=nfs:192.168.100.100:/install/ks.cfg quiet
如果要使用 LVM 的分区方式,参考如下:
如果觉得使用样本的方式手工写配置文件比较麻烦,也可以使用图形化工具来制作 ks.cfg 文件。在 linux 中用 yum 安装 system-config-kickstart 就行了(图形化依赖于 x-window),选项也有些限制(比如分区不能使用 lvm)。
然后找台机器从网卡启动就进入安装模式了。
因为在 ks.cfg 中设置了安装完成后 reboot,所以要手动去修改 bios 不要再从网卡启动,否则重启后又再次从网卡启动然后又去自动应答装系统了。当然,可以将 reboot 换成 shutdown 或者 poweroff,这样装完就只是关机了,等开机前人为设置不从网卡启动。