基于网络的Linux自动化安装

时间:2021-03-23 05:59:41

转自:http://www.itdaan.com/imgs/2/2/5/9/77/f5371cc4ff98652363af803f4509cb41.jpe

一、前言

安装系统经常用到的方式是通过系统光盘进行安装,然而当所要安装的服务器或者PC机没有光驱(或者光驱损坏)的情况,往往会选择通过U盘进行安装。U盘安装相比于之前的光盘安装,在安装介质上有了很大的提高,这使得安装系统变得更加的方便,但是U盘安装方式并没有将操作人员从繁琐、重复的安装操作解放出来。本文介绍了一种局域网中通过网络进行系统自动化安装的方法,该方法不仅安装过程更加简单,大大减少了工作人员的手工操作,而且能够同时部署多种系统,非常方便的进行选择和安装。

本文所提到的基于网络的系统自动化安装方案主要用到了一下的几个协议和技术:

    -- PXE(Preboot Execution Environment / 远程引导技术)

    -- DHCP(Dynamic Host Configuration Protocol / 动态主机配置协议)

    -- TFTP(Trivial File Transfer Protocol / 普通文件传输协议)

    -- NFS(Network File System / 网络文件系统)

二、原理

基于网络进行系统安装的原理简单的说就是:待安装系统的客户机通过支持PXE协议的网卡在开机时想网络发送DHCP消息来获取自身的IP信息,DHCP服务器返回客户机的IP以及TFTP信息和启动文件的地址等信息,之后客户机通过启动文件开始系统的下载和安装(安装的具体操作已经提前写入了ks.conf文件,它与安装文件放在一起),可以用下图来表示具体的安装流程:

基于网络的Linux自动化安装

上图告诉我们在安装过程中需要一个DHCP服务器、一个启动服务器和一个安装服务器,三个服务既可以部署在多台机器上也可以部署在同一台机器上(后面将要介绍的方案就把三者集中在了一台普通的服务器内),详细的安装流程介绍如下:

第1步:待安装机器向DHCP服务器发送请求

        将支持PXE的网络接口卡(NIC)的客户端的BIOS设置成为网络启动,通过PXE BootROM(自启动芯片)会以UDP(简单用户数据报协议)发送一个广播请求,向网络中的DHCP服务器索取IP地址等信息。

第2步:DHCP服务器提供IP、TFTP等信息

        DHCP服务器收到客户端的请求,验证是否来至合法的PXE Client的请求,验证通过它将给客户端一个提供响应,这个提供响应中包含了为客户端分配的IP地址、pxelinux启动程序(TFTP)位置,以及配置文件所在位置。

第3步:待安装机器向启动服务器请求下载启动文件

        待安装机器送到服务器的"回应"之后,会回应一个帧,以请求传送启动所需要的文件,这些文件包括了:pxelinux.0、vmlinuz、initrd.img、pxelinux.cfg/default、pxelinux.cfg/list。

第4步:启动服务器回复并传送启动文件

        当服务器收到客户端的请求后,他们之间之后将有更多的信息在客户端与服务器之间作应答用以决定启动参数。BootROM  TFTP 通讯协议从Boot Server下载启动安装程序所必须的文件(pxelinux.0pxelinux.cfg/default)。default文件下载完成后,系统会下载并读取pxelinux.cfg/list文件,操作人员需要安装list中列出的系统进行选择,启动对应选择的Linux系统并安装程序的引导内核。

第5步:待安装机器向安装服务器请求安装配置文件(ks.conf文件)

        客户端通过pxelinux.cfg/default文件成功的引导Linux安装内核后,安装程序首先必须确定你通过什么安装介质来安装linux,如果是通过网络安装(NFS, FTP, HTTP),则会在这个时候初始化网络,并定位安装源位置,也就是系统的安装文件和配置文件,因而这里需要获取到相应资源的IP和路径等信息。接着客户机会读取该文件中指定的自动应答文件ks.cfg所在位置,根据该位置请求下载该文件。

第6步:待安装机器下载相应文件并自动安装系统(实际上根据ks.conf文件的内容,操作人员需要做简单的操作)

        将ks.cfg文件下载回来后,并按照该文件的配置请求下载安装过程需要的软件包。安装服务器和客户端建立连接后,将开始传输软件包,客户端将开始安装操作系统。安装完成后,将提示重新引导计算机。这个时候注意,在重新引导的过程中需要将BIOS修改回从硬盘启动。

