Ảo hóa với KVM trên máy chủ CentOS 6.0

  • 8.058

Quản Trị Mạng - Từ lâu, KVM (Kernel-based Virtual Machine) được rất nhiều người biết đến là một cơ sở hạ tầng ảo hóa cho nhân Linux dành cho những CPU hỗ trợ công nghệ ảo hóa như Intel VT hoặc AMD-V... Trước đây chúng tôi đã từng hướng dẫn các bạn ảo hóa với KVM trên nền tảng Fedora 12 Server. Hôm nay chúng tôi sẽ tiếp tục giúp các bạn có thể cài đặt, sử dụng KVM để khởi tạo và chạy các máy ảo trên máy chủ CentOS 6.0.

1. Một số lưu ý

Phần minh họa sau chúng tôi sử dụng máy chủ CentOS 6.0 với hostname server1.example.com, địa chỉ IP của KVM host là 192.168.0.100.

SELinux cần được vô hiệu hóa trên hệ thống CentOS 6.0 để có thể làm việc tốt nhất (nếu bạn để SELinux ở chế độ on nó vẫn hoạt động nhưng chúng tôi không chắc chắn về những sự cố có thể xảy ra).

vi /etc/selinux/config
Set SELINUX=disabled

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

Sau đó khởi động lại:

reboot

Ngoài ra chúng ta cần hệ thống desktop được cài đặt virt-manager để kết nối tới giao diện điều khiển đồ họa của máy ảo mà chúng ta sẽ tạo. Ở đây sử dụng Fedora 15.

2. Cài đặt KVM

Trước khi tiến hành, bạn cần xác định xem CPU của mình có hỗ trợ ảo hóa phần cứng hay không:

egrep '(vmx|svm)' --color=always /proc/cpuinfo

Nếu màn hình hiển thị thông tin dạng như sau:

[root@server1 ~]# egrep '(vmx|svm)' --color=always /proc/cpuinfo
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall
 nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy misalignsse
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall
 nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy misalignsse
[root@server1 ~]#

Như vậy là CPU của bạn có hỗ trợ, ngược lại nếu không hiển thị gì thì bạn hãy dừng lại ở đây.

Bây giờ chúng ta import các key GPG cho các gói phần mềm:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*

Tiến hành cài đặt KVM và virtinst (một công cụ để tạo máy ảo):

yum install kvm libvirt python-virtinst qemu-kvm

Sau đó khởi động libvirt daemon:

/etc/init.d/libvirtd start

Kiểm tra xem KVM đã cài đặt thành công hay chưa, chạy lệnh:

virsh -c qemu:///system list

Nếu màn hình hiển thị thông tin sau đây chứng tỏ bạn đã thành công:

[root@server1 ~]# virsh -c qemu:///system list
 Id Name                 State
----------------------------------

[root@server1 ~]#

Ngược lại, bạn hãy thực hiện thêm lần nữa.

Tiếp theo chúng ta cần thiết lập một cầu nối cho mạng trên máy chủ (network bridge) để có thể truy cập máy ảo từ xa bằng các host khác nhau như hệ thống vật lý trong mạng.

Để làm điều này, cài đặt gói bridge-utils:

yum install bridge-utils

Và cấu hình một bridge. Tạo file /etc/sysconfig/network-scripts/ifcfg-br0 (hãy sử dụng các giá trị IPADDR, PREFIX, GATEWAY, DNS1 DNS2 từ tập tin /etc/sysconfig/network-scripts/ifcfg-eth0); bạn cũng cần chắc chắn rằng mình đang dùng giá trị TYPE=Bridge, không phải TYPE=Ethernet:

vi /etc/sysconfig/network-scripts/ifcfg-br0

DEVICE="br0"
NM_CONTROLLED="yes"
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=none
IPADDR=192.168.0.100
PREFIX=24
GATEWAY=192.168.0.1
DNS1=8.8.8.8
DNS2=8.8.4.4
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System br0"

Chỉnh sửa /etc/sysconfig/network-scripts/ifcfg-eth0 như sau (các giá trị BOOTPROTO, IPADDR, PREFIX, GATEWAY, DNS1, DNS2 để ở dạng chú thích và thêm dòng BRIDGE=br0):

vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE="eth0"
NM_CONTROLLED="yes"
ONBOOT=yes
HWADDR=00:1E:90:F3:F0:02
TYPE=Ethernet
#BOOTPROTO=none
#IPADDR=192.168.0.100
#PREFIX=24
#GATEWAY=192.168.0.1
#DNS1=8.8.8.8
#DNS2=8.8.4.4
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
UUID=5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03
BRIDGE=br0

Khởi động lại mạng:

/etc/init.d/network restart

Và chạy lệnh:

ifconfig

Network bridge (br0) sẽ hiển thị như sau:

[root@server1 ~]# ifconfig
br0       Link encap:Ethernet  HWaddr 00:1E:90:F3:F0:02
          inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::21e:90ff:fef3:f002/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:103 errors:0 dropped:0 overruns:0 frame:0
          TX packets:79 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:7434 (7.2 KiB)  TX bytes:21398 (20.8 KiB)

eth0      Link encap:Ethernet  HWaddr 00:1E:90:F3:F0:02
          inet6 addr: fe80::21e:90ff:fef3:f002/64 Scope:Link
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:19511 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11592 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:25980124 (24.7 MiB)  TX bytes:1104371 (1.0 MiB)
          Interrupt:28 Base address:0x6000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:3608 (3.5 KiB)  TX bytes:3608 (3.5 KiB)

virbr0    Link encap:Ethernet  HWaddr 6A:12:69:18:2B:05
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

[root@server1 ~]#

3. Cài đặt virt-viewer hoặc virt-manager trên Fedora 15 Desktop

Tiếp theo chúng ta cần một phương tiện để kết nối tới giao diện điều khiển đồ họa của các guest. Ở đây sử dụng virt-manager cho Fedora 15.

Bắt đầu bằng sử dụng tài khoản root

su

Và chạy:

yum install virt-manager libvirt qemu-system-x86 openssh-askpass

Sau đó cài đặt virt-manager (trong trường hợp bạn đang dùng Ubuntu 11.04).

sudo apt-get install virt-manager

4. Tạo một Debian Squeeze Guest từ dòng lệnh

Bây giờ quay trở lại CentOS 6.0 KVM host.

Và xem:

man virt-install

Để tìm hiểu cách sử dụng virt-install.

Chúng ta sẽ tạo một máy ảo dựa trên hình ảnh trong thư mục /var/lib/libvirt/images/ đã được tạo ra khi cài đặt KVM ở phần 2.

Để tạo một Debian Squeeze guest (trong chế độ bridging) với tên vm10, dung lượng RAM 512MB, hai CPU ảo và file ảnh đĩa cứng /var/lib/libvirt/images/vm10.img (kích thước 12GB). Cho đĩa CD Debian Squeeze Netinstall vào ổ CD và chạy:

virt-install --connect qemu:///system -n vm10 -r 512 --vcpus=2 --disk path=/var/lib/libvirt/images/vm10.img,size=12 -c /dev/cdrom --vnc --noautoconsole --os-type linux --os-variant debiansqueeze --accelerate --network=bridge:br0 --hvm

Tất nhiên, bạn cũng có thể tạo file ảnh ISO của Debian Squeeze Netinstall CD (khuyến cáo nên tạo trong /var/lib/libvirt/images/ bởi khi tạo máy ảo thông qua virt-manager từ Fedora sẽ tìm kiếm file ISO trong thư mục này).

dd if=/dev/cdrom of=/var/lib/libvirt/images/debian-6.0.2.1-amd64-netinst.iso

Và sử dụng file ISO đó bằng lệnh virt-install:

virt-install --connect qemu:///system -n vm10 -r 512 --vcpus=2 --disk path=/var/lib/libvirt/images/vm10.img,size=12 -c /var/lib/libvirt/images/debian-6.0.2.1-amd64-netinst.iso --vnc --noautoconsole --os-type linux --os-variant debiansqueeze --accelerate --network=bridge:br0 --hvm

Kết quả sẽ hiển thị như sau:

[root@server1 ~]# virt-install --connect qemu:///system -n vm10 -r 512 --vcpus=2 --disk path=/var/lib/libvirt/images/vm10.img,size=12 -c /var/lib/libvirt/images/debian-6.0.2.1-amd64-netinst.iso --vnc --noautoconsole --os-type linux --os-variant debiansqueeze --accelerate --network=bridge:br0 --hvm


Starting install...
Allocating 'vm10.img'              |  12 GB     00:00
Creating domain...                 |    0 B     00:00
Domain installation still in progress. You can reconnect to
the console to complete the installation process.
[root@server1 ~]#

5. Kết nối tới Guest

KVM guest sẽ khởi động từ Debian Squeeze Netinstall và bắt đầu cài đặt Debian – đó là lý do tại sao bạn cần kết nối tới giao diện điều khiển đồ họa của guest. Bạn có thể làm điều này với virt-manager trên Fedora 15 desktop.

Vào Applications > System Tools > Virtual Machine Manager để khởi động virt-manager:

Ảo hóa với KVM trên máy chủ CentOS 6.0

Khi virt-manager được chạy lần đầu tiên, bạn sẽ nhận được thông báo lỗi “Unable to open a connection to the libvirt management daemon.” Hãy yên tâm và bỏ qua nó bởi chúng ta không muốn kết nối tới libvirt daemon cục bộ. Kích Close.

Ảo hóa với KVM trên máy chủ CentOS 6.0

Vào File > Add Connection để kết nối vào CentOS 6.0 KVM host:

Ảo hóa với KVM trên máy chủ CentOS 6.0

Tại mục Hypervisor chọn QEMU/KVM, đánh dấu tích vào Connect to remote host. Kích vào nút mũi tên cạnh mục Method để mở một danh sách mới, chọn SSH, phần Username bạn nhập root, phần hostname nhập server1.example.com hoặc địa chỉ IP 192.168.0.100 của CentOS 6.0 KVM host. Cuối cùng ấn Connect.

Ảo hóa với KVM trên máy chủ CentOS 6.0

Nếu đây là lần đầu tiên kết nối tới máy chủ KVM từ xa, bạn cần gõ yes và ấn OK:

Ảo hóa với KVM trên máy chủ CentOS 6.0

Sau đó nhập mật khẩu root của CentOS 6.0 KVM host:

Ảo hóa với KVM trên máy chủ CentOS 6.0

Bạn sẽ thấy vm10 đang chạy. Đánh dấu vào guest đó và kích nút Open để mở giao diện điều khiển:

Ảo hóa với KVM trên máy chủ CentOS 6.0

Nhập lại mật khẩu root cho KVM host lần nữa:

Ảo hóa với KVM trên máy chủ CentOS 6.0

Bây giờ bạn sẽ được kết nối với giao diện điều khiển đồ họa của guest và xem trình cài đặt Debian:

Ảo hóa với KVM trên máy chủ CentOS 6.0

Tiến hành cài đặt Debian như cách thông thường trên một hệ thống vật lý. Lưu ý ở phần cuối của quá trình cài đặt, Debian guest cần khởi động lại. Sau đó guest tự động dừng hoạt động, bạn cần khởi động lại nó. Đối với virt-manager hoặc CentOS 6.0 KVM host ta dùng lệnh sau:

irsh --connect qemu:///system

start vm10

quit

Như vậy bạn có thể kết nối tới guest lần nữa với virt-manager và cấu hình cho nó. Nếu bạn cài đặt OpenSSH (gói openssh-server) trong guest, bạn có thể kết nối tới nó qua SSH client (giống như PuTTY).


6. Tạo một Debian Squeeze Guest từ Desktop với virt-manager

Thay vì tạo Debian Squeeze Guest bằng dòng lệnh mà mục 4 đã trình bày, bạn có thể dễ dàng tạo ra nó trong Fedora desktop bằng cách sử dụng virt-manager (tuy nhiên, máy ảo sẽ được tạo trên CentOS 6.0 KVM host).

Để làm điều này, kích vào nút: Ảo hóa với KVM trên máy chủ CentOS 6.0

Cửa sổ New VM xuất hiện, nhập tên cho VM vào trường Name (ví dụ: vm11), chọn Local install media (ISO image or CDROM) và kích Forward:

Ảo hóa với KVM trên máy chủ CentOS 6.0

Tiếp theo chọn Linux trong menu xổ xuống của mục OS type, chọn Debian Squeeze tại mục Version. Sau đó đánh dấu tích vào Use ISO image rồi ấn nút Browse...

Ảo hóa với KVM trên máy chủ CentOS 6.0

Chọn file debian-6.0.2.1-amd64-netinst.iso mà bạn vừa tạo ở mục 4, ấn Choose Volume:

Ảo hóa với KVM trên máy chủ CentOS 6.0

Ấn Forward:

Ảo hóa với KVM trên máy chủ CentOS 6.0

Cấp phát bộ nhớ và số lượng CPU cho máy ảo, kích Forward:

Ảo hóa với KVM trên máy chủ CentOS 6.0

