特殊事件处理篇

安装服务器与 kickstart

安装服务器与 kickstart 大量部署用户端电脑

最近更新时间: 2013/04/24

上一章我们将局域网路内的线路处理妥当并且将服务器设置成可分享局域网路对 Internet 的连接后,再来当然就是要管理内部的用户端电脑的设置了。 用还原卡管理用户端电脑是很简易的方式,不过确有很多教学方面的问题等待克服。如果不用还原卡, 要怎么处理用户端的电脑内操作系统的安装与还原呢?用原版光盘吗?

以正常的 DVD 光盘片安装一两台 Linux 系统似乎是没啥大问题,但如果有好几间电脑教室,里头有几十部总共数百部的主机要你装 Linux 系统的话,那使用 DVD 光盘来装也太花时间了吧?此时,选择通过网络来进行安装就是一项可以思考的方向!同时,如果以鸟哥上班的单位为例,电脑教室的 PC 需要有多重操作系统的环境下,如何准备一个可以裸机安装的功能, 就是一个相当重要的任务了!这篇文章就在讨论如何从网络进行这些动作啰!

1. 使用 PXE 环境建置局域网路安装服务器系统

一般来说,不论是哪种操作系统,只要是使用 DVD 发布操作系统软件的,通常安装的进程是这样的:

  1. 通过 BIOS 开机,并调整成可以让光盘优先开机的模式;
  2. 以光盘内的操作系统内核开机,驱动系统的硬件设备;
  3. 上一步的操作系统直接调用安装程序来进行安装选项;
  4. 进入安装模式与用户交互选取用户需要的软件操作环境;
  5. 系统开始安装软件至硬盘上,安装完毕通常需重新开机才能结束安装进程;
  6. 重新开机后,会进入首次使用的设置画面,简单设置后,即可开始登录系统使用。

进程是很简单,不过,如果用户端的数量一多起来,上述的第四、五步骤通常会占用相当大的人力!因为安装程序需要与用户交互啊!此外,如果用户端的数量很大! 那么我们如果想要同时进行以减少等待的时间时,就得要刻录多片 DVD,虽然不贵,不过很觉得浪费~另外,现在的网络速度要比 DVD 速度快的多 (Gigabit 网卡至少可以到达 100Mbytes/s 的速度,16X DVD 只能到达大约 25Mbytes/s 以下), 如果将 DVD 的数据拷贝到网络上,通过网络来安装,不是更快吗?是的!没错~但是,这时候就需要 PXE 的协助了!

1.1 什么是 PXE 与 PXE 的运作模式 (注1)

对于现在的主机硬件系统来说,不论你想在上头干嘛,首先你总是得要通过开机管理程序 (boot loader) 加载系统内核 (kernel) 之后,才能够顺利的开始运作系统。 同理,使用 DVD 原版光盘安装时,BIOS 选择光驱开机,光盘片里面就得要含有开机管理程序与简易的内核,开始驱动整个系统硬件后,才能够进入下一步安装软件的控制中。

现在,我们想要通过网络开机来进入本机系统,等开机之后,接下来爱干嘛就干嘛,当然也就包括进行网络安装的行为啊!那跟上面讲的就一样了,既然我是想要通过网络开机, 那么必要的 (1)开机管理程序与 (2)操作系统内核就得要放在网络上给用户端的主机系统下载使用才行。 问题来了,既然我的主机系统还没有安装任何操作系统,那怎么 (1)取得网络 (2)下载开机管理程序与内核呢?这时就得要通过 Intel 发布的 PXE 机制了。

所谓的 PXE 是『 Preboot Execution Environment 』的缩写,字面上的意思是:『开机前的运行环境』之意。根据 Intel 所发布的文档来看 (注1),要达成这个 PXE 必须要有两个环节,(1)一个是用户端的网络卡必须要支持 PXE 用户端功能,并且开机时选择网络卡开机,这样系统才会以网络卡进入 PXE 用户端的进程;(2)一个是 PXE 服务器必须要提供至少含有 DHCP 以及 TFTP 的服务才行!且其中:

  • DHCP 服务必须要能够提供用户端的网络参数之外,还得要告知用户端 TFTP 所在的位置为何才行;
  • TFTP 则是提供用户端 boot loader 及 kernel file 下载点的重要服务

上述两个服务仅能让 PXE 用户端开机而已,开机的定义只是让硬件开始运行罢了!我们都知道,开机完成后还得要提供各式各样的软件之后,才能够顺利的加载可让一般用户操作的基本操作系统。 因此,通常 PXE server 还必须要能够提供用户端所需程序与软件数据的来源才行!所以,通常还得要加上 NFS/FTP/HTTP (通常是选择一样即可) 等数据提供的通信协定后, 才算是比较完整的 PXE 服务器啰。

在本章末了的参考文献中,PXE 已经讲得非常详细!我们这里仅简单的使用底下的图标来解释一下 PXE 的整体运作流程:

PXE 的运作流程
图 1.1-1、PXE 的 server/client 相关的运作流程示意图
(图改自 Intel Preboot Execution Environment specification V2.1)

从上图中我们再次的归纳几个重点:

  • 整个 PXE 的运作流程,几乎都是使用 UDP 封包来达成的!
  • PXE 用户端的网络卡必须要支持 PXE 功能,才能在开机时发出 DHCP 要求相关数据;
  • DHCP 除了得要回传正确的区网参数外,还要额外告知 TFTP 与相关开机管理程序信息;
  • TFTP 需要提供 (1)开机管理程序与 (2)Linux 的开机内核与相关文件 (initrd 等文件)

那什么时候需要有安装光盘内的软件支持安装呢?那就得要外带内核参数才行啰!也就是说,我们至少得要设置底下这几个服务才行: (1)TFTP (2)DHCP (3)NFS/HTTP/FTP! 其中 TFTP 与 DHCP 为必须,则安装的软件来源则是可选择的!底下我们就一项一项服务来设置吧!

1.2 通过 DHCP 服务取得 TFTP IP 地址与 boot loader 文件名所在

图 1.1-1 的数据上面,可以发现 DHCP 主要仅是提供用户端网络参数与 TFTP 的地址,以及 boot loader 的文件名而已。 同时,我们仅针对内网来告知 TFTP 的相关位置,所以,我们可以编辑 /etc/dhcp/dhcpd.conf 在 subnet 的区块内加入两个参数即可。

首先,由于我们这个区网还不算太大,所以,鸟哥是将 DHCP 与 TFTP 绑在同一个主机上头,因此 DHCP 与 TFTP 的 IP 都是延续前一章的 192.168.42.254 这一个。那 boot loader 呢? 在 CentOS 里面有提供一个文件名为『 pxelinux.0 』的专门给 PXE client 下载的 PXE boot loader!这个文件我们即将放置于 TFTP 的根目录下,所以,DHCP 的简单设置就变成如下模样:

[root@centos ~]# vim /etc/dhcp/dhcpd.conf
ddns-update-style       none;
default-lease-time      259200;
max-lease-time          518400;
option routers          192.168.42.254;
option broadcast-address        192.168.42.255;
option domain-name-servers      192.168.42.254;
subnet 192.168.42.0 netmask 255.255.255.0 {
        range 192.168.42.101 192.168.42.200;
        option subnet-mask      255.255.255.0;
        option domain-name      "i4502.dic.ksu";
                                           <==上面的数据是前一章的内容!
        next-server     192.168.42.254;    <==就是 TFTP 的地址所在处
        filename        "pxelinux.0";      <==告知得从 TFTP 根目录下载的 boot loader 文件名

....(中间省略)....
}                                          <==别忘记最后的这玩意!

[root@centos ~]# /etc/init.d/dhcpd restart

再重新启动过 DHCP 之后,这样针对这个内网的 TFTP 设置就生效了。不过,请特别留意喔!如果你没有继续接着底下的 TFTP 来设置的话,那么未来你的用户端如果设置网络卡开机, 就会发现到如下的错误消息~虽然这个错误消息并不会影响到用户端的操作,反正过了逾时等待时间后,系统就会自动的进入下一个开机设备来开机。但是,有这个错误消息就很讨厌就是了。

PXE 的运作流程
图 1.2-1、仅设置 DHCP 提供 TFTP 但 TFTP 尚未建置完成时的用户端错误消息示意

从上面的消息你可以发现,用户端这个 PXE 已经抓到 DHCP 提供的网络参数,取得的 IP 为 192.168.42.158,但是当他连接到 TFTP 想去下载 pxelinux.0 时, 却抓不到程序!所以就造成等待逾时。虽然没什么,不过多一段等待时间就很讨厌~因此,继续接着底下的 TFTP 来设置吧!

1.3 通过 TFTP 提供用户下载开机管理程序与内核文件

图 1.1-1 的流程当中,我们知道开机过程所需要的开机管理程序与内核相关开机文件,主要都是通过 TFTP 这个服务来给予的! 这个服务在 CentOS 上面已经有相关的软件主动提供了!设置很简单。但是,那个开机管理程序与内核文件在哪里啊?呵呵!底下我们就分别来说一说各别的设置啰!

  • TFTP 的主程序设置,重点在 TFTP 要将数据放在那个目录内:

TFTP 的安装很简单~直接使用 yum 来处理即可。不过,如同 FTP 服务一样,你总是得要告诉用户端,我的 TFTP 数据的『根目录』在哪里才行! 这样接下来才有办法取得完整的绝对路径相关数据啊。另外要注意,TFTP 其实是由 xinetd 这个 super daemon 所管理的,因此设置好 TFTP 之后, 你要启动的是 xinetd 才对喔!

另外,缺省的 TFTP 服务的根目录是放在 /var/lib/tftpboot/ 底下,由于未来我们的安装服务器有很多数据都会放置在这个文件系统中,为了统一管理, 所以鸟哥习惯上都会将所有需要的数据统一放置于某个目录中!那未来如果有需要加速文件系统或者扩大文件系统时,就比较方便处理~在本章的案例中, 鸟哥是将所有的数据统一放置于 /install/ 目录下的!那这个 TFTP 的根目录我们就将他放置于 /install/tftpboot 底下啰!

# 先安装所需要的 TFTP 服务器软件:
[root@centos ~]# yum install tftp-server tftp
# 事实上,只要安装 tftp-server 即可。不过这里鸟哥连用户端的 tftp 也一口气装好算了。

# 开始设置 TFTP 的设置档~主要是 TFTP 的根目录所在啦!
[root@centos ~]# vim /etc/xinetd.d/tftp
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s /install/tftpboot  <== 重点在这里!改成这样即可
        disable                 = yes
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

[root@centos ~]# mkdir -p /install/tftpboot
[root@centos ~]# chcon --reference /var/lib/tftpboot /install/tftpboot
[root@centos ~]# chcon --reference /var /install
[root@centos ~]# ll -dZ /install/tftpboot
drwxr-xr-x. root root system_u:object_r:tftpdir_rw_t:s0 /install/tftpboot/
# 如果你没有关掉 SELinux 的话,那这里就得要这样做才行!注意上面特殊字体部分!

# 启动 TFTP 并观察之:
[root@centos ~]# /etc/init.d/xinetd restart
[root@centos ~]# chkconfig xinetd on
[root@centos ~]# chkconfig tftp on
[root@centos ~]# netstat -tulnp | grep xinetd
Proto Recv-Q Send-Q Local Address   Foreign Address  State    PID/Program name
udp        0      0 0.0.0.0:69      0.0.0.0:*                 2238/xinetd
# 你要注意的是端口口 69 以及 xinetd 这个启动的服务名称才对!

接下来你得要知道的是,所有通过 TFTP 提供的数据,在本章的案例中,都必须要放置于 /install/tftpboot/ 目录下才行喔!不要放错地方了!要注意!要注意!

  • 使用 syslinux 提供的 boot loader 与菜单相关展示文件:

如果要使用 PXE 的开机管理程序与开机菜单的话,那就得要安装 CentOS 内置提供的 syslinux 软件,从里面捞出两个文件即可。当然啦,这两个文件得要放置在 TFTP 的根目录下才好! 整个实作的过程如下:

[root@centos ~]# yum install syslinux  <==底下的文件是由这软件所提供!
[root@centos ~]# cp /usr/share/syslinux/menu.c32  /usr/share/syslinux/vesamenu.c32 \
> /usr/share/syslinux/pxelinux.0 /install/tftpboot/
[root@centos ~]# mkdir /install/tftpboot/pxelinux.cfg
[root@centos ~]# ll /install/tftpboot/
-rw-r--r--. 1 root root  60928 2013-04-02 18:10 menu.c32      <==提供类菜单模式的功能
-rw-r--r--. 1 root root  26828 2013-04-02 18:10 pxelinux.0    <==就是开机管理程序!
drwxr-xr-x. 2 root root   4096 2013-04-02 18:11 pxelinux.cfg  <==开机的菜单设置在这里!
-rw-r--r--. 1 root root 162860 2013-04-02 18:41 vesamenu.c32  <==图形化接口菜单

上面的 memu.c32, vesamenu.c32 及 pxelinux.0 几个文件还好理解,反正就是提供『菜单接口』以及『开机管理程序』的咚咚。那么那个 pxelinux.cfg 是啥鬼?其实那是个目录,可以放置『缺省的开机菜单』,也能够『针对每部不同的用户端主机提供设置的开机菜单』!非常有趣吧!一般来说,还没有特定的用户端时,可以在 pxelinux.cfg 目录内,创建一个名为 default 的文件,那个文件的功能就类似 grub 的 menu.lst 啦!提供一个菜单的设置!

那如果没有 menu.c32 或 vesamenu.c32 时,菜单会以丑丑的纯文本模式一行一行显示。如果加上了 menu.c32 或 vesamenu.c32 时,就会有类似反白光棒的效果出现,那就可以使用『上下键』来操作光棒, 而不需要看着屏幕去输入数字键来选择开机菜单啰!鸟哥觉得这样比较好啦!包括在未来的设置档以及相关的参数设置上面。这部分设置完毕后,再来则是内核文件啰!

  • 利用原版安装光盘取得 Linux 安装软件内核文件:

