使用KVM进行虚拟化Ubuntu 12.10
本指南介绍如何安装和使用KVM在Ubuntu 12.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 extd_apicid
pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch lbrv
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 extd_apicid
pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy 3dnowprefetch lbrv
root@server1:~#
如果没有显示任何内容,那么您的处理器不支持硬件虚拟化,您必须停止在这里。
要安装KVM和vmbuilder
(一个脚本来创建基于Ubuntu的虚拟机),我们运行
apt-get install ubuntu-virt-server python-vm-builder kvm-ipxe
之后,我们必须将我们当前登录的用户( 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 dns-nameservers 8.8.8.8 8.8.4.4 |
我改变它,使它看起来像这样:
# 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 dns-nameservers 8.8.8.8 8.8.4.4 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:29 errors:0 dropped:0 overruns:0 frame:0
TX packets:29 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1934 (1.9 KB) TX bytes:2844 (2.8 KB)
eth0 Link encap:Ethernet HWaddr 00:1e:90:f3:f0:02
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:44613 errors:0 dropped:0 overruns:0 frame:0
TX packets:23445 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:63663064 (63.6 MB) TX bytes:1792940 (1.7 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 2a:4a:49:13:de:8f
inet addr:192.168.122.1 Bcast:192.168.122.255 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
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=quantal --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 --addpkg=linux-image-generic --firstboot=/var/lib/libvirt/images/vm1/boot.sh --mem=512 --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章)。
请注意,如果要创建qunatal
访客,您需要添加选项--addpkg = linux-image-generic
或从http://markmail.org/thread/hg747mkmnkpy4icc#query:+page应用修补程序: 1 + mid:7rxyi4wjo6vkssh7 + state:结果 ,因为否则构建过程将失败:
2012-11-09 19:41:31,413 INFO : Errors were encountered while processing:
2012-11-09 19:41:31,414 INFO : /var/cache/apt/archives/linux-image-3.5.0-18-generic_3.5.0-18.29_amd64.deb
2012-11-09 19:41:31,423 INFO : E: Sub-process /usr/bin/dpkg returned an error code (1)
2012-11-09 19:41:31,425 INFO : Cleaning up
2012-11-09 19:41:38,857 ERROR : Process (['chroot', '/tmp/tmp3GByMi', 'apt-get', '--force-yes', '-y', 'install', 'linux-image-virtual']) returned 100. stdout: Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
linux-image-3.5.0-18-generic
Suggested packages:
fdutils linux-doc-3.5.0 linux-source-3.5.0 linux-tools
The following NEW packages will be installed:
linux-image-3.5.0-18-generic linux-image-virtual
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 11.7 MB of archives.
After this operation, 31.5 MB of additional disk space will be used.
Get:1 http://de.archive.ubuntu.com/ubuntu/ quantal-updates/main linux-image-3.5.0-18-generic amd64 3.5.0-18.29 [11.7 MB]
Get:2 http://de.archive.ubuntu.com/ubuntu/ quantal-updates/main linux-image-virtual amd64 3.5.0.18.21 [2440 B]
Fetched 11.7 MB in 3s (3519 kB/s)
Selecting previously unselected package linux-image-3.5.0-18-generic.
(Reading database ... 14377 files and directories currently installed.)
Unpacking linux-image-3.5.0-18-generic (from .../linux-image-3.5.0-18-generic_3.5.0-18.29_amd64.deb) ...
Selecting previously unselected package linux-image-virtual.
Unpacking linux-image-virtual (from .../linux-image-virtual_3.5.0.18.21_amd64.deb) ...
, stderr: grep: /proc/cpuinfo: No such file or directory
This kernel does not support a non-PAE CPU.
dpkg: error processing /var/cache/apt/archives/linux-image-3.5.0-18-generic_3.5.0-18.29_amd64.deb (--unpack):
subprocess new pre-installation script returned error exit status 1
Examining /etc/kernel/postrm.d .
run-parts: executing /etc/kernel/postrm.d/initramfs-tools 3.5.0-18-generic /boot/vmlinuz-3.5.0-18-generic
run-parts: executing /etc/kernel/postrm.d/zz-update-grub 3.5.0-18-generic /boot/vmlinuz-3.5.0-18-generic
Errors were encountered while processing:
/var/cache/apt/archives/linux-image-3.5.0-18-generic_3.5.0-18.29_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
Traceback (most recent call last):
File "/usr/bin/vmbuilder", line 24, in <module>
cli.main()
File "/usr/lib/python2.7/dist-packages/VMBuilder/contrib/cli.py", line 223, in main
hypervisor.install_os()
File "/usr/lib/python2.7/dist-packages/VMBuilder/hypervisor.py", line 70, in install_os
self.call_hooks('install_kernel', self.chroot_dir)
File "/usr/lib/python2.7/dist-packages/VMBuilder/distro.py", line 67, in call_hooks
call_hooks(self, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/VMBuilder/util.py", line 158, in call_hooks
getattr(plugin, func, log_no_such_method)(*args, **kwargs)
File "/usr/lib/python2.7/dist-packages/VMBuilder/plugins/ubuntu/distro.py", line 189, in install_kernel
self.suite.install_kernel(destdir)
File "/usr/lib/python2.7/dist-packages/VMBuilder/plugins/ubuntu/dapper.py", line 303, in install_kernel
run_cmd('chroot', destdir, 'apt-get', '--force-yes', '-y', 'install', self.kernel_name(), env={ 'DEBIAN_FRONTEND' : 'noninteractive' })
File "/usr/lib/python2.7/dist-packages/VMBuilder/util.py", line 120, in run_cmd
raise VMBuilderException, "Process (%s) returned %d. stdout: %s, stderr: %s" % (args.__repr__(), status, mystdout.buf, mystderr.buf)
VMBuilder.exception.VMBuilderException: Process (['chroot', '/tmp/tmp3GByMi', 'apt-get', '--force-yes', '-y', 'install', 'linux-image-virtual']) returned 100. stdout: Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
linux-image-3.5.0-18-generic
Suggested packages:
fdutils linux-doc-3.5.0 linux-source-3.5.0 linux-tools
The following NEW packages will be installed:
linux-image-3.5.0-18-generic linux-image-virtual
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 11.7 MB of archives.
After this operation, 31.5 MB of additional disk space will be used.
Get:1 http://de.archive.ubuntu.com/ubuntu/ quantal-updates/main linux-image-3.5.0-18-generic amd64 3.5.0-18.29 [11.7 MB]
Get:2 http://de.archive.ubuntu.com/ubuntu/ quantal-updates/main linux-image-virtual amd64 3.5.0.18.21 [2440 B]
Fetched 11.7 MB in 3s (3519 kB/s)
Selecting previously unselected package linux-image-3.5.0-18-generic.
(Reading database ... 14377 files and directories currently installed.)
Unpacking linux-image-3.5.0-18-generic (from .../linux-image-3.5.0-18-generic_3.5.0-18.29_amd64.deb) ...
Selecting previously unselected package linux-image-virtual.
Unpacking linux-image-virtual (from .../linux-image-virtual_3.5.0.18.21_amd64.deb) ...
, stderr: grep: /proc/cpuinfo: No such file or directory
This kernel does not support a non-PAE CPU.
dpkg: error processing /var/cache/apt/archives/linux-image-3.5.0-18-generic_3.5.0-18.29_amd64.deb (--unpack):
subprocess new pre-installation script returned error exit status 1
Examining /etc/kernel/postrm.d .
run-parts: executing /etc/kernel/postrm.d/initramfs-tools 3.5.0-18-generic /boot/vmlinuz-3.5.0-18-generic
run-parts: executing /etc/kernel/postrm.d/zz-update-grub 3.5.0-18-generic /boot/vmlinuz-3.5.0-18-generic
Errors were encountered while processing:
/var/cache/apt/archives/linux-image-3.5.0-18-generic_3.5.0-18.29_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
root@server1:/var/lib/libvirt/images/vm1#
构建过程可能需要几分钟。
之后,您可以在/ 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 Nov 9 19:19 networks
-rw------- 1 root root 2283 Nov 9 19:54 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 649236
-rw-r--r-- 1 root root 171245568 Nov 9 19:54 tmpMJmBVv.qcow2
-rw-r--r-- 1 root root 493813760 Nov 9 19:50 tmprHenWH.qcow2
root@server1:/var/lib/libvirt/images/vm1#