Ở màn hình tiếp theo, đánh dấu vào Enable storage for this virtual machine, chọn Create a disk image on the computer's hard drive, xác định dung lượng của ổ cứng (ví dụ 12GB), đánh dấu vào Allocate entire disk now. Kích tiếp Forward:

Ảo hóa với KVM trên máy chủ CentOS 6.0

Đến bước cuối cùng của hộp thoại New VM. Tại Advanced options chọn Host device vnet0 (Bridge 'br0'); - đây chính là tên của bridge chúng ta đã tạo ở mục 2. Kích Finish.

Ảo hóa với KVM trên máy chủ CentOS 6.0

File ảnh của ổ đĩa cho VM sẽ được khởi tạo, sau đó VM sẽ khởi động. Nhập mật khẩu root của CentOS 6.0 KVM host:

Ảo hóa với KVM trên máy chủ CentOS 6.0

Kết quả là bạn sẽ được kết nối tới giao diện điều khiển của guest và xem bộ cài đặt Debian:

Ảo hóa với KVM trên máy chủ CentOS 6.0

Tiến hành cài đặt Debian như bình thường.


7. Quản lý một KVM Guest từ dòng lệnh

KVM guests có thể được quản lý thông qua lệnh virsh. Chức năng này gọi là virtual shell.

virsh --connect qemu:///system

Virtual shell sẽ được hiển thị như sau:

[root@server1 ~]# virsh --connect qemu:///system
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit

virsh #

Bạn có thể gõ lệnh:

help

Để liệt kê danh sách các lệnh có sẵn, chạy lệnh:

list

