Статья Виртуализация в Ubuntu 9.10 с помощью KVM

845

Давненько я не выкладывал HOWTO . Вот и решил исправится. Тем более, что тема виртуализации становится все более актуальной, во всяком случае для меня так точно. И несмотря на то, что я пока пользуюсь исключительно VirtualBox, не исключено. что вскоре мне придется расширить свои виртуальные горизонты. В последнее время на VirtualBox все больше нареканий. Да и я неоднократно замечал некорректную работу данной программы. Поэтому посмотрите на другие варианты.

Кстати, если вам необходимо обеспечить прокачку воды в трубопроводной системе на даче, в загородном доме или в многоквартирном доме, то насосная станция справится с этой задачей.

Оригинал: «Virtualization With KVM On Ubuntu 9.10″
Автор: Falko Timme
Дата публикации: 16/12/2009
Перевод: Н.Ромоданов
Дата перевода: 14 апреля 2010 г.

В настоящем руководстве объясняется, как устанавливать и использовать KVM для создания и запуска виртуальных машин на сервере Ubuntu 9.10. Я покажу, как создавать виртуальные машины, в которых используется образ диска, а также виртуальные машины, в которых используются логические тома (LVM). KVM является сокращением названия Kernel-based Virtual Machine (виртуальная машина, создаваемая на базе ядра системы) и использует аппаратные средства виртуализации, т.е. у вас должен быть процессор, который аппаратно поддерживает виртуализацию, например, Intel VT или AMD-V.

Я не гарантирую, что это будет работать у вас!

1. Предварительные замечания

В качестве хоста для KVM , я использую машину с именем (hostname) server1.example.com и IP адресом 192.168.0.100.

Поскольку все шаги настоящего руководства мы делать с правами пользователя root, нужно либо предварять каждую команду префиксом sudo, либо мы можем сразу набрать следующую команду:

sudo su
2. Установка KVM и vmbuilder

Сначала проверим, поддерживается ли в вашем процессоре аппаратная виртуализация. Если поддерживается, то команда:

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

Общий тип конфигурации почтового сервера:

General type of mail configuration: <-- Internet Site

Системное имя почтового сервера:

System mail name: <-- server1.example.com

Затем вам следует добавить пользователя в группу libvirtd, поскольку сейчас вы находитесь в системе с правами root:

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, — виртуальная машина, использующая образ жесткого диска, очень медленно выполняет ввод/вывод на жесткий диск).

Мы будет создавать новый директорий для каждой виртуальной машины, которую мы хотим создать, например, ~/vm1, ~/vm2, ~/vm3, и так далее, поскольку в каждая виртуальная машина будет иметь поддиректорий, называемый ubuntu-kvm, и, естественно, в каждом отдельном директории, например, в ~/vm1, может быть только один такой поддиректорий. Если вы, например, попытаетесь в ~/vm1 создать вторую виртуальную машину, вы получите сообщение об ошибке, говорящее, что ubuntu-kvm уже существует (если вы, конечно, не запустите vmbuilder с аргументом -dest=DESTDIR):

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

Здесь задается корневой раздел root (/) размером в 8000MB, раздел подкачки swap размером в 4000 Мб и раздел /var размером в 20000MB. Строка — указывает, что следующий раздел (/var в данном примере) находится на отдельном образе диска (т.е., здесь должны быть созданы два диска — один для корневого раздела и раздела подкачки и второй диск для раздела /var). Конечно, вы можете задавать разделы так, как вам нравится (после того, как зададите корневой раздел и раздел подкачки), и, конечно, все они могут находиться на одном образе диска — это только пример.

Я хочу установить на виртуальной машине сервер openssh. Для ттого, чтобы обеспечить, что каждая виртуальная машина получила бы уникальный ключ OpenSSH , мы не должны устанавливать сервер openssh каждый раз, когда мы создаем виртуальную машину. Поэтому мы создадим скрипт boot.sh, который будет выполняться, когда виртуальная машина загружается первый раз. Скрипт будет устанавливать сервер openssh (с уникальным ключом), а также предлагать пользователю изменить пароль, когда он входит в систему первый раз (по умолчанию я буду использовать имя пользователя administrator и с паролем howtoforge):

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.

Вы также можете сделать скрипт «first login» («Первый вход в систему») так, как это описано по следующей ссылке: https://help.ubuntu.com/community/JeOSVMBuilder#First%20login.

Всякий раз, когда скрипт vmbuilder создает новую виртуальную машину, он должен загрузить с «зеркала» Ubuntu все пакеты, на что потребуется некоторое время. Для того, чтобы ускорить процесс, мы установим прокси apt-proxy…

