Centos 8 kickstart

最後更新: 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.

 


anaconda-ks.cfg

 

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

 


ks.cfg

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

ks.cfg

genisoimage -V OEMDRV -o ks.iso cd

 


Sections

 

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

i.e.

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

--all

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

i.e.

# type: lvm, btrfs, plain, thinp

# plain: Regular partitions with no LVM or Btrfs

autopart --type=plain --nohome

Note

要配合 clearpart 使用

part (optional)

Syntax

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

Example

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

mntpoint

/path

pv.id              The partition is used for LVM

raid.id            The partition is used for software RAID

swap

The partition is used as swap space.

# To determine the size of the swap partition automatically

swap --recommended

biosboot

# 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.

/boot/efi

# 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

--label=

assign a label to an individual partition.

--ondisk= or --ondrive=

Forces the partition to be created on a particular disk.

Note

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

要配合 clearpart 使用

LVM

i.e.

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

--grow

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.

--percent=N

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.

--name=name

* 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.

i.e.

bootloader --location=mbr

eula (optional)

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

eula --agreed

firewall

--remove-service

firstboot

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'
%end

keyboard (required)

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

lang (required)

lang en_US.UTF-8

network (optional)

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

network  --hostname=c8

network --bootproto=static --ip=192.168.88.126 --gateway=192.168.88.1 --netmask=255.255.255.0 --nameserver=192.168.88.1

--device=em1

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

OR

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)

i.e.

# --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.

i.e.

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

Remark:

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

Package Selection

# Specifying Individual Packages

 * 當 repo 沒有此 package 時就會 error

%packages
sqlite
curl
aspell
%end

More Info.

Link

 


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 ./

 


isolinux 與 EFI

 

舊的主板是用 isolinux 啟動的, 新的則用 uefi boot

設定

  • EFI/BOOT/grub.cfg
  • EFI/BOOT/BOOT.conf      # 與 grub.cfg 相同內容
### BEGIN /etc/grub.d/10_linux ###
menuentry 'Install CentOS Linux 8' --class fedora --class gnu-linux --class gnu --class os {
        linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS-8-2-2004-x86_64-dvd quiet
        initrdefi /images/pxeboot/initrd.img
}

 


Script

 

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

%post

--nochroot

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.

Path

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

--interpreter

Default: bash

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

--erroronfail

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
%end

%pre

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

%pre
# ----- 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"
# LVM
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"
EOF

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

%end

%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]

%post
exec < /dev/tty3 > /dev/tty3
chvt 3
echo
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

 

SSH

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. )

sshpw(ks.cfg)

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

sshpw --username=name [options] password

ie.

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

VNC

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

[方法1] By boot options

inst.vnc                                                   # VNC Direct Mode
inst.vncpassword=PASSWORD
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

/etc/crontab

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

/root/firstboot

# 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
#!/bin/bash
if [ -e /tmp/runonce ]
then
   rm /tmp/runonce
   exec > /root/runonce.log 2>&1
   /path/to/my/script      # 此 script 要做 cleanup jobs, 比如清 /etc/rc.local
fi
EOF

Red Hat Enterprise Linux 7 and later:

cat << EOF > /etc/systemd/system/runonce.service
[Unit]
Description=Run once
Requires=network-online.target
After=network-online.target

[Service]
ExecStart=/root/runonce.sh

[Install]
WantedBy=multi-user.target
EOF

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

systemctl enable runonce

 


NIC

 

# 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

 

https://github.com/CentOS/Community-Kickstarts