背景
为什么会有这么一篇日志?是因为我工作中遇到了一键头疼的事情,要给几十个服务起器系统,对于我这用懒人肯定不可能老实的一台一台用光盘慢慢装,正好有这么一个东西 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 就可以从网络启动安装系统了。
有幸访问到贵站,“百万链”期待你的加入!
技术流 感觉好厉害啊
OωO,工作内容就是这样。。。