企业计算

酸爽!我用这套无人值守安装系统瞬间搞定上百台服务器

一、前言

为啥要用无人值守安装系统?很简单的答案,就是方便日常工作。

常规装系统的办法有哪些?

  • 光盘安装系统:一个服务器DVD内置光驱百千块,百台服务器都配光驱就浪费了,因为一台服务器也就开始装系统能用的上,以后用的机会屈指可数。
  • U盘安装系统:还是同样的问题,要一台一台服务器插U盘。
  • 网络安装系统(ftp,http,nfs) :只要服务器能联网就可以装系统了,但还是需要一台台服务器去敲键盘点鼠标。

无人值守安装系统好处都有啥?

  • 对于个人:装系统大部分时间都浪费于下一步、下一步等操作,浪费了宝贵的时间。
  • 对于行业:自打若干年前Red Hat推出了Kickstart,此后我们搞服务器的运维顿觉身价倍增。不再需要刻了光盘一台一台地安装Linux,只要搞定PXE、DHCP、TFTP,还有那满屏眼花缭乱不知所云的Kickstart脚本,瞬间安装上百台服务器。

二、PXE

PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统。

在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端(客户端)基本软件设置,从而引导预先安装在服务器中的终端操作系统。

PXE可以引导多种操作系统,如:Windows95 / 98 / 2000 / windows2003 / windows2008 / winXP / win7 / win8,Linux系列系统等。

严格来说,PXE并不是一种安装方式,而是一种引导方式。进行PXE安装的必要条件是在要安装的计算机中必须包含一个PXE支持的网卡(NIC),即网卡中必须要有PXE Client。

PXE协议可以使计算机通过网络启动。此协议分为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上下载所需的文件了。

PXE工作流程

1、PXE Client向DHCP发送请求

  • 当计算机开机时第一次登录网络的时候,发现本机上没有任何IP地址设定。PXE Client会从自己的PXE网卡启动,通过PXE BootROM(自启动芯片)会以UDP(简单用户数据报协议)发送一个广播请求,源IP地址是0.0.0.0,发送DHCP discover发现信息来寻找DHCP服务器,即向目标IP地址是255.255.255.255发送特定的广播信息。
  • 网络上每一台安装了TCP/IP协议的主机都会接收到这个广播信息,但只有DHCP服务器才会做出响应。

2、DHCP服务器提供信息

  • DHCP服务器收到客户端的请求,验证是否来至合法的PXE Client的请求,验证通过它将给客户端一个“提供”响应,这个“提供”响应中包含了为客户端分配的IP地址和其他设置的DHCP offer信息。
  • DHCP offer提供信息包括pxelinux启动程序(TFTP)位置,以及PXE配置文件所在位置(该文件一般是放在一台TFTP服务器上)。

3、DHCP客户机接收IP和服务器的互动

  • DHCP客户端接受到DHCP offer提供信息之后,选择第一个接收到的提供信息,然后以广播的方式回答一个DHCP request请求信息,该信息包含向它所选定的DHCP服务器请求IP地址的内容。
  • 当DHCP服务器收到DHCP客户端回答的DHCP request请求信息之后,便向DHCP客户端发送一个包含它所提供的IP地址和其他设置的DHCP ack确认信息,告诉DHCP客户端可以使用它提供的IP地址。
  • 然后,DHCP客户机便将其TCP/IP协议与网卡绑定。
  • 另外,除了DHCP客户机选中的服务器外,其他的DHCP服务器将收回曾经提供的IP地址。这是第一次初始化网络。

4、PXE客户端请求下载启动文件

  • 客户端收到服务器的“回应”后,会回应一个帧,以请求传送启动所需文件。这些启动文件包括:pxelinux.0、pxelinux.cfg/default、vmlinuz、initrd.img等文件。

5、Boot Server响应客户端请求并传送文件

  • 当服务器收到客户端的请求后,他们之间之后将有更多的信息在客户端与服务器之间作应答,用以决定启动参数。BootROM由TFTP通讯协议从Boot Server下载启动安装程序所必须的文件(pxelinux.0、pxelinux.cfg/default)。客户端取得pxelinux.0 文件后之执行该文件,向服务器请求下载pxelinux.cfg文件。客户端pxelinux.cfg配置文件后,请求vmlinuz文件和initrd.img文件,会根据该文件中定义的引导顺序,启动Linux安装程序的引导内核。

pxeliunx.0:网络引导程序pxe文件

pxelinux.cfg/default:指定镜像的位置或ks文件位置

vmlinuz:引导内核

initrd.img:小型的linux操作系统,类似于windows的PE

6、请求下载自动应答文件

  • 客户端通过pxelinux.cfg/default文件成功的引导Linux安装内核后,安装程序首先必须确定你通 过什么安装介质来安装Linux,如果是通过网络安装(NFS, FTP, HTTP),则会在这个时候初始化网络(这是第二次初始化网络),并定位安装源位置。
  • 接着会读取default文件中指定的自动应答文件ks.cfg所在位置,根据该位置请求下载该文件。
  • PXE获取的是安装用的内核以及安装程序等,而安装程序要获取的是安装系统所需的二进制包以及配置文件PXE模块和安装程序是相对独立的,PXE的网络配置并不能传递给安装程序,从而进行两次获取IP地址过程,但IP地址在DHCP的租期内是一样的。

