[RH134] 1-kickstart无人值守
一、部署pxe服务器
1.kickstart是什么
kickstart用于pxe安装系统,可以实现无人值守。
要使用kickstart,需要满足以下几个条件:
- 在服务器上提供一个DHCP服务器
- 在服务器上提供一个tftp服务器
- 提供tftp服务器提供RHEL7引导程序pxelinux.0、内核vmlinuz以及initrd文件。
2.部署DHCP服务
1)保证一个网络中最多只存在一个DHCP服务。例如虚拟机在NAT网络下,需要关闭NAT网络的DHCP功能。如果是处于物理局域网,则关闭路由器的DHCP功能。
2)使用yum安装dhcp
yum install dhcp -y
3)修改DHCP配置文件
查看dhcp有哪些配置文件:
[root@centos7 ~]# rpm -qc dhcp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd6.conf /etc/openldap/schema/dhcp.schema /etc/sysconfig/dhcpd /var/lib/dhcpd/dhcpd.leases /var/lib/dhcpd/dhcpd6.leases
可以看到,第一条 /etc/dhcp/dhcpd.conf 就是dhcp的配置文件,将其打开:
[root@centos7 ~]# vi /etc/dhcp/dhcpd.conf # # DHCP Server Configuration file. # see /usr/share/doc/dhcp*/dhcpd.conf.example # see dhcpd.conf(5) man page #
可以看到,dhcpd.conf是空的,需要 /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example 中的配置文件模板。我们将其内容复制过来:
cat /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example > /etc/dhcp/dhcpd.conf
此时,我们修改配置文件的内容,只保留其中一部分,如下所示:
# A slightly different configuration for an internal subnet. subnet 10.5.5.0 netmask 255.255.255.224 { range 10.5.5.26 10.5.5.30; option domain-name-servers ns1.internal.example.org; option domain-name "internal.example.org"; option routers 10.5.5.1; option broadcast-address 10.5.5.31; default-lease-time 600; max-lease-time 7200; }
对其进行修改:
# A slightly different configuration for an internal subnet. subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.200 192.168.1.250; option domain-name-servers 192.168.1.1; option domain-name "leo.example.org"; option routers 192.168.1.1; option broadcast-address 192.168.1.255; default-lease-time 600; max-lease-time 7200; }
subnet:dhcp分配的网段 netmask:掩码 range:ip地址池,即dhcp在这个范围内分配ip地址 routers:网关地址 broadcast-address:广播地址 default-lease-time:默认租约时间,10分钟 max-lease-time:最大租约时间,2小时
我们在dhcp中除了要分配ip地址,还要告诉客户机他需要获取什么文件,例如pxelinux.0引导文件:
# A slightly different configuration for an internal subnet. subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.200 192.168.1.250; option domain-name-servers 192.168.1.1; option domain-name "leo.example.org"; option routers 192.168.1.1; option broadcast-address 192.168.1.255; default-lease-time 600; max-lease-time 7200; filename "/pxelinux.0"; }
注意,别忘记最后的分号。"/pxelinux.0"中的"/"不是代表linux服务器的根目录,而是代表tftp服务的根目录。pxelinux.0中是"0"不是"o"。
配置完毕后,重启dhcp服务:
systemctl restart dhcpd # 重启dhcpd服务 systemctl is-active dhcpd # 查看运行状态 systemctl enable dhcpd # 设置开机启动
主要,我们要在这里设置一下selinux和防火墙:
# 查看selinux是否启用 getenforce # 如果是Enforcing # 关闭selinux setenforce 0
# 忽略防火墙
firewall-cmd --set-default-zone-trusted
3.部署tftp
1)安装tftp-server:
yum install tftp-server -y
2)找到tftp的根目录:
cd /var/lib/tftpboot/
在前面dhcpd.conf中配置的"/pxelinux.0"中的根,就是指这个目录。
3)此时,我们要将pxelinux.0文件复制到该tftp根目录下,首先看以下pxelinux.0文件在哪里:
[root@centos7 tftpboot]# yum whatprovides */pxelinux.0 Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com docker-ce-stable/x86_64/filelists_db | 19 kB 00:00:00 epel/x86_64/filelists_db | 11 MB 00:00:00 extras/7/x86_64/filelists_db | 216 kB 00:00:00 updates/7/x86_64/filelists_db | 4.4 MB 00:00:00 syslinux-4.05-15.el7.x86_64 : Simple kernel loader which boots from a FAT filesystem Repo : base Matched from: Filename : /usr/share/syslinux/pxelinux.0 syslinux-tftpboot-4.05-15.el7.noarch : SYSLINUX modules in /var/lib/tftpboot, available for network booting Repo : base Matched from: Filename : /var/lib/tftpboot/pxelinux.0
我们发现,syslinux软件和syslinux-tftpboot都可以提供pxelinux.0,我们任选一个安装,然后在对应的目录下可以找到pxelinux.0。如果安装syslinux-tftpboot,则直接会在我们的tftpboot下生成pxelinux.0。
安装syslinux-tftpboot:
yum install syslinux-tftpboot -y
安装完毕后,我们在/var/lib/tftpboot中可以看到生成了很多文件,其中包含pxelinux.0引导文件:
[root@centos7 tftpboot]# ls cat.c32 config.c32 disk.c32 ethersel.c32 gpxelinux.0 ifcpu64.c32 int18.com ls.c32 memdisk menu.c32 poweroff.com pxelinux.0 sanboot.c32 ver.com vpdtest.c32 chain.c32 cpuid.c32 dmitest.c32 gfxboot.c32 hdt.c32 ifcpu.c32 kbdmap.c32 lua.c32 memdump.com pcitest.c32 pwd.c32 reboot.c32 sdi.c32 vesainfo.c32 whichsys.c32 cmd.c32 cpuidtest.c32 elf.c32 gpxecmd.c32 host.c32 ifplop.c32 linux.c32 mboot.c32 meminfo.c32 pmload.c32 pxechain.com rosh.c32 sysdump.c32 vesamenu.c32 zzjson.c32
4)由于pxelinux.0引导文件要引导linux内核,还需要vmlinuz和initrd文件,我们从RHEL7的光盘镜像中拷(假设镜像光盘已经挂载到了/mnt目录):
cd /mnt/images/pxeboot cp vmlinuz initrd.img /var/lib/tftpboot/
注意,这里的vmlinuz和initrd.img的名字可以是任意的,我们自己指定,但需要在后面拷贝的pxelinux.cfg中去配置。
5)虽然我们已经将vmlinuz和initrd.img都拷贝到了tftpboot目录,但是客户机使用pxelinux.0初始化的时候,不知道去哪个目录下找vmlinuz和initrd.img,所以我们还需要创建一个配置文件来告诉pxelinux.0从哪里找文件:
首先,在/var/lib/tftpboot中创建一个存放配置文件的文件夹:
cd /var/lib/tftpboot/
mkdir pxelinux.cfg
然后从光盘中拷贝配置文件:
cp /mnt/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default # 将配置文件拷贝到pxelinux.cfg目录下,并命名为default chmod u+x /var/lib/tftpboot/pxelinux.cfg/default # 添加运行权限
6)另外,我们可以再顺便拷贝一个文件boot.msg(美化装逼用的,不是必须的):
cp /mnt/isolinux/boot.msg /var/lib/tftpboot/ # 顺便拷贝boot.msg到tftpboot目录 chmod u+x /var/lib/tftpboot/pxelinux.cfg/default # 添加权限
7)拷贝pxelinux.cfg为default之后,我们要对其进行修改
# 第一行的default修改为后面的一个label名字,作为默认安装的label,例如centos7 # default vesamenu.c32 default centos7 # 默认选择时间,超时就使用默认label安装 timeout 600 # 如果需要让用户输入label名字来选择安装哪个系统,就添加prompt 1这个配置项 prompt 1 # 按boot.msg中的内容来提示用户,我们可以修改其中的内容,让其看起来更高大上,例如使用figlet生成RHEL的图标等 display boot.msg
label centos7 menu label ^Install CentOS 7 kernel vmlinuz append initrd=initrd.img inst.repo=ftp://192.168.1.16/dvd quiet
找到default中以上部分内容,kickstart同时支持多种系统的安装,每种系统,用一个label来配置。
label后的centos7即名字(我们任意指定) menu label用于指定界面显示的信息(供我们选择的菜单) kernel指定为tftpboot目录下的vmlinuz(默认在tftpboot根目录下查找,也可以指定目录,例如/kernel/vmlinuz) append的initrd指定根目录下的initrd.img(默认也是在根目录下查找,修改目录/initrd/initrd.img) inst.repo表示我们从一个仓库中去获取其他需要的文件,这里我们需要指定一个ftp服务器地址(在后面章节中部署),将centos7的dvd光盘内容挂载到其中
注意:vmlinuz和initrd.img的名字和配置文件中的名字对应起来即可。
8)为了让其提示更好看,我们修改以下boot.msg内容(前提是配置了prompt 1这个配置项,否则无法提供输入label名选择功能)
[root@centos7 tftpboot]# vim boot.msg ^L ^Xsplash.lss - Press the ^O01<ENTER>^O07 key to begin the installation process. --Input the label name to select a system to be installed. eg. "centos7" Label list: -- centos7 -- centos6 -- rhel7
在安装时,可以看到以下效果:
我们在该界面输入"centos7"即可开始引导centos7系统安装过程。这里输入的内容对应的是default配置文件中的label名。
为了让boot.msg的提示看起来更好看,我们可以使用figlet工具生成一个图标:
安装figlet:
yum install figlet -y
生成一个图标:
[root@centos7 tftpboot]# figlet LEO-INSTALL _ _____ ___ ___ _ _ ____ _____ _ _ _ | | | ____/ _ \ |_ _| \ | / ___|_ _|/ \ | | | | | | | _|| | | |_____| || \| \___ \ | | / _ \ | | | | | |___| |__| |_| |_____| || |\ |___) || |/ ___ \| |___| |___ |_____|_____\___/ |___|_| \_|____/ |_/_/ \_\_____|_____|
我们将图标复制到boot.msg中,可以在安装过程中看到以下效果:
9)启动tftp
systemctl start tftp
systemctl enable tftp
4.部署ftp服务器,发布光盘内容
1)安装vsftpd
yum install vsftpd -y
2)将光盘内容拷贝到/var/ftp/dvd/中
mkdir /var/ftp/dvd cp -r /mnt/* /var/ftp/dvd/
3)启动vsftpd服务器
systemctl start vsftpd
4)查看是否正常
5.测试是否能够通过pxe安装系统
在前面4节的配置完毕后,保证所有的服务都处于启动状态,例如tftp、vsftpd、dhcp。
我们创建一个虚拟机,将其网络与我们的pxe服务器处于同一个网络(前提是关闭物理路由器的dhcp服务)。
启动虚拟机,从网络引导安装系统:
可以看到,我们部署的服务能够正常工作。但当前情况下的安装过程还需要人为操作,例如选择系统语言,时间,磁盘等,在后续的操作中,我们将实现自动无人值守的安装配置。
二、实现无人值守安装系统
1.安装system-config-kickstart软件
yum install system-config-kickstart -y
这是一个图形化的软件,需要我们的服务器有图形界面。
2.使用system-config-kickstart来配置"应答文件"
system-config-kickstart & # 启动system-config-kickstart软件
1)基本配置
2)安装方法
3)引导选项
4)分区
5)网络配置(随便配置一个eth0就可以了)
6)安装后执行脚本(用于自定义一些操作,例如完成国内yum源的设置)
除了以上的配置,其他默认即可。
3.保存我们配置好的信息
保存好的文件默认叫 ks.cfg ,我们将其放在/root下,如果我们要进行修改,也可以直接修改ks.cfg文件中的对应内容。
4.将ks.cfg通过ftp发布出去
将ks.cfg拷贝到ftp的根目录下:
cp ~/ks.cfg /var/ftp
由于我们的光盘repo地址为ftp://192.168.1.16/dvd,在ks.cfg中也有对应的信息,所以我们要修改/var/lib/tftpboot/pxelinux.cfg/default配置文件:
label centos7 menu label ^Install CentOS 7 kernel vmlinuz append initrd=initrd.img inst.ks=ftp://192.168.1.16/ks.cfg quiet
我们将之前的 inst.repo=ftp://192.168.1.16/dvd 修改为 inst.ks=ftp://192.168.1.16/ks.cfg (ks.cfg中包含了镜像文件目录的URL)。
5.为ks.cfg添加软件包列表
由于在安装linux的时候,可以在安装过程中选择需要安装的软件包,在ks.cfg中也应该添加对应的软件包列表:
[root@centos7 ftp]# vim ks.cfg @base #platform=x86, AMD64, or Intel EM64T #version=DEVEL # Install OS instead of upgrade install # Keyboard layouts keyboard 'us' # Root password rootpw --iscrypted $1$3KO9G/fO$62D0gTT.vr3Li1FoyG2Hs1 # System language lang en_US # System authorization information auth --useshadow --passalgo=sha512 # Use graphical install graphical firstboot --disable # SELinux configuration selinux --enforcing # Firewall configuration firewall --disabled # Network information network --bootproto=dhcp --device=eth0 # Reboot after installation reboot # System timezone timezone Asia/Shanghai # Use network installation url --url="ftp://192.168.1.16/dvd" # System bootloader configuration bootloader --location=mbr # Clear the Master Boot Record zerombr # Partition clearing information clearpart --all --initlabel # Disk partitioning information part / --fstype="xfs" --size=10000 part swap --fstype="swap" --size=2000 %packages # @base # @core # other packages %end %post useradd leo echo 52myself | passwd --stdin leo yum install net-tools -y ip=`ifconfig eno16777728 | awk '/inet /{print $2}' | awk -F. '{print $4}'` hostnamectl set-hostname $ip.leeoo.com %end
我们在ks.cfg中添加%packages部分(必须要添加,空的也行,否则系统安装过程会卡在选择软件包的图形界面)。如果使用的dvd是mini版本的,则%packages为空即可(mini版的光盘没有带任何软件),否则指定的包如果在dvd中找不到,则会卡住。
6.测试kickstart无人值守安装
以上进行了所有必须的配置,现在进行测试,使用一个全新的虚拟机来进行测试。
我们去除default配置文件中的 prompt 1 ,或者设置为 prompt 0 。安装一开始就无需我们输入选择的label(即选择安装哪个系统),而直接使用默认label(实验中使用的是centos7)。
安装过程能够全部自动进行选择,例如语言、键盘、磁盘、时区等,然后自动开始安装系统。并在安装完毕后能够自动重启。
这里特别注意:我们应该把客户机的启动顺序设置为 IDE>网络pxe,否则在系统安装完毕后,会继续进入pxe安装流程,形成无限重新安装。
7.验证安装完毕后脚本是否执行
1)leo用户创建成功
2)net-tools工具安装成功(ifconfig命令可使用)
3)主机名没有设置成功,因为网卡名搞错误,我们在脚本中写的是eno16777728,而实际的网卡名是 enp0s10f0 ,所以脚本没有获取到ip地址,当然主机名也没设置成功。(所以,在设置安装完后运行的脚本时,一定要保证脚本的正确性和通用性)
至此,kickstart无人值守安装系统的服务器配置就结束了。如果需要更个性化的定制自动化安装的系统,可以研究修改boot.msg以及ks.cfg。
====