Виртуализация · 8 min read · Jan 12, 2026

Виртуализация с KVM на Ubuntu 12.04 LTS

Виртуализация с KVM на Ubuntu 12.04 LTS

Версия 1.0
Автор: Фалко Тимме
Следите за мной в Twitter

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

Я не даю никаких гарантий, что это сработает для вас!

1 Предварительная заметка

Я использую машину с именем хоста server1.example.com и IP-адресом 192.168.0.100 здесь в качестве моего хоста KVM.

Поскольку мы будем выполнять все шаги из этого руководства с привилегиями root, мы можем либо предварить все команды в этом руководстве строкой sudo, либо стать root прямо сейчас, набрав

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 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

Перед изменением мой файл выглядит следующим образом:

| # Этот файл описывает сетевые интерфейсы, доступные на вашей системе # и как их активировать. Для получения дополнительной информации смотрите interfaces(5). # Циклический сетевой интерфейс auto lo iface lo inet loopback # Основной сетевой интерфейс 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 |

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

| # Этот файл описывает сетевые интерфейсы, доступные на вашей системе # и как их активировать. Для получения дополнительной информации смотрите interfaces(5). # Циклический сетевой интерфейс auto lo iface lo inet loopback # Основной сетевой интерфейс 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

Если вы этого не сделаете, вы можете получить ошибку, такую как open /dev/kvm: Permission denied в журналах виртуальной машины в каталоге /var/log/libvirt/qemu/.

3 Создание виртуальной машины на основе образа

Теперь мы можем создать нашу первую виртуальную машину — виртуальную машину на основе образа (если вы ожидаете много трафика и множество операций чтения и записи для этой виртуальной машины, используйте виртуальную машину на основе LVM вместо этого, как показано в главе 6 — виртуальные машины на основе образов сильно нагружают жесткий диск).

Я хочу создать свои виртуальные машины в каталоге /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 уже существует (если вы не запустите vmbuilder с аргументом –dest=DESTDIR):

root@server1:/var/lib/libvirt/images/vm1# vmbuilder kvm ubuntu -c vm2.cfg  
2009-05-07 16:32:44,185 INFO     Cleaning up  
ubuntukvm уже существует  
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 и раздел /var размером 20000MB. Строка — делает так, что следующий раздел (/var в этом примере) находится на отдельном образе диска (т.е. это создаст два образа диска, один для root и swap и один для /var). Конечно, вы можете определить любые разделы, которые вам нравятся (при условии, что вы также определяете root и swap), и, конечно, они могут находиться в одном образе диска — это просто пример.

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

vi /var/lib/libvirt/images/vm1/boot.sh

| # Этот скрипт будет выполняться в первый раз, когда виртуальная машина загружается # Он выполняется от имени root. # Установить срок действия учетной записи пользователя passwd -e administrator # Установить openssh-server apt-get update apt-get install -qqy --force-yes openssh-server |

Убедитесь, что вы заменили имя пользователя administrator на ваше имя пользователя по умолчанию.

(Вы можете узнать больше об этом здесь: https://help.ubuntu.com/community/JeOSVMBuilder#First%20boot)

(Вы также можете определить скрипт “первого входа”, как описано здесь: https://help.ubuntu.com/community/JeOSVMBuilder#First%20login)

Теперь взгляните на

vmbuilder kvm ubuntu --help

чтобы узнать о доступных параметрах.

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

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

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

В строке –mirror вы можете указать официальный репозиторий Ubuntu в –mirror, например, http://de.archive.ubuntu.com/ubuntu. Если вы пропустите –mirror, то будет использоваться репозиторий по умолчанию Ubuntu (http://archive.ubuntu.com/ubuntu).

Если вы укажете IP-адрес в переключателе –ip, убедитесь, что вы также указываете правильный IP-адрес шлюза, используя переключатель –gw (в противном случае vmbuilder предположит, что это первый действительный адрес в сети, что может быть неверно). Обычно IP-адрес шлюза такой же, как вы используете в /etc/network/interfaces (см. главу 2).

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

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

Образы дисков находятся в подкаталоге 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#
Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.