Skip to the content.

Quản lý vòng đời của máy ảo.

1. Trạng thái của máy ảo.

- Lệnh trợ giúp để xem các lệnh quản lý máy ảo:

virsh help domain

- Một số lệnh để quản lý trạng thái của máy ảo:
    - `start`: Khởi động một máy ảo đang ở trạng thái không hoạt động.
    - `shutdown`: Tắt máy nhưng có thông báo cho hệ điều hành khách.
    - `reboot`: Khởi động lại máy ảo từ hệ điều hành 
    - `reset`: Khởi động lại máy ảo.
    - `destroy`: Tắt máy giống như rút nguồn của máy ảo bằng cách libvirt sẽ kill tiến trình QEMU của máy ảo trên hệ thống.
    - `suspend`: Tạm dùng một máy ảo.
    - `resume`: Tiếp tục chạy một máy ảo bị dừng.
    - `save [domain] [file]` để lưu bộ nhớ(ram) của máy ảo vào file và sau đó tắt máy ảo. Khi sử dụng tùy chọn `manegedsave` thì file sẽ tự động được lưu vào thư mục ` /var/lib/libvirt/qemu/save`.
    - `restore [file]`: Chạy một máy ảo từ file bộ nhớ đước save trước đó.

- Một số lệnh để tạo/define một máy ảo:
    - `create`: Tạo một máy ảo từ một file XML và chạy máy ảo từ file đó. Máy ảo này không được libvirt define, khi máy ảo tắt, nó sẽ biến mất khỏi libvirt.
    - `define`: Nó sẽ xác đinh (nhưng không chạy) một máy ảo từ file XML. Từ đó thêm được máy ảo và libvirt để quản lý.
    - `undefine`: nó sẽ xóa máy ảo khỏi libvirt.

## 2. QEMU Guest Agent.
- QEMU Guest Agent là một dịch vụ chạy trong HĐH máy ảo, hoạt động như một kênh giao tiếp giữa hypervisor với máy ảo. Hypervisor sử dụng kênh này để có thể lấy thông tin từ HĐH máy ảo hoặc có thể thực thi câu lệnh đến hệ điều hành máy ảo. Giao thức mà nó sử dụng để thực thi lệnh trên HĐH khách là **Qemu Machine Protocol(QMP)**. Giao tiếp giữa guest và hypervisor thông qua một kênh virtio serial hoặc một isa-serial

