背景

为什么会有这么一篇日志?是因为我工作中遇到了一键头疼的事情,要给几十个服务起器系统,对于我这用懒人肯定不可能老实的一台一台用光盘慢慢装,正好有这么一个东西 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 就可以从网络启动安装系统了。