背景

为什么会有这么一篇日志?是因为我工作中遇到了一键头疼的事情,要给几十个服务起器系统,对于我这用懒人肯定不可能老实的一台一台用光盘慢慢装,正好有这么一个东西 Kickstart,简直为懒人而生啊。

本文参考自参考RHEL官方文档
1.《26.2. How Do You Perform a Kickstart Installation?
2.《Chapter 23. Preparing for a Network Installation

i> PS:以下代码框中#开头的为必须以root用户执行的命令,$开头的命令所有用户都可以执行

如何使用 Kickstart 安装系统

Kickstart 安装支持DVD、本地硬盘、NFS、FTP、HTTP、HTTPS等方式进行安装。

编写 Kickstart 配置文件

使用 Kickstart 安装 CentOS 首先当然要编写一个 Kickstart的配置文件, 该配置文件的语法可以参考《Section 26.3, “Kickstart Syntax Reference”》。

不过其实每次安装RHEL/CentOS后都会在/root目录下生成一个anaconda-ks.cfg,所以最好的方式就是按照要求装一个系统,这样你就可以获得一份不需要怎么修改 Kickstart 配置文件。

还有一种方式就是使用 Kickstart Configuration Tool 来创建和修改 Kickstart 配置文件。

  • # yum install system-config-kickstart # 安装Kickstart Configuration Tool
  • # system-config-kickstart # 启动 Kickstart Configuration Tool
复制

验证 Kickstart 验证配置文件

在 RHEL7/CentOS7 中可以使用ksvalidator来验证 Kickstart 配置文件的语法

  • # yum install pykickstart
  • $ ksvalidator /path/to/kickstart.ks
复制

Kickstart 配置文件参考

