はじめての KVM

はじめての KVM

LPIC 304 のために重い腰を上げる。


> tutorial: 
> https://www.cyberciti.biz/faq/how-to-install-kvm-on-centos-7-rhel-7-headless-server/


# やってみよう

## 使えるか確認

何を隠そう、 Mac Pro 2008 が VT 非対応なのでずっと試せなかった

```ruby
lscpu | grep Virtualization
Virtualization: VT-x

cat /proc/cpuinfo | grep vmx
```


## install KVM(libvirt)

cent os 7 です。

```ruby
 yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install 
 
 # virsh-restore がなかった
 yum install -y libguestfs-tools

systemctl enable libvirtd
systemctl start libvirtd

lsmod | grep -i kvm

```

## コマンド確認

```ruby
brctl show
virsh net-list
virsh net-dumpxml default
```

## VM 作る from Cloud image

tutorial最初のやり方だとVNCが必要で、手元の環境ではやりにくかったのでCLIだけでやります。

```ruby
cd /var/lib/libvirt/boot
wget http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2


D=/var/lib/libvirt/images
VM=centos7-vm1 ## vm name ##
mkdir -vp $D/$VM

cd $D/$VM
vi meta-data

↓を記入
instance-id: centos7-vm1
local-hostname: centos7-vm1

```

ssh keyをつくる

```ruby
ssh-keygen -t ed25519 -C "VM Login ssh key"
```

cloud-initの設定

```ruby
vi user-data
```

↓を入れる。pubkeyを書き換える必要あり。


```ruby
#cloud-config
 
# Hostname management
preserve_hostname: False
hostname: centos7-vm1
fqdn: centos7-vm1.nixcraft.com
 
# Users
users:
    - default
    - name: vivek
      groups: ['wheel']
      shell: /bin/bash
      sudo: ALL=(ALL) NOPASSWD:ALL
      ssh-authorized-keys:
        - <あなたの /root/.ssh/id_ed25519.pub の中身>
 
# Configure where output will go
output:
  all: ">> /var/log/cloud-init.log"
 
# configure interaction with ssh server
ssh_genkeytypes: ['ed25519', 'rsa']
 
# Install my public ssh key to the first user-defined user configured
# in cloud.cfg in the template (which is centos for CentOS cloud images)
ssh_authorized_keys:
  - <あなたの /root/.ssh/id_ed25519.pub の中身>
 
# set timezone for VM
timezone: Asia/Kolkata
 
# Remove cloud-init 
runcmd:
  - systemctl stop network && systemctl start network
  - yum -y remove cloud-init
```	

どうやら落としてきたcent imageのdisk領域を20G に拡張して、それを使うようだ。

```ruby
cd $D/$VM
cp /var/lib/libvirt/boot/CentOS-7-x86_64-GenericCloud.qcow2 $VM.qcow2

cd $D/$VM
export LIBGUESTFS_BACKEND=direct
qemu-img create -f qcow2 -o preallocation=metadata $VM.new.image 20G
virt-resize --quiet --expand /dev/sda1 $VM.qcow2 $VM.new.image

mv $VM.new.image $VM.qcow2

```

ci = cloud init だろう。 cloud initを起動させる iso を作って

```ruby
mkisofs -o $VM-cidata.iso -V cidata -J -r user-data meta-data
```

それを cdrom としてmountさせる。

```ruby
virsh pool-create-as --name $VM --type dir --target $D/$VM
 virt-install --import --name $VM \
--memory 1024 --vcpus 1 --cpu host \
--disk $VM.qcow2,format=qcow2,bus=virtio \
--disk $VM-cidata.iso,device=cdrom \
--network bridge=virbr0,model=virtio \
--os-type=linux \
--os-variant=centos7.0 \
--graphics spice \
--noautoconsole

# おわったら eject
virsh change-media $VM hda --eject --config
```

できたので使ってみます

```ruby
virsh net-dhcp-leases default
```

表示されたIPにssh

```ruby
ssh vivek@<IP>

$ ssh vivek@192.168.122.94
Last login: Tue Aug 31 09:01:45 2021 from gateway
[vivek@centos7-vm1 ~]$
```

yeahhhhhh!!!!!!!!!! できました！！！


# 外からアクセスしてみよう

このままではhost osからしかアクセスできません。とりあえずapacheを見れるようにしましょう。

## install apache in guest

```ruby
# VMの中で

 sudo su -
 yum install httpd
 systemctl start httpd
 hostname > /var/www/html/index.html
 curl localhost


[root@centos7-vm1 ~]#  curl localhost
centos7-vm1.nixcraft.com
```

hostnameが表示されるようになりました。

## iptables on Host

次に host 側の設定です。外から host:9999/tcp にアクセスされたら、VMにフォワードさせます。

```ruby
GuestIPAddr=192.168.122.94
HostPort=9999
GuestPort=80

iptables -t nat -A PREROUTING -p tcp --dport ${HostPort} -j DNAT --to ${GuestIPAddr}:${GuestPort}
iptables -I FORWARD -d ${GuestIPAddr} -p tcp -m state --state NEW --dport ${GuestPort} -j ACCEPT
```

> 参考
> https://www.timbreofprogram.info/blog/archives/376

設定を確認

```ruby
$ iptables -t nat -nvL  --line-numbers | grep 9999
2        3   188 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:9999 to:192.168.122.94:80

$ iptables -nvL FORWARD  --line-numbers | grep 94
1        3   188 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.122.94       state NEW tcp dpt:80
```

## 外から見れました！

host宛に、違うマシンからアクセスしてみます

```ruby
$ curl 10.0.0.10:9999
centos7-vm1.nixcraft.com
```

# cli / 後始末

hard resetはhard rebootでの意味で、OS 初期化ではないらしい

```ruby
VM=centos7-vm1

# VM list 
virsh list --all

# Get VM info
virsh dominfo $VM

# Stop/shutdown a VM
virsh shutdown $VM

# Start VM
virsh start $VM

# Mark VM for autostart at boot time
virsh autostart $VM

# Reboot (soft & safe reboot) VM
virsh reboot $VM

# Reset (hard reset/not safe) VM
virsh reset $VM

# delete VM
	 virsh shutdown $VM
	 virsh undefine $VM
	 virsh pool-destroy $VM
	 D=/var/lib/libvirt/images
	 rm -ri $D/$VM
```