我们需要安装 Linux 系统,所以得要从原版光盘里面将内核文件捞出来~这里鸟哥以 64 比特版本的 CentOS 6.4 为范例来说明,鸟哥预计将内核文件放置于 /install/tftpboot/kernel/centos6.4/ 目录下,且鸟哥已经将原版光盘的映像档捉下来放置于 /install/iso/CentOS-6.4-x86_64-bin-DVD1.iso 了,因此捉到内核文件的方法如下:

# 将原版光盘暂时挂载在 /mnt 底下来抓数据用:
[root@centos ~]# mount -o loop /install/iso/CentOS-6.4-x86_64-bin-DVD1.iso /mnt
[root@centos ~]# mkdir -p /install/tftpboot/kernel/centos6.4
[root@centos ~]# cp /mnt/isolinux/vmlinuz /install/tftpboot/kernel/centos6.4
[root@centos ~]# cp /mnt/isolinux/initrd.img /install/tftpboot/kernel/centos6.4
[root@centos ~]# cp /mnt/isolinux/isolinux.cfg /install/tftpboot/pxelinux.cfg/demo
[root@centos ~]# umount /mnt

其实仅需要两个文件即可,不过鸟哥建议可以抓原版光盘里面的菜单设置档来作为修改的依据!这样以后比较好改!上面三个文件的意义是:

  • vmlinuz:就是安装软件的内核文件 (kernel file);
  • initrd.img:就是开机过程中所需要的内核模块参数;
  • isolinux.cfg --> demo:作为未来 PXE 所需要的开机菜单之参考!
  • 设置开机菜单:

既然 PXE 用户端是通过网络卡来向 TFTP 取得开机管理程序与内核文件的,那么 pxelinux.0 这个开机管理程序又可以去抓缺省的开机菜单设置档 (pxelinux.cfg/default 内容), 这也就是说,其实有很多种不同的方案来让开机管理程序进行开机的!包括本机硬盘开机以及网络下载内核开机。

我们这里预计有两个开机选项, 一个是通过本机硬盘开机 (local boot) 一个则是通过刚刚我们所下载的内核文件来开机,以进入安装模式。那设置该如何处理呢?创建 pxelinux.cfg/ 目录下的 default 即可! 而且我们会使用 vesamenu.c32 来将菜单显示成为类图形光棒喔!注意相关语法!

[root@centos ~]# vim /install/tftpboot/pxelinux.cfg/default
UI vesamenu.c32        <== 使用 vesamenu.c32 这个类图形的接口程序
TIMEOUT 300            <== 单位 0.1 秒,所以这个设置可等待 30 秒来进入缺省开机
DISPLAY ./boot.msg     <== 提供一些额外的信息,让用户更了解菜单意义!
MENU TITLE Welcome to VBird's PXE Server System
                       <== 上面这行只是提供一个大标题而已!
LABEL local            <== 第一个菜单的项目
  MENU LABEL Boot from local drive
  MENU DEFAULT         <== 此菜单为缺省项目 (等待逾时就进入此开机)
  localboot 0          <== 本机磁盘开机的特定项目!

LABEL network1
  MENU LABEL Boot from PXE Server for Install CentOS 6.4
  kernel ./kernel/centos6.4/vmlinuz            <== 内核所在的文件名
  append initrd=./kernel/centos6.4/initrd.img  <== 就是内核外带参数啊!
# 上述设置中,大写的文档部分要特别注意!那是使用 vesamenu.c32 的关键字!
# 至于后面的部分,那就是每个设置项目的内容啰!

[root@centos ~]# vim /install/tftpboot/boot.msg
Welcome to VBird's PXE Server System.

The 1st menu can let you system goto hard disk menu.
The 2nd menu can goto interactive installation step.

这个文件有很多种不同的设置模式,包括使用 menu.c32 以及 vesamenu.c32 的设置项目也不太相同。鸟哥这边是以 vesamenu.c32 为范例的喔! 同时,在开始写这设置值之前,请务必回到上面几个小段落瞧一瞧,因为文件放置的地点在每本书或每个范例里面都不一样!能不能通过 TFTP 读到你正确想读的文件, 在这个设置档当中才是重点项目喔!那就来说说上面大写字体的关键字部分的意义:

  • UI vesamenu.c32:代表缺省使用 vesamenu.c32 这一个类图形接口来作为开机菜单的显示依据。要注意, vesamenu.c32 在本范例中是放置于 tftp 的根目录,就是在 /install/tftpboot/ 目录下喔!

  • TIMEOUT 300:进入菜单后,会等待多少时间让用户交互的挑选开机项目。这个单位比较特殊,是 0.1 秒,很多朋友都会忘记单位!要注意喔!

  • DISPLAY ./boot.msg:将额外的信息以纯文本档的形式写入 boot.msg 当中!这个信息可有可无~如果你有很多相关的菜单介绍要说明的话, 就写入本文件中。如果这个信息文件不存在,系统就会用缺省的按下 [Tab] 按钮显示特殊消息的信息告知用户。鸟哥这边是将 boot.msg 放在 tftp 的根目录下!

  • MENU TITLE ...:在后面接的纯文本数据将会显示于用户窗口中的最上方的大标题!

  • LABEL local:LABEL 后面接 boot loader 认识的菜单项目,所以,第一个菜单的实际内容其实是『 local 』才对!也就是说,如果没有 vesamenu.c32 的辅助, 你想要进入这个菜单的话,就得要用键盘输入『 local 』才会进入到此菜单的设置来开机!底下第二个 LABEL 的意义也是一样的。

  • MENU LABEL:跟上面一个有相关性,LABEL 是 boot loader 认识的菜单名称,但我们想要让用户更清楚这个菜单的意义, 因此通过这个 MENU LABEL 来写入更多的数据。这个项目也会在光棒中显示出来,所以字数也不宜太多就是了。

  • MENU DEFAULT:就是默认值,缺省光棒反白会在那个菜单上面的意思~我们使用的默认值是 local 这一个 LABEL!

  • localboot 0:这个是使用本机开机的一个特殊用法,如果要用本机的设备开机,不论是光盘、硬盘、软碟,都使用这个设置项目就对了。

  • kernel:后面接你放在 TFTP 上面的 Linux 内核文件,文件名是相对于 TFTP 的根目录,所以记得你的内核文件放在哪里。 鸟哥比较喜欢分门别类的放置文件,因此文件名包括目录名称,就会比较长一些~在本范例中的完整文件名其实是 /install/tftp/kernel/centos6.4/vmlinuz 呦!

  • append:外加的内核参数,重点是 initrd.img 这一个内核模块文件!没有他,就无法开机了啦!

关于这个设置档的内容,鸟哥建议前往你系统中的 /usr/share/doc/syslinux-${version}/menu.txt 文件名去瞧一瞧,里面写得非常仔细!尤其是你还可以使用 chain.c32 去加载不同的 boot sector 开机!这就等于通过网络去指挥你的系统进行某个多重操作系统开机!而不用在现场敲键盘!非常有帮助!不过我们这里没有这方面的需求, 因此没有仔细介绍。反正,记得去瞧瞧就是了。

1.4 用户端开机测试与通过互联网安装 CentOS

一切都整理妥当之后,接下来你就可以开始在用户端的 BIOS 设置网络开机,然后来测试一下你的 PXE 环境设置正确否了!只不过,每一家主机的 BIOS 设置都不相同, 鸟哥没有办法全部测试给你看~同时,新的 BIOS 甚至已经支持鼠标设置了!好厉害好厉害~鸟哥还是使用旧旧的电脑来显示给大家瞧瞧~相关的设置位置应该都差不多啦!

  • 启动内置网卡的网络开机功能:如果你的主板有内置网卡 (一般都内置了啦!),那你得要激活他的网络开机功能,这样才能够在开机顺序中找到网卡开机的选项! 这个项目一般缺省都是关闭的~所以得要手动去启动他才行!如下所示为选择的顺序:
    BIOS 调整网络开机
    图 1.4-1、BIOS 调整网络开机的示意图
    在上图中依序选择高端 (Advanced),再选择内置设备设置 (Onboard Devices Configuration),就可以得到如下的画面来设置要不要激活网络开机的功能了!
    BIOS 调整网络开机
    图 1.4-2、BIOS 调整网络开机的示意图 (续)
    如上所示,找最重要的关键字『 LAN 』这个区网的网卡设置值,记得要选择『 Enabled 』的项目才行。这样就设置好网络卡开机的项目了!很简单吧!

  • 激活其他周边设备的网络开机功能:在某些时刻,你可能需要通过『外置的扩充卡』来进行网络开机!举例来说,如果你有多个网络接口, 其中几个是由 PCI-E 扩充插槽的 Gb 网卡所提供的,那就有可能得要设置一下电源管理模块,让这些网络扩充卡可以发挥网络开机的功能!详细的设置如下:
    BIOS 调整网络开机
    图 1.4-3、BIOS 调整网络开机的示意图 (续)
    鸟哥选择的这个主机是三、四年前的产品,该时段电源管理还是使用 APM (Advanced Power Manager) 模块,现今很多主板都使用 APCI (Advanced Configuration and Power Interface) 来管理了!所以,如果你的主板是比较新的,那在如上图的 『Power』 选项中,就点击 ACPI 之类的相关字眼即可。点击上图圈选的 APM 之后,会出现如下画面:
    BIOS 调整网络开机
    图 1.4-4、BIOS 调整网络开机的示意图 (续)
    鸟哥的这个主机上面有安插较旧的 PCI Gb 网卡以及较新的 PCI-E 网卡,所以这边鸟哥将这两个接口的电源供应都勾选,让这几个网络卡可以支持网络开机就是了。 如上所示,将重要的关键字 PCI 与 PCIE 勾选起来就对了!

  • 调整第一个可开机设备为网络卡:既然要让网络卡开机,就得要让网络开作为第一个开机设备才行!由于系统大多缺省使用硬盘开机在前, 所以这里没有设置时,你的系统是不会进入网络卡开机的项目的。同时注意,某些时刻,上述的网络卡设置完成后,得要保存 BIOS 且重新 reboot 过后, 这里才会出现网络卡设备的选项喔!假设你刚刚的项目都已经保存且重新启动系统了,那再进入 BIOS 后,选择如下的『Boot』就会出现如下画面:
    BIOS 调整网络开机
    图 1.4-5、BIOS 调整网络开机的示意图 (续)
    如上图所示,点击了开机顺序项目后,就会出现可以开机的设备项目,记得第一个选择网络设备即可。在鸟哥的这个主机的案例中,我们使用的网卡设备为 GE (Gigabit Ethernet) 的项目, 所以将他选择在第一项即可!之后保存 BIOS,并重新开机吧!
    BIOS 调整网络开机
    图 1.4-6、BIOS 调整网络开机的示意图 (续)

完成上述的项目之后,重新开机后,如果一切顺利,你的系统在开机时就会进入如下的画面当中:

用户端进入 PXE 的菜单图标之示意图
图 1.4-7、用户端进入 PXE 的菜单图标之示意图,左侧使用 menu.c32 右侧使用 vesamemu.c32

如上图所示,鸟哥测试过两种接口,分别使用了 menu.c32 以及 vesamenu.c32 来测试显示的画面,结果就像上图,使用 vesamenu.c32 看起来分辨率似乎比较好,只是, 缺省的配色好像不怎么样,可能得要自己去参考说明文档配色一下比较好。使用 menu.c32 的话,就是明显的颜色对比,但是比较呆板一些的画面。随人喜好去调整吧。

由于缺省有 30 秒的选择时间,因此画面下方会开始读秒,如果按了上/下按键,反白的部分就不会在 default 值缺省的光棒处了!如果你在需要的菜单上面,按下了『Tab』按钮, 此时系统就会跳出类似 grub 的交互接口给你修改参数就是!由于我们还没有安装系统在硬盘上,因此,鸟哥选择了第二个项目,亦即是『Boot from PXE Server for Install CentOS 6.4』的项目。 按下之后就会开始进入安装的侦测画面中。

硬件侦测完毕,并且让你:

  • 挑选语系 (直接选 English 即可)
  • 挑选键盘格式 (缺省的 us 即可)

之后,就开始选择 CentOS 软件所在的保存媒体了!如下图所示:

进入安装过程,使用网络上的 CentOS 媒体来源 (URL)
图 1.4-8、进入安装过程,使用网络上的 CentOS 媒体来源 (URL)

由于我们尚未制作软件安装服务器,因此,我们直接使用国家高速网络中心的 FTP 所提供的软件来源来安装!因此,此时请选择『 URL 』的项目。因为使用 URL 必须要有网络, 因此,安装程序会要求我们设置 IP !请注意,这个安装过程使用的网络参数与 PXE 取得的网络参数无关!所以这里得要重新输入一次网络参数。因为我们有使用 DHCP 服务啊! 所以如下勾选动态设置就好了:

替安装程序设置网络参数
图 1.4-9、替安装程序设置网络参数

然后输入你查到的网址,如下所示 (使用国高的 FTP):

裸机安装
图 1.4-10、直接连上国家高速网络中心去在线裸机安装啰!

如果一切都没有问题,这个时候就会开始进入安装画面,开始进行裸机的在线安装!你也不用在用户端刻录光驱,非常简单方便吧!只是有个问题,你得要让你的机器连上 Internet 去安装软件~ 那你也知道互联网的速度要比你局域网路的速度慢很多~如果同时有很多台用户端电脑要安装系统,那就糗大了!因此,这时在区网内架设一个软件安装服务器就显的很重要了! 底下就来聊一聊怎么建这个安装服务器吧!

