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

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/

Thứ Năm, 13/10/2011 07:00
32 👨 11.481