使用KVM进行虚拟化Ubuntu 9.10
本指南介绍如何安装和使用KVM在Ubuntu 9.10服务器上创建和运行虚拟机。 我将演示如何创建基于图像的虚拟机以及使用逻辑卷(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的虚拟机),我们运行
aptitude install ubuntu-virt-server python-vm-builder
一般类型的邮件配置:
< - 网站
系统邮件名称:
< - server1.example.com
之后,我们必须将我们当前登录的用户( root
)添加到组libvirtd中
:
adduser `id -un` libvirtd
您需要注销并重新登录才能使新组成员身份生效。
要检查KVM是否已成功安装,请运行
virsh -c qemu:///system list
它应该显示如下:
root@server1:~# virsh -c qemu:///system list
Connecting to uri: qemu:///system
Id Name State
----------------------------------
root@server1:~#
如果它显示错误,那么出现问题。
接下来,我们需要在我们的服务器上设置一个网桥,以便我们的虚拟机可以从其他主机访问,就像它们是网络中的物理系统一样。
为此,我们安装了包bridge-utils
...
aptitude 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:14 errors:0 dropped:0 overruns:0 frame:0
TX packets:18 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1046 (1.0 KB) TX bytes:1560 (1.5 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:21971 errors:0 dropped:0 overruns:0 frame:0
TX packets:11749 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:32162163 (32.1 MB) TX bytes:948375 (948.3 KB)
Interrupt:28 Base address:0x8000
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 72:64:57:c0:b0:03
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创建基于图像的虚拟机
我们现在可以创建我们的第一个虚拟机 - 一个基于映像的虚拟机(如果您期望该虚拟机有大量流量和许多读写操作,请使用基于LVM的虚拟机,而不是如第6章所示 - 基于映像的虚拟机很重在硬盘IO上)。
我们将为每个要创建的虚拟机创建一个新目录,例如〜/ vm1
, 〜/ vm2
, 〜/ vm3
等等,因为每个虚拟机都有一个名为ubuntu-kvm的
子目录,显然可以例如〜/ vm1
中的一个这样的目录。 例如,如果您尝试在〜/ vm1
中创建第二个虚拟机,则会收到一条错误消息,指出ubuntu-kvm已经存在
(除非您使用--dest = DESTDIR
参数运行vmbuilder
):
root@server1:~/vm1# vmbuilder kvm ubuntu -c vm2.cfg
2009-05-07 16:32:44,185 INFO Cleaning up
ubuntu-kvm already exists
root@server1:~/vm1#
我们将使用vmbuilder
工具创建虚拟机。 (您可以在这里了解有关vmbuilder的
更多信息。) vmbuilder
使用模板创建虚拟机 - 此模板位于/ etc / vmbuilder / libvirt /
目录中。 首先我们创建一个副本:
mkdir -p ~/vm1/mytemplates/libvirt
cp /etc/vmbuilder/libvirt/* ~/vm1/mytemplates/libvirt/
现在我们来分配我们的虚拟机。 我们创建一个名为vmbuilder.partition
的文件...
vi ~/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 ~/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
构建一个新的VM时,它必须从Ubuntu镜像下载所有的软件包,这可能需要相当长的一段时间。 为了加快速度,我们安装apt-proxy
...
aptitude install apt-proxy
...缓存下载的软件包,以便后续的VM安装速度将快得多。
现在打开/etc/apt-proxy/apt-proxy-v2.conf
...
vi /etc/apt-proxy/apt-proxy-v2.conf
...并使用靠近您的镜像替换默认的Ubuntu镜像(例如,如果您在德国,请http://de.archive.ubuntu.com/ubuntu
):
[...] [ubuntu] ;; Ubuntu archive backends = http://de.archive.ubuntu.com/ubuntu min_refresh_delay = 15m [...] |
然后我们重新启动apt-proxy:
/etc/init.d/apt-proxy restart
apt-proxy监听端口9999
,所以我们可以将本地的apt-proxy“mirror”作为参数传递给vmbuilder
脚本。
现在看看
vmbuilder kvm ubuntu --help
了解可用选项。
要创建我们的第一个VM, vm1
,我们去VM目录...
cd ~/vm1/
...并运行vmbuilder
,例如如下:
vmbuilder kvm ubuntu --suite=karmic --flavour=virtual --arch=amd64 --mirror=http://192.168.0.100:9999/ubuntu -o --libvirt=qemu:///system --tmpfs=- --ip=192.168.0.101 --part=vmbuilder.partition --templates=mytemplates --user=administrator --name=Administrator --pass=youcl --addpkg=vim-nox --addpkg=unattended-upgrades --addpkg=acpid --firstboot=boot.sh --mem=256 --hostname=vm1 --bridge=br0
大多数选项是不言自明的。 --part
指定具有分区细节的文件,相对于我们的工作目录(这就是为什么我们必须在运行vmbuilder
之前去我们的VM 目录
),-- templates
指定保存模板文件的目录(再次相对于我们的工作目录),而--firstboot
指定第一个引导脚本。 --libvirt = qemu:///系统
告诉KVM将该VM添加到可用虚拟机的列表中。 --addpkg
允许您指定要在虚拟机创建期间安装的Ubuntu软件包(请参阅上文为什么不应该将openssh服务器
添加到该列表并改用第一个引导脚本)。 - 桥
设网桥; 因为我们在第2章中创建了桥梁br0
,我们在这里指定了桥梁。
在--mirror
行中,我指定了我的本地apt-proxy镜像( http://192.168.0.100:9999/ubuntu
) - 我使用了我可以公开访问的IP地址而不是localhost
或127.0.0.1
,因为这个镜像将被使用在VM的/etc/apt/sources.list
文件中,当然,VM将无法连接到主机
上的127.0.0.1
。 当然,您还可以在--mirror
中指定官方的Ubuntu存储库,例如http://de.archive.ubuntu.com/ubuntu
。 如果忽略了--mirror
,那么将使用默认的Ubuntu存储库( http://archive.ubuntu.com/ubuntu
)。
构建过程可能需要几分钟。
之后,您可以在/ etc / libvirt / qemu /
(=> /etc/libvirt/qemu/vm1.xml
)中找到VM的XML配置文件:
ls -l /etc/libvirt/qemu/
root@server1:~/vm1# ls -l /etc/libvirt/qemu/
total 8
drwxr-xr-x 3 root root 4096 2009-12-16 15:34 networks
-rw------- 1 root root 1111 2009-12-16 15:49 vm1.xml
root@server1:~/vm1#
磁盘映像位于我们的VM目录的ubuntu-kvm /
子目录中:
ls -l ~/vm1/ubuntu-kvm/
root@server1:~/vm1# ls -l ~/vm1/ubuntu-kvm/
total 418072
-rw-r--r-- 1 root root 336068608 2009-12-16 15:48 disk0.qcow2
-rw-r--r-- 1 root root 92274688 2009-12-16 15:49 disk1.qcow2
root@server1:~/vm1#