1.5 通过 NFS、HTTP、FTP 等协定提供软件安装服务器

架设安装服务器实在是非常的简单,尤其是 CentOS 这个版本!你只要下载 CentOS 6.x 的第一片 DVD,将里头的数据以 NFS, HTTP, FTP 等方式分享出去,那你的主机就变成安装服务器了!就这么简单!鸟哥个人比较偏好使用 NFS 来分享,这是因为未来的应用中,我们可能需要网络磁盘机, NFS 是一个可以直接作为 Linux 网络磁盘机的服务,所以就用它比较简单!如果你喜欢其他的协定来分享也没有关系啊!我们可以使用同一个目录来分享呢! 假设我们 DVD1 放置于 /install/iso/ 目录内了,预计要分享的 CentOS 6.4 原版 DVD 目录放在 /install/nfs_share/centos6.4/ 中, 简单的处理如下:

# 1. 先将 DVD 的数据给他放置于所需要的目录中,当然直接使用挂载最快!
[root@centos ~]# mkdir -p /install/nfs_share/centos6.4
[root@centos ~]# vim /etc/fstab
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso /install/nfs_share/centos6.4 iso9660 defaults,loop 0 0
# 特别要注意的是文件系统与参数,记得光盘使用 iso9660 且需要加上 loop

[root@centos ~]# mount -a
[root@centos ~]# df
文件系统     1K-区段      已用  可用 已用% 挂载点
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso
             4251346   4251346      0 100% /install/nfs_share/centos6.4
# 这样就挂载结束,比拷贝来拷贝去要简单的多喔!

# 2. 制作 NFS 分享,要注意对内 port 有规范喔!
[root@centos ~]# yum -y install nfs-utils
[root@centos ~]# vim /etc/exports
/install/nfs_share/  192.168.42.0/24(ro,async,nohide,crossmnt)  localhost(ro,async,nohide,crossmnt)
# NFS 的设置是很简单,不过,要注意由于 server 上面有两个挂载点在分享的目录上,
# 所以得要加上 nohide 与 crossmnt 这两个参数才行!且后续的服务要开比较多就是了~

[root@centos ~]# vim /etc/sysconfig/nfs
RQUOTAD_PORT=901
LOCKD_TCPPORT=902
LOCKD_UDPPORT=902
MOUNTD_PORT=903
STATD_PORT=904
# 找到上面这几个设置值,我们得要设置好固定的 port 来开放防火墙给用户处理!

[root@centos ~]# vim /etc/idmapd.conf
[General]
Domain = i4502.dic.ksu
[Mapping]
Nobody-User = nfsnobody
Nobody-Group = nfsnobody
# 找到上面几个设置值,我们这里假设 ID 对应的无此帐号使用 nfsnobody 设置!

[root@centos ~]# /etc/init.d/rpcbind restart
[root@centos ~]# /etc/init.d/nfs restart
[root@centos ~]# /etc/init.d/rpcidmapd restart
[root@centos ~]# /etc/init.d/nfslock restart
[root@centos ~]# chkconfig rpcbind on
[root@centos ~]# chkconfig nfs on
[root@centos ~]# chkconfig rpcidmapd on
[root@centos ~]# chkconfig nfslock on
[root@centos ~]# rpcinfo -p
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100011    2   udp    901  rquotad
    100011    2   tcp    901  rquotad
    100005    3   udp    903  mountd
    100005    3   tcp    903  mountd
    100003    4   tcp   2049  nfs
    100003    4   udp   2049  nfs
    100021    4   udp    902  nlockmgr
    100021    4   tcp    902  nlockmgr
    100024    1   udp    904  status
    100024    1   tcp    904  status
# 要注意喔,我们得要启动的 port 有 111, 2049,901~904 这几个!防火墙要开!

[root@centos ~]# showmount -e localhost
Export list for localhost:
/install/nfs_share 192.168.42.0/24,localhost
# OK!看到上面这些东西,就是搞定啰!赞!

# 3. 然后我们也来开放 www 服务提供这个安装服务器吧!简单作法如下:
[root@centos ~]# yum install httpd
[root@centos ~]# /etc/init.d/httpd start
[root@centos ~]# chkconfig httpd on
[root@centos ~]# mkdir -p /var/www/html/install/centos6.4
[root@centos ~]# vim /etc/fstab
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso /var/www/html/install/centos6.4 iso9660 defaults,loop 0 0

[root@centos ~]# mount -a
[root@centos ~]# df
文件系统      1K-区段      已用  可用 已用% 挂载点
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso
              4251346   4251346      0 100% /var/www/html/install/centos6.4
# 同样的,用挂载的应该会比较快速些~

# 4. 如果还想要提供 FTP 的处理呢?那还是简单的这样做即可:
[root@centos ~]# yum install vsftpd
[root@centos ~]# /etc/init.d/vsftpd start
[root@centos ~]# chkconfig vsftpd on
[root@centos ~]# mkdir -p /var/ftp/install/centos6.4
[root@centos ~]# vim /etc/fstab
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso  /var/ftp/install/centos6.4 iso9660  \
	defaults,loop,context=system_u:object_r:public_content_t:s0 0 0
# 上面是同一行,比较重要的是参数的部分多了 context 喔!因为我们这个系统有使用 SELinux,
# 为了要避免挂载的文件系统出现 FTP 的 SELinux 错误,因此这里得要加上此参数才行!

[root@centos ~]# mount -a
[root@centos ~]# df
文件系统     1K-区段      已用     可用 已用% 挂载点
/install/iso/CentOS-6.4-x86_64-bin-DVD1.iso
             4251346   4251346         0 100% /var/ftp/install/centos6.4
# 超级简单的这样就搞定了!

很神奇的,这样就搞定了三个服务的安装服务器功能!如果你想要开始测试使用内网的 http, ftp 来安装的话,请回到图 1.4-10 的画面当中,在 URL 的空格上面,分别填入两个不同的网址试看看:

  • WWW: http://192.168.42.254/install/centos6.4
  • FTP: ftp://192.168.42.254/install/centos6.4

上面两个网址鸟哥都测试过,通过上面的设置,这个网址是可以直接就进入安装模式当中没问题~那如果是 NFS 呢?你得要先回去图 1.4-8 的画面中点击『 NFS directory 』的项目,然后在出现如下的画面中,才输入我们详细的 NFS 分享的 CentOS 6.4 光盘内容的所在目录:

裸机安装
图 1.5-1、使用 NFS 作为安装服务器的设置方式

因为画面的关系,所以你看不到全部的输入数据。请注意,CentOS directory 项目要填写:『/install/nfs_share/centos6.4』才行喔! 接下来,请自行使用底下的方式来完整的安装好一套 Linux 在你的系统上。鸟哥这里使用的是 30GB 的测试硬盘来安装的,底下仅列出不是自动设置的项目,需要调整的地方:

  • 设置时区的部分,请选择『 Asia/Taipei 』项目,并且取消『 System clock uses UTC 』的项目;
  • 创建用户自订的分割『 Create Custom Layout 』,仅使用 3GB 去挂载于根目录即可,其他都保留不动;
  • 使用『 Basic Server 』作为软件安装的标准即可。

接下来系统就会使用你想不到的速度安装好一套 CentOS Linux 了!非常简单吧!这个网络安装的流程!

2. 用 kickstart 大量部署用户端 Linux CentOS 系统

完成上面各小节的设置后,你区网内的用户端电脑应该都能够通过网络来安装 CentOS 了!只是,比较伤脑筋的地方在于,你还是得要手动一部一部电脑去开机,然后一步一步去选择需要的安装选项后, 最终按下安装,系统才会自动的帮你安装妥当。有没有可能让系统自己帮我安装而不用选择呢?可以啊!那就通过 kickstart 这个机制吧!

2.1 kickstart 可用参数

我们在上个小节的最后一段当中,有请你自行安装了一个超小型的 CentOS 系统吧!那么请你进入该系统去,瞧一瞧 root 家目录有没有一个名为 anaconda-ks.cfg 的文件呢? 请打开该文件来瞧一瞧内容如何!

[root@client ~]# cat /root/anaconda-ks.cfg
# Kickstart file automatically generated by anaconda.
install
nfs --server=192.168.42.254 --dir=/install/nfs_share/centos6.4
lang en_US.UTF-8
keyboard us
network --onboot yes --device eth0 --bootproto dhcp --noipv6
rootpw  --iscrypted $6$qznCBKF/YnJdX9rB$OeSGN1c6JNCZ/GtqJTvKrN0t/pRkkUlhEXdc...
firewall --service=ssh
authconfig --enableshadow --passalgo=sha512
selinux --enforcing
timezone Asia/Taipei
bootloader --location=mbr --driveorder=vda --append="crashkernel=auto rhgb quiet"
#clearpart --none
#part / --fstype=ext4 --size=3000
repo --name="CentOS"  --baseurl=nfs:192.168.42.254:/install/nfs_share/centos6.4 --cost=100

%packages
@base
@console-internet
@core
@debugging
....(中间省略)....
krb5-workstation
perl-DBD-SQLite
%end

看过这个文件内容,有没有觉得好像很熟悉啊!那是啥?没错!这就是刚刚你使用安装程序进行设置项目选择时,将你选择的内容记忆起来的数据!通过这个文件, 你可以知道最初安装时是如何设置这个系统的。也由于这个系统还记录了 root 编码过的密码,所以,很重要啊!不要随便外流喔!现在让我们想一想, 既然这个文件已经记录了我们所需要进行的各项步骤,那我通过这个文件不就可以预先选择好,然后交给安装程序去自动运行即可吗?没错啊!就是这样!

既然知道了这个未来的功能了,那我们当然就得要先来了解一下这个 kickstart 文件的内容才好啊!其实这个文件大致将所有的动作分为三大部分来设计,分别是:

  • command (指令项目区段):就是上面文件中最开头的部分,亦即是我们主要设置系统的项目!这包括软件来源、安装模式(升级或全新安装)、键盘格式、网络设置、 防火墙设置、用户身份认证设置、时区、SELinux 启动、开机管理程序与磁盘分割等最重要的项目部分了。

  • %packages (软件安装区段):CentOS 提供的软件非常多,还有所谓的软件群组呢!同时还支持第三方协力软件的来源。因此,kickstart 可以在这个阶段来处理各式软件的安装。

  • %pre %post (安装前、安装后设置区段):有时候,安装前后我总是得要针对系统作个设置或测试什么的,举例来说,假设我在系统安装完毕后,想要直接进行开机菜单的增加或修改, 然后再进行开机的动作直接生效,我就不用还得要一部一部机器的登录去修改了。还有包括想要直接加入 ssh 密钥的设置控制等项目,写在 %post 里头的话, 会变的很方便喔!

接下来就让我们稍微谈一谈每个区段的重要设置项目吧!

  • command 一般指令项目区段:

这部分的重点项目有底下几个常见的设置值,至于全部的完整信息,可以参考文末的参考文献去看更完整的数据喔!

  • install 或 upgrade (安装模式,二选一)
    如果你想要全新安装一套 Linux 的话,就选『 install 』,如果你是要升级原本的旧系统,那就选择『 upgrade 』。在本案例中,我们是想要使用裸机安装 (没有缺省系统), 所当然是选择 install 即可。

  • text, graphical (使用纯文本或图形接口安装显示)
    一般来说,现在的系统只要内存超过 1GB 以上,通常 CentOS 就会主动提供图形接口来让用户进入安装画面,内存小于 1GB 时,恐怕系统就只会提供纯文本接口让用户安装。 老实说,如果是大量自动安装 CentOS Linux 的话,使用纯文本接口的速度会比图形接口要来的快些,而且也不用去侦测一堆有的没有的硬件设备 (鼠标、屏幕、键盘...)。 因此,鸟哥通常会在 install 后面再加一行『 text 』来强制进如文本接口的自动安装,环境比较单纯就是了!

  • cdrom, harddrive, nfs, url (原版软件位置,择一即可)
    使用光盘安装就选择 cdrom,使用硬盘安装就用 harddrive,我们这里使用网络安装啊!所以鸟哥这里只介绍 nfs 以及 url(网址) 两种方式的来源撰写方式。 此外,也要记得,这个设置值得要接在 install 后面设置比较好喔:

    • url:以本章的 http/ftp 协定而言,应该要写成如下的模样来告知 kickstart 去哪里读取软件:
      url --url http://192.168.42.254/install/centos6.4
      url --url ftp://192.168.42.254/install/centos6.4

    • nfs:以本章的 NFS 分享目录来说,就应该要写成:
      nfs --server=192.168.42.254 --dir=/install/nfs_share/centos6.4

  • lang (系统语系设置)
    你可以选择系统的语系,一般来说,我们都会选择台湾的中文语系啊!只是,在纯文本模式底下,中文是没有办法被显示出来的,因此,安装过程中会使用英文显示, 等安装完成后,在可以见到中文的环境中就能使用中文语系了!另外,基本上我们建议使用万国码 (unicode),因此,建议的设置为:
    lang zh_TW.UTF-8

  • keyboard (系统键盘按键格式)
    选择键盘格式啊!也算重要吧!一般台湾使用美式键盘,所以这样设置即可:
    keyboard us

  • network (网络参数设置)
    一般来说,使用 kickstart 就是为了要方便设置,因此,除非要对应固定的网卡来客制化设置,否则,一般大家都是使用 dhcp 来设置即可。 所需要设置的项目包括哪一张网卡要启动 (--device)?开机时要不要启动 (--onboot)?使用什么方式设置 IP 等等 (--bootproto dhcp/static)。 我们以 eth0 的 dhcp 方式设置如下示意:
    network --onboot yes --device eth0 --bootproto dhcp

    如果想要使用固定 IP 的设置,那可能就得要这样做了:
    network --onboot yes --device eth0 --bootproto static --ip 192.168.42.201 --netmask 255.255.255.0 --gateway 192.168.42.254 --nameserver 192.168.42.254

  • rootpw (设置 root 密码)
    设置 root 密码是很重要的!也因为 root 密码不希望直接以明码的方式设置在此文件内,因此,我们得要经过编码才行。 但是加密的密码怎么来?最简单的方式,使用 grub-crypt 来处理即可。这个指令缺省使用 sha512 加密格式,如果要使用其他加密格式, 请自行 man 一下该指令啰。
    [root@centos ~]# grub-crypt
    Password:         <==输入一次密码
    Retype password:  <==再输入一次密码
    $6$fPCvnGklAR4Qbxhp$RfFL4.wwZml.mWbej6HHYWTAE6ZLRV8/d...  <==这就是加密过的密码!
    
    取得密码后,使用如下的方式设置即可:
    rootpw --iscrypted $6$fPCvnGklAR4Qbxhp$RfFL4....

  • firewall (防火墙设置)
    一般来说,我们用户端使用的系统,防火墙一定要启动之外,如果是内网的 Linux 系统的话,只要启动能够让网络管理员可以远程操控的 ssh 即可。 当然啦,如果你开心的话,在区网内将防火墙取消也没关系,反正是用户端而且是紧急状态下才会使用的系统啊!由于我们后续还会自己手动设置防火墙, 因此这部分可以先激活 ssh 即可。相关设置如下:
    # 不要在这部电脑使用防火墙系统,直接放行所有连接功能:
    firewall  --disabled
    
    # 仅放行 ssh 的连接功能:
    firewall  --service=ssh     <==激活的服务,可以是 ssh, telnet, smtp, http, ftp 等等
    firewall  --port=22:tcp     <==激活的端口口,也可以使用 2049:udp 之类的模式!
    # 上面两个取任何一个都可以!鸟哥个人是比较喜欢使用号码的 port number 来显示!
    
    # 让 eth1 变成信任网域,且放行 port 22, 25, 80 等端口口:
    firewall  --port=22:tcp,25:tcp,80:tcp   --trust eth1
    # 如果有多个网卡,可以指定某张网卡变成信任设备,这样直接放行所有的进出封包在 eth1 上头~
    # 但不包括其他 eth0, eth2...接口,仅有 eth1 是信任的意思。
    

  • authconfig (放行用户登录的身份认证模块)
    一般来说,通常 Linux 主机要让用户登录时,只参考 /etc/passwd, /etc/shadow 等文件数据,若有该帐号的相关信息,并且用户密码输入正确,那就可以登录系统了。 不过,登录时,到底加密的密码验证机制是通过什么方式的算法,就可以在这个项目上详细的说明了。一般来说,目前已经使用 sha1 的 512bits 复杂算法的方式来取代较简单的 md5 编码。因此你会看到如下的设置值:
    # CentOS 缺省的身份验证设置值:使用 sha1 512bits 算法
    authconfig  --enableshadow  --passalgo=sha512   <==较佳的默认值!
    
    # 如果想要使用旧的 md5 编码来取代新的 sha1 编码,可以这样做看看:
    authconfig  --enableshadow  --enablemd5
    

  • selinux (SELinux 相关模块)
    在区网内的用户端系统,你是可以将 SELinux 暂时关闭的!不过,从 CentOS 6.0 以后,鸟哥习惯了有 SELinux 的日子!至少得要启动在 permissive 的宽容模式才好。 因此鸟哥这里建议可以改成这样:
    selinux  --permissive
    # 主要的模式有:  --enforcing  --disabled  --permissive 喔!
    

  • timezone (设置系统所在区域的时区)
    时间是很重要的,所以得要选择时区。鸟哥近年来所安装的系统,为了适合所有学生与课程的安排,都得要处理成多重操作系统安装。因此,不太适合会将 BIOS 时钟调整为格林威治时间的 UTC, 因此,建议将 --utc 拿掉比较妥当!所以这里选择的台湾时区就变成:
    timezone  Asia/Taipei         <==建议改成这样
    timezone  --utc  Asia/Taipei  <==以前缺省的时区模式
    # 更多系统支持的时区列于 /usr/share/zoneinfo/ 目录下,请自行参考喔!
    

  • bootloader (开机管理程序的安装与设置)
    开机管理程序 grub 可以安装于 MBR 也可以安装于 Boot sector (或 superblock) 内,同时,也得给予开机菜单内内核项目的内核参数才行!缺省的情况以及可以修改的部分如下所示:
    # 原本缺省的 bootloader 安装于 MBR 以及缺省 CentOS 6.x 的内核参数如下:
    bootloader --location=mbr --driveorder=vda --append="crashkernel=auto rhgb quiet"
    # grub 安装于 MBR, 安装于 vda 那颗硬盘上,且增加内核参数为 crashkernel=auto rhgb quiet
    
    # 先找 vda 安装,如果找不到,就找 sda 安装,再找不到,就找 hda  安装在 MBR 内:
    bootloader --location=mbr --driveorder=vda,sda,hda --append="crashkernel=auto rhgb quiet"
    

  • halt, reboot, poweroff, shutdown
    安装完毕之后,需要安装程序帮你的系统进行什么行为的意思。一般来说,如果是 kickstart 的环境中,这个值没有设置的话,就会直接进入 『reboot』重新开机的阶段。 如果你想要系统安装完毕后自动关机,那就使用 『poweroff』 即可,使用 shutdown 跟 poweroff 类似。那如果你想要让安装完毕后等待用户按任意键才继续, 就像一般手动挑选设置来安装 Linux 的最后一步,要你按下一步才会重新开机的模式时,那就使用 『halt』 停止即可。

  • zerombr (是否初始化尚未分割或有问题的分割表)
    如果我们的硬盘是全新的,此时硬盘内的第一个磁区会是空空如也,那么我们的安装程序可能会判断这个分割表是其他操作系统所提供的,为了担心不小心误删数据, 因此系统都会询问你:『要不要初始化』!这对 kickstart 来说,可能会造成些许困扰~因此,如果要强制初始化的话,可以加上 『zerombr』 来进行初始化即可。

  • clearpart (是否清除分割表,这个重要!)
    既然要安装在系统上,就得要进行分割才行。不过,如果你的分割表不想要被破坏,那么就得要使用 clearpart --none 才行!不过我们这里使用裸机安装嘛!所以当然得要重新分割。 因此,clearpart 就得要写成 --all 了!那如果你有很多颗硬盘呢?然后仅有一颗要进行重新分割,此时就得要使用『 --drives 』来说明哪颗硬盘要被分割啰。所以可以这样做:
    # 所有硬盘的分割表通通被清除!
    clearpart  --all
    
    # 仅清除 vda 硬盘的分割表,其他的硬盘不要清除分割表!
    clearpart  --drives=vda  --all
    
  • part (详细的分割参数)
    分割表清理完毕,再来就是进行分割了。假设我们要进行如下的分割:
    • 根目录为主要分割,使用 5GB 硬盘
    • /home 为主分割,使用所有剩余硬盘容量
    • /usr 使用 10GB
    • /var 使用 20GB
    • /tmp 使用 1GB
    • swap 使用 1GB
    那相关的设置值就会变成如下模样:
    part  /      --fstype=ext4  --size=5000   --ondisk=vda  --asprimary
    part  /home  --fstype=ext4  --grow        --ondisk=vda  --asprimary
    part  /usr   --fstype=ext4  --size=10000  --ondisk=vda
    part  /var   --fstype=ext4  --size=20000  --ondisk=vda
    part  /tmp   --fstype=ext4  --size=1000   --ondisk=vda
    part  swap   --fstype=swap  --size=1000
    # 如果仅有一颗硬盘,那么 --ondisk 可以省略喔!
    # 使用 --size 来规范该分割的大小,单位是 MB 啰!
    # 使用 --grow 就可以让系统自动去判断最大可用容量,然后通通丢给该分割!
    # 使用 --asprimary  就会将该分割强制列在主要分割类型中!
    
    我们这里只讲简单的分割类型,更复杂的 LVM 或软件磁盘数组的类型,一般鸟哥是建议安装好之后手动去调整。如果你想要安装时就使用这些 LVM 或 RAID 的类型时, 那就请自行参考文末的参考文献啰!

  • services (缺省开机启动或关闭的服务)
    缺省安装好 CentOS Linux 之后,会有很多服务就启动了。如果你想要让某些服务开机关闭或启动,那就使用这个项目来处理。 例如,如果你不想要开机启动 cups, kdump, acpid, portreserve 这四个服务,那你可以使用如下的方式来取消开机启动喔!
    services  --disabled  cups,kdump,acpid,portreserve
    

  • repo (额外的 yum 软件仓库)
    用过 CentOS 的 yum 后,大概你会知道,CentOs 的软件会依据不同的用途而分门别类,缺省提供的就有三大软件仓储系统,包括 OS (原有软件)、updates (升级 patch 软件) 以及 extras (额外软件) 等。所以,如果你在安装过程中还需要额外的非原版光盘的软件仓储时,就可以使用这个 repo 来给予。 在缺省的环境底下,就写入与安装来源相同的数据即可。老实说,这个 repo 也可以不写没关系的!
    repo --name="CentOS"  --baseurl=nfs:192.168.42.254:/install/nfs_share/centos6.4 --cost=100
    # --name 接这个 yum 软件仓储的名称,可以自订一个名字即可
    # --baseurl 就是软件来源~上述为 NFS 的写法,如果是 url 的写法,就直接 --baseurl=http://xxx 即可
    # --cost 这个来源的权重比例
    

上面鸟哥仅列出常见的 kickstart 选项,还有很多其他选项,就请自行参阅相关的文献数据啰!接下来让我们来看一看软件安装区段能有什么特殊的功能吧!

  • %packages 软件安装区段

