Centos 8 kickstart四, 13/08/2020 - 18:28 的修訂版本


最後更新: 2020-08-04


Anaconda is a free and open-source system installer for Linux distributions.

It is mainly written in Python with some modules written in C.




After the installation completes, all choices made during the installation are saved into a file named anaconda-ks.cfg


Verify tools

yum install pykickstart

ksvalidator /path/to/kickstart.ks



To load your Kickstart file automatically without having to specify the "inst.ks=" boot option

file ks.cfg and place it on a storage volume labeled OEMDRV

ls cd


genisoimage -V OEMDRV -o ks.iso cd




Sections must be specified in order. Items within the sections do not have to be in a specific order unless otherwise specified.


Syntax Reference


---- Disk ----

ignoredisk (optional)

Causes the installation program to ignore the specified disks.

--only-use - Specifies a list of disks for the installation program to use. All other disks are ignored.

                  用唔到, 因為唔知會係 sda 還是 vda


ignoredisk --only-use=vda

clearpart (optional)

Removes partitions from the system, prior to creation of new partitions. By default, no partitions are removed.

--none (default) - Do not remove any partitions.

--initlabel - Initializes a disk (or disks) by creating a default disk label for ALL disks

                 in their respective architecture that have been designated for formatting (for example, msdos for x86).

--disklabel=LABEL  # msdos / gpt


Erases all partitions from the system.

This option will erase all disks which can be reached by the installer, including any attached network storage.

autopart (optional)

Automatically creates partitions:

  • a root (/) partition (1 GB or larger),
  • a swap partition, and
  • an appropriate /boot partition for the architecture.
  • On large enough drives (50 GB and larger), this also creates a /home partition.

The autopart option cannot be used together with the part/partition, raid, logvol, or volgroup


# type: lvm, btrfs, plain, thinp

# plain: Regular partitions with no LVM or Btrfs

autopart --type=plain --nohome


要配合 clearpart 使用

part (optional)


part|partition mntpoint --name=name --device=device --rule=rule [options]


part /boot --fstype="xfs" --size=200 --label="boot" --ondisk=vda
part biosboot --fstype="biosboot" --size=1 --ondisk=vda
part /boot/efi --fstype="xfs" --size=200 --label="efi" --ondisk=vda
part swap --fstype="swap" --size=2000 --label="swap" --ondisk=vda
part / --fstype="xfs" --size=2000 --label="centos8-root" --ondisk=vda



pv.id              The partition is used for LVM

raid.id            The partition is used for software RAID


The partition is used as swap space.

# To determine the size of the swap partition automatically

swap --recommended


# The partition will be used for a BIOS Boot partition.

# A 1 MiB BIOS boot partition is necessary on BIOS-based AMD64 and Intel 64 systems using a GUID Partition Table (GPT);

# the boot loader will be installed into it. It is not necessary on UEFI systems.


# An EFI System Partition.

# A 50 MiB EFI partition is necessary on UEFI-based AMD, Intel, and ARM; the recommended size is 200 MiB.

# It is not necessary on BIOS systems. See also the bootloader command.

Other Opts


assign a label to an individual partition.

--ondisk= or --ondrive=

Forces the partition to be created on a particular disk.


用了 ignoredisk 就不用 "--ondisk=vda" 了

要配合 clearpart 使用



part pv.01 --size 1 --grow
volgroup centos pv.01
logvol / --vgname=centos --fstype=xfs --name=root --percent=90


Tells the logical volume to grow to fill available space (if any), or up to the maximum size setting,

if one is specified. A minimum size must be given, using either the --percent= option or the --size= option.


The size of the logical volume, as a percentage of the free space in the volume group after any statically-sized logical volumes are taken into account.

This option cannot be used together with the --size= option.


* Do not use the dash (-) character in logical volume name

zerombr (optional)

Reinitialize Partition Tables

If zerombr is specified, any invalid partition tables found on disks are initialized.


bootloader (required)

mbr - The default option.

Depends on whether the drive uses the Master Boot Record (MBR) or GUID Partition Table (GPT) scheme:

  •  On a GPT-formatted disk, this option will install stage 1.5 of the boot loader into the BIOS boot partition.
  •  On an MBR-formatted disk, stage 1.5 will be installed into the empty space between the MBR and the first partition.


bootloader --location=mbr

eula (optional)

Use this option to accept the End User License Agreement (EULA) without user interaction.

eula --agreed




Determine whether the Initial Setup application starts the first time the system is booted.

If enabled, the "initial-setup" package must be installed.


UI: graphical(default), text, or cmdline

graphical (optional)

Perform the installation in graphical mode.

text (optional)

Perform the Kickstart installation in text mode.

cmdline (optional)

Perform the installation in a completely non-interactive command line mode.

Any prompt for interaction halts the installation.


Install (optional)

You must specify the type of installation from cdrom, harddrive, nfs, liveimg, or url


%addon com_redhat_kdump (optional)

%addon com_redhat_kdump --disable --reserve-mb='auto'

keyboard (required)

keyboard --vckeymap=us --xlayouts='us'

lang (required)

lang en_US.UTF-8

network (optional)

network  --bootproto=dhcp --device=ens4 --nameserver=, --noipv6 --activate

network  --hostname=c8

network --bootproto=static --ip= --gateway= --netmask= --nameserver=


specifies the device to be configured

If the --device= option is missing on the first use of the network command,

the value of the ksdevice= Anaconda boot option is used, if available.

part or partition (optional)

Creates a partition on the system.

# Device names in the sdX (or /dev/sdX) format are not guaranteed to be consistent across reboots

part / --fstype=xfs --onpart=sda1

# 所以要用

part / --fstype=xfs --onpart=/dev/disk/by-path/pci-0000:00:05.0-scsi-0:0:0:0-part1


part / --fstype=xfs --onpart=/dev/disk/by-id/ata-ST3160815AS_6RA0C882-part1

Other Opts

--label= - assign a label to an individual partition.

reboot (optional)

Normally, Kickstart displays a message and waits for the user to press a key before rebooting.

reboot --eject

reboot --kexec        # 唔 work

rootpw (required)

Sets the system 's root password to the password argument.

rootpw --plaintext xxxx

selinux (optional)

selinux --disabled

services (optional)

services --disabled="chronyd"

timezone (required)


# --nontp - Disable the NTP service automatic starting.

timezone Asia/Hong_Kong --isUtc --nontp

timezone --ntpservers=stdtime.gov.hk

user (optional)

Creates a new user on the system.

vnc (optional)

Allows the graphical installation to be viewed remotely through VNC.

skipx (optional)

If present, X is not configured on the installed system.


自動安裝 Package


repo (optional)

Configures additional yum repositories that can be used as sources for package installation.


repo --name="Minimal" --baseurl=file:///run/install/repo/MyPackage


Kickstart ISO Path: CD 的 "/" => "/run/install/repo"

Package Selection

# Specifying Individual Packages

 * 當 repo 沒有此 package 時就會 error


More Info.



Custom ISO


mkdir -p /home/myiso/unzip

cd /home/myiso/unzip

7z x /path/to/CentOS-8.2.2004-x86_64-minimal.iso -o.

cp ~/anaconda-ks.cfg /ks.cfg

yum install -y pykickstart

ksvalidator ~/ks.cfg

Add label to isolinux/isolinux.cfg

label Kickstart
menu label Kickstart
menu default
kernel vmlinuz
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS8_x86_64 inst.ks=cdrom:/dev/cdrom:/ks.cfg net.ifnames=0 biosdevname=0

Build ISO

genisoimage -o ../centos8-custom.iso \
-boot-load-size 4 -boot-info-table -J -r -R -T \
-V 'CentOS8_x86_64' \
-no-emul-boot -b isolinux/isolinux.bin -c isolinux/boot.cat \
-eltorito-alt-boot  \
-no-emul-boot -eltorito-boot images/efiboot.img ./




  • %pre ... %end
  • %post ... %end



The post-install script is run in a chroot environment, therefore, performing tasks such as copying scripts or

RPM packages from the installation media do not work by default.


  • CD 的 '/'        /run/install/repo
  • SYS 的 '/'       /mnt/sysimage


Default: bash

%post --interpreter=/usr/bin/python
--- Python script omitted --


Display an error and halt the installation if the script fails.

The error message will direct you to where the cause of the failure is logged.

Copy file to new system

