centos7.9 kickstart 로 자동 설치 iso 파일 만들기

OS 설치할때 언어, 키보드, 파티션 등등을 선택해야 한다.
똑같은 옵션으로 같은 하드웨어에 OS를 반복 설치해야하는 경우가 있다.
이럴 때 kickstart 를 이용해 나만의 OS 설치 USB를 만들어 놓으면 편리하다.
USB 넣고 서버를 부팅한 다음 기다리기만 하면 내가 원하는 선택지들을 알아서 고르고 설치가 완료된다.

kickstart booting usb 만드는 법 Overview

본 문에서 설명할 방법을 그대로 따라할 수 있는 조건

  • CentOS7.9으로 테스트했다
  • 설치대상 서버의 디스크(HDD or SSD) 크기와 이름이 같다
  • 설치대상 서버의 network interface의 이름이 같다
실제로는 좀 더 넓은 범위에도 활용할 수 있을 거 같다.

준비물

  • 앞으로 만들 자동 설치 ISO 이용해 OS를 설치완료했을때와 같은 상태의 서버(언어, 파티션 등등)
  • CentOS7.9 설치 ISO 파일 - download : https://www.centos.org/download/
위 준비물 중 첫번째 서버는 필수는 아닌데 처음 만드는 거라면 있는게 편리하다.

kickstart ISO 파일 만드는 방법

  1. 서버에 CentOS 7.9를 원하는 옵션들을 선택해서 설치한다.
  2. 설치할때 이용했던 ISO 파일을 같은 서버에 복사한다.
  3. 서버 경로 /root/anaconda-ks.cfg 파일을 iso 파일 내용이 있는 폴더내 ks.cfg 파일에 덮어씌운다.
  4. OS 설치이외 추가하고 싶은 내용(패키지 설치 등)이 있다면 ks.cfg 파일에 스크립트 내용을 작성한다.
  5. mkisofs 명령어로 임시폴더내용을 iso파일로 만든다.


krickstart ISO 파일 만드는 방법 상세(command 포함)

1. 서버에 CentOS 7.9를 원하는 옵션들을 선택해서 설치한다.

OS 설치방법은 따로 설명하지 않겠다.

2. 설치할때 이용했던 ISO 파일을 같은 서버에 복사한다.

/tmp/bootiso 폴더에 iso파일을 마운트하고
/tmp/bootcustom 폴더에 모든 내용을 복사,
/tmp/bootiso는 필요없어졌으니 umount한다.

mkdir /tmp/bootiso
mount -o loop CentOS-7-x86_64-Minimal-1908.iso /tmp/bootiso

