仮想(KVM)マシン構築を簡易にする環境作成

# ここでやること

複数の仮想マシン(guest=centos7)を管理する１台の物理サーバ(母艦=CentOS7)を作ってみる。
って、もうすでに万人がやってることですが、
KickStartコンフィグ書式やvirt-installコマンドの記載方法を、忘れたときに見ようかと思っています。

# はじめに

決めとかなければいけないこと

|項目| ここでのサンプル値|仮想マシン2台目作る時の変更点|
|----|-----------------|----|
|母艦のIP|192.168.10.81/24|変更不要|
|母艦の物理NW-IF|enp30s0|変更不要|
|母艦のブリッジIF|br0(enp30s0が属している)|変更不要|
|仮想マシンの使用NW|母艦と同一NW(br0に属する)|変更不要|
|CentOS7のISO保管場所|/export/images/CentOS-7-x86_64-DVD-1611.iso|変更不要|
|仮想マシンのディスクイメージ保管場所|/export/images|変更不要|
|KickStartコンフィグファイルの設置場所(URL)|http://192.168.10.81/ks.cfg|変更不要|
|----|-----------------|----|
|KickStartコンフィグファイルの設置場所(ファイル)|/var/www/html/ks.cfg|変更不要|
|rootのパスワード| /root/kickstart.cfgから抜粋してもよい(仮に###PASSWORD###) |変更不要|
|ip/prefix|192.168.10.82/24|変更対象!!|
|gw|192.168.10.254|変更不要|
|NameServer|8.8.8.8|変更不要|
|パーティション|ベタ(LVMなし) /boot=512MB, /は残り全部|変更不要|
|selinux|disabled| 変更不要|
|ログイン用ユーザID|mishikawan(公開鍵認証専用)|変更不要|
|公開鍵|ssh-keygenで作成したid_rsa.pubファイルの中身(仮に###RSA###)|変更不要|
|SSHの禁止事項設定|パスワード認証禁止、root直ログイン禁止|変更不要|
|----|-----------------|-----|
|仮想マシン名|cent701|変更対象!!|
|メモリ| 1GB |変更不要|
|仮想マシンのディスクイメージファイル|/export/images/cent701.img|変更対象!!|
|仮想マシンのディスクイメージファイルのサイズ|5GB|変更不要|
|インストール時の使用IPアドレス| DHCP |変更不要|

## OS(CentOS7)インストール作業

これは割愛
* selinuxは無効にしました(検証環境なんでご勘弁)

## 仮想環境構築用のパッケージをインストール
加えて、KickStartコンフィグを仮想マシンに認識させるためにhttpdを稼働。

```ruby:YUMで仮想環境用のパッケージ一括インストールとHTTPD稼働
yum groupinstall "Virtualization Host"
yum install httpd
systemctl enable httpd
systemctl start httpd
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
```

## CentOSのISOファイルのダウンロードと設置

```ruby:仮想マシン用のOSイメージを事前にダウンロード/配置
mkdir -p /export/images
curl -O  http://ftp.iij.ad.jp/pub/linux/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso
```


## 標準で入っているNAT(virbr0)の削除

```ruby:デフォルトブリッジ削除(virbr0)
virsh net-destroy default
virsh net-undefine default
service libvirtd restart
```

## 新ブリッジ(br0)の作成

母艦IPと同じNWに仮想マシンIPを割り当るブリッジ(br0)を作成。
我が家では母艦SVが属するNWは、"192.168.10.0/24であるため、以下の値で設定。

```ruby:新規ブリッジ作成(br0)
nmcli connection add type bridge con-name br0 ifname br0
nmcli con add type ethernet con-name br0-slave ifname enp30s0 master br0
nmcli con modify br0 ipv4.method manual ipv4.address "192.168.10.81/24"
nmcli con modify br0 ipv4.gateway  "192.168.10.254"
nmcli con modify br0 ipv4.dns  "8.8.8.8"
nmcli con delete enp30s0
```
```ruby:参考
man nmcli-examples  ... 結構細かく載ってます。
```

## kickstart用ファイルを作成

### 決めとかなければいけないこと

|項目| ここでのサンプル値|
|----|-----------------|
|KickStartコンフィグファイルの設置場所(ファイル)|/var/www/html/ks.cfg|
|rootのパスワード| /root/kickstart.cfgから抜粋してもよい(仮に###PASSWORD###) |
|ip/prefix|192.168.10.82/24|
|gw|192.168.10.254|
|NameServer|8.8.8.8|
|パーティション|ベタ(LVMなし) /boot=512MB, /は残り全部|
|selinux|disabled|
|ログイン用ユーザID|mishikawan(公開鍵認証専用)|
|公開鍵|ssh-keygenで作成したid_rsa.pubファイルの中身(仮に###RSA###)|
|SSHの禁止事項設定|パスワード認証禁止、root直ログイン禁止|

```ruby:kickstart用ファイル作成
cat > /var/www/html/ks.cfg
eula --agreed
auth --enableshadow --passalgo=sha512
text
firstboot --enable
services --enabled="chronyd"
keyboard --vckeymap=us --xlayouts='us'
lang ja_JP.UTF-8
ignoredisk --only-use=vda
network --bootproto=static --gateway=192.168.10.254 --ip=192.168.10.81 --nameserver=8.8.8.8 --netmask=255.255.255.0
rootpw --iscrypted ###PASSWORD###
timezone Asia/Tokyo --isUtc
bootloader --location=mbr --boot-drive=vda
#autopart --type=plain
clearpart --all --initlabel --drives=vda
part /boot --fstype="xfs" --ondisk=vda --size=512
part /     --fstype="xfs" --ondisk=vda --size=1 --grow
selinux --disabled
%packages
@base
@core
chrony
telnet
tcpdump
%end
%post
sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sed -i 's/^#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
useradd mishikawan
mkdir -p /home/mishikawan/.ssh
echo "ssh-rsa ###RSA### mishikawan@localhost" > /home/mishikawan/.ssh/authorized_keys
chmod 700 /home/mishikawan/.ssh
chmod 400 /home/mishikawan/.ssh/authorized_keys
chown -R mishikawan:mishikawan /home/mishikawan/.ssh
%end
reboot
```

## 実際に仮想マシンを作ってみる(virt-install発行)

### 決めとかなければいけないこと

|項目| ここでのサンプル値|
|----|-----------------|
|仮想マシン名|cent701|
|メモリ| 1GB |
|仮想マシンのディスクイメージファイル|/export/images/cent701.img|
|仮想マシンのディスクイメージファイルのサイズ|5GB|
|CentOS7のISO保管場所|/export/images/CentOS-7-x86_64-DVD-1611.iso|
|インストール時の使用IPアドレス| DHCP |

```ruby:virt-installコマンド発行
virt-install -n cent701 -r 1024 --file=/export/images/cent701.img --file-size=5 \
 --location /export/images/CentOS-7-x86_64-DVD-1611.iso --nographics --os-variant=rhel7.0 \
 --network=bridge:br0 --extra-args="ks=http://192.168.10.81/ks.cfg ip=dhcp console=tty0 console=ttyS0,115200n8"
```

## 仮想マシン作成の試行錯誤

virt-install発行後、KickStart不備・httpポート開放し忘れ・ISOイメージ指定失敗等々で失敗した場合、"virtsh destroy cent701" & "virtsh undefine cent701"の２コマンドでなかったことにしてくれますので、幾らでもTrial&Errorできます!!

### 気に入らなかったら

```ruby:強制停止
virtsh destroy cent701
```
```ruby:強制排除
virtsh undefine cent701
```
* virsh consoleは、CTRL+]で抜けれます。

## 気に入ったら
対象の仮想マシンが気に入ったら、autostartを指定して登録しておきましょう。

```ruby:自動起動に登録
# virsh autostart cent701
Domain cent701 marked as autostarted
```

## 以下、本家の参考サイト
[キックスタート構文の参考資料](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Installation_Guide/sect-kickstart-syntax.html "RHEL社参照サイト")
[CREATING GUESTS WITH VIRT-INSTALL](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Virtualization_Deployment_and_Administration_Guide/sect-Guest_virtual_machine_installation_overview-Creating_guests_with_virt_install.html "RHEL社参照サイト")

#変更点
2017/05/19: br0作成コマンドの不備修正