virsh # help
Commands:

    help            print help
    attach-device   attach device from an XML file
    attach-disk     attach disk device
    attach-interface attach network interface
    autostart       autostart a domain
    capabilities    capabilities
    cd              change the current directory
    connect         (re)connect to hypervisor
    console         connect to the guest console
    cpu-baseline    compute baseline CPU
    cpu-compare     compare host CPU with a CPU described by an XML file
    create          create a domain from an XML file
    start           start a (previously defined) inactive domain
    destroy         destroy a domain
    detach-device   detach device from an XML file
    detach-disk     detach disk device
    detach-interface detach network interface
    define          define (but don't start) a domain from an XML file
    domid           convert a domain name or UUID to domain id
    domuuid         convert a domain name or id to domain UUID
    dominfo         domain information
    domjobinfo      domain job information
    domjobabort     abort active domain job
    domname         convert a domain id or UUID to domain name
    domstate        domain state
    domblkstat      get device block stats for a domain
    domifstat       get network interface stats for a domain
    dommemstat      get memory statistics for a domain
    domblkinfo      domain block device size information
    domxml-from-native Convert native config to domain XML
    domxml-to-native Convert domain XML to native config
    dumpxml         domain information in XML
    edit            edit XML configuration for a domain
    find-storage-pool-sources discover potential storage pool sources
    find-storage-pool-sources-as find potential storage pool sources
    freecell        NUMA free memory
    hostname        print the hypervisor hostname
    list            list domains
    migrate         migrate domain to another host
    migrate-setmaxdowntime set maximum tolerable downtime
    net-autostart   autostart a network
    net-create      create a network from an XML file
    net-define      define (but don't start) a network from an XML file
    net-destroy     destroy a network
    net-dumpxml     network information in XML
    net-edit        edit XML configuration for a network
    net-list        list networks
    net-name        convert a network UUID to network name
    net-start       start a (previously defined) inactive network
    net-undefine    undefine an inactive network
    net-uuid        convert a network name to network UUID
    iface-list      list physical host interfaces
    iface-name      convert an interface MAC address to interface name
    iface-mac       convert an interface name to interface MAC address
    iface-dumpxml   interface information in XML
    iface-define    define (but don't start) a physical host interface from an XML file
    iface-undefine  undefine a physical host interface (remove it from configuration)
    iface-edit      edit XML configuration for a physical host interface
    iface-start     start a physical host interface (enable it / "if-up")
    iface-destroy   destroy a physical host interface (disable it / "if-down")
    managedsave     managed save of a domain state
    nodeinfo        node information
    nodedev-list    enumerate devices on this host
    nodedev-dumpxml node device details in XML
    nodedev-dettach dettach node device from its device driver
    nodedev-reattach reattach node device to its device driver
    nodedev-reset   reset node device
    nodedev-create  create a device defined by an XML file on the node
    nodedev-destroy destroy a device on the node
    nwfilter-define define or update a network filter from an XML file
    nwfilter-undefine undefine a network filter
    nwfilter-dumpxml network filter information in XML
    nwfilter-list   list network filters
    nwfilter-edit   edit XML configuration for a network filter
    pool-autostart  autostart a pool
    pool-build      build a pool
    pool-create     create a pool from an XML file
    pool-create-as  create a pool from a set of args
    pool-define     define (but don't start) a pool from an XML file
    pool-define-as  define a pool from a set of args
    pool-destroy    destroy a pool
    pool-delete     delete a pool
    pool-dumpxml    pool information in XML
    pool-edit       edit XML configuration for a storage pool
    pool-info       storage pool information
    pool-list       list pools
    pool-name       convert a pool UUID to pool name
    pool-refresh    refresh a pool
    pool-start      start a (previously defined) inactive pool
    pool-undefine   undefine an inactive pool
    pool-uuid       convert a pool name to pool UUID
    secret-define   define or modify a secret from an XML file
    secret-dumpxml  secret attributes in XML
    secret-set-value set a secret value
    secret-get-value Output a secret value
    secret-undefine undefine a secret
    secret-list     list secrets
    pwd             print the current directory
    quit            quit this interactive terminal
    exit            quit this interactive terminal
    reboot          reboot a domain
    restore         restore a domain from a saved state in a file
    resume          resume a domain
    save            save a domain state to a file
    schedinfo       show/set scheduler parameters
    dump            dump the core of a domain to a file for analysis
    shutdown        gracefully shutdown a domain
    setmem          change memory allocation
    setmaxmem       change maximum memory limit
    setvcpus        change number of virtual CPUs
    suspend         suspend a domain
    ttyconsole      tty console
    undefine        undefine an inactive domain
    update-device   update device from an XML file
    uri             print the hypervisor canonical URI
    vol-create      create a vol from an XML file
    vol-create-from create a vol, using another volume as input
    vol-create-as   create a volume from a set of args
    vol-clone       clone a volume.
    vol-delete      delete a vol
    vol-wipe        wipe a vol
    vol-dumpxml     vol information in XML
    vol-info        storage vol information
    vol-list        list vols
    vol-pool        returns the storage pool for a given volume key or path
    vol-path        returns the volume path for a given volume name or key
    vol-name        returns the volume name for a given volume key or path
    vol-key         returns the volume key for a given volume name or path
    vcpuinfo        domain vcpu information
    vcpupin         control domain vcpu affinity
    version         show version
    vncdisplay      vnc display
    snapshot-create Create a snapshot
    snapshot-current Get the current snapshot
    snapshot-delete Delete a domain snapshot
    snapshot-dumpxml Dump XML for a domain snapshot
    snapshot-list   List snapshots for a domain
    snapshot-revert Revert a domain to a snapshot

virsh #	

Hiển thị toàn bộ các guest đang chạy:

list --all

Hiển thị toàn bộ guest đang chạy lẫn không hoạt động:

virsh # list --all
 Id Name                 State
----------------------------------
  3 vm11                 running
  - vm10                 shut off

virsh #

Nếu bạn chỉnh sửa file xml của một guest (trong /etc/libvirt/qemu/), bạn cần định nghĩa lại guest đó:

define /etc/libvirt/qemu/vm10.xml

Lưu ý chung rằng bất cứ khi nào bạn chỉnh sửa file xml trong /etc/libvirt/qemu/ đều phải chạy lại lệnh define trên.

Để khởi động một guest:

start vm10

Để dừng một guest:

shutdown vm10

Để ngưng hoạt động một guest ngay lập tức (giống như việc rút dây nguồn):

destroy vm10

Đình chỉ một guest:

suspend vm10

Tiếp tục một guest:

resume vm10

Đó là những lệnh quan trọng nhất bạn cần ghi nhớ. Cuối cùng dùng lệnh:

quit

để thoát khỏi virtual shell.


8. Tạo LVM-Based Guest bằng dòng lệnh

Các LVM-based guest có một số ưu điểm so với guest dựa trên image của nó. Chúng không gây nặng nề cho bộ điều khiển IO của ổ cứng, và có thể dễ dàng sao lưu (sử dụng LVM snapshots).

Để sử dụng LVM-based guest, bạn cần một nhóm phân vùng có đủ dung lượng ổ cứng (không phân bổ cho các phân vùng logical khác). Trong ví dụ này, chúng tôi sử dụng nhóm /dev/vg_server1 với tổng kích thước 465GB:

vgdisplay

[root@server1 ~]# vgdisplay
  --- Volume group ---
  VG Name               vg_server1
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  5
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               465.27 GiB
  PE Size               4.00 MiB
  Total PE              119109
  Alloc PE / Size       24480 / 95.62 GiB
  Free  PE / Size       94629 / 369.64 GiB
  VG UUID               jk2N5a-pQdV-I49Y-UCR9-A0Js-jEe0-0y6Ipg

[root@server1 ~]#

Có chứa dung lượng của /dev/vg_server1/lv_root với kích thước 50GB, /dev/vg_server1/lv_home là 40GB và /dev/vg_server1/lv_swap khoảng 6GB. Phần còn lại không được phân bổ và có thể sử dụng cho KVM guests:

lvdisplay

[root@server1 ~]# lvdisplay
  --- Logical volume ---
  LV Name                /dev/vg_server1/lv_root
  VG Name                vg_server1
  LV UUID                il99XH-Q7QV-R16x-Q51X-GOzp-8uq1-aMUb82
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                50.00 GiB
  Current LE             12800
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

  --- Logical volume ---
  LV Name                /dev/vg_server1/lv_home
  VG Name                vg_server1
  LV UUID                2OqWO9-4P91-UDzK-K6i3-zgJz-vJWN-9OMXpi
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                40.00 GiB
  Current LE             10240
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2

  --- Logical volume ---
  LV Name                /dev/vg_server1/lv_swap
  VG Name                vg_server1
  LV UUID                f5e90C-DMt8-896t-MmNo-S2FM-7hSd-gtVGjy
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                5.62 GiB
  Current LE             1440
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1

[root@server1 ~]#

Bây giờ chúng ta tạo máy ảo có tên vm12 làm LVM-based guest. Vm12 sẽ có 20GB không gian đĩa trống, vì vậy tạo /dev/vg_server1/vm12 với 20GB:

lvcreate -L20G -n vm12 vg_server1

Sau đó sử dụng lại lệnh virt-install lần nữa để tạo guest:

virt-install --connect qemu:///system -n vm12 -r 512 --vcpus=2 --disk path=/dev/vg_server1/vm12 -c /var/lib/libvirt/images/debian-6.0.2.1-amd64-netinst.iso --vnc --noautoconsole --os-type linux --os-variant debiansqueeze --accelerate --network=bridge:br0 --hvm

Lưu ý rằng, thay vì sử dụng --disk path=/var/lib/libvirt/images/vm12.img,size=20 chúng ta sẽ dùng --disk path=/dev/vg_server1/vm12, và không cần xác định không gian đĩa nữa vì nó đã được xác định bởi kích thước của phân vùng logical vm12 (20GB).

Thực hiện theo như mục 5 ở trên để cài đặt guest.

9. Chuyển đổi Image-Based Guests sang LVM-Based Guests

Nếu muốn chuyển đổi image-based guest vm10 sang LVM-based guest, chạy lệnh sau:

virsh --connect qemu:///system

shutdown vm10

quit

Sau đó tạo một phân vùng logical (ví dụ: /dev/vg_server1/vm10) có kích thước tương tự như file image (12GB):

lvcreate -L12G -n vm10 vg_server1

Giờ là lúc tiến hành chuyển đổi image:

qemu-img convert /var/lib/libvirt/images/vm10.img -O raw /dev/vg_server1/vm10

Sau đó bạn có thể xóa file ảnh trên đĩa:

rm -f /var/lib/libvirt/images/vm10.img

Bây giờ cần mở file cấu hình xml của guest /etc/libvirt/qemu/vm10.xml:

vi /etc/libvirt/qemu/vm10.xml

Thay đổi như dưới đây:

[...]
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='none'/>
      <source file='/var/lib/libvirt/images/vm10.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>

[...]

Để trở thành như sau:

[...]
    <disk type='block' device='disk'>
      <driver name='qemu' type='raw' cache='none'/>
      <source dev='/dev/vg_server1/vm10'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>

[...]

Cuối cùng là định nghĩa lại guest:

virsh --connect qemu:///system

define /etc/libvirt/qemu/vm10.xml

Khi còn trên shell virsh, có thể khởi động guest:

start vm10

Và rời khởi shell virsh:

quit

Các link tham khảo trong bài:

KVM: http://www.linux-kvm.org/
CentOS: http://www.centos.org/
Fedora: http://fedoraproject.org/
Debian: http://www.debian.org/

Cập nhật: 13/10/2011 Đ.Hải (Nguồn HowtoForge )
  • 8.058