Разное

Kvm debian 9: How to install KVM server on Debian 9/10 Headless Server

Содержание

Установка kvm debian 9 — Unix How

Могу предложить такой вот рабочий  вариант установки KVM.

 Сперва нам нужно будет установить пакет qemu-kvm, чтобы работать с виртуальной машиной. 

  • Выполняем в консоли команду
$ sudo apt install -y qemu-kvm libvirt0 virt-manager bridge-utils
$ sudo reboot
  • После этого создаем интерфейс моста для возможности подключения к виртуальным машинам других компьютеров.
  • Устанавливаем сам пакет
$ sudo apt install -y bridge-utils
  • Далее работаем над сетевыми интерфейсами. ens3 зависит от того, какое у вас устройство ethernet. Выглядит это так
$ ifconfig -a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever

2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
state UP group default qlen 1000
    link/ether 52:54:00:51:d5:01 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.87/24 brd 192.168.11.255 scope global dynamic ens3
       valid_lft 42567sec preferred_lft 42567sec
    inet6 fe80::5054:ff:fe51:d501/64 scope link
       valid_lft forever preferred_lft forever
  • Нужно теперь добавить настройку  br0 в /etc/network/interfaces. Выполняем
$ sudo reboot
  • Перезагружаем систему.

Для использования DHCP необходимо следующее:

$ cat /etc/network/interfaces 

# interfaces (5) файл, используемый ifup (8) и ifdown (8) 

auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
      bridge_ports ens3
      bridge_stp off
      bridge_maxwait 0

Для применения статического адреса IP редактируем файл:

$ vi /etc/network/interfaces

# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto br0
iface br0 inet static
      address 192. 168.11.93
      netmask 255.255.255.0
      network 192.168.11.0
      broadcast 192.168.11.255
      gateway 192.168.11.1
      dns-nameservers 192.168.11.2 192.168.11.1
      dns-search hiroom2.com
      bridge_ports ens3
      bridge_stp off
      bridge_maxwait 0

После создания моста bro0 имеет одинаковый mac адрес с ens3, причем IP присваивается в этом случае br0 как:

$ ifconfig -a

1: lo: <LOOPBACK, UP, LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
group default qlen 1 
    link / loopback 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00 
    inet 127.0.0.1/8 scope host lo 
       valid_lft forever preferred_lft forever 
    inet6 :: 1/128 scope host 
       valid_lft forever preferred_lft forever 

2: ens3: <BROADCAST, MULTICAST, UP, LOWER_UP> mtu 1500 qdisc pfifo_fast 
master br0 состояние UP group default qlen 1000 
    link / ether 52: 54: 00: 51: d5: 01 brd ff: ff: ff: ff: ff: ff 

3: br0: <BROADCAST, MULTICAST, UP, LOWER_UP> mtu 1500 qdisc noqueue state 

UP group default qlen 1000 
    link / эфир 52: 54: 00: 51: d5: 01 brd ff: ff: ff: ff: ff: ff
    inet 192.168.11.87/24 brd 192.168.11.255 scope global br0 
       valid_lft forever preferred_lft forever 
    inet6 fe80 :: 5054: ff: fe51: d501 / 64 scope link 
       valid_lft forever preferred_lft forever
  • Создаем группу LIBVIRT. Нужно это для запуска команды libvirt без команды sudo
$ sudo gpasswd libvirt -a <username>

После создаем каталог ISO. Для этого будем перемещать debian-9.0.0-amd64-netinst.iso в сам каталог  iso. Выполняем:

$ sudo mkdir /var/lib/libvirt/iso 
$ sudo mv debian-9.0.0-amd64-netinst.iso /var/lib/libvirt/iso/ 
$ sudo chown libvirt-qemu: libvirt  /var/ lib/libvirt/ISO/Debian-9.0.0-amd64-netinst.iso

Теперь перейдем к созданию виртуальной машины с virt-manager.

Выполняем команду:

$ virt-manager

Появится вот такое окошко:

В вверху слева выбираем в опции file — Создать новую виртуальную машину.  

После этого нам необходимо будет выбрать сам установочный носитель. У нас это debian-9 . . .( В каталоге ISO находится)

Далее выбираем «Обзор(Browse), нажимаем добавить + , вводим имя хранилища,  Каталог файловой системы выбираем DIR:

Далее необходимо обозначить путь пула хранилища ввода. Делается это вот здесь:

Теперь находим наш каталог Debian 9:

Следующим шагом выбираем тип ОС:

Далее определяем размер ядра и количество памяти:

Делаем хранилище как на скриншоте ниже:

Теперь переходим к выбору виртуальной сети:

Вот после таких танцев получаем установку на виртуальную машину.

ООО МааСофтваре — Ошибка 404: Страница не найдена

test

Ошибка 404: Страница не найдена

Ошибка 404: Страница не найдена

Вы можете воспользоваться поиском по сайту или навигацией, чтобы найти нужную информацию.

Назад  Наверх

Март 2021
   Пн   Вт   Ср   Чт   Пт   Сб   Вс   
   1   2   3   4   5   6   7   
   8   9   10   11   12   13   14   
   15   16   17   18   19   20   21   
   22   23   24   25   26   27   28   
   29   30   31           
 30 марта 2021 года, вторник 

Новости

[. ..] Архив новостей.

Новое на сайте

Сейчас на сайте

Гостей: 2
Пользователей: 0
Роботов: 2
Всего пользователей: 32

Другие ресурсы

Linux: Debian 9 KVM

Устанавливаем пакеты:

# apt -y install qemu-kvm libvirt-daemon libvirt-daemon-system virtinst bridge-utils

Для того, чтобы иметь возможность управлять
виртуальными машинами (ВМ) от обычного пользователя, вы должны добавить
этого пользователя в группы kvm и libvirt:

 
# adduser <youruser> kvm
# adduser <youruser> libvirt
 
или
 
# sudo gpasswd libvirt -a <username> 
# sudo gpasswd kvm -a <username> 

  Посмотреть список доменов:

 
# virsh list --all
 

Включить vhost-net.

# modprobe vhost_net


# lsmod | grep vhost 


vhost_net               20480     0 

tun                            28672     1         vhost_net 

vhost                       45056     1          vhost_net 

macvtap                  24576     1         vhost_net 

# echo vhost_net >> /etc/modules

libvirt defaults to qemu:///session for non-root. So from <youruser> you’ll need to do:

# virsh —connect qemu:///system list —all

You can use LIBVIRT_DEFAULT_URI to change this.

Создание гостевой ВМ

Самый простой способ для создания и управления гостевыми ВМ это использовать графическое приложение Virtual Machine Manager virt-manager.

Также,
вы можете создать гостевую ВМ в командной строке. Ниже приведен пример
для создания гостевой ВМ Debian Squeeze с именем squeeze-amd64:

 

# virt-install —virt-type kvm —name squeeze-amd64 —memory 512 —cdrom ~/iso/Debian/cdimage. debian.org_mirror_cdimage_archive_6.0.10_live_amd64_iso_hybrid_debian_live_6.0.10_amd64_gnome_desktop.iso —disk size=4 —os-variant debiansqueeze

Since the guest has no network connection yet, you will need to use the GUI virt-viewer to complete the install.

You can avoid pulling the ISO by using the —location option. To obtain text console for the installation you can also provide —extra-args «console=ttyS0»:

# virt-install —virt-type kvm —name squeeze-amd64 \
—location http://httpredir.debian.org/debian/dists/squeeze/main/installer-amd64/ \
—extra-args «console=ttyS0» -v —os-variant debiansqueeze \
—disk size=4 —memory 512

Managing VMs from the command-line

You can then use the virsh(1) command to start and stop virtual machines. VMs can be generated using virtinst. For more details see the libvirt page. Virtual machines can also be controlled using the kvm command in a similar fashion to QEMU. Below are some frequently used commands:

Start a configured VM guest «VMGUEST»:

# virsh start VMGUEST

Notify the VM guest «VMGUEST» to graceful shutdown:

# virsh shutdown VMGUEST

Force the VM guest «VMGUEST» to shutdown in case it is hanged, i.e. graceful shutdown not work:

# virsh destroy VMGUEST

Configure Bridge networking. 

 

# 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).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto ens33

# change like follows

iface ens3 inet manual

#iface ens3 inet static

#address 10.0.0.30

#network 10.0.0.0

#netmask 255.255.255.0

#broadcast 10. 0.0.255

#gateway 10.0.0.1

#dns-nameservers 10.0.0.30

# add bridge interface

iface br0 inet static
address 10.0.0.30
network 10.0.0.0
netmask 255.255.255.0
broadcast 10.0.0.255
gateway 10.0.0.1
dns-nameservers 10.0.0.30
bridge_ports ens3
bridge_stp off
auto br0

#reboot

#ip addr 

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 52:54:00:99:d3:a8 brd ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 52:54:00:99:d3:a8 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.30/24 brd 10.0.0.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe99:d3a8/64 scope link
       valid_lft forever preferred_lft forever









Определить языкАзербайджанскийАлбанскийАнглийскийАрабскийАрмянскийАфрикаансБаскскийБелорусскийБенгальскийБирманскийБолгарскийБоснийскийВаллийскийВенгерскийВьетнамскийГалисийскийГреческийГрузинскийГуджаратиДатскийЗулуИвритИгбоИдишИндонезийскийИрландскийИсландскийИспанскийИтальянскийЙорубаКазахскийКаннадаКаталанскийКитайский (Упр)Китайский (Трад)КорейскийКреольский (Гаити)КхмерскийЛаосскийЛатинскийЛатышскийЛитовскийМакедонскийМалагасийскийМалайскийМалайяламМальтийскийМаориМаратхиМонгольскийНемецкийНепалиНидерландскийНорвежскийПанджабиПерсидскийПольскийПортугальскийРумынскийРусскийСебуанскийСербскийСесотоСингальскийСловацкийСловенскийСомалиСуахилиСуданскийТагальскийТаджикскийТайскийТамильскийТелугуТурецкийУзбекскийУкраинскийУрдуФинскийФранцузскийХаусаХиндиХмонгХорватскийЧеваЧешскийШведскийЭсперантоЭстонскийЯванскийЯпонский АзербайджанскийАлбанскийАнглийскийАрабскийАрмянскийАфрикаансБаскскийБелорусскийБенгальскийБирманскийБолгарскийБоснийскийВаллийскийВенгерскийВьетнамскийГалисийскийГреческийГрузинскийГуджаратиДатскийЗулуИвритИгбоИдишИндонезийскийИрландскийИсландскийИспанскийИтальянскийЙорубаКазахскийКаннадаКаталанскийКитайский (Упр)Китайский (Трад)КорейскийКреольский (Гаити)КхмерскийЛаосскийЛатинскийЛатышскийЛитовскийМакедонскийМалагасийскийМалайскийМалайяламМальтийскийМаориМаратхиМонгольскийНемецкийНепалиНидерландскийНорвежскийПанджабиПерсидскийПольскийПортугальскийРумынскийРусскийСебуанскийСербскийСесотоСингальскийСловацкийСловенскийСомалиСуахилиСуданскийТагальскийТаджикскийТайскийТамильскийТелугуТурецкийУзбекскийУкраинскийУрдуФинскийФранцузскийХаусаХиндиХмонгХорватскийЧеваЧешскийШведскийЭсперантоЭстонскийЯванскийЯпонский

Звуковая функция ограничена 200 символами

Глава 1.

Начало работы с QEMU и KVM

В данной главе мы обсудим следующие вопросы:

  • Установка и настройка QEMU

  • Управление образами диска с помощью qemu-img

  • Подготовка образов для установки ОС через qemu-nbd

  • Установка некоторой пользовательской ОС на оброс посредством debootstrap

  • Изменение размера некоторого образа

  • Применение предварительно имевшихся образов

  • Исполнение виртуальных машин с применением qemu-system-*

  • Запуск ВМ QEMU с поддержкой KVM

  • Подключение к исполняемому экземпляру с использованием VNC

QEMU (Quick Emulator) является основным компонентом комплекта технологии виртуализации QEMU/ KVM. Он предоставляет аппаратную виртуализацию и эмуляцию процессора. QEMU исполняется в пространстве пользователя и, без необходимости в ядре, драйверы всё ещё могут предоставлять быструю эмуляцию системы. QEMU поддерживает два режима операционной системы:

  • Эмуляция всей системы, при которой QEMU эмулирует всю вычислительную систему, ключая тип её процессора и периферийных устройств

  • Эмуляция режима пользователя, при которой QEMU может исполнять некий процесс, который был откомпиллирован в архитектурах, имеющих другую собственную архитектуру ЦПУ

В этой книге мы намереваемся сосредоточиться на эмуляции системы целиком с полным аппаратным ускорением, предоставляемым гипервизором KVM (Kernel-based Virtual Machine).

В данной главе мы начнём с установки QEMU на Linux, затем исследуем различные примеры построения, сопровождения, управления и использования образов лиска для экземпляров виртуальных машин. Затем мы выполним глубокий обзор исполнения QEMU в режиме эмуляции всей системы с применением предстоставляемых исполняемых кодов. Наконец, мы собираемся закончить эту главу подробностями о том, как подключаться к тем виртуальным машинам, которые мы запускали ранее с использованием клиентов VNC.

Установка и настройка QEMU

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

Приготовление

В зависимости от вашего дистрибутива Linux само название пакета и команду установки могут отличаться. Вы можете применять свою систему диспетчера пакетов, например apt, dnf или yum для поиска каких- либо пакетов, содержащих строку QEMU и ознакомиться с теми, которые доступны для вашего конкретного случая. Все исходные годы могут быть выгружены с официального вебсайта проекта по адресу http://www.qemu-project.org/download/#source.

Как это сделать

Чтобы установить QEMU из пакетов в дистрибутиве Ubuntu/ Debian выполните следующие шаги:

  1. Обновите индексацию своего пакета:

    
    [email protected]:~# apt-get update
     	   

  2. Установите сам пакет:

    
    [email protected]:~# apt-get install -y qemu
     	   

В дистрибутивах CentOS/RHEL выполните:

  1. 
    [email protected]:~# yum install qemu-kvm
     	   

Чтобы установить из исходного кода выполните процедуру:

  1. Вначале загрузите весь архив:

    
    [email protected]:~#cd /usr/src && wget
    http://download. qemu-project.org/qemu-2.8.0.tar.xz
     	   

  2. Распакуйте файлы из этого архива:

    
    [email protected]:/usr/src# tar xvJf qemu-2.8.0.tar.xz && cd qemu-2.8.0
     	   

  3. Настройте и скомпиллируйте данный исходный код:

    
    [email protected]:/usr/src/qemu-2.8.0# ./configure
    [email protected]:/usr/src/qemu-2.8.0# make && make install
     	   


Как это работает

Настройка QEMU достаточно тривиальна, как мы только что увидели. Давайте взглянем на то, какие метапакеты
QEMU утсанавливаются в Ubuntu:


[email protected]:~# dpkg --list | grep qemu
ii ipxe-qemu 1.0.0+git-20150424.a25a16d-1ubuntu1 all PXE boot firmware - ROM images for qemu
ii qemu 1:2.5+dfsg-5ubuntu10.8 amd64 fast processor emulator
ii qemu-block-extra:amd64 1:2.5+dfsg-5ubuntu10.8 amd64 extra block backend modules for qemu-system and qemu-utils
ii qemu-slof 20151103+dfsg-1ubuntu1 all Slimline Open Firmware -- QEMU PowerPC version
ii qemu-system 1:2.5+dfsg-5ubuntu10.8 amd64 QEMU full system emulation binaries
ii qemu-system-arm 1:2.5+dfsg-5ubuntu10.8 amd64 QEMU full system emulation binaries (arm)
ii qemu-system-common 1:2.5+dfsg-5ubuntu10.8 amd64 QEMU full system emulation binaries (common files)
ii qemu-system-mips 1:2.5+dfsg-5ubuntu10.8 amd64 QEMU full system emulation binaries (mips)
ii qemu-system-misc 1:2.5+dfsg-5ubuntu10.8 amd64 QEMU full system emulation binaries (miscelaneous)
ii qemu-system-ppc 1:2.5+dfsg-5ubuntu10.8 amd64 QEMU full system emulation binaries (ppc)
ii qemu-system-sparc 1:2.5+dfsg-5ubuntu10.8 amd64 QEMU full system emulation binaries (sparc)
ii qemu-system-x86 1:2.5+dfsg-5ubuntu10.8 amd64 QEMU full system emulation binaries (x86)
ii qemu-user 1:2. 5+dfsg-5ubuntu10.8 amd64 QEMU user mode emulation binaries
ii qemu-user-binfmt 1:2.5+dfsg-5ubuntu10.8 amd64 QEMU user mode binfmt registration for qemu-user
ii qemu-utils 1:2.5+dfsg-5ubuntu10.8 amd64 QEMU utilities
[email protected]:~#
 	   

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

Заслуживает внимания тот факт, что все исполняемые файлы упомянутых выше пакетов начинаются с префикса QEMU.
Вы можете применять завершение клавиши tab для просмотра
списка всех доступных для исполнения файлов:


[email protected]:~# qemuqemu-aarch64 qemu-io qemu-mips64el qemu-ppc64 qemu-sparc32plus qemu-system-lm32 qemu-system-mipsel qemu-system-sh5 qemu-system-xtensa
qemu-alpha qemu-m68k qemu-mipsel qemu-ppc64abi32 qemu-sparc64 qemu-system-m68k qemu-system-moxie qemu-system-sh5eb qemu-system-xtensaeb
qemu-arm qemu-make-debian-root qemu-mipsn32 qemu-ppc64le qemu-system-aarch64 qemu-system-microblaze qemu-system-or32 qemu-system-sparc qemu-tilegx
qemu-armeb qemu-microblaze qemu-mipsn32el qemu-s390x qemu-system-alpha qemu-system-microblazeel qemu-system-ppc qemu-system-sparc64 qemu-unicore32
qemu-cris qemu-microblazeel qemu-nbd qemu-sh5 qemu-system-arm qemu-system-mips qemu-system-ppc64 qemu-system-tricore qemu-x86_64
qemu-i386 qemu-mips qemu-or32 qemu-sh5eb qemu-system-cris qemu-system-mips64 qemu-system-ppc64le qemu-system-unicore32
qemu-img qemu-mips64 qemu-ppc qemu-sparc qemu-system-i386 qemu-system-mips64el qemu-system-ppcemb qemu-system-x86_64
[email protected]:~#
 	   

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


Приготовление

Чтобы воспользоваться данным рецептом, нам необходимо иметь установленной утилиту
qemu-img.. Если вы следовали всем шагам в первом рецепте, вы должны
её иметь. Чтобы проверить какие типы образов поддерживаются в вашем дистрибутиве Linux, исполните
следующую команду:


[email protected]:~# qemu-img -h | grep Supported
Supported formats: bochs vvfat rbd vpc parallels tftp ftp ftps raw https qcow dmg http qcow2 quorum null-aio cloop vdi iscsi null-co vhdx blkverify file vmdk host_cdrom blkdebug host_device sheepdog qed nbd
[email protected]:~#
 	   

