1. Tổng quan.
Trong quá trình vận hành để phục vụ cho việc bảo trì và nâng cấp hệ thống chúng ta cần chuyển các VM từ host này sang host khác. Với các VM đang chạy các ứng dụng quan trọng chúng ta không thể tắt nó đi trong quá trình chuyển. Trên KVM việc live migrate sẽ đảm bảo được các yêu cầu này.
2. Chuẩn bị.
Chuẩn bị ba máy cài đặt hệ điều hành Ubuntu 20.04 trong đó một máy dùng để cài đặt NFS dùng làm máy lưu file disk của VM và 2 máy cài đặt KVM.
Ba máy này cần có card mạng và có thể kết nối được với nhau
Đây là môi trường lap nên mình tắt firewalld trên cả 3 máy, để tắt sử dụng 3 câu lệnh sau trên cả ba máy:
sudo ufw disable
sudo systemctl stop ufw
sudo systemctl disable ufw
3. Sơ đồ lab.
4. Triển khai.
4.1. Cấu hình phân dải tên miền (thực hiện trên tất cả các máy).
Để có thể live migrate giữa 2 KVM host thì 2 máy này cần biết tên miền của nhau. Bạn có thể cấu hình dịch vụ DNS phân dải tên miền cho các 2 máy này. Đây là mô hình lap có ít máy nên tôi sẽ cấu hình luôn trong file /etc/hosts.
- 192.168.13.227, 192.168.13.228, 192.168.13.229 địa chỉ ip của các máy.
- kvm-node01.hoanghd.com, kvm-node02.hoanghd.com, kvm-node03.hoanghd.com chính là domain của các máy.
- kvm-node01, kvm-node02, kvm-node03 chính là hostname của các máy (dùng lệnh hostname để lấy tên hostname của các máy chủ). Ví dụ ở dưới là xem thông tin hostname của máy chủ kvm-node01.
$ hostname
kvm-node01
Sau khi có đầy đủ thông tin, bạn chạy lệnh sau trên lần lượt các máy.
echo '''192.168.13.227 kvm-node01.hoanghd.com
192.168.13.228 kvm-node02.hoanghd.com kvm-node02
192.168.13.229 kvm-node03.hoanghd.com kvm-node03''' >> /etc/hosts
Hãy chắc chắn file host đã trỏ thành công và có kết nối đến các server.
$ ping kvm-node01.hoanghd.com
PING kvm-node01.hoanghd.com (192.168.13.227) 56(84) bytes of data.
64 bytes from kvm-node01.hoanghd.com (192.168.13.227): icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from kvm-node01.hoanghd.com (192.168.13.227): icmp_seq=2 ttl=64 time=0.031 ms
^C
--- kvm-node01.hoanghd.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1029ms
rtt min/avg/max/mdev = 0.031/0.031/0.032/0.000 ms
$ ping kvm-node01
PING kvm-node01 (127.0.1.1) 56(84) bytes of data.
64 bytes from kvm-node01 (127.0.1.1): icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from kvm-node01 (127.0.1.1): icmp_seq=2 ttl=64 time=0.030 ms
--- kvm-node01 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1023ms
rtt min/avg/max/mdev = 0.029/0.029/0.030/0.000 ms
$ ping kvm-node02.hoanghd.com
PING kvm-node02.hoanghd.com (192.168.13.228) 56(84) bytes of data.
64 bytes from kvm-node02.hoanghd.com (192.168.13.228): icmp_seq=1 ttl=64 time=0.188 ms
64 bytes from kvm-node02.hoanghd.com (192.168.13.228): icmp_seq=2 ttl=64 time=0.235 ms
--- kvm-node02.hoanghd.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1026ms
rtt min/avg/max/mdev = 0.188/0.211/0.235/0.023 ms
$ ping kvm-node02 (192.168.13.228) 56(84) bytes of data.
64 bytes from kvm-node02.hoanghd.com (192.168.13.228): icmp_seq=1 ttl=64 time=0.174 ms
64 bytes from kvm-node02.hoanghd.com (192.168.13.228): icmp_seq=2 ttl=64 time=0.212 ms
--- kvm-node02 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.174/0.193/0.212/0.019 ms
$ ping kvm-node03.hoanghd.com
PING kvm-node03.hoanghd.com (192.168.13.229) 56(84) bytes of data.
64 bytes from kvm-node03.hoanghd.com (192.168.13.229): icmp_seq=1 ttl=64 time=0.204 ms
64 bytes from kvm-node03.hoanghd.com (192.168.13.229): icmp_seq=2 ttl=64 time=0.206 ms
--- kvm-node03.hoanghd.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1020ms
rtt min/avg/max/mdev = 0.204/0.205/0.206/0.001 ms
$ ping kvm-node03
PING kvm-node03 (192.168.13.229) 56(84) bytes of data.
64 bytes from kvm-node03.hoanghd.com (192.168.13.229): icmp_seq=1 ttl=64 time=0.175 ms
64 bytes from kvm-node03.hoanghd.com (192.168.13.229): icmp_seq=2 ttl=64 time=0.176 ms
--- kvm-node03 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1014ms
rtt min/avg/max/mdev = 0.175/0.175/0.176/0.000 ms
4.2. Cài đặt NFS server.
Mình sử dụng kvm-node02 làm NFS server, trên NFS Server hãy cài đặt NFS và tiến hành share thư mục cho các KVM Node. Ở kvm-node02 mình tạo thư mục /volumes-ssd (chính là ổ đĩa ssd đang cài os) và mình sử dụng thư mục /volumes-ssd làm ổ đĩa mount với type disk là ssd.
$ ls / | grep volumes-ssd
volumes-ssd
Mình cũng có ổ đĩa sdb 4TB, mình sẽ mount ổ đĩa này vào thư mục /volumes-hdd sử dụng thư mục /volumes-hdd làm ổ đĩa mount với type disk là hdd.
$ lsblk | grep sdb
sdb 8:16 0 3.7T 0 disk /volumes-hdd
Tiếp theo mình sẽ share 2 thư mục /volumes-hdd và /volumes-ssd để các máy node kvm kết nối vào. Các bước tiến hành như sau:
Bước 1: Đầu tiên các bạn update cập nhật lại các package của Ubuntu bằng command sau :
sudo apt update && sudo apt -y upgrade
Bước 2: Cài đặt package nfs-kernel-server trên máy NFS Server
sudo apt install nfs-kernel-server -y
Kiểm tra NFS-Server service đã hoạt động chưa?
$ sudo systemctl status nfs-kernel-server.service
● nfs-server.service - NFS server and services
Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled; vendor preset: enabled)
Active: active (exited) since Sun 2022-12-04 16:04:00 UTC; 8s ago
Main PID: 2429 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 4915)
CGroup: /system.slice/nfs-server.service
Dec 04 16:04:00 webserver-01 systemd[1]: Starting NFS server and services...
Dec 04 16:04:00 webserver-01 systemd[1]: Started NFS server and services.
Bước 3: Export thư mục share, sửa file /etc/exports thêm record sau
echo '/volumes-ssd *(rw,sync,fsid=1,no_subtree_check,no_root_squash)' >> /etc/exports
echo '/volumes-hdd *(rw,sync,fsid=2,no_subtree_check,no_root_squash)' >> /etc/exports
Sau đó restart lại NFS Service
sudo systemctl restart nfs-kernel-server rpcbind
Kiểm tra thư mục share trên NFS Server với lệnh exportfs -v
$ exportfs -v
/volumes-ssd <world>(rw,wdelay,no_root_squash,no_subtree_check,fsid=1,sec=sys,rw,secure,no_root_squash,no_all_squash)
/volumes-hdd <world>(rw,wdelay,no_root_squash,no_subtree_check,fsid=2,sec=sys,rw,secure,no_root_squash,no_all_squash)
4.3. Trên các KVM Node hãy thực hiện cài các nfs-common và mount các thư mục đã share từ NFS Server (thực hiện trên tất cả các kvm node).
Bước 1: Cài package nfs-common để access tới NFS Server
sudo apt update
sudo apt install nfs-common -y
Bước 2: Tạo thư mục mount_path.
mkdir -p /kvm-volumes-ssd
mkdir -p /kvm-volumes-hdd
Bước 2: Mount NFS từ Client (mount NFSv4)
echo '192.168.13.228:/volumes-ssd /kvm-volumes-ssd nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0' >> /etc/fstab
echo '192.168.13.228:/volumes-hdd /kvm-volumes-hdd nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0' >> /etc/fstab
Để mount lại toàn bộ các trường đã khai báo trong file /etc/fstab, bạn hãy thực hiện lệnh mount -a.
sudo mount -a
Xác nhận lại tất cả các kvm node đã mount thành công 2 thư mục /kvm-volumes-ssd và /kvm-volumes-hdd như dưới.
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 48G 0 48G 0% /dev
tmpfs 9.5G 1.6M 9.5G 1% /run
/dev/sda2 219G 12G 197G 6% /
tmpfs 48G 0 48G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 48G 0 48G 0% /sys/fs/cgroup
/dev/loop1 117M 117M 0 100% /snap/core/14399
tmpfs 9.5G 0 9.5G 0% /run/user/0
192.168.13.228:/kvm-volumes-ssd 219G 35G 173G 17% /kvm-volumes-ssd
192.168.13.228:/kvm-volumes-hdd 3.6T 0 3.4T 0% /kvm-volumes-hdd
5. Cài đặt và chuẩn bị môi trường cho KVM.
Bước 1: Cài đặt KVM.
Sau khi thực hiện cấu hình NFS server xong, ta cần thực hiện cài đặt KVM trên hai node kvm-node01, kvm-node02 và kvm-node03, để cài đặt ta sử dụng câu lệnh:
sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virt-manager cloud-image-utils -y
Bước 2. Tạo môi trường cho KVM (vì bước này chúng ta thao tác trên thư mục share nên bạn hãy chọn 1 kvm node để thực hiện, mình sử dụng kvm-node1).
Tạo các folder để lưu config, images, network,…
sudo mkdir -p /kvm-volumes-hdd/images /kvm-volumes-hdd/network_xml
sudo chmod +x /kvm-volumes-hdd/images /kvm-volumes-hdd/network_xml
Hãy tải một số images về, bạn có thể chọn 1 trong 4 image dưới hoặc tải hết cũng được.
wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img -O /kvm-volumes-hdd/images/bionic-server-ubuntu1804-cloudimg-amd64.img
wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img -O /kvm-volumes-hdd/images/focal-server-ubuntu2004-cloudimg-amd64.img
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img -O /kvm-volumes-hdd/images/jammy-server-ubuntu2204-cloudimg-amd64.img
wget https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2c -O /kvm-volumes-hdd/images/CentOS-7-x86_64-GenericCloud.qcow2c
Bước 3: Tạo network cho virtual machine (áp dụng cho tất cả các máy kvm node).
Mình sử dụng card bridged là br0, bạn có thể sử dụng lệnh brctl show để show card br0 của máy bạn. Nếu bạn chưa có card bridge, hãy thực hiện nhanh theo các bước sau.
sudo sed -i 's|#group = "root"|group = "root"|' /etc/libvirt/qemu.conf
sudo sed -i 's|#user = "root"|user = "root"|' /etc/libvirt/qemu.conf
systemctl restart libvirtd
echo '''net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0''' >> /etc/sysctl.conf
modprobe br_netfilter
sysctl -p /etc/sysctl.conf
Mình sử dụng netplan để tạo card bridge nên mình sẽ sửa lại file yaml như dưới, với:
- enp6s0f0: tên card mạng vật lý của server
- br0: tên card bridge (tên này tự bạn đặt)
echo '''network:
version: 2
renderer: networkd
ethernets:
enp6s0f0:
dhcp4: false
dhcp6: false
bridges:
br0:
interfaces: [ enp6s0f0]
addresses: [ 192.168.13.227/23 ]
gateway4: 192.168.12.5
mtu: 1500
nameservers:
addresses: [ 8.8.8.8, 1.1.1.1 ]
parameters:
stp: true
forward-delay: 4
dhcp4: no
dhcp6: no''' > /etc/netplan/$(ls '/etc/netplan/' | grep '.yaml')
Chạy lệnh dưới để áp dụng config mới cho network.
sudo netplan generate
sudo netplan --debug apply
Sau khi áp dụng config mới thành công, bạn sẽ thấy card enp6s0f0 đã mất ip và ip được chuyển qua cho card br0 giữ.
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp6s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
link/ether e8:9a:8f:4f:db:34 brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether e8:9a:8f:4f:db:34 brd ff:ff:ff:ff:ff:ff
inet 192.168.13.227/23 brd 192.168.13.255 scope global br0
valid_lft forever preferred_lft forever
inet6 fe80::ea9a:8fff:fe4f:db34/64 scope link
valid_lft forever preferred_lft forever
Khi bạn gõ lệnh brctl show bạn đã thấy card br0 xuất hiện, và card br0 này được gắn vào card mạng vậy lý có tên là enp6s0f0
$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.e89a8f4fdb34 yes enp6s0f0
Mình sử dụng bridged-network cho ví dụ này nên mình triển khai file xml như sau.
echo '''<network>
<name>bridged-network</name>
<forward mode="bridge" />
<bridge name="br0" />
</network>''' > /kvm-volumes-hdd/network_xml/bridged-network.xml
Chạy các lệnh dưới để thêm network mới.
virsh net-define /kvm-volumes-hdd/network_xml/bridged-network.xml
virsh net-start bridged-network
virsh net-autostart bridged-network
Mình không muốn sử dụng network default nên mình sẽ xoá nó luôn.
virsh net-destroy default
virsh net-undefine default
Và đây là kết quả cuối cùng, bạn đã có 1 network bridged với tên là bridged-network.
$ virsh net-list --all
Name State Autostart Persistent
-------------------------------------------------------
bridged-network active yes yes
6. Tạo máy ảo.
Bước 1: Tạo sshkey.
sudo mkdir /kvm-volumes-hdd/vps-test
sudo chmod +x /kvm-volumes-hdd/vps-test
sudo mkdir -p /kvm-volumes-hdd/vps-test/ssh-keygen
sudo chmod 600 /kvm-volumes-hdd/vps-test/ssh-keygen
cd /kvm-volumes-hdd/vps-test/ssh-keygen
ssh-keygen -t rsa -b 4096 -f id_rsa -C hoanghd -N "" -q
Bước 2: Tạo file cấu hình /kvm-volumes-hdd/vps-test/cloud_init.cfg cho máy ảo, file này khai báo 1 số thông tin cơ bản để khởi tạo máy ảo như username, password, hostname, ….
echo """
#cloud-config
hostname: vps-test
fqdn: vps-test.hoanghd.com
manage_etc_hosts: true
users:
- name: ubuntu
sudo: ALL=(ALL) NOPASSWD:ALL
groups: users, admin
home: /home/ubuntu
shell: /bin/bash
lock_passwd: true
ssh-authorized-keys:
- $(cat /kvm-volumes-hdd/vps-test/ssh-keygen/id_rsa.pub)
- name: hoanghd
sudo: ALL=(ALL) NOPASSWD:ALL
groups: users, admin
home: /home/hoanghd
shell: /bin/bash
lock_passwd: false
package_update: true
packages_upgrade: true
packages:
- qemu-guest-agent
- traceroute
# only cert auth via ssh (console access can still login)
ssh_pwauth: false
disable_root: false
chpasswd:
list: |
hoanghd:hoanghd
expire: False
runcmd:
- sudo touch /etc/cloud/cloud-init.disabled""" > /kvm-volumes-hdd/vps-test/cloud_init.cfg
Bước 3: Tạo file cấu hình network cho máy ảo.
echo '''version: 2
ethernets:
enp1s0:
dhcp4: false
addresses: [ 192.168.13.231/23 ]
gateway4: 192.168.12.5
nameservers:
addresses: [ 1.1.1.1, 8.8.8.8 ]'''> /kvm-volumes-hdd/vps-test/network_config_static.cfg
Bước 4: Hãy tạo 1 volume ảo, mình cho dung lượng ổ cứng của máy ảo này là 10GB, trỏ volume ảo này đến file image hệ điều hành mà bạn mong muốn. Mình sử dụng hệ điều hành Ubuntu 18.04 nên mình sẽ trỏ đến image bionic-server-ubuntu1804-cloudimg-amd64.img đã download sẵn trong thư mục /kvm-volumes-hdd/images/
$ qemu-img create -b /kvm-volumes-hdd/images/bionic-server-ubuntu1804-cloudimg-amd64.img -f qcow2 /kvm-volumes-hdd/vps-test/os-vps-test.qcow2 10G
Formatting '/kvm-volumes-hdd/vps-test/os-vps-test.qcow2', fmt=qcow2 size=10737418240 backing_file=/kvm-volumes-hdd/images/bionic-server-ubuntu1804-cloudimg-amd64.img cluster_size=65536 lazy_refcounts=off refcount_bits=16
Xác nhận lại volume vừa tạo.
$ qemu-img info /kvm-volumes-hdd/vps-test/os-vps-test.qcow2
image: /kvm-volumes-hdd/vps-test/os-vps-test.qcow2
file format: qcow2
virtual size: 10 GiB (10737418240 bytes)
disk size: 196 KiB
cluster_size: 65536
backing file: /kvm-volumes-hdd/images/bionic-server-ubuntu1804-cloudimg-amd64.img
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false
Bước 5: Tạo 1 volume khác để mount 2 file cloud_init.cfg và network_config_static.cfg. Mục đích để khi khởi tạo máy ảo, hệ thống sẽ load toàn bộ thông tin lưu ở 2 file config này vào máy ảo.
$ cloud-localds -v --network-config=/kvm-volumes-hdd/vps-test/network_config_static.cfg /kvm-volumes-hdd/vps-test/vps-test-seed.qcow2 /kvm-volumes-hdd/vps-test/cloud_init.cfg
wrote /kvm-volumes-hdd/vps-test/vps-test-seed.qcow2 with filesystem=iso9660 and diskformat=raw
Xác nhận lại việc tạo volume thành công.
$ qemu-img info /kvm-volumes-hdd/vps-test/vps-test-seed.qcow2
image: /kvm-volumes-hdd/vps-test/vps-test-seed.qcow2
file format: raw
virtual size: 368 KiB (376832 bytes)
disk size: 368 KiB
Sau khi chuẩn bị trong các bước trên, hãy chắc chắn rằng các thành phần của bạn đã đầy đủ, hãy tham khảo cây thư mục của mình ở bên dưới.
/kvm-volumes-hdd/
├── images
│ ├── bionic-server-ubuntu1804-cloudimg-amd64.img
│ ├── CentOS-7-x86_64-GenericCloud.qcow2c
│ ├── focal-server-ubuntu2004-cloudimg-amd64.img
│ └── jammy-server-ubuntu2204-cloudimg-amd64.img
├── network_xml
│ ├── bridged-network.xml
└── vps-test
├── cloud_init.cfg
├── network_config_static.cfg
├── os-vps-test.qcow2
├── ssh-keygen
│ ├── id_rsa
│ └── id_rsa.pub
└── vps-test-seed.qcow2
Bước 6: Khởi tạo máy ảo
Sau khi chuẩn bị xong các volume, bạn hãy chạy lệnh dưới để triển khai 1 máy ảo mới có tên vps-test. Kết quả trả về Domain creation completed cho thấy bạn đã khởi tạo thành công máy ảo.
$ virt-install --name vps-test \
--virt-type kvm --memory 4096 --vcpus 4 \
--boot hd,menu=on \
--disk path=/kvm-volumes-hdd/vps-test/vps-test-seed.qcow2,device=cdrom \
--disk path=/kvm-volumes-hdd/vps-test/os-vps-test.qcow2,device=disk \
--graphics vnc \
--os-type Linux --os-variant ubuntu18.04 \
--network network:bridged-network \
--console pty,target_type=serial \
--noautoconsole
Starting install...
Domain creation completed.
Mình triển khai máy ảo này trên kvm-node01, sử dụng virsh list –all để list tất cả các máy ảo, bạn sẽ thấy máy ảo vps-test đang ở trạng thái running.
root@kvm-node01:~# ip a | grep 192.168.13.227
inet 192.168.13.227/23 brd 192.168.13.255 scope global br0
root@kvm-node01:~# virsh list --all
Id Name State
--------------------------
5 vps-test running
Kết quả ping vào máy ảo.
root@kvm-node01:~# ping 192.168.13.231
PING 192.168.13.231 (192.168.13.231) 56(84) bytes of data.
64 bytes from 192.168.13.231: icmp_seq=1 ttl=64 time=0.330 ms
64 bytes from 192.168.13.231: icmp_seq=2 ttl=64 time=0.306 ms
64 bytes from 192.168.13.231: icmp_seq=3 ttl=64 time=0.238 ms
--- 192.168.13.231 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2045ms
rtt min/avg/max/mdev = 0.238/0.291/0.330/0.038 ms
Như thông tin đã khai báo ở trên, bây giờ bạn có thể ssh vào máy ảo vps-test bằng username ubuntu sử dụng sshkey hoặc username/password là hoanghd/hoanghd.
ssh -i /kvm-volumes-hdd/vps-test/ssh-keygen/id_rsa ubuntu@192.168.13.231
Bước 7: Kết nối qemu giữa hai KVM host.
Để có thể live migrate giữa hai host thì ba host này cần phải kết nối được với nhau. Để làm được việc này ta thực hiện các bước sau ở trên cả ba máy host KVM.
sed -i 's/#listen_tls = 0/listen_tls = 0/g' /etc/libvirt/libvirtd.conf
sed -i 's/#listen_tcp = 1/listen_tcp = 1/g' /etc/libvirt/libvirtd.conf
sed -i 's/#tcp_port = "16509"/tcp_port = "16509"/g' /etc/libvirt/libvirtd.conf
sed -i 's/#listen_addr = "192.168.0.1"/listen_addr = "0.0.0.0"/g' /etc/libvirt/libvirtd.conf
sed -i 's/#auth_tcp = "sasl"/auth_tcp = "none"/g' /etc/libvirt/libvirtd.conf
sed -i 's/#LIBVIRTD_ARGS="--listen"/LIBVIRTD_ARGS="--listen"/g' /etc/sysconfig/libvirtd
Restart lại libvirtd trên cả ba máy kvm node.
sudo systemctl restart libvirtd
Bước 8: Thay đổi file cấu hình mặc định của máy ảo, sử dụng lệnh virsh edit <tên máy ảo>.
root@kvm-node01:~# virsh edit vps-test
Tìm đến phần config CPU, chúng ta chỉnh sửa lại 2 thông số của CPU để kvm có thể migrage được khi 2 node kvm khác loại CPU.
<cpu mode='host-model' check='partial'/>
Tại cpu mode chỉnh sửa host-model thành host-passthrough, tại tuỳ chọn check chỉnh sửa partial thành none.
<cpu mode='host-passthrough' check='none'/>
Tìm đến phần config của disk và chỉnh 1 số thông tin như sau.
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/kvm-volumes-hdd/vps-test/os-vps-test.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
</disk>
Tại config <driver name=’qemu’ type=’qcow2’/> hãy thêm 1 tuỳ chọn mới cache=’none’ như ở dưới. Tuỳ chọn này sẽ giúp tránh rủi ro mất mát dữ liệu khi live migrage.
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='none'/>
<source file='/kvm-volumes-hdd/vps-test/os-vps-test.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
</disk>
Nếu edit thành công, bạn lưu lại sẽ có thông báo như dưới.
root@kvm-node01:~# virsh edit vps-test
Domain vps-test XML configuration edited.
Để thay đổi có hiệu lục, tiến hành shutdown và start lại máy ảo.
root@kvm-node01:~# virsh shutdown vps-test
Domain vps-test is being shutdown
root@kvm-node01:~# virsh start vps-test
Domain vps-test started
Để kiểm tra kết quả live migrage hãy sử dụng 1 máy nào đó ssh vào máy ảo vps-test và bạn hãy thả ping tới 8.8.8.8 để kiểm tra rớt gói khi live migrage.
ssh -i /kvm-volumes-hdd/vps-test/ssh-keygen/id_rsa ubuntu@192.168.13.231
Trong khi máy ảo vps-test vẫn đang ping tới 8.8.8.8 thì bạn tiến hành migrage sang 1 node kvm khác (ví dụ mình sẽ migrage sang kvm-node02).
root@kvm-node01:~# virsh migrate --live vps-test qemu+ssh://kvm-node02.hoanghd.com/system
Chỉ mất khoảng 5-10s, bạn máy ảo vps-test đã migrage thành công sang kvm-node02, trên kvm-node02 sử dụng lệnh virsh list –all để kiểm tra máy ảo thì bạn thấy máy ảo vps-test đang ở chế độ running.
root@kvm-node02:/kvm-volumes-hdd# virsh list --all
Id Name State
--------------------------
6 vps-test running
Quay lại màn hình ping 8.8.8.8 của máy ảo vps-test bạn sẽ thấy session ssh không bị rớt và quá trình migrage của mình chỉ mất 3 gói tin (27/30).
ubuntu@vps-test:~$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=41.6 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=41.2 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=116 time=43.1 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=116 time=41.1 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=116 time=40.4 ms
64 bytes from 8.8.8.8: icmp_seq=6 ttl=116 time=41.5 ms
64 bytes from 8.8.8.8: icmp_seq=7 ttl=116 time=40.8 ms
64 bytes from 8.8.8.8: icmp_seq=8 ttl=116 time=40.5 ms
64 bytes from 8.8.8.8: icmp_seq=9 ttl=116 time=41.7 ms
64 bytes from 8.8.8.8: icmp_seq=10 ttl=116 time=45.1 ms
64 bytes from 8.8.8.8: icmp_seq=11 ttl=116 time=41.3 ms
64 bytes from 8.8.8.8: icmp_seq=12 ttl=116 time=45.2 ms
64 bytes from 8.8.8.8: icmp_seq=13 ttl=116 time=44.9 ms
64 bytes from 8.8.8.8: icmp_seq=14 ttl=116 time=41.3 ms
64 bytes from 8.8.8.8: icmp_seq=15 ttl=116 time=41.5 ms
64 bytes from 8.8.8.8: icmp_seq=16 ttl=116 time=41.7 ms
64 bytes from 8.8.8.8: icmp_seq=17 ttl=116 time=41.3 ms
64 bytes from 8.8.8.8: icmp_seq=18 ttl=116 time=41.4 ms
64 bytes from 8.8.8.8: icmp_seq=19 ttl=116 time=47.1 ms
64 bytes from 8.8.8.8: icmp_seq=20 ttl=116 time=42.5 ms
64 bytes from 8.8.8.8: icmp_seq=21 ttl=116 time=42.2 ms
64 bytes from 8.8.8.8: icmp_seq=22 ttl=116 time=42.9 ms
64 bytes from 8.8.8.8: icmp_seq=26 ttl=116 time=45.7 ms
64 bytes from 8.8.8.8: icmp_seq=27 ttl=116 time=41.3 ms
64 bytes from 8.8.8.8: icmp_seq=28 ttl=116 time=43.1 ms
64 bytes from 8.8.8.8: icmp_seq=29 ttl=116 time=45.3 ms
64 bytes from 8.8.8.8: icmp_seq=30 ttl=116 time=41.6 ms
--- 8.8.8.8 ping statistics ---
30 packets transmitted, 27 received, 10% packet loss, time 29114ms
rtt min/avg/max/mdev = 40.484/42.548/47.137/1.797 ms
Tổng kết
Đến đây bạn đã có thể thiết lập để live migrate thành công. Trong bài viết chắc chắn còn nhiều thiếu sót rất mong được sự góp ý của các bạn.
Chúc bạn thành công!