aptitude install apt-proxy

… который кеширует все сгруженные пакеты, так что последующие установки виртуальных машин будут происходить значительно быстрее.

Теперь откроем файл /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 как параметр скрипта vmbuilder.

Теперь запустим команду

vmbuilder kvm ubuntu —help

И посмотрим, какие параметры допустимы.

Для того, чтобы создать нашу первую виртуальную машину vm1, мы переходим в директорий виртуальной машины …

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=howtoforge —addpkg=vim-nox —addpkg=unattended-upgrades
—addpkg=acpid —firstboot=boot.sh —mem=256 —hostname=vm1 —bridge=br0

Большинство параметров понятны сами по себе. Параметр -part указывает на файл с подробным описанием разделов, путь указывается относительно нашего рабочего директория (именно поэтому перед запуском vmbuilder нам пришлось перейти в директорий нашей виртуальной машины), параметр -templates указывает на директорий, в котором находится файл шаблона (опять же относительно нашего рабочего директория) и параметр -firstboot указывает на скрипт firstboot. Параметр -libvirt=qemu:///system указывает KVM добавить эту виртуальную машину в список имеющихся виртуальных машин. Параметр -addpkg позволяет указать пакеты Ubuntu, которые вы хотите установить в процессе создания виртуальной машины (смотрите приведенное ранее объяснение, почему вам не следует добавлять сервер openssh в этот список и нужно вместо этого воспользоваться скриптом firstboot). Параметр -bridge указывает сетевой мост; мы здесь указываем сетевой мост br0, который создали во втором разделе.