Из предыдущего вывода мы можем обнаружить, что имеется много поддерживаемых образов в данной тестовой
системе, которые мы можем применять. Убедитесь, что ваша версия QEMU поддерживает тип сырого (raw) образа,
поскольку он является типом по умолчанию и именно его мы собираемся применять в данном рецепте. одним из
наиболее часто применяемых типов является qcow2, который поддерживает
копирование при записи {Прим. пер.: механизм, при котором все изменения
осуществляются новой записью
}, сжатием, шифрованием, а также созданием моментальных снимков.
Мы собираемся усилиться с его помощью в последующих рецептах.
{Прим. пер.: для справки: основной формат, применяемый в VMWare/ ESXi
.vmdk, в Citrix/ XenServer .xva,
в Microsoft/ Hyper-V .vhdx Подробнее см. {Прим.
пер.: см. Также ознакомьтесь….
}

Замечание

Заметьте, пожалуйста, что хотя QEMU поддерживает множество форматов, это совсем не означает, что вы
можете исполнять в нём эти виртуальные машины. Однако, qemu-img
может быть использован для преобразования различных образов в форматы raw
и qcow2. Для лучшей производительности применяйте raw
или qcow2.


Как это сделать…

Для создания пустого образа raw определённого размера и проверки того
то этот файл был создан на данном хосте:

  1. Создайте образ raw с названием
    debian.img и размером 10 ГБ:

    
    [email protected]:~# qemu-img create -f raw debian.img 10G
    Formatting 'debian.img', fmt=raw size=10737418240
    [email protected]:~#
     	   

  2. Проверьте что файл был создан:

    
    [email protected]:~# ls -lah debian.img
    -rw-r--r-- 1 root root 10G Feb 10 16:58 debian.img
    [email protected]:~#
     	   

  3. Опросите тип файла:

    
    [email protected]:~# file -s debian.img
    debian.img: data
    [email protected]:~#
     	   

  4. Получите дополнительную информацию о данном образе:

    
    [email protected]:~# qemu-img info debian. img
    image: debian.img
    file format: raw
    virtual size: 10G (10737418240 bytes)
    disk size: 0
    [email protected]:~#
     	   


Как это работает…

Утилита qemu-img позволяет нам создавать, преобразовывать и
изменять образы гостей.

На 1 шаге мы воспользовались конкретным флагом -f определяющим
выбранный нами формат файла, в данном случае это raw,
само название данного подлежащего созданию образа и его размер в гигабайтах.

На шаге 4 мы воспользовались подкомандой info для получения
дополнительной информации о данном имеющемся образе. Отметим, что имеющийся размер диска, отображаемый в
настоящий момент равен нулю. Мы собираемся создать что- то в своём следующем рецепте.


Также ознакомьтесь…

В данном рецепте мы перечислили поддерживаемые QEMU форматы дисков. Ниже мы представляем краткое описание
наиболее общих типов, с которыми вы можете встретиться:

  • raw: Формат сырого образа диска. Он является форматом по умолчанию
    и может быть одним из самых быстрых форматов на основе файла. Если вы отформатируете этот образ некоторой
    файловой системой, которая поддерживает пустые места, например, EXT3, тогда пространство будут использовать
    только имеющие данные сектора. Основным недостатком таких сырых образов является отсутствие свойств, что делает
    их идеальным средством для тестирования и прототипирования.

  • qcow2: как уже упоминалось в предыдущем разделе, это формат, обладающий
    одним из самых богатых набором свойств. Он поддерживает моментальные снимки ВМ, сжатие и шифрование за счёт
    небольшого снижения производительности. {Прим. пер.: для запоминания аббревиатуры:
    QEMU
    Copy-
    On-
    Write
    }.

  • qcow: Это более старый формат QEMU, который поддерживает файлы
    резервных копий, компактные файлы образов, шифрование и компрессию.

  • dmg: Это формат образа диска для Mac. Данный образ диска Mac
    предоставляет защиту безопасным паролем и сжатие, а также наиболее часто применяется для распространения
    програмного обеспечения вместо того, чтобы исполнять виртуальные машины.

  • nbd: Сетевые блочные устройства (network block device), обычно
    применяются для доступа к удалённым устройствам хранения.

  • vdi: Этот формат диска применяется программным обеспечением
    Oracle VirtualBox и может использоваться для исполнения виртуальных машин на платформах с различными ЦПУ.

  • vmdk: Это тип образа диска VMWare, в котором отдельный виртуальный
    жёсткий диск может объединять множество файлов.

  • vhdx: Этот формат применяет Microsoft Hyper-V. Он предоставляет большую
    ёмкость хранения, защиту от разрушения данных в процессе отказов электропитания, а также оптимизацию чтения/
    записи для больших образов дисков.

В данной книге мы собираемся пользоваться форматами дисков raw и
qcow2, поскольку они предоставляют наилучшую производительность и
набор средств для исполнения и манипуляции ими.

Подготовка образов для установки ОС при помощи qemu-nbd

В предыдущем рецепте мы создали некий пустой образ raw. В данном рецепт мы собираемся сделать в нём
некий раздел и какую- то файловую систему, подготовив этот образ для полной установки гостевой ОС.
При создании таких раздела и файловой системы вам следует рассмотреть тот тип загрузки, который создаст этот
виртуальный экземпляр. Если ваше приложение исполняется внутри ВМ с ограниченными операциями ввода/ вывода, вы
можете рассмотреть для его файловой системы XFS. В данном рецепте мы собираемся применить EXT4, так как большая
часть дистрибутивов Linux боддерживают её сразу после установки.


Приготовление

Для данного рецепта нам понадобятся следующие инструменты:

Большинство дистрибутивов Linux должны уже иметь все эти инструменты установленными, если это не так,
ознакомьтесь с документацией своего дистрибутива по поводу того, как их установить.


Как это сделать…

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

  1. Загрузите необходимый вам модуль ядра nbd:

    
    [email protected]:~# modprobe nbd
    [email protected]:~#
     	   

  2. Воспользовавшись инструментом qemu-nbd, свяжите имеющийся файл
    пустого образа с блочным устройством /dev/nbd0:

    
    [email protected]:~# qemu-nbd --format=raw --connect=/dev/nbd0 debian.img
    [email protected]:~#
     	   

  3. Создайте в этом блочном устройстве два раздела. Один будет применяться для подкачки (swap), а другой будет
    выступать в роли того корневого раздела, который требуется вашей гостевой ОС:

    
    [email protected]:~# sfdisk /dev/nbd0 << EOF
    >,1024,82
    >;
    >EOF
    Checking that no-one is using this disk right now ...
    OK
    Disk /dev/nbd0: cannot get geometry
    
    Disk /dev/nbd0: 1305 cylinders, 255 heads, 63 sectors/track
    
    sfdisk: ERROR: sector 0 does not have an msdos signature
    /dev/nbd0: unrecognized partition table type
    Old situation:
    No partitions found
    New situation:
    Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0
    
     Device Boot Start End #cyls #blocks Id System
    /dev/nbd0p1 0+ 1023 1024- 8225279+ 82 Linux swap / Solaris
    /dev/nbd0p2 1024 1304 281 2257132+ 83 Linux
    /dev/nbd0p3 0 - 0 0 0 Empty
    /dev/nbd0p4 0 - 0 0 0 Empty
    Warning: no primary partition is marked bootable (active)
    This does not matter for LILO, but the DOS MBR will not boot this disk. 
    Successfully wrote the new partition table
    
    Re-reading the partition table ...
    
    If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
    to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
    (See fdisk(8).)
    [email protected]:~#
     	   

  4. После создания разделов перечислите все доступные блочные устройства:
    Code

    
    [email protected]:~# ls -la /dev/nbd0*
    brw-rw---- 1 root disk 43, 0 Feb 10 18:24 /dev/nbd0
    brw-rw---- 1 root disk 43, 1 Feb 10 18:24 /dev/nbd0p1
    brw-rw---- 1 root disk 43, 2 Feb 10 18:24 /dev/nbd0p2
    [email protected]:~#
     	   

  5. Создайте необходимый раздел подкачки:

    
    [email protected]:~# mkswap /dev/nbd0p1
    Setting up swapspace version 1, size = 508 KiB (520192 bytes)
    no label, UUID=c246fe39-1bc5-4978-967c-806264771d69
    [email protected]:~#
     	   

  6. В качестве своего корневого раздела создайте файловую систему EXT4:

    
    [email protected]:~# mkfs.ext4 /dev/nbd0p2
    mke2fs 1.42.13 (17-May-2015)
    Discarding device blocks: failed - Input/output error
    Creating filesystem with 2620928 4k blocks and 655360 inodes
    Filesystem UUID: 2ffa23de-579a-45ad-abbc-2a179de67f11
    Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
    Allocating group tables: done
    Writing inode tables: done
    Creating journal (32768 blocks): done
    Writing superblocks and filesystem accounting information: done
    [email protected]:~#
     	   


Как это работает…

Мы воспользовались преимуществами функциональности, которые предоставляет модуль ядра
nbd, предоставляя нам возможность связать некий файл образа raw
с блочным устройством при помощи утилиты qemu-nbd. Для получения
дополнительной информации об этом модуле ядра исполните следующий код:


[email protected]:~# modinfo nbd
filename: /lib/modules/4.4.0-62-generic/kernel/drivers/block/nbd.ko
license: GPL
description: Network Block Device
srcversion: C67096AF2AE3C738DBE0B7E
depends:
intree: Y
vermagic: 4.4.0-62-generic SMP mod_unload modversions
parm: nbds_max:number of network block devices to initialize (default: 16) (int)
parm: max_part:number of partitions per device (default: 0) (int)
[email protected]:~#
 	   

Мы можем опросить метаданные своего блочного устройства, которое мы создали на шаге 2 выполнив такую
команду:


[email protected]:~# file -s /dev/nbd0
/dev/nbd0: x86 boot sector
[email protected]:~#
 	   

После создания двух новых разделов на шаге 3 изменился тип самого файла образа. Давайте опросим его снова:


[email protected]:~# file -s debian.img
debian.img: x86 boot sector
[email protected]:~#
 	   
Замечание

Мы выбрали использование утилиты sfdisk для создания необходимых
разделов, но вы можете применить интерактивно и утилиту fdisk,
если вы предпочитаете её. Окончательный результат будет одним и тем же.

Теперь, когда у нас имеется файл некого образа, который содержит два раздела и какую- то файловую систему,
мы можем продолжить установку своей гостевой ОС в нашем следующем рецепте.

Установка пользовательской ОС в образ при помощи debootstrap

В данном рецепте мы собираемся воспользоваться утилитой debootstrap
для установки дистрибутива Debian в том образе raw, который мы подготовили в двух предыдущих рецептах.
Сама команда debootstrap применяется для самозагрузки некоторой
базовой системы Debian с применением определённого общедоступного зеркала. К концу данного рецепта мы должны
иметь некий образ, содержащий полный дистрибутив Linux готовый к исполнению QEMU.


Приготовление

Для выполнения данного рецепта мы будем нуждаться в следующем:

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


[email protected]:~# ls -la /dev/nbd0*
brw-rw---- 1 root disk 43, 0 Feb 10 18:24 /dev/nbd0
brw-rw---- 1 root disk 43, 1 Feb 10 18:24 /dev/nbd0p1
brw-rw---- 1 root disk 43, 2 Feb 10 18:24 /dev/nbd0p2
[email protected]:~#
 	   

Если что- то находится не на своём месте, повторите, пожалуйста, рецепт Подготовка образов для установки ОС при помощи qemu-nbd по поводу того как связать свой
образ raw с необходимым блочным устройством /deb/nbd0.

Чтобы установить утилиту debootstrap, если она ещё не присутствует
у вас в системе, исполните следующий код:


[email protected]:~# apt install -y debootstrap
...
Setting up debootstrap (1.0.78+nmu1ubuntu1.2) ...
[email protected]:~#
 	   

Как это сделать…

Для установки некоторого нового дистрибутива Debian в своё устройство raw следуйте набросанным далее шагам:

  1. Смонтируйте свой корневой раздел из устройства NBD
    (Network Block Device) и убедитесь что оно
    смонтировалось успешно:

    
    [email protected]:~# mount /dev/nbd0p2 /mnt/
    [email protected]:~# mount | grep mnt
    /dev/nbd0p2 on /mnt type ext4 (rw)
    [email protected]:~#
     	   

  2. Установите самую последнюю стабильную версию дистрибутива Debian в свой корневой раздел смонтированный в
    /mnt из определённого общедоступного репозитория:

    
    [email protected]:~# debootstrap --arch=amd64 --include="openssh-server vim" stable /mnt/ http://httpredir. debian.org/debian/
    ...
    I: Base system installed successfully.
    [email protected]:~#
     	   

  3. Убедитесь что ваша корневая файловая система была создана выведя перечень всех имеющихся в данном
    смонтированном местоположении файлов:

    
    [email protected]:~# ls -lah /mnt/
    total 100K drwxr-xr-x 22 root root 4.0K Feb 10 17:19 .
    drwxr-xr-x 23 root root 4.0K Feb 10 15:29 ..
    drwxr-xr-x 2 root root 4.0K Feb 10 17:19 bin
    drwxr-xr-x 2 root root 4.0K Dec 28 17:42 boot
    drwxr-xr-x 4 root root 4.0K Feb 10 17:18 dev
    drwxr-xr-x 55 root root 4.0K Feb 10 17:19 etc
    drwxr-xr-x 2 root root 4.0K Dec 28 17:42 home
    drwxr-xr-x 12 root root 4.0K Feb 10 17:19 lib
    drwxr-xr-x 2 root root 4.0K Feb 10 17:18 lib64
    drwx------ 2 root root 16K Feb 10 17:06 lost+found
    drwxr-xr-x 2 root root 4.0K Feb 10 17:18 media
    drwxr-xr-x 2 root root 4.0K Feb 10 17:18 mnt
    drwxr-xr-x 2 root root 4.0K Feb 10 17:18 opt
    drwxr-xr-x 2 root root 4.0K Dec 28 17:42 proc
    drwx------ 2 root root 4.0K Feb 10 17:18 root
    drwxr-xr-x 4 root root 4.0K Feb 10 17:19 run
    drwxr-xr-x 2 root root 4.0K Feb 10 17:19 sbin
    drwxr-xr-x 2 root root 4.0K Feb 10 17:18 srv
    drwxr-xr-x 2 root root 4.0K Apr 6 2015 sys
    drwxrwxrwt 2 root root 4.0K Feb 10 17:18 tmp
    drwxr-xr-x 10 root root 4.0K Feb 10 17:18 usr
    drwxr-xr-x 11 root root 4.0K Feb 10 17:18 var
    [email protected]:~#
     	   

  4. Свяжите весь каталог устройств со своего хоста в выстраиваемую файловую систему образа и смонтируйте их:

    
    [email protected]:~# mount --bind /dev/ /mnt/dev
    [email protected]:~#
     	   

  5. Проверьте что все устройства nbd теперь присутствуют внутри этого
    смонтированного положения:

    
    [email protected]:~# ls -la /mnt/dev/ | grep nbd0
    brw-rw---- 1 root disk 43, 0 Feb 10 18:24 nbd0
    brw-rw---- 1 root disk 43, 1 Feb 10 18:26 nbd0p1
    brw-rw---- 1 root disk 43, 2 Feb 10 18:26 nbd0p2
    [email protected]:~#
     	   

  6. Измените пространство имён данного каталога, чтобы оно было корневой файловой системой нашего образа
    и убедитесь в успешности данной операции:

    
    [email protected]:~# chroot /mnt/
    [email protected]:/# pwd
    / r
    [email protected]:/#
     	   

  7. Проверьте номер версии дистрибутива внутри своей среды chroot:

    
    [email protected]:/# cat /etc/debian_version
    8. 7
    [email protected]:/#
     	   


  8. Code

    
    New-VM -Name VM01 -Generation 2
     	   

  9. Смонтируйте виртуальные файловые системы proc и
    sysfs внутри своей среды chroot:

    
    	 proc and sysfs 
    [email protected]:/# mount -t proc none /proc
    [email protected]:/# mount -t sysfs none /sys
    [email protected]:/#
     	   

  10. Всё ещё находясь внутри местоположения своего chroot, установите сам метапакет ядра Debian и утилиты
    grub2:

    
    [email protected]:/# apt-get install -y --force-yes linux-image-amd64 grub2
     	   

    Замечание

    Если вы получите запрос на выбор целевого устройства для установки в нём GRUB, не выбирайте
    никакого и просто продолжите.

  11. Установите GRUB в своём корневом устройстве:

    
    [email protected]:/# grub-install /dev/nbd0 --force
    Installing for i386-pc platform.
    grub-install: warning: this msdos-style partition label has no post-MBR gap; embedding won't be possible.
    grub-install: warning: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..
    Installation finished. No error reported.
    [email protected]:/#
     	   

  12. Обновите настройки GRUB и сам образ initrd:

    
    [email protected]:/# update-grub2
    Generating grub configuration file ...
    Found linux image: /boot/vmlinuz-3. 16.0-4-amd64
    Found initrd image: /boot/initrd.img-3.16.0-4-amd64
    done
    [email protected]:/#
     	   

  13. Измените пароль root для своего гостя:

    
    [email protected]:/# passwd
    Enter new UNIX password:
    Retype new UNIX password:
    passwd: password updated successfully
    [email protected]:/#
     	   

  14. Разрешите доступ к псевдо- Терминалу внутри ОС своего нового гостя:

    
    [email protected]:/# echo "pts/0" >> /etc/securetty
    [email protected]:/#
     	   

  15. Измените текущий уровень systemd на уровень
    multi-user:

    
    [email protected]:/# systemctl set-default multi-user.target
    Created symlink from /etc/systemd/system/default.target to /lib/systemd/system/multi-user.target.
    [email protected]:/#
     	   

  16. Добавьте точку монтирования своего корня в соответствующий файл fstab
    с тем, чтобы она могла всегда существовать после перезагрузок:

    
    [email protected]:/# echo "/dev/sda2 / ext4 defaults,discard 0 0" > /etc/fstab
     	   

  17. Удалите монтирование следующих файловых систем, поскольку мы сделали их теперь используемыми:

    
    [email protected]:/# umount /proc/ /sys/ /dev/
     	   

  18. Выйдите из своей среды chroot:

    
    [email protected]:/# exit
    exit
    [email protected]:~#
     	   

  19. Установите GRUB в своём корневом разделе того блочного устройства, которое связано с образом raw:

    
    [email protected]:~# grub-install /dev/nbd0 --root-directory=/mnt --modules="biosdisk part_msdos" --force
    Installing for i386-pc platform. 
    grub-install: warning: this msdos-style partition label has no post-MBR gap; embedding won't be possible.
    grub-install: warning: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..
    Installation finished. No error reported.
    [email protected]:~#
     	   

  20. Обновите свой файл настроек GRUB чтобы от отражал правильное блочное устройство для данного образа
    гостя:

    
    [email protected]:~# sed -i 's/nbd0p2/sda2/g' /mnt/boot/grub/grub.cfg
    [email protected]:~#
     	   

  21. Размонтируйте своё устройство nbd0:

    
    [email protected]:~# umount /mnt
    [email protected]:~#
     	   

  22. Отсоедините устройство nbd0 от данного образа raw:

    
    [email protected]:~# qemu-nbd --disconnect /dev/nbd0
    /dev/nbd0 disconnected
    [email protected]:~#
     	   


Как это работает…

В предыдущем разделе много чего произошло, поэтому давайте сразу перейдём к командам и обсудим слегка
подробнее то, что в точности произошло и почему.

На 1 шаге мы смонтировали свой корневой раздел, который мы создали ранее в своём устройстве
/dev/nbd0p2 в /mnt, таким
образом, мы можем его применять. Раз монтирование выполнено, на шаге 2 мы устанавливаем весь дистрибутив Debian
в этом устройстве применяя в качестве целевой данную точку монтирования.

Чтобы установить необходимый начальный загрузчик GRUB в данном корневом разделе, мы привязываем и монтируем
свой каталог /dev из имеющейся файловой системы хоста в файловую систему
выстраиваемого образа в /mnt на шаге 4.

Затем на шаге 6 мы применяем инструмент chroot чтобы изменить пространство имён своего каталога с тем, чтобы
оно было /mnt, поэтому мы можем выполнять операции так, как будто мы
напрямую находимся в этой новой ОС.

На шаге 8 мы монтируем виртуальные файловые системы proc и
sysfs внутри данного образа, так как их ожидает начальный загрузчик
GRUB.

На шаге 9 мы продолжаем установку исходного кода своего ядра и инструментов GRUB в подготовке к установке
самого начального загрузчика в его загрузочный раздел и на шаге 10 мы устанавливаем этот начальный
загрузчик.

На шаге 11 были созданы сами файлы настройки GRUB и был обновлён имеющийся образ загрузочного ramdisk.

На шагах 12, 13 и 14 мы изменили установленный пароль root и убедились что мы получаем доступ к певдо- Терминалу,
поэтому мы сможем зарегистрироваться в этой ВМ позже, а также изменили текущий уровень исполнения с определённого
по умолчанию графического интерфейса на многопользовательский.

Так как имеющийся файл fstab сразу после установки ОС Debian в данном образе является пустым, мы добавили точку
монтирования своего корня, иначе наша ВМ не будет иметь возможности запуска. Это было осуществлено на шаге 15.

На шагах 16 и 17 мы выполнили некоторую очистку размонтировав смонтированные нами ранее необходимые файловые
системы и вышли из своей среды chroot.

Вернувшись обратно в файловую систему своего хоста на шаге 18, мы установили GRUB в своём устройстве
nbd0 определив необходимое положение монтирования данного образа.

На шаге 19 мы обновили имя устройства настройки GRUB на sda2,
так как это именно то имя, которое будет возникать внутри данной виртуальной машины после её запуска. Само имя
nbd0p2 присутствует только пока мы вынуждены поддерживать связь между своим
образом raw и соответствующим сетевым блочным устройством ОС нашего хоста. С точки зрения самой ВМ, именно второй
раздел внутри данного созданного нами образа по умолчанию имеет имя sda2.

И, наконец, на шагах 20 и 21 мы выполняем некоторую очистку удаляя имеющуюся точку монтирования и отсоединяя
свой образ raw от сетевого блочного устройства nbd0.

Изменение размера образа

В данном рецепте мы собираемся обследовать как изменять размер имеющегося образа raw, размещаемые в нём
размеры и саму файловую систему поверх этих разделов.Мы собираемся применять свой образ raw, который мы
построили в своих предыдущих рецептах, который содержит разделы подкачки и некоторого корня с отформатированной
в нём файловой системой EXT4.


Приготовление

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

  • qemu-img

  • losetup

  • tune2fs

  • e2fsck

  • kpartx

  • fdisk

  • resize2fs

Большая часть из этих утилит должна уже быть установлена в Ubuntu, за исключением kpartx.
Чтобы установить его, исполните следующее:


[email protected]:~# apt install kpartx
 	   

Как это сделать…

Приводимые далее шаги демонстрируют как добавить дополнительное пространство в наш образ raw, который
мы создали ранее, расширить раздел корня и изменить размер файловой системы. К окончанию данного рецепта
первоначальный размер файла образа raw должен измениться с 10 ГБ
до 20 ГБ.

  1. Получите текущий размер своего образа:

    
    [email protected]:~# qemu-img info debian.img
    image: debian.img
    file format: raw
    virtual size: 10G (10737418240 bytes)
    disk size: 848M
    [email protected]:~#
     	   

  2. Добавьте дополнительно 10 ГБ к этому образу:

    
    [email protected]:~# qemu-img resize -f raw debian.img +10GB
    Image resized.
    [email protected]:~#
     	   

    Замечание

    Имейте в виду, что не все типы образов поддерживают изменение размера. Чтобы изменить размер такого образа
    вам необходимо преобразовать его вначале в образ raw при помощи команды преобразования
    qemu-img.

  3. Проверьте новый текущий размер образа:

    
    [email protected]:~# qemu-img info debian.img
    image: debian.img
    file format: raw
    virtual size: 20G (21474836480 bytes)
    disk size: 848M
    [email protected]:~#
     	   

  4. Выведите название самого первого неиспользуемого петлевого (loop) устройства:

    
    [email protected]:~# losetup -f
    /dev/loop0
    [email protected]:~#
     	   

  5. Соотнесите самое первое неиспользуемое петлевое устройство со своим файлом raw:

    
    [email protected]:~# losetup /dev/loop1 debian.img
    [email protected]:~#
     	   

  6. Прочтите информацию данного раздела из данного связанного петлевого устройства и создайте необходимое
    соответствие устройства:

    
    [email protected]:~# kpartx -av /dev/loop1
    add map loop1p1 (252:0): 0 1024 linear 7:1 2048
    add map loop1p2 (252:1): 0 20967424 linear 7:1 4096
    [email protected]:~#
     	   

  7. Опросите новые соответствия устройства, представляющие все разделы в данном образе raw:

    
    [email protected]:~# ls -la /dev/mapper
    total 0
    drwxr-xr-x 2 root root 100 Mar 9 19:10 . 
    drwxr-xr-x 20 root root 4760 Mar 9 19:10 ..
    crw------- 1 root root 10, 236 Feb 10 23:25 control
    lrwxrwxrwx 1 root root 7 Mar 9 19:10 loop1p1
    lrwxrwxrwx 1 root root 7 Mar 9 19:10 loop1p2
    [email protected]:~#
     	   

  8. Получите какую- нибудь информацию от того корневого раздела, с которым установлено соответствие:

    
    [email protected]:~# tune2fs -l /dev/mapper/loop1p2
    tune2fs 1.42.13 (17-May-2015)
    Filesystem volume name: <none>
    Last mounted on: /
    Filesystem UUID: 96a73752-489a-435c-8aa0-8c5d1aba3e5f
    Filesystem magic number: 0xEF53
    Filesystem revision #: 1 (dynamic)
    Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize Filesystem flags: signed_directory_hash
    Default mount options: user_xattr acl
    Filesystem state: clean
    Errors behavior: Continue
    Filesystem OS type: Linux
    Inode count: 655360
    Block count: 2620928
    Reserved block count: 131046
    Free blocks: 2362078
    Free inodes: 634148
    First block: 0
    Block size: 4096
    Fragment size: 4096
    Reserved GDT blocks: 639
    Blocks per group: 32768
    Fragments per group: 32768
    Inodes per group: 8192
    Inode blocks per group: 512
    Flex block group size: 16
    Filesystem created: Fri Feb 10 23:29:01 2017
    Last mount time: Thu Mar 9 19:09:25 2017
    Last write time: Thu Mar 9 19:08:23 2017
    Mount count: 12
    Maximum mount count: -1
    Last checked: Fri Feb 10 23:29:01 2017
    Check interval: 0 (<none>)
    Lifetime writes: 1621 MB
    Reserved blocks uid: 0 (user root)
    Reserved blocks gid: 0 (group root)
    First inode: 11
    Inode size: 256
    Required extra isize: 28
    Desired extra isize: 28
    Journal inode: 8
    Default directory hash: half_md4
    Directory Hash Seed: f101cccc-944e-4773-8644-91ebf4bd4f2d
    Journal backup: inode blocks
    [email protected]:~#
     	   

  9. Проверьте данную файловую систему в своём корневом разделе отображаемого устройства:

    
    [email protected]:~# e2fsck /dev/mapper/loop1p2
    e2fsck 1. has_journal /dev/mapper/loop1p2
    tune2fs 1.42.13 (17-May-2015)
    [email protected]:~#
     	   

  10. Убедитесь что журнал был удалён:

    
    [email protected]:~# tune2fs -l /dev/mapper/loop1p2 | grep "features"
    Filesystem features: ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
    [email protected]:~#
     	   

  11. Удалите этот отображаемый раздел:

    
    [email protected]:~# kpartx -dv /dev/loop1
    del devmap : loop1p2
    del devmap : loop1p1
    [email protected]:~#
     	   

  12. Отсоедините данное петлевое устройство от своего образа:

    
    [email protected]:~# losetup -d /dev/loop1
    [email protected]:~#
     	   

  13. Сопоставьте данный образ raw со своим сетевым блочным устройством:

    
    [email protected]:~# qemu-nbd --format=raw --connect=/dev/nbd0 debian.img [email protected]
     	   

  14. При помощи fdisk выведите перечень всех доступных разделов,
    затем удалите свой корневой раздел, повторно создайте его и запишите эти изменения:

    
    [email protected]:~# fdisk /dev/nbd0
    
    Command (m for help): p
    
    Disk /dev/nbd0: 21.5 GB, 21474836480 bytes
    255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x00000000
    
     Device Boot Start End Blocks Id System
    /dev/nbd0p1 1 16450559 8225279+ 82 Linux swap / Solaris
    /dev/nbd0p2 16450560 20964824 2257132+ 83 Linux
    
    Command (m for help): d
    Partition number (1-4): 2
    
    Command (m for help): n
    Partition type:
     p primary (1 primary, 0 extended, 3 free)
     e extended
    Select (default p): p
    Partition number (1-4, default 2): 2
    First sector (16450560-41943039, default 16450560):
    Using default value 16450560
    Last sector, +sectors or +size{K,M,G} (16450560-41943039, default 41943039):
    Using default value 41943039
    
    Command (m for help): w
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table. 
    Syncing disks.
    [email protected]:~#
     	   

  15. Соотнесите первое неиспользуемое петлевое устройство со своим файлом образа кфц, как мы это делали на
    шаге 5:

    
    [email protected]:~# losetup /dev/loop1 debian.img
     	   

  16. Прочитайте информацию о данном разделе из сопоставленного петлевого устройства и создайте отображение
    этого устройства:

    
    [email protected]:~# kpartx -av /dev/loop1
    add map loop1p1 (252:2): 0 1024 linear 7:1 2048
    add map loop1p2 (252:3): 0 41938944 linear 7:1 4096
    [email protected]:~#
     	   

  17. После того как разбиение завершено, осуществите проверку файловой системы:

    
    [email protected]:~# e2fsck -f /dev/mapper/loop1p2
    e2fsck 1.42.13 (17-May-2015)
    Pass 1: Checking inodes, blocks, and sizes
    Pass 2: Checking directory structure
    Pass 3: Checking directory connectivity
    Pass 4: Checking reference counts
    Pass 5: Checking group summary information
    /dev/mapper/loop1p2: 21212/655360 files (0.2% non-contiguous), 226115/2620928 blocks
    [email protected]:~#
     	   

  18. Измените размер файловой системы в этом корневом разделе данного отображаемого устройства:

    
    [email protected]:~# resize2fs /dev/nbd0p2
    resize2fs 1.42.13 (17-May-2015)
    Resizing the filesystem on /dev/mapper/loop1p2 to 5242368 (4k) blocks.
    The filesystem on /dev/mapper/loop1p2 is now 5242368 (4k) blocks long.
    [email protected]:~#
     	   

  19. Создайте необходимый журнал файловой системы, так как мы удалили его ранее:

    
    [email protected]:~# tune2fs -j /dev/mapper/loop1p2
    tune2fs 1.42.13 (17-May-2015)
    Creating journal inode: done
    [email protected]:~#
     	   

  20. Удалите отображение данного устройства:

    
    New-VM -Name VM01 -Generation [email protected]:~# kpartx -dv /dev/loop1
    del devmap : loop1p2
    del devmap : loop1p1
    [email protected]:~# losetup -d /dev/loop1
    [email protected]:~#
     	   

Применение предварительно подготовленных образов

В рецепте Установка пользовательской ОС в образ при
помощи debootstrap мы увидели как применять команду debootstrap
для установки Debian в построенный нами образ. Большинство вендоров Linux предоставляют уже построенные
образы своих дистрибутивов для различных архитектур. Устанавливаемые образы также доступны для ручной
установки необходимых гостевых ОС. В данном рецепте мы собираемся продемонстрировать как получить и
опробовать образы CentOS и Debian, которые уже были построены. В следующем рецепте мы собираемся показать
как запускать QEMU/KVM экземпляры с применением тех же самых образов.


Приготовление

Для данного рецепта нам понадобится QEMU, установленный в ОС нашего хоста. Для получения инструкций о том,
как устанавливать QEMU, пожалуйста, воспользуйтесь рецептом Установка и настройка QEMU в этой главе. Нам также потребуется утилита
wget для загрузки всех образов с наших восходящих общедоступных
репозиториев.


Как это сделать…

Чтобы получить образы Debian Wheezy для использования c QEMU и KVM выполните следующее:

  1. Загрузите необходимый образ, воспользовавшись wget:

    
    [email protected]:~tmp# wget https://people. debian.org/~aurel32/qemu/amd64/debian_wheezy_amd64_standard.qcow2
    --2017-03-09 22:07:20-- 2 Resolving people.debian.org (people.debian.org)... 2001:41c8:1000:21::21:30, 5.153.231.30 Connecting to people.debian.org (people.debian.org)|2001:41c8:1000:21::21:30|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 267064832 (255M) Saving to: ‘debian_wheezy_amd64_standard.qcow2’ debian_wheezy_amd64_standard.qcow2 100% . [===================================>] 254.69M 35.8MB/s in 8.3s 2017-03-09 22:07:29 (30.9 MB/s) - ‘debian_wheezy_amd64_standard.qcow2’ saved [267064832/267064832]
    [email protected]:~#
     	   

  2. Проинспектируйте тип этого образа:

    
    [email protected]:~# qemu-img info debian_wheezy_amd64_standard.qcow2
    image: debian_wheezy_amd64_standard.qcow2
    file format: qcow2
    virtual size: 25G (26843545600 bytes)
    disk size: 261M
    cluster_size: 65536
    Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
    [email protected]:~#
     	   

Чтобы получить образы CentOS выполните следующее:

  1. Загрузите необходимый образ, воспользовавшись wget:

    
    [email protected]:/tmp# wget https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2 --2017-03-09 22:11:34-- https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2 Resolving cloud.centos.org (cloud.centos.org)... 2604:4500::2a8a, 136.243.75.209 Connecting to cloud.centos.org (cloud.centos.org)|2604:4500::2a8a|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 1361182720 (1.3G) Saving to: ‘CentOS-7-x86_64-GenericCloud.qcow2’
    CentOS-7-x86_64-GenericCloud.qcow2 100%[=========================================>] 1.27G 22.3MB/s in 54s
    2017-03-09 22:12:29 (24. 0 MB/s) - ‘CentOS-7-x86_64-GenericCloud.qcow2’ saved [1361182720/1361182720]
    FINISHED --2017-03-09 22:12:29-- Total wall clock time: 54s Downloaded: 1 files, 1.3G in 54s (24.0 MB/s)
    [email protected]:/tmp# 	   

  2. Проинспектируйте тип полученного образа:

    
    [email protected]:~# qemu-img info CentOS-7-x86_64-GenericCloud.qcow2
    image: CentOS-7-x86_64-GenericCloud.qcow2
    file format: qcow2
    virtual size: 8.0G (8589934592 bytes)
    disk size: 1.3G
    cluster_size: 65536
    Format specific information:
    compat: 0.10
    refcount bits: 16
    [email protected]:~#
     	   


Как это работает…

Имеется множество общедоступных репозиториев во всемирном Интернете, которые предоставляют образы
различных типов, причём наиболее распространённым является qcow2
для применения с QEMU/ KVM. В предыдущем разделе мы воспользовались официальным репозиторием CentOS для
получения необходимого образа и ещё одним другим, содержащим предварительно построенные образы для
Debian.

Оба образа представлены в формате qcow2, что подтверждено на
шаге 2.


Также ознакомьтесь…

До сих пор мы только видели как строить, испытывать, манипулировать и загружать образы. Ы следующем
рецепте мы собираемся сосредоточиться на том, как на самом деле применять образы для запуска экземпляров
QEMU/ KVM/


Дополнительно

Для получения дополнительной информации о том, какие предварительно построенные образы доступны для
перечисленных дистрибутивов, опросите следующие ссылки:

Выполнение ВМ при помощи qemu-system-*

В данном рецепте мы собираемся продемонстрировать как запускать виртуальные машины при помощи QEMU.
QEMU предоставляет исполняемые файлы, которые могут эмулировать различные архитектуры WGE с применением
либо пользовательских, либо предварительно построенных образов для необходимых гостевых ОС.

Если вы выполнили рецепт рецептом Установка и
настройка QEMU, вы уже должны иметь хост который содержит следующие исполняемые файлы:


[email protected]:~# ls -la /usr/bin/qemu-system-*
-rwxr-xr-x 1 root root 8868848 Jan 25 12:49 /usr/bin/qemu-system-aarch64
-rwxr-xr-x 1 root root 7020544 Jan 25 12:49 /usr/bin/qemu-system-alpha
-rwxr-xr-x 1 root root 8700784 Jan 25 12:49 /usr/bin/qemu-system-arm
-rwxr-xr-x 1 root root 3671488 Jan 25 12:49 /usr/bin/qemu-system-cris
-rwxr-xr-x 1 root root 8363680 Jan 25 12:49 /usr/bin/qemu-system-i386
-rwxr-xr-x 1 root root 3636640 Jan 25 12:49 /usr/bin/qemu-system-lm32
-rwxr-xr-x 1 root root 6982528 Jan 25 12:49 /usr/bin/qemu-system-m68k
-rwxr-xr-x 1 root root 3652224 Jan 25 12:49 /usr/bin/qemu-system-microblaze
-rwxr-xr-x 1 root root 3652224 Jan 25 12:49 /usr/bin/qemu-system-microblazeel
-rwxr-xr-x 1 root root 8132992 Jan 25 12:49 /usr/bin/qemu-system-mips
-rwxr-xr-x 1 root root 8356672 Jan 25 12:49 /usr/bin/qemu-system-mips64
-rwxr-xr-x 1 root root 8374336 Jan 25 12:49 /usr/bin/qemu-system-mips64el
-rwxr-xr-x 1 root root 8128896 Jan 25 12:49 /usr/bin/qemu-system-mipsel
-rwxr-xr-x 1 root root 3578592 Jan 25 12:49 /usr/bin/qemu-system-moxie
-rwxr-xr-x 1 root root 3570848 Jan 25 12:49 /usr/bin/qemu-system-or32
-rwxr-xr-x 1 root root 8701760 Jan 25 12:49 /usr/bin/qemu-system-ppc
-rwxr-xr-x 1 root root 9048000 Jan 25 12:49 /usr/bin/qemu-system-ppc64
lrwxrwxrwx 1 root root 17 Jan 25 12:49 /usr/bin/qemu-system-ppc64le -> qemu-system-ppc64
-rwxr-xr-x 1 root root 8463680 Jan 25 12:49 /usr/bin/qemu-system-ppcemb
-rwxr-xr-x 1 root root 6894528 Jan 25 12:49 /usr/bin/qemu-system-sh5
-rwxr-xr-x 1 root root 6898624 Jan 25 12:49 /usr/bin/qemu-system-sh5eb
-rwxr-xr-x 1 root root 4032000 Jan 25 12:49 /usr/bin/qemu-system-sparc
-rwxr-xr-x 1 root root 7201696 Jan 25 12:49 /usr/bin/qemu-system-sparc64
-rwxr-xr-x 1 root root 3704704 Jan 25 12:49 /usr/bin/qemu-system-tricore
-rwxr-xr-x 1 root root 3554912 Jan 25 12:49 /usr/bin/qemu-system-unicore32
-rwxr-xr-x 1 root root 8418656 Jan 25 12:49 /usr/bin/qemu-system-x86_64
-rwxr-xr-x 1 root root 3653024 Jan 25 12:49 /usr/bin/qemu-system-xtensa
-rwxr-xr-x 1 root root 3642752 Jan 25 12:49 /usr/bin/qemu-system-xtensaeb
[email protected]:~#
 	   

Каждая команда способна запустить экземпляр с эмуляцией QEMU для определённой архитектуры ЦПУ. Для данного
рецепта мы собираемся воспользоваться утилитой qemu-system-x86_64 .


Приготовление

Для завершения данного рецепта вам необходимо следующее:

Давайте взглянем на то какие архитектуры ЦПУ поддерживает QEMU в данной системе хоста:


[email protected]:~# qemu-system-x86_64 --cpu help
x86 qemu64 QEMU Virtual CPU version 2.5+
x86 phenom AMD Phenom(tm) 9550 Quad-Core Processor
x86 core2duo Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz
x86 kvm64 Common KVM processor
x86 qemu32 QEMU Virtual CPU version 2.5+
x86 kvm32 Common 32-bit KVM processor
x86 coreduo Genuine Intel(R) CPU T2600 @ 2.16GHz
x86 486
x86 pentium
x86 pentium2
x86 pentium3
x86 athlon QEMU Virtual CPU version 2.5+
x86 n270 Intel(R) Atom(TM) CPU N270 @ 1.60GHz
x86 Conroe Intel Celeron_4x0 (Conroe/Merom Class Core 2)
x86 Penryn Intel Core 2 Duo P9xxx (Penryn Class Core 2)
x86 Nehalem Intel Core i7 9xx (Nehalem Class Core i7)
x86 Westmere Westmere E56xx/L56xx/X56xx (Nehalem-C)
x86 SandyBridge Intel Xeon E312xx (Sandy Bridge)
x86 IvyBridge Intel Xeon E3-12xx v2 (Ivy Bridge)
x86 Haswell-noTSX Intel Core Processor (Haswell, no TSX)
x86 Haswell Intel Core Processor (Haswell)
x86 Broadwell-noTSX Intel Core Processor (Broadwell, no TSX)
x86 Broadwell Intel Core Processor (Broadwell)
x86 Opteron_G1 AMD Opteron 240 (Gen 1 Class Opteron)
x86 Opteron_G2 AMD Opteron 22xx (Gen 2 Class Opteron)
x86 Opteron_G3 AMD Opteron 23xx (Gen 3 Class Opteron)
x86 Opteron_G4 AMD Opteron 62xx class CPU
x86 Opteron_G5 AMD Opteron 63xx class CPU
x86 host KVM processor with all supported host features (only available in KVM mode)

Recognized CPUID flags:
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 pn clflush ds acpi mmx fxsr sse sse2 ss ht tm ia64 pbe
pni|sse3 pclmulqdq|pclmuldq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cid fma cx16 xtpr pdcm pcid dca sse4. 1|sse4_1 sse4.2|sse4_2 x2apic movbe popcnt tsc-deadline aes xsave osxsave avx f16c rdrand hypervisor
fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f rdseed adx smap pcommit clflushopt clwb avx512pf avx512er avx512cd
syscall nx|xd mmxext fxsr_opt|ffxsr pdpe1gb rdtscp lm|i64 3dnowext 3dnow
lahf_lm cmp_legacy svm extapic cr8legacy abm sse4a misalignsse 3dnowprefetch osvw ibs xop skinit wdt lwp fma4 tce nodeid_msr tbm topoext perfctr_core perfctr_nb
invtsc
xstore xstore-en xcrypt xcrypt-en ace2 ace2-en phe phe-en pmm pmm-en
kvmclock kvm_nopiodelay kvm_mmu kvmclock kvm_asyncpf kvm_steal_time kvm_pv_eoi kvm_pv_unhalt kvmclock-stable-bit
npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pause_filter pfthreshold
xsaveopt xsavec xgetbv1 xsaves
arat
[email protected]:~#
 	   

Из предыдущего вывода мы можем увидеть полный список тех ЦПУ, которые могут передаваться в параметрах
через флаг -cpu для эмуляции этого типа ЦПУ внутри нашей виртуальной
машины.


Как это сделать…

Чтобы запустить некую новую виртуальную машину при помощи утилиты qemu-system
исполните такие шаги:

  1. Запустите некую новую виртуальную машину QEMU с использованием архитектуры ЦПУ
    x86_64:

    
    [email protected]:~# qemu-system-x86_64 -name debian -vnc 146.20.141.254:0 -cpu Nehalem -m 1024 -drive format=raw,index=2,file=debian.img -daemonize
    [email protected]:~#
     	   

  2. Убедитесь что данный экземпляр исполняется:

    
    [email protected]:~# pgrep -lfa qemu
    3527 qemu-system-x86_64 -name debian -vnc 146.20.141.254:0 -m 1024 -drive format=raw,index=2,file=debian.img -daemonize
    [email protected]:~#
     	   

  3. Завершите экземпляр Debian QEMU:

    
    [email protected]:~# pkill qemu
    [email protected]:~#
     	   

  4. Запустите новый экземпляр с применением предварительно построенного образа CentOS:

    
    [email protected]:~# qemu-system-x86_64 -vnc 146. 20.141.254:0 -m 1024 -hda CentOS-7-x86_64-GenericCloud.qcow2 -daemonize
    [email protected]:~#
     	   

  5. Убедитесь что этот экземпляр исполняется:

    
    [email protected]:~# pgrep -lfa qemu
    3546 qemu-system-x86_64 -vnc 146.20.141.254:0 -m 1024 -hda CentOS-7-x86_64-GenericCloud.qcow2 -daemonize
    [email protected]:~#
     	   

  6. Завершите экземпляр CentOS QEMU:

    
    [email protected]:~# pkill qemu
    [email protected]:~#
     	   

    Замечание

    Не забудьте заменить соответствующие IP адреса в параметре -vnc
    теми, которые имеются у вашей машины хоста.



    Как это работает…

    Как запустить некую виртуальную машину при помощи QEMU/ KVM зависит в основном от имеющегося типа образа
    и того, как этот раздел структурирован внутри данного образа.

    Мы воспользовались двумя разными типами образа с различными схемами разделов чтобы продемонстрировать
    это понятие.

    На шаге 1 мы применили команду qemu-system-x86_64 для эмуляции
    некоторой архитектуры ЦПУ x86_64, в частности, мы передали флаг
    -cpu Nehalem, эмулирующий модель определённую модель ЦПУ Nehalem.
    Флагом -vnc мы передали в качестве параметра конкретный адрес IP
    своего сервера. Это запустит какой- то сервер VNC в данной ВМ с тем, чтобы мы могли позже воспользоваться
    неким клиентом VNC для соединения с данным экземпляром QEMU. Мы определили значение объёма памяти, которая
    должна быть выделена данному экземпляру, в данном случае, 1 ГБ, при помощи флага -m.
    Мы проинструктировали QEMU, что мы собираемся использовать некий образ raw посредством опции
    format=raw, а также название и расположение реального образа через
    параметр file=debian.img.

    Напомним, что этот образ содержит два раздела, причём второй раздел содержит корневую файловую систему,
    в которой содержится начальный загрузчик. Очень важно не забывать это, так как нам необходимо определить
    какой индекс раздела следует загужать нашей гостевой ОС. Мы делаем это с помощью флага
    index=2. Наконец, мы передаём параметр
    -daemonize для установки процесса QEMU в фоновый режим.

    На шаге 4 мы запускаем другой экземпляр QEMU, в этот раз применив образ CentOS
    qcow2, который мы загрузили ранее. Мы не должны определять из какого
    раздела нам нужно загружаться в нём на этот раз, так как большинство предварительно построенных образов
    используют первый раздел, или имеют всего один раздел. Мы также применяем флаг
    -hda вместо параметра -drive,
    просто чтобы продемонстрировать что оба варианта можно применять с одним и тем же результатом. Этот флаг
    -hda сообщает QEMU самый первый диск для данного экземпляра, который
    следует загрузить с того имени файла, которое следует за ним.

Запуск QEMU при помощи KVM

В данном рецепте мы собираемся запустить некуб виртуальную машину QEMU с ускорением KVM.
KVM
(Kernel-based Virtual Machine) является полной
технологией виртуализации для архитектур ЦПУ, которые поддерживают расширения виртуализации. Для процессоров
на основе Intel это именно Intel VT, а для ЦПУ AMD это аппаратное расширение AMD-V. Главными частями KVM
являются два загружаемых модуля ядра с именами, первый kvm. ko, который
предоставляет всю основную функциональность виртуализации, а также второй модуль ядра, который определяется
процессором, а именно kvm-intel.ko и
kvm-amd.ko для двух основных производителей ЦПУ.

QEMU яляется определённым компонентом пользовательского пространства для создания виртуальных машин, тогда
как KVM располагается в пространстве ядра. Если вы выполняли компиляцию в рецепте
Выполнение ВМ при помощи qemu-system-*, вы должны были
заметить, что основная разница между исполнением виртуальной машины KVM и исполнением экземпляра QEMU
бкз ускорения состоит всего в одной опции командной строки.


Приготовление

Чтобы запустить некий экземпляр KVM, вам потребуется следующее:

Чтобы проверить поддерживает ли ваш ЦПУ виртуализацию, исполните такой код:


[email protected]:~# cat /proc/cpuinfo | egrep "vmx|svm" | uniq
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm epb tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm xsaveopt cqm_llc cqm_occup_llc dtherm arat pln pts
[email protected]:~#
 	   

Наличие соответствующего флага vmx (для Intel) или
svm (для AMD) является индикатором того, что ваш ЦПУ поддерживает
все необходимые расширения виртуализации.

Замечание

Данный флаг из вывода команды cpuinfo просто означает, что ваш
процессор поддерживает виртуализацию, однако убедитесь что данное свойство включено в BIOS
{Прим. пер.: FirmWare} вашей системы, в противном случае данный
экземпляр KVM откажет в запуске.

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


[email protected]:~# modprobe kvm
[email protected]:~# lsmod | grep kvm
kvm 455843 0
[email protected]:~#
 	   

Как это сделать…

Для запуска некоторого экземпляра KVM, проверки того что он запущен и в конце концов его останова
исполните следующее:

  1. Запустите некий экземпляр QEMU с поддержкой KVM:

    
    [email protected]:~# qemu-system-x86_64 -name debian -vnc 146.20.141.254:0 -m 1024 -drive format=raw,index=2,file=debian.img -enable-kvm -daemonize
    [email protected]:~#
     	   

  2. Убедитесь что это экземпляр работает:

    
    [email protected]:~# pgrep -lfa qemu
    4895 qemu-system-x86_64 -name debian -vnc 146.20.141.254:0 -m 1024 -drive format=raw,index=2,file=debian.img -enable-kvm -daemonize
    [email protected]:~#
     	   

    Остановите это экземпляр:

    
    [email protected]:~# pkill qemu
    [email protected]:~#
     	   


Как это работает…

Чтобы запустить виртуальную машину QEMU/KVM, всё что нам требуется сделать в отличии от того, что мы
выполняли в нашем рецепте Установка и настройка QEMU,
это передача флага -enable-kvm в команде
qemu-system-x86_64.

На шаге 1 мы определили некоторое имя для своей ВМ с помощью флага
-name, предоставили IP адрес физического хоста в флаг
-vnc , включили доступ VNC для данного виртуального экземпляра,
выделили 1 ГБ памяти в флаге -m, определили тот раздел, где размещён
начальный загрузчик с помощью параметра index=2, задали формат
образа и, наконец, мы разрешили аппаратное ускорение KVM воспользовавшись параметром
-enable-kvm и демонизировали этот процесс {Прим.
пер.: перевели в фоновый режим
} флагом -daemonize.

На шаге 2 мы убедились, что этот экземпляр исполняется, а на 3 шаге прекратили его.


Также ознакомьтесь…

В качестве альтернативы исполнению напрямую команд qemu-system-*,
в системе Ubuntu имеется пакет qemu-kvm, который предоставляет
все исполняемые файлы /usr/bin/kvm.
Эти файлы обёрнуты в команду qemu-system-x86_64,
а она передаёт им параметр -enable-kvm автоматически.

Чтобы установить этот пакет и вместо всего воспользоваться командой
kvm , исполните следующее:


[email protected]:~# apt install qemu-kvm
...
[email protected]:~# kvm -name debian -vnc 146.20.141.254:0 -cpu Nehalem -m 1024 -drive format=raw,index=2,file=debian.img -daemonize
[email protected]:~# pgrep -lfa qemu
25343 qemu-system-x86_64 -enable-kvm -name debian -vnc 146.20.141.254:0 -cpu Nehalem -m 1024 -drive format=raw,index=2,file=debian.img -daemonize
[email protected]:~#
 	   

Вы должны были отметить, что запуск и останов экземпляров QEMU/KVM является неким выполняемым вручную
процессом, в особенности необходимость уничтожения запущенного экземпляра процесса для его останова. В
Главе 2, Применение libvirt для управления KVM мы
пройдёмся по набору рецептов, которые сделают управление общим жизненным циклом виртуальных машин KVM
намного более простым за счёт инчтрументов пользовательского пространства , которые предлагает пакет
libvirt.

Подключение к исполняемому экземпляру при помощи VNC

В данном рецепте мы собираемся подключиться к некоторому исполняемому экземпляру KVM с использованием
клиента VNC. После соединения мы намереваемся зарегистрироваться и проверить тип ЦПУ и доступную память
для этого экземпляра. Мы уже видели как запускать экземпляры QEMU/KVM с поддержкой VNC в предыдущих рецептах,
но мы собираемся сделать это снова, на случай если вы читаете книгу от корки до корки.

VNC
(Virtual Network Computing) применяет
пртокол RFB
(Remote Frame Buffer) для удалённого
управления другой системой. Он передаёт все экраны с такого удалённого компьютера обратно своему клиенту,
делая доступным полное управление клавиатурой и мышью.

Имеется множество различных клиентов VNC и реализаций сервера, однако для данного рецепта мы собираемся
применять свободно распространяемую версию, именуемую цыплёнком VNC для macOS. Вы можете загрузить этого
клиента с https://sourceforge.net/projects/cotvnc/.


Приготовление

Чтобы исполнить данный рецепт, вам понадобится следующее:


Как это сделать…
  1. Запустите экземпляр qemu с KVM ускорением:

    
    [email protected]:~# qemu-system-x86_64 -name debian -vnc 146.20.141.254:0 -cpu Nehalem -m 1024 -drive format=raw,index=2,file=debian.img -daemonize
    [email protected]:~#
     	   

  2. Убедитесь что этот экземпляр исполняется:

    
    [email protected]:~# pgrep -lfa qemu
    4987 qemu-system-x86_64 -name debian -vnc 146.20.141.254:0 -cpu Nehalem -m 1024 -drive format=raw,index=2,file=debian.img -daemonize
    [email protected]:~#
     	   

  3. Запустите какого- то клиента VNC и подключите его к серверу VNC по настроенным на шаге 1 IP адресу и
    порту отображения:


  4. Зарегистрируйтесь на нужном вам экземпляре под пользователем root, затем проверьте тип ЦПУ и доступную
    память, как это показано здесь:


Глава 3. Построение сетей KVM при помощи libvirt

В этой главе мы намерены рассмотреть такие вопросы:

  • Мост Linux

  • Open vSwitch

  • Настройка сетевой среды пересылки NAT

  • Настройка сетевой среды с мостом

  • Настройка сквозной сетевой среды PCIe

  • Манипулирование интерфесами сетевой среды

В libvirt мы можем определять различные типы сетевых сред для наших гостевых KVM при помощи уже известного нам
синтаксиса определений XML и инструментов пространства пользователя virsh
и virt-install. В этой главе мы намерены развернуть три типа сетевых сред,
изучить соответствующий сетевой формат XML и рассмотреть примеры того как определять виртуальные интерфейсы для
своих экземпляров KVM и как ими манипулировать.

Чтобы иметь возможность подключать виртуальные машины к ОС своего хоста или друг к другу, мы собираемся
воспользоваться имеющимся мостом Linux и демонами Open vSwitch
(OVS), инструментами пространства пользователя и
модулями ядра. Обе технологии построения программного моста великолепны при создании
Software-defined Networking
(SDN, программно определяемой сетевой среды) различной
сложности неким согласованным и простым в обращении образом. И мост Linux, и OVS, оба действуют как мост/ коммутатор,
к которым могут подключаться имеющиеся у наших гостевых KVM виртуальные интерфейсы.

Имея это в виду, давайте начнём узнавать подробности программных мостов в Linux.

Мост Linux является неким программно определяемым устройством 2 уровня, который предоставляет необходимую функциональность
какого- то физического устройства моста. Он способен переправлять кадры между гостевыми KVM, ОС своего хоста и виртуальными
машинами, запущенными на прочих серверах или в иных сетевых средах. Мост Linux состоит из двух компонентов —
инструмента администрирования пространства пользователя, который мы намерены применять в данном рецепте и какого- то
модуля ядра, который и выполняет всю работу по соединению воедино множества сегментов Ethernet. Каждый создаваемый нами
программный мост может иметь некое число подключённых к нему портов, где и происходит переадресация сетевого обмена в обоих
направлениях. При создании экземпляров KVM мы можем подключать их виртуальные интерфейсы, которые ассоциированы с таким
мостом, что аналогично вставке какого- то сетевого кабеля от некой NIC сервера в устройство моста/ коммутатора. Выступая в
роли устройства 2 уровня, имеющийся мост Linux работает с MAC адресами и выполняет сопровождение некоторой структуры
ядра по отслеживанию портов и ассоциированных MAC адресов в виде некоей таблицы
Content Addressable Memory
(CAM, ассоциативной памяти).

В данном рецепте мы намерены создать некий новый мост Linux и воспользоваться утилитой
brctl для манипуляций с ним.


Приготовление

В данном рецепте нам потребуется следующее:

  • Современное ядро Linux с включёнными возможностями 802.1d Ethernet.

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

    
    [email protected]:~# cat /boot/config-`uname -r` | grep -i bridg
    # PC-card bridges
    CONFIG_BRIDGE_NETFILTER=y
    CONFIG_NF_TABLES_BRIDGE=m
    CONFIG_BRIDGE_NF_EBTABLES=m
    CONFIG_BRIDGE_EBT_BROUTE=m
    CONFIG_BRIDGE_EBT_T_FILTER=m
    CONFIG_BRIDGE_EBT_T_NAT=m
    CONFIG_BRIDGE_EBT_802_3=m
    CONFIG_BRIDGE_EBT_AMONG=m
    CONFIG_BRIDGE_EBT_ARP=m
    CONFIG_BRIDGE_EBT_IP=m
    CONFIG_BRIDGE_EBT_IP6=m
    CONFIG_BRIDGE_EBT_LIMIT=m
    CONFIG_BRIDGE_EBT_MARK=m
    CONFIG_BRIDGE_EBT_PKTTYPE=m
    CONFIG_BRIDGE_EBT_STP=m
    CONFIG_BRIDGE_EBT_VLAN=m
    CONFIG_BRIDGE_EBT_ARPREPLY=m
    CONFIG_BRIDGE_EBT_DNAT=m
    CONFIG_BRIDGE_EBT_MARK_T=m
    CONFIG_BRIDGE_EBT_REDIRECT=m
    CONFIG_BRIDGE_EBT_SNAT=m
    CONFIG_BRIDGE_EBT_LOG=m
    # CONFIG_BRIDGE_EBT_ULOG is not set
    CONFIG_BRIDGE_EBT_NFLOG=m
    CONFIG_BRIDGE=m
    CONFIG_BRIDGE_IGMP_SNOOPING=y
    CONFIG_BRIDGE_VLAN_FILTERING=y
    CONFIG_SSB_B43_PCI_BRIDGE=y
    CONFIG_DVB_DDBRIDGE=m
    CONFIG_EDAC_SBRIDGE=m
    # VME Bridge Drivers
    [email protected]:~#
    		

  • Собственно модуль ядра bridge.

    Для проверки того что этот модуль загружен и для получения дополнительной информации о его версии и свойствах
    исполните такие команды:

    
    [email protected]:~# lsmod | grep bridge
    bridge 110925 0
    stp 12976 2 garp,bridge
    llc 14552 3 stp,garp,bridge
    [email protected]:~#
    [email protected]:~# modinfo bridge
    filename: /lib/modules/3.13.0-107-generic/kernel/net/bridge/bridge. ko
    alias: rtnl-link-bridge
    version: 2.3
    license: GPL
    srcversion: 49D4B615F0B11CA696D8623
    depends: stp,llc
    intree: Y
    vermagic: 3.13.0-107-generic SMP mod_unload modversions
    signer: Magrathea: Glacier signing key
    sig_key: E1:07:B2:8D:F0:77:39:2F:D6:2D:FD:D7:92:BF:3B:1D:BD:57:0C:D8
    sig_hashalgo: sha512
    [email protected]:~#
    		

  • Пакет bridge-utils, который предоставляет необходимые инструменты для
    создания моста Linux и манипуляции им.

  • Возможность создания новых гостей KVM при помощи libvirt или соответствующих утилит QEMU или некого имеющегося
    экземпляра KVM из наших предыдущих глав.


Как это сделать…

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

  1. Установите необходимый пакет моста Linux, если его ещё нет:

    
    [email protected]:~# apt install bridge-utils
     	   

  2. Постройте новый экземпляр KVM при помощи сырого образа из нашего рецепта Главы 1
    Установка пользовательской ОС в образ при помощи debootstrap
    если вы не читаете эту книгу от корки до корки:

    
    [email protected]:~# virt-install --name kvm1 --ram 1024 --disk path=/tmp/debian.img,format=raw --graphics vnc,listen=146.20.141.158 --noautoconsole --hvm --import
    
    Starting install...
    Creating domain... | 0 B 00:00
    Domain creation completed. You can restart your domain by running:
     virsh --connect qemu:///system start kvm1
    [email protected]:~#
     	   

  3. Перечислите все доступные устройства мостов:

    
    [email protected]:~# brctl show
    bridge name      bridge id             STP enabled     interfaces
    virbr0           8000. fe5400559bd6     yes             vnet0
    [email protected]:~#
     	   

  4. Выключите свой виртуальный мост, удалите его и убедитесь в его удалении:

    
    [email protected]:~# ifconfig virbr0 down
    [email protected]:~# brctl delbr virbr0
    [email protected]:~# brctl show
    bridge name bridge id STP enabled interfaces
    [email protected]:~#
     	   

  5. Создайте некий новый мост и поднимите его:

    
    [email protected]:~# brctl addbr virbr0
    [email protected]:~# brctl show
    bridge name     bridge id            STP enabled interfaces
    virbr0          8000.000000000000    no
    [email protected]:~# ifconfig virbr0 up
    [email protected]:~#
     	   

  6. Назначьте мосту некий IP адрес:

    
    [email protected]:~# ip addr add 192.168.122.1 dev virbr0
    [email protected]:~# ip addr show virbr0
    39: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
     link/ether 32:7d:3f:80:d7:c6 brd ff:ff:ff:ff:ff:ff
     inet 192.168.122.1/32 scope global virbr0
     valid_lft forever preferred_lft forever
     inet6 fe80::307d:3fff:fe80:d7c6/64 scope link
     valid_lft forever preferred_lft forever
    [email protected]:~#
     	   

  7. Перечислите все сетевые интерфейсы ОС своего хоста:

    
    [email protected]:~# ip a s | grep vnet
    38: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 500
    [email protected]:~#
     	   

  8. Добавьте имеющийся виртуальный интерфейс vnet0 в свой мост:

    
    [email protected]:~# brctl addif virbr0 vnet0
    [email protected]:~# brctl show virbr0
    bridge name     bridge id             STP enabled     interfaces
    virbr0          8000.fe5400559bd6     no              vnet0
    [email protected]:~#
     	   

  9. Включите в своём мосте Spanning Tree Protocol
    (STP, протокол связующего дерева):

    
    [email protected]:~# brctl stp virbr0 on
    [email protected]:~# brctl showstp virbr0
    virbr0
     bridge id 8000. fe5400559bd6
     designated root 8000.fe5400559bd6
     root port 0 path cost 0
     max age 20.00 bridge max age 20.00
     hello time 2.00 bridge hello time 2.00
     forward delay 15.00 bridge forward delay 15.00
     ageing time 300.00
     hello timer 0.26 tcn timer 0.00
     topology change timer 0.00 gc timer 90.89
     flags
    
    
    vnet0 (1)
     port id 8001 state forwarding
     designated root 8000.fe5400559bd6 path cost 100
     designated bridge 8000.fe5400559bd6 message age timer 0.00
     designated port 8001 forward delay timer 0.00
     designated cost 0 hold timer 0.00
     flags
    
    [email protected]:~#
     	   

  10. Из экземпляра KVM поднимите интерфейс, запросите IP- адрес и проверьте подключение к ОС его хоста:

    
    [email protected]:~# ifconfig eth0 up
    [email protected]:~# dhclient eth0
    [email protected]:~# ip a s eth0
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
     link/ether 52:54:00:55:9b:d6 brd ff:ff:ff:ff:ff:ff
     inet 192.168.122.92/24 brd 192.168.122.255 scope global eth0
     valid_lft forever preferred_lft forever
     inet6 fe80::5054:ff:fe55:9bd6/64 scope link
     valid_lft forever preferred_lft forever
    [email protected]:~#
    [email protected]:~# ping 192.168.122.1 -c 3
    PING 192.168.122.1 (192.168.122.1) 56(84) bytes of data.
    64 bytes from 192.168.122.1: icmp_seq=1 ttl=64 time=0.276 ms
    64 bytes from 192.168.122.1: icmp_seq=2 ttl=64 time=0.226 ms
    64 bytes from 192.168.122.1: icmp_seq=3 ttl=64 time=0.259 ms
    
    --- 192.168.122.1 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 1999ms
    rtt min/avg/max/mdev = 0.226/0.253/0.276/0.027 ms
    [email protected]:~#
     	   


Как это работает…

После того как мы впервые установили свой демон libvirt несколько моментов
произошло в автоматическом режиме:

  • Был создан некий новый мост Linux с теми названием и IP адресом, которые определены в файле настройки
    /etc/libvirt/qemu/networks/default. xml

  • Была запущена служба dnsmasq с какой- то конфигурацией, определённой в
    файле /var/lib/libvirt/dnsmasq/default.conf

Давайте изучим установленные по умолчанию настройки моста libvirt:


[email protected]:~# cat /etc/libvirt/qemu/networks/default.xml
<network>
 <name>default</name>
 <bridge name="virbr0"/>
 <forward/>
 <ip address="192.168.122.1" netmask="255.255.255.0">
   <dhcp>
     <range start="192.168.122.2" end="192.168.122.254"/>
   </dhcp>
 </ip>
</network>
[email protected]:~#
		

Именно эту сетевую среду по умолчанию создал для нас libvirt, определив соответствующие название моста, адрес IP и
тот диапазон IP, который используется запущенным сервером DHCP. Позднее в этой главе мы намерены обсудить более подробно
сетевую среду libvirt; тем не менее мы показали её здесь чтобы помочь вам понять откуда появились все наши адреса IP
и само название моста.

Мы можем обнаружить, что в ОС нашего хоста исполняется некий сервер DHCP и просмотреть его файл настройки с помощью
такой команды:


[email protected]:~# pgrep -lfa dnsmasq
38983 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf
[email protected]:~# cat /var/lib/libvirt/dnsmasq/default.conf
##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
## virsh net-edit default
## or other application using the libvirt API.
##
## dnsmasq conf file created by libvirt
strict-order
user=libvirt-dnsmasq
pid-file=/var/run/libvirt/network/default.pid
except-interface=lo
bind-dynamic
interface=virbr0
dhcp-range=192. 168.122.2,192.168.122.254
dhcp-no-override
dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases
dhcp-lease-max=253
dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile
addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
[email protected]:~#
		

В приведённом выше файле настроек отметим как устанавливается соответствие диапазона IP адресов для имеющейся службы
DHCP и самого названия нашего виртуального моста, которые настроены в файле сетевой среды libvirt установок по умолчанию,
который мы рассматривали выше.

Имея всё это в виду, давайте пройдём по всем выполненным нами ранее шагам.

На шаге 1 мы установили инструментарий пространства пользователя brctl, который
мы будем применять для создания, настройки и инспектирования конфигурации своего моста Linux в своём ядре Linux.

На шаге 2 мы предоставили некий новый экземпляр KVM при помощи некого индивидуального сырого образа, содержащего
необходимую гостевую ОС. Это шаг не требуется если вы выполняли все рецепты в наших предыдущих главах.

На шаге 3 мы вызвали свою утилиту bridge для перечисления всех доступных
устройств моста. Из полученного вывода мы можем обнаружить что в настоящий момент у нас имеется один мост с названием
virbr0, который был автоматически создан libvirt. Отметим, что в колонке
интерфейса мы можем видеть интерфейс vnet0. Именно эта виртуальная NIC выставляется
в ОС нащего хоста при запуске нами соответствующего экземпляра KVM. Это означает, что наша виртуальная машина подключена
к мосту своего хоста.

На шаге 4 мы вначале отключаем имеющийся мост для его удаления, а затем снова применяем команду
brctl для унчтожения этого моста и проверки того что он более не присутствует
в ОС нашего хоста.

На шаге 5 мы повторно создаём необходимый мост и опять поднимаем его. Мы делаем это чтобы показать шаги, необходимые
при создании какого- то нового моста.

На шаге 6 мы повторно назначаем тот же самый IP адрес своему мосту и просматриваем его.

На шагах 7 и 8 мы перечисляем все виртуальные интерфейсы в ОС своего хоста. Поскольку у нас имеется в настоящий момент
только одна гостевая KVM, которая исполняется в нашем сервере, мы видим всего один виртуальный интерфейс, то есть
vnet0. Затем мы переходим к добавлению/ подключению своего виртуального NIC
к созданному мосту.

На шаге 9 мы включаем STP в своём мосте. STP является неким протоколом 2 уровня, который помогает нам предотвращать
зацикливания в сетевой среде в случае когда у нас имеются избыточные сетевые пути. Это в особенности полезно при сетевых
топологиях более крупного масштаба и более сложных, когда множество мостов соединяются друг с другом.

Наконец, на шаге 10 мы подключаемся к своей гостевой KVM при помощи консоли, перечисляем настройки её сетевых интерфейсов
и убеждаемся что мы способны выполнить пинг к имеющемуся в ОС её хоста мосту. Для этого нам требуется поднять этот сетевой
интерфейс внутри своего гостя с помощью ifconfig eth0 up, затем получить некий
IP адрес при помощи команды dhclient eth0 от того сервера
dnsmasq, который запущен на нашем хосте.


Также ознакомьтесь…

Существует ещё ряд полезных команд, которые могут применяться для имеющегося моста Linux.

Мы уже знаем что некий мост выполняет переадресацию кадров на основе тех MAC адресов, которые содержатся внутри
него. Для изучения имеющейся таблицы MAC адресов, известных нашему мосту, исполните такую команду:


[email protected]:~# brctl showmacs virbr0
port no  mac addr               is local?      ageing timer
  1      52:54:00:55:9b:d6      no             268. ]