mkdir /tmp/bootcustom
cp -r /tmp/bootiso/* /tmp/bootcustom
umount /tmp/bootiso


3. 서버 경로 /root/anaconda-ks.cfg 파일을 iso 파일 내용이 있는 폴더내 ks.cfg 파일에 덮어씌운다.

/root/ 에 가면 anaconda-ks.cfg 파일이 있다.
여기에는 서버에 OS 설치했을때 언어를 뭘 선택했고, 파티션은 어떻게 나눴었는지 등등의 선택했던 내용들이 모두 저장되어있다.
/tmp/bootcustom에 ks.cfg 파일이 있고, 이 파일 내용이 os 설치시에 적용된다.
서버에 적용된 내용들을 ks.cfg 파일에 덮어씌우고 이 내용으로 iso 파일을 만들면 원하는 옵션으로 자동선택해서 os를 설치하는 Iso파일을 만들수 있다.
ks.cfg 파일을 지워고 anaconda-ks.cfg파일을 /tmp/bootcustom 에 복사한 다음 ks.cfg로 파일이름을 바꾼다.

4. OS 설치이외 추가하고 싶은 내용(패키지 설치 등)이 있다면 ks.cfg 파일에 스크립트 내용을 작성한다.

centos7.9 기본 설치 완료 후 특정 하드웨어에서 network interface를 인식하지 못하는 문제가 있어서 커널 모듈을 추가 설치해야하는 상황. 아래 세 개 파일을 /tmp/bootcustom 폴더에 폴사한다.

kernel-3.10.0-1160.49.1.el7.x86_64.rpm
kernel-devel-3.10.0-1160.49.1.el7.x86_64.rpm
kmod-e1000e-3.8.4-4.el7_9.elrepo.x86_64.rpm

ks.cfg 마지막에 아래 내용 추가한다.
###############################################################################
# Post-Installation Scripts (nochroot)
###############################################################################
%post --nochroot
#!/bin/bash

# Create Directory
mkdir -p /mnt/sysimage/root/hardening

# Copy
cp /run/install/repo/*.rpm /mnt/sysimage/root/hardening

%end


###############################################################################
# Post-Installation Scripts
###############################################################################
%post
#!/bin/bash

# Install rpms
yum localinstall -y /root/hardening/kernel-3.10.0-1160.49.1.el7.x86_64.rpm
yum localinstall -y /root/hardening/kmod-e1000e-3.8.4-4.el7_9.elrepo.x86_64.rpm
yum localinstall -y /root/hardening/kernel-devel-3.10.0-1160.49.1.el7.x86_64.rpm
%end

%post ~ %end 부분은 os 설치 완료 후 실행되는 부분이다.
ks.cfg파일은 chroot 모드로 실행된다.
chroot 모드가 아닌 상태로 실행되어야 하는 스크립트 내용은 --nochroot 옵션을 적용한다.
iso 파일에 있는 추가 설치 rpm 파일들을 서버로 복사하려면 /mnt/sysimage/root/hardening 경로를 이용한다.
아래 두 경로는 같은 곳을 가리킨다.
nochroot 모드 : /mnt/sysimage/root/hardening
chroot 모드 : /root/hardening/
설치완료 후 /root/hardening으로 가보면 복사해둔 파일들을 확인할 수 있다.
아래는 최종 ks.cfg 파일 내용
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
# Use graphical install
graphical
# Run the Setup Agent on first boot
firstboot --enable
###################### 디스크(hdd or ssd) 이름 수정
ignoredisk --only-use=nvme0n1,nvme1n1
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8

# Network information
###################### network interface 이름 수정
network  --bootproto=dhcp --device=p1p1 --ipv6=auto --activate
network  --hostname=localhost.localdomain
reboot --eject
#Root password
rootpw --lock
# System services
services --disabled="chronyd"
# System timezone
timezone Etc/UTC --isUtc --nontp
user --groups=wheel --name=jihoon --password=$6$IsPZ2.xkPOhcR$IrtPusbdGwkpZHZkNLIL5.w0foW0dFuONk3Ge/dkH1LEGmIrl/OmrJ/pCo3lcr0 --iscrypted --gecos="jihoon"
# System bootloader configuration
###################### 디스크 이름 수정
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=nvme0n1
# Partition clearing information
###################### 디스크 이름 수정
clearpart --all --initlabel --drives=nvme0n1,nvme1n1
# Disk partitioning information
part raid.948 --fstype="mdmember" --ondisk=nvme0n1 --size=1025
part raid.616 --fstype="mdmember" --ondisk=nvme0n1 --size=1025
part raid.1367 --fstype="mdmember" --ondisk=nvme0n1 --size=51232
part raid.1879 --fstype="mdmember" --ondisk=nvme1n1 --size=190915
part raid.1873 --fstype="mdmember" --ondisk=nvme0n1 --size=190915
part raid.954 --fstype="mdmember" --ondisk=nvme1n1 --size=1025
part raid.1373 --fstype="mdmember" --ondisk=nvme1n1 --size=51232
part raid.622 --fstype="mdmember" --ondisk=nvme1n1 --size=1025
raid / --device=root --fstype="xfs" --level=RAID1 raid.1873 raid.1879
raid /var/log --device=var_log --fstype="xfs" --level=RAID1 raid.1367 raid.1373
raid /boot/efi --device=boot_efi --fstype="efi" --level=RAID1 --fsoptions="umask=0077,shortname=winnt" raid.948 raid.954
raid /boot --device=boot --fstype="xfs" --level=RAID1 raid.616 raid.622

%packages
@^minimal
@core
kexec-tools

%end

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

%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end


###############################################################################
# Post-Installation Scripts (nochroot)
###############################################################################
%post --nochroot
#!/bin/bash

# Create Directory
mkdir -p /mnt/sysimage/root/hardening

# Copy
cp /run/install/repo/*.rpm /mnt/sysimage/root/hardening

%end


###############################################################################
# Post-Installation Scripts
###############################################################################
%post
#!/bin/bash

# Install rpms
yum localinstall -y /root/hardening/kernel-3.10.0-1160.49.1.el7.x86_64.rpm
yum localinstall -y /root/hardening/kmod-e1000e-3.8.4-4.el7_9.elrepo.x86_64.rpm
yum localinstall -y /root/hardening/kernel-devel-3.10.0-1160.49.1.el7.x86_64.rpm
%end


5. mkisofs 명령어로 임시폴더내용을 iso파일로 만든다.

아래 내용을 파일로 만들고 실행하면 된다.
중복된 옵션도 있는데 빼거나 순서를 바꾸면 잘 안됐던 걸로 기억하는데, 이유를 잘 모르겠다.
/home/jihoon/ 경로에 centos7.9-custom.iso 이름으로 저장된다.
#!/bin/bash

ISO_FILE=/home/jihoon/centos7.9-custom.iso
LABEL=CentOS7x86_64


mkisofs -J -R -l -D -L \
        -c isolinux/boot.cat \
        -o "$ISO_FILE" \
        -b isolinux/isolinux.bin \
        -no-emul-boot -boot-load-size 4 -boot-info-table \
        -eltorito-alt-boot \
        -e images/efiboot.img -graft-points \
        -no-emul-boot \
        -V "$LABEL" /tmp/bootcustom/


isohybrid --uefi $ISO_FILE


주의 사항

  • mkisofs 옵션 중 LABEL 이름은 /tmp/bootcustom/EFI/BOOT/grub.cfg, /tmp/bootcustom/isolinux/isolinux.cfg 에 있는 LABEL 값과 동일해야한다.
  • post script에서 이용할 수 없는 서비스도 있다. (ex, iptables 명령어 넣었더니 실행 안됐다.)

참고

https://github.com/fcaviggia/hardened-centos7-kickstart/blob/master/config/hardening/hardened-centos.cfg
https://docs.centos.org/en-US/centos/install-guide/Kickstart2/ https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/installation_guide/sect-kickstart-syntax

댓글 쓰기

0 댓글