我这次安装操作系统需求是两个600G SAS 盘做raid1装系统,剩下的盘分别挂载到data[0-12]目录下,有个黑点就是开发的指定了要 ext4 文件系统。
服务器的IP为172.16.105.100。
以下配置文件仅供参考。

  • # 安装模式(install/upgade)
  • install
  • # X 窗口配置
  • # xconfig --startxonboot
  • # 键盘类型
  • # old format: keyboard us
  • # new format:
  • keyboard --vckeymap=us --xlayouts='us'
  • # Root 密码:root123
  • rootpw --iscrypted $1$KlgovCmb$ri43YxQzAPy/OR7W7bU7Q0
  • # 网络安装源
  • url --url="http://172.16.105.100/CentOS/7/repo"
  • # 系统语言
  • lang en_US --addsupport=zh_CN.UTF-8
  • # 用户协议
  • eula --agreed
  • # 密码加密方式
  • auth --useshadow --passalgo=sha512
  • # 安装界面(图形化/文本)
  • graphical
  • # 首次启动想向导
  • firstboot --disable
  • # SELinux 配置
  • selinux --disabled
  • # 系统服务器配置
  • services --disabled="chronyd"
  • # Firewall configuration
  • firewall --disabled
  • # 网络配置
  • # network --bootproto=static --device=em1 --gateway=172.16.13.254 --ip=172.16.13.100 --netmask=255.255.255.0
  • %include /tmp/network.txt
  • # 安装后重启
  • reboot
  • # 系统时区
  • timezone Asia/Shanghai --nontp
  • # bootloader 配置
  • zerombr
  • bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
  • # 分区 --grow 参数就是占用当前硬盘剩下所有空间
  • clearpart --all --initlabel
  • part /boot --fstype="ext4" --ondisk=sda --size=1024
  • part pv.301 --fstype="lvmpv" --ondisk=sda --size=20480 --grow
  • volgroup centos --pesize=4096 pv.301
  • logvol swap --fstype="swap" --size=131072 --name=swap --vgname=centos
  • logvol / --fstype="ext4" --size=10240 --name=root --vgname=centos --grow
  • part /data --fstype="ext4" --ondisk=sdb --size=1024 --grow
  • part /data1 --fstype="ext4" --ondisk=sdc --size=1024 --grow
  • part /data2 --fstype="ext4" --ondisk=sdd --size=1024 --grow
  • part /data3 --fstype="ext4" --ondisk=sde --size=1024 --grow
  • part /data4 --fstype="ext4" --ondisk=sdf --size=1024 --grow
  • part /data5 --fstype="ext4" --ondisk=sdg --size=1024 --grow
  • part /data6 --fstype="ext4" --ondisk=sdh --size=1024 --grow
  • part /data7 --fstype="ext4" --ondisk=sdi --size=1024 --grow
  • part /data8 --fstype="ext4" --ondisk=sdj --size=1024 --grow
  • part /data9 --fstype="ext4" --ondisk=sdk --size=1024 --grow
  • part /data10 --fstype="ext4" --ondisk=sdl --size=1024 --grow
  • part /data11 --fstype="ext4" --ondisk=sdm --size=1024 --grow
  • # 软件包 可以是组名(@开头)或者包名
  • %packages
  • @^infrastructure-server-environment
  • @base
  • @compat-libraries
  • @core
  • @development
  • @large-systems
  • @performance
  • chrony
  • lrzsz
  • kexec-tools
  • %end
  • # 安装前脚本,配置网卡绑定
  • %pre
  • VAL_IP=$(ifconfig enp7s0f0 | grep "inet" | grep -v : | awk -F' ' '{print $2}')
  • HOSTNAME=$(echo $VAL_IP | awk -F. '{print $4}')
  • echo "network --device=bond0 --noipv6 --bootproto=static --onboot=yes --ip=${VAL_IP} --netmask=255.255.255.0 --bondslaves=enp7s0f0,enp7s0f1 --bondopts=mode=active-backup,primary=enp7s0f0,miimon=80,updelay=60000" > /tmp/network.txt
  • echo "network --hostname=server-${HOSTNAME}" >> /tmp/network.txt
  • %end
  • # 安装后脚本
  • %post
  • VAL_IP=$(ifconfig enp7s0f0 | grep "inet" | grep -v : | awk -F' ' '{print $2}')
  • HOSTNAME=$(echo $VAL_IP | awk -F. '{print $4}')
  • echo "$VAL_IP $HOSTNAME" >> /etc/hosts
  • mkdir -p /data/repo
  • mkdir -p /data/yumbak
  • /usr/bin/wget http://172.16.105.100/CentOS/7/CentOS-7-x86_64-Everything-1708.iso -O /data/CentOS-7-x86_64-Everything-1708.iso
  • echo '/data/CentOS-7-x86_64-Everything-1708.iso /data/repo iso9660 defaults,ro,loop 0 0' >> /etc/fstab
  • mv /etc/yum.repos.d/* /data/yumbak
  • cat > /etc/yum.repos.d/CentOS-Local.repo <<EOF
  • [DVD]
  • name=CentOS 7.4 Everything DVD
  • baseurl=file:///data/repo/
  • enabled=1
  • gpgcheck=1
  • gpgkey=file:///data/repo/RPM-GPG-KEY-CentOS-7
  • EOF
  • %end
  • # 其他
  • %addon com_redhat_kdump --disable --reserve-mb='auto'
  • %end
复制

配置 Kickstart 安装源

前面说过,Kickstart 安装支持DVD、本地硬盘、NFS、FTP、HTTP、HTTPS等方式进行安装。
为了懒到彻底,肯定只能选网络方式安装,而我选择HTTP方式。

搭建 yum 源

使用 apache 搭建 yum 源是因为光盘里就有 httpd 的安装包。

  • # yum install httpd
  • # systemctl enable httpd
  • # systemctl start httpd
  • # mkdir -p /var/www/html/CentOS/7/repo
  • # mount -r /data/CentOS-7-x86_64-Everything-1708.iso /var/www/html/CentOS/7/repo
复制

搭建 PXE 网络启动服务器

有了 yum 源还不够,你得让你的服务知道怎么获取 Kickstart 配置文件才能装系统是不!
搭建 PXE 网络启动服务器有几个关键的东西dhcp服务、tftp服务和启动镜像

搭建 tftp 服务

  • # yum install tftp-server
  • # systemctl enable tftp
  • # systemctl start tftp
复制

理论上还要开放防火墙端口啊,不过我们一般的习惯都是关防火墙关selinux。

  • # firewall-cmd --add-service=tftp
复制

配置 dhcp 服务

为啥装 dhcp 服务?你网络启动的时候注意一下,你没有可以配置网络的地方,只能 dhcp 获取 IP。

  • # yum install dhcp
  • # vi /etc/dhcp/dhcpd.conf
  • option space pxelinux;
  • option pxelinux.magic code 208 = string;
  • option pxelinux.configfile code 209 = text;
  • option pxelinux.pathprefix code 210 = text;
  • option pxelinux.reboottime code 211 = unsigned integer 32;
  • option architecture-type code 93 = unsigned integer 16;
  • subnet 172.16.105.0 netmask 255.255.255.0 {
  • range 172.16.105.100 172.16.105.130;
  • option routers 172.16.105.200;
  • class "pxeclients" {
  • match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
  • next-server 172.16.105.100;
  • if option architecture-type = 00:07 {
  • filename "uefi/shim.efi";
  • } else {
  • filename "pxelinux/pxelinux.0";
  • }
  • }
  • }
  • # systemctl start dhcpd
  • # systemctl enable dhcpd
复制
filename 是核心启动文件
net-server 是 tftp 服务器 ip

配置 PXE 核心启动文件

pxelinux.0在 syslinux 的包里有,安装一个就能提取了。pxelinux.0对标的是bios(Legacy)方式启动,我没有做UEFI启动的尝试。

  • # yum install syslinux
  • # tftp 默认目录为 /var/lib/tftpboot
  • # mkdir -p /var/lib/tftpboot/pxelinux
  • # cp /usr/src/syslinux/pxelinux.0 /var/lib/tftpboot/pxelinux
复制

创建 PXE 启动菜单

inst.ks 用于指定 Kickstart 配置文件
inst.repo 用于指定软件包安装源
kernel 指定内核
append 附加参数
  • # mkdir /var/lib/tftpboot/pxelinux/pxelinux.cfg
  • # vi /var/lib/tftpboot/pxelinux/pxelinux.cfg/default
  • default vesamenu.c32
  • prompt 1
  • font myfont.psf
  • menu clear
  • menu background background.png
  • menu title PXE
  • menu vshift 8
  • menu rows 18
  • menu margin 8
  • menu helpmsgrow 15
  • menu tabmsgrow 13
  • menu color border * #00000000 #00000000 none
  • menu color sel 0 #ffffffff #00000000 none
  • menu color title 0 #ff7ba3d0 #00000000 none
  • menu color tabmsg 0 #ff3a6496 #00000000 none
  • menu color unsel 0 #84b8ffff #00000000 none
  • menu color hotsel 0 #84b8ffff #00000000 none
  • menu color hotkey 0 #ffffffff #00000000 none
  • menu color help 0 #ffffffff #00000000 none
  • menu color scrollbar 0 #ffffffff #ff355594 none
  • menu color timeout 0 #ffffffff #00000000 none
  • menu color timeout_msg 0 #ffffffff #00000000 none
  • menu color cmdmark 0 #84b8ffff #00000000 none
  • menu color cmdline 0 #ffffffff #00000000 none
  • menu separator
  • menu separator
  • timeout 100
  • label 1
  • menu label ^1)Install CentOS7 x86_64(KickStart)
  • kernel images/CentOS/7/vmlinuz
  • append initrd=images/CentOS/7/initrd.img inst.ks=http://172.16.105.100/CentOS/7/ks.cfg ksdevice= inst.repo=http://172.16.105.100/CentOS/7/repo
  • label 2
  • menu label ^2)Install CentOS7 x86_64(Manual)
  • kernel images/CentOS/7/vmlinuz
  • append initrd=images/CentOS/7/initrd.img ksdevice= inst.repo=http://172.16.105.100/CentOS/7/rep
复制

准备 CentOS 核心启动文件

默认启动菜单指定了内核文件,但是你没有的话是无法正常启动的。
vmlinuz,initrd.img在安装光盘上有。

  • # mkdir -p /var/lib/tftpboot/pxelinux/CentOS/7/
  • # cp /path_to_x86_64_images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/images/CentOS/7/
复制

开始安装

需要网络安装系统的机器和这个机器接入无 DHCP 的 VLAN 就可以从网络启动安装系统了。