CentOS 8 を virt-install でサクッと入れる

こんな感じに centos8.ks.cfg を作成して、

#version=RHEL8

cmdline
url --url=http://ftp.riken.jp/Linux/centos/8.1.1911/BaseOS/x86_64/os/

lang en_US.UTF-8
keyboard --vckeymap=jp --xlayouts=jp
timezone Asia/Tokyo --isUtc --ntpservers=192.168.2.2

network --activate --device=link --noipv6 --bootproto=dhcp

zerombr
clearpart --all --initlabel
bootloader --location=mbr --boot-drive=vda
part / --label=root --grow --asprimary --ondisk=vda

rootpw --plaintext password
skipx
selinux --disabled
firewall --disabled
firstboot --disabled

services --enabled=chronyd --disabled=kdump,auditd

poweroff

%packages
@^minimal-environment
%end

CentOS-8.1.1911-x86_64-boot.iso を適当なディレクトリにダウンロードした後、次のようにサクッと作成できます。

# ダウンロード
wget http://ftp.riken.jp/Linux/centos/8.1.1911/isos/x86_64/CentOS-8.1.1911-x86_64-boot.iso -O /iso/CentOS-8.1.1911-x86_64-boot.iso

# 論理ボリューム作成
lvcreate vg99 -L 8G -n vm.centos8

# セットアップ
virt-install \
  --name centos8 \
  --hvm \
  --virt-type kvm \
  --ram 2048 \
  --vcpus 1 \
  --arch x86_64 \
  --os-type linux \
  --os-variant rhel8.1 \
  --boot hd \
  --disk path=/dev/vg99/vm.centos8,bus=virtio \
  --network network=default,model=virtio \
  --graphics none \
  --serial pty \
  --console pty \
  --location /iso/CentOS-8.1.1911-x86_64-boot.iso \
  --initrd-inject /tmp/centos8.ks.cfg \
  --extra-args "inst.ks=file:/centos8.ks.cfg inst.stage2=cdrom: console=ttyS0 net.ifnames=0 biosdevname=0" \
  --noreboot

# 起動してコンソールに接続
virsh start centos8
virsh console centos8

RPM パッケージが含まれない CentOS-8.1.1911-x86_64-boot.iso を使っているので、パッケージのダウンロードのためにやや時間かかります。

CentOS-8.1.1911-x86_64-dvd1.iso を使う場合は ks.cfgurl の行を cdrom とかに変更すればたぶん大丈夫です。

ダメだった

CentOS 7.7 の virt-install だと↑でサクッと入れられたのですが、CentOS 8.1 の virt-install だとダメでした。

ERROR    Error validating install location: Could not find an installable distribution at '/iso/CentOS-8.1.1911-x86_64-boot.iso'

The location must be the root directory of an install tree.
See virt-install man page for various distro examples.

virt-install --debug とかで見てみたところ、CentOS-8.1.1911-x86_64-boot.iso のメディアに .treeinfo が無いことが原因のようです。

--location ではなく --cdrom ならこのエラーは出ませんが、それだと --initrd-inject--extra-args が効かないのでキックスタートさせるのが面倒になります。

試していませんが CentOS-8.1.1911-x86_64-dvd1.iso なら .treeinfo が含まれているので大丈夫です。

解決方法

.treeinfo から initrd.imgvmlinuz の位置を読んでいるだけなので、--location でそれらの位置も一緒に指定すれば OK です。

virt-install \
  --name centos8 \
  --hvm \
  --virt-type kvm \
  --ram 2048 \
  --vcpus 1 \
  --arch x86_64 \
  --os-type linux \
  --os-variant rhel8.1 \
  --boot hd \
  --disk path=/dev/vg99/vm.centos8,bus=virtio \
  --network network=default,model=virtio \
  --graphics none \
  --serial pty \
  --console pty \
  --location /iso/CentOS-8.1.1911-x86_64-boot.iso,kernel=isolinux/vmlinuz,initrd=isolinux/initrd.img \
  --initrd-inject /tmp/centos8.ks.cfg \
  --extra-args "inst.ks=file:/centos8.ks.cfg inst.stage2=cdrom: console=ttyS0 net.ifnames=0 biosdevname=0" \
  --noreboot

別の解決方法

man virt-install したら↑の --locationkernelinitrd を指定する方法が書いていたのでこれでええやんと思ったんですが、それに気づく前に試行錯誤したメモ。

CentOS-8.1.1911-x86_64-boot.iso.treeinfo を追加したメディアを作れば大丈夫です。

mount /iso/CentOS-8.1.1911-x86_64-boot.iso /mnt -o loop
rsync -av /mnt/ /tmp/CentOS-8.1.1911-x86_64-boot/
curl http://ftp.riken.jp/Linux/centos/8.1.1911/BaseOS/x86_64/os/.treeinfo > /tmp/CentOS-8.1.1911-x86_64-boot/.treeinfo
mkisofs \
  -o /iso/CentOS-8.1.1911-x86_64-boot-x.iso \
  -b isolinux/isolinux.bin \
  -c isolinux/boot.cat \
  -no-emul-boot \
  -boot-load-size 4 \
  -boot-info-table \
  -r -J -v \
  /tmp/CentOS-8.1.1911-x86_64-boot/

rm -fr /tmp/CentOS-8.1.1911-x86_64-boot/
umount /mnt

virt-install \
  --name centos8 \
  --hvm \
  --virt-type kvm \
  --ram 2048 \
  --vcpus 1 \
  --arch x86_64 \
  --os-type linux \
  --os-variant rhel8.1 \
  --boot hd \
  --disk path=/dev/vg99/vm.centos8,bus=virtio \
  --network network=default,model=virtio \
  --graphics none \
  --serial pty \
  --console pty \
  --location /iso/CentOS-8.1.1911-x86_64-boot-x.iso \
  --initrd-inject /tmp/centos8.ks.cfg \
  --extra-args "inst.ks=file:/centos8.ks.cfg inst.stage2=cdrom: console=ttyS0 net.ifnames=0 biosdevname=0" \
  --noreboot

あるいは ISO は使わずに --location も URL を指定すれば大丈夫です。ただこの方法だと images/install.img のようなでかいファイル(509M)までダウンロードされるのでめちゃくちゃ時間かかります。

virt-install \
  --name centos8 \
  --hvm \
  --virt-type kvm \
  --ram 2048 \
  --vcpus 1 \
  --arch x86_64 \
  --os-type linux \
  --os-variant rhel8.1 \
  --boot hd \
  --disk path=/dev/vg99/vm.centos8,bus=virtio \
  --network network=default,model=virtio \
  --graphics none \
  --serial pty \
  --console pty \
  --location http://ftp.riken.jp/Linux/centos/8.1.1911/BaseOS/x86_64/os/ \
  --initrd-inject /tmp/centos8.ks.cfg \
  --extra-args "inst.ks=file:/centos8.ks.cfg console=ttyS0 net.ifnames=0 biosdevname=0" \
  --noreboot