Рейтинг@Mail.ru
[Войти] [Зарегистрироваться]

Наши друзья и партнеры

UnixForum




Lines Club

Ищем достойных соперников.

Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Виртуализация и эмуляция в Linux

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

Оригинал: "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
должна выдать результат, похожий на следующий:

Если ничего не будет выдано, то это означает, что ваш процессор не поддерживает аппаратную виртуализацию, и вы должны здесь остановиться.

Для того, чтобы установить 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. Параметр <nobrake>--libvirt=qemu:///system<nobrake> указывает 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


Средняя оценка 5 при 1 голосовавших
Вы сможете оценить статью и оставить комментарий, если войдете или зарегистрируетесь.
Только зарегистрированные пользователи могут оценивать и комментировать статьи.

Комментарии

Николай Беляев пишет: 24.05.2010
Спасибо за статью!

Николай Беляев пишет: 28.01.2011
хочу добавить, что autostart не работает из за того что интерфейс br0 стартует позже kvm требуется дополнительная модификация смотрите http://launchpadlibrarian.net/56819962/libvirt-bin.conf.patch или проще http://ubuntuforums.org/showpost.php?p=9632282&postcount=3