7、客户端安装操作系统

  • 将ks.cfg文件下载回来后,通过该文件找到OS Server,并按照该文件的配置请求下载安装过程需要的软件包。OS Server和客户端建立连接后,将开始传输软件包,客户端将开始安装操作系统。
  • 安装完成后,将提示重新引导计算机。

三、Kickstart

Kickstart工作原理

Kickstart是一种无人值守的安装方式。它的工作原理是在安装过程中记录人工干预填写的各种参数,并生成一个名为ks.cfg的文件。

如果在自动安装过程中出现要填写参数的情况,安装程序首先会去查找ks.cfg文件,如果找到合适的参数,就采用所找到的参数;如果没有找到合适的参数,便会弹出对话框让安装者手工填写。

所以,如果ks.cfg文件涵盖了安装过程中所有需要填写的参数,那么安装者完全可以只告诉安装程序从何处下载ks.cfg文件,然后就去忙自己的事情。

等安装完毕,安装程序会根据ks.cfg中的设置重启/关闭系统,并结束安装。

四、搭建PXE+Kickstart环境

安装DHCP、TFTP-Server、HTTP

  1. 安装dhcp、tftp-server、httpd
  2. [root@localhost ~]# yum install dhcp xinetd tftp-server httpd -y

tftp-server被xinted所管理,所以需要安装xinetd来管理启动tftp-server

DHCP

DHCP概念

DHCP是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。

所有客户机的IP地址设定资料都由DHCP服务器集中管理,并负责处理客户端的DHCP请求;而客户端则会使用从服务器分配下来的IP地址。

在此不详细阐述DHCP工作原理,若想了解可参考:https://www.cnblogs.com/wajika/p/6537085.html

DHCP服务器IP分配方式

主要提供三种IP分配方式:

  • 自动分配(Automatic Allocation),当DHCP客户端第一次成功地从DHCP服务器端分配到一个IP地址之后,就永远使用这个地址。
  • 动态分配(Dynamic Allocation),当DHCP客户端第一次从DHCP服务器分配到IP地址后,并非永久地使用该地址,每次使用完后,DHCP客户端就得释放这个IP地址,以给其他客户端使用。
  • 手动分配,由DHCP服务器管理员专门为客户端指定IP地址。

配置DHCP

DHCP指定监听网卡

  • 监听所有的网卡,默认不填就会监听所有的网卡

DHCPDARGS=

  • 监听单个网卡,后面写上你想监听的网卡的名字,如想监听eth0,eth1,就填它的名字

DHCPDARGS=eth1

  • 监听多个网卡,填几个就会去监听那几个网卡,以空格分开

DHCPDARGS=eth0 eth1

注意:在实际生产环境中,可能会有多个网络环境而且环境不会互通,可以结合自己公司的情况进行优化:

  • 物理机一般不止一块网卡,为了确保主机能分配到地址,最好指定网卡启动dhcp
  • 默认租约时间要设小一点,因为是用来做pxe安装大量服务器系统,在ip地址有限的情况(本段地址可能已经被用掉很多地址,剩下的不够被所有机器分配)下,尽量缩小默认租约时间,以防止安装时第一批机器装完,IP地址没有释放,第二批机器分配不到IP地址的情况
  • 条件足够的情况下,最好专门分配一个vlan用于装机,这样可以防止很多意外发生。
  • 在复杂网络环境中指定服务器重装可以使用dhcp的mac地址绑定的方式

TFTP

TFTP概念

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。

TFTP是一个传输文件的简单协议,它基于UDP协议而实现,但是我们也不能确定有些TFTP协议是基于其它传输协议完成的。此协议设计的时候是进行小文件传输的。因此它不具备通常的FTP的许多功能,它只能从文件服务器上获得或写入文件,不能列出目录,不进行认证,它传输8位数据。

配置TFTP

HTTP

HTTP概念

由于我们要获取安装系统服务的yum源以及内核文件,虚拟根文件,这些文件都是大文件,在传输时我们必须保证其能够安全传输,所以我们选择了HTTP服务,当然了,选择FTP服务也是可以的。

HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。是互联网上广泛试用的协议。是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分等。

HTTP包含命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。

配置httpd

各文件配置后面会讲,ks文件夹中可以自定义ks文件和所使用到的文件。

PXE引导(bootstrap)

syslinux是一个功能强大的引导加载程序,而且兼容各种介质。它的目的是简化首次安装Linux的时间,并建立修护或其它特殊用途的启动盘。

它的安装很简单,一旦安装syslinux好之后,sysLinux启动盘就可以引导各种基于DOS的工具,以及MS-DOS/Windows或者任何其它操作系统。不仅支持采用BIOS结构的主板,而且从6.0版也开始支持采用EFI结构的新型主板。

注意:SYSLINUX不支持NTFS文件系统,所以磁盘必须是FAT(FAT16/FAT32)文件系统。

配置PXE引导

default文件解析

启动httpd、tftp、dhcp

ks.cfg文件

通常,我们在安装操作系统的过程中,需要大量的和服务器交互操作,为了减少这个交互过程,kickstart就诞生了。