![](https://i.imgur.com/64l5ilN.png)
- Về phía hypervisor, một tệp socket Linux tương ứng cũng sẽ được tạo trong `/var/lib/libvirt/qemu/channel/target/`:

root@m4700:~# file /var/lib/libvirt/qemu/channel/target/domain-5-centos7.0-3/org.qemu.guest_agent.0 /var/lib/libvirt/qemu/channel/target/domain-5-centos7.0-3/org.qemu.guest_agent.0: socket

- Cài QEMU guest agent trên Guest Centos bằng cách chạy lệnh sau và restart máy ảo:

yum install qemu-guest-agent


## 3. Vitual video card và đồ họa.
- Để cung cấp đồ họa cho máy ảo, QEMU cung cấp hai thành phần cho máy ảo: một video card ảo, và một phương pháp hay một giao thức để truy cập được vào giao diện đồ họa của máy ảo.
### Card màn hình ảo.
- Card màn hình ảo có nhiệm vụ giống card màn hình vật lý,cung cấp đầu ra cho đồ họa của máy ảo đến một thiết bị hiển thị. QEMU hỗ trợ giả lập nhiều loại card đồ họa, có thể sử dụng libvirt để có thể thêm các tùy chọn card đồ họa sau đây cho máy ảo: 
    - **Cirrus** (mặc định trong libvirt): Cirrus Logic GD5446 Video card. Các bản Window từ Window 95 nên sử dụng card đồ họa này.
    - **VGA**: Standard VGA card with Bochs VBE extensions. If your guest OS supports the VESA 2.0 VBE extensions (e.g. Windows XP) and if you want to use high resolution modes (>= 1280x1024x16), then you should use this option.
    - **VMVGA**: VMWare SVGA-II compatible adapter. Use it if you have a sufficiently recent XFree86/XOrg server or a Windows guest with a driver for this card.
    - **QXL**: The QXL paravirtual graphic card. It is VGA-compatible (including VESA 2.0 VBE support), although it works best with installed QXL guest drivers. This is the recommended choice when using the spice protocol.
    - **VirtIO**

![](https://i.imgur.com/1xe6DCq.png)

### Đồ họa
- Sau khi cấu hình card màn hình thì cần có một phương pháp để có thể truy cập vào nó. Ở đây, nó được thực hiện thông qua các server đồ họa: VNC và SPICE là hai server đồ họa được hỗ trợ với ảo hóa KVM ở thời điểm hiện tại.

#### VNC graphic server.
- Khi mà VNC graphic server được enable bằng libvirt, QEMU sẽ chuyển hướng đầu ra đồ họa của máy ảo đến VNC server sẵn có của nó. VNC server sẽ lằng nghe trên một cổng mạng để VNC client có thể kết nối đến.

![](https://i.imgur.com/KUGioQe.png)

- Có một số tùy chọn khi cấu hình VNC server:
    - **Type**: Loại graphic server, ở đây là VNC
    - **Address**: Địa chỉ mà VNC server lắng nghe.
    - **Port**: Port sử dụng để lắng nghe.
    - **Password**: Mật khẩu để bảo vệ truy cập VNC.
    - **Keymap**: có thể cấu hình keymap riêng cho kết nối VNC này.

- VNC client có thể được sử dụng trên hầu hết tất cả các nền tảng. Không nên public kết nối VNC ra mạng công cộng, vì nó không được mã hóa.

### SPICE graphic server.
- SPICE - Simple Protocol for Independent Computing Enviroments là một trong những thay đổi mới nhất đối với công nghệ ảo hóa mã nguồn mở.
- SPICE là giải pháp mã nguồn mở duy nhất có sẵn trên Linux mà có audio hai chiều. Nó cung cấp khả năng render 2D chất lượng cao. SPICE cũng cung cấp khả năng mã hóa, nén và usb passthrough qua mạng. SPICE là lựa chọn tốt nhất khi cài máy ảo mà sử dụng GUI.
- SPICE được libvirt lựa chọn làm mặc định. Cấu hình SPICE server cũng giống như cấu hình VNC, thay VNC thành Spice, thêm vào đó sẽ có thêm tùy chọn TLS port(vì Spice mã hóa dữ liệu).

![](https://i.imgur.com/RwwHKqL.png)

### Các cách để truy cập console của máy ảo.
- Có thể truy cập console của máy ảo đơn giản nhất bằng cách sử dụng `virt-manager`.
- `virt-viewer` cũng là một tool hữu ích để giúp truy cập đến console của máy ảo, nó hữu ích khi mà truy cập vào console máy ảo trên một remote server. Ví dụ:

![](https://i.imgur.com/UrO8jlo.png)

- Nếu môi trường chỉ hỗ trợ text console, thì phải sử dụng `virsh` để có thể truy cập console với câu lệnh `virsh console vm-name`.Nó yêu cầu một số cấu hình trên hệ điều hành máy ảo:
    - Trên Linux sử dụng GRUB, thêm dòng sau vào file /boot/grub/grub.conf và khởi động lại máy ảo:
    ```
    console=tty0 console=ttyS0,115200
    ```
    > Nếu không thể truy cập vào máy ảo có thể sử dụng guestfs để có thể chỉnh sửa từ disk image của máy ảo.
    - Trên Linux sử dụng GRUB2, thêm giá trị `console=tty0 console=ttyS0` vào dòng `GRUB_CMDLINE_LINUX` trong file ` /etc/default/grub` lưu lại sau đó chạy lệnh `grub2-mkconfig -o /boot/grub2/grub.cfg` và lệnh `systemctl start getty@ttyS0`
    Chạy lệnh: 
    Sau đó kết nối bằng bằng lệnh:
    ```
    virsh console <vm-name>
    ```



## 4. Migrate máy ảo.
Nói đến ảo hóa phải nói đến sự linh hoạt. Migrate máy ảo tính năng trong ảo hóa mà thể hiện sự linh hoạt này. Migrate là sự dịch chuyển máy ảo từ một server vật lý này đến server vật lý khác với downtime nhỏ hoặc không có downtime.
Có hai kiểu migrate là offline và online.

### Offline migration.
Trong suốt quá trình migrate, máy ảo sẽ trong trạng thái shutdown hoặc suspended. Máy ảo sẽ được khởi động hoặc tiếp tục sau khi đã di chuyển đến server muốn di chuyển đến.

### Online or Live migration
Ở kiểu migrate này, máy ảo sẽ được di chuyển đến máy chủ đích trong khi nó vẫn đang chạy trên máy chủ nguồn. Quá trình này trong suốt đối với người dùng mà đang dùng máy ảo. 
Migrate trong KVM có thể dịch chuyển máy ảo mà không cần quan tâm đến hệ điều hành của máy ảo. Nó cũng độc lập với phần cứng, hoàn toàn có thể dịch chuyển một máy ảo đang chạy trên hypervisor sử dụng nhân ADM sang một hypervisor sử dụng nhân Intel.

### Lợi ích của việc dịch chuyển máy ảo 
- Lợi ích chính của Live migration là tăng uptime và giảm downtime.
- Tiết kiệm năng lượng. 
- Dễ dàng nâng cấp phần cứng, phần mềm khi cho server khi di chuyển hết máy ảo sang server khác.
### Yêu cầu để migrate
- Nên sử dụng share storage làm storage pool cho cả hai hypervisor, cũng có thể sử dụng hệ thống lưu trữ riêng biệt cho livemigrate. Tên storage pool, vị trí file phải giống nhau trên cả hai.
- Nếu có ổ đĩa ảo được gắn vào máy ảo thì ổ đĩa ảo này nên có trên cả hai hypervisor.
- Mạng ảo được sử dụng bởi máy ảo cũng nên có trên cả hai hypervisor.
- Bridge mà cấu hình kết nối mạng nên có trên cả hai hypervisor.
- Việc dịch chuyển có thể bị lỗi nếu như phiên bản libvirt hoặc qemu-kvm trên các hypervisor khác nhau.
- Thời gian trên cả hai hypervisor nên đồng bộ, nên sử dụng NTP giống nhau.

## 5. Lab Migrate.
### 5.1. Mô hình bài lab.
Mô hình bài lab để có thể migrate máy ảo giữa hai host ảo hóa KVM với máy ảo được chạy trên share storage(NFS):

![](https://i.imgur.com/qXBnhD7.png)

Cấu hình địa chỉ ip:

kvm1: 192.167.50.10/24 kvm2: 192.168.50.20/24 nfs: 192.168.50.99/24

### 5.2. Chuẩn bị share storage.
Tiến hành cấu hình NFS server để làm share storage cho 2 host kvm.
- Cài NFS server bằng câu lệnh:

yum install nfs-utils

- Tạo một thư mục để share và thay đổi quyền cho nó:

mkdir /var/nfsshare chmod -R 755 /var/nfsshare chown nfsnobody:nfsnobody /var/nfsshare

- Khởi động và cấu hình để service có thể tự khởi chạy lần khởi động sau:

systemctl enable rpcbind systemctl enable nfs-server systemctl enable nfs-lock systemctl enable nfs-idmap systemctl start rpcbind systemctl start nfs-server systemctl start nfs-lock systemctl start nfs-idmap

- Cấu hình file /etc/exports để share folder vừa tạo với nội dung:

/var/nfsshare 192.168.50.10(rw,sync,no_root_squash) 192.168.50.20(rw,sync,no_root_squash)

- Khởi động lại service nfs-server để nhận cấu hình:

systemctl restart nfs-server

- Cấu hình firewalld:

firewall-cmd –permanent –zone=public –add-service=nfs firewall-cmd –permanent –zone=public –add-service=mountd firewall-cmd –permanent –zone=public –add-service=rpc-bind firewall-cmd –reload


- Trên hai host kvm, kiểm tra nfs:

mount 192.168.122.1:/var/nfsshare /mnt

- Nếu không được thì kiểm tra lại, nếu được thì tiến hành umount thư mục này.

**Tạo storage pool**:
Trên cả hai host kvm1 và kvm2 chạy các lệnh sau để tạo storage pool từ NFS- server:

mkdir -p /var/lib/virt/images virsh pool-define-as
–name testvms
–type netfs
–source-host 192.168.50.99
–source-path /var/nfsshare
–target /var/lib/virt/images/ virsh pool-start testvms virsh pool-autostart testvms


### 5.3. Lab Live migration.
- Cấu hình ssh keypair giữa hai host để không cần nhập mật khẩu.
- Cấu hình tắt SElinux:

setenforce 0

và sửa file cấu hình SElinux /etc/sysconfig/selinux:

SELINUX=disabled

- Cấu hình firewalld trên host đích cho phép các port sử dụng để migrate:

firewall-cmd –zone=FedoraServer –add-port=49152-49216/tcp –permanent firewall-cmd –reload


Tiến hành live migrate máy ảo *centos7.0* xang host kvm2 bằng câu lệnh:

virsh migrate –live centos7.0 qemu+ssh://192.168.50.20/system tcp://192.168.50.20 –verbose –persistent –unsafe ```

Quá trình live migrate diễn ra nhanh chóng với down time rất thấp.