使用KVM进行虚拟化在Ubuntu 12.04 LTS上

使用KVM进行虚拟化Ubuntu 12.04 LTS

本指南介绍如何安装和使用KVM在Ubuntu 12.04 LTS服务器上创建和运行虚拟机。 我将演示如何创建基于图像的虚拟机以及使用逻辑卷(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=precise --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 May 21 13:00 networks
-rw------- 1 root root 2082 May 21 13:15 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 604312
-rw-r--r-- 1 root root 324337664 May 21 13:14 tmpE4IiRv.qcow2
-rw-r--r-- 1 root root 294715392 May 21 13:15 tmpxvSVOT.qcow2
root@server1:/var/lib/libvirt/images/vm1#
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