使用这种kickstart,只需事先定义好一个Kickstart自动应答配置文件ks.cfg(通常存放在安装服务器上),并让安装程序知道该配置文件的位置,在安装过程中安装程序就可以自己从该文件中读取安装配置,这样就避免了在安装过程中多次的人机交互,从而实现无人值守的自动化安装。

生成kickstart配置文件的三种方法:

  • 方法1:每安装好一台Centos机器,Centos安装程序都会创建一个kickstart配置文件,记录你的真实安装配置。如果你希望实现和某系统类似的安装,可以基于该系统的kickstart配置文件来生成你自己的kickstart配置文件。(生成的文件名字叫anaconda-ks.cfg位于 /root/anaconda-ks.cfg)
  • 方法2:Centos提供了一个图形化的kickstart配置工具。在任何一个安装好的Linux系统上运行该工具,就可以很容易地创建你自己 的kickstart配置文件。kickstart配置工具命令为system-config-kickstart
  • 方法3:阅读kickstart配置文件的手册。用任何一个文本编辑器都可以创建你自己的kickstart配置文件。

ks.cfg文件组成大致分为3段

命令段:

键盘类型,语言,安装方式等系统的配置,有必选项和可选项,如果缺少某项必选项,安装时会中断并提示用户选择此项的选项

软件包段:

  • %packages
  • @groupname:指定安装的包组
  • package_name:指定安装的包
  • -package_name:指定不安装的包
  • 在安装过程中默认安装的软件包,安装软件时会自动分析依赖关系。