В строке -mirror я указал мое локальное прокси зеркало apt-proxy (http://192.168.0.100:9999/ubuntu) — я использовал свой общедоступный IP адрес вместо указания localhost или 127.0.0.1, поскольку это зеркало будет использоваться в файле /etc/apt/sources.list виртуальной машины и, конечно, виртуальная машина не сможет подключиться к адресу 127.0.0.1 на хосте. Конечно, вы можете в -mirror также указать официальный репозиторий Ubuntu, например, http://de.archive.ubuntu.com/ubuntu. Если не указывать параметр -mirror, то будет использоваться репозитарий Ubuntu, используемый по умолчанию (http://archive.ubuntu.com/ubuntu).

Процесс создания может занять несколько минут.

После этого в директории /etc/libvirt/qemu/ вы обнаружите конфигурационный файл в формате XML(=> /etc/libvirt/qemu/vm1.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#

Образы дисков расположены в поддиректории 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#
4. Создание второй виртуальной машины

Если вы хотите создать вторую виртуальную машину (vm2), то выполните следующую короткую последовательность команд:

mkdir -p ~/vm2/mytemplates/libvirt
cp /etc/vmbuilder/libvirt/* ~/vm2/mytemplates/libvirt/
vi ~/vm2/vmbuilder.partition
vi ~/vm2/boot.sh
cd ~/vm2/
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.102 —part=vmbuilder.partition —templates=mytemplates
—user=administrator —name=Administrator —pass=howtoforge —addpkg=vim-nox —addpkg=unattended-upgrades
—addpkg=acpid —firstboot=boot.sh —mem=256 —hostname=vm2 —bridge=br0

Пожалуйста, обратите внимание на то, что вы не должны создавать новый директорий для виртуальной машины (~/vm2) в том случае, если вы передаете аргумент -dest=DESTDIR в команду vmbuilder — это позволит вам создать виртуальную машину в том же самом директории, в котором вы уже создали другую виртуальную машину. В этом случае вам не нужны новые файлы vmbuilder.partition и boot.sh files и не требуется изменять шаблон; вы можете просто воспользоваться уже существующими файлами:

cd ~/vm1/
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.102 —part=vmbuilder.partition —templates=mytemplates
—user=administrator —name=Administrator —pass=howtoforge —addpkg=vim-nox —addpkg=unattended-upgrades
—addpkg=acpid —firstboot=boot.sh —mem=256 —hostname=vm2 —bridge=br0 —destdir=vm2-kvm
5. Управление виртуальными машинами

Виртуальными машинами можно управлять с помощью утилиты virsh — «virtual shell» (прим. переводчика: «виртуальная оболочка», о ней рассказывалось в одной из предыдщих статей, опубликованных на нашем сайте). Для того, чтобы подключиться к виртуальной оболочке, запустите следующую команду:

virsh —connect qemu:///system

Виртуальная оболочка выглядит следующим образом:

root@server1:~/vm2# virsh —connect qemu:///system
Connecting to uri: qemu:///system
Welcome to virsh, the virtualization interactive terminal.
Type: ‘help’ for help with commands
‘quit’ to quit
virsh #

Теперь вы можете набирать команды в виртуальной оболочке для того, чтобы можно было управлять вашими виртуальными машинами. Запустите команду

help

которая выдаст список допустимых команд:

virsh # help
Commands:
help print help
attach-device attach device from an XML file
attach-disk attach disk device
attach-interface attach network interface
autostart autostart a domain
capabilities capabilities
cd change the current directory
connect (re)connect to hypervisor
console connect to the guest console
create create a domain from an XML file
start start a (previously defined) inactive domain
destroy destroy a domain
detach-device detach device from an XML file
detach-disk detach disk device
detach-interface detach network interface
define define (but don’t start) a domain from an XML file
domid convert a domain name or UUID to domain id
domuuid convert a domain name or id to domain UUID
dominfo domain information
domname convert a domain id or UUID to domain name
domstate domain state
domblkstat get device block stats for a domain
domifstat get network interface stats for a domain
domxml-from-native Convert native config to domain XML
domxml-to-native Convert domain XML to native config
dumpxml domain information in XML
edit edit XML configuration for a domain
find-storage-pool-sources discover potential storage pool sources
find-storage-pool-sources-as find potential storage pool sources
freecell NUMA free memory
hostname print the hypervisor hostname
list list domains
migrate migrate domain to another host
net-autostart autostart a network
net-create create a network from an XML file
net-define define (but don’t start) a network from an XML file
net-destroy destroy a network
net-dumpxml network information in XML
net-edit edit XML configuration for a network
net-list list networks
net-name convert a network UUID to network name
net-start start a (previously defined) inactive network
net-undefine undefine an inactive network
net-uuid convert a network name to network UUID
iface-list list physical host interfaces
iface-name convert an interface MAC address to interface name
iface-mac convert an interface name to interface MAC address
iface-dumpxml interface information in XML
iface-define define (but don’t start) a physical host interface from an XML file
iface-undefine undefine a physical host interface (remove it from configuration)
iface-edit edit XML configuration for a physical host interface
iface-start start a physical host interface (enable it / «if-up»)
iface-destroy destroy a physical host interface (disable it / «if-down»)
nodeinfo node information
nodedev-list enumerate devices on this host
nodedev-dumpxml node device details in XML
nodedev-dettach dettach node device from its device driver
nodedev-reattach reattach node device to its device driver
nodedev-reset reset node device
nodedev-create create a device defined by an XML file on the node
nodedev-destroy destroy a device on the node
pool-autostart autostart a pool
pool-build build a pool
pool-create create a pool from an XML file
pool-create-as create a pool from a set of args
pool-define define (but don’t start) a pool from an XML file
pool-define-as define a pool from a set of args
pool-destroy destroy a pool
pool-delete delete a pool
pool-dumpxml pool information in XML
pool-edit edit XML configuration for a storage pool
pool-info storage pool information
pool-list list pools
pool-name convert a pool UUID to pool name
pool-refresh refresh a pool
pool-start start a (previously defined) inactive pool
pool-undefine undefine an inactive pool
pool-uuid convert a pool name to pool UUID
pwd print the current directory
quit quit this interactive terminal
reboot reboot a domain
restore restore a domain from a saved state in a file
resume resume a domain
save save a domain state to a file
schedinfo show/set scheduler parameters
dump dump the core of a domain to a file for analysis
shutdown gracefully shutdown a domain
setmem change memory allocation
setmaxmem change maximum memory limit
setvcpus change number of virtual CPUs
suspend suspend a domain
ttyconsole tty console
undefine undefine an inactive domain
uri print the hypervisor canonical URI
vol-create create a vol from an XML file
vol-create-from create a vol, using another volume as input
vol-create-as create a volume from a set of args
vol-clone clone a volume.
vol-delete delete a vol
vol-dumpxml vol information in XML
vol-info storage vol information
vol-list list vols
vol-path convert a vol UUID to vol path
vol-name convert a vol UUID to vol name
vol-key convert a vol UUID to vol key
vcpuinfo domain vcpu information
vcpupin control domain vcpu affinity
version show version
vncdisplay vnc display
virsh #

Команда

list

выдает список всех работающих виртуальных машин;

list —all

выдает список всех машин, в том числе и неактивных:

virsh # list —all
Id Name State
———————————-
— vm1 shut off
— vm2 shut off
virsh #

Прежде, чем вы первый раз запустите новую виртуальную машину, вы должны определить ее в файле xml (расположен в директории /etc/libvirt/qemu/):

define /etc/libvirt/qemu/vm1.xml

Пожалуйста, запомните, что всякий раз, когда вы изменяете xml файл виртуальной машины, расположенный в директории /etc/libvirt/qemu/, вы должны еще раз запустить командуdefine!

Теперь вы можете запустить виртуальную машину:

start vm

Через несколько секунд вы сможете подключиться к виртуальной машине с помощью клиента SSH, такого как PuTTY; войдите в систему с логином и паролем, используемыми по умолчанию. После того, как вы первый раз войдете в систему, вам будет предложено сменить пароль.

list

должно быть видно, что виртуальная машина работает:

virsh # list
Id Name State
———————————-
1 vm1 running
virsh #

Для того, чтобы остановить виртуальную машину, выполните следующую команду:

shutdown vm1

Для того, чтобы немедленно остановить ее (отключить шнур питания), выполните команду:

destroy vm1

Приостановка работы виртуальной машины:

suspend vm1

Возобновление работы виртуальной машины:

resume vm1

Это наиболее важные команды.

Наберите

quit

для того, чтобы выйти из виртуальной оболочки.

6. Создание виртуальной машины на базе LVM

Виртуальные машины, использующие LVM, имеют некоторые преимущества перед виртуальными машинами, использующими образы виртуальных дисков. Они не столь медленно работают с операциями ввода/вывода на жесткий диск, и для них проще делать резервные копии (используются мгновенные снимки состояния LVM).

Для того, чтобы создать виртуальную машину, использующую LVM, вам нужна группа томов, на которых есть немного свободного пространства, которое не распределено под какой-либо логический том. В настоящем примере я использую группу томов /dev/vg0 размером приблизительно 465GB…

vgdisplay
root@server1:~# vgdisplay
— Volume group —
VG Name vg0
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size 465.29 GB
PE Size 4.00 MB
Total PE 119114
Alloc PE / Size 24079 / 94.06 GB
Free PE / Size 95035 / 371.23 GB
VG UUID hUDyB2-hGR5-T7gI-wxt6-p4Om-PT6l-Bgbi85
root@server1:~#

… который содержит логические тома /dev/vg0/root размером приблизительно 100GB и /dev/vg0/swap_1 размером 1GB — оставшаяся часть не распределена и может использоваться для виртуальных машин:

lvdisplay
root@server1:~# lvdisplay
— Logical volume —
LV Name /dev/vg0/root
VG Name vg0
LV UUID 5PHWtQ-5XuQ-jgvu-uFrJ-f889-w46a-cIRFcb
LV Write Access read/write
LV Status available
# open 1
LV Size 93.13 GB
Current LE 23841
Segments 1
Allocation inherit
Read ahead sectors auto
— currently set to 256
Block device 252:0
— Logical volume —
LV Name /dev/vg0/swap_1
VG Name vg0
LV UUID N25s1p-AQWJ-X2WH-FAyA-xlS6-ettD-55ZHE8
LV Write Access read/write
LV Status available
# open 2
LV Size 952.00 MB
Current LE 238
Segments 1
Allocation inherit
Read ahead sectors auto
— currently set to 256
Block device 252:1
root@server1:~#

Сейчас я создаю виртуальную машину vm3, которая использует LVM. Мы снова можем воспользоваться командой vmbuilder. В этой команде есть параметр -raw, который позволяет виртуальной машине делать записи на блочное устройство (например, /dev/vg0/vm3).

mkdir -p ~/vm3/mytemplates/libvirt
cp /etc/vmbuilder/libvirt/* ~/vm3/mytemplates/libvirt/

Удостоверьтесь, что вы создали все разделы только на одном образе диска, так что в файле vmbuilder.partition не используйте строку -:

vi ~/vm3/vmbuilder.partition
root 8000
swap 2000
/var 10000
vi ~/vm3/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

Как указано в файле vmbuilder.partition, виртуальная машина будет использовать максимум 20GB, поэтому мы создаем логический том размером в 20GB, называемый /dev/vg0/vm3:

lvcreate -L20G -n vm3 vg0

Мы можем теперь создать новую виртуальную машину следующим образом (пожалуйста, обратите внимание на переключатель -raw=/dev/vg0/vm3):

cd ~/vm3/
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.103 —part=vmbuilder.partition —raw=/dev/vg0/vm3
—templates=mytemplates —user=administrator —name=Administrator —pass=howtoforge —addpkg=vim-nox
—addpkg=unattended-upgrades —addpkg=acpid —firstboot=boot.sh —mem=256 —hostname=vm3 —bridge=br0

Теперь вы можете воспользоваться утилитой virsh для управления виртуальной машиной:

virsh —connect qemu:///system

Сначала запустите команду define …

define /etc/libvirt/qemu/vm3.xml

… перед тем, как запустить виртуальную машину:

start vm3