[email protected]:~# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
 link/ether 52:54:00:55:9b:d6 brd ff:ff:ff:ff:ff:ff
 inet6 fe80::5054:ff:fe55:9bd6/64 scope link
 valid_lft forever preferred_lft forever
[email protected]:~#
		

Второй MAC адрес является адресом самого нашего моста и его MAC адрес имеющегося виртуального интерфейса, относящегося к
имеющейся виртуальной машине, который выставляется ОС его хоста. Чтобы убедиться в этом исполните такую команду:


[email protected]:~# ifconfig | grep "fe:54:00:55:9b:d6"
virbr0 Link encap:Ethernet HWaddr fe:54:00:55:9b:d6
vnet0  Link encap:Ethernet HWaddr fe:54:00:55:9b:d6
[email protected]:~#
		

Когда наш мост видит некий кадр в одном из своих портов, он записывает значение времени, затем после того как на
протяжении установленного промежутка времени он не наблюдает тот же самый MAC адрес снова, он удалит эту запись из
своей таблицы CAM. Мы можем устанавливать в секундах этот временной предел до того как истечёт срок действия записи MAC
адреса выполняя такую команду:


[email protected]:~# brctl setageing virbr0 600
[email protected]:~#
		

Команда brctl хорошо документирована; чтобы перечислить все доступные субкоманды,
запустите её без параметров:


[email protected]:~# brctl
Usage: brctl [commands]
commands:
        addbr <bridge> add bridge
        delbr <bridge> delete bridge
        addif <bridge> <device> add interface to bridge
        delif <bridge> <device> delete interface from bridge
        hairpin <bridge> <port> {on|off} turn hairpin on/off
        setageing <bridge> <time> set ageing time
        setbridgeprio <bridge> <prio> set bridge priority
        setfd <bridge> <time> set bridge forward delay
        sethello <bridge> <time> set hello time
        setmaxage <bridge> <time> set max message age
        setpathcost <bridge> <port> <cost> set path cost
        setportprio <bridge> <port> <prio> set port priority
        show [ <bridge> ] show a list of bridges
        showmacs <bridge> show a list of mac addrs
        showstp <bridge> show bridge stp info
        stp <bridge> {on|off} turn stp on/off
[email protected]:~#
		

Большинство дистрибутивов Linux пакуют в свой состав обсуждаемую утилиту brctl
и именно её мы и применяем в данном рецепте. Однако, чтобы воспользоваться самой последней версией или если
пакет не доступен в вашем дистрибутиве, мы можем построить эту утилиту из исходного кда клонировав её проект с
git, а затем выполнив настройку и скомпилировав её:


[email protected]:~# cd /usr/src/
[email protected]:/usr/src# apt-get update && apt-get install build-essential automake pkg-config git
[email protected]:/usr/src# git clone git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/bridge-utils.git
Cloning into 'bridge-utils'...
remote: Counting objects: 654, done.
remote: Total 654 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (654/654), 131.72 KiB | 198.00 KiB/s, done.
Resolving deltas: 100% (425/425), done.
Checking connectivity... done.
[email protected]:/usr/src# cd bridge-utils/
[email protected]:/usr/src/bridge-utils# autoconf
[email protected]:/usr/src/bridge-utils# ./configure && make && make install
[email protected]:/usr/src/bridge-utils# brctl --version
bridge-utils, 1.5
[email protected]:/usr/src/bridge-utils#
		