玩过 yum 就会知道,一般我们在安装软件时,可以独立安装某一个特定软件 (yum install package),也可以安装整个软件群组 (yum groupinstall grouppackage)! 那我怎么知道有哪些软件群组可以使用呢?这时就得要查找原版光盘内的 repodata/*comps.xml 文件了!举例来说,请到目前你服务器内的 /install/nfs_share/centos6.4/repodata/*comps.xml 文件内,使用关键字 『group』 去查找一下,就会看到很多安装过程中会出现的软件群组了! 以我们在上一小节谈到的安装内容 (basic server) 来说,相关的软件与软件群组有这些:

%packages
@base                          <==前面加个 @ 的,代表是软件群组喔!
@console-internet
@core
@debugging
@directory-client
@hardware-monitoring
@chinese-support               <==中文语系支持!这个重要!
....(中间省略)....
pax                            <==直接写软件名称的,就是单一软件而已!
oddjob
sgpio
device-mapper-persistent-data
....(底下省略)....

一般来说,所有的软件都可以在后续才安装!不过,如果你想要一安装完毕就能够看到图形接口以及所有相关的其他语系显示画面,那就得要安装额外的语系支持。 同样可以到 *comps.xml 文件内找到相关的软件群组来安装。举例来说,如果你想要安装法语语系,那就得要加个:『 @french-support 』在你的 %packages 区段内啰!

  • %pre, %post 安装前、安装后的额外动作区段

假设你的 kickstart 是要给不同的机器设备共同使用的,但我们知道所有的设备其实硬盘数量与大小都不相同。那能不能在开始解析 kickstart 之前,先侦测系统的磁盘设备, 根据侦测的结果制作出分割表的规划后,才进行 kickstart 的解析,最后才开始安装呢?是可以的!那就是将所需要侦测与作出分割信息的文件通过 bash shell 去检测, 然后在 kickstart 内使用『 %include somefile 』的方式将该数据汇整进来即可~这时就得要将该动作放置于 %pre 的区段内了!

不过 %pre 的用途比较少,因为安装前大概只要注意到硬件侦测,以厘清我们想要安装的模式为何而已。如果是安装后到重新开机前的行为,那就热闹多了! 因为我们可能会增加 ssh 的密钥、额插件载与设置某些特定的脚本程序到 /etc/rc.d/rc.local、额外进行其他 partition 的完整复原等等。举例来说,如果我想要安装完毕之后, 让 root 加入 ssh 密钥,这样我才能够不用密码登录此机器时,那可以这样处理:

%post
#!/bin/sh
mkdir -p /root/.ssh
chmod 700 /root/.ssh
chown root.root /root/.ssh
echo "ssh-rsa AAAAB3NzaC1yc2EA...== root@i4502.dic.ksu" >> /root/.ssh/authorized_keys
chmod 644 /root/.ssh/authorized_keys
chown root.root /root/.ssh/authorized_keys

当然啦,上面那个密钥的内容 (echo 后面双引号的内容) 你就得要自己粘贴去了~

2.2 一个电脑教室内简易主控系统的范例

谈完了大致的 kickstart 参数后,那怎么用在我们想要处理的批量安装电脑教室内的所有电脑主机呢?最简单的方式就是,拿上一个小节做完的 anaconda-ks.cfg 来改即可! 简单快速又方便!现在鸟哥想要使用底下的方式来处理批量安装:

  • 通过纯文本的方法全新安装一套 CentOS 系统
  • 我要通过局域网路内的 NFS 服务器来取得安装软件来源
  • 网络缺省使用 dhcp 服务来启动,且开机就会驱动网卡
  • root 密码是要给予加密过的数据
  • 防火墙缺省放行 22, 25, 80, 111 等端口口
  • 认证设置保持原有的状态即可 (sha512)
  • 将 SELinux 启动于宽容模式下
  • 安装完毕后进行重新开机的动作
  • 仅作出一个 3GB 大小的根目录来安装这个小型控制系统即可
  • 关闭 cups, kdump, acpid, portreserve 等服务
  • 安装的软件主要为 basic server 类型,因此保留上一小节安装后的原有的项目即可
  • 安装完毕后加入 root 的 ssh 密钥!

鸟哥预计将这个 kickstart 放置于 /install/nfs_share/kickstart/ 目录内,且取名为 pcroom_raw.ks 文件。在这个文件开始处理前,我们有两个东西需要先取得, 一个是 root 密码,一个则是密钥中公钥的内容。我们可以简单的通过底下的方式来取得相关的信息:

# 1. 取得 root 密码:
[root@centos ~]# grub-crypt
Password:
Retype password:
$6$ZXrlk3POd9J1kqa4$PmTaai.UlWf.exaXFP.aqmn6C4gdQvP9NpExsJmcJIDAKD8VEZArkVtfr/KDnScY41tZGJxwix0ZvEbsmjLea0
# 上面这一串就是我们要的数据啦!

# 2. 取得密钥的公钥数据:
[root@centos ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):  <==输入 Enter
Enter passphrase (empty for no passphrase):               <==输入 Enter
Enter same passphrase again:                              <==输入 Enter
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.  <==这就是我们要的!
The key fingerprint is:
51:ee:b0:29:e5:3a:01:eb:57:33:f3:73:34:12:0b:26 root@server.i4502.dic.ksu

[root@centos ~]# cat /root/.ssh/id_rsa.pub
# 输出的内容就是我们要的信息!!

好了,那就让我们来调整一下这次我们所需要的 kickstart 文件内容吧!

[root@centos ~]# mkdir /install/nfs_share/kickstart
[root@centos ~]# vim /install/nfs_share/kickstart/pcroom_raw.ks
install
text
nfs --server=192.168.42.254 --dir=/install/nfs_share/centos6.4
lang zh_TW.UTF-8
keyboard us
network --onboot yes --device eth0 --bootproto dhcp --noipv6
rootpw  --iscrypted 刚刚你用 grub-crypt 作出的密码参数
firewall --port=22:tcp,25:tcp,80:tcp,111:tcp,111:udp,9000:udp,9001:udp
authconfig --enableshadow --passalgo=sha512
selinux --permissive
timezone Asia/Taipei
bootloader --location=mbr --driveorder=vda --append="crashkernel=auto rhgb quiet"
reboot

zerombr
clearpart --all
part / --fstype=ext4 --size=3000

services  --disabled cups,kdump,acpid,portreserve

repo --name="CentOS"  --baseurl=nfs:192.168.42.254:/install/nfs_share/centos6.4 --cost=100

%packages
@base
@console-internet
@core
@debugging
@directory-client
@hardware-monitoring
@java-platform
@large-systems
@network-file-system-client
@performance
@perl-runtime
@server-platform
@server-policy
pax
oddjob
sgpio
device-mapper-persistent-data
samba-winbind
certmonger
pam_krb5
krb5-workstation
perl-DBD-SQLite

%post
#!/bin/sh
mkdir -p /root/.ssh
chmod 700 /root/.ssh
chown root.root /root/.ssh
echo "刚刚你制作出的 id_rsa.pub 文件的内容" >> /root/.ssh/authorized_keys
chmod 644 /root/.ssh/authorized_keys
chown root.root /root/.ssh/authorized_keys

[root@centos ~]# chmod 644 pcroom_raw.ks

了解了 kickstart 的参数后,这个小节的相关参数修改与制作就显的简单多了!接下来,就让我们准备来大量安装系统吧!

2.3 搭配 PXE 使用的方式

我们得要告知用户端在取得 PXE 的环境后,还能够自动下载这个 kickstart 设置档,这样用户端电脑才会自己安装而不会进入询问模式。这时得要修改 pxelinux.cfg/default 内容了! 我们现在增加另外一个菜单,这个菜单可以让系统自动的以刚刚的 kickstart 方式来自我裸机安装~这样做就可以了!

[root@centos ~]# vim /install/tftpboot/pxelinux.cfg/default
....(前面省略)....
LABEL kickstart1
  MENU LABEL Boot from PXE Server for AUTO Install CentOS 6.4 raw
  kernel ./kernel/centos6.4/vmlinuz
  append initrd=./kernel/centos6.4/initrd.img ks=nfs:192.168.42.254:/install/nfs_share/kickstart/pcroom_raw.ks

重点是上面特殊字体的部分!可以是 nfs 也可以是 http:// 的格式!看你的数据要放哪里就是了。鸟哥偷懒一下,就直接摆内网原本要分享出去的位置而已。 好了,接下来请到内网的用户端开机一下,使用网络开机喔!看看能不能进入第三个菜单,然后让系统自己安装去!

在 PXE 当中增加一个菜单!
图 2.3-1、在 PXE 当中添加一个可以自己安装的菜单!

以纯文本模式安装这套新系统的图标
图 2.3-2、以纯文本模式安装这套新系统的图标

在鸟哥的测试中,很快的啦!几分钟就安装好了这样的一套系统~相当的简单快速!不用挑选!好开心啊!另外,这一套系统如果搞定了之后,拜托注意一下, 请回到第一章 2.3 小节的 DHCP 服务器部分,参考一下 getmac.sh 的内容, 根据该功能重新设置一下你的 DHCP 服务器设置档,让你的用户端 IP 能够与座位搭配上喔!


3. 以 Demo 机制作映像档进行大量用户端系统的还原

如果你跟鸟哥一样有特殊的操作系统环境需求,那么可能得要花点功夫来思考一下怎么进行操作系统的初期安装才好!安装好了之后,再将该 partition 所在的环境给他完整的备份, 然后丢给其他电脑来作为复原的机制!这样就成功啦!这过程是挺复杂的~底下我们就来玩一玩~

3.1 Demo 机多重操作系统的规划与安装

在鸟哥工作的信息传播系单位中,因为系上老师们使用的软件都不一样,很多老师还是需要 Windows 上面的重要软件。因此,鸟哥得要将电脑系统安装成多重操作系统。 在这样的情况下,我们系上需要安装 (1)第一套 Linux 管理系统 (2)windows 7 系统 (3)上课用 CentOS 桌面系统,这还没有提到数据共用的 windows D 槽~ 好了,假设我们已经使用 kickstart 安装好了第一套 Linux 管理系统,那接下来 Windows 系统怎么安装呢?当然你得要调整用户端 BIOS 变成光驱开机,放入 Windows 7 的原版光盘, 接下来请自行安装你的 Windows 系统吧!

  • Demo 机的分割注意状况:目标磁盘总是比来源磁盘大才好

因为 Demo 机未来安装的系统都是要做为备份的来源,因此安装在上头的数据当然就得要能够复原给其他用户端电脑。一般来说,目标的磁盘总是要比来源的磁盘大才好。 例如,原本 Demo 机器的 Windows 占用了 20GB 的话。那么你的其他用户端电脑,除非系统与磁盘是一模一样的,否则的话,最好能够加大到类似 20.1GB 之类的容量,那未来在复原时比较不会出问题。 这是鸟哥过去的经验啦,提供给您参考啰!

另外,安装过 Windows 7 的朋友都知道,Windows 会自己搞一个额外的 100MB 分割来保存信息。不过,鸟哥不是很喜欢多这个分割在。但是这个分割是 windows 正常安装所产生的, 以正常手段是很难避免掉!所以,为了避免这个问题,鸟哥习惯上都会先自己在 Linux 控制系统上面使用 fdisk 或 parted 手动创建足够的分割,然后再强迫 Windows 安装到固定的分区中, 这样就不会多出那个怪异的 100MB 分区了。

现在,鸟哥假设我这里预计要安装的 Windows 会占用 20.1GB 的容量,剩余的容量都给 Linux 使用。不过如前所述,Demo 机器的容量要检小一些。因此,底下我们要处理的方式中, Windows 的 /dev/vda2 仅拥有 20GB,剩余的容量中,除了给 Linux Desktop 用之外,还会有 100MB 留在最面没有使用到!底下是鸟哥的测试机分割示意:

# 1. 先看看剩下多少容量吧!
[root@centos ~]# parted /dev/vda unit MB print
Model: Virtio Block Device (virtblk)
磁盘 /dev/vda:31527MB   <==此硬盘的最大可用容量
磁区大小 (逻辑/物理):512B/512B
分割区:msdos

编号  起始点   结束点   大小     类型     文件系统  旗标
 1    1.05MB   3147MB   3146MB   primary  ext4   <==此硬盘的 /dev/vda1 起始/结束磁柱

# 2. 创建的新分割为 NTFS 文件系统,且起始为 3147MB 结束为 3147+20480*1.024=24118.5=24120
#    请注意,parted 显示的 MB 为十进位的 1000 倍而不是我们常用的 1024 倍!
[root@centos ~]# parted /dev/vda mkpart primary NTFS 3147MB 24120MB
[root@centos ~]# parted /dev/vda unit MB print
编号  起始点  结束点   大小     类型     文件系统  旗标
 1    1.05MB  3147MB   3146MB   primary  ext4
 2    3147MB  24120MB  20974MB  primary  ntfs           <==注意大小的地方即可!

# 3. Linux Desktop 容量应该在 24120MB ~ (31527-100) = 31427MB
[root@centos ~]# parted /dev/vda mkpart primary ext2 24120MB 31427MB
[root@centos ~]# parted /dev/vda mkpart primary ext2 31427MB 31527MB
[root@centos ~]# parted /dev/vda unit MB print
编号  起始点   结束点   大小     类型     文件系统  旗标
 1    1.05MB   3147MB   3146MB   primary  ext4
 2    3147MB   24120MB  20974MB  primary  ntfs
 3    24120MB  31427MB  7306MB   primary
 4    31427MB  31527MB  99.7MB   primary

请注意,鸟哥是特别留下 100MB 在最后面,这个不见得用的到!如果每部机器的磁盘都一模一样的话,那就无所谓~如果不一样大的话,那么等一下用户端的电脑就得要先作个手脚~ 让他们的 /dev/vda2, /dev/vda3 稍大一下,这样在复原时比较不会出问题啦!

  • 安装第二个系统,Windows 7 为例:

请先确认你的光驱放了 Windows 7 的原版光盘,并且调整了 BIOS,之后直接进入安装程序,因为我们先作了分割了,因此,你就会看到如下的画面, 直接按下箭头点击处安装到 /dev/vda2 即可!

Demo 机多重操作系统
图 3.1-1、安装多重操作系统中,安装在先分割好的 partition 上的独立 Windows 7 示意图

安装好了 Windows 7 之后,鸟哥建议可以关闭某些不必要的服务,以及更改一些可能会发生问题的设置,并增加一个可以自动修订主机名称的软件后, 再开始进行 Windows update。等到更新完毕后,再安装你所需要的所有软件。等到软件都处理妥当了,这时才开始进行后续的备份与大量复原的动作吧!底下是鸟哥建议可以进行的工作:

  • 固定虚拟内存的分页大小:
    在 Linux里面我们称为 swap 而在 Windows 里面就被称为分页档,这个分页档通常是物理内存的 1~2 倍大。由于这个值会依据你的系统而变,所以大小常常不固定,这会造成系统的些许困扰 (占用太多备份的保存容量)。所以鸟哥通常不喜欢这个值让系统管理,都会自己设置固定值啦!。
    于是,鸟哥都会主动的将他设置为差不多 1~2GB 左右。在本案例中,我们将他设置为 1024MB 吧!调整的方法为『我的电脑右键』 --> 『内容』 --> 『高端系统设置』 --> 『性能』 --> 『高端』 --> 『虚拟内存』 --> 『变更』 (填好数值记得要按下箭头 9 的 "设置" 才好!)
    Demo 机 Windows 分页
    图 3.1-2、设置 Windows 7 的分页大小,将它的数值固定起来

  • 取消磁盘重组:
    由于我们会将整个文件系统都予以备份,因此,似乎也没有必要进行磁盘重组啦!所以,个人建议是可以拿掉磁盘重组的调度。 作法很简单:『开始功能表』 --> 『所有程序』 --> 『附属应用程序』 --> 『系统工具』 --> 『磁盘重组工具』 --> 『设置调度』请取消
    Demo 机 Windows 磁盘重组取消
    图 3.1-3、设置 Windows 7 磁盘重组,将磁盘重组调度取消了!

  • 取消电脑的系统还原功能:
    既然现在系统已经有了可以备份的数据,本机的系统还原如果还打开,可能会造成未来整个系统备份时,会将备份的备份数据也备份下去 (绕口令?)~ 这样会造成些许文件系统容量的浪费啦!所以鸟哥是暂时关闭它的!使用方法是: 『我的电脑右键选内容』 --> 『高端系统设置』 --> 『系统保护』 --> 『设置』 --> 选择【关闭系统保护】并且【删除所有还原点】
    Demo 机取消 Windows 还原功能
    图 3.1-4、取消 Demo 机上的 Windows 7 的还原功能

  • 删除不再需要使用的硬盘数据:
    既然要备份了,最好将系统的垃圾文件通通清光比较好吧!所以啰,来删除系统认定的垃圾文件,方法如下: 『开始功能表』 --> 『所有程序』 --> 『附属应用程序』 --> 『系统工具』 --> 『磁盘清理』 --> 『确定(勾选暂存盘案)』
    Demo 机删除一些暂存盘
    图 3.1-5、删除掉 Demo 机上面的 Windows 7 的暂存盘

  • 安装台湾国家高速网络中心开发的 DRBL-Winroll 软件:
    由于 Windows 必须有特殊的单一主机名称、单一的 IP 与相关设置,这样才能够顺利的运作网络系统。我们的 IP 主要依据 DHCP 以及主机网卡而定, 所以 IP 不会有问题,有问题的地方在于主机名称啦!因为是完整备份,当这个备份挪到其他机器时,当然所有的数据也会相同~这就产生了主机名称冲突的问题。 为了解决这个问题,国高有提供一个自动更新主机名称的 winroll 软件,完整的下载与说明可以参考: http://drbl-winroll.nchc.org.tw/ 的说明。假设你已经下载且运行了, 那就一直按下一步,直到出现一些关键字时,你再仔细的调整调整如下:
    • 是否安装『自动主机名称』时,请勾选『Y』
    • 选择你想要的主机名称样式,有[1]ip, [2]Mac address, [3]由本地端文件决定,鸟哥建议选择 [2],因为网络卡不会变啊! 所以,当其他主机使用了这个 Demo 机的备份还原,那他开机进 windows 后,会自动重新开机一次,之后就能够顺利运作了!所以,选择 [2] 吧!
    • 是否也启动自动工作群组名称:也选择 y 吧
    • 那工作群组的样式:[1]固定字符串, [2]IP/Netmask, [3]由 DNS 指定。鸟哥个人建议使用 [1] 固定字符串啦!自己选择工作群组!
    • 选择网络模式:有 [1]DHCP, [2]由本地端文件决定与 [3]忽略。因为我们会自己去设置网卡的相关设置值,所以这里建议选择 [3] 忽略, 不要让 winroll 管理。
    • 是否配置 sshd 服务:因为 windows 是一般用途,似乎没有什么必要安装 sshd 的,所以,这里建议可以选择 N 啦!
    其它的通通选择默认值,这样系统就会自动的将所有其他需要的设置搞定!就这么简单啊! ^_^

  • 启动 windows, update, update, update
    管理过大量 windows 的朋友都知道,最累人的时刻就是 update 的时候!如果全部的系统同时 update 的话,更可怕!还会吃掉很多网络带宽! 所以,如果能够在建置备份档时,就先更新好 windows 系统的话,那就太棒了!所以,请依贵公司的授权,将 windows 7 启动,然后开始更新吧! 可能得要更新好几次啊!

  • 解决用映像档复原 Windows 7 产生的开机需原版光盘修复问题:
    如果你真的玩过使用映像档来复原 windows 7,而且没有使用 Windows 他们家的 Syspre 这套软件来重新检测硬件的话,那么复原完毕之后,你会常常看到屏幕上出现要你放入原版光盘, 然后进行开机修复的动作。虽然只是需要放入原版光盘而已,不过,如果有一整间教室全部的电脑都需要复原,那可能就会让你抓狂了吧我想!
    Tips 鸟哥 之前鸟哥管电脑教室的学生跑来跟鸟哥说, 他需要好多好多片 DVD 来复原才行。后来,我们为了这个问题,还购买了六支 8GB 的 USB 放入 windows 原版数据,用 USB 复原比 DVD 快,真是好蠢...
    查了许多文档,终于发现可能是 Windows 自我管理系统的 BCD 数据出了点问题 (注4),因此需要搞定 Windows 的注册机码以及 BCD 的问题之后, 才有可能解决这方面的窘境~鸟哥测试过这个方法,还真的可行!顿时给它开心了起来~因为,可以节省好多人力与时间!底下就来说说鸟哥的处理方法吧:
    • 先拿掉不必要的挂载设备参数:
      与 Linux 一样,Windows 过去曾经使用过的磁盘设备也称之为『挂载设备』,这个之前挂载过的参数被记录在 Windows 的注册表中 (regiser),我们得要将它删掉比较好。 先在开始底下的运行按下『 regedit 』,就会出现如下的画面,然后找到『 电脑\HKEY LOCAL MACHINE\SYSTEM\MountedDevices 』这个机码,将里面的数值通通清除! 清除过后再重新开机进入 Windows 即可。
      Windows 7 的 MountedDevices 机码
      图 3.1-6、删除掉 Demo 机上面的 Windows 7 的 MountedDevices 机码

    • 处理分割表当中,具『启动』旗标的分区设备行为:
      Windows 的一些启动信息会记录在分割表当中列为『启动 (boot)』旗标的分区中,一般来说,Windows 所在的那个分区系统会自动将它列为『启动』就是了, 所以无须修改。但如果你是使用映像档还原的方式,那就得要检查看看才行 (参考下一小节 partclone 还原的方式)。我们得要通过 bcdedit 去编辑这个分区内的启动信息, 处理的方法很简单,就是需要使用管理员身份启动命令提示字符,然后输入如下动作:
      调整 Demo 机上面的 Windows 7 的启动词区参数
      图 3.1-7、调整 Demo 机上面的 Windows 7 的启动词区参数

      你比较需要注意的是,这个动作在每次准备关机压制映像档之前,都需要重作一次!所以,如果你需要使用原映像档数据内容修改, 改完后,要压制成新的映像档,那就得要重新 bcdedit 一次之后才关机!否则可能会失败的!

  • 最后,安装好你所需要的软件,再次对该软件更新!若有重新开机过,再次进行 bcdedit 步骤!完成!关机!

整个 windows 7 的安装大概就是这样,重点在那个分割的动作啦!然后,由于未来这部 Demo 机的 windows 会被拿来作为范本并还原在其它的主机上, 所以,最好对这个系统做个比较完整的设置与更新,然后才关机后准备备份的动作。不要忘记了,我们还有个 CentOS Linux 要安装喔!

  • 安装第三套操作系统,以 CentOS 为例:

安装好了 Windows 7 之后,你会发现一件事情,那就是:『你再也进不了第一套 Linux 控制系统』了!这是因为 Windows 7 会主动的将它的 boot loader 安装于硬盘的 MBR 当中,但它的 boot loader 又不允许提供 Linux 系列的 boot loader 的控制权移交,因此,你才再也进不了 Linux。没关系啦!反正我们还可以再安装一套 Linux 嘛!

那如何安装这套 Linux 呢?要不要原版光盘啊?不用啦!我们不是在 PXE 的阶段就作好了可以让用户自由挑选安装内容的菜单吗?回到图 2.3-1 去瞧一瞧,直接使用第二个菜单来开机就能进入交互的安装模式了。然后就开始依据正常进程安装系统,你唯一比较需要注意的地方是:

  • 考虑台湾地区惯用语系,进入窗口模式前,请选择『Chiense(Traditional)』的语系!
  • 区网内我们还是使用 NFS 的方式来安装好了!
  • 记得网络设置时,通常先取消 IPv6 而保留 IPv4 的设置即可
  • 要注意 NFS 输入的格式 (刮号内为本例设置) (NFS server name: 192.168.42.254) (CentOS directory /install/nfs_share/centos6.4)
  • 选择时区时,请取消 UTC 的系统时钟设置!
  • 进入分割时,请务必要选择:『创建自动分割格式』才行!
  • 进入分割后,点击 vda3 之后,直接勾选『格式化』且选择挂载点为 / 即可!
    Demo 机 Linux 的分割
    图 3.1-8、Demo 机 Linux 的分割
  • 最后软件安装务必选择『Desktop』项目才对喔!

如果一切顺利的话,你的系统会很快速的就安装完毕且进入 Linux Desktop 中没问题~不过,此时你却只能使用这套 Linux 与 Windows 来操作系统而已, 还是无法回到原本的 Linux 控制系统!那怎办?没关系,我们先来处理一下 Linux desktop (第三套系统) 的问题,处理完毕后,再来搞定 Linux manager (第一套系统) 的问题~

  • 调整网络卡的相关参数:
    由于现在的 Linux 大多会设置很多独特的标志在设置档中,例如 CentOS 6.x 就会依据每张网卡的卡号 (MAC) 来填写到对应的设置档中。但是,由于这个系统未来会被做为种子给其他系统使用, 因此,我们必须要将这些特定的标志给拿掉才好!请登录这个 Linux Desktop 系统,然后将底下与网卡相关的设置档打开稍微处理一下即可!
    # 删除系统侦测到的网卡 MAC 与网卡代号对应值
    [root@centos ~]# vim /etc/udev/rules.d/70-persistent-net.rules
    # PCI device 0x1af4:0x1000 (virtio-pci)
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:ae:67:07",
     ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
    # 上面删除线的内容是同一行~只要出现的任何 SUBSYSTEM 开头的,通通删除!
    # 让系统下次开机时,重新针对网络卡进行硬件自动检测!
    
    # 让网络设置档中,关于网卡与网卡 UUID 的设置值拿掉~
    [root@centos ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE="eth0"
    BOOTPROTO="dhcp"
    HWADDR="52:54:00:AE:67:07"
    NM_CONTROLLED="yes"
    ONBOOT="yes"
    TYPE="Ethernet"
    UUID="93fa7379-4e1b-4893-a480-0e405cd8e165"
    # 将上面两个设置值,HWADDR 与 UUID 拿掉!
    

  • 加入 ssh 的密钥:
    如果你想要使用远程的方式来操控这部系统,那么就得要加入 ssh 的密钥啰!这部份请到服务器架设篇瞧一瞧,不再啰唆了!

  • 修改系统的菜单:
    因为缺省菜单仅有本 Linux desktop 系统以及 windows 7 可以使用,而且缺省 windows 7 的菜单名称为 Other,很难看啊!所以这里我们稍微修改一下相关的菜单模式吧!
    [root@centos ~]# vim /boot/grub/menu.lst
    default=0
    timeout=30
    splashimage=(hd0,2)/boot/grub/splash.xpm.gz
    hiddenmenu
    title CentOS (2.6.32-358.el6.x86_64)
            root (hd0,2)
            kernel /boot/vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/vda3 .....(后面省略)..
            initrd /boot/initramfs-2.6.32-358.el6.x86_64.img
    title Windows 7
            rootnoverify (hd0,1)
            chainloader +1
    title MBR
            root (hd0)
            chainloader +1
    # 如上所示,增加菜单等待时间之外,也增加回到 MBR 的菜单功能!
    # 此外,由于这个映像档要被拷贝,因此 root 不建议使用 UUID,应变为原本的 /dev/vda3 较佳。
    

  • 救援 Linux manager 控制系统的菜单功能,将 MBR 重新安装为第一套 Linux 控制系统:
    我们最重要的还是得要通过本机的第一套安装好的 Linux 来管理才对!但我们已经无法进入该系统了耶!怎办?没关系,我们可以通过底下的方式来重新取得第一套 Linux, 并且重新设置好菜单,同时更新 MBR 的 boot loader 内容!整体过程还算简单!
    # 1. 先挂载原有的 Linux 控制系统,并且将根目录切为该系统去!
    [root@centos ~]# df
    文件系统               1K-区段      已用     可用 已用% 挂载点
    /dev/vda3              7119768   3435780   3322320  51% /        <==有 7G 为 desktop 系统
    tmpfs                   510212        76    510136   1% /dev/shm
    
    [root@centos ~]# mount /dev/vda1 /mnt  <==除根目录外,底下的内存与设备也需要挂载
    [root@centos ~]# mount --bind /proc /mnt/proc
    [root@centos ~]# mount --bind /dev /mnt/dev
    [root@centos ~]# chroot /mnt
    [root@centos /]# df  <==你会看到,突然变成了根目录了!
    文件系统               1K-区段      已用     可用 已用% 挂载点
    /dev/vda1              3023760   1730868   1139292  61% /        <==整个根目录变成为 vda1
    sysfs                  3023760   1730868   1139292  61% /sys
    
    # 2. 设置好菜单项目,缺省为 Windows --> Linux desktop --> Linux manager
    [root@centos /]# vim /boot/grub/menu.lst
    default=0
    timeout=30                                        <==等待 30 秒比较够用
    splashimage=(hd0,0)/boot/grub/splash.xpm.gz
    #hiddenmenu                                       <==不要隐藏,直接让用户挑选
    title Windows 7                                   <==第 0 个是 Windows 7
            rootnoverify (hd0,1)
            chainloader +1
    title CentOS Linux for Desktop System (Linux OS)  <==第 1 个依旧直接交给该系统的 loader
            root (hd0,2)
            chainloader +1                            <==就是这里!是该系统自己的 loader
    title This system restore/backup manager          <==最后一个才是管理系统本身
            root (hd0,0)
            kernel /boot/vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/vda1 .....(后面省略)..
            initrd /boot/initramfs-2.6.32-358.el6.x86_64.img
    # 是要特别注意上头内核参数的 root 部分啦!因为这个菜单也要拷贝给所有用户端机器使用!
    
    # 3. 将此设置写入 MBR 当中去!
    [root@centos /]# grub
        GNU GRUB  version 0.97  (640K lower / 3072K upper memory)
    
     [ Minimal BASH-like line editing is supported.  For the first word, TAB
       lists possible command completions.  Anywhere else TAB lists the possible
       completions of a device/filename.]
    grub> root (hd0,0)
    root (hd0,0)
     Filesystem type is ext2fs, partition type 0x83
    grub> setup (hd0)
    setup (hd0)
     Checking if "/boot/grub/stage1" exists... yes
     Checking if "/boot/grub/stage2" exists... yes
     Checking if "/boot/grub/e2fs_stage1_5" exists... yes
     Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  27 sectors are embedded.
    succeeded
     Running "install /boot/grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/boot/grub/stage2 
     /boot/grub/grub.conf"... succeeded
    Done.
    grub> quit
    quit
    
    # 4. 回原本的 Desktop 系统,并重新将自己的 grub 安装于自己 filesystem 的 boot sector 内!
    [root@centos /]# exit
    [root@centos ~]# grub  <==回到原本的 Linux desktop 中
    grub> root (hd0,2)
    grub> setup (hd0,2)  <==以 Linux desktop 的设置,再次安装于自己的 boot sector 内!
    grub> quit
    # 在某些特殊的情境下,partition 内的 boot sector 并不会安装 grub 开机管理程序,
    # 为了避免困扰,建议还是重新安装一次在原 desktop 系统中较好!
    
    经过上面的步骤之后,你就可以重新开机,当 (1)通过 PXE 选择本机开机后,就会 (2)进入如下的开机菜单中:
    Demo 机本机磁盘开机的菜单模式状态
    图 3.1-9、Demo 机本机磁盘开机的菜单模式状态

    接下来就可以测试看看三个菜单是否都 OK 可以顺利进入个别的操作系统当中啰!

  • 取消所有 root 曾经下达过的指令
    鸟哥想要作的这个系统是未来要考试与练习用的,所以不希望这个系统上面做过的动作被学生们知道。如果上述的动作做完之后,重新开机且顺利进入 Linux desktop 系统后, 此时,你可以在剩下唯一的一个 bash 终端机时,下达:『 history -c; history -w 』指令,将所有历史命令通通清除光光!之后就直接 poweroff 关机准备使用即可。

在一切都搞定之后,接下来要干嘛?当然就是将 Demo 机的 /dev/vda2, /dev/vda3 内的文件系统拷贝起来啦!那如何拷贝呢? 就得要通过 server 端提供的 NFS 文件系统空间,然后再以 partclone 指令处理即可!继续来参考下一小节的内容吧!

3.2 通过 partclone 备份 Demo 机的原始来源与还原

我们的 Demo 机的第一套 Linux 控制系统内的文件容量很小,全部的文件系统只给 3GB 而已,根本没有空间可以保存 /dev/vda2, /dev/vda3 的数据。 因此得要通过区网内的 server 提供的网络磁盘来进行备份。最简单的网络磁盘当然就是 NFS 啦!另外,我们也知道备份整个 partition 最简单的方式是 dd 这个指令~只是,dd 会连同没有使用到的磁区也备份下来,而且也没有进行任何文件系统压缩,因此备份档会非常非常大!

以本案例来说,鸟哥的 windows 灌完只用了 13GB 而 Linux 更小,只有 3GB 左右而已,因此总共用的磁盘也不过 16GB。但如果使用的是 dd 指令备份, 那么全部的备份数据将会保留原有 partition 的大小,亦即是 20+7=27GB,这比用到的数据还要大太多了吧!

为了减少保存备份的文件系统压力,也为了加快文件系统的复原 (越大的备份代表越久的复原时间),我们这里使用的是国家高速网络中心推出的, 修改 partimage 让备份支持 ext4/NTFS 等文件系统的 partclone 软件啦(注3)!这个软件功能相当强大,而且国高也有针对 CentOS 推出 yum 软件仓储, 你只要设置好 yum 就能够直接在线安装 partclone 了!好轻松呢!

接下来,我们将分 server 与 client 需要进行的动作来做介绍喔!下达指令之前,务必了解该指令段是给哪个系统使用的! 不要做错地方了喔! ^_^

  • Server 端的简易设置:

Server 端要进行的项目中,其实不需要安装 partclone 啦!只是为了管理上的方便,所以建议还是得安装一下比较好!另外,鸟哥预计要让用户端上传备份数据的地方, 主要是放置于 /install/client_img/ 目录,该目录最好要权限全开比较好!那就让我们来玩一玩吧!

# 1. 先设置好 DRBL 官方网站提供的 yum repository 的网址,并安装所需要的 partclone 与 ntfsprogs
[root@centos ~]# vim  /etc/yum.repos.d/drbl.repo
[drbl]
name = Diskless Remote Boot in Linux
baseurl = http://free.nchc.org.tw/drbl-core/x86_64/RPMS.drbl-stable/
gpgcheck = 0
enabled = 1
# 记得,这个文件是自己创建的!所以是全新文件啦!

[root@centos ~]# yum install partclone ntfsprogs

# 2. 分享 /install/client_img/ 目录使用 NFS 出去
[root@centos ~]# mkdir  /install/client_img
[root@centos ~]# vim  /etc/exports
/install/client_img  192.168.42.0/24(rw,async,no_root_squash)  localhost(rw,async,no_root_squash)

[root@centos ~]# /etc/init.d/nfs reload
[root@centos ~]# showmount -e localhost
Export list for localhost:
/install/client_img 192.168.42.0/24,localhost  <==多这玩意儿就对了!
/install/nfs_share  192.168.42.0/24,localhost

Server 做到这步就成功了!很简单吧!

  • Client 端的软件安装与备份至 Server 端:

Client 端的设置中,第一步骤与 server 一样,就是安装好 partclone, ntfsprogs 即可!非常简单!不过你需要注意的是,你要进入的是:『Linux 控制系统, 也就是第一套用 kickstart 安装的系统』才对喔!因为我们是通过这个 Linux 来掌控整部主机的嘛!

# 1. 先设置好 DRBL 官方网站提供的 yum repository 的网址,并安装所需要的 partclone 与 ntfsprogs
[root@centos ~]# vim  /etc/yum.repos.d/drbl.repo
[drbl]
name = Diskless Remote Boot in Linux
baseurl = http://free.nchc.org.tw/drbl-core/x86_64/RPMS.drbl-stable/
gpgcheck = 0
enabled = 1

[root@centos ~]# yum install partclone ntfsprogs

# 2. 挂载来自 Server 的 /install/client_img 目录到本系统中
[root@centos ~]# mkdir -p  /install/client_img
[root@centos ~]# mount -t nfs 192.168.42.254:/install/client_img /install/client_img
[root@centos ~]# df
文件系统     1K-区段      已用     可用 已用% 挂载点
192.168.42.254:/install/client_img
            15481856   4456704  10238720  31% /install/client_img  <==要看到他!

# 3. 使用 partclone 完整备份 /dev/vda2 到 Server 上面去!
[root@centos ~]# partclone.[fs] -c -s [设备] -o [file]   <==这个是备份
[root@centos ~]# partclone.[fs] -r -s [file] -o [设备]   <==这个是还原
选项与参数:
-c   :为拷贝 (clone) 的意思,所以要备份得要加上 -c 参数才行喔!
-r   :为还原 (restore) 的意思,还原映像档到设备上,就得使用这玩意儿!
-s   :为来源 (source) 的意思,备份时为设备,还原时为来源印象档。
       如果与标准输入/输出有关而非文件/设备时,那就写『 - 』即可!
-o   :为目标 (output) 的意思,是要将来源拷贝到哪里去的意思~一般是文件!
-d   :为调试 (debug) 的意思,可以输出的消息比较多,方便用户调试
-C   :为略过检测 (no check) 的意思,某些特殊情况下,你可能要略过检测~
       这个项目就可以帮助你略过检测了!

# 将 windows 7 的 partition 完整备份后,并且进行压缩,直接放置于 server 上
[root@centos ~]# partclone.ntfs -c -s /dev/vda2 -o -  |  \
> gzip > /install/client_img/windows7.img.gz
Partclone v0.2.59 http://partclone.org
开始备份 设备 (/dev/vda2) 到 印象档 (-)
Reading Super Block
经过:00:00:01, 剩余: 00:00:00, 完成:100.00%
全部时间:00:00:01, 100.00% completed! 
done!         <==上面在读取整体文件系统信息,主要是 superblock 内的数据
文件系统: NTFS
Device size:   21.0 GB = 5120135 Blocks  <==检测文件系统数据量~
Space in use:  14.3 GB = 3502594 Blocks
Free Space:     6.6 GB = 1617541 Blocks
设备区块大小: 4096 Byte
经过:00:11:04, 剩余: 00:00:00, 完成:100.00%, 速率:  1.30GB/min
current block:    5120135, total block:    5120135, Complete: 100.00% <==备份过程展示
全部时间:00:11:04, 平均速率:   1.3GB/min, 100.00% completed!
Syncing... OK!
备份 设备 (/dev/vda2) 到 印象档 (-) 完成

[root@centos ~]# ll -h /install/client_img/
-rw-r--r--. 1 root root 4.9G 2013-04-21 12:33 windows7.img.gz   <==容量是否小一些!

[root@centos ~]# partclone.ext4 -c -s /dev/vda3 -o -  | \
> gzip > /install/client_img/linux_desktop.img.gz
# 继续备份下一个 /dev/vda3 的 Linux desktop 啰!

[root@centos ~]# cp /boot/grub/menu.lst /install/client_img/
# 同时备份其他系统也会更动到的开机菜单的部分即可!

需要注意的是,partclone 支持很多的文件系统让我们选择备份,只是他并不是提供类似『 mkfs -t [文件系统类型] 』的指令模式, 而是直接制作许多指令档让我们来运行~因此,你不能使用 partclone.ntfs 来备份 Linux 系统,也不能使用 partclone.ext4 来备份 windows 系统。 所以,要操作这个动作之前,还得先要了解你的操作系统的文件系统类型才行哩!

另外,partclone 本身并不提供压缩功能,所以,你必须要通过数据流重导向的方式,将数据丢到屏幕中,再交给 gzip 进行压缩~ 所以才会有上面的范例中,那么复杂的指令输入情况!还原也一样,先必须要通过 gzip 解压缩后,才能够交给 partclone 来还原! 做完这些动作后,我们的 Demo 机就可以功成身退了!

  • Client 端直接还原来自 Server 端的镜像档数据:

与备份一样,还原也是很简单的!只是,你得要留意的是,必须要先运行磁盘分割,分割完毕之后,才能够依据镜像档来复原。 分区的容量要不要一模一样大呢?其实,只要比镜像档内的分割参数要大就好了。举例来说,我们刚刚备份的 windows 7 里面的 Device size 显示为 21GB, 那么你预计要将这个备份数据复原的分区,就要比这个值大!否则就会出现还原失败的情况。由于每颗硬盘的容量都不一样大, 因此,你得要先在新机器上面做好分割后,才能够复原。

好,假设你已经使用之前做好的 kickstart 在另一部新机器上安装好了第一套 Linux 了,请进入该系统,然后一步一步来处理另外两个 Windows/Linux 操作系统的复原吧!(我这里假设你已经安装好了 partclone 了喔!不再重复 yum 阶段!)

# 1. 先观察分割表,之后依据 Demo 机的分割表来进行本机分割吧!
[root@centos ~]# parted /dev/vda unit MB print
Model: Virtio Block Device (virtblk)
磁盘 /dev/vda:31527MB
磁区大小 (逻辑/物理):512B/512B
分割区:msdos

编号  起始点  结束点  大小    类型     文件系统  旗标
 1    1.05MB  3147MB  3146MB  primary  ext4      启动
# 目前仅有自己的分割,没有底下两个额外的 Windows/Linux 分割!

[root@centos ~]# parted /dev/vda mkpart primary NTFS 3147MB 24120MB
[root@centos ~]# parted /dev/vda mkpart primary ext2 24120MB 31427MB
[root@centos ~]# parted /dev/vda unit MB print
编号  起始点   结束点   大小     类型     文件系统  旗标
 1    1.05MB   3147MB   3146MB   primary  ext4      启动  <==启动的位置不对
 2    3147MB   24120MB  20974MB  primary  NTFS
 3    24120MB  31427MB  7306MB   primary  ext4
# 利用本章制作的 Demo 机器之前的分割表来重复一次!因为鸟哥的机器一模一样,
# 所以这里暂时跟原有的 Demo 机的分割参数一个模样喔!

[root@centos ~]# parted /dev/vda set 2 boot on
[root@centos ~]# parted /dev/vda unit MB print
编号  起始点   结束点   大小     类型     文件系统  旗标
 1    1.05MB   3147MB   3146MB   primary  ext4
 2    3147MB   24120MB  20974MB  primary  NTFS      启动  <==OK!正确了!
 3    24120MB  31427MB  7306MB   primary  ext4

[root@centos ~]# reboot
# 重新开机让 partition 生效,然后才能继续后续的处理流程!

# 2. 开始复原系统
[root@centos ~]# mkdir -p /install/client_img
[root@centos ~]# mount -t nfs 192.168.42.254:/install/client_img /install/client_img
[root@centos ~]# gzip -d /install/client_img/windows7.img.gz -c | \
> partclone.ntfs -r -s - -o /dev/vda2
开始还原 印象档 (-) 到 设备 (/dev/vda2)
Reading Super Block
Calculating bitmap... Please wait... done!
文件系统: NTFS
Device size:   21.0 GB = 5120135 Blocks
Space in use:  14.3 GB = 3502594 Blocks
Free Space:     6.6 GB = 1617541 Blocks
设备区块大小: 4096 Byte
经过:00:03:46, 剩余: 00:00:00, 完成:100.00%, 速率:  3.81GB/min
current block:    5120135, total block:    5120135, Complete: 100.00%
全部时间:00:03:46, 平均速率:   3.8GB/min, 100.00% completed!
Syncing... OK!
还原 印象档 (-) 到 设备 (/dev/vda2) 完成
Cloned successfully.
# 从解压缩的数据中读取 partclone 镜像档,并将之复原到 /dev/vda2 !无须格式化!

[root@centos ~]# gzip -d /install/client_img/linux_desktop.img.gz -c | \
> partclone.ext4 -r -s - -o /dev/vda3

# 3. 开始处理 grub 菜单内容
[root@centos ~]# cp /install/client_img/menu.lst /boot/grub/menu.lst

# 4. 处理弹性缩放文件系统的动作: (optional)
[root@centos ~]# partclone.ntfsfixboot -w /dev/vda2
[root@centos ~]# ntfsresize /dev/vda2
[root@centos ~]# resize2fs /dev/vda3
# partclone.ntfsfixboot 可以修复 NTFS 文件系统开机磁区可能会出现的错误;
# ntfsresize 可以让该文件系统放大到该设备最大可用容量!(但是 windows 开机会要求磁盘检查)
# resize2fs  则是弹性处理 ext4 的文件系统啰!

一般来说,备份会花比较多时间,还原的速度比较快!所以,同样是针对 windows7 来比较,备份需要花去我们 11 分钟的时间, 还原仅需一半的时间即可处理完毕!相当有趣吧!还不需要预先格式化呢!还不快点来学习 partclone 吗?! ^_^

接下来,就请您在这部新机器上面重新开机,看看你的开机菜单有没有出现三个,并且尝试登录其他两个操作系统试看看啰!

Tips 鸟哥 再次强调,由于 Windows 7 会在开机的时候判断你的机器硬件设备有没有改变过,因此,很有可能在你下在使用新的用户端电脑进入 windows 7 时, 它会要求你得要放入原版光盘来进行『修复』的动作!如果出现这个问题,且使用本章 Demo 机制作的方式中的 bcdedit 指令还是没有办法处理成功时, 那只能拿出原版的 windows 7 DVD 来一步一步进行修复的动作啰!

3.3 通过 kickstart 完整复原整个系统

想想看,我们在完成了 kickstart 以及 Demo 机的安装之后,在其他用户端上面做了什么事?大概只有这些:

  • 以 kickstart 的网络安装方法安装好第一套管理 Linux ;
  • 进入该管理 Linux 系统,进行 parted 的磁盘分割;
  • 分割完毕并重新开机之后,安装好 partclone 等软件,并挂载来自 NFS server 的目录;
  • 将来自 NFS server 的映像档 partclone 到本机的 /dev/vda2, /dev/vda3 中;
  • 处理开机菜单等事宜

既然只进行这些动作而已,那为何不能将这些动作写入 kickstart 设置档中呢?恩!你问了一个好问题!我们当然可以将这些动作写入 kickstart 设置档当中的 %post 之后,这样系统就能够一键安装了!开心得不得了吗?呵呵!那就让我们来玩玩看,试看看能不能这样做吧!

# 先在 PXE server 上面进行改写 kickstart 设置档的动作啊!
[root@centos ~]# cd /install/nfs_share/kickstart
[root@centos kickstart]# cp pcroom_raw.ks pcroom_one_touch.ks
[root@centos kickstart]# vim pcroom_one_touch.ks
....(前面省略)....
repo --name="DRBL" --baseurl=http://free.nchc.org.tw/drbl-core/x86_64/RPMS.drbl-stable/ --cost=200
# 加入了 DRBL 的 yum 软件仓储!

%packages
....(中间省略)....
partclone
ntfsprogs
# 加入了 DRBL 的 partclone, ntfsprogs 等软件的自动安装!

%post
#!/bin/sh
....(中间省略)....
chown root.root /root/.ssh/authorized_keys

parted /dev/vda mkpart primary NTFS 3147MB 24120MB
parted /dev/vda mkpart primary ext2 24120MB 31427MB
parted /dev/vda set 2 boot on
echo "
#!/bin/bash
echo 'Prepare to mount NFS server'
mkdir -p /install/client_img
mount -t nfs 192.168.42.254:/install/client_img /install/client_img
echo 'Restore windows7'
gzip -d /install/client_img/windows7.img.gz -c | partclone.ntfs -r -s - -o /dev/vda2
echo 'Restore Linux Desktop'
gzip -d /install/client_img/linux_desktop.img.gz -c | partclone.ext4 -r -s - -o /dev/vda3
echo 'Restore boot menu'
cp /install/client_img/menu.lst /boot/grub/menu.lst
echo 'remove partclone procedure'
sed -i 's/^.*sh \/root\/partclone.sh.*$//g' /etc/rc.d/rc.local
rm /root/partclone.sh
sleep 10s
poweroff
" > /root/partclone.sh
echo "sh /root/partclone.sh" >> /etc/rc.d/rc.local
# 上面就是在进行各项复原的动作!

# 2. 再增加一个 PXE 的菜单,可以一键安装到底!
[root@centos ~]# vim /install/tftpboot/pxelinux.cfg/default
....(前面省略)....
LABEL kickstart2
  MENU LABEL Boot from PXE Server for AUTO Install CentOS 6.4 One touch
  kernel ./kernel/centos6.4/vmlinuz
  append initrd=./kernel/centos6.4/initrd.img ks=nfs:192.168.42.254:/install/nfs_share/kickstart/pcroom_one_touch.ks

上述的动作中,最重要的当然就是 kickstart 的修改了!因为新的 CentOS 6.x 以后,不知道是加了什么系统保护的机制,因此 partprobe 这个强迫内核重新抓取分割表的功能遗失了~ 所以,我们在 %post 当中进行过分割,但是却无法顺利的使用该分割来工作。所以,只好加上一些脚本在 Linux 的启动进程中,让 kickstart 安装好 Linux 之后, 立刻自动的去处理第一支脚本程序 (/root/partclone.sh),处理完毕后自我删除且除掉 /etc/rc.d/rc.local 的脚本指向即可。

在上面的 kickstart 文件中,鸟哥强迫让系统安装完毕后自动关机 (poweroff),如果你有其他特殊的需求,想要在安装完毕后继续留在原 Linux 控制系统中工作时, 那可以将 poweroff 与 sleep 10s 删除,这样就不会让你的系统安装完毕后自动关机啰!接下来打开你的用户端电脑,用网络开机,选择最后一个 PXE 菜单, 你不用再理它!它会自动安装、还原之后,自己关机!开心的不得了啊! ^_^

3.4 以 multicast 实作完整复原

完成上述的功能之后,你的用户端只要使用网络开机,然后点击 PXE 的最后一个菜单,那就可以安心的去睡觉了!反正系统会自动关机嘛! 只是,如果是很急的情况底下,你想要复原全部电脑教室的 60 部主机时,那就有点头疼了~因为全部的系统同时去抓来自 Server 的 NFS 提供的映像档时, 太多用户端了!会吃掉很多带宽,所以速度快不了~那怎办?

想像一个情况,我能不能只从 Server 抓一次数据,然后将数据同时广播给所有用户,这样不就能够节省好多带宽了吗?因为只送出一次数据而已嘛! 不像每部主机单独来的时候,都得要再次的将数据送出。可以达到吗?嘿嘿!是可以的,可以通过所谓的『 Multicast (群播)』的功能喔!(注5)

所谓的 multicast 主要是通过 switch 的 MAC 学习功能,然后将来自 Server 的一份数据,通过 switch 的 multicast 支持,将这份数据主动拷贝成多份, 然后丢给需要的用户端电脑。因为需要 switch 的协助,所以,你的 switch 必须要支持 multicast 的相关能力才行。不过,由于某些 switch/hub 可能没有支持 multicast, 因此,后来该项功能也可以使用 broadcast (广播) 传给所有人,而仅有需要的用户会抓下来。

会不会很难啊这个功能?其实不会呢!我们可以直接通过 udpcast (注5) 这套软件来实施即可!这套软件还刚刚好 DRBL 的 yum 软件仓储有提供呢! 所以,直接使用 yum 来安装即可。安装好了之后,每部系统都要打开在 Linux 控制系统中,然后这样处理即可:

# 1. 先安装 udpcast 这套软件,记得,要在 yum 里头加入 DRBL 的官网才行,Server/client 都要装
[root@centos ~]# yum install udpcast

# 2. 不论 switch 有没有支持,我们使用 broadcast 即可!这是在 server 端下达的指令:
[root@centos ~]# udp-sender    --interface eth1 \
> -f /install/client_img/linux_desktop.img.gz  \
> --min-receivers 3  \
> --nokbd --broadcast --fec 8x8/128
stripes=8 redund=8 stripesize=128
Udp-sender 20110710
Using full duplex mode
Using mcast address 232.168.42.254
UDP sender for /install/client_img/linux_desktop.img.gz at 192.168.42.254 on eth1
Broadcasting control to 192.168.42.255
New connection from 192.168.42.3  (#0) 00000009  <==有顺利接上用户端,就会显示!
New connection from 192.168.42.4  (#1) 00000009
New connection from 192.168.42.5  (#2) 00000009
# 请注意,缺省 udpcast 会用到 9000~9001 两个 udp 的端口口,所以要确认你的 server 已放行~
# 同时检查一下用户端!用户端也要放行才可以呦! (如果有参考第一章与本章就 OK!)

# 3. 在用户端下达此一指令来接收并且还原系统!
[root@centos ~]# udp-receiver --nokbd | \
> gzip -d -c | partclone.ext4 -r -s - -o /dev/vda3
Udp-receiver 20110710
UDP receiver for (stdout) at 192.168.42.3 on eth0
received message, cap=00000009
Connected as #0 to 192.168.42.254       <==真的连接上了呦!
Listening to multicast on 232.168.42.254
Partclone v0.2.59 http://partclone.org  <==收下文件立刻解压缩还原!
开始还原 印象档 (-) 到 设备 (/dev/vda3)
Calculating bitmap... Please wait... done!
文件系统: EXTFS
Device size:    7.3 GB = 1783808 Blocks
Space in use:   3.7 GB = 892278 Blocks
Free Space:     3.7 GB = 891530 Blocks
设备区块大小: 4096 Byte
经过:00:01:38, 剩余: 00:00:00, 完成:100.00%, 速率:  2.24GB/min
current block:    1783808, total block:    1783808, Complete: 100.00%
全部时间:00:01:38, 平均速率:   2.2GB/min, 100.00% completed!
Syncing... OK!
还原 印象档 (-) 到 设备 (/dev/vda3) 完成
Cloned successfully.
# 因为 udpcast 仅发送文件而已,所以用户端接收文件,还得解压缩与还原才行!

你会发现,全部的用户端系统是同步在进行还原!所有的数据会一模一样!鸟哥上面仅使用到 3 部系统来示范而已,而且使用较简便的 Linux desktop 示范而已, 真的使用到整间电脑教室时,那种时间的节省,才教你开心呐!!

Tips 鸟哥 说真的,Multicast 真的很好用!大量批量还原时,可以同时还原,还原的速度会节省非常非常多!只是,鸟哥没有很研究 udp-sender 的参数,所以时间参数恐怕没有设置的很好, 因为,每次大量复原超过 30 部以上的用户端系统时,很容易因为一台用户端电脑的网络问题,导致整批 multicast 的失败!要注意,这个 multicast 是全系统同步, 有任何一部失败时,会导致整个还原失败而得重来一次~所以,练习的时候,可以先少台主机测试,搞定了之后,再来玩大批还原吧!

3.5 其他注意事项与高端使用说明:

或许你有发现一件事,既然我们用了网络 PXE 的菜单,这已经是第一层菜单,然后,还得要通过第二层的本机开机菜单,才能够进入我们所需要的环境中。 两层菜单ㄟ!好麻烦~有没有可能直接在 PXE 里面就作好了直接进入到某个特定操作系统的菜单?这样就可以直接通过第一层 PXE 菜单即可,不用转来转去啦! 可以做到吗?是可以的!只是,还得要额外提供一个 chain.c32 的菜单转递模块才行。

现在我们上面这个示范机里面总共有:

  • Windows 7
  • Linux Desktop
  • Linux Management system

这三个菜单我们将它加入于 PXE 的 default 文件中,然后直接通过 chain.c32 去转递开机管理功能,这样设置一下,看看能不能生效吧!

# 1. 先将 chain.c32 放置于 tftp 的根目录中:
[root@centos ~]# cp /usr/share/syslinux/chain.c32 /install/tftpboot/
[root@centos ~]# vim /install/tftpboot/pxelinux.cfg/default
....(前面省略)....
LABEL local
  MENU LABEL Boot from local drive
  MENU DEFAULT
  localboot 0

LABEL local1
  MENU LABEL Boot from local drive to Windows 7
  kernel chain.c32  <==使用 chain.c32 来作为开机管理程序
  append hd0 2      <==使用第一颗硬盘的第二个分区开机!

LABEL local2
  MENU LABEL Boot from local drive to Linux Desktop
  kernel chain.c32
  append hd0 3

LABEL local3
  MENU LABEL Boot from local drive to Linux Management
  kernel chain.c32
  append hd0 1

LABEL network1
....(后面省略)....

上述的设置中,比较需要注意的是『 append hd0 2 』这个设置值,这个设置值的意思是,使用第一颗 (从 0 开始编号) 的第 2 个分区 (从 1 开始编号, hd0 2 组合起来,就是 Linux 的 /dev/sda2 或本案例中的 /dev/vda2 的意思) 来进行开机。如此一来,你就会多出三个菜单,所以再次重新开机之后,你就会看到如下的画面:

本章最终的菜单情况
图 3.5-1、本章最终的 PxE 菜单情况

这样就搞定了单层菜单!太棒了吧!呵呵!

  • 为何需要安装第一套 Linux 管理系统?

既然现在这么简单的通过 PXE 可以制作菜单,也可以直接通过 kickstart 来进行批量的每部主机个别的还原,那为何还需要安装第一套 Linux 管理系统呢? 不知道你有没有过这样的疑问呢?这是因为要预防万一啦!多一个 Linux 管理系统有许多的好处,包括这部系统会具有比较大的自由度!要管理系统比较安全, 此外,最大的重点是,你的这部用户端电脑可以不必在此教室内使用,方便移动机器!

会这么做的原因是,由于电脑教室所在的环境中,常常会因为某些不明的原因导致跳电,这一跳电,很多『机会』会让 Server 就此挂点! 而如果单纯使用 PXE 而没有用户端自己的菜单管理时,恐怕到时候某些特定的操作系统会无法进入,这会对上课环境造成些许的困扰啦!

此外,以鸟哥所在的信息传播系而言,我们系上在毕业专题展时,常常需要将教室的个人电脑带往展场去展出。如果没有菜单模式时,比较不能符合专题组的需求 (每个专题组要使用的操作系统都不相同)。所以,在较复杂的环境,而且需要有移机的需求时,安装一套 Linux 管理系统,对我们后续的处理还是有很多好处的! 因此,如果你也有相关的需求,那鸟哥真的强烈的建议你要有这个 Linux 管理系统的安装比较好喔!

4. 参考数据与延伸阅读


修改历史:
2013/04/01:开始来撰写有关安装服务器的总总吧!!
2013/04/24:经过多次测试,找到相关的数据,文内的各个语法与脚本都测试妥当!只是与前一篇有相关性~要注意使用!

2013/04/24以来统计人数
计数器
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计