virt-builder でサクッと作ったゲストが好みじゃなかった件

だいぶ前に Qiita で virt-builder でゲストを作って virt-resize でリサイズして virt-customize でカスタマイズ という記事を書いていて。

virt-builder ふむふむ便利そう、だがしかしなんか気に入らないので普通にゲスト作るときはやっぱ Kickstart だわ

と思ったはずなのだけど、なにが気に入らなかったのか忘れてしまったのでそのメモ。

virt-builder でサクッとゲストを作る

virt-builder という libvirt 管理下の KVM などの仮想環境にサクッとゲストを作るコマンドがあります。libguestfs-tools-c パッケージに含まれているのでインストールします。

yum -y install libguestfs-tools-c

まずはゲスト用のボリュームを作成します。

lvcreate vg1 -n vm.ore-no-virt -L 6G

ゲストのイメージの中身を弄るためのスクリプトを作ります。

cat <<'__RUN__'> run.sh
set -eux

# selinux
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config

# ngyuki
useradd ngyuki -m -g wheel

# authorized_keys
mkdir -p /home/ngyuki/.ssh
curl -fsSL https://github.com/ngyuki.keys | awk 1 > /home/ngyuki/.ssh/authorized_keys
chown -R ngyuki: /home/ngyuki/.ssh
chmod 700 /home/ngyuki/.ssh
chmod 600 /home/ngyuki/.ssh/authorized_keys

# sudoers wheel
tee /etc/sudoers.d/wheel <<EOS
%wheel ALL=(ALL) NOPASSWD: ALL
Defaults:%wheel env_keep += SSH_AUTH_SOCK
Defaults:%wheel !requiretty
Defaults:%root  !requiretty
EOS

# sudoers chmod
chmod 0440 /etc/sudoers.d/wheel

# ipv6
tee /etc/sysctl.d/ipv6-disable.conf <<EOS
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
EOS

# sshd
sed -i '/UseDNS /c UseDNS no' /etc/ssh/sshd_config
sed -i '/PermitRootLogin /c PermitRootLogin yes' /etc/ssh/sshd_config
sed -i '/AddressFamily /c AddressFamily inet' /etc/ssh/sshd_config

# postfix
postconf -e inet_protocols=ipv4
__RUN__

virt-builder でゲストのイメージを作ります。1回目はイメージのテンプレートがダウンロードされるので結構時間がかかります。2回目以降はキャッシュされているので早いです。

virt-builder centos-7.4 \
  --output /dev/vg1/vm.ore-no-virt \
  --arch x86_64 \
  --hostname ore-no-virt \
  --root-password disable \
  --timezone Asia/Tokyo \
  --run run.sh \
  --firstboot-command '
      nmcli con modify eth0 \
        connection.autoconnect yes \
        ipv4.method manual \
        ipv4.addresses 10.12.16.99/23 \
        ipv4.gateway 10.12.16.1 \
        ipv4.dns 10.12.16.2 \
        ipv6.method ignore
      nmcli con up eth0
    '

イメージを元に libvirt にインポートします。

virt-install \
  --name ore-no-virt \
  --hvm \
  --virt-type kvm \
  --ram 1024 \
  --vcpus 1 \
  --arch x86_64 \
  --os-type linux \
  --os-variant rhel7 \
  --boot hd \
  --disk path=/dev/vg1/vm.ore-no-virt \
  --network network=back \
  --graphics none \
  --serial pty \
  --console pty \
  --import \
  --noreboot

ゲストを開始して SSH でログインできます。

virsh start ore-no-virt
ssh ngyuki@10.12.16.99

気に入らなかった理由

イメージのテンプレートのパーティション構成がなんか好きではなかったので使ってなかったんでした。

sudo parted -l /dev/vda
#=> Model: Virtio Block Device (virtblk)
#=> Disk /dev/vda: 6442MB
#=> Sector size (logical/physical): 512B/512B
#=> Partition Table: msdos
#=> Disk Flags:
#=>
#=> Number  Start   End     Size    Type     File system     Flags
#=>  1      1049kB  1075MB  1074MB  primary  xfs             boot
#=>  2      1075MB  1720MB  645MB   primary  linux-swap(v1)
#=>  3      1720MB  6442MB  4723MB  primary  xfs

今日日仮想サーバなら /boot とか無くていいしスワップも必要なら別ディスクとしてアタッチするし、1つのディスクで複数パーティション切るぐらいなら複数のディスクをアタッチすればいいんじゃね?と思うので、仮想サーバでは基本的に1ディスク=1パーティションとしてます。

ので、この方法での環境構築はたぶんやりません。


この記事、元は 2018/03 ごろに書いてたものです。