脚本段(可选):

  • %pre:预安装脚本(由于只依赖于启动镜像,支持的命令很少)
  • %post:后安装脚本(基本支持所有命令)
  • 而具体的ks.cfg文件的配置,我们只需要在已经安装好的linux的root家目录找到anaconda_ks.cfg(这个ks文件就是在安装linux后,根据用户的安装选项自动生成的)
  1.  每个项目都由关键字来识别;关键字可跟一个或多个参数;如果某选项后面跟随了一个等号(=),它后面就必须指定一个值。
  2.     关键字    含义
  3.     install(可选)    明确指定系统此次进行的是全新安装系统,而不是升级upgrade;是默认项;
  4.     cdrom(可选)    以本地CD-ROM为源安装系统;
  5.     harddrive  (可选)    以硬盘分区中包含的镜像为源(安装树)安装新系统;当以该种方式安装系统时,即使指定clearpart --all项,源所在分区也不会被重新抹去;
  6.         --partition=    指定分区
  7.         --dir=        指定包含镜像的目录
  8. 例:
  9.             harddrive  --partition=/dev/sdb2  --dir=/data/iso
  10.     nfs   (可选)    指定从NFS服务器上获取安装树;
  11.             --server=    指定NFS服务器,主机名称或IP    
  12.             --dir=        包含安装树的目录
  13.         --opts=        可以指定挂载NFS的目录时的挂载选项
  14. 例:
  15.             nfs  --server=192.168.31.72  --dir=/data/iso
  16.     url   (可选)    指定通过FTP或HTTP从网络获取安装树;
  17.             --url    指定资源位置
  18. 例:
  19.             url  --url  ftp://<username>:<password>@<server>/<dir>
  20.             url  --url     
  21.     bootloader (必需)设定boot loader安装选项;
  22.             --append=        可以指定内核参数,要指定多个参数,使用空格分隔它们。
  23.             --driveorder=    设定设备BIOS中的开机设备启动顺序    
  24.             --location=        设定引导记录的位置,有效的值如下:
  25.                                 mbr(默认值);
  26.                                 partition(在包含内核的分区的第一个扇区安装引导装载程序)或none(不安装引导装载程序)。
  27. 例:
  28.             bootloader  --location=mbr  --append=“rhgb quiet” --driveorder=sda,sdb
  29.             bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb rhgb quiet quiet"
  30.     clearpart (可选)在建立新分区前清空系统上原有的分区表,默认不删除分区;
  31.             --all      擦除系统上原有所有分区;    
  32.             --drives    删除指定驱动器上的分区    
  33.             --initlabel    初始化磁盘卷标为系统架构的默认卷标    
  34.             --linux        擦除所有的linux分区    
  35.             --none(default)不移除任何分区
  36. 例:
  37.             clearpart  --drives=hda,hdb --all  --initlabel
  38.     zerombr  (可选)清除mbr引导信息,会同时清空系统用原有分区表
  39.     drivedisk (可选)如果使用特殊存储方式时,需要指定驱动程序盘位置以便加载存储驱动;
  40.     1.  将驱动盘拷贝到本地硬盘某分区根目录:
  41.             drivedisk <partition> [ --type=<fstype> ]
  42.     2.  也可以指定一个网络位置加载驱动程序盘
  43.             drivedisk  --source=ftp://path/to/drive.img    
  44.             drivedisk  --source=http://path/to/drive.img     
  45.             drivedisk  --source=nfs:host://path/to/drive.img
  46.     firewall (可选)配置系统防火墙选项;
  47.     firewall -enable|--disable  [ --trust ] <device> [ --port= ]    
  48.             --enable        拒绝外部发起的任何主动连接;    
  49.             --disable        不配置任何iptables防御规则;    
  50.             --trust        指定完全信任网卡设备;    
  51.             --port        使用port:protocol格式指定可以通过防火墙的服务;
  52. 例:
  53.             firewall --enable --trust eth0  --trust eth1  --port=80:tcp
  54.             firewall --disabled
  55.     selinux (可选)设置系统selinux状态;默认为启用并处于enforcing模式;
  56.     selinux [ --disabled|–enforcing|--premissive ]
  57. 例:
  58.         selinux --disabled
  59.     reboot (可选)    在系统成功安装完成后默认自动重启系统(kickstart方法时);
  60. 在收到你敢装系统完成后,会提示按任意键进行重启;
  61.                     在本文件中没有明确指明其他方法时就默认完成方式为reboot;
  62.                            使用 reboot 选项可能会导致安装的死循环,这依赖于安装介质和方法。需要特别注意;
  63. halt  (可选)    在系统成功安装完成后关机;默认为reboot;
  64.             其他选项还有shutdown、poweroff,需要使用请自行参考官方文档。
  65.     graphical (可选)默认值,在图形模式下进行kickstart方式安装;
  66.     text (可选)以文本方式进行kickstart安装;默认为图形界面
  67.     key  (可选)    设置一个安装码(installration number),用于获取RedHat官方的支持服务;
  68.             --skip    跳过key设置,不进行设置;如果不设置可能跳转到交互模式让用户选取动作;
  69.     keyboard (必需)设置键盘类型;一般设置为us;
  70. 例:
  71.         keyboard us
  72.     lang (必需)设置安装过程使用的语言及系统的缺省语言;文本模式安装时可能不支持某些语言(中、韩...),所以可能仍以默认的英文方式安装;默认en_us,装中文时,需要后期%packages部分装上中文支持组件;
  73. 例:
  74.             lang en_US
  75.     timezone (可选)    设置系统的时区;
  76.     timezone  [ --utc ]  <timezone>    
  77. 例:
  78.             timezone  --utc  Asia/Shanghai
  79.             timezone Asia/Shanghai
  80.     auth/authconfig  (必需)    设置系统的认证方式;默认为加密但不隐藏(shadow);
  81.             --enablemd5    使用MD5加密方式    
  82.             --useshadow或—enableshadow    使用隐藏密码;    
  83.             --enablenis=     使用NIS认证方式    
  84.             --nisdomain=    NIS域    
  85.             --nisserver=       NIS服务器    还可以设置LDAP、SMB及Kerberos5认证方式,详细请参考官方文档;    
  86. 例:
  87.             authconfig  --useshadow  --enablemd5
  88.             authconfig --enableshadow --passalgo=sha512    设置密码加密方式为sha512 启用shadow文件。    
  89.     rootpw (必需)    设置系统root账号的密码;
  90.     rootpw [ --iscrypted ]  <passwd>    
  91.             --iscrypted    表示设置的密码为加密过的串;    
  92. 例:
  93.             rootpw  pa4word    rootpw --iscrypted  $1$RPYyxobb$/LtxMNLJC7euEARg2Vu2s1
  94.             rootpw  --iscrypted $6$fvyDQYgM0a7kwvth$jAhWo.26MxcNMFwnJNl6011diLKv8Ai/3QapVZhfaXExPz9wAQfrxHfx.4RWK2SPb83OB33MyYX61Xd3h1hvB/
  95.     network (可选)    配置网络信息;在网络安装(NFS/HTTP/FTP)时必须指定;
  96.             --bootproto=dhcp|bootp|static    指定ip获取方式,默认为dhcp/bootp;static方法要求在kickstart文件里输入所有的网络信息。   
  97.             --device=    设置安装时激活来进行系统安装的网卡设备;该参数只在kickstart文件为本地文件时有效;若kickstart配置文件在网络上,安装程序会先初始化网卡然后去寻找kickstart文件;    
  98.             --ip=    ip设置    
  99.             --gateway=   网关    
  100.             --nameserver=  DNS设置    
  101.             --nodns        不设置DNS    
  102.             --netmask=   子网掩码    
  103.             --hostname= 设置安装后主机名称    
  104.             --onboot=    设置是否在系统启动时激活网卡    
  105.             --class=        设置DHCP的class值    
  106.             --noipv4        禁用该设备的ipv4功能    
  107.             --noipv6        禁用该设备的ipv6功能    如将网络模式设置为静态模式,则必须在一行内写上ip,netmask、dns、gateway等信息;    
  108. 例:
  109.             network –bootproto=static –ip=1.1.1.1 --metmask=255.0.0.0 --gateway=1.1.1.254 --nameserver=1.1.1.2    
  110.             netmask --bootproto=dhcp  --device=eth0
  111.             network --onboot yes --device eth0 --mtu=1500 --bootproto static --ip 10.0.0.32 --netmask 255.255.255.0 --noipv6 --hostname openstack02    
  112.             network --onboot yes --device eth1 --bootproto static --ip 192.168.31.32 --netmask 255.255.255.0 --gateway 192.168.31.1 --noipv6 --nameserver 223.5.5.5 --hostname openstack02
  113.     skipx (可选)
  114.         如果该项存在,就不对系统的X进行设置;
  115.     xconfig (可选)配置X window ;如果不给出选项,在安装过程中需要手动调整设置;当然不安装X时不应该添加该项;
  116.             --driver            为显卡设置X驱动   
  117.             --videoram=    设置显卡的RAM大小   
  118.             --defaultdesktop=    设置GNOME/KDE作为默认桌面;假定这两个桌面环境在%packages例已经安装   
  119.             --startxonboot   使用图形界面登录系统   
  120.             --resolution=     设置图形界面的分辨率;可用值有640*480、800*600、1024*768等;确保设置指适合于显示卡及显示器;   
  121.             --depth=           设置显示色深;可用值有8/16/24/32;确保设置值适合于显示设备;
  122.     例:
  123.             xconfig    --startxonboot  --resolution=800*600 --depth=16
  124.     services (可选)设置禁用或允许列出的服务;
  125.             --disabled 设置服务为禁用    
  126.             --enabled  启动服务
  127. 例:
  128.             services --disabled autid,cups,smartd,nfslock  服务之间用逗号隔开,不能有空格    
  129.     iscsi(可选)指定额外的ISCSI设备;
  130.     issci --ipaddr= ipaddr  [options].      
  131.             --target       
  132.             --port=       
  133.             --user=       
  134.             --password=
  135.     part/partition  (install模式必须)建立新分区;
  136.     part  <mntpoint>|swap|pv.id|rdid.id
  137.     options
  138.             mntpoint:挂载点,是在创建普通分区时指定新分区挂载位置的项;挂载点需要格式正确
  139.             swap: 创建swap分区;
  140.             raid.id:  表示创建的分区类型为raid型;必须用id号进行唯一区别;
  141.             pv.id:  表示所创建的分区类型为LVM型;必须用唯一id号进行区别;
  142.             --size=  设置分区的最小值,默认单位为M,但是不能写单位;    
  143.             --grow  让分区自动增长利用可用的剩余磁盘空间,或是增长到设置的maxsize值;    
  144.             --maxsize 设置分区自动增长(grow)时的最大容量值,以M为单位,但不能写单位;    
  145.             --onpart=/--usepart=     设置使用原有的分区;    
  146.             --noformat    设置不格式化指定的分区,在跟—onpart一同使用时,可以避免删除原有分区上的数据,在新安装的系统中保留使用数据;    
  147.             --asprimary    强制制定该分区为主分区;若指定失败,分区会失败,导致安装停止;    
  148.             --fstype=    新增普通分区时指定分区的类型,可以为ext2、ext3、ext4、swap、vfat及hfs;    
  149.             --ondisk=/--ondrive=     设定该分区创建在一个具体的磁盘上;    
  150.             --start   指定分区以磁盘上那个磁道开始;需要跟--ondisk参数一块使用;    
  151.             --end    指定分区以磁盘上那个磁道结束;需要跟上述两个参数一起使用;    
  152.             --recommended:让系统自行决定分区的大小;在创建swap分区时,若RAM<2G,则分区大小为2*RAM;若RAM>=2G时,分区大小为RAM+2G;    
  153.             --bytes-pre-inode=    指定分区格式化时inode的大小;默认值为4096    
  154.             --fsoptions=    指定创建fstab文件时该分区挂载参数项;
  155. 例:
  156.             part  /boot  --fstype=“ext3” --size=100    
  157.             part  swap  --fstype=“swap” –size=512      
  158.             part  /  --bytes-pre-inode=4096  --fstype=“ext4”--size=10000    
  159.             part  /data    --onpart=/dev/sdb1  --noformat    
  160.             part  raid.100  --size=2000    
  161.             part  pv.100     --size=1000
  162.             part /boot --fstype=ext4 --asprimary --size=200    
  163.             part swap --asprimary --size=512    
  164.             part / --fstype=ext4 --grow --asprimary --size=200
  165.     raid  (可选)    设置RAID。
  166.     raid 挂载点  --level=<level>  --device=<mddevices_name>  <raid组成分区>    
  167.     挂载点:    选取根/时,注意尽量避免/boot在RAID内,除非为RAID1;
  168.             --level=     设置RAID级别    
  169.             --device=  RAID设备名称,如md0,md1...    
  170.             --byte-pre-inode=    设置该RAID分区上inode大小;若分区文件系统类型不支持该参数,会静默忽略参数;    
  171.             --spares=  设置RAID的热备盘    
  172.             --fstype=  设置文件系统类型    
  173.             --fsoptions=  设置挂载该文件系统时自定义的一些参数,参数写入fstab文件;    
  174.             --useexisting  使用现有的RAID设备并且重新格式化原设备    
  175.             --noformat     在使用现有的RAID设备时不格式化原有RAID设备    
  176.     例:完整创建一个RAID1设备示例;
  177.             part  raid.10  --size=1000  --ondisk=/dev/sdb    
  178.             part  raid.11  --size=1000  --ondisk=/dev/sdc    raid  /data  --level=1  --device=md0  raid.10  raid.11
  179.     volgroup  (可选)    创建一个LVM卷组VG;
  180.     volgroup  vg_name  partition  [options]
  181.             --useexiting   使用现有的VG并且重新格式化    
  182.             --noformat    使用现有的VG时不做格式化    
  183.             --pesize          设置PE(physical extents)块大小   
  184. 例:
  185.             part pv.11  --size=2000    volgroup  myvg  pv.11
  186.     logvol  (可选)    创建一个LVM逻辑卷LV;    logvel  mnt_point
  187.             --vgname=vg_name  
  188.             --size=lv_size  
  189.             --name=lv_name  
  190.     [options]
  191.             --useexiting  使用现有的LV并且重新格式化    
  192.             --noformat   使用现有的LV时不做格式化    
  193.             --fstype=      指定RAID分区类型    
  194.             --fsoptions=  设置挂载该文件系统时自定义的一些参数,参数写入fstab文件;    
  195.             --byte-pre-inode=    设置该RAID分区上inode大小;    
  196.             --precent=    设定LV大小为VG可用空间的比例;    
  197. 例:
  198.             part pv.20  --size=5000    volgroup  mvvg  pv.20    logvol    /data  --vgname=myvg  --size=3000  --name=mydata
  199.     firstboot(可选)    负责协助配置redhat一些重要的信息。
  200.         firstboot --disable    
  201.     logging(可选)    设置日志级别。
  202.         logging --level=info