В своём предыдущем выводе мы можем наблюдать что вначале мы клонировали имеющийся для проекта
bridge-utils репозиторий git,
а потом скомпилировали полученный исходный код.

В хосте RedHat/CentOS этот процесс аналогичный:


[[email protected] ~]# cd /usr/src/
[[email protected] src]#
[[email protected] src]# yum groupinstall "Development tools"
[[email protected] src]# git clone git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/bridge-utils.git
Cloning into 'bridge-utils'...
remote: Counting objects: 654, done.
remote: Total 654 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (654/654), 131.72 KiB | 198.00 KiB/s, done.
Resolving deltas: 100% (425/425), done.
Checking connectivity... done.
[[email protected] src]# cd bridge-utils
[[email protected] bridge-utils]# autoconf
[[email protected] bridge-utils]# . /configure && make && make install
[[email protected] bridge-utils]# brctl --version
bridge-utils, 1.5
[[email protected] bridge-utils]#
		

OVS является другим программно определяемым устройством моста/ коммутатора, который может применяться для создания
различных виртуальных сетевых топологий и подключать к ним экземпляры KVM. OVS может использоваться вместо моста Linux
и предоставляет расширенный набор свойств, включающих в свой состав политики маршрутизации,
ACL
(Access Control Lists, списки контролья доступа)
политики QoS
(Quality of Service, качества обслуживания), отслеживание сетевого
обмена, управление потоком, выставление тегов VLAN, туннелирование GRE и многое другое.

В данном рецепте мы намереваемся установить, настроить и применить мост OVS для подключения некоего экземпляра KVM к ОС
его хоста аналогично тому как мы это делали в своём предыдущем рецепте с помощью моста Linux.


Приготовление

Для работы с этим рецептом нам понадобятся гарантии следующего:

  • Мост Linux удалён, в случае его наличия, а OVS установлен

  • У нас имеется запущенным по крайней мере один экземпляр KVM


Как это сделать…

Для создания некого нового моста OVS и подключения имеющегося виртуального интерфейса некой гостевой KVM следуйте
таким шагам:

  1. Если он имеется, удалите существующий мост Linux:

    
    [email protected]:~# brctl show
    bridge name      bridge id             STP enabled      interfaces
    virbr0           8000.fe5400559bd6     yes              vnet0
    [email protected]:~# ifconfig virbr0 down
    [email protected]:~# brctl delbr virbr0
    [email protected]:~# brctl show
    bridge name bridge id STP enabled interfaces
    [email protected]:~#
     	   

    Совет

    В некоторых дистрибутивах Linux помогает выгрузка соответствующего модуля ядра для моста KVM перед
    использованием OVS. Чтобы сделать это выполните [email protected]:/usr/src# modprobe -r
    bridge
    .

  2. Установите необходимый пакет OVS в Ubuntu:

    
    [email protected]:~# apt-get install openvswitch-switch
    ...
    Setting up openvswitch-common (2.0.2-0ubuntu0.14.04.3) ...
    Setting up openvswitch-switch (2.0.2-0ubuntu0.14.04.3) ...
    openvswitch-switch start/running
    ...
    [email protected]:~#
     	   

  3. Убедитесь что соответствующие процессы OVS исполняются:

    
    [email protected]:~# pgrep -lfa switch
    22255 ovsdb-server /etc/openvswitch/conf.db -vconsole:emer -vsyslog:err -vfile:info --remote=punix:/var/run/openvswitch/db.sock --private-key=db:Open_vSwitch,SSL,private_key --certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --no-chdir --log-file=/var/log/openvswitch/ovsdb-server.log --pidfile=/var/run/openvswitch/ovsdb-server.pid --detach --monitor
    22264 ovs-vswitchd: monitoring pid 22265 (healthy)
    22265 ovs-vswitchd unix:/var/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir --log-file=/var/log/openvswitch/ovs-vswitchd.log --pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach --monitor
    [email protected]:~#
     	   

  4. Проверьте загрузку необходимого модуля ядра OVS:

    
    [email protected]:~# lsmod | grep switch
    openvswitch       70989   0
    gre               13796   1 openvswitch
    vxlan             37611   1 openvswitch
    libcrc32c         12644   1 openvswitch
    [email protected]:~#
     	   

  5. Перечислите все доступные коммутаторы OVS:

    
    [email protected]:~# ovs-vsctl show
    e5164e3e-7897-4717-b766-eae1918077b0
     ovs_version: "2.0.2"
    [email protected]:~#
     	   

  6. Создайте некий новый коммутатор OVS:

    
    [email protected]:~# ovs-vsctl add-br virbr1
    [email protected]:~# ovs-vsctl show
    e5164e3e-7897-4717-b766-eae1918077b0
     Bridge "virbr1"
       Port "virbr1"
         Interface "virbr1"
           type: internal
     ovs_version: "2.0.2"
    [email protected]:~#
     	   

  7. Добавьте имеющийся интерфейс исполняемого экземпляра KVM в созданный коммутатор OVS:

    
    [email protected]:~# ovs-vsctl add-port virbr1 vnet0
    [email protected]:~# ovs-vsctl show
    e5164e3e-7897-4717-b766-eae1918077b0
     Bridge "virbr1"
       Port "virbr1"
         Interface "virbr1"
           type: internal
       Port "vnet0"
         Interface "vnet0"
     ovs_version: "2.0.2"
    [email protected]:~#
     	   

  8. Настройте IP адрес самого коммутатора OVS:

    
    [email protected]:~# ip addr add 192.168.122.1/24 dev virbr1
    [email protected]:~# ip addr show virbr1
    41: virbr1: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
     link/ether b2:52:e0:73:89:4e brd ff:ff:ff:ff:ff:ff
     inet 192.168.122.1/24 scope global virbr1
     valid_lft forever preferred_lft forever
     inet6 fe80::b0a8:c2ff:fed4:bb3f/64 scope link
     valid_lft forever preferred_lft forever
    [email protected]:~#
     	   

  9. Настройте некий IP адрес внутри своей гостевой KVM и проверьте связь с ОС её хоста (если ваш образ не имеет настроенного
    доступа к консоли, подключитесь к нему при помощи VNC:

    
    [email protected]:~# ifconfig eth0 up && ip addr add 192.168.122.210/24 dev eth0
    [email protected]:~# ip addr show eth0
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
     link/ether 52:54:00:55:9b:d6 brd ff:ff:ff:ff:ff:ff
     inet 192.168.122.210/24 scope global eth0
     valid_lft forever preferred_lft forever
     inet6 fe80::5054:ff:fe55:9bd6/64 scope link
     valid_lft forever preferred_lft forever
    [email protected]:~# ping 192.168.122.1
    PING 192.168.122.1 (192.168.122.1) 56(84) bytes of data.
    64 bytes from 192.168.C
    --- 192.168.122.1 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2001ms
    rtt min/avg/max/mdev = 0.243/0.449/0.711/0.195 ms
    [email protected]:~#
     	   


Как это работает…

Для упрощения нашей установки и во избежание конфликтов будет благоразумно вначале удалить имеющийся мост
Linux, прежде чем создавать некий новый OVS. На 1 шаге мы удаляем имеющийся мост и опционально выгружаем его
модуль ядра.

На шаге 2 мы устанавливаем пакет OVS, который также запускает основной необходимый демон OVS
ovs-vswitchd, который отвечает за создание необходимых мостов/ коммутаторов и
их изменение в ОС данного хоста.

На шаге 4 мы проверяем что модуль ядра OVS загружен, а на шаге 5 мы перечисляем все доступные коммутаторы OVS в
данном хосте.

На шагах 6 и 7 мы создаём некий новый коммутатор OVS и добавляем имеющийся виртуальный интерфейс KVM в этот
коммутатор.

Тот процесс сервера ovsdb, который также был запущен после установки основного
пакета, и который мы видели на шаге 3, является неким механизмом базы данных, который применяет
RPC
(Remote Procedure Calls) JSON для взаимодействия со своим
основным демоном OVS. Данный процесс сервера ovsdb запоминает информацию, например,
относительно потоков, портов и QoS своего коммутатора, чтобы упоминуть хотя бы
некоторую из возможной. Вы можете опрашивать эту базу данных исполняя такую команду:


[email protected]:~# ovsdb-client list-dbs
Open_vSwitch
[email protected]:~# ovsdb-client list-tables
Table
-------------------------
Port
Manager
Bridge
Interface
SSL
IPFIX
Open_vSwitch
Queue
NetFlow
Mirror
QoS
Controller
Flow_Table
sFlow
Flow_Sample_Collector_Set
[email protected]:~# ovsdb-client dump Open_vSwitch
...
Port table
_uuid bond_downdelay bond_fake_iface bond_mode bond_updelay external_ids fake_bridge interfaces lacp mac name other_config qos statistics status tag trunks vlan_mode
------------------------------------ -------------- --------------- --------- ------------ ------------ ----------- -------------------------------------- ---- --- -------- ------------ --- ---------- ------ --- ------ ---------
9b4b743d-66b2-4779-9dd8-404b3aa55e18 0 false [] 0 {} false [e7ed4e2b-a73c-46c7-adeb-a203be56587c] [] [] "virbr1" {} [] {} {} [] [] []
f2a033aa-9072-4be3-808e-6e0fce67ce7b 0 false [] 0 {} false [86a10eed-698f-4ccc-b3b7-dd20c13e3ee3] [] [] "vnet0" {} [] {} {} [] [] []
...
[email protected]:~#
		

Отметим, что в нашем предыдущем выводе теперь отображены эти новые коммутатор
virbr1 и порт vnet0
когда мы опрашиваем имеющуюся базу данных OVS.

На шагах 8 и 9 мы назначаем IP адреса созданному коммутатору OVS и имеющейся гостевой KVM и проверяем что мы способны
достигать полученный мост хоста изнутри своей виртуальной машины.


Также ознакомьтесь…

OVS является достаточно сложным программно определяемым коммутатором; в этом рецепте мы только чиркнули по его
поверхности. В следующих нескольких рецептах мы можем применять как мост Linux, так и OVS с основными изменениями в
настройках, на которые мы будем указывать по ходу действия.

Для удаления имеющегося виртуального интерфейса KVM из соответствующего коммутатора OVS выполните такую команду:


[email protected]:~# ovs-vsctl del-port virbr1 vnet0
[email protected]:~#
		

Чтобы полностью удалить имеющийся коммутатор OVS исполните такую команду:


[email protected]:~# ovs-vsctl del-br virbr1 && ovs-vsctl show
e5164e3e-7897-4717-b766-eae1918077b0
 ovs_version: "2.0.2"
[email protected]:~#
		
Замечание

Для получения дополнительных сведений относительно OVS посетите, пожалуйста
веб сайт проекта.

Настройка переадресации NAT сетевой среды

После своего запуска, libvirt создаёт некую сетевую среду по умолчанию в
своём файле настроек /etc/libvirt/qemu/networks/default.xml. При построении
какой- то новой KVM без определения каких бы то ни было новых сетевых параметров, она будет использовать такие
настройки по умолчанию для взаимодействия с ОС своего хоста и прочими гостями, а также с сетевыми средами. Устанавливаемая
по умолчанию сетевая среда libvirt применяет метод
NAT
(Network Address Translation, трансляции сетевых адресов).
NAT предоставляет соответствие одного IP адреса другому, изменяя имеющийся IP адрес в самом заголовке данной IP дейтаграммы
пакета. Это в особенности полезно когда наш хост предоставляет один IP адрес, позволяющий множеству гостей в одном и том
же хосте применять этот адрес для установления исходящих соединений. Адреса таких виртуальных машин по существу
транслируются чтобы проявляться как IP адрес этой машины хоста.

Сетевая среда переадресации по умолчанию определяет и настраивает некий мост Linux для подключения к нему имеющихся
гостей. В данном рецепте мы собираемся создать некую новую сеть NAT и подключить к ней свою гостевую KVM.


Приготовление

В данном рецепте нам понадобится следующее:

  • Некий хост Linux с установленным libvirt и его запущенным демоном.

  • Установленные в ОС рассматриваемого хоста пакеты iptables и
    iproute2. Если вы устанавливали libvirt
    из некого пакета, имеются шансы что эти iptables и
    iproute2 уже установлены, как зависимости самого пакета
    libvirt. Если же вы строили libvirt
    из исходного кода, вам может потребоваться установить их вручную.

  • Исполняемые экземпляры KVM.


Как это сделать…

Для настройки некоей новой сетевой среды NAT и подключения к ней какого- то экземпляра KVM выполните следующее:

  1. Перечислите все доступные сети:

    
    [email protected]:~# virsh net-list --all
     Name       State    Autostart     Persistent
    ----------------------------------------------------------
     default    active    yes          yes
    
    [email protected]:~#
     	   

  2. Выдайте дамп имеющихся установок вашей сети по умолчанию:

    
    [email protected]:~# virsh net-dumpxml default
    <network connections='1'>
     <name>default</name>
     <uuid>2ab5d22c-5928-4304-920e-bc43b8731bcf</uuid>
     <forward mode='nat'>
       <nat>
         <port start='1024' end='65535'/>
       </nat>
     </forward>
     <bridge name='virbr0' stp='on' delay='0'/>
     <ip address='192.168.122.1' netmask='255.255.255.0'>
       <dhcp>
         <range start='192.168.122.2' end='192.168.122.254'/>
       </dhcp>
     </ip>
    </network>
    
    [email protected]:~#
     	   

  3. Сравните это с файлом определения XML для сети по умолчанию:

    
    [email protected]:~# cat /etc/libvirt/qemu/networks/default.xml
    <network>
     <name>default</name>
     <bridge name="virbr0"/>
     <forward/>
     <ip address="192.168.122.1" netmask="255.255.255.0">
       <dhcp>
         <range start="192.168.122.2" end="192.168.122.254"/>
       </dhcp>
     </ip>
    </network>
    [email protected]:~#
     	   

  4. Перечислите все запущенные в вашем хосте экземпляры:

    
    [email protected]:~# virsh list --all
     Id    Name    State
    ----------------------------------------------------
     3    kvm1     running
    
    [email protected]:~#
     	   

  5. Убедитесь что ваши экземпляры KVM подключены к установленному по умолчанию мосту Linux:

    
    [email protected]:~# brctl show
    bridge name    bridge id           STP enabled    interfaces
    virbr0         8000.fe5400559bd6   yes            vnet0
    [email protected]:~#
     	   

  6. Создайте некое новое определение сети NAT:

    
    [email protected]:~# cat nat_net.xml
    <network>
     <name>nat_net</name>
     <bridge name="virbr1"/>
     <forward/>
     <ip address="10.10.10.1" netmask="255.255.255.0">
       <dhcp>
         <range start="10.10.10.2" end="10.10.10.254"/>
       </dhcp>
     </ip>
    </network>
    [email protected]:~#
     	   

  7. Определите эту новую сетевую среду:

    
    [email protected]:~# virsh net-define nat_net.xml
    Network nat_net defined from nat_net.xml
    
    [email protected]:~# virsh net-list --all
     Name       State      Autostart    Persistent
    ----------------------------------------------------------
     default    active     yes          yes
     nat_net    inactive   no           yes
    
    [email protected]:~#
     	   

  8. Запустите эту новую сетевую среду и установите её автоматический старт:

    
    [email protected]:~# virsh net-start nat_net
    Network nat_net started
    
    [email protected]:~# virsh net-autostart nat_net
    Network nat_net marked as autostarted
    
    [email protected]:~# virsh net-list
     Name      State     Autostart    Persistent
    ----------------------------------------------------------
     default   active    yes          yes
     nat_net   active    yes          yes
    
    [email protected]:~#
     	   

  9. Получите дополнительные сведения относительно этой новой сети:

    
    [email protected]:~# virsh net-info nat_net
    Name: nat_net
    UUID: fba2ca2b-8ca7-4dbb-beee-14799ee04bc3
    Active: yes
    Persistent: yes
    Autostart: yes
    Bridge: virbr1
    
    [email protected]:~#
     	   

  10. Измените соответствующее определение своего экземпляра kvm1 и измените название
    сетевой среды его источника:

    
    [email protected]:~# virsh edit kvm1
    .]
    
    Debian GNU/Linux 8 debian ttyS0
    
    debian login: root
    Password:
    ...
    [email protected]:~# ip a s eth0 | grep inet
     inet 10.10.10.92/24 brd 10.10.10.255 scope global eth0
     inet6 fe80::5054:ff:fe55:9bd6/64 scope link
    [email protected]:~# ifconfig eth0 up && dhclient eth0
    [email protected]:~# ping 10.10.10.1 -c 3
    PING 10.10.10.1 (10.10.10.1) 56(84) bytes of data.
    64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=0.313 ms
    64 bytes from 10.10.10.1: icmp_seq=2 ttl=64 time=0.136 ms
    64 bytes from 10.10.10.1: icmp_seq=3 ttl=64 time=0.253 ms
    
    --- 10.10.10.1 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2000ms
    rtt min/avg/max/mdev = 0.136/0.234/0.313/0.073 ms
    [email protected]:~#
     	   

  11. В ОС своего хоста опросите какие службы DHCP запущены:

    
    [email protected]:~# pgrep -lfa dnsmasq
    38983 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf
    40098 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/nat_net.conf
    [email protected]:~#
     	   

  12. Проверьте установленный IP для интерфейса своего нового моста:

    
    [email protected]:~# ip a s virbr1
    43: virbr1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
     link/ether 52:54:00:ba:8e:2c brd ff:ff:ff:ff:ff:ff
     inet 10.10.10.1/24 brd 10.10.10.255 scope global virbr1
       valid_lft forever preferred_lft forever
    [email protected]:~#
     	   

  13. Выведите список правил iptables для имеющейся таблицы NAT:

    
    [email protected]:~# iptables -L -n -t nat
    Chain PREROUTING (policy ACCEPT)
    target prot opt source destination
    
    Chain INPUT (policy ACCEPT)
    target prot opt source destination
    
    Chain OUTPUT (policy ACCEPT)
    target prot opt source destination
    
    Chain POSTROUTING (policy ACCEPT)
    target prot opt source destination
    RETURN all -- 10.10.10.0/24 224.0.0.0/24
    RETURN all -- 10.10.10.0/24 255.255.255.255
    MASQUERADE tcp -- 10.10.10.0/24 !10.10.10.0/24 masq ports: 1024-65535
    MASQUERADE udp -- 10.10.10.0/24 !10.10.10.0/24 masq ports: 1024-65535
    MASQUERADE all -- 10.10.10.0/24 !10.10.10.0/24
    RETURN all -- 192.168.122.0/24 224.0.0.0/24
    RETURN all -- 192.168.122.0/24 255.255.255.255
    MASQUERADE tcp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
    MASQUERADE udp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
    MASQUERADE all -- 192.168.122.0/24 !192.168.122.0/24
    RETURN all -- 192.168.122.0/24 224.0.0.0/24
    RETURN all -- 192.168.122.0/24 255.255.255.255
    MASQUERADE tcp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
    MASQUERADE udp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
    MASQUERADE all -- 192.168.122.0/24 !192.168.122.0/24
    [email protected]:~#
     	   


Как это работает…

Мы начали на шаге 1 с перечисления всех доступных сетевых сред в ОС своего хоста. Как мы можем видеть из получаемого
вывода своей команды virsh, имеется запущенной только одна сетевая среда,
установленная по умолчанию.

На шаге 2 мы изучаем имеющиеся настройки в этой установленной по умолчанию сетевой среды. Его определение XML использует
следующие атрибуты:

  • Атрибут <network> является корневым элементом, указывающим libvirt
    что мы определяем некую сетевую среду.

  • Элемент <name> определяет само название этой сете вой среды и требует
    его уникальности.

  • Атрибут <uuid> предоставляет некий глобальный уникальный идентификатор
    для нашей виртуальной сетевой среды и, если он опущен, он выработается автоматически.

  • Элемент <forward> и его атрибут режима определяют ту сеть, с которой
    соединяется весь стек сети хоста при помощи NAT. Если этот элемент опущен, libvirt создаст некую изолированную сеть.

  • Субэлемент <nat> далее определяет соответствующий диапазон
    <port>, который будет применяться когда данный хост выполняет NAT.

  • Элемент <bridge> определяет создаваемый мост, его название и параметры
    STP.

  • Атрибут <ip> определяет необходимый диапазон IP для существующего сервера
    DHCP под назначение адресов всем гостевым ВМ.

На шаге 3 мы просматриваем файл настроек для установленной сети по умолчанию относительно перечисленного. Обратите
внимание, что некоторые атрибуты пропущены. Libvirt автоматически вырабатывает определённые атрибуты и назначает значения по
умолчанию так где это необходимо.

На шагах 4 и 5 мы проверяем что у нас имеется запущенный экземпляр, подключённый к установленному по умолчанию мосту
Linux.

На шаге 6 мы создаём некое новое определение сетевой среды при помощи сети по умолчанию в качестве шаблона.
Мы изменяем её название и определяем новый диапазон IP.

Имея готовым новый файл определения сетевой среды на шагах 7 и 8 мы определяем такую новую сеть, запускаем её и убеждаемся
что она автоматически запускается при запуске самого демона libvirt в случае
перезагрузки сервера.

