因为之前的工作需要搭建红帽实验室环境,由于机器数量比较多,所有需要批量自动化无人值守安装系统,所以我尝试使用
RHEL5+PXE+DHCP+Apache+Kickstart
安装了
RHCE5.1 i386
实验室环境,并取得了成功,不过过程比较漫长,所以我特地记录下
PXE+DHCP+Apache+Kickstart
无人值守安装的过程。另外,我在博客发表了相应的文章,很多热心的读者根据文章内容已成功批量安装了红帽
RHEL
系统或
CentOS5.x
,并提出了许多宝贵的意见,在这里表示感谢。现阶段,由于需要大规模应用
CentOS5.8 x86_64
系统用于集群环境,所以将此方法主要用于在公司内网批量安装新服务器系统,这极大地简化了用光盘重复安装
CentOS5.8 x86_64
的过程,再加上分布式自动化运维工具
puppet
进行批量部署,达到了自动化运维的目的,避免了重复性劳动,极大的提高了工作效率。
首先,我们来介绍一下与之相关的原理和概念。
1. 什么是PXE
严格来说,PXE 并不是一种安装方式,而是一种引导方式。进行 PXE 安装的必要条件是在要安装的计算机中必须包含一个 PXE 支持的网卡(NIC),即网卡中必须要有 PXE Client。PXE (Pre-boot Execution Environment)协议可以使计算机通过网络启动。此协议分为 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 上下载所需的文件了。
2. 什么是Kickstart
Kickstart是一种无人值守的安装方式。它的工作原理是在安装过程中记录典型的需要人工干预填写的各种参数,并生成一个名为 ks.cfg的文件。如果在安装过程中(不只局限于生成Kickstart安装文件的机器)出现要填写参数的情况,安装程序首先会去查找 Kickstart生成的文件,如果找到合适的参数,就采用所找到的参数;如果没有找到合适的参数,便需要安装者手工干预了。所以,如果Kickstart文件涵盖了安装过程中可能出现的所有需要填写的参数,那么安装者完全可以只告诉安装程序从何处取ks.cfg文件,然后就去忙自己的事情。等安装完毕,安装程序会根据ks.cfg中的设置重启系统,并结束安装。
3. PXE + Kickstart的安装条件和详细步骤
执行PXE+Kickstart安装需要的设备为:
DHCP 服务器。
TFTP 服务器。
Kickstart所生成的ks.cfg配置文件。
一台存放系统安装文件的服务器,如 NFS、HTTP 或 FTP 服务器。
一个带有 PXE 支持网卡的主机。
系统环境介绍如下:
服务器系统为
CentOS5.6 x86_64
,
IP
为
192.168.11.29
(此服务器并非一定要限定为
CentOS5.8 x86_64
系统),由于是最小化安装的,我们在后面要用到
system-config-kickstart
工具,它必须依赖于
X windows
,所以我们要提前安装好
X windows
及
gnome
并重启系统,步骤如下所示:
先装
X windows
和
GNOME
桌面环境,命令如下所示:
yum -y groupinstall 'X Window System'
yum -y groupinstall 'GNOME Desktop Environment'
然后修改
/etc/inittab
文件并重启服务器,使其运行在图形模式下,主要修改文件内容如下所示:
id:5:initdefault:
重启服务器命令如下:
reboot
完成上述的准备工作后,
PXE+DHCP+Apache+Kickstart
无人值守安装
CentOS5.8
安装的步骤如下:
(
1
)我们先下载
CentOS5.8 x86_64
光盘至
/usr/local/src
下,并挂载至
/mnt/cdrom
目录下,并确认系统已安装好
httpd
服务,如下:
cd /usr/local/src
wget http://mirror.neu.edu.cn/CentOS/5.8/isos/x86_64/CentOS-5.8-x86_64-bin-DVD-1of2.iso
mkdir –p /mnt/cdrom
接下来我们挂载光盘
ISO
文件至
/mnt/cdrom
目录下,如下命令:
mount -o loop CentOS-5.8-x86_64-bin-DVD-1of2.iso /mnt/cdrom
CetnOS5.x x86_64
系列已默认安装
Apache
,我们可以用命令看下其版本号,如下所示:
rpm -q httpd
命令显示结果如下所示:
httpd-2.2.3-65.el5.CentOS
(
2
)接下来我们复制光盘下的所有内容(文件和文件夹)到
/var/html/www
(此目录为
Apache
默认
DocumentRoot
目录)下,无论是红帽系统还是
CentOS 5.x
系统,如果是最小化安装,基本上第一张
DVD
光盘文件就够了,复制命令如下所示:
cp -rf /mnt/cdrom /var/html/www
(
3
)安装
tftp-server
,并启用
tftp
服务,同时启动
xinetd
进程,步骤如下所示。
1.
我们用命令安装
tftp-server
,命令如下:
yum -y install tftp-server
2.
接着修改
/etc/xinetd.d/tftp
文件,将
disable
的值由
yes
变为
no
,内容如下所示:
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
3.
接着重启
xinetd
进程,命令如下所示:
service xinetd restart
(
4
)配置支持
PXE
的启动程序(注意:前面已经将
CentOS5.8 x86_64
第一张光盘的内容复制到
/var/www/html
目录中了,所以需要的文件只需要从
/var/www/html
目录中复制就行了)。
a)
建立
tftpboot
文件夹,如下所示,若该文件夹已经存在则不用建立。
mkdir -p /tftpboot
b)
复制
pxelinux.0
文件至
tftpboot
文件夹中,如下所示。
cp /usr/lib/syslinux/pxelinux.0 /tftpboot
c)
把
DVD
光盘上的
/image/pxeboot/initrd.img
和
vmlinux
复制到
/tftpboot/
中,如下所示。
cp /var/www/html/images/pxeboot/vmlinuz /tftpboot
d)
复制
DVD
光盘上的
isolinux/*.msg
到
/tftpboot
目录下,如下所示:
cp /var/www/html/isolinux/*.msg /tftpboot/
e)
在
tftpboot
中新建一个
pxelinux.cfg
目录:
mkdir pxelinux.cfg
f)
将
isolinux
目录中的
isolinux.cfg
复制到
pxelinux.cfg
目录中,同时更改文件名称为
default
,命令如下所示:
cd pxelinux.cfg
cp /var/www/html/isolinux/isolinux.cfg /tftpboot/pxelinux.cfg/default
g)
在上一个步骤,即第
6
点中,暂时不要修改
default
文件,进行到这一步时,虽然已经可以通过网络来引导并手动安装
Kickstart
了,但是由于这里讨论的是无人值守安装,所以先不修改这个
default
文件。
(
5
)安装
dhcp
服务,同时修改如下配置:
yum –y install dhcp
然后复制配置模板文件到指定的目录中,并重新命名。
cp /usr/share/doc/dhcp-3.0.5/dhcpd.conf.sample /etc/dhcpd.conf
接着修改
/etc/dhcpd.conf
配置文件,文件最后修改内容如下所示:
ddns-update-style interim;
ignore client-updates;
next-server 192.168.11.29;
filename "/pxelinux.0";
subnet 192.168.11.0 netmask 255.255.255.0 {
option routers 192.168.11.1;
option subnet-mask 255.255.255.0;
option nis-domain "cn7788.com";
option domain-name "cn7788.com";
option domain-name-servers 192.168.11.252;
option time-offset -18000; # Eastern Standard Time
range dynamic-bootp 192.168.11.34 192.168.11.159;
default-lease-time 21600;
max-lease-time 43200;
}
最后启动
dhcp
服务:
service dhcpd start
注:如果机器数量过多的话,注意
dhcp
服务器的地址池,不要因为耗尽
IP
而导致
dhcpd
服务器没有
IP
地址
release
情况。
(
6
)用
yum
工具自动安装
Kickstart
,同时配置
system-config-kickstart
。
a)
首先我们需要安装
Kickstart
这个工具包,在
CentOS
最小化安装系统时,此软件包并没有默认安装,
yum
安装命令如下所示:
yum –y install system-config-kickstart
b)
在
gnome
环境下配置
Kickstart
,命令如下所示:
system-config-Kickstart
运行上面的命令后可以对系统的一些基本配置进行设置,例如选择时区、设置
root
的密码等。
c)
接下来便要进行安装了,建议选择
httpd
安装,切记不要输入任何账号,而是采用匿名安装。
在安装过程中,根据引导选择安装选项,不需要做更改。
d) Kickstart
会让我们选择需要批量安装的
CentOS5.8
分区信息,按照上一节所介绍的
CentOS5.5 x86_64
的安装方法,我们创建四个分区,即
/
、
/boot
、
/data
和
swap
分区。
e)
在进行网络配置时,我使用的静态分配地址(动态同样如此),这里跟前面进行光盘安装是一样的。
f)
设置显示配置时可以按照我们的习惯选择。
g)
关于软件包的选择,大家可以根据实际的工作需求来选择自己需要的软件包,由于服务器安装后用途都是不一样的,建议大家这里选择最小化安装。
h)
其他都选择默认设置,不需要修改。
i)
最后将生成的文件
ks.cfg
保存到
/var/www/html
下,此为自动化无人值守安装的重难点,此文件稍有配置不当的话就会需要人为干预了,如果大家遇到问题,建议参考我下面的
ks.cfg
配置文件。
(
7
)修改
/tftpboot/pxelinux.cfg/default
文件,指定读取
ks.cfg
的方法,即修改文件第一行内容,改动后文件第一行内容如下所示:
default text ks=http://192.168.11.29/ks.cfg
另外,也建议将
timeout
时间由原先的
600
改为
1
,
timeout
时间是引导时等待用户手动选择的时间,设为“
1
”可直接引导。
(
8
)
/var/www/html/ks.cfg
文件内容如下所示(此内容是整个实验过程的重难点,请关注):
#platform=x86, AMD64, or Intel EM64T
#System authorization information
auth --useshadow --enablemd5
# System bootloader configuration
key --skip
bootloader --location=mbr
# Partition clearing information
clearpart --none
# Use graphical install
graphical
# Firewall configuration
firewall --disabled
# Run the Setup Agent on first boot
firstboot --disable
#System keyboard
keyboard us
#System language
lang en_US
# Installation logging level
logging --level=info
# Use network installation
url --url=http://192.168.11.29/
# Network information
network --bootproto=dhcp --device=eth0 --onboot=on
reboot
#Root password
rootpw --iscrypted $1$biw2UUzu$/ZrtUhG9gGGGJn6edgUIQ1
# SELinux configuration
selinux --disabled
# System timezone
timezone --isUtc Asia/Shanghai
# Install OS instead of upgrade
install
# X Window System configuration information
xconfig --defaultdesktop=GNOME --depth=8 --resolution=640x480
# Disk partitioning information
bootloader --location=mbr --driveorder=sda
clearpart --all --initlabel
part / --bytes-per-inode=4096 --fstype="ext3" --size=5120
part /boot --bytes-per-inode=4096 --fstype="ext3" --size=128
part swap --bytes-per-inode=4096 --fstype="swap" --size=500
part /data --bytes-per-inode=4096 --fstype="ext3" --grow --size=1
%packages
@base
@development-libs
@development-tools
此配置过程中的重难点我这里说明下:
分区操作按照目前线上分区来操作,即分成
/
、
/boot
、
/data
及
swap
四个分区,其中
/data
分区是存放数据的,我们这里用
--grow --size=1
参数来将其余的剩余空间全部分配给
/data
分区。
key --skip
如果是红帽系统,此选项可以跳过输入序列号过程;如果是
CentOS 5.x
系列,则可以不保留此项内容;
reboot
此选项必须存在,也必须文中设定位置,不然
kickstart
显示一条消息,并等待用户按任意键后才重新引导,此问题是很多朋友在论坛上发言提问的,我在实验过程中也遇到此问题,建议多做几次实验;
clearpart --all --initlabel
此条命令必须添加,不然系统会让用户手动选择是否清除所有数据,这就需要人为干预了,从而导致自动化过程失败;
其它方面选项较容易看懂,我这里就不再重复了。
(
9
)将
Kickstart
需要的服务器均启动后,此自动化安装系统的过程就完成了,我们就可以在内网机柜中全自动同时安装
CentOS5.8 x86_64
系统了,服务器端启动相应命令如下:
service httpd start
chkconfig httpd on
service dhcpd start
chkconfig dhcpd on
service xinetd restart
系统完成最小化后安装后,大家可以根据自己公司的实际情况来进行系统的优化,此最小化优化脚本
init.sh
还可以让
puppet
服务器进行推送,此脚本内容如下所示:
#/bin/bash
#add the epel repo
cd /usr/local/src
wget http://mirrors.ustc.edu.cn/fedora/epel//5/x86_64/epel-release-5-4.noarch.rpm
rpm -ivh epel-release-5-4.noarch.rpm
#add the rpmforge repo
cd /usr/local/src
wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
rpm -ivh rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
#yum install sysstat
yum -y install gcc gcc-c++ vim-enhanced unzip unrar sysstat
#set the ntp
yum -y install ntp
echo "01 01 * * * /usr/sbin/ntpdate ntp.api.bz >> /dev/null 2>&1" >> /etc/crontab
ntpdate ntp.api.bz
service crond restart
#set the file limit
ulimit -SHn 65535
echo "ulimit -SHn 65535" >> /etc/rc.local
cat >> /etc/security/limits.conf << EOF
* soft nofile 60000
* hard nofile 65535
EOF
#tune kernel parametres
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024 65535
EOF
/sbin/sysctl -p
#set the control-alt-delete to guard against the misuse
sed -i 's@ca::ctrlaltdel:/sbin/shutdown -t3 -r now@#ca::ctrlaltdel:/sbin/shutdown -t3 -r now@' /etc/inittab
#disable selinux
sed -i 's@SELINUX=enforcing@SELINUX=disabled@' /etc/selinux/config
#ssh setting
sed -i -e '74 s/^/#/' -i -e '76 s/^/#/' /etc/ssh/sshd_config
sed -i 's@#UseDNS yes@UseDNS no@' /etc/ssh/sshd_config
service sshd restart
#disable ipv6
echo "alias net-pf-10 off" >> /etc/modprobe.conf
echo "alias ipv6 off" >> /etc/modprobe.conf
echo "install ipv6 /bin/true" >> /etc/modprobe.conf
echo "IPV6INIT=no" >> /etc/sysconfig/network
sed -i 's@NETWORKING_IPV6=yes@NETWORKING_IPV6=no@' /etc/sysconfig/network
chkconfig ip6tables off
#vim setting
echo "syntax on" >> /root/.vimrc
echo "set nohlsearch" >> /root/.vimrc
#chkconfig off services
chkconfig bluetooth off
chkconfig sendmail off
chkconfig kudzu off
chkconfig nfslock off
chkconfig portmap off
chkconfig iptables off
chkconfig autofs off
chkconfig yum-updatesd off
#reboot system
Reboot
注意:
#tune kernel parametres
为内核优化部分,在这里我只做了基础处理,大家有需求可以自行修改,记住:一切以系统稳定为原则。
#vim setting
选项为
vim
的个性化配置,如果想
vim
语法高亮,则必须安装
vim-enhanced
包,另外,
vim
在使用搜索功能,搜索选中内容为高亮,感觉不是特别舒服,所以我这里用了
set nohlsearch
选项,如果大家不介意此项功能,则不需要添加此语句;
#disable ipv6
选项我在测试时发现,在
CentOS5.8 x86_64
系统下,如果不添加
install ipv6 /bin/true
此语句到
/etc/modprobe.conf
文件里,是关闭不了
ipv6
选项的,而测试的
CentOS5.5 | 5.6
不添加此句均可以顺利关闭
ipv6
,这点请大家注意,当然了,最后要
reboot
系统让此配置生效。
引申:相信大家的开发环境应该有不少
Xen
虚拟机,虽然
Xen
有自身的模板文件操作,但我们也可以利用
Kickstart
的方式快速无人值守安装
Xen
虚拟机系统,命令如下所示:
virt-install -n vm4 -r 300 -f /data/vm/vm4.img -s 8 -p -l http://192.168.11.29 -x ks=http://192.168.11.29/ks.cfg
由于
Xen
结合
Kickstart
并不是本文档的重点内容,有兴趣的朋友可以可以自行研究;另外有一点请大家一定要注意:
由于此安装方法太智能化,在网络引导成功以后会自动清除硬盘数据并重新安装新的系统,所以建议大家将此工作区域和网段独立出来,或者在进行完安装工作以后就停用
Kickstart
服务器,以免对正常工作的服务器造成不必要的麻烦。
由于个人能力有限,鉴于工作环境的严谨性,欢迎大家我上述文档中一切错误和不合理之处,欢迎来信与我交流,
个人邮箱[email protected]
。