第1章 kickstart安装部署
1.1 系统环境准备
[root@m01 ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@m01 ~]# uname -r 2.6.32-696.el6.x86_64 [root@m01 ~]# getenforce Disabled [root@m01 ~]# service iptables status iptables: Firewall is not running. [root@m01 ~]# hostname -I 10.0.0.61 172.16.1.61
提示:
1、虚拟机网卡采用NAT模式,不要使用桥接模式,因为稍后我们会搭建DHCP服务器,在同一局域网多个DHCP服务会有冲突。
2、VMware的NAT模式的dhcp服务也关闭,避免干扰:
1.2 安装DHCP服务
1.2.1 DHCP简介
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、网关地址、DNS服务器地址等信息,并能够提升地址的使用率。
提示:同一个局域网最好只有一个DHCP服务器,否则可能会导致局域网内主机无法上网。
提示:DHCP工作过程的六个主要步骤:http://www.zyops.com/dhcp-working-procedure
1.2.2 安装DHCP服务
[root@m01 ~]# yum install -y dhcp
1.2.3 配置DHCP服务
[root@m01 ~]# vim /etc/dhcp/dhcpd.conf # # DHCP Server Configuration file. # see /usr/share/doc/dhcp*/dhcpd.conf.sample # see 'man 5 dhcpd.conf' # subnet 172.16.1.0 netmask 255.255.255.0 { range 172.16.1.100 172.16.1.200; # 可分配的起始IP-结束IP option subnet-mask 255.255.255.0; # 设定netmask default-lease-time 21600; # 设置默认的IP租用期限,单位秒 max-lease-time 43200; # 设置最大的IP租用期限,单位秒 next-server 172.16.1.61; # 告知客户端TFTP服务器的ip filename "/pxelinux.0"; # 告知客户端从TFTP根目录下载pxelinux.0文件 }
1.2.4 启动DHCP服务
[root@m01 ~]# service dhcpd start
1.2.5 查看启动日志
[root@m01 ~]# tail -f /var/log/messages
注意:
1、本来软件装完后都要加入开机自启动,但Kickstart系统就不能开机自启动,而且用完后服务都要闭,防止未来重启服务器自动重装系统了。
2、如果机器数量过多的话,注意dhcp服务器的地址池,不要因为耗尽IP而导致dhcpd服务器没有IP地址release的情况。
1.3 安装TFTP服务
1.3.1 TFTP简介
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。
1.3.2 安装TFTP服务
[root@m01 ~]# yum install -y tftp-server
1.3.3 配置TFTP服务
[root@m01 ~]# vim /etc/xinetd.d/tftp # default: off # description: The tftp server serves files using the trivial file transfer \ # protocol. The tftp protocol is often used to boot diskless \ # workstations, download configuration files to network-aware printers, \ # and to start the installation process for some operating systems. service tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /var/lib/tftpboot # 指定目录,保持默认,不用修改 disable = no # 由原来的yes改为no per_source = 11 cps = 100 2 flags = IPv4 } # 或 [root@m01 ~]# sed -i.bak '14s#yes#no#' /etc/xinetd.d/tftp
1.3.4 启动TFTP服务
[root@m01 ~]# /etc/init.d/xinetd restart
1.4 安装HTTP服务
1.4.1 安装HTTP服务
[root@m01 ~]# yum install -y httpd
1.4.2 启动HTTP服务
[root@m01 ~]# service httpd start
1.4.3 挂载系统光盘
[root@m01 ~]# mkdir -p /var/www/html/CentOS6.9 [root@m01 ~]# mount /dev/cdrom /var/www/html/CentOS6.9/ mount: block device /dev/sr0 is write-protected, mounting read-only #此为提示挂载的设备只读,可忽略
1.4.4 查看系统镜像目录
[root@test ~]# curl 172.16.1.61/CentOS6.9 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>301 Moved Permanently</title> </head><body> <h1>Moved Permanently</h1> <p>The document has moved <a href="http://172.16.1.61/CentOS6.9/">here</a>.</p> <hr> <address>Apache/2.2.15 (CentOS) Server at 172.16.1.61 Port 80</address> </body></html>
1.5 配置支持PXE的启动程序
1.5.1 PXE引导配置(bootstrap)
syslinux是一个功能强大的引导加载程序,而且兼容各种介质。SYSLINUX是一个小型的Linux操作系统,它的目的是简化首次安装Linux的时间,并建立修护或其它特殊用途的启动盘。
[root@m01 ~]# yum install -y syslinux [root@m01 ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ # 复制启动菜单程序文件 [root@m01 ~]# cp -a /var/www/html/CentOS6.9/isolinux/* /var/lib/tftpboot/ [root@m01 ~]# mkdir -p /var/lib/tftpboot/pxelinux.cfg # 新建一个目录存放客户端的配置文件 [root@m01 ~]# cp /var/www/html/CentOS6.9/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default # 查看tftpboot目录内容 [root@m01 ~]# cd /var/lib/tftpboot/ [root@m01 tftpboot]# ls boot.cat boot.msg grub.conf initrd.img isolinux.bin isolinux.cfg memtest pxelinux.0 pxelinux.cfg splash.jpg TRANS.TBL vesamenu.c32 vmlinuz
1.5.2 编写default配置文件
[root@m01 ~]# cp /var/lib/tftpboot/pxelinux.cfg/default{,.bak} [root@m01 ~]# > /var/lib/tftpboot/pxelinux.cfg/default [root@m01 ~]# vim /var/lib/tftpboot/pxelinux.cfg/default default ks prompt 0 label ks kernel vmlinuz # 告诉安装程序ks.cfg文件位置。ksdevice=eth1代表当客户端有多块网卡的时候,要实现自动化需要设置从 # eth1安装,不指定的话,安装的时候系统会提示选择,那就不叫全自动化了。 append initrd=initrd.img ks=http://172.16.1.61/ks_config/CentOS6.9-ks.cfg ksdevice=eth1 # 或 [root@m01 ~]#cat>/var/lib/tftpboot/pxelinux.cfg/default<<EOF default ks prompt 0 label ks kernel vmlinuz append initrd=initrd.img ks=http://172.16.1.61/ks_config/CentOS-6.9-ks.cfg ksdevice=eth1 EOF
1.5.3 PXE配置文件default解析
1.5.3.1 配合虚拟机演示讲解default文件
- 打开电源后显示如下:
- 接下来就是启动菜单界面:
- 输入ESC后显示命令行界面:
1.5.3.2 配置文件解析:
[root@m01 ~]# vim /var/lib/tftpboot/pxelinux.cfg/default # 默认加载的菜单 default vesamenu.c32 # 开启会显示命令行'boot: '提示符。prompt值为0时则不提示,将会直接启动'default'参数中指定的内容。 #prompt 1 # timeout时间是引导时等待用户手动选择的时间,设为1可直接引导,单位为1/10秒。 timeout 600 display boot.msg # 菜单背景图片、标题、颜色。 menu background splash.jpg menu title Welcome to CentOS 6.9! menu color border 0 #ffffffff #00000000 menu color sel 7 #ffffffff #ff000000 menu color title 0 #ffffffff #00000000 menu color tabmsg 0 #ffffffff #00000000 menu color unsel 0 #ffffffff #00000000 menu color hotsel 0 #ff000000 #ffffffff menu color hotkey 7 #ffffffff #ff000000 menu color scrollbar 0 #ffffffff #00000000 # label指定在boot:提示符下输入的关键字,比如boot:linux[ENTER] # 这个会启动label linux下标记的kernel和initrd.img文件。 label linux # 一个标签就是前面图片的一行选项。 menu label ^Install or upgrade an existing system menu default kernel vmlinuz # 指定要启动的内核。同样要注意路径,默认是/tftpboot目录。 append initrd=initrd.img # 指定追加给内核的参数,initrd.img是一个最小的linux系统 label vesa menu label Install system with ^basic video driver kernel vmlinuz append initrd=initrd.img nomodeset label rescue menu label ^Rescue installed system kernel vmlinuz append initrd=initrd.img rescue label local menu label Boot from ^local drive localboot 0xffff label memtest86 menu label ^Memory test kernel memtest append -
1.5.4 PXE配置文件default扩展说明
由于多个客户端可以从一个PXE服务器引导,PXE引导映像使用了一个复杂的配置文件搜索方式来查找针对客户机的配置文件。如果客户机的网卡的MAC地址为8F:3H:AA:6B:CC:5D,对应的IP地址为10.0.0.195,那么客户机首先尝试以MAC地址为文件名匹配的配置文件,如果不存在就以IP地址来查找。根据上述环境针对这台主机要查找的以一个配置文件就是 /tftpboot/pxelinux.cfg/01-8F-3H-AA-6B-CC-5D。如果该文件不存在,就会根据IP地址来查找配置文件了,这个算法更复杂些,PXE映像查找会根据IP地址16进制命名的客户机配置文件。例如:10.0.0.195对应的16进制的形式为C0A801C3。(可以通过syslinux软件包提供的gethostip命令将10进制的IP转换为16进制)
如果C0A801C3文件不存在,就尝试查找C0A801C文件,如果C0A801C也不存在,那么就尝试C0A801文件,依次类推,直到查找C文件,如果C也不存在的话,那么最后尝试default文件。
总体来说,pxelinux搜索的文件的顺序是:
/tftpboot/pxelinux.cfg/01-88-99-aa-bb-cc-dd /tftpboot/pxelinux.cfg/C0A801C3 /tftpboot/pxelinux.cfg/C0A801C /tftpboot/pxelinux.cfg/C0A801 /tftpboot/pxelinux.cfg/C0A80 /tftpboot/pxelinux.cfg/C0A8 /tftpboot/pxelinux.cfg/C0A /tftpboot/pxelinux.cfg/C0 /tftpboot/pxelinux.cfg/C /tftpboot/pxelinux.cfg/default
应用:如果已经从厂商获取了服务器MAC地址,就可以差异化定制安装服务器了。
1.6 手动安装系统
提示:新建一台空白虚拟机,不要挂载ISO镜像,打开电源。
- 选择第一个选项:
- 选择英语:
- 选择美式键盘:
- 选择URL方式安装:
- 选择安装系统的网卡:
- 禁用IPv6:
- 输入http的地址:http://172.16.1.61/CentOS6.9/
- 接下来和光盘安装一样:
1.7 ks.cfg文件介绍
通常,我们在安装操作系统的过程中,需要大量的和服务器交互操作,为了减少这个交互过程,kickstart就诞生了。使用这种kickstart,只需事先定义好一个Kickstart自动应答配置文件ks.cfg(通常存放在安装服务器上),并让安装程序知道该配置文件的位置,在安装过程中安装程序就可以自己从该文件中读取安装配置,这样就避免了在安装过程中多次的人机交互,从而实现无人值守的自动化安装。
1.7.1 生成kickstart配置文件的三种方法
- 使用安装好的系统的anaconda-ks.cfg文件:
每安装好一台Centos机器,Centos安装程序都会创建一个kickstart配置文件,记录你的真实安装配置。如果你希望实现和某系统类似的安装,可以基于该系统的kickstart配置文件来生成你自己的kickstart配置文件。(生成的文件名字叫anaconda-ks.cfg位于/root/anaconda-ks.cfg)
- 使用图形化配置工具创建配置文件:
Centos提供了一个图形化的kickstart配置工具。在任何一个安装好的Linux系统上运行该工具,就可以很容易地创建你自己的kickstart配置文件。kickstart配置工具命令为redhat-config-kickstart(RHEL3)或system-config-kickstart(RHEL4,RHEL5).网上有很多用CentOS桌面版生成ks文件的文章,如果有现成的系统就没什么可说。但没有现成的,也没有必要去用桌面版,命令行也很简单。
- 使用文本工具编辑配置文件
阅读kickstart配置文件的手册。用任何一个文本编辑器都可以创建自己的kickstart配置文件。
1.7.2 查看anaconda-ks.cfg
[root@m01 ~]# vim anaconda-ks.cfg # Kickstart file automatically generated by anaconda. #version=DEVEL install cdrom lang en_US.UTF-8 keyboard us network --onboot no --device eth0 --bootproto dhcp --noipv6 network --onboot no --device eth1 --bootproto dhcp --noipv6 rootpw --iscrypted $6$mvUytse94ykQr0HT$Gj.4RS2zoe4ypdAYHDHh7.whdONC6b9UsbxKoTX.zLRg/fqwZETWO Ch7/gQOLlsOIAsX1AmVQbV/ylYl1X2bj1 firewall --service=ssh authconfig --enableshadow --passalgo=sha512 selinux --enforcing timezone Asia/Shanghai bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet" # The following is the partition information you requested # Note that any partitions you deleted are not expressed # here so unless you clear all partitions first, this is # not guaranteed to work #clearpart --none #part /boot --fstype=ext4 --asprimary --size=200 #part swap --asprimary --size=768 #part / --fstype=ext4 --grow --asprimary --size=200 repo --name="CentOS" --baseurl=cdrom:sr0 --cost=100 %packages @base @compat-libraries @core @debugging @development @server-policy @workstation-policy python-dmidecode sgpio device-mapper-persistent-data systemtap-client %end
1.7.3 ks.cfg详解
- 官网文档:(官网自带中文版,选一下语言即可)
CentOS5:
http://www.centos.org/docs/5/html/Installation_Guide-en-US/s1-kickstart2-options.html
CentOS6:
- cfg文件组成大致分为3段:
- 命令段
键盘类型,语言,安装方式等系统的配置,有必选项和可选项,如果缺少某项必选项,安装时会中断并提示用户选择此项的选项。
- 软件包段
在安装过程中默认安装的软件包,安装软件时会自动分析依赖关系。
%packages @groupname:指定安装的包组 package_name:指定安装的包 -package_name:指定不安装的包
- 脚本段(可选)
%pre:安装系统前执行的命令或脚本(由于只依赖于启动镜像,支持的命令很少) %post:安装系统后执行的命令或脚本(基本支持所有命令)
脚本段详细参数及说明:
关键字 | 含义 |
install | 告知安装程序,这是一次全新安装,而不是升级upgrade。 |
url --url=" " | 通过FTP或HTTP从远程服务器上的安装树中安装。
url --url="http://10.0.0.61/CentOS6.9/" url --url ftp://<username>:<password>@<server>/<dir> |
nfs | 从指定的NFS服务器安装。
nfs --server=nfsserver.example.com --dir=/tmp/install-tree |
text | 使用文本模式安装。 |
lang | 设置在安装过程中使用的语言以及系统的缺省语言。lang en_US.UTF-8 |
keyboard | 设置系统键盘类型。keyboard us |
zerombr | 清除mbr引导信息。 |
bootloader | 系统引导相关配置。
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet" --location=:指定引导记录被写入的位置.有效的值如下:mbr(缺省),partition(在包含内核的分区的第一个扇区安装引导装载程序)或none(不安装引导装载程序)。 --driveorder:指定在BIOS引导顺序中居首的驱动器。 --append=:指定内核参数.要指定多个参数,使用空格分隔它们。 |
network | 为通过网络的kickstart安装以及所安装的系统配置联网信息。
network --bootproto=dhcp --device=eth0 --onboot=yes --noipv6 --hostname=CentOS6 --bootproto=[dhcp/bootp/static]中的一种,缺省值是dhcp。bootp和dhcp被认为是相同的。 static方法要求在kickstart文件里输入所有的网络信息。 network --bootproto=static --ip=10.0.0.100 --netmask=255.255.255.0 --gateway=10.0.0.2 --nameserver=10.0.0.2 请注意所有配置信息都必须在一行上指定,不能使用反斜线来换行。 --ip=:要安装的机器的IP地址. --gateway=:IP地址格式的默认网关. --netmask=:安装的系统的子网掩码. --hostname=:安装的系统的主机名. --onboot=:是否在引导时启用该设备. --noipv6=:禁用此设备的IPv6. --nameserver=:配置dns解析. |
timezone | 设置系统时区。timezone --utc Asia/Shanghai |
authconfig | 系统认证信息。authconfig --enableshadow --passalgo=sha512
设置密码加密方式为sha512 启用shadow文件。 |
rootpw | root密码 |
clearpart | 清空分区。clearpart --all --initlabel
--all 从系统中清除所有分区,--initlable 初始化磁盘标签 |
part | 磁盘分区。
part /boot --fstype=ext4 --asprimary --size=200 part swap --size=1024 part / --fstype=ext4 --grow --asprimary --size=200 --fstype=:为分区设置文件系统类型.有效的类型为ext2,ext3,swap和vfat。 --asprimary:强迫把分区分配为主分区,否则提示分区失败。 --size=:以MB为单位的分区最小值.在此处指定一个整数值,如500.不要在数字后面加MB。 --grow:告诉分区使用所有可用空间(若有),或使用设置的最大值。 |
firstboot | 负责协助配置redhat一些重要的信息。
firstboot --disable |
selinux | 关闭selinux。selinux --disabled |
firewall | 关闭防火墙。firewall --disabled |
logging | 设置日志级别。logging --level=info |
reboot | 设定安装完成后重启,此选项必须存在,不然kickstart显示一条消息,并等待用户按任意键后才重新引导,也可以选择halt关机。 |
1.8 自动安装系统
1.8.1 编写ks文件
- 生成加密密码:
[root@m01 ~]# grub-crypt Password: 123456 Retype password: 123456 $6$Xy54SxwTn7HrxOOS$mqUS26uMEALTN2c3gfw0EF30kgXgAhO3GLcXPpvoiEIH71XF.JneKBtx1lHXmZ1CTw0Lmcg3LrvHqzZ87eEwy1
- 编写ks文件:
[root@m01 ~]# mkdir -p /var/www/html/ks_config [root@m01 ~]# vim /var/www/html/ks_config/CentOS6.9-ks.cfg # Kickstart Configurator for CentOS 6.9 by Leon install url --url="http://172.16.1.61/CentOS6.9/" text lang en_US.UTF-8 keyboard us zerombr bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet" network --bootproto=dhcp --device=eth1 --onboot=yes --noipv6 --hostname=kickstart timezone --utc Asia/Shanghai authconfig --enableshadow --passalgo=sha512 rootpw --iscrypted $6$Xy54SxwTn7HrxOOS$mqUS26uMEALTN2c3gfw0EF30kgXgAhO3GLcXPpvoiEIH71XF.JneK Btx1lHXmZ1CTw0Lmcg3LrvHqzZ87eEwy1 clearpart --all --initlabel part /boot --fstype=ext4 --asprimary --size=200 part swap --size=768 part / --fstype=ext4 --grow --asprimary --size=200 firstboot --disable selinux --disabled firewall --disabled logging --level=info reboot %packages @base @compat-libraries @debugging @development tree nmap sysstat lrzsz dos2unix telnet %post wget -O /tmp/optimization.sh http://172.16.1.61/ks_config/optimization.sh &>/dev/null /bin/sh /tmp/optimization.sh %end
1.8.2 编写开机优化脚本
[root@m01 ~]# vim /var/www/html/ks_config/optimization.sh #!/bin/bash ############################################################## # File Name: /var/www/html/ks_config/optimization.sh # Version: V1.0 # Author: Leon # Organization: www.Leonshadow.com # Created Time : 2017-10-06 # Description: Linux system initialization ############################################################## . /etc/init.d/functions Ip=172.16.1.61 Port=80 ConfigDir=ks_config # Judge Http server is ok PortNum=`nmap $Ip -p $Port 2>/dev/null|grep open|wc -l` [ $PortNum -lt 1 ] && { echo "Http server is bad!" exit 1 } # Defined result function function Msg(){ if [ $ -eq 0 ];then action "$1" /bin/true else action "$1" /bin/false fi } # Defined IP function function ConfigIP(){ Suffix=`ifconfig eth1|awk -F "[ .]+" 'NR==2 {print $6}'` cat >/etc/sysconfig/network-scripts/ifcfg-eth0 <<-END DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=none IPADDR=10.0.0.$Suffix PREFIX=24 GATEWAY=10.0.0.254 DNS1=10.0.0.254 DEFROUTE=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no NAME="System eth0" END Msg "config eth0" cat >/etc/sysconfig/network-scripts/ifcfg-eth1 <<-END DEVICE=eth1 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=none IPADDR=172.16.1.$Suffix PREFIX=24 DEFROUTE=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no NAME="System eth1" END Msg "config eth1" } # Defined Yum source Functions function yum(){ YumDir=/etc/yum.repos.d [ -f "$YumDir/CentOS-Base.repo" ] && cp $YumDir/CentOS-Base.repo{,.bak} wget -O $YumDir/CentOS-Base.repo http://$Ip:$Port/$ConfigDir/CentOS-Base.repo &>/dev/null &&\ wget -O $YumDir/epel.repo http://$Ip:$Port/$ConfigDir/epel.repo &>/dev/null &&\ Msg "YUM source" } # Defined add Ordinary users Functions function AddUser(){ useradd leon &>/dev/null &&\ echo "123456"|passwd --stdin oldboy &>/dev/null &&\ sed -i '98a leon ALL=(ALL) NOPASSWD:ALL' /etc/sudoers &&\ visudo -c &>/dev/null Msg "AddUser leon" } # Defined Hide the system version number Functions function HideVersion(){ [ -f "/etc/issue" ] && >/etc/issue Msg "Hide issue" [ -f "/etc/issue.net" ] && > /etc/issue.net Msg "Hide issue.net" } # Defined SSHD config Functions function sshd(){ SshdDir=/etc/ssh [ -f "$SshdDir/sshd_config" ] && /bin/mv $SshdDir/sshd_config{,.bak} wget -O $SshdDir/sshd_config http://$Ip:$Port/$ConfigDir/sshd_config &>/dev/null &&\ chmod 600 $SshdDir/sshd_config Msg "sshd config" } # Defined OPEN FILES Functions function openfiles(){ [ -f "/etc/security/limits.conf" ] && { echo '* - nofile 65535' >> /etc/security/limits.conf Msg "open files" } } # Defined Kernel parameters Functions function kernel(){ KernelDir=/etc [ -f "$KernelDir/sysctl.conf" ] && /bin/mv $KernelDir/sysctl.conf{,.bak} wget -O $KernelDir/sysctl.conf http://$Ip:$Port/$ConfigDir/sysctl.conf &>/dev/null Msg "Kernel config" } # Defined hosts file Functions function hosts(){ HostsDir=/etc [ -f "$HostsDir/hosts" ] && /bin/mv $HostsDir/hosts{,.bak} wget -O $HostsDir/hosts http://$Ip:$Port/$ConfigDir/hosts &>/dev/null Msg "Hosts config" } # Defined System Startup Services Functions function boot(){ for sername in `chkconfig --list|grep "3:on"|awk '{print $1}'|grep -vE "crond|network|rsyslog|sshd"` do chkconfig $sername off done Msg "BOOT config" } # Defined Time Synchronization Functions function Time(){ echo "#time sync by leon at $(date +%F)" >>/var/spool/cron/root echo '*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null' >>/var/spool/cron/root Msg "Time Synchronization" } # Defined main Functions function main(){ ConfigIP yum #AddUser HideVersion #sshd openfiles kernel hosts boot Time }
1.8.3 开始自动安装
开机即可,以下为自动安装过程中的若干截图:
1.8.4 查看安装结果
