Cài đặt KVM và vmbuilder 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ị
Trang 1Ảo hóa với KVM trên Ubuntu 11.10
Công nghệ ảo hóa trong Linux với KVM (Kernel-based Virtual Machine) hẳn không còn xa lạ với các nhà quản trị mạng cũng như nhiều người dùng Tuy nhiên sự phát triển của những hệ điều hành có nhân Linux hết sức nhanh chóng, kéo theo sự thay đổi trong cách sử dụng KVM khiến không ít người e ngại nâng cấp cho hệ thống của mình Chuyên mục Linux trên QuanTriMang sẽ
cố gắng cập nhật đầy đủ các hướng dẫn tối ưu nhất để bạn đọc có thể dễ dàng thao tác, kịp thời, nhanh chóng Bài hướng dẫn sau đây sẽ trình bày cách sử dụng KVM trên hệ thống Ubuntu 11.10
1 Một số lưu ý
Trước hết bạn cần đảm bảo rằng phần cứng của mình hỗ trợ công nghệ ảo hóa, tức
là CPU thuộc dòng Intel VT hoặc AMD-V
Phần minh họa sau chúng tôi sử dụng hostname server1.example.com, địa chỉ IP của KVM host là 192.168.0.100
Toàn bộ các lệnh dưới đây cần được chạy dưới quyền root, vì vậy bạn hãy trở
thành root trước khi bắt đầu thực hiện:
Trang 2Sudo su
2 Cài đặt KVM và vmbuilder
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 ap
ic sep mtrr pge mca cmov pat pse36 clflush
mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp
lm 3dnowext 3dnow rep_good nopl extd_apicid
pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch lbrv
flags : fpu vme de pse tsc msr pae mce cx8 ap
ic sep mtrr pge mca cmov pat pse36 clflush
mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp
lm 3dnowext 3dnow rep_good nopl extd_apicid
pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch lbrv
root@server1:~#
Trang 3Như 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
Để cài đặt KVM và vmbuilder (một script để khởi tạo hệ thống máy ảo Ubuntu cơ
bản) chúng ta chạy:
apt-get install ubuntu-virt-server python-vm-builder kvm-pxe
Sau đó cần thêm vào user như là đăng nhập hiện tại (root) cho nhóm libvirtd:
adduser `id -un` libvirtd
adduser `id -un` kvm
Bạn cần đăng xuất và đăng nhập lại để các thành viên trong nhóm mới có hiệu lực:
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ị các thông tin như dưới đâ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, nếu có lỗi nào đó 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, chỉ cần cài đặt gói bridge-utils
apt-get install bridge-utils
…và cấu hình một bridge Mở /etc/network/interfaces:
vi /etc/network/interfaces
Trước khi sửa đổi tập tin sẽ trông như sau:
Trang 4# This file describes the network interfaces available
iface lo inet loopback
# The primary network interface
Bạn tiến hành sửa lại như dưới đây:
# This file describes the network interfaces available
Trang 5auto lo
iface lo inet loopback
# The primary network interface
Trang 6Và chạy:
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:17 errors:0 dropped:0 overruns:0 frame:0
TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1196 (1.1 KB) TX bytes:1966 (1.9 KB)
eth0 Link encap:Ethernet HWaddr 00:1e:90:f3:f0:02
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Trang 7RX packets:35100 errors:0 dropped:0 overruns:
Interrupt:41 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: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)
Trang 8virbr0 Link encap:Ethernet HWaddr 46:b4:d1:49:75:eb
inet addr:192.168.122.1 Bcast:192.168.122.25
5 Mask:255.255.255.0
UP BROADCAST 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
Bây giờ chúng ta có thể tạo ra máy ảo đầu tiên - image-based VM (nếu bạn muốn
có thật nhiều lượng traffic và các thao tác đọc – ghi cho máy ảo, hãy sử dụng một
LVM-based VM như mục 6 sau đây sẽ giới thiệu Image-based VM gây nặng cho
đĩa cứng IO)
Trang 9Ở đây tôi muốn tạo máy ảo của mình trong thư mục /var/lib/libvirt/images/ (không thể tạo trong /root bởi user libvirt-qemu không có quyền đọc trong thư thư mục
already exists (trừ khi bạn chạy vmbuilder với đối số dest=DESTDIR):
root@server1:/var/lib/libvirt/images/vm1# vmbuilder kvm ubuntu -c vm2.cfg
2009-05-07 16:32:44,185 INFO Cleaning up
ubuntu-kvm already exists
root@server1:/var/lib/libvirt/images/vm1#
Chúng tôi sử dụng công cụ vmbuilder để tạo các máy ảo (tìm hiểu thêm vmbuilder
tại đây) Vmbuilder sử dụng một template để tạo máy ảo – template này nằm
trong thư mục /etc/vmbuilder/libvirt/ Đầu tiên ta tạo một bản sao:
Trang 10-
/var 20000
Như vậy phân vùng root (/) được xác định với kích thước 8000MB, một phân
vùng swap 4000MB, và một phân vùng /var với 20000MB Dòng - có tác dụng
làm cho các phân vùng bên dưới nó (ở đây là /var) là một ảnh đĩa riêng biệt Tức
là tạo ra hai ảnh đĩa, một cho root và swa, một cho /var Tất nhiên, bạn được tự do
định nghĩa bất cứ phân vùng nào mình thích (miễn là bao gồm cả root và swap)
Tôi muốn cài đặt openssh-server trong VM Để đảm bảo rằng mỗi VM có một
OpenSSH key duy nhất, chúng ta không thể cài đặt openssh-server khi tạo VM Vì
vậy giải pháp là tạo một script có tên boot.sh để thực thi khi khởi động VM lần
đầu tiên Nó sẽ cài đặt openssh-server (với một key duy nhất) và có hiệu lực với
user (ở đây sử dụng username mặc định là administrator với mật khẩu mặc định quantrimang) để thay đổi mật khẩu khi đăng nhập lần đầu tiên
Trang 11Lưu ý thay đổi username administrator với tên đăng nhập mặc định của bạn (Xem
thêm tại đây) Hoặc bạn cũng có thể định nghĩa một script "first login" tại đây
Bây giờ hãy nhìn vào:
vmbuilder kvm ubuntu –help
để tìm hiểu thêm về các tùy chọn có sẵn
Tiếp theo, tạo VM đầu tiên, vm1, chúng ta vào thư mục VM…
Hầu hết các tùy chọn là tự nó giải thích part quy định cụ thể các tập tin với chi
tiết các phân vùng, có liên quan tới thư mục đang hoạt động (đó là lý do tại sao
chúng ta cần đi tới thư mục VM trước khi chạy vmbuilder) templates quy định
cụ thể thư mục lưu giữ tập tin template (liên quan tới thư mục đang hoạt động), và
firstboot quy định script cho lần khởi động đầu tiên libvirt=qemu:///system
sẽ “nói” cho KVM để thêm VM này vào danh sách máy ảo có sẵn addpkg cho
phép bạn chỉ định các gói Ubuntu muốn cài đặt trong quá trình khởi tạo VM (đây
là lý do tại sao không nên thêm openssh-server vào danh sách và sử dụng script để
Trang 12thay thế) bridge thiết lập một bridge network; như bridge br0 mà chúng ta đã
tạo trong mục 2 Bây giờ là lúc xác định bridge
Trong dòng mirror bạn có thể chỉ định một kho lưu trữ chính thức của Ubuntu,
chẳng hạn http://de.archive.ubuntu.com/ubuntu Nếu bỏ qua mirror, Ubuntu sẽ
sử dụng kho mặc định (http://archive.ubuntu.com/ubuntu)
Quá trình xây dựng có thể mất vài phút Sau đó bạn sẽ tìm thấy tập tin cấu hình
XML cho VM trong /etc/libvirt/qemu/ (=> /etc/libvirt/qemu/vm1.xml):
Các ảnh đĩa được đặt trong ubuntu-kvm/ - thư mục con của thư mục VM:
Trang 13(Lưu ý rằng bạn không thể tạo một thư mục mới cho VM
(/var/lib/libvirt/images/vm2) nếu truyền đối số -d DESTDIR cho lệnh vmbuilder
– nó cho phép bạn tạo một VM mới trong thư mục đã tạo VM khác Trong trường
hợp đó không cần tạo mới tập tin vmbuilder.partition và boot.sh, cũng không cần
chỉnh sửa template, nhưng có thể dễ dàng sử dụng các tập tin đã tồn tại:
Trang 14templates=mytemplates user=administrator
name=Administrator pass=howtoforge addpkg=vimnox -addpkg=unattended-upgrades addpkg=acpid
-firstboot=/var/lib/libvirt/images/vm1/boot.sh mem=256 hostname=vm2 bridge=br0 -d vm2-kvm
)
5 Quản trị máy ảo
Các máy cảo có thể được quản trị thông qua virsh, là một "virtual shell" Để kết
nối tới virtual shell ta chạy:
virsh connect qemu:///system
virtual shell sẽ trông như sau:
root@server1:~# virsh connect qemu:///system
Welcome to virsh, the virtualization interactive
Trang 15
attach-device attach attach-device from an XML file
attach-disk attach disk device
attach-interface attach network attach-interface
autostart autostart a domain
blkiotune Get or set blkio parameters
console connect to the guest console
cpu-baseline compute baseline CPU
Trang 16detach-disk detach disk device
detach-interface detach network detach-interface
domid convert a domain nam
domname convert a domain id
or UUID to domain name
domuuid convert a domain nam
Trang 17dumpxml domain information i
n XML
edit edit XML configurati
on for a domain
inject-nmi Inject NMI to the guest
managedsave managed save of a domain state
managedsave-remove Remove managed save of a domain
maxvcpus connection vcpu maximum
memtune Get or set memory parameters
migrate migrate domain to another host
migrate-setmaxdowntime set maximum tolerable downtime
reboot reboot a domain
restore restore a domain fro
m a saved state in a file
Trang 18resume resume a domain
save save a domain state
to a file
schedinfo show/set scheduler parameters
screenshot take a screenshot of
a current domain console and store it into a file
setmaxmem change maximum memor
suspend suspend a domain
ttyconsole tty console
undefine undefine an inactive domain
Trang 19
update-device update update-device from an XML file
vcpucount domain vcpu counts
vcpuinfo detailed domain vcpu information
vcpupin control domain vcpu affinity
version show version
vncdisplay vnc display
Domain Monitoring (help keyword 'monitor'):
domblkinfo domain block device size information
domblkstat get device block sta
ts for a domain
domifstat get network interfac
e stats for a domain
dominfo domain information
dommemstat get memory statistic
s for a domain
domstate domain state
Trang 20list list domains
Host and Hypervisor (help keyword 'host'):
capabilities capabilities
connect (re)connect to hypervisor
freecell NUMA free memory
hostname print the hypervisor hostname
nodeinfo node information
qemu-monitor-command Qemu Monitor Command
sysinfo print the hypervisor sysinfo
uri print the hypervisor canonical URI
Interface (help keyword 'interface'):
iface-begin create a snapshot of current interfaces settings, which can be later commited (iface-commit) or restored (iface-rollback)
Trang 23Networking (help keyword 'network'):
net-autostart autostart a network
net-info network information
net-list list networks
net-name convert a network UUID to network name
Trang 24nodedev-create nodedev-create a device defined by an XM
L file on the node
Trang 25
nodedev-reattach nodedev-reattach node device to its devi
ce driver
nodedev-reset reset node device
Secret (help keyword 'secret'):
secret-get-value Output a secret secret-get-value
secret-list list secrets
secret-set-value set a secret value
secret-undefine undefine a secret
Snapshot (help keyword 'snapshot'):
snapshot-create Create a snapshot
snapshot-current Get the snapshot-current snapshot
Trang 26snapshot-revert Revert a domain to a snapshot
Storage Pool (help keyword 'pool'):
find-storage-pool-sources-as find potential storage pool sources
find-storage-pool-sources discover potential storage pool find-storage-pool-sources
pool-autostart autostart a pool
pool-build build a pool
Trang 27pool-delete delete a pool
pool-destroy destroy a pool
pool-info storage pool pool-information
pool-list list pools
Trang 28Storage Volume (help keyword 'volume'):
vol-clone clone a volume
Trang 29vol-name returns the volume vol-name for
a given volume key or path
vol-path returns the volume vol-path for
a given volume name or key
vol-pool returns the storage vol-pool for
a given volume key or path
vol-upload vol-upload a file into a volume
vol-wipe wipe a vol
Virsh itself (help keyword 'virsh'):
Trang 30cd change the current directory
echo echo arguments
exit quit this interactiv
e terminal
help print help
pwd print the current directory
quit quit this interactiv
Để hiển thị toàn bộ máy ảo đang và không hoạt động:
virsh # list all
Trang 31Trước khi khởi động máy ảo mới lần đầu tiên, bạn cần định nghĩa nó từ tập tin xml
trong thư mục /etc/libvirt/qemu/:
define /etc/libvirt/qemu/vm1.xml
Lưu ý rằng bất cứ khi nào chỉnh sửa tập tin xml của máy ảo trong
/etc/libvirt/qemu/ bạn đều phải chạy lại lệnh define
Bây giờ chúng ta đã có thể khởi động VM:
start vm1
Sau một vài khoảnh khắc, bạn có thể kết nối tới VM với SSH client như PuTTY;
đăng nhập với username và password mặc định Lần đăng nhập đầu tiên bạn sẽ được yêu cầu thay đổi password
Trang 32resume vm1
Trên đây là những lệnh quan trọng nhất bạn cần ghi nhớ Thoát khỏi virtual shell:
Quit
6 Tạo một LVM-Based VM
LVM-Based VM có một số ưu điểm hơn các image-based VM Chúng không gây
nặng ổ cứng IO và dễ dàng sao lưu bằng cách sử dụng LVM snapshots
Để có thể sử dụng LVM-based VM, bạn cần một nhóm volume có không gian hợp
lý và chưa được phân bố cho bất kỳ volume vật lý nào Ở đây chúng tôi dùng /dev/vg0 với kích thước khoảng 465GB
Trang 33Total PE 119109
Alloc PE / Size 24079 / 94.06 GiB
Free PE / Size 95030 / 371.21 GiB
VG UUID NQOLhN-wBWi-pUdD-el7p-TADJ-fJGd-3ALJbf
root@server1:~#
… có chứa khối vật lý /dev/vg0/root với kích thước khoảng 100GB và
/dev/vg0/swap_1 kích thước 1GB – phần còn lại không được phân bố và có thể sử
dụng cho các máy ảo:
Trang 34LV Write Access read/write
Bây giờ chúng ta tạo máy ảo vm5 như một LVM-based VM Chúng ta có thể dùng
lại lệnh vmbuilder Vmbuilder biết rõ tùy chọn raw cho phép ghi máy ảo tới một
thiết bị block (ví dụ /dev/vg0/vm5) – và không có lỗi nào xảy ra Tuy nhiên bạn
không thể khở động máy ảo trên, do đó cần tạo một vm5 như image-based VM
đầu tiên và sau đó chuyển đổi sang LVM-based VM
mkdir -p
/var/lib/libvirt/images/vm5/mytemplates/libvirt
cp /etc/vmbuilder/libvirt/*
/var/lib/libvirt/images/vm5/mytemplates/libvirt/
Hãy chắn rằng bạn đã tạo toàn bộ phân vùng trong một file ảnh, vì vậy không cần
sử dụng - trong tập tin vmbuilder.partition: