基于Kickstart & PXE的CentOS无人值守安装

当有很多机器需要安装时,一台台的用光盘安装效率会比较低下。本文介绍一种基于PXE和Kickstart技术的RedHat Linux无人值守安装方式,仅需人工开机并选择从网络启动即可,大大提高了系统安装效率。

相关技术介绍

PXE协议

PXE(Pre-boot Execution Environment 预启动执行环境)是由Intel设计的协议,它可以使计算机通过网络启动。协议分为client和server两端,PXE client在网卡的ROM中,当计算机引导时,BIOS把PXE client调入内存执行,并显示出命令菜单,经用户选择后,PXE client将放置在远端的操作系统通过网络下载到本地运行。

PXE协议的成功运行需要解决以下两个问题:

  1. 既然是通过网络传输,那么计算机在启动时,它的IP地址由谁来配置;
  2. 通过什么协议下载Linux内核和根文件系统

对于第一个问题,可以通过DHCP Server解决,由DHCP server来给PXE client分配一个IP地址,DHCP Server是用来给DHCP Client动态分配IP地址的协议,不过由于这里是给PXE Client分配IP地址,所以在配置DHCP Server时,需要增加相应的PXE特有配置。

至于第二个问题,在PXE client所在的ROM中,已经存在了TFTP Client。PXE Client使用TFTP Client,通过TFTP协议到TFTP Server上下载所需的文件。

这样,PXE协议运行的条件就具备了,下面我们就来看看PXE协议的工作过程。

pxe工作工程

pxe工作过程

在上图中,PXE client是需要安装Linux的计算机,TFTP Server和DHCP Server运行在另外一台Linux Server上。Bootstrap文件、配置文件、Linux内核以及Linux根文件系统都放置在Linux Server上TFTP服务器的根目录下。 PXE client在工作过程中,需要三个二进制文件:bootstrap、Linux 内核和Linux根文件系统。Bootstrap文件是可执行程序,它向用户提供简单的控制界面,并根据用户的选择,下载合适的Linux内核以及Linux根文件系统。[1]

Kickstart概念

KickStart是由红帽公司创建的一种无人职守安装方式。KickStart的工作原理是通过记录典型的安装过程中所需人工干预填写的各种参数,并生成一个名为ks.cfg的文件;在其后的安装过程中(不只局限于生成KickStart安装文件的机器)当出现要求填写参数的情况时,安装程序会首先去查找KickStart生成的文件,当找到合适的参数时,就采用找到的参数,当没有找到合适的参数时,才需要安装者手工干预。这样,如果KickStart文件涵盖了安装过程中出现的所有需要填写的参数时,安装者完全可以只告诉安装程序从何处取ks.cfg文件,然后去忙自己的事情。等安装完毕,安装程序会根据ks.cfg中设置的重启选项来重启系统,并结束安装。[2]

使用kickstart来安装系统可以通过本地CD-ROM、本地磁盘、或者通过NFS、FTP、HTTP来进行。[3]

为了使用kickstart,你必须:

  1. 创建一个kickstart文件
  2. 创建一个带有kickstart文件的启动磁盘,或者让kickstart可以通过网络访问
  3. 使能安装树
  4. 开始kickstart安装

关于如何创建Kickstart文件,请参考:https://fedoraproject.org/wiki/Anaconda/Kickstart/zh-cn 或者 http://blog.chinaunix.net/uid-17240700-id-2813881.html

本文使用PXE从网络访问Kickstart文件。

安装服务器搭建

拓扑结构

限于条件,本文安装服务器和待安装机器均使用VMware虚拟机。拓扑结构如下图所示

pxe安装拓扑图

pxe安装拓扑图

使用NAT模式,VM1作为安装服务器(Installer),VM2,VM3作为待安装服务器。PXE安装需要的所有服务都构建在VM1上。VM1上各种服务的用途为:

Dhcpd: 分发IP地址。
Tftpd: 分发启动文件安装。
Httpd:分发系统文件安装。

 

准备必要的文件

准备Centos镜像、引导程序及KS文件,关闭selinux和iptables。(开启selinux和iptables可能会有权限问题报错[4])。

配置TFTP服务器

主要注意disable要改成no,开机启动tftp。server_args指定了tftp的工作目录。如果没有需要自己建立。

配置DHCP服务器

注意next-server和filename的配置。

配置HTTP服务器

系统文件由http服务器提供。

安装测试

执行脚本,搭建好 PXE Installer 服务器。然后分别开启2台虚拟机,进入bios设置从网络启动。注意安装完成之后重启时需要再次进入bios,改回硬盘启动,否则将再次安装系统。(服务器无需这样操作) DHCP获取IP

DHCP获取IP

DHCP获取IP

加载内核

加载内核及initrd.img

加载内核及initrd.img

安装进行中

PXE安装进行中

PXE安装进行中

宿主机4G的内存有些吃力。

安装完成

安装完成

安装完成

遇到的问题

虚拟机没有设置bios网络启动就直接开始PXE安装了

大概是因为前面几项都引导不了,顺延到最后的网络启动了?我猜的。不过这样也好,省的装完还得进bios设置了,不用守着等装完了。(首次不用设置,重装依然需要进入bios设置网络引导)

关于局域网多个DHCP服务器的困惑

看到网上有些文章说虚拟机需要使用Bridge模式,我这里用NAT也没问题。我猜或许是因为下面的原因: DHCP获取IP地址是开机引导以后的事情,而虚拟机没有系统的时候都引导不了,VMnet8的那个DHCP服务器根本就不起作用。当待安装机器发现可以从我搭建的DHCP服务器网络引导之后,自然就用PXE Installer的DHCP服务器了。(不知道对不对)

sed引用变量

IMAGEDIR里面有个斜杠“/”,于是脚本一直报错:

换个分隔符(#)就好了

This device may need to be reinitialized

如图所示

小内存报错

小内存报错

搜索了一下,大部分答案都是说内存不足。centos6.0以上想进图形界面,内存必须大于512MB。虚拟机虽然分配的也是512,但大部分时候都会缩水的。[5]

解决方案,首先想到的是增加内存,可是宿主机内存有限,跑2台1G的虚拟机实在吃力。Google搜到的一些英文网页给出了可用的解决方案[6]:

Issue
The 'clearpart --initlabel' option in a kickstart no longer initializes drives in RHEL 6.3.

Environment
Red Hat Enterprise Linux 6.3
Anaconda (kickstart)

Resolution
Use the 'zerombr' option in the kickstart to initialize disks and create a new partition table.
Use the 'ignoredisk' option in the kickstart to limit which disks are initialized by the 'zerombr' option. The following example will limit initialization to the 'vda' disk only:
zerombr
ignoredisk --only-use=vda

使用zerombr选项。

参考资料

[1]. IBM文库. http://www.ibm.com/developerworks/cn/linux/l-tip-prompt/l-pex/
[2]. 51CTO博客. http://cwtea.blog.51cto.com/4500217/834991/
[3]. Fedora维基. ttps://fedoraproject.org/wiki/Anaconda/Kickstart/zh-cn
[4]. CSDN博客. http://blog.csdn.net/andy_yf/article/details/7749282
[5]. 51CTO论坛. http://bbs.51cto.com/viewthread.php?tid=910125&extra=&page=1
[6]. Linuxquestions. http://www.linuxquestions.org/questions/linux-distributions-5/problems-with-kickstart-initlabel-4175420572/#post4748080

附录

完整部署代码

 

5 thoughts on “基于Kickstart & PXE的CentOS无人值守安装

  1. Pingback: 基于Kickstart的Hadoop集群自动化部署 | 知行近思

回复 annhe_net 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注