以下是ks配置文件的内容

可以根据自己所需进行调整,ks文件需要用.cfg结尾,必须与default文件中指定的位置相同。

ks.cfg

  1. #version=DEVEL
  2.   install #表示是安装系统
  3.   # System authorization information
  4.   auth --enableshadow --passalgo=sha512   #启用加密
  5.   text        #文本安装
  6.   #graphical  #图形化安装,注释掉
  7.   # Use graphical install
  8.   url --url=http://192.168.1.1/CentOS-7.5/    #用于读取系统的url
  9.   # Firewall configuration
  10.   firewall --disabled #关闭防火墙
  11.   # SELinux configuration
  12.   selinux --disabled  #关闭selinux
  13.   # Run the Setup Agent on first boot
  14.   firstboot --disable #关闭第一次启动后的安装配置
  15.   ignoredisk --only-use=sda   #默认第一块启动盘
  16.   # Keyboard layouts
  17.   keyboard --vckeymap=us --xlayouts='us'  #键盘
  18.   # System language
  19.   lang en_US.UTF-8        #语言和编码
  20.   # Network information
  21.   network  --bootproto=dhcp --device=ens33 --onboot=off --ipv6=auto --no-activate #安装时配置网卡地址
  22.   network  --hostname=localhost.localdomain   #安装时配置主机名
  23.   # System timezone
  24.   timezone Asia/Shanghai      #时区
  25.   # System bootloader configuration
  26.   bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda #指定引导装载程序怎样被安装
  27.   # Root password
  28.   rootpw --iscrypted $1$vIP9ZiKA$ryz7cg0/2NwoOYVnHhHCF1   #root密码
  29.   # System services
  30.   #services --enabled="chronyd"
  31.   # Do not configure the X Window System
  32.   skipx       #不使用图形界面
  33.   # Accept license
  34.   eula --agreed       #同意最终用户许可协议
  35.   # Reboot after installation
  36.   reboot  #安装后重启
  37.   # Disk partitioning information
  38.   %include /tmp/partition.ks
  39.   %pre    #系统安装前所执行的脚本
  40.   #!/bin/sh
  41.   # 创建分区,如果分区比较简单,可以放在上面,分区比较多的,可以像这样写脚本放在%pre块内
  42.   act_mem=$(cat /proc/meminfo | grep MemTotal | awk '{printf("%d",$2/1024)}')
  43.   echo "" > /tmp/partition.ks
  44.   echo "clearpart --all --initlabel" >> /tmp/partition.ks
  45.   echo 'part pv.767 --fstype="lvmpv" --ondisk=sda --size=1 --grow' >> /tmp/partition.ks..ec01]oho 'part biosboot --fstype="biosboot" --ondisk=sda --size=2' >> /tmp/partition.ks
  46.   echo 'part /boot --fstype="ext4" --ondisk=sda --size=512' >> /tmp/partition.ks
  47.   echo 'volgroup rhel --pesize=4096 pv.767' >> /tmp/partition.ks
  48.   echo 'logvol /data  --fstype="ext4" --size=1 --grow --name=data --vgname=rhel' >> /tmp/partition.ks
  49.   echo 'logvol /  --fstype="ext4" --size=102400 --name=root --vgname=rhel' >> /tmp/partition.ks
  50.   if [ ${act_mem} -ge 65536  ]
  51.   then
  52.   echo "logvol swap --fstype=swap --name=swap --vgname=rhel --size=65536" >> /tmp/partition.ks
  53.   elif [ ${act_mem} -le 8192 ]
  54.   then
  55.   echo "logvol swap --fstype=swap --name=swap --vgname=rhel --size=${act_mem}" >> /tmp/partition.ks
  56.   else
  57.   echo "logvol swap --fstype=swap --name=swap --vgname=rhel --size=$(expr ${act_mem} / 2)" >> /tmp/partition.ks
  58.   fi
  59.   %end
  60.   %post       #系统安装后所执行的脚本
  61.   #Sshd config
  62.   sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
  63.   ......
  64.   wget -O /tmp/ip.txt http://192.168.1.1/ks_cfg/ip.txt
  65.   wget -O /tmp/ip.sh http://192.168.1.1/ks_cfg/ip.sh
  66.   /bin/sh /tmp/ip.sh
  67.   wget -O /tmp/zabbix_agent.sh http://http://192.168.1.1/ks_cfg/zabbix_agent.sh
  68.   /bin/sh /tmp/zabbix_agent.sh
  69.   ......
  70.   %end
  71.   %packages       #安装包,%packages块指定以下都是需要进行安装的包。
  72.   @base       #最小化安装需要@base和@core。@后写的是包组
  73.   @console-internet
  74.   @core
  75.   autoconf    #没有任何前缀的表示需要安装的包
  76.   chrony
  77.   expect
  78.   gcc
  79.   gcc-c++
  80.   ......
  81.   %end        #最后需要用%end结尾
  82.   %addon com_redhat_kdump --enable --reserve-mb='auto'
  83.   %end

ip.sh、ip.txt、zabbix_agent.sh是安装后所需要执行的脚本,配置在%post块内,使用wget下载下来,再进行执行。可以自行编写脚本实现功能,比如根据机器序列号进行IP配置,进行内核参数调优,权限设置,加入zabbix监控等等。

以下附加一份IP配置脚本,因为比较特殊,需要在网卡上配置vlan,打vlan标签。

  1. ip.txt
  2. #依次对应序列号、业务网IP、数据网IP、管理网IP、主机名
  3. XXXXXXXX 10.1.1.1 10.10.1.1 10.20.1.1 XXXX-1.1
  4. ip.sh
  5. SN=`dmidecode -t 1 |grep "Serial Number" |awk -F ": " '{print $2}'` #取本机序列号
  6. ip_1=`cat /tmp/ip.txt |grep $SN |awk -F " " '{print $2}'` #按照序列号指定对应IP
  7. ip_10=`cat /tmp/ip.txt |grep $SN |awk -F " " '{print $3}'`
  8. ip_20=`cat /tmp/ip.txt |grep $SN |awk -F " " '{print $4}'`
  9. host_name=`cat /tmp/ip.txt |grep $SN |awk -F " " '{print $5}'`
  10. cat > /etc/sysconfig/network-scripts/ifcfg-eth2  << EOF
  11. TYPE=Ethernet
  12. BOOTPROTO=none
  13. DEVICE=eth2
  14. ONBOOT=yes
  15. IPADDR=$ip_10
  16. PREFIX=24
  17. EOF
  18. cat > /etc/sysconfig/network-scripts/ifcfg-eth3 << EOF
  19. TYPE=Ethernet
  20. BOOTPROTO=none
  21. DEVICE=eth3
  22. ONBOOT=yes
  23. IPADDR=$ip_20
  24. PREFIX=24
  25. EOF
  26. cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF
  27. DEVICE=eth0
  28. ONBOOT=yes
  29. USERCL=no
  30. MASTER=bond0
  31. SLAVE=yes
  32. EOF
  33. cat > /etc/sysconfig/network-scripts/ifcfg-eth1 << EOF
  34. DEVICE=eth1
  35. ONBOOT=yes
  36. USERCTL=no
  37. MASTER=bond0
  38. SLAVE=yes
  39. EOF
  40. #config bond
  41. cat >  /etc/sysconfig/network-scripts/ifcfg-bond0 << EOF
  42. DEVICE=bond0
  43. BOOTPROTO=none
  44. DEFROUTE=yes
  45. IPV4_FAILURE_FATAL=no
  46. NAME=bond0
  47. ONBOOT=yes
  48. IPADDR=$ip_1
  49. PREFIX=24
  50. GATEWAY=10.1.1.254
  51. IPV6_PEERDNS=yes
  52. IPV6_PEERROUTES=yes
  53. BONDING_OPTS="miimon=100 mode=4"
  54. EOF
  55. cat > /etc/sysconfig/network-scripts/route-eth2 << EOF #为网卡加入路由,使其他网卡能访问别的网段
  56. 10.10.0.0/16 via 10.10.1.254
  57. EOF
  58. cat > /etc/sysconfig/network-scripts/route-eth3 << EOF
  59. 10.20.0.0/16 via 10.20.1.254
  60. EOF
  61. systemctl restart network
  62. echo "$host_name" > /etc/hostname
  63. echo "$ip_1 $host_name" >> /etc/hosts

