KVM 仮想マシン作成

自分用メモ。
[CentOSにKVMインストール](https://qiita.com/Ki2neudon/items/c2ace14d50a92e7591c8) の続き。

# libvirtd 起動

```bash
$ systemctl status libvirtd
● libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:libvirtd(8)
           https://libvirt.org

$ sudo systemctl start libvirtd
$ sudo systemctl enable libvirtd
$ systemctl status libvirtd
● libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: active (running) since 水 2019-12-11 09:58:51 JST; 25s ago
     Docs: man:libvirtd(8)
           https://libvirt.org
 Main PID: 29943 (libvirtd)
   CGroup: /system.slice/libvirtd.service
           tq29943 /usr/sbin/libvirtd
           tq30047 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_l...
           mq30048 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_l...

12月 11 09:58:51 kvm_host dnsmasq[30044]: listening on virbr0(#14): 192.168.122.1
12月 11 09:58:51 kvm_host dnsmasq[30047]: started, version 2.76 cachesize 150
12月 11 09:58:51 kvm_host dnsmasq[30047]: compile time options: IPv6 GNU-getopt DBus no-i18n IDN DHCP DHCPv6 no-Lua TFTP no-conntr...inotify
12月 11 09:58:51 kvm_host dnsmasq-dhcp[30047]: DHCP, IP range 192.168.122.2 -- 192.168.122.254, lease time 1h
12月 11 09:58:51 kvm_host dnsmasq-dhcp[30047]: DHCP, sockets bound exclusively to interface virbr0
12月 11 09:58:51 kvm_host dnsmasq[30047]: reading /etc/resolv.conf
12月 11 09:58:51 kvm_host dnsmasq[30047]: using nameserver 8.8.8.8#53
12月 11 09:58:51 kvm_host dnsmasq[30047]: read /etc/hosts - 2 addresses
12月 11 09:58:51 kvm_host dnsmasq[30047]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses
12月 11 09:58:51 kvm_host dnsmasq-dhcp[30047]: read /var/lib/libvirt/dnsmasq/default.hostsfile
Hint: Some lines were ellipsized, use -l to show in full.
```

# 仮想ネットワーク 内部LAN 作成

```bash
$ sudo virsh net-list
 名前               状態     自動起動  永続
----------------------------------------------------------
 default              動作中  はい (yes)  はい (yes)

$ cat <<- EOF > /tmp/internal_lan.xml
<network>
  <name>internal_lan</name>
  <bridge name='virbr1' stp='on' delay='0' />
  <ip address='172.19.0.1' netmask='255.255.254.0'>
  </ip>
</network>
EOF
$ sudo virsh net-define /tmp/internal_lan.xml
ネットワーク internal_lan が /tmp/internal_lan.xml から定義されました

$ sudo virsh net-autostart internal_lan
ネットワーク internal_lan が自動起動に設定されました

$ sudo virsh net-start internal_lan
ネットワーク internal_lan が起動されました

$ sudo virsh net-list
 名前               状態     自動起動  永続
----------------------------------------------------------
 default              動作中  はい (yes)  はい (yes)
 internal_lan         動作中  はい (yes)  はい (yes)
```

# 仮想ネットワーク default 停止

```bash
$ sudo virsh net-list
 名前               状態     自動起動  永続
----------------------------------------------------------
 default              動作中  はい (yes)  はい (yes)
 internal_lan         動作中  はい (yes)  はい (yes)

$ sudo virsh net-destroy default
ネットワーク default は強制停止されました

$ sudo virsh net-undefine default
ネットワーク default の定義が削除されました

$ sudo virsh net-list
 名前               状態     自動起動  永続
----------------------------------------------------------
 internal_lan         動作中  はい (yes)  はい (yes)
```

# 仮想ネットワーク 外部接続用 bridge-IF 作成

作成前の状況を確認。

```bash
$ ip link show | grep mtu
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
3: eno2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
4: eno1.10@eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
5: virbr1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
6: virbr1-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr1 state DOWN mode DEFAULT group 
```

``ifcfg-eno1`` はホストOSが使用しているので ``ifcfg-eno2`` を仮想マシン用のIFとする。

```bash
$ cd /etc/sysconfig/network-scripts
$ sudo sed -i ifcfg-eno2 \
  -e s/^BOOTPROTO=dhcp/BOOTPROTO=static/ \
  -e s/^ONBOOT=no/ONBOOT=yes/ \
  -e '$aBRIDGE=br2'

$ sudo cat << EOF > /tmp/ifcfg-br2
DEVICE=br2
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
EOF

$ sudo mv /tmp/ifcfg-br2 .
$ sudo chown root:root ifcfg-br2
$ sudo chmod 644 ifcfg-br2
$ sudo systemctl restart network
```

# 仮想マシン用 ストレージ作成

```bash
$ sudo virsh pool-list --all
 名前               状態     自動起動
-------------------------------------------

$ sudo virsh pool-define-as vm_images logical - - /dev/sda3 VolGroup01 /dev/VolGroup01
プール vm_images が定義されました

$ sudo virsh pool-start vm_images
プール vm_images が起動されました

$ sudo virsh pool-autostart vm_images
プール vm_images が自動起動としてマークされました

$ sudo virsh pool-list
 名前               状態     自動起動
-------------------------------------------
 vm_images            動作中  はい (yes)

$ sudo virsh vol-create-as vm_images openstack_cmpt 4000G
ボリューム openstack_cmpt が 作成されました

$ sudo virsh vol-create-as vm_images openstack_ctrl 500G
ボリューム openstack_ctrl が 作成されました

$ sudo virsh vol-list --pool vm_images
 名前               パス
------------------------------------------------------------------------------
 lv_home              /dev/VolGroup01/lv_home
 lv_root              /dev/VolGroup01/lv_root
 lv_swap              /dev/VolGroup01/lv_swap
 openstack_cmpt       /dev/VolGroup01/openstack_cmpt
 openstack_ctrl       /dev/VolGroup01/openstack_ctrl

$ sudo lvs
  LV             VG         Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv_home        VolGroup01 -wi-ao----  50.00g
  lv_root        VolGroup01 -wi-ao----  50.00g
  lv_swap        VolGroup01 -wi-ao----  20.00g
  openstack_cmpt VolGroup01 -wi-a-----  <3.91t
  openstack_ctrl VolGroup01 -wi-a-----  500.00g
```

# 仮想マシン インストールイメージ配置

```bash
$ sudo mkdir /var/iso
★WinSCP などで /var/iso 配下にOSインストールイメージ(iso) を配置
$ ls -l /var/iso
合計 4277248
-rw-r--r--. 1 root root 4379901952 11月 26  2017 CentOS-7-x86_64-DVD-1611.iso
```

# 仮想マシン OSインストール用 キックスタートファイル作成

ホストOSインストール時に作成された ``anaconda-ks.cfg`` を流用する。

```bash
$ sudo mkdir /var/ks
$ sudo cp -p /root/anaconda-ks.cfg /var/ks/ctrl.cfg
$ sudo vim /var/ks/ctrl.cfg
```

参考：[26.3. キックスタート構文の参考資料](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/installation_guide/sect-kickstart-syntax#sect-kickstart-commands)

```bash:/var/ks/ctrl.cfg
#version=DEVEL

# -- auto install by udon
install

# System authorization information
auth --enableshadow --passalgo=sha512

# Use CDROM installation media
cdrom

# Use graphical install
# --no use graphical install by udon
#graphical

# Run the Setup Agent on first boot
# --no use setup agent by udon
#firstboot --enable
firstboot --disable

# --change device name by udon
#ignoredisk --only-use=sda
ignoredisk --only-use=vda

# Keyboard layouts
# --change keyboard layouts by udon
#keyboard --vckeymap=jp --xlayouts='jp'
keyboard --vckeymap=jp106 --xlayouts='jp'

# System language
lang ja_JP.UTF-8

# Network information
# --no setup network by udon
#network  --bootproto=dhcp --device=eno1 --onboot=off --ipv6=auto --no-activate
#network  --bootproto=dhcp --device=eno2 --onboot=off --ipv6=auto
#network  --hostname=local.localdomain

# Root password
rootpw --iscrypted $6$gcFdG4Yd19LatI3C$4JJMV/v6xzNbODr3hkLOExDfelbj6q/.EuyWCcjYz2ZfvhqWeECGfFwSuAXrU9ogLH3GtGncaCsfNRgd7tvwx0

# System services
# --no setup ntp at setup by udon
#services --enabled="chronyd"

# System timezone
# --change hardware clock locale by udon
#timezone Asia/Tokyo --isUtc
timezone Asia/Tokyo

# System bootloader configuration
# --change boot-drive name by udon
# --kdump auto by udon
# --no display rhgb on boot by udon
#bootloader --location=mbr --boot-drive=sda
bootloader --location=mbr --boot-drive=vda --append="crashkernel=auto rhgb quiet"

# selinux disable by udon
selinux --disabled

# firewall disable by udon
firewall --disabled

# partition clear by udon
zerombr

# Partition clearing information
# --change device name by udon
#clearpart --all --initlabel --drives=sda
clearpart --all --initlabel --drives=vda

# Disk partitioning information
# --change partition by udon
#part pv.672 --fstype="lvmpv" --ondisk=sda --size=122888
#part biosboot --fstype="biosboot" --ondisk=sda --size=1
#part /boot --fstype="xfs" --ondisk=sda --size=512 --label=/boot
#volgroup VolGroup01 --pesize=4096 pv.672
#logvol /home  --fstype="xfs" --size=51200 --label="/home" --name=lv_home --vgname=VolGroup01
#logvol swap  --fstype="swap" --size=20480 --name=lv_swap --vgname=VolGroup01
#logvol /  --fstype="xfs" --size=51200 --label="/root" --name=lv_root --vgname=VolGroup01

part /boot --fstype="xfs" --asprimary --ondisk=vda --size=512 --label=/boot
part pv.1 --ondisk=vda --grow --asprimary --size=1

volgroup VolGroup01 --pesize=4096 pv.1

logvol swap     --fstype="swap" --size=4096   --name=lv_swap --vgname=VolGroup01
logvol /        --fstype="xfs"  --size=307200 --name=lv_root --vgname=VolGroup01 --label="/root"
logvol /home    --fstype="xfs"  --size=51200  --name=lv_home --vgname=VolGroup01 --label="/home"
logvol /var/log --fstype="xfs"  --size=51200  --name=lv_log  --vgname=VolGroup01 --label="/var/log"

%packages
@^minimal
@core
chrony

%end

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

%end

%anaconda
pwpolicy root --minlen=6 --minquality=50 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=50 --notstrict --nochanges --notempty
pwpolicy luks --minlen=6 --minquality=50 --notstrict --nochanges --notempty
%end
```

### 2020.05.18 追記

CentOS6.6をGUIからインストールしたkickstart.cfgを利用しようとしたら``repo``が認識できずに失敗した。
[Kickstartを使ってCentOSを簡単にインストール](http://www.ytp.ne.jp/wiki/Wiki.jsp?page=Kickstart%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6CentOS%E3%82%92%E7%B0%A1%E5%8D%98%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

こちら様に書いてあるとおり以下のように修正すれば良い

```
repo --name="CentOS" --baseurl=cdrom:sr0/ --cost=100
↓
repo --name="CentOS" --baseurl=file:///mnt/source --cost=100
```

- ``install``
インストールの開始

- ``auth --enableshadow --passalgo=sha512``
デフォルトのまま。

  - シャドウパスワードを使用(``--enableshadow``)
  - SHA512 ハッシュアルゴリズムを使用(``--passalgo=sha512``)

- ``cdrom``
光学メディアからのインストール

- ``#graphical``
グラフィカルインストールを使わない

- ``firstboot --disable``
初期化セットアップアプリを利用しない

- ``ignoredisk --only-use=vda``
``/dev/vda`` のみを使用する。
KVMはたしか ``/dev/vda`` で認識したはず。。

- ``keyboard --vckeymap=jp106 --xlayouts='jp'``
キーボードレイアウトを変更

- ``lang ja_JP.UTF-8``
UTF-8 っていいよね

- ``#network``
ネットワーク周辺はOSインストール後に操作するので無効化

- ``rootpw --iscrypted ``
楽なのは ``--plaintext`` でパスワードを丸見えさせることだけど丸見えである。
今回はホストOSと同じパスワードのままとした。

- ``#services --enabled="chronyd"``
NTPサービスはOSインストール後に操作するので無効化

- ``timezone Asia/Tokyo``
別に ``--isUtc`` つけてもいいけどなんとなく

- ``bootloader ``
デバイス名を ``/dev/vda`` に変更すること。
``--append=~~`` はつけなくてもいい。とおもう。

- ``selinux --disabled``
- ``firewall --disalbed``
どうせ止めるんでしょ？

- ``zerombr``
``clearpart --all --initlabel --drives=vda``
パーティション初期化。両方やったほうが良い。

- ``part /boot``
パーティション ``/boot`` を作成。デバイス名注意。

- ``part pv.1``
``volgroup VolGroup01 --pesize=4096 pv.1``
VGを作成する。

- ``logvol``
各パーティションを作成する。
小さめに作ってあとで ``LVM`` で変更でもいい。

- ``%packages``
ホストOSに合わせる。

# 仮想マシン OSインストール

``virt-install`` のオプションは闇が深い。
参考：[ソフトウェアエンジニアリング - Linux KVM操作](http://www.torutk.com/projects/swe/wiki/Linux_KVM%E6%93%8D%E4%BD%9C)

```bash
$ sudo virt-install \
--noreboot \
--name openstack_ctrl \
--connect=qemu:///system \
--ram 8192 \
--vcpu 8 \
--disk path=/dev/VolGroup01/openstack_ctrl \
--network bridge=br2,model=virtio \
--os-type linux \
--os-variant rhel7 \
--nographics \
--hvm \
--virt-type kvm \
--location /var/iso/CentOS-7-x86_64-DVD-1611.iso \
--initrd-inject /var/ks/ctrl.cfg \
--extra-args "ks=file:/ctrl.cfg console=tty0 console=ttyS0,115200n8"
```

``Performing post-installation setup tasks`` でちょっと待つけど安心して。

```bash
:省略

Performing post-installation setup tasks
Installing boot loader
.
Performing post-installation setup tasks
.

Configuring installed system
.
Writing network configuration
.
Creating users
.
Configuring addons
.
Generating initramfs
.
Running post-installation scripts
.
        Use of this product is subject to the license agreement found at /usr/share/centos-release/EULA

        Installation complete.  Press return to quit
```

上記で ``Enterキー`` を押下。
本当はそんなことしなくても自動停止するオプションもあるはず。

```bash
$ sudo virsh list --all
 Id    名前                         状態
----------------------------------------------------
 -     openstack_ctrl                 シャットオフ
```

キックスタートファイルなど間違えてしまいインストールが止まった場合は ``Ctrl + ]`` を2回押してコンソールから抜け、以下のコマンドで仮想マシンを削除する。

```bash
$ sudo virsh undefine openstack_ctrl
ドメイン openstack_ctrl の定義が削除されました

$ sudo virsh destroy openstack_ctrl
ドメイン openstack_ctrl は強制停止されました
```