三、方案简介

1、前提条件

    -- 待安装机器必须支持PXE启动

    -- 待安装机器、DHCP服务器、启动服务器和安装服务器在同一个局域网中

    -- 要安装的系统需要有对pxeboot的支持

2、方案介绍

将要安装的系统:

        CentOS6.3

DHCP服务器、启动服务器和安装服务器所在机器信息:

        IP:10.15.62.10

        操作系统:CentOS6.2

待安装系统机器的信息:

        MAC:1c:c1:da:ad:ac:62

        IP:10.15.62.20

四、具体操作步骤

步骤1:DHCP服务的配置

    1)安装DHCP服务器包

[plain]   view plain copy print ?
  1. #yum -y install dhcp*  
通过这个命令将会下载和安装dhcp相关的软件,当然这是在机器能够联网的前提下,如果未联网这需要提前下载DHCP相应的安装包,然后再机器上进行相应的安装,具体的安装过程请根据安装包的格式具体操作。

    2)DHCP服务的配置

DHCP的配置文件位于:/etc/dhcp/dhcpd.conf (DHCP的配置文件根据版本的不同有所区别,也有可能是在/etc/dhcpd.conf或者其他相关文件中)

对于该文件,我们主要在其默认的配置的基础上做简单的配置即可,主要有两个方面需要注意:

         -- rang对应的IP的范围,这个需要修改成需要安装的机器的IP或者是IP段

         -- host部分,该部分将ip与相应的mac地址对应起来,待安装机器正是通过host来获取自己的ip地址的,并且该部分提供了tftp的相应信息

具体的配置如下:

[plain]   view plain copy print ?
  1. #  
  2. # DHCP Server Configuration file.  
  3. #   see /usr/share/doc/dhcp*/dhcpd.conf.sample  
  4. #   see 'man 5 dhcpd.conf'  
  5. #  
  6.   
  7. ddns-update-style interim;  
  8. ignore client-updates;  
  9. allow booting;  
  10. allow bootp;  
  11. option space PXE;  
  12. option PXE.mtftp-ip               code 1 = ip-address;  
  13. option PXE.mtftp-cport            code 2 = unsigned integer 16;  
  14. option PXE.mtftp-sport            code 3 = unsigned integer 16;  
  15. option PXE.mtftp-tmout            code 4 = unsigned integer 8;  
  16. option PXE.mtftp-delay            code 5 = unsigned integer 8;  
  17. option PXE.discovery-control      code 6 = unsigned integer 8;  
  18. option PXE.discovery-mcast-addr   code 7 = ip-address;  
  19.   
  20. subnet 10.15.62.0 netmask 255.255.255.0 {  
  21.     # --- default gateway  
  22.     option routers             10.15.62.1;  
  23.     option subnet-mask         255.255.255.0;  
  24.     option nis-domain          "domain.org";  
  25.     option domain-name         "domain.org";  
  26.     option domain-name-servers 8.8.8.8;  
  27.     option time-offset         -18000; # Eastern Standard Time  
  28.       
  29.     range dynamic-bootp 10.15.62.2 10.15.62.100; # DHCP服务器的作用范围  
  30.     default-lease-time 21600;  
  31.     max-lease-time 43200;  
  32.       
  33.     group {  
  34.         filename "pxelinux.0";                   # TFTP信息  
  35.         host ns {  
  36.            next-server 10.15.62.10;              # TFTP服务器的IP(这里就是本机的IP)  
  37.            hardware ethernet 1c:c1:de:ed:ac:62;  # 待安装机器的MAC地址  
  38.            fixed-address 10.15.62.20;            # 待安装机器的IP地址  
  39.         }  
  40.     }  
  41. }  

    3)DHCP服务的启动

启动命令如下:

[plain]   view plain copy print ?
  1. #service dhcpd start  
或者是:
[plain]   view plain copy print ?
  1. #service dhcpd restart  

步骤2:启动服务器的配置

启动服务的配置主要是TFTP服务器的配置和简单的文件的拷贝工作,具体的过程如下:

    1) TFTP服务器的安装

在联网的情况下可用下面的命令安装:

[plain]   view plain copy print ?
  1. #yum -y install tftp*  

    2) TFTP服务器的配置

TFTP的配置文件位于:/etc/xinetd.d/tftp

内容如下:

[plain]   view plain copy print ?
  1. # default: off  
  2. # description: The tftp server serves files using the trivial file transfer \  
  3. #       protocol.  The tftp protocol is often used to boot diskless \  
  4. #       workstations, download configuration files to network-aware printers, \  
  5. #       and to start the installation process for some operating systems.  
  6. service tftp  
  7. {  
  8.         socket_type             = dgram  
  9.         protocol                = udp  
  10.         wait                    = yes  
  11.         user                    = root  
  12.         server                  = /usr/sbin/in.tftpd  
  13.         server_args             = -s /tftpboot -c  
  14.         disable                 = no  
  15.         per_source              = 11  
  16.         cps                     = 100 2  
  17.         flags                   = IPv4  
  18. }  
这里要注意的是,disable对应的项要变为no,这样连接才能够顺利进行,server_args对应的配置告诉我们,tftp的根目录为/tftpboot,接下来的tftp的相应的配置我们都将在给目录下进行。

    3) 启动镜像文件pxelinux.0的准备和配置

要想获得这个文件,我们需要先安装syslinux这个程序,安装命令为:

[plain]   view plain copy print ?
  1. #yum -y install syslinux  

安装完成后,我们将在/usr/share/syslinux/中能够找到pxelinux.0这个文件,我们只需要将这个文件拷贝到tftp的根目录tftpboot中即可。

接下来,我们将要对pxelinux.0进行相应的配置,首先在tftp的根目录/tftpboot中建立一个文件夹/pxelinux.cfg,并在该文件夹中建立两个文件,分别为:default和list,其内容分别为:

default文件:

[plain]   view plain copy print ?
  1. default 0  
  2. prompt 1  
  3. timeout 600  
  4.   
  5. display pxelinux.cfg/list  
  6.   
  7. label 0  
  8.   kernel vmlinuz-centos-6.2-x86_64-bin-DVD  
  9.   append ks=nfs:10.15.62.78:/netinstall/ks/ks.cfg initrd=initrd-centos-6.3-x86_64-bin-DVD.img  
  10.   ramdisk_size=8192  
  11.   
  12. label 1  
  13.   kernel vmlinuz-centos-6.3-x86_64-bin-DVD  
  14.   append ks=nfs:10.15.62.78:/netinstall/ks/ks.cfg initrd=initrd-centos-6.2-x86_64-bin-DVD.img  
  15.   ramdisk_size=8192  

list文件:

[plain]   view plain copy print ?
  1. Choose one of the following Linux distributions for your installation:  
  2. Num     Name         Distribution       Arch.   Installation media  
  3. -------------------------------------------------------------------------  
  4. 0)   Centos-6.2      Centos-6.2-x86_64  x86_64  nfs://10.15.62.10/netinstall/CentOS-6.3-x86_64-bin-DVD.iso  
  5. 1)   Centos-6.3      Centos-6.3-x86_64  x86_64  nfs://10.15.62.10/netinstall/CentOS-6.2-x86_64-bin-DVD.iso  

启动镜像pxelinux.0文件在执行过程中,会读取配置文件以确定它应该载入什么Linux内核文件来运行。所有的配置文件都放在启动服务器的/tftpboot/pxelinux.cfg/目录下。pxelinux.0根据一定的规则来搜索合适的配置文件名。举例来说,对于前面为待安装机器分配的IP地址192.168.138.30(十六进制表示为C0A88A1E),pxelinux.0会按如下次序搜索配置文件:

[plain]   view plain copy print ?
  1. C0A88A1E > C0A88A1 > … > C0 > C > default  
就是说,如果C0A88A1E文件存在,它就是pxelinux.0将载入的配置文件。否则,继续往下找。如果C0A88A1文件存在,它就是pxelinux.0将载入的配置文件。如果前面的以C开头的文件都不存在,那么pxelinux.0将试图从文件default中读取配置。对于一台需要支持很多安装机器的安装服务器来说,将配置写在与IP地址对应的文件里很不灵活。把所有配置都集中在default文件中是个不错的主意,可以减轻配置文件维护负担。

    4) initrd.img和vmlinuz文件的准备

在待安装系统的iso包找到这两个文件,注意:这里要得到的这两个文件应该是下面路径中的,不应选择CentOS-6.3-x86_64-bin-DVD\isolinux文件下的这两个文件,当然,这也与要安装的系统有关,请在安装时注意这一点。