五、小结

  • PXE客户端获取镜像的方式不仅仅只有http,还有nfs和FTP
  • 在多网卡的情况下,最好指定网卡来启用DHCP
  • tftp安装时是安装tftp-server,并且它被xinetd所管理,所以需要安装xinetd
  • pxelinux.0文件在/usr/share/syslinux文件夹下,如果没有,需要安装syslinux
  • 使用pxe+kickstart时,最好关闭selinux和firewall
  • tftp根目录下的文件,如vmlinuz等文件最好是从所安装镜像的文件目录下的isolinux下拷过去,不能随便用别的镜像内的文件,会报错
  • 细读流程,知道原理,在报错的时候才好排错

上面具体说了有关于pxe+kickstart的原理,以及linux的自动化安装配置。下面简单说下esxi的自动化配置,原理是一样的。

自动化配置安装esxi6.0

以下环境192.168.1.1是http、tftp和dhcp的地址。先安装所需要的工具包:

  1. [root@localhost ~]# yum install dhcp xinetd tftp-server httpd syslinux -y

配置DHCP

  1. [root@localhost ~]# vim /etc/dhcp/dhcpd.conf
  2. subnet 192.168.1.0 netmask 255.255.255.0 {
  3. range 192.168.1.200 192.168.1.253;
  4. option subnet-mask 255.255.255.0;
  5. DHCPDARGS=ens5f1;
  6. default-lease-time 600;
  7. max-lease-time 5400;
  8. next-server 192.168.1.1;
  9. filename "/gpxelinux.0";    # esxi和linux有所区别,esxi需要用gpxelinux.0这个文件
  10. }
  11. [root@localhost ~]# systemctl restart dhcpd