%post --nochroot
cd /mnt/sysimage
cp /run/install/repo/files/.screenrc root
cp /run/install/repo/files/.vimrc    root
rm -f root/anaconda-ks.cfg root/original-ks.cfg


# Determine disk type for clearpart on kickstarts (sda / sdb)

# ----- partitioning logic below -----

# ... root-disk-selection.sh 的內容

cat <<EOF>/tmp/drive-selection
ignoredisk --only-use=${ROOTDRIVE}
clearpart --none --initlabel

part /boot --fstype="xfs" --size=200 --label="boot"
part biosboot --fstype="biosboot" --size=1
part /boot/efi --fstype="xfs" --size=200 --label="efi"
part pv.01 --size 2000 --grow
volgroup centos pv.01
logvol swap --vgname=centos --fstype=swap --size=2000  --name="swap"
logvol /    --vgname=centos --fstype=xfs  --percent=90 --name="root"

# ----- END partitioning logic below -----


%include /tmp/drive-selection


Consoles and logging during installation


The CentOS installer uses the tmux terminal multiplexer to display and

control several windows you can use in addition to the main interface.

Softkey: Ctrl+Alt+F1 = Ctrl+b 1

Logging %pre and %post

When using a %pre or %post script you can simply log the output to a file by using --log=/path/to/file

[方法 1]

%post --log=/tmp/my-post-log
echo 'Hello, World!'

[方法 2]

exec < /dev/tty3 > /dev/tty3
chvt 3
echo "################################"
echo "# Running Post Configuration   #"
echo "################################"
echo 'Hello, World!'
) 2>&1 | /usr/bin/tee /var/log/post_install.log

sleep 10
chvt 1

* 按 Ctrl + F3 跳過 tty3 去查看時螢幕會清空


Remote Install / Debug



Enable ssh service

During the installation, you can interact with the installation program and monitor its progress over an SSH connection.

By default, the ssh server is not started during the installation. To make ssh available during the installation,

boot the system with the kernel boot option inst.sshd  (isolinux/isolinux.cfg)

append initrd=initrd.img ... inst.sshd

creates a separate account that exists only in the installation environment.

( These accounts are not transferred to the installed system. )


 * During installation, the root account has no password by default.

sshpw --username=name [options] password


shpw --username=example_username example_password
sshpw --username=root example_password --lock


會用 GUI mode Install ("text" setting 無效)

[方法1] By boot options

inst.vnc                                                   # VNC Direct Mode
inst.vnc  inst.vncconnect=HOST:PORT           # VNC Connect Mode (Admin: vncviewer -listen PORT)

[方法2] By ks.cfg Setting

this command starts a VNC server on the installation system with no password and displays the details required to connect to it.

vnc [--host=host_name] [--port=port] [--password=password]

--host=? Connect to the VNC viewer process listening on the given host name.

--port=? Provide a port that the remote VNC viewer process is listening on.

           If not provided, Anaconda uses the VNC default port of 5900.

--password= - Set a password which must be provided to connect to the VNC session. This is optional, but recommended.


kickstart run script after reboot


# By cron job


@reboot /root/firstboot > /var/log/firstboot.log 2>&1


# Cleanup job
grep -v firstboot /etc/crontab > /etc/crontab.tmp
mv -f /etc/crontab.tmp /etc/crontab
service cron restart

# do something

# By Service

在 ks.cfg 的 %post Section 加入以下設定

Prior to Red Hat Enterprise Linux 7:

touch /tmp/runonce
cat << EOF >> /etc/rc.local
if [ -e /tmp/runonce ]
   rm /tmp/runonce
   exec > /root/runonce.log 2>&1
   /path/to/my/script      # 此 script 要做 cleanup jobs, 比如清 /etc/rc.local

Red Hat Enterprise Linux 7 and later:

cat << EOF > /etc/systemd/system/runonce.service
Description=Run once



chmod 664 /etc/systemd/system/runonce.service

systemctl enable runonce




# Forcing kickstart to ask for network configuration

network --device=eth0 --bootproto=query

# Use a specific network interface for kickstart

# add "ksdevice=?" to the kernel command line.

  • ksdevice=eth0
  • ksdevice=link      # use the first interface it finds that has a active link.
  • ksdevice=bootif  #  use the interface that did the PXE boot


Sample kickstarts and snippets