[plain]   view plain copy print ?
  1. 正确的文件路径:CentOS-6.3-x86_64-bin-DVD\images\pxeboot  

    5) TFTP服务的启动

[plain]   view plain copy print ?
  1. #service xinetd start  
或者是
[plain]   view plain copy print ?
  1. #service xinetd restart  

步骤3:安装服务器的配置

    1) NFS服务器的安装

在联网的情况下可简单的用一下的命令安装:

[plain]   view plain copy print ?
  1. #yum -y install nfs*  

    2) NFS服务器的配置

NFS服务器的配置文件位于/etc/exports文件中,我们将其配置为:

[plain]   view plain copy print ?
  1. /netinstall *(ro,sync)  

这里我们确定了安装文件的位置为/netinstall,接下来安装文件以及ks.conf都将存放在这个文件夹中。

    3) ISO文件的处理和拷贝

我们将CentOS-6.3-x86_64-bin-DVD.iso进行提取,然后将得到的文件全部拷贝到/netinstall中去,这样在/netinstall中文件目录如下所示:

基于网络的Linux自动化安装基于网络的Linux自动化安装

    4) ks.conf文件的准备

上图中我们已经看到了存在一个ks的文件夹,这个文件夹是在这一步创建的,里面包含一个ks.conf的文件,该文件定义了系统安装的一些选项,在我们的安装过程中该文件的内容如下所示:

[plain]   view plain copy print ?
  1. # Kickstart file automatically generated by anaconda.  
  2.   
  3. #version=DEVEL  
  4. install  
  5. nfs --server=10.15.62.10 --dir=/netinstall  
  6. lang en_US.UTF-8  
  7. keyboard us  
  8. network --onboot no --device eth0 --noipv4 --noipv6  
  9. rootpw  --iscrypted $6$7FExARVldfT7vBrM$ZdtA35JvoA4.R6SzBaOSw5YwrDw8XgNxMjaEaY  
  10. firewall --service=ssh  
  11. authconfig --enableshadow --passalgo=sha512  
  12. selinux --enforcing  
  13. timezone --utc Asia/Shanghai  
  14. bootloader --location=mbr --driveorder=sda --append=" rhgb crashkernel=auto quiet"  
  15.   
  16. # The following is the partition information you requested  
  17. # Note that any partitions you deleted are not expressed  
  18. # here so unless you clear all partitions first, this is  
  19. # not guaranteed to work  
  20. #clearpart --all --drives=sda  
  21.   
  22. #part /boot --fstype=ext4 --size=500  
  23. #part pv.008002 --grow --size=1  
  24.   
  25. #volgroup vg_centos --pesize=4096 pv.008002  
  26. #logvol /home --fstype=ext4 --name=lv_home --vgname=vg_centos --grow --size=100  
  27. #logvol / --fstype=ext4 --name=lv_root --vgname=vg_centos --grow --size=1024 --maxsize=51200  
  28. #logvol swap --name=lv_swap --vgname=vg_centos --grow --size=1024 --maxsize=5920  
  29.   
  30. %packages  
  31. @base  
  32. @client-mgmt-tools  
  33. @console-internet  
  34. @core  
  35. @debugging  
  36. @directory-client  
  37. @java-platform  
  38. @mysql-client  
  39. @network-file-system-client  
  40. @php  
  41. @performance  
  42. @perl-runtime  
  43. @postgresql-client  
  44. @server-platform  
  45. @server-policy  
  46. @turbogears  
  47. @web-server  
  48. @web-servlet  
  49. pax  
  50. oddjob  
  51. sgpio  
  52. certmonger  
  53. pam_krb5  
  54. krb5-workstation  
  55. perl-DBD-SQLite  
  56. certmonger  
  57. perl-CGI  
  58. %end  
ks.conf文件可以根据用户的实际的需求做相应的更改,为了方便用户获取这个文件,我们推荐使用kickstart这个软件来模拟安装过程从而更加准确的得到它,其实在CentOS的安装完成也会得到这样的一个文件,也就是说,我们也可以找一个安装了CentOS的机器在它的/root文件中我们将看到一个anaconda-ks.cfg文件,可以通过修改这个文件来得到ks.conf。

kickstart的安装和使用非常简单,但是需要图形界面来进行模拟,所以建议具有图形显示功能的系统安装并进行相应的模拟操作,安装命令如下:

[plain]   view plain copy print ?
  1. #yum install system-config-kickstart  
具体的模拟操作的过程,请查看相应的资料。

    5) NFS服务的启动和测试

启动命令:

[plain]   view plain copy print ?
  1. #service nfs start  
或者是
[plain]   view plain copy print ?
  1. #service nfs restart  
我们可以通过以下的方法进行测试:
[plain]   view plain copy print ?
  1. #showmount -e 10.15.62.10 (命令)  
  2. Export list for 10.15.62.10:  
  3. /netinstall *  
  4. #exportfs -uv (命令)  
  5. /netinstall    <world>(ro,wdelay,root_squash,no_subtree_check)  

步骤4:系统安装

系统的安装过程主要是在系统开机时,根据提示选择通过网络进行安装,然后根据提示做简单的操作即可完成,这一点我们推荐查看参考资料中三篇文章的内容。

五、遇到的问题

以下列举出了在安装系统过程中出现的一些问题,仅供参考。

1、TFTP配置问题

报错信息:

[plain]   view plain copy print ?
  1. TFTP prefix:  
  2. Unable to locate configuration file.  

解决方法:

这个错误出现的原因是我们的/tftpboot文件里面的pxelinux.cfg文件夹下的文件设置有问题。报这样的错误还有一种可能是TFTP的配置文件的问题,因此应认真核对。

2、NFS无法连接问题

报错信息:

[plain]   view plain copy print ?
  1. NFS Name:10.15.62.10  
  2. CentOS Dir:/netinstall/images/install.img  
  3. Mount Options:ro  
  4.   
  5. That directory could bot be mounted from the server.  

解决方法:

之前看到很多网上关于通过网络安装Linux系统的文章,一般都是直接将iso文件拷贝到netinstall里面就可以了,但是实践证明我们需要将iso文件提取之后再放入,这个文件的出现就是因为iso没有进行提取。

3、安装文件中repo文件的问题

报错信息:

[plain]   view plain copy print ?
  1. Unable to read package metadata, This may be due ro a missing repodata directory.  
  2. Please ensure that your install tree has bee correctly generated.  

解决方法:

这个问题主要有两个原因:第一个是repodata那个文件里面的文件在CentOS6.2中提取时出现了问题,文件的后缀名不见了,可以自行添加上用户名即可,这个事CentOS6.2的一个Bug,6.3版本不存在这个问题;第二个是ks.cfg文件的问题,在该文件中有如下的一行:

[plain]   view plain copy print ?
  1. #repo --name="CentOS"  --baseurl=cdrom:sr0 --cost=100  

其中,baseurl应该设定为repodata的地址,我们在上面的操作中直接删除了这一行,也可自己更具nfs的设置进行更改。

4、pxe问题

当打开待安装机器,并且选择了通过网络安装之后,报出了一下的错误:

[plain]   view plain copy print ?
  1. PXE-T00 Permission deny  
  2. PXE-E36 Error received from tftp server  
  3. PXE-MOF exiting intel pxe rom  
通过在网上查找发现这是由于SELinux没有关闭的原因,通过以下的描述关闭SELinux即可解决:

临时性关掉SElinux(重启无效):
    setenforce 0        #设置SELinux 成为permissive模式
    恢复开启SElinux时可以将这个变量设为1即可,也同样的重启后无效。
    setenforce 1        #设置SELinux 成为enforcing模式
修改配置文件(重启有效):
    vi /etc/sysconfig/selinux中
    设置参数selinux=0

六、其他

1、文中所提到的几个协议可通过一下几篇文章进行学习:

http://blog.csdn.net/andy_yf/article/details/7749246 [PXE]

http://blog.csdn.net/andy_yf/article/details/7749248 [DHCP]

http://blog.csdn.net/andy_yf/article/details/7749250 [TFTP]

http://blog.csdn.net/andy_yf/article/details/7749253 [NFS]

2、在通过该方法安装系统时,请注意要安装的系统的版本,这也有可能会出现问题。比如在本文中,之前打算安装CentOS6.2版本,但是安装完成之后总是出现一些很难解决的问题,尝试了很多次依然没有解决,所以换成了CentOS6.3,实践表明这个版本的CentOS能够正常安装和使用。

================================================

参考文献:

1. http://www.ibm.com/developerworks/cn/linux/l-autoinstl/#N100E9

2. http://houyongkai.blog.51cto.com/2256917/404775

3. http://blog.sina.com.cn/s/blog_4a8d06ce0100rpdx.html