После получения на шаге 9 дополнительной информации относительно вновь созданной сетевой среды мы продолжаем на шаге 10
изменять имеющееся определение XML соответствующей гостевой KVM. Чтобы сделать эту ВМ частью нашей новой сети всё что требуется,
это обновить её элемент <source network>.

После перезапуска этой гостевой KVM на шаге 11 мы продолжаем на шаге 12 выводом списка всех доступных программно
определяемых мостов в ОС своего хоста. Обратите внимание, что теперь у нас существует два моста, причём новый мост имеет
подключёнными к нему виртуальные интерфейсы vnet0 с виртуальных машин.

Затем мы подключаемся к запущенной гостевой KVM и убеждаемся что её сетевой интерфейс eth0 получил некий IP адрес от
своего сервера DHCP запущенного в этом хосте и что этот IP является частью того диапазона адресов, который мы настроили
ранее. Мы также проверяем соединение при помощи команды ping.

Вернувшись в ОС своего хоста, на шагах 14 и 15 мы проверяем что службы DHCP запущены. Относительно вывода команды
pgrep, обратите внимание что теперь у нас имеются два запущенных процесса
dnsmasq: по одному для каждой из определённых сетей.

Переадресация NAT достигается установкой правил iptables, который мы можем видеть на шаге 18. Всякий раз когда мы
определяем и запускаем некую новую сеть NAT, libvirt создаёт все необходимые правила в iptables. Из полученного на шаге
18 вывода мы можем видеть наличие двух наборов правил NAT, по одному для каждой запущенной сети NAT.

Настройка сетевой среды через мосты

Полностью снарядив себя мостами мы можем подключать свои гостевые KVM напрямую к сетевой среде своего хоста без
использования NAT. Однако такая установка требует некоего IP адреса, который является частью подсети самого хоста,
причём для каждой виртуальной машины. Если у вас нет возможности выделять настолько много IP адресов, рассмотрите
применение сети NAT, как это описано в выданном ранее рецепте Настройка
переадресации NAT сетевой среды. При таком режиме построения сетевой среды ваши виртуальнве машины всё ещё используют
для связи имеющийся мост ОС своего хоста; однако этот мост поглощает все физические интерфейсы, которые вы намерены
применять для своих гостей.


Приготовление

В этом рецепте нам потребуется следующее:

  • Некий сервер с по крайней мере двумя физическими интерфейсами

  • Возможность предоставлять и запускать экземпляры KVM с помощью libvirt

  • Запущенный экземпляр KVM


Как это сделать…

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

  1. Отключите тот интерфейс, который мы намерены использовать для моста:

    
    [email protected]:~# ifdown eth2
    [email protected]:~#
     	   

  2. Измените файл сетевых настроек в своём хосте и замените его блок eth2
    следующим, если ваш хост это ОС с Debian/ Ubuntu:

    
    [email protected]:~# vim /etc/network/interfaces
    ...
     auto virbr2
     iface virbr2 inet static
         address 192.168.1.2
         netmask 255.255.255.0
         network 192.168.1.0
         broadcast 192.168.1.255
         gateway 192.168.1.1
         bridge_ports eth2
         bridge_stp on
         bridge_maxwait 0
    ...
    [email protected]:~#
     	   

  3. Если вы применяете дистрибутивы RedHat/CentOS, вместо этого замените следующие два файла:

    
    [email protected]:~# cat /etc/sysconfig/ifcfg-eth2
    DEVICE=eth2
    NAME=eth2
    NM_CONTROLLED=yes
    ONBOOT=yes
    TYPE=Ethernet
    BRIDGE=virbr2
    [email protected]:~# cat /etc/sysconfig/ifcfg-bridge_net
    DEVICE=virbr2
    NAME=virbr2
    NM_CONTROLLED=yes
    ONBOOT=yes
    TYPE=Bridge
    STP=on
    IPADDR=192.168.1.2
    NETMASK=255.255.255.0
    GATEWAY=192.168.1.1
    [email protected]:~#
     	   

  4. Поднимите свой новый интерфейс:

    
    [email protected]:~# ifup virbr2
    [email protected]:~#
     	   

  5. Отключите отправку пакетов в iptables, которые появляются из ваших
    гостевых ВМ:

    
    [email protected]:~# sysctl -w net.bridge.bridge-nf-call-iptables=0
    net.bridge.bridge-nf-call-iptables = 0
    [email protected]:~# sysctl -w net.bridge.bridge-nf-call-iptables=0
    net.bridge.bridge-nf-call-iptables = 0
    [email protected]:~# sysctl -w net.bridge.bridge-nf-call-arptables=0
    net.bridge.bridge-nf-call-arptables = 0
    [email protected]:~#
     	   

  6. Перечислите все мосты в своём хосте:

    
    [email protected]:~# # brctl show
     bridge name     bridge id            STP enabled     interfaces
     virbr0          8000.000000000000    yes
     virbr2          8000.000a0ac60210    yes             eth2
    [email protected]:~#
     	   

  7. Измените определение XML для своего экземпляра KVM:

    
    [email protected]:~# virsh edit kvm1
    ...
     <interface type='bridge'>
       <source bridge='virbr2'/>
     </interface>
    ...
    
    Domain kvm1 XML configuration edited.
    
    [email protected]:~#
     	   

  8. Перезапустите этот экземпляр KVM:

    
    [email protected]:~# virsh destroy kvm1
    Domain kvm1 destroyed
    
    [email protected]:~# virsh start kvm1
    Domain kvm1 started
    
    [email protected]:~#
     	   


Как это работает…

Для настройки сетевой среды с мостом на шагах 1 и 2 мы вначале выключаем некий физический интерфейс
(в данном примере eth2), чтобы поглотить его (сделать его некоторой
частью того нового моста, который мы намерены создать). Затем мы создаём некую сетевую конфигурацию, определяем
новый необходимый мост и тот физический интерфейс, который мы намерены сделать частью этого моста. Это на самом деле
устанавливает соответствие той подсети что мы настраиваем в данном физическом интерфейсе данному мосту. Если ваш
сервер имеет только один сетевой интерфейс, вы всё ещё можете поглотить его. Однако вам потребуется некий
дополнительный способ подключения к этому серверу, так как после того как вы отключите свой основной интерфейс,
вы потеряете связь и устранение неисправностей может стать невозможным через какое- то подключение SSH.

После того как этот новый мост настроен, мы запускаем его на шаге 3.

На шаге 4 мы указываем своему ядру не применять правила iptable ни к какому обмену, появляющемуся у наших
виртуальных гостей подключаемых к этому мосту Linux, поскольку мы не применяем никаких правил NAT.

После запуска своего нового интерфейса мы теперь на шаге 5 можем видеть свой мост и поглощённый им физический
интерфейс, который мы подключили к нему.

На шаге 6 мы изменяем имеющееся определение XML своего экземпляра kvm1, в
котором мы задаём необходимый тип сетевой среды который мы желаем применять; для данного рецепта это сеть с мостом
(bridge). Если вы вспомните рецепт
Настройка переадресации NAT сетевой среды, мы использовали тип
сети (network) вместо сети с мостом и мы определяли некое название сети
libvirt вместо самого названия моста.

Наконец, после перезапуска своего экземпляра KVM на шаге 7, наша гостевая ОС должна теперь иметь возможность
достигать прочие экземпляры, которые являются частью той же самой подсети без использования NAT.

Настройка проброса PCI сетевой среды

Обсуждаемый нами гипервизор KVM поддерживает прямое подключение устройств PCI из ОС своего хоста в его виртуальные
машины. Мы можем применять эту функциональность для подключения сетевого интерфейса напрямую в имеющуюся гостевую
ОС без необходимости применения NAT или программно определяемого моста.

В данном рецепте мы намерены подключить некую NIC
(Network Interface Card), которая поддерживает
SR-IOV
(Single Root I/O Virtualization,
виртуализацию ввода/ вывода с единым корнем) из своего хоста в соответствующего гостя KVM. SR-IOV представляет
собой спецификацию, которая позволяет устройству PCIe
(Peripheral Component Interconnect Express)
выступать в виде множества физических устройств {Прим. пер.: виртуальных функций},
которые могут совместно применяться многими виртуальными машинами в одном и том же хосте, выполняя проброс на уровне
самого супервизора, тем самым достигая естественной сетевой скорости. Поставщики облачных решений, такие как
Amazon AWS выставляют эту функциональность для своих вычислительных экземпляров EC2 через вызовы API.


Приготовление

Для полного исполнения данного рецепта нам потребуется следующее:

  • Некий физический хост с NIC, которая поддерживает SR-IOV

  • Коммутатор с возможностями 802.1Qbh, подключаемый к этому физическому
    серверу

  • ЦПУ с расширениями либо Intel VT-d, либо AMD IOMMU

  • Хост Linux с установленным libvirt готовый к предоставлению экземпляров
    KVM


Как это сделать…

Для настройки сетевой среды со сквозным PCIe проделайте следующие шаги:

  1. Выведите список всех устройств ОС своего хоста:

    
    [email protected]:~# virsh nodedev-list --tree
    computer
     |
     +- net_lo_00_00_00_00_00_00
     +- net_ovs_system_0a_c6_62_34_19_b4
     +- net_virbr1_nic_52_54_00_ba_8e_2c
     +- net_vnet0_fe_54_00_55_9b_d6
     ...
     |
     +- pci_0000_00_03_0
     | |
     | +- pci_0000_03_00_0
     | | |
     | | +- net_eth0_58_20_b1_00_b8_61
     | |
     | +- pci_0000_03_00_1
     | |
     | +- net_eth2_58_20_b1_00_b8_61
     |
     ...
     [email protected]:~#
     	   

  2. Перечислите все адаптеры PCI Ethernet:

    
    [email protected]:~# lspci | grep Ethernet
    03:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
    03:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
    [email protected]:~#
     	   

  3. Получите дополнительные сведения относительно той NIC, которую использует устройство
    eth2:

    
    [email protected]:~# virsh nodedev-dumpxml pci_0000_03_00_1
    <device>
     <name>pci_0000_03_00_1</name>
     <path>/sys/devices/pci0000:00/0000:00:03.0/0000:03:00.1</path>
     <parent>pci_0000_00_03_0</parent>
     <driver>
       <name>ixgbe</name>
     </driver>
     <capability type='pci'>
       <domain>0</domain>
       <bus>3</bus>
       <slot>0</slot>
       <function>1</function>
       <product>82599ES 10-Gigabit SFI/SFP+ Network Connection</product>
       <vendor>Intel Corporation</vendor>
     </capability>
    </device>
    
    [email protected]:~#
     	   

  4. Преобразуйте домен, шину, слот и значения функций в шестнадцатеричные числа:

    
    [email protected]:~# printf %x 0
    0
    [email protected]:~# printf %x 3
    3
    [email protected]:~# printf %x 0
    0
    [email protected]:~# printf %x 1
    1
    [email protected]:~#
     	   

  5. Создайте некий новый файл определения сетевой среды libvirt:

    
    [email protected]:~# cat passthrough_net.xml
    <network>
     <name>passthrough_net</name>
     <forward mode='hostdev' managed='yes'>
       <pf dev='eth2'/>
     </forward>
    </network>
    [email protected]:~#
     	   

  6. Определите, запустите и включите автоматический старт своей новой сетевой среды
    libvirt:

    
    [email protected]:~# virsh net-define passthrough_net.xml
    Network passthrough_net defined from passthrough_net.xml
    
    [email protected]:~# virsh net-start passthrough_net
    Network passthrough_nett started
    
    [email protected]:~# virsh net-autostart passthrough_net
    Network passthrough_net marked as autostarted
    
    [email protected]:~# virsh net-list
     Name               State      Autostart    Persistent
    ----------------------------------------------------------
     default            active    yes           yes
     passthrough_net    active    yes           yes
    
    [email protected]:~#
     	   

  7. Измените XML определение своей гостевой KVM:

    
    [email protected]:~# virsh edit kvm1
    ...
     <devices>
     ...
     <interface type='hostdev' managed='yes'>
       <source>
         <address type='pci' domain='0x0' bus='0x00' slot='0x07' function='0x0'/>
       </source>
       <virtualport type='802.1Qbh' />
     </interface>
     <interface type='network'>
       <source network='passthrough_net'>
     </interface>
     ...
     </devices>
    ...
    
    Domain kvm1 XML configuration edited.
    
    [email protected]:~#
     	   

  8. Перезапустите этот экземпляр KVM:

    
    [email protected]:~# virsh destroy kvm1
    Domain kvm1 destroyed
    
    [email protected]:~# virsh start kvm1
    Domain kvm1 started
    
    [email protected]:~#
     	   

  9. Выведите перечень VF
    (Virtual Functions), предоставляемых NIC SR-IOV:

    
    [email protected]:~# virsh net-dumpxml passthrough_net
    <network connections='1'>
       <name>passthrough_net</name>
       <uuid>a4233231-d353-a112-3422-3451ac78623a</uuid>
       <forward mode='hostdev' managed='yes'>
         <pf dev='eth2'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x1'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x3'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x5'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x7'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x1'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x3'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x5'/>
       </forward>
    </network>
    [email protected]:~#
     	   


Как это работает…

Чтобы напрямую подключать NIC PCIe от ОС своего хоста в его гостевые ВМ нам вначале необходимо получить некую
информацию об аппаратных средствах этого устройства, такую как домен, шина, слот и идентификаторы функций. На шаге 1
мы собираем информацию обо всех доступных устройствах в сервере своего хоста. Нас интересуют сетевой интерфейс,
применяемый для eth2; более того мы выписываем из полученного вывода уникальную идентификацию PCI —
в данном случае pci_0000_03_00_1.

Чтобы убедится что это на самом деле NIC, который мы бы хотели выставить своему гостю, мы перечисляем все устройства
PCI на шаге 2. Из этого вывода мы можем обнаружить, что идентификатор его PCI тот же самый,
03:00.1.

Применяя PCI ID с шага 1 на шаге 3 мы продолжим собирать дополнительную информацию относительно NIC.
Обратите внимание, что 0000_03_00_1 ID разбивается далее на идентификатор домена,
идентификатор шины, идентификатор слота и идентификатор функции, как это показано в соответствующих атрибутах XML.
Мы намерены воспользоваться ими на шаге 7; однако вначале нам необходимо преобразовать их в шестнадцатеричные числа,
что мы и делаем на шаге 4.

На шагах 5 и 6 мы определяем некую новую сетевую среду libvirt для своих
гостей и включаем автоматический сатр в случае перезапуска сервера своего хоста. Если вы выполняли прочие рецепты из
этой главы, вы уже должны быть знакомы с большинством атрибутов в таком файле XML определений для той сети, которую мы
только что создали. Режим hostdev определённый в атрибуте
<forward> является именно тем, что инструктирует
libvirt что наша новая сетевая среда намерена применять проброс PCI.
Соответствующий параметр managed=yes, как это определено в нашем атрибуте
<forward> сообщает libvirt
вначале отключить это устройство PCI от хоста перед передачей его соответствующему гостю и повторно подключать его в этот
хост после останова такого гостя. Наконец, субэлемент <pf> определяет
тот физический интерфейс, который будет виртуализован и представлен соответствующему гостю.

Замечание

Для получения дополнительных сведений относительно доступных атрибутов XML, обращайтесь, пожалуйста, к
http://libvirt.org/formatdomain.html.

На щаге 7 мы изменяем определение XML своего экземпляра KVM, определяя тот ID PCI, который мы получили на шаге 3 и
определяем некий интерфейс, который будет применять новую сквозную сетевую среду PCIe, которую мы создали на шагах 5 и 6.

На шаге 8 мы перезапускаем свой экземпляр KVM и наконец проверяем что наше физическое устройство PCI NIC теперь
является частью новой сквозной сетевой среды, определённой нами ранее. Обратите внимание на наличие множества устройств с
типом PCI. Это происходит потому, что данное проброшенное устройство PCIe, которое мы будем применять, поддерживает
SR-IOV. Все гостевые KVM, которые будут пользоваться этой сетевой средой теперь будут способны напрямую применять NIC
своего хоста назначая одно из перечисленных виртуальных устройств PCie.

Манипулирование сетевыми интерфейсами

Libvirt предоставляет удобный способ управления сетевыми интерфейсами в имеющемся хосте через уже знакомый нам синтаксис
определений XML. Мы можем применять команду virsh для определения, предоставления и
удаления мостов Linux, а также получать дополнительную информацию относительно имеющихся сетевых интерфейсов, как мы это
уже наблюдали в данной главе.

В данном рецепте мы намерены определить некий новый мост Linux, создать его и наконец удалить его с помощью
virsh. Если вы вспомните наши более ранние рецепты, мы можем манипулировать
имеющимся мостом Linux через такие утилиты как brctl. Для libvirt, однако, у нас
имеется некий способ контроля этого программным путём через написание соответствующего файла определения и использование
соответствующих компоновок API, которые мы рассмотрим в Главе 7,
Применение Python для построения экземпляров KVM и управления ими.


Приготовление

Для данного рецепта нам потребуются:


Как это сделать…

Для создания нового интерфейса моста при помощи libvirt выполните такие команды:

  1. Создайте некий новый файл настройки интерфейса моста:

    
    [email protected]:~# cat test_bridge.xml
    <interface type='bridge' name='test_bridge'>
     <start mode="onboot"/>
       <protocol family='ipv4'>
     <ip address='192.168.1.100' prefix='24'/>
     </protocol>
     <bridge>
       <interface type='ethernet' name='vnet0'>
         <mac address='fe:54:00:55:9b:d6'/>
       </interface>
     </bridge>
    </interface>
    [email protected]:~#
     	   

  2. Перечислите все известные libvirt интерфейсы:

    
    [email protected]:~# virsh iface-list --all
     Name            State       MAC Address
    ---------------------------------------------------
     bond0           active      58:20:b1:00:b8:61
     bond0.129       active      bc:76:4e:20:10:6b
     bond0.229       active      bc:76:4e:20:17:7e
     eth0            active      58:20:b1:00:b8:61
     eth2            active      58:20:b1:00:b8:61
     lo              active      00:00:00:00:00:00
     test_bridge     inactive
    
    [email protected]:~#
     	   

  3. Запустите полученный новый интерфейс моста:

    
    [email protected]:~# virsh iface-start test_bridge
    Interface test_bridge started
    
    [email protected]:~# virsh iface-list --all | grep test_bridge
     test_bridge    active    4a:1e:48:e1:e7:de
    [email protected]:~#
     	   

  4. Перечислите все устройства моста в этом хосте:

    
    [email protected]:~# brctl show
    bridge name       bridge id           STP enabled   interfaces
    test_bridge       8000.000000000000   no
    virbr0            8000.000000000000   yes
    virbr1            8000.525400ba8e2c   yes           virbr1-nic
                                                        vnet0
    [email protected]:~#
     	   

  5. Проверьте все активные сетевые настройки своего нового моста:

    
    [email protected]:~# ip a s test_bridge
    46: test_bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
     link/ether 4a:1e:48:e1:e7:de brd ff:ff:ff:ff:ff:ff
     inet 192.168.1.100/24 brd 192.168.1.255 scope global test_bridge
     valid_lft forever preferred_lft forever
     inet6 fe80::481e:48ff:fee1:e7de/64 scope link
     valid_lft forever preferred_lft forever
    [email protected]:~#
     	   

  6. Определите этот новый интерфейс:

    
    [email protected]:~# virsh iface-define test_bridge.xml
    Interface test_bridge defined from test_bridge.xml
    
    [email protected]:~#
     	   

  7. Получите значение MAC адреса моста:

    
    [email protected]:~# virsh iface-mac test_bridge
    4a:1e:48:e1:e7:de
    
    [email protected]:~#
     	   

  8. Получите название созданного моста предоставив его MAC адрес:

    
    [email protected]:~# virsh iface-name 4a:1e:48:e1:e7:de
    test_bridge
    
    [email protected]:~#
     	   

  9. Удалите созданный интерфейс следующим образом:

    
    [email protected]:~# virsh iface-destroy test_bridge
    Interface test_bridge destroyed
    
    [email protected]:~# virsh iface-list --all | grep test_bridge
     test_bridge inactive
    [email protected]:~# virsh iface-undefine test_bridge
    Interface test_bridge undefined
    
    [email protected]:~# virsh iface-list --all | grep test_bridge
    [email protected]:~#
     	   


Как это работает…

На шаге 1 мы записываем необходимое определение XML для своего нового сетевого интерфейса. Мы определяем мост по
значению типа, некого IP адреса для его интерфейса и необязательного какого- то MAC адреса.

На шагах 2 и 3 мы определяем этот новый мост и выводим его в списке. Определение такого интерфейса не делает
автоматически его активным, поэтому на шаге 4 мы активируем его.

Как показано на шаге 5, активация этого моста создаёт его реальный интерфейс в этом хосте.

На шаге 6 мы убеждаемся что назначенные адреса IP и MAC действительно те, которые мы определили на шаге 1.

На шагах 7 и 8 мы получаем и название и MAC адрес при помощи утилиты virsh,
а, наконец, на шаге 9 мы удаляем созданный интерфейс bridge.

KVM на Debian. « Debian.pro

Несколько недель назад я выбрал себе KVM для виртуализации. Сразу отвечу на вопросы «почему?»: виртуальные машины под KVM шустры и позволяют запускать любую ОС. Еретические ОС я не пробовал, но Debian и FreeBSD бегают под KVM+Debian очень и очень неплохо — это признают даже бывалые администраторы.

Если вы готовы за скорость заплатить удобством настройки и использования хост-машины — просим под кат.

Устанавливал я KVM на машинку с процессором core i7. Рекомендую использовать именно многоядерные процессоры с HT. При том не стоит отдавать виртуальным машинам виртуальных процессоров больше, чем есть ядер на хост-машине. В случае с i7 я получил 8 ядер, которые в дальнейшем смогу разделить как пожелаю между контейнерами.  Если раздать больше процессоров чем есть — это может сказаться на производительности.

Первым делом проверяем — поддерживает ли процессор аппаратную виртуализацию:

cat /proc/cpuinfo | egrep ‘(svm|vmx)’

Если после ввода команды на экране появился какой-либо текст — то ваш процессор поддерживает аппаратную виртуализацию. Если вывод команды пустой — то не стоит использовать KVM. Да и вообще не стоит использовать современные гипервизоры.

Теперь устанавливаем необходимые пакеты:

sudo apt-get install kvm libvirt-bin virtinst bridge-utils

После чего стоит перезагрузить хост. Конечно же стоит использовать последнее доступное стабильное linux-ядро, доступное в репозиториях.

Проверяем, установился ли KVM:

virsh -c qemu:///system list —all

Вывод команды опять же должен быть не пустым и не содержать ошибок вида «команда не найдена».

Приступим к настройке сети на хост машине. Приведем файл /etc/network/interfaces к следующему виду:

auto lo

iface lo inet loopback
auto  eth0
iface eth0 inet static
auto br0
iface br0 inet static
address   178.ххх.ххх.137
netmask   255.255.255.192

network 178.ххх.ххх.0
broadcast 178.ххх.ххх.191
gateway   178.ххх.ххх.129
bridge_ports eth0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off

После чего применяем все сетевые настройки:

/etc/init.d/networking restart

Для удобства создадим каталоги:

mkdir /iso && mkdir /vms

И скачаем образ установочный образ debian:

cd /iso && wget -c http://cdimage.debian.org/debian-cd/5.0.4/amd64/iso-cd/debian-504-amd64-CD-1.iso

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

virt-install -n vm1 -r 1024 -f /vms/vm1.img -s 50 -c /iso/debian-cd/5.0.4/amd64/iso-cd/debian-504-amd64-CD-1.iso —accelerate —os-type=linux —os-variant=generic26 -v —vnc -w bridge:br0

Расскажу о приведенных выше опциях:

-n vm1 — имя домена (виртуальной машины)

-r 1024 — количество оперативной памяти

-f /vms/vm1.img — расположение «жесткого диска».

-s 50 — размер «жесткого диска»

-c /iso/debian-cd/5.0.4/amd64/iso-cd/debian-504-amd64-CD-1.iso — указываем iso образ, с которого будем производить установку системы. Рекомендую запускать 64х битные образы под 64й битной ОС хост-машины.

—accelerate —os-type=linux —os-variant=generic26 -v — оптимизируем VDS для работы с виртуальным Linux с ядром 2.6.хх

—vnc — запускаем VNC-сервер для доступа к виртуальной машине.

-w bridge:br0 — указываем, что виртуальная машина должна использовать сетевлй мост br0  хост-машины

Теперь перейдем к установке ОС на виртуальную машину.

На вашем компьютере (не на сервере, а на рабочей станции с графической средой) вводим команды:

ssh -L 5900:localhost:5900 [email protected]ххх.ххх.137

И во второй консоли:

vncviewer localhost:5900

Теперь вы должны увидеть в VNC установщик Debian. Ставим всё как обычно (возможно вам будет недоступна сеть). После того, как установщик Debian отправит систему в перезагрузку — виртуальная машина выключится, вместо того, чтобы перезагрузиться.

Самое время изменить количество выделенных процессоров для виртуальной машины:

virsh -c qemu:///system setvcpus vm1 2

Эта команда сработает, только если виртуальная машина находится в выключенном состоянии.  Теперь запустим её снова:

virsh -c qemu:///system start vm1

Теперь нужно настроить сеть на виртуальной машине. Заходим на неё по VNC и приводим файл /etc/network/interfaces к следующему виду:

auto lo

iface lo inet loopback

allow-hotplug eth0

iface eth0 inet static

address 178.xxx.xxx.177

netmask 255.255.255.192

network 178.xxx.xxx.128

broadcast 178.xxx.xxx.191

gateway 178.xxx.xxx.137

Шлюзом необходимо указать ip-адрес хост-сервера. Так же стоит прописать NS в файл /etc/resolv.conf

Теперь ваша виртуальная машина работает и доступна из сети (а в моём случае она стала доступна и из интернета).

Осталось сделать aptitude update && aptitude upgrade && aptitude install openssh-server и зайти на виртуальный сервер по SSH.

Пользуясь случаем расскажу вам, что у хостера QS.biz сдаются в аренду VDS на KVM.

KVM (Kernel-based Virtual Machine) [Мозаика системного администрирования]

KVM (Kernel-based Virtual Machine) — программное решение, обеспечивающее виртуализацию в среде Linux на платформе x86, которая поддерживает аппаратную виртуализацию на базе Intel VT (Virtualization Technology) либо AMD SVM (Secure Virtual Machine).

Программное обеспечение KVM состоит из загружаемого модуля ядра (называемого kvm.ko), предоставляющего базовый сервис виртуализации, процессорно-специфического загружаемого модуля kvm-amd.ko либо kvm-intel.ko, и компонентов пользовательского режима (модифицированного QEMU). Все компоненты программного обеспечения KVM открыты. Компонент ядра, необходимый для работы KVM, включён в основную ветку ядра Linux начиная с версии 2.6.20 (февраль 2007 года). KVM был также портирован на FreeBSD как модуль ядра. Ведётся работа по включению модификаций, необходимых для работы с KVM, в основную ветку QEMU.

Сам по себе KVM не выполняет эмуляции. Вместо этого программа, работающая в пространстве пользователя, использует интерфейс /dev/kvm для настройки адресного пространства гостя виртуальной машины, через него же эмулирует устройства ввода-вывода и видеоадаптер.

http://www.linux-kvm.org/

Debian 8:

apt-get install qemu-kvm \
                libvirt-bin \
                bridge-utils \
                virtinst

Debian 9:

apt-get install qemu-kvm \
                libvirt-clients \
                libvirt-daemon-system \
                virtinst \
                bridge-utils

  • qemu-kvm — гипервизор

  • ibvirt-clients — набор библиотек libvirt для взаимодействия с гипервизором
  • libvirt-daemon-system — демон libvirtd

  • bridge-utils — сетевые утилиты

  • virtinst — инструменты и библиотеки для управления виртуальными машинами
rights-kvm.sh
#!/bin/bash
 
path=/mnt/kvm
#chgrp libvirt-qemu $path
chown -R libvirt-qemu $path
chmod -R 600 $path
chgrp -R libvirt-qemu $path
chmod 6770 $path

MAC адреса

Используется диапазон адресов: 52:54:00:xx:xx:xx

Настройка сетевых интерфейсов

libvirt

virtinst

Список ОС:

virt-install --os-variant list

virsh

Основные команды для работы с пулами

virsh pool-define-as --name kvm --type dir --target /home/kvm
virsh pool-list --all
virsh pool-start guest_images
virsh pool-autostart guest_images

Основные команды для работы с гостевым доменом:

Список и статус доменов
virsh list
Запуск
virsh start ИМЯ_ГОСТЕВОГО_ДОМЕНА
Остановка
virsh destroy ИМЯ_ГОСТЕВОГО_ДОМЕНА
Перезагрузка
virsh reboot ИМЯ_ГОСТЕВОГО_ДОМЕНА
Удаление
virsh undefine ИМЯ_ГОСТЕВОГО_ДОМЕНА

guest disk image management system — tools

kernel-based_virtual_machine/kernel-based_virtual_machine.txt · Последние изменения: 2019-11-26 11:18 — GreyWolf

Как установить KVM-сервер на Debian 9/10 Headless Server

Виртуальная машина на основе ядра (KVM) — это модуль виртуализации для ядра Linux, который превращает его в гипервизор. Как я могу установить KVM с мостовой сетью, настроить гостевую операционную систему в качестве внутренней технологии виртуализации для неграфического сервера Debain Linux 9.x / 10.x?

Вы можете использовать KVM для запуска нескольких операционных систем, таких как Windows, * BSD, Linux, с использованием виртуальных машин. У каждой виртуальной машины есть свой частный диск, видеокарта, сетевая карта и многое другое.

Шаги по установке KVM-сервера на сервер Debian Linux 9.x / 10.x

  1. Хост-сервер, расположенный в удаленном центре обработки данных, является автономным сервером.
  2. Все команды в этом руководстве вводятся в сеансе на основе ssh.
  3. Для установки гостевой операционной системы необходим клиент vnc.
  4. В этом руководстве вы узнаете , как установить программное обеспечение KVM на сервер Debian Linux 9.x и использовать KVM для настройки вашей первой гостевой виртуальной машины.

Выполните шаги по установке KVM в Debian Linux 9.x / 10.x безголовый сервер

Шаг 1: Установите kvm

Введите следующую команду apt-get / apt:
$ sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils libguestfs-tools genisoimage virtinst libosinfo-bin

Разрешить обычному пользователю управлять виртуальной машиной

Если вы хотите, чтобы обычный / обычный пользователь мог управлять виртуальными машинами. Добавьте пользователя vivek в libvirt и libvirt-qemu с помощью команды usermod:
$ sudo adduser vivek libvirt
$ sudo adduser vivek libvirt-qemu

Обновите членство в группе с помощью команды newgrp:
$ newgrp libvirt
$ new-grp qemu

Проверьте свое членство в группе с помощью команды id:
$ id
Обратите внимание, что вам необходимо использовать следующую команду для подключения к KVM-серверу:
$ virsh --connect qemu: /// system
$ virsh - -connect qemu: /// системная команда
$ virsh --connect qemu: /// системный список --all

Шаг 2. Проверьте установку kvm на Debain.

Выполните следующую команду egrep, чтобы убедиться, что Intel VMX или AMD SVM поддерживается вашим процессором:
$ egrep --color 'vmx | svm' / proc / cpuinfo
Примеры выходных данных:

 rf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand_deadline_timer eprid_smept_smebase_save_vx f16c rdrami_flex_lahp_lm epb_lm xsave_f16c rdrand_lahf_lm xsave_f16c rdrami_lahf_lm epb_lm_pb_lmx
флаги: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebspfm_perfcddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm epb kaiser tpr_shadow vnmi flexpriority ept vpid id fsgsbase smeprat erms 900
 

Шаг 3. Настройте мостовую сеть в Debian

Я собираюсь создать мост Интерфейс br0 в качестве сетевого подключения в конфигурации гостевых виртуальных машин для интерфейса eth0:
$ sudo vi / etc / network / interfaces.d / br0
Добавьте следующее:

 ## убедитесь, что вся конфигурация, относящаяся к eth0, удалена ##
авто br0
iface br0 inet static
адрес 192.168.2.23 ## настроить / netmask / broadcast / gateway в соответствии с вашими настройками
широковещательный 192.168.2.255
маска сети 255.255.255.0
шлюз 192.168.2.254
bridge_ports eth0 # замените eth0 на ваше настоящее имя интерфейса
bridge_stp off # отключить протокол связующего дерева
        bridge_waitport 0 # без задержки до того, как порт станет доступным
        bridge_fd 0 # без задержки пересылки 

Перезапустите сетевую службу в Linux:
$ sudo systemctl restart network-manager
Чтобы увидеть текущие настройки сети для KVM, запустите:
$ sudo virsh net-list --all
Примеры выходных данных:

 Имя Состояние Автостарт Постоянный
-------------------------------------------------- --------
 по умолчанию неактивен нет да 

Вам необходимо настроить гостевой домен KVM в мостовой сети.Итак, создайте файл с именем bridge.xml, используя следующий текстовый редактор, например команду NA:
$ sudo vi /root/bridged.xml
Добавьте следующую конфигурацию:

 <сеть>
   br0 
  
  <название моста = "br0" />
 

Сохраните и закройте файл в vi / vim.
$ sudo virsh net-define --file /root/bridged.xml
$ sudo virsh net-autostart br0
$ sudo virsh net-start br0

Шаг 4. Создайте свою первую виртуальную машину с помощью установщика ISO-образа

Я собираюсь создать CentOS 7.х ВМ. Сначала возьмите последний ISO-образ CentOS 7.x:
$ cd / var / lib / libvirt / boot /
$ sudo wget https://mirrors.kernel.org/centos/7/isos/x86_64/CentOS-7- x86_64-DVD-1708.iso

Создать виртуальную машину CentOS 7

В этом примере я создаю виртуальную машину CentOS 7.x с 2 ГБ ОЗУ, 2 ядрами ЦП, 1 ником и 40 ГБ дискового пространства, введите:
$ sudo virt-install \
--virt-type = kvm \
- -name centos7 \
--ram 2048 \
--vcpus = 2 \
--os-variant = rhel7 \
--virt-type = kvm \
--hvm \
--cdrom = / var / lib / libvirt / загрузка / CentOS-7-x86_64-DVD-1708.iso \
--network = bridge = br0, model = virtio \
--graphics vnc \
--disk path = / var / lib / libvirt / images / centos7.qcow2, size = 40, bus = virtio, format = qcow2

Чтобы настроить вход vnc с другого терминала через ssh, введите:
$ sudo virsh dumpxml centos7 | grep vnc

Вы также можете использовать следующую команду:
$ sudo virsh vncdisplay centos7
Запишите значение порта (т.е.е. 5901). Вам необходимо использовать SSH-клиент для настройки туннеля и VNC-клиента для доступа к удаленному vnc-серверу. Введите следующую команду переадресации порта SSH со своего клиента / рабочего стола:
$ ssh [email protected] -L 5901: 127.0.0.1: 5901
После того, как вы установили туннель ssh, вы можете направить свой клиент VNC на свой собственный адрес 127.0.0.1 (localhost) и порт 5901 следующим образом:

Рис.01: клиент VNC для завершения установки CentOS 7.x

Вы должны увидеть экран гостевой установки CentOS Linux 7:

Рис.02: Установка CentOS 7.x на ВМ

на базе KVM
Теперь просто следуйте инструкциям на экране и установите CentOS 7. После установки нажмите кнопку перезагрузки. Удаленный сервер закрыл соединение с нашим клиентом VNC. Вы можете повторно подключиться через KVM-клиент, чтобы настроить остальную часть сервера, включая сеанс на основе SSH или брандмауэр.

Шаг 5. Используйте virt-builder для создания ВМ

Вышеупомянутый метод (virt-install) работает нормально, но если вам нужно быстро создать новые виртуальные машины, попробуйте virt-builder.

Как вывести список доступных виртуальных машин

$ virt-builder --список | подробнее
Вы можете использовать команду grep для фильтрации только виртуальных машин на основе архитектуры x86_64:
$ virt-builder --list | grep x86_64
Примеры выходных данных:

 opensuse-13.1 x86_64 openSUSE 13.1
opensuse-13.2 x86_64 openSUSE 13.2
opensuse-42.1 x86_64 openSUSE Leap 42.1
opensuse-перекати-поле x86_64 openSUSE-перекати-поле
centos-6 x86_64 CentOS 6.6
CentOS-7.0 x86_64 CentOS 7.0
CentOS-7.1 x86_64 CentOS 7.1
CentOS-7.2 x86_64 CentOS 7.2
CentOS-7.3 x86_64 CentOS 7.3
CentOS-7.4 x86_64 CentOS 7.4
cirros-0.3.1 x86_64 CirrOS 0.3.1
cirros-0.3.5 x86_64 CirrOS 0.3.5
debian-6 x86_64 Debian 6 (сжатие)
debian-7 x86_64 Debian 7 (хриплый)
debian-8 x86_64 Debian 8 (Джесси)
debian-9 x86_64 Debian 9 (растяжение)
Fedora-18 x86_64 Fedora® 18
Fedora-19 x86_64 Fedora® 19
Fedora-20 x86_64 Fedora® 20
fedora-21 x86_64 Сервер Fedora® 21
fedora-22 x86_64 Сервер Fedora® 22
fedora-23 x86_64 Сервер Fedora® 23
fedora-24 x86_64 Сервер Fedora® 24
fedora-25 x86_64 Сервер Fedora® 25
fedora-26 x86_64 Сервер Fedora® 26
fedora-27 x86_64 Сервер Fedora® 27
freebsd-11.1 x86_64 FreeBSD 11.1
Scientificlinux-6 x86_64 Scientific Linux 6.5
ubuntu-10.04 x86_64 Ubuntu 10.04 (Lucid)
ubuntu-12.04 x86_64 Ubuntu 12.04 (точный)
ubuntu-14.04 x86_64 Ubuntu 14.04 (надежный)
ubuntu-16.04 x86_64 Ubuntu 16.04 (Xenial) 

Чтобы увидеть дополнительные примечания для любого запуска ОС:
$ virt-builder --notes ubuntu-16.04
$ virt-builder --notes debian-9

Примеры выходных данных:

 Debian 9 (растянуть)

Это минимальная установка Debian.
Этот образ не содержит ключей хоста SSH. Для их восстановления используйте:

    --firstboot-command "dpkg-reconfigure openssh-server"

Этот шаблон был сгенерирован скриптом в дереве исходных текстов libguestfs:
    строитель / шаблоны / make-template.ml
Связанные файлы, используемые для подготовки этого шаблона, можно найти в
тот же каталог. 

Создать виртуальную машину Debian 9.x

Создайте виртуальную машину Debian 9 с 10 ГБ дискового пространства, 2 ГБ оперативной памяти, 2 виртуальных процессора и случайным паролем для учетной записи root, запустите:
$ sudo virt-builder debian-9 \
--size = 10G \
--format qcow2 -o / var / lib / libvirt / images / debian9-vm1.qcow2 \
--hostname debain9-vm1 \
--network \
--timezone Asia / Kolkata

Наконец, импортируйте образ с помощью команды virt-install:
$ sudo virt-install --import --name debian9-vm1 \
--ram 2048 \
--vcpu 2 \
- путь к диску = / var / lib / libvirt / images / debian9-vm1.qcow2, format = qcow2 \
--os-option debian9 \
--network = bridge = br0, model = virtio \
--noautoconsole

Примеры выходных данных:

 Запуск установки ...
Создание домена...
Создание домена завершено. 

Вы можете войти в свою виртуальную машину, используя пароль x0E4iZ8sHjA6ekb6 для учетной записи root:
$ sudo virsh list --all
$ virsh console debian9-vm1

Необходимо отключить учетную запись root для сеанса ssh и создать ключи ssh для вашей виртуальной машины. Войдите в систему, как указано выше:
# dpkg-reconfigure openssh-server
# useradd -r -m -d / home / vivek -s / bin / bash vivek
# passwd vivek
# systemctl enable ssh
### [Отключить пользователя root вход при использовании ssh] ###
# echo 'PermitRootLogin no' >> / etc / ssh / sshd_config
# systemctl restart ssh
# ip as

Убедитесь, что вы можете войти, используя IP-адрес для пользователя vivek, и используйте 'su - 'чтобы стать пользователем root:
$ ssh vivek @ 192.168.2.132
$ су -

Полезные команды

Давайте посмотрим на некоторые полезные команды.

Найдите список допустимых вариантов ОС

$ osinfo-query os | меньше
$ osinfo-query os | grep debian
$ osinfo-query os | grep freebsd

Список работающих vms / доменов

$ sudo virsh list

Shutodwn vm / домен под названием debian9-vm1

$ sudo virsh выключение debian9-vm1

Запустите vm / домен под названием debian9-vm1

$ sudo virsh start debian9-vm1

Приостановить vm / домен с именем debian9-vm1

$ sudo virsh приостановить debian9-vm1

Перезагрузка (мягкая и безопасная перезагрузка) vm / домена с именем debian9-vm1

$ sudo virsh перезагрузка debian9-vm1

Сброс (аппаратный сброс / небезопасно) vm / домена с именем debian9-vm1

$ sudo virsh сбросить debian9-vm1

Удалить / удалить vm / домен с именем debian9-vm1

$ sudo virsh undefine debian9-vm1
$ sudo virsh destroy debian9-vm1

Чтобы увидеть полный список команд virsh, введите
$ virsh help | меньше
$ вирш справка | grep перезагрузка

Настройка KVM-сервера Debian 9

Из этого туториала Вы узнаете, как настроить сервер Debian 9 в качестве узла KVM, а не для настройки KVM в Ubuntu 16.04.

Информация о версии

  • libvirtd (библиотека libvirt) 3.0.0
  • Эмулятор QEMU версии 2.8.1 (Debian 1: 2.8 + dfsg-6 + deb9u2)

Ступени

Выполните команду ниже, чтобы проверить, поддерживает ли система KVM. Вы должны увидеть число больше 0.

  egrep -c '(svm | vmx)' / proc / cpuinfo
  

Установите большинство необходимых пакетов.

  sudo apt-get install \
qemu-kvm мост-утилит libvirt-daemon \
libvirt-демон-система
  

Пакет Virtinst

Теперь мы хотим установить пакет virtinst, чтобы можно было установить гостей с помощью команды virtinstall.
К сожалению, здесь есть рекомендация пакета virt-viewer, для которого потребуется много пакетов на основе графического интерфейса.
Таким образом, в зависимости от того, используете ли вы автономный или настольный KVM-хост, выберите один из следующих двух вариантов:

Хосты KVM без головы:

  sudo apt-get install --no-install-рекомендует virtinst -y

# Теперь устанавливаем его рекомендации, кроме virt-viewer
sudo apt-get install \
libosinfo-l10n python-gi-cairo python-setuptools python-криптография \
python-idna python-openssl python-socks python-ntlm \
python-криптография, python-idna, python-ipaddress, python-openssl -y
  

Настольные KVM-хосты:
Если у вашего KVM-хоста уже есть графический интерфейс, вы, вероятно, захотите просто пойти дальше и установить все рекомендации, которые будут включать virt-viewer.

  sudo apt-get install virtinst -y
  

Добавить пользователя в Libvirt

Добавьте своего пользователя в группу libvirtd, чтобы вы могли запускать команды управления без sudo.

  sudo adduser $ ПОЛЬЗОВАТЕЛЬ libvirt
  

Убедитесь, что все в порядке, запустив:

  sudo virsh -c qemu: /// список систем
  

Вы должны увидеть следующий результат:

  Идентификатор Имя Состояние
-------------------------------------------------- -
  

Настройка сети по умолчанию

Я почти уверен, что Debian 9 не установит автоматически или, возможно, не запустит автоматически сеть по умолчанию.Вы можете создать его.

Последнее обновление: 9 мая 2020 г.
Первая публикация: 16 августа 2018 г.

Debian 9: установить KVM для виртуализации

Virt-manager - это интерфейсный инструмент с графическим интерфейсом для libvirt. Создайте виртуальную машину с помощью virt-manager.

$ virt-manager
 

Нажмите «Новая виртуальная машина» в левом верхнем углу.

Выберите установочный носитель. В этой статье используется файл debian-9.0.0-amd64-netinst.iso в каталоге iso.

Нажмите кнопку «Обзор» в разделе «Использовать ISO-образ».

Каталог iso пока не найден.Щелкните значок «+», чтобы добавить каталог iso. Введите имя пула хранения и выберите «dir: Filesystem Directory».

Путь входного пула хранения.

Каталог iso можно найти. Выберите debian-9.0.0-amd64-netinst.iso.

дебиан-9.Выбран 0.0-amd64-netinst.iso. Выберите тип ОС для расчета объема памяти. После этого размер памяти можно изменить.

Введите номер ядра и размер памяти.

Создайте хранилище.

Выберите сеть.«Виртуальная сеть« по умолчанию »: NAT» может быть доступна с другой машины, а «Виртуальная сеть« по умолчанию »: NAT» недоступна. Обе сети могут получить доступ к другой машине.

Начинается установка ОС на виртуальную машину.

Как установить и использовать QEMU в Debian 9 - Linux Подсказка

QEMU - это технология быстрой эмуляции процессора. QEMU не зависит от каких-либо аппаратных функций.Для запуска не требуются какие-либо исправления ядра. Так что бегать безопасно и легко.

