本安装过程基于虚拟机环境,并且按照《Linux 运维之道》一书

(ISBN 978-7-121-21877-4)中的指导进行操作,在这里记录起来是为了日后有需要时的参考,查阅。


下面是整个网络拓扑结构


*****运行 CentOS6.5 的 guest 虚拟机,其上部署 DHCP,TFTP,NFS 服务器进程,作为 PXE 网络安装环境下的服务器IP 为 192.168.1.35


*****一台 guest 虚拟机客户端,通过 vmware workstation 构建时,选择与 CentOS6.5 服务器相同的配置,并且要选择加载本地的任何 ISO 镜像文件来安装系统,构建完成后,进入虚拟机的 BIOS ,选择以 PXE 形式启动,就可以全自动安装 CentOS



一,在作为安装服务器的 CentOS6.5 guest 虚拟机上,搭建 DHCP 服务器:

[root@centos6-5vm ~]# find / -name dhcp*
[root@centos6-5vm ~]# rpm -q dhcp
[root@centos6-5vm ~]# yum list dhcp
[root@centos6-5vm ~]# yum install dhcp
[root@centos6-5vm ~]# rpm -qc dhcp
/etc/dhcp/dhcpd.conf

[root@centos6-5vm ~]# vim /etc/dhcp/dhcpd.conf 

subnet 192.168.1.0 netmask 255.255.255.0 {

        option routers                  192.168.1.1;
        option domain-name-servers      192.168.1.35;
        range                           192.168.1.50 192.168.1.100;
        default-lease-time              21600;
        max-lease-time                  43200;
        next-server                     192.168.1.35;
        filename                        "pxelinux.0";
}
[root@centos6-5vm ~]# service dhcpd start
正在启动 dhcpd:                                           [确定]

[root@centos6-5vm ~]# chkconfig --level 5 dhcpd on
[root@centos6-5vm ~]# chkconfig --list dhcpd 
dhcpd              0:关闭    1:关闭    2:关闭    3:关闭    4:关闭    5:启用    6:关闭


[root@centos6-5vm ~]# netstat -antupeo | grep dhcpd
udp        0      0 0.0.0.0:67                  0.0.0.0:*                               0          618227     21508/dhcpd         off (0.00/0/0)




二,搭建 TFTP 服务器:


[root@centos6-5vm ~]# yum list tftp
[root@centos6-5vm ~]# yum install tftp-server
[root@centos6-5vm ~]# rpm -qi tftp-server
Name        : tftp-server                  Relocations: (not relocatable)
Version     : 0.49                              Vendor: CentOS
Release     : 7.el6                         Build Date: 2011年09月23日 星期五 20时32分37秒
Install Date: 2014年10月13日 星期一 00时13分09秒      Build Host: c6b5.bsys.dev.centos.org
Group       : System Environment/Daemons    Source RPM: tftp-0.49-7.el6.src.rpm
Size        : 54358                            License: BSD
Signature   : RSA/SHA1, 2011年09月26日 星期一 12时15分28秒, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://www.kernel.org/pub/software/network/tftp/
Summary     : The server for the Trivial File Transfer Protocol (TFTP)
Description :
The Trivial File Transfer Protocol (TFTP) is normally used only for
booting diskless workstations.  The tftp-server package provides the
server for TFTP, which allows users to transfer files to and from a
remote machine. TFTP provides very little security, and should not be
enabled unless it is expressly needed.  The TFTP server is run from
/etc/xinetd.d/tftp, and is disabled by default.


[root@centos6-5vm ~]# vim /etc/xinetd.d/tftp

service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s /var/lib/tftpboot
        disable                 = no
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}


[root@centos6-5vm ~]# yum list xinetd
[root@centos6-5vm ~]# yum install xinetd
[root@centos6-5vm ~]# service xinetd start
[root@centos6-5vm ~]# service iptables stop
[root@centos6-5vm ~]# chkconfig --level 5 xinetd on

上面在用 yum 安装 tftp-server 时,注意不要漏掉 -server  ,否则只会安装 tftp 的客户端,可以用下面命令来验证是否成功通过 xinetd 启动 tftp

