使用KVM进行虚拟化Ubuntu 11.04
本指南介绍如何安装和使用KVM在Ubuntu 11.04服务器上创建和运行虚拟机。 我将演示如何创建基于图像的虚拟机以及使用逻辑卷(LVM)的虚拟机。 KVM是基于内核的虚拟机的缩写,并利用硬件虚拟化,即需要一个支持硬件虚拟化的CPU,例如Intel VT或AMD-V。
我不会保证这将为您工作!
1初步说明
我使用的主机名为server1.example.com
,IP地址为192.168.0.100的机器
作为我的KVM主机。
因为我们将使用root权限运行本教程中的所有步骤,我们可以使用字符串sudo
来为本教程中的所有命令添加所有命令,也可以通过键入来成为root
sudo su
2安装KVM和vmbuilder
首先检查您的CPU是否支持硬件虚拟化 - 如果是这种情况,该命令
egrep '(vmx|svm)' --color=always /proc/cpuinfo
应该显示一些东西,例如:
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 rep_good nopl pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch
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 rep_good nopl pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch
root@server1:~#
如果没有显示任何内容,那么您的处理器不支持硬件虚拟化,您必须停止在这里。
要安装KVM和vmbuilder
(一个脚本来创建基于Ubuntu的虚拟机),我们运行
apt-get install ubuntu-virt-server python-vm-builder kvm-pxe
一般类型的邮件配置:
< - 网站
系统邮件名称:
< - server1.example.com
之后,我们必须将我们当前登录的用户( root
)添加到组libvirtd中
:
adduser `id -un` libvirtd
adduser `id -un` kvm
您需要注销并重新登录才能使新组成员身份生效。
要检查KVM是否已成功安装,请运行
virsh -c qemu:///system list
它应该显示如下:
root@server1:~# virsh -c qemu:///system list
Id Name State
----------------------------------
root@server1:~#
如果它显示错误,那么出现问题。
接下来,我们需要在我们的服务器上设置一个网桥,以便我们的虚拟机可以从其他主机访问,就像它们是网络中的物理系统一样。
为此,我们安装了包bridge-utils
...
apt-get install bridge-utils
...并配置一个桥。 打开/ etc / network / interfaces
:
vi /etc/network/interfaces
在修改之前,我的文件如下所示:
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet static address 192.168.0.100 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.1 |
我改变它,使它看起来像这样:
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet manual auto br0 iface br0 inet static address 192.168.0.100 network 192.168.0.0 netmask 255.255.255.0 broadcast 192.168.0.255 gateway 192.168.0.1 bridge_ports eth0 bridge_fd 9 bridge_hello 2 bridge_maxage 12 bridge_stp off |
(确保您的网络使用正确的设置!)
重新启动网络...
/etc/init.d/networking restart
...运行
ifconfig
现在应该显示网桥( br0
):
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:16 errors:0 dropped:0 overruns:0 frame:0
TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1516 (1.5 KB) TX bytes:1440 (1.4 KB)
eth0 Link encap:Ethernet HWaddr 00:1e:90:f3:f0:02
inet6 addr: fe80::21e:90ff:fef3:f002/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:36765 errors:0 dropped:0 overruns:0 frame:0
TX packets:19112 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:54148967 (54.1 MB) TX bytes:1523729 (1.5 MB)
Interrupt:41 Base address:0xa000
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)
virbr0 Link encap:Ethernet HWaddr 66:86:28:f1:a1:62
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:~#
在我们启动第一台虚拟机之前,我建议重新启动系统:
reboot
如果不这样做,您可能会收到错误,如打开/ dev / kvm:
/ var / log / libvirt / qemu /
目录中虚拟机日志中的权限被拒绝
。
3创建基于图像的虚拟机
我们现在可以创建我们的第一个虚拟机 - 一个基于映像的虚拟机(如果您期望该虚拟机有大量流量和许多读写操作,请使用基于LVM的虚拟机,而不是如第6章所示 - 基于映像的虚拟机很重在硬盘IO上)。
我想在/ var / lib / libvirt / images /目录
中创建虚拟机(它们不能在/ root目录中
创建,因为libvirt-qemu
用户在该目录
中没有读取权限)。
我们将为每个要创建的虚拟机创建一个新目录,例如/ var / lib / libvirt / images / vm1
, / var / lib / libvirt / images / vm2
, / var / lib / libvirt / images / vm3
,因此,因为每个虚拟机将有一个名为ubuntu-kvm的
子目录,并且显然在/ var / lib / libvirt / images / vm1
中只能有一个这样的目录
。 例如,如果您尝试在/ var / lib / libvirt / images / vm1
中创建第二个虚拟机,则会收到一条错误消息,表示ubuntu-kvm已存在
(除非您使用--dest = DESTDIR
参数运行vmbuilder
):
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#
我们将使用vmbuilder
工具创建虚拟机。 (您可以在这里了解有关vmbuilder的
更多信息。) vmbuilder
使用模板创建虚拟机 - 此模板位于/ etc / vmbuilder / libvirt /
目录中。 首先我们创建一个副本:
mkdir -p /var/lib/libvirt/images/vm1/mytemplates/libvirt
cp /etc/vmbuilder/libvirt/* /var/lib/libvirt/images/vm1/mytemplates/libvirt/
现在我们来分配我们的虚拟机。 我们创建一个名为vmbuilder.partition
的文件...
vi /var/lib/libvirt/images/vm1/vmbuilder.partition
...并定义所需的分区如下:
root 8000 swap 4000 --- /var 20000 |
这定义了大小为8000MB的根分区( /
),4000MB的交换分区和20000MB的/ var
分区。 ---
行使得以下分区(在本示例中为/ var
)位于单独的磁盘映像上(即,这将创建两个磁盘映像,一个用于根和交换,一个用于/ var
)。 当然,你可以自由定义你喜欢的任何分区(只要你也定义根和交换),当然,它们只能在一个磁盘映像中 - 这只是一个例子。
我想在虚拟机中安装openssh-server
。 为了确保每个VM都有一个独特的OpenSSH密钥,当我们创建VM时,我们无法安装openssh-server
。 因此,我们创建一个名为boot.sh
的脚本,该脚本将在VM首次引导时执行。 它将安装openssh服务器
(使用唯一的密钥),并强制用户(我将默认使用默认的密码管理员
以及默认的密码youcl
)在首次登录时更改密码:
vi /var/lib/libvirt/images/vm1/boot.sh
# This script will run the first time the virtual machine boots # It is ran as root. # Expire the user account passwd -e administrator # Install openssh-server apt-get update apt-get install -qqy --force-yes openssh-server |
请确保用默认登录名替换用户名管理员
。
(您可以在这里找到更多信息: https : //help.ubuntu.com/community/JeOSVMBuilder#First%20boot )
(您还可以按照以下所述定义“首次登录”脚本: https : //help.ubuntu.com/community/JeOSVMBuilder#First%20login )
现在看看
vmbuilder kvm ubuntu --help
了解可用选项。
要创建我们的第一个VM, vm1
,我们去VM目录...
cd /var/lib/libvirt/images/vm1/
...并运行vmbuilder
,例如如下:
vmbuilder kvm ubuntu --suite=natty --flavour=virtual --arch=amd64 --mirror=http://de.archive.ubuntu.com/ubuntu -o --libvirt=qemu:///system --ip=192.168.0.101 --gw=192.168.0.1 --part=vmbuilder.partition --templates=mytemplates --user=administrator --name=Administrator --pass=youcl --addpkg=vim-nox --addpkg=unattended-upgrades --addpkg=acpid --firstboot=/var/lib/libvirt/images/vm1/boot.sh --mem=256 --hostname=vm1 --bridge=br0
大多数选项是不言自明的。 --part
指定具有分区细节的文件,相对于我们的工作目录(这就是为什么我们必须在运行vmbuilder
之前去我们的VM 目录
),-- templates
指定保存模板文件的目录(再次相对于我们的工作目录),而--firstboot
指定第一个引导脚本。 --libvirt = qemu:///系统
告诉KVM将该VM添加到可用虚拟机的列表中。 --addpkg
允许您指定要在虚拟机创建期间安装的Ubuntu软件包(请参阅上文为什么不应该将openssh服务器
添加到该列表并改用第一个引导脚本)。 - 桥
设网桥; 因为我们在第2章中创建了桥梁br0
,我们在这里指定了桥梁。
在--mirror
行中,您可以在-mirror中指定官方的Ubuntu存储库,例如http://de.archive.ubuntu.com/ubuntu
。 如果忽略了--mirror
,那么将使用默认的Ubuntu存储库( http://archive.ubuntu.com/ubuntu
)。
如果在--ip
开关中指定IP地址,请确保您还使用--gw
开关指定正确的网关IP(否则vmbuilder
将假定它是网络中第一个可能不正确的有效地址) 。 通常,网关IP与/ etc / network / interfaces中
使用的IP相同(参见第2章)。
构建过程可能需要几分钟。
之后,您可以在/ etc / libvirt / qemu /
(=> /etc/libvirt/qemu/vm1.xml
)中找到VM的XML配置文件:
ls -l /etc/libvirt/qemu/
root@server1:/var/lib/libvirt/images/vm1# ls -l /etc/libvirt/qemu/
total 8
drwxr-xr-x 3 root root 4096 2011-05-05 14:45 networks
-rw------- 1 root root 1795 2011-05-05 15:10 vm1.xml
root@server1:/var/lib/libvirt/images/vm1#
磁盘映像位于我们的VM目录的ubuntu-kvm /
子目录中:
ls -l /var/lib/libvirt/images/vm1/ubuntu-kvm/
root@server1:/var/lib/libvirt/images/vm1# ls -l /var/lib/libvirt/images/vm1/ubuntu-kvm/
total 430040
-rw-r--r-- 1 root root 139264000 2011-05-05 15:10 tmp4hUoB1.qcow2
-rw-r--r-- 1 root root 301334528 2011-05-05 15:09 tmp5nFrU2.qcow2
root@server1:/var/lib/libvirt/images/vm1#