配置HTTP

  1. [root@localhost ~]# vim /etc/httpd/conf/httpd.conf
  2. ServerName 192.168.1.1:80
  3. [root@localhost ~]# systemctl restart httpd
  4. [root@localhost ~]# cd /var/www/html/
  5. [root@localhost html]# mkdir Esxi6.3    # 创建镜像存放的文件夹
  6. [root@localhost html]# mount /data/ios/ESXi-6.3-Custom.iso /var/www/html/Esxi6.3  # 挂载镜像到文件夹
  7. [root@localhost html]# mkdir ks_cfg     # 创建ks文件所用的文件夹
  8. [root@localhost html]# ll ks_cfg/
  9. -rw-r--r-- 1 root   503 Nov 14 15:34 esxi.cfg
  10. -rw-r--r-- 1 root  3541 Nov 14 15:46 esxi_ip

配置TFTP

  1. [root@localhost ~]# sed -i "s/\= yes/\= no/g" /etc/xinetd.d/tftp
  2. [root@localhost ~]# systemctl restart xinetd
  3. [root@localhost ~]# cd /var/lib/tftpboot/
  4. [root@localhost tftpboot]# cp /var/www/html/Esxi6.3/mboot.c32 .
  5. [root@localhost tftpboot]# cp /var/www/html/Esxi6.3/boot.cfg .
  6. [root@localhost tftpboot]# cp /usr/share/syslinux/gpxelinux.0 .
  7. [root@localhost tftpboot]# mkdir pxelinux.cfg
  8. [root@localhost tftpboot]# cp /var/www/html/Esxi6.3/isolinux.cfg pxelinux.cfg/default
  9. [root@localhost tftpboot]# chown +w boot.cfg
  10. [root@localhost tftpboot]# chmod +w pxelinux.cfg/default
  11. [root@localhost tftpboot]# sed "s/\///g" boot.cfg   # 将文件内的/全部去掉
  12. [root@localhost tftpboot]# vim boot.cfg  # 在kernel=tboot.b00这行上面添加prefix
  13. prefix=http://192.168.1.1/Esxi6.3
  14. [root@localhost tftpboot]# vim pxelinux.cfg/default  # 多余的可以删掉
  15. DEFAULT 1
  16. NOHALT 1
  17. PROMPT 0
  18. TIMEOUT 60
  19. LABEL 1
  20.   KERNEL mboot.c32
  21.   APPEND -c boot.cfg ks=http://192.168.1.1/ks_cfg/esxi.cfg

服务配置就是这些,下面是ks文件:

  1. [root@localhost ~]# cd /var/www/html/ks_cfg/
  2. [root@localhost ks_cfg]# ll
  3. -rw-r--r-- 1 root   503 Nov 14 15:34 esxi.cfg
  4. -rw-r--r-- 1 root  3541 Nov 14 15:46 esxi_ip
  5. 自定义IP列表
  6. [root@localhost ks_cfg]# cat esxi_ip
  7. 816399908 192.168.1.188
  8. 816399887 192.168.1.189
  9. 816399909 192.168.1.190
  10. ks文件
  11. [root@localhost ks_cfg]#  cat esxi.cfg
  12. vmaccepteula        # 同意vmware的协议
  13. rootpw 1qaz!QAZ     # 设置root密码
  14. install --firstdisk --overwritevmfs     # 安装并格式化第一块本地盘
  15. reboot      # 安装后重启
  16. %include /tmp/network.ks        # 导入自定义ks脚本
  17. %pre --interpreter=busybox      # 安装前的配置脚本
  18. wget -O /tmp/esxi_ip http://192.168.1.1/ks_cfg/esxi_ip
  19. SN=$(localcli hardware platform get | awk '/Serial Number/ { print $NF }')
  20. ip=`cat /tmp/esxi_ip |grep $SN |awk -F " " '{print $2}'`
  21. echo "network --bootproto=static --device=vmnic4 --ip=$ip --netmask=255.255.255.0 --gateway=192.168.1.254 --hostname=localhost --nameserver=192.168.1.1 --vlanid=201" > /tmp/network.ks    # 可以在脚本中设置自定义网络

作者介绍:

季城希,甜橙金融运维工程师,多年IDC运维经验。擅长IDC中服务器批量高效快速集成交付,精通各品牌型号服务器硬件产品及维护。

(0)

本文由 Funstec非凡实验室 作者:Albert 发表,转载请注明来源!