[root@centos6-5vm ~]# cat /etc/services | grep tftp
tftp            69/tcp
tftp            69/udp

[root@centos6-5vm ~]# netstat -antupeo | grep 69

udp        0      0 0.0.0.0:69                  0.0.0.0:*                               0          732341     25847/xinetd        off (0.00/0/0)

从上面输出可以看到,在 udp 端口 69 监听的是 xinetd 进程,它就是托管 tftp 的服务



三,下面这一步比较关键,在你的 vmware workstation 中,打开虚拟机 CentOS6.5 的

设置对话框,定位到 CD / DVD (IDE) 这一项后,在本地宿主操作系统(host)上,找到 Centos6.5 的 ISO 光盘镜像,将上方的 connected 与connect at power on  两个勾上,如下所示:


PXE网络启动无人值守自动安装 centos 全程实录_rhel


这样就会将 host 的 ISO 镜像,自动挂载到虚拟机的文件系统目录中,使用下面命令,找出虚拟机的光驱被挂载到哪个目录下:

[root@centos6-5vm ~]# mount | grep '/dev/sr0'
/dev/sr0 on /media/CentOS_6.5_Final type iso9660 (ro,nosuid,nodev,uhelper=udisks,uid=0,gid=0,iocharset=utf8,mode=0400,dmode=0500)
[root@centos6-5vm ~]#


四,安装 syslinux 软件包,可以从安装光盘里的 rpm 包安装,或者用 yum 来安装:

[root@centos6-5vm ~]# find / -name *syslinux*
/media/CentOS_6.5_Final/Packages/syslinux-4.02-8.el6.i686.rpm


[root@centos6-5vm ~]# yum install syslinux


安装 syslinux 的目的,在于将其中的 pxelinux.0 这个关键的启动文件,复制到 tftp 服务器的共享目录下,用于客户端的 PXE 启动:


[root@centos6-5vm ~]# mkdir /var/lib/tftpboot
[root@centos6-5vm ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot
[root@centos6-5vm ~]# ll /var/lib/tftpboot/pxelinux.0 
-rw-r--r--. 1 root root 26595 10月 12 12:51 /var/lib/tftpboot/pxelinux.0


五,将安装光盘中的 isolinux.cfg 文件, 复制到 tftp 服务器的共享目录下的

pxelinux.cfg 子目录中,并且改名成 default 文件:


[root@centos6-5vm ~]# mkdir /var/lib/tftpboot/pxelinux.cfg
[root@centos6-5vm ~]# cp /media/CentOS_6.5_Final/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
[root@centos6-5vm ~]# chmod 644 /var/lib/tftpboot/pxelinux.cfg/default 
[root@centos6-5vm ~]# ll /var/lib/tftpboot/pxelinux.cfg/default 
-rw-r--r--. 1 root root 936 10月 12 13:05 /var/lib/tftpboot/pxelinux.cfg/default


[root@centos6-5vm ~]# vim /var/lib/tftpboot/pxelinux.cfg/default

default linux            #如果启动时不按任何选项,默认执行lable linux安装
#prompt 1                #启动时候等待参数,设置为0 表示启动不等待参数,直接进入,网络安装必须为1
timeout 600

display boot.msg         #要在启动画面同时显示.msg文件,将其复制到/var/lib/tftpboot/目录下

menu background splash.jpg  #要在启动画面同时显示.jpg文件,将其复制到/var/lib/tftpboot/目录下
menu title Welcome to CentOS 6.5!
menu color border 0 #ffffffff #00000000
menu color sel 7 #ffffffff #ff000000
menu color title 0 #ffffffff #00000000
menu color tabmsg 0 #ffffffff #00000000
menu color unsel 0 #ffffffff #00000000
menu color hotsel 0 #ff000000 #ffffffff
menu color hotkey 7 #ffffffff #ff000000
menu color scrollbar 0 #ffffffff #00000000

label linux
  menu label ^Install or upgrade an existing system
  menu default
  kernel vmlinuz
  append initrd=initrd.img ks=nfs:192.168.1.35:/ks/ks.cfg    #指定kickstart配置文件


六,仅共享了 PXE 启动文件还不够,需要共享与 Linux 内核映像相关的文件,还有前面在注释中提到的欢迎界面文件:

[root@centos6-5vm ~]# cp /media/CentOS_6.5_Final/isolinux/{vmlinuz,initrd.img,boot.msg,splash.jpg} /var/lib/tftpboot 

[root@centos6-5vm ~]# ls -alit /var/lib/tftpboot 
总用量 35104
1572420 -r--r--r--.  1 root root   151230 10月 12 14:14 splash.jpg
1572360 -r--r--r--.  1 root root       84 10月 12 14:14 boot.msg
1572424 -r--r--r--.  1 root root 31742048 10月 12 14:14 initrd.img
1572072 drwxr-xr-x.  3 root root     4096 10月 12 14:14 .
1572116 -r-xr-xr-x.  1 root root  4002656 10月 12 14:14 vmlinuz
1572408 drwxr-xr-x.  2 root root     4096 10月 12 14:07 pxelinux.cfg
1572147 -rw-r--r--.  1 root root    26595 10月 12 12:51 pxelinux.0
1569794 drwxr-xr-x. 40 root root     4096 10月 12 12:51 ..
[root@centos6-5vm ~]# ls -alit /var/lib/tftpboot/pxelinux.cfg/ 
总用量 12
1572072 drwxr-xr-x. 3 root root 4096 10月 12 14:14 ..
1572408 drwxr-xr-x. 2 root root 4096 10月 12 14:07 .
1572419 -rw-r--r--. 1 root root  960 10月 12 13:58 default


/var/lib/tftpboot  的共享目录结构应该和上面的输出类似,注意几个重要的启动文件,启动配置文件,以及内核映像文件的存储位置



七,安装图形界面工具 system-config-kickstart  ,并且用该工具来创建 kickstart 配置文件,用于在后续的安装过程中,自动配置给定的系统参数和自动安装选定的 rpm 软件包:

注意,该工具在 CentOS6.5 的安装光盘中没有,需要从 CentOS 官方网站中给出的 yum 安装服务器,或者你自定义的 yum 安装服务器下载安装:


[root@centos6-5vm ~]# yum install system-config-kickstart

Installed:
  system-config-kickstart.noarch 0:2.8.6.5-1.el6                                                                                                                           

Dependency Installed:
  anaconda.i686 0:13.21.215-1.el6.centos                anaconda-yum-plugins.noarch 1:1.0-5.1.el6              createrepo.noarch 0:0.9.9-18.el6                           
  deltarpm.i686 0:3.5-0.5.20090913git.el6               device-mapper-multipath.i686 0:0.4.9-72.el6_5.4        device-mapper-multipath-libs.i686 0:0.4.9-72.el6_5.4       
  fcoe-utils.i686 0:1.0.28-3.el6                        iscsi-initiator-utils.i686 0:6.2.0.873-10.el6          isomd5sum.i686 1:1.0.6-1.el6                               
  libconfig.i686 0:1.3.2-1.1.el6                        libhbaapi.i686 0:2.2.9-1.el6                           libhbalinux.i686 0:1.0.16-1.el6                            
  lldpad.i686 0:0.9.46-3.el6_5                          lldpad-libs.i686 0:0.9.46-3.el6_5                      makebootfat.i686 0:1.4-10.el6                              
  pykickstart.noarch 0:1.74.14-1.el6                    pyparted.i686 0:3.4-4.el6                              python-cryptsetup.i686 0:0.0.11-1.el6                      
  python-deltarpm.i686 0:3.5-0.5.20090913git.el6        python-pyblock.i686 0:0.48-1.el6                       squashfs-tools.i686 0:4.0-5.el6                            
  system-config-language.noarch 0:1.3.4-6.el6           tigervnc-server.i686 0:1.1.0-8.el6_5


system-config-kickstart 依赖于很多软件包,上面列出所有安装的依赖包,这些包很可能被同样以 system-config-   为前缀的其它图形界面工具所依赖,我们可以用 rpm  -qi  来一一查询这些软件包的用途:


[root@centos6-5vm ~]# rpm -qi iscsi-initiator-utils
Name        : iscsi-initiator-utils        Relocations: (not relocatable)
Version     : 6.2.0.873                         Vendor: CentOS
Release     : 10.el6                        Build Date: 2013年11月23日 星期六 21时01分28秒
Install Date: 2014年10月12日 星期日 14时37分43秒      Build Host: c6b9.bsys.dev.centos.org
Group       : System Environment/Daemons    Source RPM: iscsi-initiator-utils-6.2.0.873-10.el6.src.rpm
Size        : 2091648                          License: GPLv2+
Signature   : RSA/SHA1, 2013年11月25日 星期一 03时29分25秒, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://www.open-iscsi.org
Summary     : iSCSI daemon and utility programs
Description :
The iscsi package provides the server daemon for the iSCSI protocol,
as well as the utility programs used to manage it. iSCSI is a protocol
for distributed disk access using SCSI commands sent over Internet
Protocol networks.


下面运行 system-config-kickstart 工具,通过模拟一次安装过程,读取用户指定的安装参数和选择的 rpm 软件包,来生成相同配置的 kickstart 文件:

[root@centos6-5vm ~]# system-config-kickstart


PXE网络启动无人值守自动安装 centos 全程实录_pxe_02


PXE网络启动无人值守自动安装 centos 全程实录_kickstart_03


PXE网络启动无人值守自动安装 centos 全程实录_dhcp.tftp_04


PXE网络启动无人值守自动安装 centos 全程实录_rhel_05



接下来比较重要的环节在于选择要自动安装的软件包,由于本次设置将应用在日后自动安装的每一台机器上,因此根据你实际的生产环境来选择要安装那些软件包,如果希望每台自动安装的服务器上都带有 PHP,JAVA,Perl 与 Ruby 支持环境,那么选择相应的软件包即可;

也可以默认全都不选,在以后的使用中“按需”通过 yum 安装服务器,或者光盘中的 rpm 软件包来安装

不过这里建议勾选“继承 UNIX 兼容性”的软件包,这样绝大多数在所有类 UNIX 系统中附带的工具,都会安装在 CentOS6.5 中,对于那些工作在 UNIX 与 Linux 主机组成的异构网络环境的运维人员而言,这样会保持最大程度的应用程序兼容性与可移植性


最后,在根目录下创建 ks 目录,并且将生成的 ks.cfg 文件保存在该目录下:

[root@centos6-5vm ~]# mkdir /ks/

PXE网络启动无人值守自动安装 centos 全程实录_pxe_06




八,搭建 NFS 服务器:

[root@centos6-5vm ~]# yum install nfs-utils rpcbind
[root@centos6-5vm ~]# rpm -qa | grep nfs
nfs-utils-1.2.3-39.el6_5.3.i686
nfs-utils-lib-1.1.5-6.el6.i686
nfs4-acl-tools-0.3.3-6.el6.i686
[root@centos6-5vm ~]# rpm -qa | grep rpcbind
rpcbind-0.2.0-11.el6.i686
[root@centos6-5vm ~]#

NFS 基于 RPC(Remote Procedure Call,远程过程调用) 协议,后者在旧版的 CentOS 中由 portmap 提供,从 CentOS6.3以后,使用 rpcbind 来提供 RPC 协议支持,因此需要同时安装和启动 NFS 与 rpcbind



[root@centos6-5vm ~]# vim /etc/exports 

/ks     192.168.1.35/255.255.255.0(ro)
/media  192.168.1.35/255.255.255.0(ro)

[root@centos6-5vm ~]# chmod u-w /ks/ks.cfg 
[root@centos6-5vm ~]# ll /ks/ks.cfg 
-r--r--r--. 1 root root 2002 10月 12 16:14 /ks/ks.cfg


当一台本地局域网的机器开放  NFS 服务以后,如果对方没有运行 iptables 防火墙,我们可以查看其上共享的资源,前提是你已经安装了上面提到的

nfs-utils  软件包:
[root@localhost ~]# showmount -e 192.168.1.35
Export list for 192.168.1.35:
/media 192.168.1.35/255.255.255.0
/ks    192.168.1.35/255.255.255.0


还可以通过下面命令,查看对方机器上,注册 RPC 协议的服务,以及这些服务开启的 TCP/UDP 端口号:

[root@localhost ~]# rpcinfo -p 192.168.1.35
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100011    1   udp    875  rquotad
    100011    2   udp    875  rquotad
    100011    1   tcp    875  rquotad
    100011    2   tcp    875  rquotad

因此,在不安全的内网环境中开启 NFS 服务,没有额外的安全配置,是很危险的,

操作系统部署完成以后,应该即刻关闭 NFS 和其它服务



将 CentOS 安装光盘的 ISO 文件,挂载到本地的  /media  目录下:

[root@centos6-5vm ~]# umount /dev/sr0
[root@centos6-5vm ~]# mount /dev/sr0 /media


完成上述操作后,一定要确认 CentOS6.5 虚拟机的“虚拟”光驱使用的是本地的 CentOS6.5  ISO 镜像文件,并且已经“连接好”光驱

这里有个小提示,在前面选择软件包时,不要选到所有与 open Office 相关的软件包,因为它在第二张 CentOS6.5 安装光盘中,需要“人工”更换光驱的光盘,如此就不能叫做真正意义上的“无人值守全自动安装系统”了

这里使用 NFS ,而不使用 FTP,HTTP 等其它服务器的原因在于,NFS 支持比较全面的“安装介质”,包括作为 ISO 光盘镜像的 CentOS6.5 安装程序



九,启动所有相关服务,临时关闭 iptables 防火墙

(除非你知道并且愿意通过添加防火墙规则来放行这些服务使用的端口,例如

dhcp 的 TCP/UDP 67 端口;

tftp 的 TCP/UDP 69 端口;

sunrpc 的 TCP/UDP 111端口;

nfs 的 TCP 2049 端口;

这样还不够,还需要编辑  /etc/sysconfig/nfs  文件,设置  nfs  向  rpcbind 注册的固定端口,然后添加 iptables 规则,放行这些端口,比较繁琐,

而且只要漏掉其中一个,那么整个自动化安装过程就会失败,因此还是建议暂时关掉 iptables 比较保险)


为了增强安全性,建议临时断开与 Internet 的连接(因为关闭了 iptables )等待所有主机上的操作系统都自动安装完成后,再恢复默认网关设备与 Internet 的连接:

[root@centos6-5vm ~]# service iptables stop

[root@centos6-5vm ~]# service dhcpd start
[root@centos6-5vm ~]# service xinetd start
[root@centos6-5vm ~]# service rpcbind start
[root@centos6-5vm ~]# service nfs start
[root@centos6-5vm ~]# chkconfig dhcpd on
[root@centos6-5vm ~]# chkconfig xinetd on
[root@centos6-5vm ~]# chkconfig rpcbind on
[root@centos6-5vm ~]# chkconfig nfs on


这里列出正常情况下随 NFS 启动的所有相关服务,作为故障排除时的参考:

注意,必须首先启动 rpcbind 服务,再启动 nfs 服务,因为与 nfs 相关的所有服务都依赖于 rpcbind


rpc.mountd

nfsd
rpc.rquotad

rpc.statd 
rpcbind


NFS 正常的启动,关闭输出信息应该和下面一样:

[root@centos6-5vm ~]# service nfs stop
关闭 NFS 守护进程:                                        [确定]
关闭 NFS mountd:                                          [确定]
关闭 NFS quotas:                                          [确定]
关闭 NFS 服务:                                            [确定]
Shutting down RPC idmapd:                                  [确定]
[root@centos6-5vm ~]# service nfs start
启动 NFS 服务:                                            [确定]
关掉 NFS 配额:                                            [确定]
启动 NFS mountd:                                          [确定]
启动 NFS 守护进程:                                        [确定]
正在启动 RPC idmapd:                                      [确定]
[root@centos6-5vm ~]#


十,终于来到最后一步了,在 vmware workstation 中切换到我们要安装操作系统的“裸机”虚拟机,从 BIOS 启动,切换到 Boot 选项卡,

可以看到, vmware workstation  自带的虚拟 BIOS 固件为 PhoenixBIOS

将其中的启动项“Network boot from AMD Am79C970A”移动到最顶层,这个选项就是用于 PXE 网络启动的,

具体名称取决于你机器上的网卡适配器芯片制造商,可能会与这里的不同,关键在于,只要看到 “Network boot from”前缀,就可以认为是支持  PXE 网络启动的硬件 

启动顺序设置完后,按 F10 保存 BIOS 设置退出,重启计算机,就可以实现全程自动,无人值守安装 CentOS6.5 了:


PXE网络启动无人值守自动安装 centos 全程实录_dhcp.tftp_07


补充说明一点,如果你是在真实机器上操作,那么建议在进入 BIOS 之前,通过“临时更改本次启动顺序”的按键( ESC )来修改本次从 PXE 启动(前提是你的第一启动设备为硬盘),否则安装完系统后会自动重启,然后又从 PXE 启动反复安装。。。

或者,可以在 kickstart 配置程序的基本配置中,取消勾选“安装后重新引导系统”避免反复从 PXE 启动安装:


PXE网络启动无人值守自动安装 centos 全程实录_kickstart_08


如果你按照本博文操作,中途遇到问题,可以提出来讨论



*****前面在创建 kickstart 文件时,仅仅指定了几个系统最基本的配置参数,如果我们要实现“自动”配置每个新安装系统的 默认网关,DNS 服务器,NTP 服务器自动同步时间,域名后缀,以及关闭多余的系统服务,性能优化,安全加固,自定义 yum 源安装服务器。。。。

每一台新安装的机器,都要“自动”的进行上述任务,那么就需要用到

system-config-kickstart 的 “安装后脚本”(Post-installation script)编辑器,编写需要在系统安装完成后自动运行的命令或 shell 脚本,然后生成相应的 kickstart 文件,

可以在网上搜索一些自动化运维常用的安装后脚本实例,略微修改后应用到自己的生产环境中,

如此一来,就真正实现了全自动批量部署,配置操作系统

(试想一下你虽然实现自动安装了100台机器上的 Linux,但是还要逐个配置 DNS服务器,关闭多余服务,启动防火墙,同步 NTP 服务器时间。。。。)


*****故障排除

这里列出在按照上文操作可能会出现的错误信息和相应的解决办法:

如果在客户端 PXE 启动时,出现和 TFTP 服务器通信的错误提示如下:


PXE网络启动无人值守自动安装 centos 全程实录_rhel_09


权限被拒绝的原因,多数是 SELinux 造成的,关闭 TFTP 服务器上的 SELinux :

[root@centos6-5vm /]# setenforce 0
[root@centos6-5vm /]# getenforce
Permissive

客户端再次启动即可



*****前面在用 PXE 启动的时候,通过本地网络的 DHCP 服务器临时获取到了 IP 地址,用于在自动化安装过程中,与 TFTP ,NFS 服务器通信;但是在系统安装完成后,我们可能需要关闭 DHCP 服务器,另外,如果通过 DHCP 协议在分配网络参数的过程中,没有分配到默认网关,DNS服务器等涉及访问互联网必须的信息,那么,在系统安装完成之后,需要“手动”进行设置

(或者编写 kickstart 文件的 Post-installation script 部分,设置网络参数)


这里介绍一个基于 shell 终端的“图形”配置工具:setup

它实际上就是通过修改  /etc/sysconfig/network-scripts/ifcfg-eth0

( eth0 为机器上的第一块以太网卡适配器) 这个文件,来达到让配置永久生效的目的,setup 也可以设置启动,或者关闭当前运行级别的服务:

[root@localhost ~]# setup

PXE网络启动无人值守自动安装 centos 全程实录_pxe_10


这个工具最初应该是红帽公司在其 RHEL 发行版上开发的,作为免费版本的 CentOS 也继承了这个工具的血统

这个基于 shell 的“字符图形”工具,以非常友好的界面帮助用户快速的配置联网参数,系统服务,以及加密,验证,防火墙等关键的系统配置课题