QEMU выполняет полную эмуляцию системы. Итак, QEMU может запускать программы, написанные для другой архитектуры, на вашей машине Debian 9. Например, программы, написанные для процессоров на базе ARM, можно запускать на процессорах x86 с помощью QEMU.

В этой статье я покажу вам, как установить и использовать QEMU в Debian 9 Stretch. Давайте начнем.

QEMU

можно комбинировать с KVM для использования функций аппаратной виртуализации вашего ЦП.QEMU + KVM обеспечит вам почти полную производительность оборудования.

Функция аппаратной виртуализации отключена по умолчанию на процессорах AMD и Intel. Поэтому вам придется включить их вручную, если вы действительно хотите его использовать.

Я рекомендую вам включить аппаратную виртуализацию. Если вы этого не сделаете, QEMU будет работать очень медленно.

Включение аппаратной виртуализации:

Если у вас процессор Intel, то все, что вам нужно сделать, это включить VT-x или VT-d в BIOS вашей материнской платы.

Для ЦП AMD необходимо включить AMD-v в BIOS материнской платы.

Если ваш ЦП поддерживает аппаратную виртуализацию, и вы включили ее в BIOS своего компьютера, то вы можете проверить, включена ли виртуализация на вашем компьютере Debian 9 Stretch, с помощью следующей команды:

Как видите, виртуализация оборудования включена.

Установка QEMU и KVM:

QEMU не установлен по умолчанию в Debian 9 Stretch.Но он доступен в официальном репозитории пакетов Debian 9 Stretch. Так что вы легко сможете его установить.

Сначала обновите кеш репозитория пакетов APT с помощью следующей команды:

Кэш репозитория пакетов APT должен быть обновлен.

Теперь установите QEMU с помощью следующей команды:

$ sudo apt install qemu qemu-kvm

Теперь нажмите y , а затем нажмите , чтобы продолжить.

Необходимо установить

KVM и QEMU.

Использование QEMU и KVM:

В этом разделе я покажу вам, как установить Alpine Linux на виртуальную машину QEMU + KVM.

Создание каталога ВМ:

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

Создайте каталог виртуальной машины с помощью следующей команды:

Теперь перейдите в каталог виртуальной машины с помощью следующей команды:

Загрузка образа ISO Alpine Linux:

Теперь загрузите стандартный ISO-образ Alpine Linux с https: // alpinelinux.org / downloads / в каталог вашей виртуальной машины.

На момент написания этой статьи образ ISO alpine-standard-3.8.0-x86_64.iso

Создание образа QEMU:

Теперь вам нужно создать образ QEMU. Это виртуальный жесткий диск, на который вы установите Alpine Linux. QEMU имеет собственную команду для создания образа QEMU.

Я собираюсь создать образ QEMU alpine.img и выделить для него 8 ГБ дискового пространства с помощью следующей команды:

$ qemu-img create -f qcow2 alpine.img8G

ПРИМЕЧАНИЕ: Вы можете присвоить образу имя, отличное от alpine.img , и установить для размера диска значение, отличное от 8G (8 гигабайт).

Как видите, создается alpine.img .

Запуск установщика Alpine:

Теперь вы можете запустить эмуляцию QEMU с помощью KVM и установить Alpine Linux на образ alpine.img .

Я собираюсь использовать сценарий оболочки install.sh , чтобы начать установку, поскольку я считаю, что это упрощает понимание и изменение команды позже.

Теперь выполните следующую команду, чтобы создать install.sh :

И введите в него следующие строки:

Теперь сохраните файл с + x , затем нажмите y , а затем нажмите .

ПРИМЕЧАНИЕ: Здесь -m 512 означает, что для виртуальной машины будет выделено 512 МБ памяти (ОЗУ).

Теперь сделайте скрипт install.sh исполняемым с помощью следующей команды:

Теперь запустите сценарий установки с:

Как видите, установщик Alpine загрузился.

Теперь введите root и нажмите . Вы должны войти в систему.

Теперь запустите установщик с помощью следующей команды:

Теперь введите свою раскладку клавиатуры (я выбрал us ) и нажмите .

Выберите вариант (я выбрал us ) и нажмите .

Теперь введите свое имя хоста и нажмите .

Теперь выберите свой сетевой интерфейс. По умолчанию это eth0 , что правильно. Поэтому я нажал , чтобы выбрать значение по умолчанию.

Теперь введите IP-адрес вашего сетевого интерфейса. Я выберу IP-адрес по умолчанию: dhcp .По завершении нажмите .

Я выбрал dhcp , поэтому нажал .

Теперь введите новый пароль root и нажмите .

Теперь введите пароль еще раз и нажмите .

Теперь пора выбрать часовой пояс. По умолчанию UTC , но вы можете перечислить другие поддерживаемые часовые пояса, нажав ? и .Я выбираю значение по умолчанию.

Нажмите .

Нажмите .

Нажмите .

Введите sda и нажмите .

Введите sys и нажмите .

Теперь введите y и нажмите .

Устанавливается

Alpine…

Установлен

Alpine Linux.

Загрузка Alpine с alpine.img Образ QEMU:

Теперь создайте другой сценарий оболочки start.sh в каталоге виртуальной машины с помощью следующей команды:

Теперь добавьте к нему следующие строки и сохраните его.

Сделайте скрипт start.sh исполняемым следующим образом:

Наконец, вы можете загрузить свою недавно установленную ОС Alpine с QEMU KVM следующим образом:

Как видите, Alpine Linux загрузился из образа QEMU.

Эмуляция других архитектур с помощью QEMU:

QEMU поддерживает множество архитектур ЦП, как вы можете видеть на скриншоте ниже.

В предыдущих примерах я использовал команду kvm . На самом деле это аппаратная виртуализация qemu-system-x86_64 .

Вы можете заменить все команды kvm на команду qemu-system-x86_64 в предыдущих примерах, и она все равно будет работать.Но он будет работать медленно, так как не будет использовать аппаратную виртуализацию.

Вот как вы устанавливаете и используете QEMU в Debian 9 Stretch. Спасибо, что прочитали эту статью.

Как запустить Debian на виртуальной машине QEMU KVM с использованием Ubuntu или Debian

Виртуальная машина - это часть программного обеспечения, которое имитирует реальную операционную систему. Возможность запускать Debian на виртуальной машине - отличный способ поиграть с ним, не беспокоясь о том, что это повлияет на вашу родную систему.В этой статье будет обсуждаться, как установить Debian на виртуальную машину QEMU KVM с использованием Ubuntu или Debian.

Изображение из Википедии

Шаг 0. Убедитесь, что ваш ЦП поддерживает виртуализацию

(Если вы уже знаете, что ваш ЦП поддерживает виртуализацию и как ее включить, вы можете пропустить этот шаг.)

Чтобы проверить, поддерживает ли ваш ЦП виртуализацию, вы можете ввести любую из следующих команд:

lscpu

egrep --color = auto 'vmx | svm | 0xc0f' / proc / cpuinfo

Вы будете искать вывод, например, vmx, svm или виртуализацию.vmx предназначен для Intel, а svm - для AMD

. Вот результат, который я получил на моем компьютере после ввода lscpu.

 lscpu
Архитектура: x86_64
Операционные режимы ЦП: 32-разрядный, 64-разрядный
Порядок байтов: Little Endian
ЦП: 8
Он-лайн список ЦП: 0-7
Потоков на ядро: 2
Ядра на сокет: 4
Розетка (и): 1
NUMA узлов: 1
ID поставщика: GenuineIntel
Семейство процессоров: 6
Модель: 60
Название модели: Intel (R) Core (TM) i7-4710HQ CPU @ 2.50 ГГц
Шаг: 3
Процессор МГц: 1272,125
Максимальная частота процессора: 3500.0000
CPU min MHz: 800.0000
BogoMIPS: 4988,38
Виртуализация: VT-x
Кэш L1d: 32 КБ
Кэш L1i: 32 КБ
Кэш L2: 256 КБ
Кэш L3: 6144 КБ
NUMA node0 ЦП: 0-7
Флаги: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tscfm_perfcddddtcp lm constant_tscfm_perfcdddddddddddddddddddddddddddddddddddddcpfmcddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddbx есть tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm epb tpr_shadow vnmi flexpriority eptust vpc_shadow_shadow vnmi flexpriority eptust vpc_dm_sadgsbid_sme1
 

Если вы получите такой вывод: VT-x и или / vmx, как на моем компьютере, то вы узнаете, что ваша ОС поддерживает виртуализацию.Это будет аналогично, если ваш компьютер использует процессор AMD.

Из ранее упомянутой команды egrep, если вы получаете вывод в цвете, например, при получении vmx, то вы узнаете, что ваша ОС поддерживает виртуализацию.

Чтобы включить виртуализацию, вам, вероятно, потребуется открыть BIOS и явно разрешить виртуализацию.

Вы можете узнать больше о включении виртуализации с kvm ниже
https://wiki.archlinux.org/index.php/KVM

Шаг 1: Установите QEMU и KVM

Теперь мы просто устанавливаем qemu и qemu-kvm.Откройте терминал и введите:

sudo apt-get install qemu qemu-kvm

Шаг 2. Получите файл ISO Debian

Загрузите последнюю версию ISO Debian или используйте уже имеющийся. В настоящее время здесь находится последняя версия Debian. Поскольку у меня довольно новый компьютер с процессором Intel, я скачаю версию amd64, которая называется debian-9.6.0-amd64-xfce-CD-1.iso

Шаг 3. Создайте установку для QEMU и KVM

. где мы фактически настраиваем kvm для эмуляции Debian.

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

cd ~ /
mkdir debian

Внутри папки debian мы поместим наш файл ISO и наши файлы qemu / kvm.

Найдите место, куда вы загрузили ISO-файл Debian, и поместите его в только что созданную папку ~ / debian.Я предполагаю, что вы загрузили его в папку ~ / Downloads.

cd ~ / Downloads /
mv debian-9.6.0-amd64-xfce-CD-1.iso ~ / debian /

Шаг 4. Перейдите в каталог ~ / debian и создайте файл образа QEMU

Теперь, когда у нас есть ISO-файл Debian и папка ~ / debian, мы фактически приступим к работе с QEMU. Следующее, что мы сделаем
, - это создадим файл образа QEMU. Это то, что будет содержать вашу виртуальную машину. По сути, это будет похоже на виртуальный жесткий диск.

Команда, которую мы будем использовать, называется qemu-img
. С помощью этой команды мы создадим файл образа с именем virtualdebian.img и предоставим ему 30 ГБ места на жестком диске. Вы можете изменить имя и количество места, которое вы ему предоставите.

qemu-img create -f qcow2 virtualdebian.img 30G

Этот шаг должен занять всего несколько секунд.

Шаг 5: Эмуляция открытия ISO-файла Debian как CD-ROM / DVD-привода и установка Debian на виртуальную машину

Это этап, который займет больше всего времени и на котором вы фактически установите Debian на виртуальную машину.На этом этапе очень важно правильно ввести команду, иначе вы можете потратить часы на отладку. Вы можете просто скопировать и вставить команду, которую я покажу вам ниже. Мы будем использовать команду kvm с множеством параметров. Первая часть команды, kvm -hda virtualdebian.img, сообщает kvm, что виртуальный образ - это virtualdebian.img, который мы создали ранее. Параметр -m 2048 сообщает kvm, что мы предоставляем ему 2 ГБ ОЗУ. Параметр -soundhw all делает все звуки доступными на виртуальной машине.Вы можете прочитать руководство kvm, если хотите узнать о других вариантах. Теперь просто скопируйте и вставьте в свой терминал следующее.

kvm -hda virtualdebian.img -cdrom debian-9.6.0-amd64-xfce-CD-1.iso -m 2048 -net nic -net user -soundhw all

Обратите внимание, вам нужно было добавить sudo на указанную выше команду, если она жалуется на разрешения.

Если все пойдет хорошо, Debian должен загрузиться, как если бы вы загружали Debian с настоящего DVD или CD на своем компьютере.Теперь вы установите Debian так, как если бы вы устанавливали его на свой компьютер в качестве основной ОС, хотя на самом деле вы будете устанавливать его на виртуальной машине.

После завершения установки Debian, чтобы выключить виртуальную машину, просто выключите виртуальную машину Debian, как если бы это была ваша основная ОС (но не выключайте свой основной компьютер). Вам останется только выключить виртуальную машину.

Шаг 6. Запускайте виртуальную машину Debian так часто, как хотите.

Теперь вся тяжелая работа сделана.Вы установили Debian в файл образа. Теперь, с этого момента, все, что вам нужно сделать для запуска вашей виртуальной машины Debian, - это выполнить следующую команду.
kvm -soundhw all -m 2048 -hda ~ / debian / virtualdebian.img

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

 Не удалось получить доступ к модулю ядра KVM: доступ запрещен
qemu-system-x86_64: не удалось инициализировать KVM: в доступе отказано
 

, тогда вам нужно будет добавить sudo к указанной выше команде kvm.

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

Если вы устали от использования виртуальной машины или думаете, что допустили ошибку, вы всегда можете повторить описанные выше шаги. Вы можете удалить файл virtualdebian.img, а затем создать новый, выполнив все остальные шаги.

Разное

Фактически вы можете заменить команду kvm на qemu-system-x86_64 , но не следует этого делать, если kvm доступен.QEMU НАМНОГО медленнее, чем при использовании KVM, и ваш процессор будет работать намного тяжелее при использовании QEMU. Итак, по возможности убедитесь, что вы используете KVM.

Вам понравилась эта статья? Есть что добавить? Давайте обсудим это в комментариях ниже.

pin / debian-vm-install: автоматическая установка виртуальной машины Debian с помощью virt-install и press.cfg

Хотя Debian Stretch еще не выпущен, скрипт использует daily-images .
Если вы хотите использовать Debian Jessie (например, текущую стабильную версию), пожалуйста, проверьте
выпуск v8.0 или обновить DIST_URL

Простой сценарий, использующий virt-install и настраивающий программу установки Debian
для автоматической установки и индивидуальной настройки с использованием preseed
config, чтобы создать недавно установленную гостевую систему Debian KVM.

  Использование: ./install.sh  [MAC_ADDRESS]

  GUEST_NAME используется как гостевое имя хоста, имя виртуальной машины и имя файла образа
  MAC_ADDRESS позволяет использовать определенный MAC в сети, это полезно
                когда DHCP-сервер ожидает, что у вашего гостя будет предопределенный MAC
  

Гостевая ОС - это минимальная установка Debian без графического интерфейса, настроенная с последовательной консолью
для возможности virsh console и сервера OpenSSH с вашим SSH
ключ и / или пароль предварительно настроены.

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

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

Предварительные требования

  • virt-install: apt-get install virtinst
  • KVM / qemu: apt-get install qemu-kvm libvirt-daemon # что-то еще?

Что нужно проверить перед первым использованием

  • Установите ваше имя для входа и полное имя в поле preseed.cfg , обновите свое имя GitHub
    в install.sh , чтобы установить ваш SSH-ключ для аутентификации гостем.
    Если вы хотите использовать другой SSH-ключ, а не тот, который есть на GitHub, просто введите
    authorized_keys с по предварительно запрограммируют каталог и удалите команду wget , которая
    получает ключ из GitHub.
    Обновите свое имя для входа в postinst.sh , где установлен ключ SSH.
  • Стоит подумать о включении парольной аутентификации в preseed.cfg
    по крайней мере, во время первого запуска, чтобы вы могли virsh console в случае
    сетевое соединение в гостевой системе не использует DHCP или IP гостя
    неясно.
  • Проверьте размер RAM и размер диска для гостя в аргументах virst-install in
    install.sh и при необходимости измените их.
  • Добавьте apt-get install или что угодно в postinst.sh
    и любые файлы конфигурации, которые вы хотите добавить гостю в postinst
    каталог.

Конфигурация сети

Сценарий

лучше всего работает с мостовой сетью, когда гости могут использовать DHCP.
сервер. Если вам нужно что-то еще, замените br0 в аргументах на
virt-install в install.sh .

Пример конфигурации сети в / etc / network / interfaces :

  авто lo
iface lo inet loopback

auto eth0 # замените eth0 на ваше настоящее имя интерфейса
iface eth0 inet руководство

авто br0
iface br0 inet dhcp
        bridge_ports eth0
        bridge_stp выкл.
        bridge_fd 0
        bridge_maxwait 0
  

Подробнее

libvirt + QEMU + KVM + Debian - wdocs 1.0 документация

Проверить доступ к виртуализации ЦП:

 Судо Вирт-хост-проверка

egrep -c '(vmx | svm)' / proc / cpuinfo

sudo apt-get install cpu-checker
sudo kvm-ok
 

Проверить список источников Debian sources.list :

 deb http://ftp.de.debian.org/debian jessie main non-free
deb-src http://ftp.de.debian.org/debian jessie main несвободный
 

Освободить неиспользуемое пространство в файле-образе qcow2:

 # нулевая заливка гостя
dd if = / dev / zero of = / some / file
rm / некоторые / файл

# выключить ВМ

# на хосте
qemu-img convert -O qcow2 original_image.qcow2 deduplicated_image.qcow2
 

qemu-img

Изображения и снимки - http://azertech.net/content/kvm-qemu-qcow2-qemu-img-and-snapshots

qemu-img инструмент:

 # Показать информацию (размер, резервные файлы, снимки)
qemu-img info 

# Создайте простой файл изображения QCOW2
qemu-img create -f qcow2   g

# Создать образ QCOW2, связанный с базовым образом
qemu-img create -b <базовый_образ> -f qcow2 -l <новое_образ>

# Список снимков
qemu-img snapshot -l <имя_имя>

# Создать снимок
qemu-img snapshot -c <имя-снимка> <имя-образа>

# Применить снимок
qemu-img snapshot -a <имя-снимка> <имя-изображения>

# Удалить снимок
qemu-img snapshot -d <имя-снимка> <имя-изображения>

# Клонировать изображение
qemu-img convert -p -f qcow2  -O qcow2 
 

Вложенная виртуализация

Проверка включена:

 cat / sys / module / kvm_intel / parameters / вложенный
# ДА или НЕТ
 

Включить вложенный модуль на хосте

 sudo sh -c "echo 'options kvm-intel nested = Y'> / etc / modprobe.d / kvm-intel.conf "

# перезагружаем или перезагружаем модуль ядра
modprobe -r kvm_intel
modprobe kvm_intel
 

Конфигурация в virt-manager

Убедитесь, что ваша виртуальная машина выключена. Откройте virt-manager, перейдите на страницу сведений о виртуальной машине для этой виртуальной машины. Щелкните на странице "Процессор". В разделе «Конфигурация» есть две опции: либо введите host-passthrough into to Model, либо установите флажок Copy host CPU configuration (который заполняет значение модели хоста в поле Model). Щелкните Применить. Разница между этими двумя значениями сложна, некоторые подробности указаны в ошибке 1055002.Для вложенного virt вы, вероятно, захотите использовать сквозную передачу хоста, пока не будут решены проблемы с моделью хоста. Однако имейте в виду, что сквозная передача хоста не рекомендуется для общего использования, только для вложенных целей.

Установите KVM, libvirt

 sudo apt-get update
sudo apt-get install qemu-kvm libvirt-bin qemu-utils
# adduser root libvirt
# adduser lee libvirt
 
 / etc / libvirt / # конфиги
/ etc / libvirt / storage / # конфигурации хранилища
/ var / lib / libvirt / # изображения, снимки и т. д.

Либвирт

/var/lib/libvirt/dnsmasq/virbr0.status - MAC / IP / имя хоста доменов

Domain.xml :

 #
# Перенаправление порта на машину
#

<тип домена = 'kvm' xmlns: qemu = 'http: //libvirt.org/schemas/domain/qemu/1.0'>
...
 -> 
...

   
   


#
# Пользовательский загрузчик ::
#


    <загрузчик readonly = 'yes' type = 'pflash'> / path_to / OVMF_CODE-pure-efi.fd 
     /path_to/fedora22_VARS.fd 


#
# Сеть
#


   

 

Виртуальный просмотрщик

 # подключиться через VNC
virt-viewer --connect qemu + ssh: // <пользователь> @ <хост> / system <домен>
 

Вирш CMD

Снимков:

 # получить список снимков
список моментальных снимков virsh <домен>

# получить информацию о снимке
virsh snapshot-info --domain <домен> --snapshotname <снимок>

# создать снимок
virsh snapshot-create-as <домен> --name  --description 

# удалить снимок
virsh snapshot-delete --domain <домен> --snapshotname 

# вернуться к снимку
virsh snapshot-revert <домен> --snapshotname 
 

Управление доменами:

 # определить домен из XML (без запуска)
virsh define <файл.xml>

# undefine domain из XML
virsh undefine <домен>
virsh undefine --nvram  # также удалить nvram
virsh undefine --remove-all-storage  # также удаляет хранилища

# показать список доменов
    virsh list # запускать домены
    virsh list --all # все домены

# генерировать xml из домена
    virsh dumpxml <домен>> <домен> .xml

# создать домен и запустить ВМ
    virsh create 

# принудительно выключить ВМ
    вирш уничтожить алису

# выключить ВМ
    выключение virsh <домен>

# приостановить / возобновить ВМ
    Вирш приостановить Алису
    virsh резюме Алиса

# добавляем домен в автозапуск при запуске хоста
    virsh autostart <домен>

# получить информацию о домене
    virsh dominfo <домен>

    # изменить домен xml
virsh edit <домен>

# получить VNC порт домена
virsh vncdisplay <домен>
 

Управление пулом:

 # показать список пулов (хранилищ)
    virsh pool-list # активные опросы
virsh pool-list --all # все пулы

    virsh pool-define-as  dir --target / etc / libvirt / images / # создать пул
    virsh pool-autostart  # добавить пул в автозапуск
    virsh pool-start  # запуск пула

virsh pool-destroy <бассейн>
virsh pool-undefine <пул>
 

Клонирование:

 virt-clone -o <от_домена> -n <к_домену> --auto-clone --original-xml <от_домена_xml>
 

Сеть:

 # показать все сети
список сетей virsh

# получить информацию о сети
virsh net-info <сеть>

# вывести информацию об аренде для данной сети
net-dhcp-leases <сеть>

# распечатать сети домена (MAC, тип и т. д.)
virsh domiflist <домен>
 

Конфигурация моста

 sudo apt-get update
sudo apt-get dist-upgrade

# установить драйверы
sudo apt-get install firmware-realtek firmware-linux

sudo apt-get install bridge-utils

нано /etc/sysctl.conf
        net.ipv4.ip_forward = 1

Создать мост ::

    sudo brctl addbr br0
 

Конфигурация сети / etc / network / interfaces :

 авто лоу
iface lo inet loopback

авто eth2
iface eth2 inet руководство

авто br0
iface br0 inet static
адрес
netmask <маска>
шлюз
DNS-серверы
bridge_ports eth2
bridge_stp выкл.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *