KVM虚拟化在Ubuntu 12.10上

KVM虚拟化在Ubuntu 12.10上 本指南解释了如何安装和使用KVM创建和 在Ubunt上运行虚拟机...

使用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服务器 (使用唯一的密钥),并强制用户(我将默认使用默认的密码管理员以及默认的密码howtoing )在首次登录时更改密码:

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=howtoing --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#