Глава 5. Сетевая среда и система хранения

{Прим. пер.: рекомендуем сразу обращаться к нашему переводу полностью переработанного Ведрэном Дэйкинчем 2 издания, вышедшего в октябре 2020 Полного руководства Виртуализации KVM}

Содержание

Глава 5. Сетевая среда и система хранения
Настройка виртуальной сети
Настройка виртуальной сети при помощи libvirt
Изолированная виртуальная сеть
Виртуальная сеть с маршрутизатором
Изменение виртуальной сети
Виртуальная сеть с NAT
Виртуальная сеть с мостом
MacVTap
Проброс PCI
Это всё о хранилище!
Работа с неуправляемым хранилищем
Создание образа диска и подключение его к гостю
Получение информации образа
Подключение диска при помощи virt-manager
Подключение диска при помощи virsh
Работа с управляемым хранилищем
Консоль управления хранилищем
Создание пулов хранения
Каталог файловой системы, поддерживаемый пулом хранения
Группа томов LVM, поддерживаемый пулом хранения
iSCSI, поддерживаемый пулом хранения
Создание библиотеки образов ISO
Удаление пула хранения
Удаление пула хранения с использованием virt-manager
Удаление пула хранения с использованием virsh
Создание томов хранения
Создание томов при помощи команды virsh
Удаление тома при помощи команды virsh
Выводы

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

  • Физическая: Инфраструктуры сети и хранения, которые строятся с помощью системы хоста для предоставления потребностей в сетях и хранении ваших виртуальных машин. В случае сетевых сред, она включает в себя компоненты 2 и 3 уровня вашей сетевой среды, программный мост, правила iptables и тому подобное. В случае системы хранения ,она содержит устройства хранения для предоставления хранилища гипервизору (SAN, iSCSI и тому подобные), LVM, различные файловые системы, NFS и так далее.

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

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

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

  • Создание моста Linux

  • Что такое устройства TUN и TAP

  • Различные параметры связи доступные для создания пулов виртуального хранения ВМ KVM

Настройка виртуальной сети

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

Главным компонентом стевой настройки libvirt является коммутатор виртуальной сети, также называемый мостом (bridge). Вы можете представлять себе мост как физический коммутатор. В реальном коммутаторе присутствует ограниченное количество физических портов для подключения ваших серверов. Здесь же, в мосту Linux, имеется в наличии неограниченное число виртуальных портов, к которым подключаются интерфейсы виртуальных машин. Аналогично физическому коммутатору, мост изучает MAC адреса из поступающих в него пакетов и сохраняет эти MAC адресав своей MAC таблице. Решения о транспортировке такого пакета (кадров) принимается на основании того MAC адреса, который был приобретён и сохранён в данной MAC таблице.

Мы упомянули о ваших интерфейсах, подключённых к портам моста. Эти интерфейсы являются особыми сетевыми устройствами, называемыми устройствами TAP. Если вы стараетесь представлять их в физических сетевых терминах, рассматривайте устройства TAP как сетевые кабели, которые переносят кадры Ethernet между виртуальной машиной и мостом. Такое устройство TAP является частью реализации TUN/ TAP, доступной в рамках вашего ядра Linux.

[Замечание]Замечание

TUN, являющееся сокращением для "tunnel", эмулирует устройство сетевого уровня и работает на пакетов 3 уровня эталонной модели OSI, например, в качестве пакетов IP. TAP (а именно, network tap, сетевой отвод) эмулирует уровень соединения устройства и работает на уровне пакетов 2 уровня эталонной модели OSI, например, в качестве кадров Ethernet. TUN применяется для маршрутизации, а TAP используется при создании сетевого моста.

Перед тем как мы перейдём к следующей теме, мы создадим мост и затем добавим к нему устройство TAP.

Убедитесь, что модуль моста загружен в ваше ядро. Если он не загружен, для загрузки данного модуля воспользуйтесь modprobe bridge:


# lsmod | grep bridge
bridge                114688  1 ebtable_broute
 	   

Для создания моста с именем tester выполните следующую команду:


# brctl addbr tester
 	   
[Замечание]Замечание

Команда brctl предоставляется пакетом bridge-utils.

Давайте убедимся что мост создан:


# brctl show
bridge name    bridge id  STP enabled interfaces
tester         8000.460a80dd627d    no
 	   

Ваша команда # brctl show отобразит перечень всех доступных на вашем сервере мостов, сопровождаемый некоторой основной информацией, такой как идентификатор вашего моста, состояние STP (Spanning Tree Protocol), а также подключённых к нему интерфейсов. В нашем случае мост tester не имеет никаких подключённых к его виртуальным портам интерфейсов.

Мост Linux также будет отображён в качестве сетевого устройства. Чтобы просмотреть подробности вашей сетевой среды для конкретного моста tester воспользуйтесь командой ip:


# ip link show tester
6: tester: <BROADCAST,MULTICAST>mtu 1500 qdiscnoop state DOWN mode
DEFAULT group default link/ether 26:84:f2:f8:09:e0 brdff:ff:ff:ff:ff:ff
 	   

Вы также можете применить для проверки и настройки сетевых установок моста Linux ifconfig; ifconfig достаточно просто читать и понимать, однако она не настолько богата свойствами, как команда ip:


tester: flags=4098<BROADCAST,MULTICAST>mtu 1500
ether26:84:f2:f8:09:e0txqueuelen 1000 (Ethernet)
        RX packets 0 bytes 0 (0.0 B)
        RX errors 0 dropped 0 overruns 0 frame 0
        TX packets 0 bytes 0 (0.0 B)
        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
 	   

Теперь наш мост Linux tester готов. Давайте создадим и добавим к нему устройство TAP.

Для начала убедимся, что модуль устройства TUN/ TAP загружен в ваше ядро. Если нет, вы уже знаете это упражнение:


# lsmod | greptun
tun 28672 1
 	   

Для создания устройства tap с именем vm-vnic выполните следующую команду:


# ip tuntap add dev vm-vnic mode tap
# ip link show vm-vnic
7: vm-vnic: <BROADCAST,MULTICAST>mtu 1500 qdiscnoop state DOWN 
mode DEFAULT group default qlen 500 link/ether 46:0a:80:dd:62:7d
brdff:ff:ff:ff:ff:ff
 	   

Теперь в нашем распоряжении имеются мост с именем tester и устройство tap с именем vm-vnic. Давайте добавим vm-vnic к tester.


# brctl addif tester vm-vnic
# brctl show
bridge name  bridge id    STP enabled  interfaces
tester       8000.460a80dd627d  no      vm-vnic
 	   

Как вы можете видеть, vm-vnic является интерфейсом, добавленным к вашему мосту tester. Теперь vm-vnic может выступать в роли интерфейса между вашей виртуальной машиной и мостом tester, который, в свою очередь, делает возможным вашей виртуальной машине взаимодействовать с прочими добавленными к этому мосту виртуальными машинами:

 

Рисунок 1



Теперь самое время поразмыслить. Не расстраивайтесь, если не сможете ответить на следующие вопросы; чуть позже в данной главе мы ответим на них. Вопросы таковы:

  • Заметили ли вы какую- нибудь разницу в своих MAC адресах моста tester при добавлении вашего устройства TAP vm-vnic?

  • Можно ли назначить какой- либо IP адрес мосту? Если да, зачем вам это может понадобиться?

  • Попробуйте понять подробности происходящего при запуске команды # brctlshowmacs tester.

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

Отключим tap устройство vm-vnic от моста tester:


# brctl delif tester vm-vnic
# brctl show tester
bridge name  bridge id    STP enabled  interfaces
tester       8000.460a80dd627d   no
 	   

Когда vm-vnic отключено от нашего моста, удалим это tap устройство при помощи команды ip:


# ip tuntap del dev vm-vnic mode tap
 	   

Наконец, удалим мост tester:


# brctl delbr tester; echo $?
0
 	   

Если вы желаете увидеть все доступные параметры, тогда выполните brctl –help:


# brctl --help
 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
 	   

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

Настройка виртуальной сети при помощи libvirt

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

Доступны следующие типы виртуальных сетей:

  • Изолированная виртуальная сеть

  • Виртуальная сеть с маршрутизацией

  • Виртуальная сеть с NAT

  • Виртуальная сеть с мостом, использующая физическую NIC, интерфейс VLAN, сцепленный (bond) интерфейс и сцепленный VLAN интерфейс

  • MacVTAP

  • Проброс (passtrough) NPIV через PCI

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

Перед началом, давайте вернёмся назад к Главе 3, обособленной виртуальной KVM и создадим ещё одну виртуальную машину Linux. Это потребует выполнения работы вручную.

Изолированная виртуальная сеть

Как на то указывает название, мы создаём закрытую сеть для свойе виртуальной машины. В данной настройке друг с другом смогут взаимодействовать только виртуальные машины, добавляемые в эту сетевую среду:

 

Рисунок 2



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

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

  1. Переместитесь в virt-manager | Edit | Connection details | Virtual Networks. Кликните на знак +.

  2. В качестве имени виртуальной сети введите isolated:

     

    Рисунок 3



  3. Пропустите настройку адреса IPv4:

     

    Рисунок 4



  4. Запретите настройку адреса IPv6:

     

    Рисунок 5



  5. Выберите тоько Isolated virtual network и оставьте пустым DNS Domain Name . Кликните по Finish для завершения создания вашей изолированной сети:

     

    Рисунок 6



  6. Проверьте подробности данной изолированной виртуальной сети:

     

    Рисунок 7



Теперь мы создадим свою виртуальную сеть при помощи команды virsh. Для этого нам нужно создать файл XML со следующим содержимым и сохранить его как isolated.xml:


# cat isolated.xml
<network> <name>isolated</name>
</network>
 	   

Здесь:

  • <network>: используется для определения вашей виртуальной сети

  • <name>

    : применяется для именования этой виртуальной сети. в Данном случае это isolated.

Чтобы определить сетевую среду при помощи созданного в предыдущем разделе файла XML, примените параметр команды virsh net-define с последующим путём к этому файлу XML:


# virsh net-define isolated.xml
 Network isolated defined from isolated.xml
 	   

Когда данная сеть определена вы можете вывести перечень всех доступных сетей при помощи команды net-list:


# virsh net-list --all
 Name                 State        Autostart  Persistent
--------------------------------------------------------------
 default              active       yes           yes
 isolated             inactive     no            yes
 	   

Из предыдущего вывода вы можете увидеть, что ваш мост Linux с именем isolated теперь определён (добавлен/ создан). Давайте рассмотрим файл XML libvirt, создаваемый на основе данной конфигурации, которую мы выполнили пр и помощи isolated.xml. Воспользуйтесь параметром net-dumpxml, как это показано в следующей команде, для получения подробностей о вашем мосте Linux:


# virsh net-dumpxml isolated
<network>
<name>isolated</name>
<uuid>84147b7d-a95f-4bc2-a4d9-80baab391a18</uuid>
<bridge name='virbr1' stp='on' delay='0'/>
<mac address='52:54:00:0e:c2:b5'/>
</network>
 	   

Здесь мы можем увидеть, что libvirt добавила некоторые дополнительные параметры. Каждый из них объясняется следующими пунктами:

  • <uuid>: уникальный идентификатор вашего моста.

  • Code: Применяется для определения деталей данного моста. В нашем случае именем моста является virbr1 с STP ON и DELAY 0. Существуют те же самые параметры, которыми вы можете управлять при помощи команды brctl. STP устанавливается при помощи stp, а DELAY посредством setfd. Вернитесь назад и проверьте параметры команды brctl.

  • <mac>: Это MAC адрес вашего моста, который будет назначен во время его создания.

Как вы можете убедиться, libvirt добавляет оставшиеся необходимые параметры; при необходимости вы можете отметить их в своём файле XML. Наша рекомендация состоит в том, чтобы вы оставляли их не заполненными во избежание конфликтов.

[Совет]Совет

net-create аналогичен net-define. Единственная разница состоит в том, что он не создаёт постоянную виртуальную сеть. Как только она будет отключена, она удаляется и должна создаваться вновь командой net-create.

Когда вы определяете сетевую среду с применением net-define, ваш файл настройки будет сохранён в /etc/libvirt/qemu/networks/ в виде файла XML с тем же самым именем, что и у вашей виртуальной сети:


# cat /etc/libvirt/qemu/networks/isolated.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made
using:
virsh net-edit isolated
or other application using the libvirt API.
<network>
<name>isolated</name>
<uuid>84147b7d-a95f-4bc2-a4d9-80baab391a18</uuid>
<bridge name='virbr1' stp='on' delay='0'/>
<mac address='52:54:00:0e:c2:b5'/>
</network>
 	   

Изолированная виртуальная сеть теперь определена. Давайте активируем её. В virt-manager (Рисунок 8) используйте кнопки воспроизведения и останова после выбора изолированной виртуальной сети. Кнопка, отображающая красный круг с x посередине применяется для отмены определения вашей сетевой среды. Отмена определения виртуальной сети удалит её на постоянной основе:

 

Рисунок 8



[Совет]Совет

Если вы хотите запускать свою виртуальную сеть автоматически при запуске службы libvirt, применяйте Autostart. В случае использования virsh, это будет virsh netautostart isolated.

Давайте теперь активируем изолированную виртуальную сеть при помощи virsh. Если ваша виртуальная сеть уже активирована при помощи virt-manager, деактивируйте её перед этим при помощи кнопки Stop:


# virsh net-start isolated
Network isolated started
# virsh net-list --all
Name                  State        Autostart  Persistent
--------------------------------------------------------
default               active       yes        yes
isolated              active        no        yes
 	   

Состояние изменено с inactive на active. Теперь наша виртуальная сеть готова к использованию.

Как вы добавите какую- либо виртуальную карту сетевого интерфейса в виртуальную машину?

Чтобы применять предыдущую виртуальную сеть кликните правой кнопкой по своей виртуальной машине Open | Virtual Hardware details (иконка лампочки) | Add Hardware | Network. Выберите isolated для Network source; MAC адрес будет создан libvirt, а Device model в виде virtio. Кликните по Finish. Не рекомендуются для промышленного использования две другие модели устройств, e1000 (Intel) и rtl1839 (Realtek), так как они являются эмулируемыми устройствами и не дают хорошую производительность. В основном они используются при установке наследуемых операционных систем, которые не поддерживают устройства virtio. Для Linux вам необходимо применять ядро версии 2.6.25 или старше, так как более старые версии ядер не поддерживают устройчства virtio.

В Windows вам необходимо устанавливать ваши драйверы virtio отдельно. Мы рассмотрим дополнительно virtio в нашей главе, посвящённой оптимизации виртуализации.

 

Рисунок 9



Виртуальная NIC virtio может быть добавлена в работающую виртуальную машину; она будет готова к использованию внутри вашей виртуальной машины немедленно.

Давайте добавим какую- нибудь виртуальную NIC в другую виртуальную машину. В нашей среде имя этой виртуальной машины F22-02.

Перед подключением второй NIC, мы получим подробности своей текущей виртуальной NIC, подключённой к нашей виртуальной машинеF22-02, воспользовавшись domiflist. Вывобд этой команды поможет ввам определить параметры для подключения второй виртуальной NIC к вашей виртуальной машине:


# virsh domiflist F22-02
Interface  Type       Source     Model       MAC
--------------------------------------------------------------
vnet2      network    default    virtio      52:54:00:b0:50:98
Interface - Name of the tap interface attached to the bridge.
Source - Name of the virtual network.
Model - Virtual NIC model.
MAC - MAC address of the virtual NIC (not the MAC of vnet2).
Type - Type of device
 	   

Давайте подключим новый интерфейс к F22-02:


# virsh attach-interface --domain F22-02 --source isolated --type network --model virtio --config --live
Interface attached successfully
# virsh domiflist F22-02
Interface  Type     Source    Model     MAC
------------------------------------------------------------------
vnet2      network  default   virtio    52:54:00:b0:50:98
vnet3      network  isolated  virtio    52:54:00:2b:0d:0c
 	   

Вы подключили виртуальный сетевой интерфейс с типом virtio. Этот интерфейс использует изолированную виртуальную сеть. В данной команде присутствуют два новых параметра, которые не объясняют себя самостоятельно:

  • --config: данный параметр выполняет изменения на постоянной основе для последующих запусков данной ВМ.

  • --live: уведомляет libvirt что вы подключаете данный NIC к работающей виртуальной машине. Если данная виртуальная машина не работает, удалите --live.

[Совет]Совет

Если вы хотите подключить виртуальный сетевой интерфейс к своей виртуальной машине только временно, просто воспользуйтесь --live и проигнорируйте --config.

Другой полезной опцией для некоторых целей является --mac. Она может использоваться для добавления индивидуального MAC адреса.

Теперь давайте проверим каким образом создан ваш мост для данного изолированного виртуального интерфейса и как этот интерфейс подключён.

Интерфейс моста, созданный для нашего изолированного виртуального интерфейса это virbr1. Как мы его найдём? Вспомните о нашей опции net-dumpxml.

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


# brctl show virbr1
bridge name    bridge id       STP enabled   interfaces
virbr1      8000.5254000ec2b5      yes       virbr1-nic
                  vnet1
                  vnet3
 	   

Интерфейс virbr1-nic создаётся libvirt при запуске virbr1. Целью этого интерфейса является предоставление непротиворечивого и надёжного MAC адреса мосту virbr1. Данный мост копирует MAC адрес первого интерфейса, который добавляется к нему, и virbr1-nic всегда является самым первым интерфейсом, добавляемым к нему libvirt, причём он никогда не будет удалён вплоть до уничтожения данного моста.

vnet1 и vnet3 являются вашими виртуальными сетевыми интерфейсами, добавляемыми к соответствующим ВМ.

Теперь вы можете назначить IP адреса этим только что добавленным интерфейсам и, в случае если ping будет вам доступен, что эти виртуальные машины добавлены в нашу изолированную сетевую среду. Мы покидаем данное ваше задание. Сможете ли вы осуществлять ping ваших виртуальных машин из гипервизора?

Теперь давайте удалим свой новый интерфейс, добавленный к нашей виртуальной машине F22-02 при помощи virsh. При работе в промышленном окружении, будьте предельно внимательны при работе с опцией --live. Она может нарушить функционирование существующей сетевой среды.


# virsh detach-interface --domain F22-02 --type network --mac 52:54:00:2b:0d:0c
--config --live
Interface detached successfully
 	   

Несмотря на то, что предметом обсуждения были изолированные виртуальные сети, мы также рассмотрели и другие операции с виртуальной сетью и виртуальной NIC. Данные операции аналогичны для всех виртуальных сетей.

Виртуальная сеть с маршрутизатором

В режиме с маршрутизацией, наша виртуальная сеть присоединяется к физической сетевой среде при помощи IP маршрутов, определяемых её гипервизором. Эти IP маршруты применяются для маршрутизации обмена между виртуальными машинами и вашей сетевой средой, подключённой к общему гипервизору. Ключевым моментом, который в этом случае вам необходимо запомнить при данных настройках является то, что вам также необходимо установить верный IP маршрут к вашим устройствам маршрутизации или шлюза, так как ответный пакет должен возвращаться назад в ваш гипервизор. Если никакие маршруты не определены, ответный пакет никогда не достигнет данного хоста. Этот режим является наиболее применимым, пока вам не потребуются особые варианты использования сетевой среды с такой сложностью. Следующий рисунок отображает как сетевая среда работает в реальном мире:

 

Рисунок 10



Давайте сначала выполним эту настройку воспользовавшись virt-manager. Именем нашей виртуальной сети является routed, как это отображено на снимке экрана внизу:

 

Рисунок 11



Включите только IPv4. Запретите DHCP и Static Routes. В нашем случае в качестве сетевой среды мы используем 192.168.10.0/24. libvirt автоматически назначает шлюз для такой сетевой среды. Обычно его стараются указывать первым IP в вашем диапазоне IP, 192.168.10.1, и он назначается интерфейсом вашего моста. На шаге 2 вашего мастера Create virtual network пометьте галочкой Enable IPv4 network address space definition и Enable DHCPv4. Диапазон DHCP по умолчанию 192.168.100.128 – 192.168.100.254; вы вольны изменить его для своих нужд:

 

Рисунок 12



После определения диапазона DHCP кликните по кнопке Forward. На шаге 3 вы можете в качестве необязательного действия сделать доступными настройки IPv6:

 

Рисунок 13



Мы собираемся пропустить 3 шаг, который состоит в настройке IPv6. Вы можете включить её позже, изменив свой файл настройки, воспользовавшись командой virsh. Мы выполняем простую настройку для проверки вами. Если это необходимо, вы можете включить её уже на данном этапе. Мы оставляем это на ваш выбор.

На заключительном этапе выберите интерфейс хоста, на который вы хотите направлять весь обмен (для нас это em1) из данной виртуальной сети и выберите Routed в качестве Mode (режима). Для создания данной виртуальной сети кликните Finish:

 

Рисунок 14



Тееперь давайте создадим те же настройки воспользовавшись virsh вместо графического инструмента. Удалите только что созданную виртуальную сеть с маршрутизацией и откройте окно терминала.

Создайте файл настроек XML аналогичный приводимому ниже и сохраните его с именем routed.xml. Когда ваш файл настроек будет готов, вы можете приступить к определению своей сетевой среды:


# cat routed.xml
<network>
>name>routed>/name>
>forward dev='em1' mode='route'>
>interface dev='em1'/>
>/forward>
>ip address='192.168.10.1' netmask='255.255.255.0'>
>/ip>
>/network>
# virsh net-define routed.xml
 	   

Сетевая маршрутизация определяется из routed.xml


# virsh net-start routed
Network routed started
# virsh auto-start routed
 	   

Сетевая маршрутизация помечена как запускаемая автоматически:


# virsh net-info routed
Name:         routed
UUID:         9a1d8de7-5627-4f08-a3d1-836b7a5fe060
Active:       yes
Persistent:   yes
Autostart:    yes
Bridge:       virbr2
 	   

Изменение виртуальной сети

Давайте отредактируем виртуальную сеть с маршрутизацией и изменим настройки маршрутизации таким образом, чтобы ваши пакеты от виртуальных машин могли бы пересылаться в любой доступный на их хосте интерфейс на основе правил маршрутизации IP, определяемых этим хостом. Цель данного примера состоит в демонстрации того как изменять уже созданную виртуальную сеть вашими настройками.

Перед изменением конкретной виртуальной сети вам необходимо сначала остановить её:


# virsh net-destroy routed
Network routed destroyed
 	   

Измените свою сетевую среду воспользовавшись net-edit:


# virsh net edit routed
 	   

net-edit сделает временную копию вашего файла настроек используемых routed в /tmp и затем откроет vim воспользовавшись этим временным файлом. В нашем случае мы собираемся изменить тег <forward>.

Старая конфигурация:


<forward dev='em1' mode='route'>
<interface dev='em1'/>
</forward>
 	   

Новая конфигурация:


<network>
 <name>routed</name>
 <uuid>9a1d8de7-5627-4f08-a3d1-836b7a5fe060</uuid>
 <forward mode='route'/>
 <bridge name='virbr2' stp='on' delay='0'> 
 <mac address='52:54:00:f1:cb:30'>
 <ip address='192.168.10.1' netmask='255.255.255.0'>
 </ip> 
</network> 
 	   

После внесения изменений сохраните его при помощи :wq. Если вы допустили ошибку, virsh уведомит вас. В нашем случае мы удалили < в <forward> и затем попытались сохранить такую настройку:


error: (network_definition):6: Opening and ending tag mismatch: network line 1 and forward
 </forward>
-----------------^
Failed. Try again? [y,n,f,?]: 
Network routed XML configuration edited. 
 	   

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


# virsh net-dumpxml routed
<network>
<name>routed</name>
<uuid>9a1d8de7-5627-4f08-a3d1-836b7a5fe060</uuid>
<forward mode='route'/>
<bridge name='virbr2' stp='on' delay='0'/>
<mac address='52:54:00:f1:cb:30'/>
<ip address='192.168.10.1' netmask='255.255.255.0'>
</ip>
</network>
 	   

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


# virsh net-dumpxml routed

 	   

После проверки настроек запустите виртуальную сеть воспользовавшись net-start, как это показано в следующей команде:


# virsh net-start routed
Network "routed" started
 	   

Виртуальная сеть с NAT

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

Виртуальная сетевая среда создаётся при помощи iptables, особым образом применяя опции маскарадинга. Следовательно, останов iptables при использовании ВМ может вызвать повреждение сетевой среды внутри таких виртуальных машин:

 

Рисунок 17



Давайте создадим некую виртуальную сеть в режиме NAT при помощи virt-manager. Этапы аналогичны виртуальной сети в маршрутизацией, однако вместо выбора метода маршрутизации вы выбираете NAT и щёлкаете по кнопке Finish:

 

Рисунок 18



Если вы не можете получить доступ к системе или выполнить к ней ping после нвастройки сети с NAT, убедитесь что значение sysctl net.ipv4.ip_forward равно 1.

Виртуальная сеть с мостом

Виртуальная сеть с мостом использует физическую NIC, интерфейс VLAN, сцепленный (bond) интерфейс и сцепленный интерфейс VLAN (также называемый совместно используемым физическим интерфейсом).

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

В нашей пробной настройке у нас в наличии доступно три интерфейса: eth0, eth1 и eth2. eth0 имеет уже назначенный IP и используемый в качестве интерфейса управления. Интерфейс управления это интерфейс, используемый для доступа к машине хоста через SSH или подобный метод с настроенным IP. Два других интерфейса, eth1 и eth2, выделены для настройки моста и не имеют IP настроек.

Обычный рабочий поток по созданию моста с совместно используемым физическим интерфейсом (интерфейсами) следующий:

  1. Выполните настройку своих физических интерфейсов без каких- либо IP. Это включает в себя настройку VLAN, сцепления (bonding) и тому подобное.

  2. Когда физические интерфейсы настроены, добавьте окончательный интерфейс в свой мост. Это может быть отдельный интерфейс (eth1), сцепленный интерфейс (bond0), VLAN (eth1.121 или bond0.121) и тому подобное.

  3. Дополнительно, вы можете назначить некий IP именно своему мосту, а не физическому интерфейсу. Если у вас имеется интерфейс управления, всегда создавайте мост без IP, если это не является особым требованием.

Вашей первой задачей будет настроить мост с именем br0 при помощи eth0.

Fedora для своих сетевых настроек использует Network Manager и по умолчанию не допускает сетевых служб на основе SysVinit. В нашей наладке запретите Network Manager и включите свою сетевую службу. Поскольку это выделенный гипервизор, запретите Network Manager.

Создайте (или измените) файлы ifcfg-eth1 и ifcfg-br0 с тем, чтобы они имели вид, аналогичный приводимому ниже. Вы можете опустить часть, содержащую комментарии:


# cd /etc/sysconfig/network-scripts
# cat ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
#Replace the following with your eth1 interface MAC address
HWADDR=52:54:00:32:56:aa
ONBOOT=yes
#Prevent Network Manager from managing this interface,eth1
NM_CONTROLLED=no
#Add this interface to bridge br0
BRIDGE=br0
# cat ifcfg-br0
DEVICE=br0
#Initiate bridge creation process for this interface br0
TYPE=Bridge
ONBOOT=yes
NM_CONTROLLED=no
#Set the bridge forward delay to 0.
DELAY=0
Enable the network service and start it.
# systemctl enable network
# systemctl disable NetworkManager
# ifup br0; ifup eth1
# brctl show
 	   

Ваш мост br0 создан с интерфейсом eth1. Вы можете теперь начать использовать br0 при создании сетевых интерфейсов ВМ. Мы предполагаем, что у вас имеется более одной NIC в вашем хосте для создания виртуальных сетей. Если же у вас имеется только один интерфейс, убедитесь что вы назначили IP адрес в файле настроек своего моста для доступа хоста в сеть. Теперь мы создандим сцепление (bond0) воспользовавшись eth1 и eth2 и добавив их в br0:


# ifdown br0; ifdown eth1
# cat ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
HWADDR=52:54:00:32:56:aa
ONBOOT=yes
NM_CONTROLLED=no
SLAVE=yes
MASTER=bond0
# cat ifcfg-eth2
DEVICE=eth2
TYPE=Ethernet
HWADDR=52:54:00:a6:02:51
ONBOOT=yes
NM_CONTROLLED=no
SLAVE=yes
MASTER=bond0
# cat ifcfg-bond0
DEVICE=bond0
ONBOOT=yes
# Here we are using bonding mode 1 (active-backup)
BONDING_OPTS='mode=1 miimon=100'
BRIDGE=br0
NM_CONTROLLED=no
# ifup bond0
# brctl show
 	   

Наш мост br0 теперь создан при помощи интерфейса bond0. Следующая схема объясняет текущие настройки:

 

Рисунок 19



[Совет]Совет

Использование режима сцепления один (active-backup, активный- резервный) и четыре (802.3ad) рассматриваются как надёжные при их применении в вашем мосте.

Теперь мы изменим ifcfg-bond0 так, чтобы он создал тегированную VLAN с именем bond0.123 и добавил бы её в наш мост br0:


# ifdown bond0; ifdown br0
# cp ifcfg-bond0 ifcfg-bond0.123
# cat ifcfg-bond0.123
DEVICE=bond0.123
ONBOOT=yes
BONDING_OPTS='mode=1 miimon=100'
BRIDGE=br0
NM_CONTROLLED=no
VLAN=yes
 	   

Теперь изменим ifcfg-bond0 и уберём комментарий с BRIDGE=bro (#BRIDGE=br0):


# ifup bond0.123
 	   
[Совет]Совет

Если бы вы захотели настроить индивидуальный MTU, добавьте MTU во все файлы настройки, включая ваш мост. Тот же самый MTU должен быть также добавлен внутри настроек интерфейса виртуальной машины.

MacVTap

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

Для добавления виртуальной NIC в качестве интерфейса MacVTap при помощи virt-manager переместитесь в Add Hardware | Network. В Network source выберите физический интерфейс NIC в своём хосте, в котором вы собираетесь сделать доступным MacVTap:

 

Рисунок 20



Ниже приведены соответствующие настройки в вашей ВМ:


<interface type='direct'>
<mac address='52:54:00:7b:4b:8c'/>
<source dev='enp0s25' mode='bridge'/>
<model type='virtio'/>
 	   

Проброс PCI

Проброс (passthrough) PCI используется для передачи устройств PCI вашего хоста виртуальной машине. В первую очередь это используется для прямого использования сетевых интерфейсов в вашем хосте виртуальной машиной для увеличения производительности. {Прим. пер.: готовы поспорить: в нашей практике, в основном, применяется для выделения виртуальным машинам вычислительных ресурсов, в первую очередь GPU. Ещё больший интерес вызывает представленная в августе 2016 поддержка посреднических устройств (mediated device) и интеграция vGPU в libvirt: An Introduction to PCI Device Assignment with VFIO - Alex Williamson, Red Hat; Add Mediated device support [Qemu-devel] [PATCH v7 0/4]; libvirt vGPU QEMU integration [libvirt] [RFC]; vGPU on KVM VFIO based Mediated Device Framework, Neo Jia & Kirti Wankhede, 08/25/2016.}

Чтобы сделать доступным проброс PCI вы должны применить следующие шаги:

  1. В своём BIOS {Прим. пер.: правильнее FirmWare} и ядре включить поддержку Intel VT-d или AMD IOMMU {,для этого в редакторе}:

    
    # vi /etc/sysconfig/grub
     	   
  2. Изменить GRUB_CMDLINE_LINUX=, добавив intel_iommu=on или amd_iommu=on:

     

    Рисунок 21



  3. Перестроить файл настройки вашего gub2 следующим образом и выполнить перезагрузку своего гипервизора:

    
    # grub2-mkconfig -o /boot/grub2/grub.cfg
     	   
  4. Переместиться в Hardware | PCI Host Device и выбрать устройство PCI для проброса:

     

    Рисунок 22



Это всё о хранилище!

Аналогично инфраструктуре виртуальной сети, нам необходимы сервера хранения для создания и сохранения наших виртуальных дисков. Существует параметр выбора широко разнообразия решений хранения, это сервера для виртуальных машин от обычных хранилищ на основе фалов хранилищ управляющих логическими томами (LVM), контейнеров Gluster и многого другого. Сервера хранения создаются и управляются с применением API хранения libvirt и называются "пулом хранения" ("storage pool")

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

Работа с неуправляемым хранилищем

Хранилище, которое напрямую не управляется и не мониторится libvirt, всё ещё применяется виртуальными машинами и называется неуправляемым хранилищем. Это означает, что вы можете напрямую использовать файлы или блочные устройства, которые доступны/ видны в вашей хост системе как виртуальный диск, а также предоставляют соответствующим образом установленные полномочия. Это даёт вам самый быстрый способ получать хранилище, доступное виртуальным машинам. Такой подход, в частности, полезен при добавлении дополнительного диска какой- либо виртуальной машине.

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

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

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

Создание образа диска и подключение его к гостю

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


# dd if=/dev/zero of=/vms/dbvm_disk2.img bs=1G count=10
 	   

Вот перевод данной команды для вас:

Дублировать данные (dd) из входного файла (if) /dev/zero (виртуальной неограниченной поддержки нулями) в файл вывода (of) /vms/dbvm_disk2.img (дисковый образ) с использованием блоков с размером в 1G (bs = block size) и повторить это (count) по одному (10) раз.

[Замечание]Замечание

dd славится как команда жадная к ресурсам и она может создавать проблемы ввода/ вывода в системе хоста, поэтому неплохо вначале проверить доступность свободной оперативной памяти и состояние ввода/ вывода в вашей системе хоста, и только после этого выполнить её. Если система уже нагружена, уменьшите размер блока до МБ и увеличьте их общее число чтобы получить нужный размер необходимого вам файла ( используйте bs=1M , count=10000 вместо bs=1G count=10).

/vms/dbvm_disk2.img будет результатом предыдущей команды. Этот образ теперь имеет предварительно выделенными 10ГБ и готов к использованию гостями либо в качестве загрузочного, либо как дополнительного диска. Аналогично, вы также можете создавать образы диска с динамичным выделением (thin-provisioned). Предварительное выделение и динамичное выделение (разрежение) являются методами выделения дискового пространства, или же вы можете называть их форматом. Каждый из них имеет свои преимущества и недостатки. Если вам нужен производительный ввод/ вывод, примените предварительное выделение, однако если ваши нагрузки не обладают интенсивным вводом/ выводом, выбирайте динамичное выделение.

  • Предварительное выделение (Preallocated): Виртуальный диск с предварительным выделением получает всё своё пространство непосредственно при создании. Виртуальный диск с форматом предварительного выделения имеет значительно более быструю запись чем виртуальный диск с динамичным выделением. {Прим. пер.: Поскольку на текущий момент мы не определили природу используемых хранилищ, важно помнить о факторе места и времени: во- первых (место), в качестве носителя могут выступать устройства с интерфейсом NVMe (см. обзор NVMe в ZFS для профессионалов и имеющиеся на рынке решения, например, Сервера Huawei с поддержкой NVMe) во- вторых (время), динамичное выделение может выполняться на уровне самой файловой системы, см., например, Резервирование пространства в ZFS.}

  • Динамичное выделение (Thin-Provisioned): в этом методе пространство будет выделяться для ваших томов по необходимости. Например, если вы создаёте виртуальный диск (образ диска) с размером , 10ГБ с разреженным выделением, в начале он может быть размером в пару МБ пространства вашего хранилища и расти по мере получения записей с виртуальной машины до размера в , 10ГБ. Это делает возможным пренебрегать фиксацией в предположении о наличии места на диске. Чтобы создать диск с динамичным выделением, примените опцию , seek в команде , dd, как это сделано в следующем примере:

    
    # dd if=/dev/zero of=/vms/dbvm_disk2_seek.imgbs=1G seek=10 count=0
     	   

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

Получение информации образа

Параметр команды qemu-img info отображает информацию об образе диска, включая его абсолютный путь, формат файла, а также виртуальный размер и размер диска. Посмотрев на виртуальный и дисковый размеры легко можно определить какая политика выделения пространства диску применяется. В качестве примера давайте рассмотрим два созданных нами дисковых образа:


# qemu-img info /vms/dbvm_disk2.img
image: /vms/dbvm_disk2.img
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 10G
#qemu-img info /vms/dbvm_disk2_seek.img
image: /vms/dbvm_disk2_seek.img
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 10M
 	   

Посмотрим на дисковый размер обоих дисков. Он отображает 10G для /vms/dbvm_disk2.img, в то время как для /vms/dbvm_disk2_seek.img он составляет 10M. Происхождение разницы в том, что второй диск применяет формат динамичного выделения. virtual size это то, что видят гости, в то время как disk size это объём диска, зарезервированный в вашем хосте. Если оба размера одинаковы, это означает, что такой диск является предварительно размещённым. Разница означает что данный диск использует формат динамичного выделения.

Теперь давайте присоединим образ диска к виртуальной машине; вы можете присоединить его с помощью virt-manager или же альтернативой является CLI virsh.

Подключение диска при помощи virt-manager

Запустите virt-manager из графического окружения рабочего стола системы вашего хоста. Он также может быть запущен удалённо с использованием SSH, как это демонстрируется следующей командой:


ssh -X host's address
           [remotehost]# virt-manager
 	   
  1. В главном меню Virtual Machine Manager выберите виртуальную машину, к которой вы хотите добавить дополнительный диск.

  2. Перейдите в окно подробностей виртуального оборудования и кликните по кнопке Add Hardware, расположенной в нижней левой части текущего блока диалога.

  3. В Add New Virtual Hardware выберите объём компоненты Storage для другого хранилища:

     

    Рисунок 23



  4. Выберите Select Managed or other existing storage и отыщите и укажите файл dbvm_disk2.img в своём каталоге /vms или напрямую введите имя пути и имя, а после этого кликните по Finish.

  5. [Замечание]Замечание

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

    Кликнув по кнопке Finish вы подключите выбранный образ диска (файл) в качестве второго диска для вашей виртуальной машины с применением настроек по умолчанию. Те же самые действия могут быть быстро выполнены с применением команды virsh.

     

    Рисунок 23



Подключение диска при помощи virsh

virsh является очень мощной альтернативой командной строки для virt-manager. Вы можете выполнять действия за секунды, в то время как это займёт минуты для выполнения через графический интерфейс подобный virt-manager. Она предоставляет опцию attach-disk для подключения нового дискового устройства к виртуальной машине. Существует множество переключателей поставляемых attach-disk:


attach-disk domain source target [[[--live] [--config] | [--current]] |
[--persistent]] [--targetbusbus] [--driver driver] [--subdriversubdriver]
[--iothreadiothread] [--cache cache] [--type type] [--mode mode]
[--sourcetypesourcetype] [--serial serial] [--wwnwwn] [--rawio]
[--address address] [--multifunction] [--print-xml]
 	   

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


#virsh attach-disk F22-01 /vms/dbvm_disk2.img vdb --live --config
 	   

Здесь F22-01 это виртуальная машина к которой выполняется подключение диска. Затем идёт полный путь образа диска. vdb является целевым именем диска, которое будет видно в вашей гостевой операционной системе. --live означает выполнение действия в процессе работы машины, а --config означает подключение на постоянной основе при перезагрузках. Если вы хотите подключать данный диск только до перезагрузки, не добавляйте переключатель --config.

[Замечание]Замечание

Поддержка подключения в горячем режиме (HotPluggingSupport): в гостевой операционной системе Linux должен быть загружен модуль ядра "acpiphp" для распознавания добавляемых по-горячему дисков; "acpiphp" предоставляет наследуемую поддержку подключения в горячем режиме, в то время как "pciehp" предоставляет встроенную поддержку горячего подключения. "pciehp" зависит от "acpiphp". Загрузка "acpiphp" автоматически выполнит и загрузку "pciehp" как зависимую.

Для быстрого определения общего числа подключённых к виртуальной машине дисков вы можете применять команду virsh domblklist <vm_name>. Вот пример её использования:


# virsh domblklist F22-01 --details
Type     Device   Target     Source
------------------------------------------------
file     disk     vda        /var/lib/libvirt/images/fedora21.qcow2
file     disk     vdb        /vms/dbvm_disk2_seek.img
 	   

Это ясно отображает, что к вашей виртуальной машине подключены два vDisk, причём оба являются файловыми образами. Они видны в вашей гостевой ОС под псевдонимами vda и vdb соответственно, а в последней колонке представлены пути дисковых образов в вашей системе хоста.

Работа с управляемым хранилищем

libvirt поддерживает следующие типы пулов хранения:

  • -dir: использует каталог файловой системы для хранения виртуальных дисков

  • -disk: применяет физические жёсткие диски для создания виртуальных дисков

  • -fs: использует предварительно отформатированные разделы для хранения виртуальных дисков

  • -netfs: применяет совместно используемые сетевые хранилища, например, NFS, для хранения виртуальных дисков

  • -gluster: позволяет применять файловую систему Gluster для хранения виртуальных дисков

  • -iscsi: применяет совместно используемые сетевые хранилища iSCSI для хранения виртуальных дисков

  • -scsi: использует локальные хранилища SCSI для хранения виртуальных дисков

  • -lvm: для хранения виртуальных дисков полагается на группы томов LVM

  • -rbd: позволяет присоединять для виртуальных дисков хранилище Ceph

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

  • Каталог файловой системы (локальный)

  • Группа томов LVM (локальная)

  • Пул хранения NFS

  • Сервер iSCSI (совместно используемый)

  • {Прим. пер.: см. также Глава 2. Работа с блочными устройствами Ceph перевода Ceph Cookbook}

  • {Прим. пер.: см. также iSCSI и Тома ZFS перевода ZFS для профессионалов.}

[Замечание]Замечание

Хранилище, которое управляется и мониторится libvirt в терминах пулов хранения и томов хранения здесь называется управляемым хранилищем. Пул является общим контейнером для различных объектов хранилищ. Существуют определённые типы пулов хранения. Начиная с простого локального каталога до современных совместно используемых хранилищ наподобие томов хранения Ceph все они являются частями пула хранения и они действительно являются виртуальными дисками используемыми виртуальными машинами.

Консоль управления хранилищем

Менеджер виртуальной машины (virt-manager) предоставляет очень продвинутый, но всё ещё простой в применении интерфейс для настройки и управления пулами хранения. Для доступа к этой консоли:

  1. Откройте графический интерфейс virt-manager.

  2. Затем перейдите в меню Edit и выберите Connection Details. Кликните по закладке Storage в окне Connection Details:

     

    Рисунок 24



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

  • Name: имя пула хранения

  • Size: сообщает об объёмах свободного и используемого пространств

  • Location: путь вашего сервера хранения, в котором в действительности хранятся данные vDisk

  • State: сообщает нам о состоянии пула; является ли он активным или приостановленным (suspended)

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

  • Volumes: это список всех виртуальных дисков (томов), присутствующих в данном пуле, включая их имя, размер, а также средства создания новых томов. Присутствуют три кнопки. Кнопка со знаком "плюс" обозначает добавление нового тома, кнопка с символом "закрученной стрелки" обозначает обновление данных, а последняя предназначена для удаления, которое представляется "красным кружочком".

По умолчанию libvirt создаёт пул хранения каталога сервера (directory) с именем default Также вы можете воспользоваться командой virsh для вывода списка всех доступных в вашей системе пулов:


[root@Fedora22]# virsh pool-list
Name               State    Autostart
-------------------------------------------
default            active   yes
 	   

Для получения более подробной информации об определённых доменах примените:


root@Fedora22 ~]# virsh pool-info default
Name:        default
UUID:        3efb9c2b-2fa8-41cd-9e9e-de2eafa3b4a5
State:       running
Persistent:  yes
Autostart:   yes
Capacity:    26.00 GiB
Allocation:  4.00 GiB
Available:   23.00 GiB
 	   

Последние три параметра отображают реальное использование вашего пула. Вы можете увидеть что из общего объёма в 26ГБ 4ГБ было задействовано (выделено), а 23ГБ доступно к использованию.

Создание пулов хранения

Пулы хранения могут быть созданы при помощи virt-manager или посредством альтернативы CLI, virsh. Вначале мы рассмотрим как создавать различные типы пулов хранения используя консоль управления хранилищем, а после этого применим virsh. Файл определения каждого пула хранения сохраняется в /etc/libvirt/storage. Убедитесь что он не изменялся вручную и не удалён.

Каталог файловой системы, поддерживаемый пулом хранения

Хранилище в каталоге сервера более известен под именем хранилища на основе файла. В случае хранилища на базе файла для ВМ совместно используемые диски хранятся и управляются в рамках стандартного каталога, создаваемого в вашей машине хоста (или узла). Проще говоря, вы создаёте каталог в вашей системе хоста и назначаете его в качестве управляемого места для хранения виртуальных дисков.

Создаваемые в этом каталоге фпйлы выступают в роли виртуальных дисков и он может быть полностью заполнен файлами raw, файлами с разреженными исходными (raw) данными или qcow2, имеющими специальный дисковый формат.

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

  1. Перейдите в закладку Storage окна вашего virt-manager Connection Details.

  2. Запустите мастер Add a New Storage Pool кликнув по кнопке + (размещённой в нижнем левом углу).

  3. Введите в качестве имени и типа набора dir:Filesystem Directory и затем кликните кнопку Forward.

  4. Следующий шаг имеет различные параметры настройки в зависимости от выбранного типа хранилища. Для каталогов файловой системы просто введите Target Path и вы всё сделали. В блоке диалога Target Path введите путь каталога в котором вы собираетесь хранить виртуальные диски и нажмите кнопку Finish и ваш пул хранения на основе каталога готов:

     

    Рисунок 25



Полномочиями на каталог должен обладать пользователь root с правами установленными в значение 700. Если SELinux находится в режиме принуждения (enforced) необходимо установить следующий контекст:


# semanage fcontext -a -t virt_image_t "/vms(/.*)?"
 	   

Пулы хранения на основе каталога могут занимать всё доступное место в своём местоположении. Вы должны сохранять этот каталог в его собственном разделе чтобы не переполнить главный раздел хоста.

virsh делает жизнь более простой; после выполнения всего трёх команд ваш пул хранения будет готов к применению. Вот эти команды:


#virsh pool-define-as dedicated_storagedir dir - - - - "/vms"
#virsh pool-build dedicated_storage
#virsh pool-start dedicated_storage
 	   

Самая первая команда просто определяет область вашего хранения. Она создаёт файл определений XML из ввода, расположенного в /etc/libvirt/storage/directory, а вторя команда (pool-build) в действительности строит ваш пул хранения. Она создаёт ваш каталог если он не существовал и устанавливает верный контекст SLinux. Чтобы убедиться что пул хранения создан правильно выполните:


#virsh pool-list --all
Name               State    Autostart
-------------------------------------------
dedicated_storage  inactive no
default            active   yes
 	   

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


#virsh pool-start dedicated_storage
#virsh pool-autostart dedicated_storage
#virsh pool-list
Name               State    Autostart
-------------------------------------------
dedicated_storage  active   yes
default            active   yes
 	   

Группа томов LVM, поддерживаемый пулом хранения

Менеджер логических томов является наиболее гибкой и широко используемой технологией хранения в Linux. Вы можете применять логические тома LVM в качестве виртуальных дисков. Просто введите предварительно определённое имя группы томов LVM (путь) или постройте новую группу томов применив мастер Add a New Storage Pool:

 

Рисунок 26



  • Target Path является местоположением существующей группы томов LVM

  • Source Path является необязательным устройством для построения новой группы томов LVM

Например, давайте предположим, что у вас имеются диски sdb и sdc, подключённые к вашей машине хоста; вы хотите преобразовать их в единый физический том и создать группу томов из них для предоставления пространства всем своим дискам виртуальных машин.

Для удовлетворения этих требований у вас нет необходимости пройти обычным путём pvcreate, vgcreate вместо предложенного. Протсо откройте свой мастер Add a New Storage Pool, снабдите его sdb и sdc в качестве устройств источников, отметьте флаговую кнопку Build Pool и нажмите на кнопку Finish.

Окошко метки Build Pool проинструктирует virt-manager о необходимости создать новую группу томов LVM. Он преобразует устройства sdb и sdc в физический том, а также создаст новую группу томов LVM поверх них и использует их в качестве пула хранения.

Чтобы создать пул хранения сервера LVM при помощи virsh, примените те же самые опции pool-define-as и pool-build:


virsh pool-define-as lvmpool logical - - /dev/sdb2 vg1 /dev/vg1
virsh pool-build lvmpool
virsh pool-start lvmpool ; virsh pool-autostart dedicated_storage
 	   

Здесь:

  • lvmpool является именем вашего пула хранения

  • /dev/vdb1 используется в качестве физического тома для построения вашей vg

  • vg1 является именем вашей группы томов LVM

iSCSI, поддерживаемый пулом хранения

iSCSI (Internet Small Computer System Interface) является сетевым протоколом для совместно используемых дисковых хранилищ. Для взаимодействия iSCSI компоненты инициатора iSCSI и таргеа iSCSI договариваются между собой и строят сеть хранения данных (SAN, Storage Area Network), аналогичную Fiber channel.

В отличие от группы томов LVM, тома iSCSI не могут быть созданы через API libvirt. Томы должны быть предварительно размещены на сервере iSCSI (ваш таргет iSCSI). {Прим. пер.: пример их создания см. в разделе iSCSI перевода ZFS для профессионалов Майкла В. Лукаса и Аллана Джуда.} Когда у вас имеются созданные и работающие тома iSCSI, перейдите в свой мастер Add a New Storage Pool и выберите в качестве типа iscsi:ISCSI Target, а затем нажмите Forward, что приведёт к следующему окну (шаг 2):

 

Рисунок 27



Введите описанную ниже информацию и кликните на Finish для получения своего домена хранилищ на основе iSCSI в готовом виде:

  • Target Path: местоположение корня для идентификации нового тома хранения

  • Host Name: имя хоста, предоставляющего применяемое хранилище для совместного использования (iscsi target)

  • Source IQN: путь в хосте, который будет совместно применяться (IscsiLuns IQN)

  • Initiator IQN: имя предназначенное для инициатора iSCSI вашей системы хоста

Создание библиотеки образов ISO

Хотя гостевая операционная система на вашей виртуальной машине может быть установлена с физического носителя при помощи проброса устройства CD/DVD хоста в эту виртуальную машину, это не самый эффективный способ. Чтение с DVD устройства является медленным в сравгнении с чтением ISO с жёсткого диска, поэтому лучшим способом будет сохранить файлы ISO (или логические CD), используемые для установки операционных систем и приложений для виртуальных машин в пуле хранения на основе файлов и создать библиотеку образов ISO.

Для создания библиотеки образов ISO вы можете применять либо virt-manager, либо команду virsh. Давайте рассмотрим как создавать библиотеку образов ISO при помощи команды virsh:

  1. Вначале создайте каталог в вашей системе хоста для хранения образов .iso:

    
    #mkdir /iso_lib
     	   
  2. Установите правильные полномочия. Владельцем должен быть пользователь root с полномочиями, установленными в значение 700. Если SELinux в режиме принуждения (enforcing), необходимо установить следующий контекст:

    
    #chmod 700 /iso_lib
    # semanage fcontext -a -t virt_image_t "/iso_lib(/.*)?"
     	   
  3. Определите библиотеку образов ISO при помощи команды virsh, как это показано ниже:

    
    #virsh pool-define-as iso_librarydir - - - - "/iso_lib"
    #virsh pool-build iso_library
    #virsh pool-start iso_library
     	   
    [Замечание]Замечание

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

  4. Убедитесь что ваш пул (библиотека образов ISO) был создан:

    
    #virsh pool-info iso_library
    Name:           iso_library
    UUID:           959309c8-846d-41dd-80db-7a6e204f320e
    State:          running
    Persistent:     yes
    Autostart:      no
    Capacity:       49.09 GiB
    Allocation:     8.45 GiB
    Available:      40.64 GiB
     	   
  5. Теперь скопируйте свои файлы .iso в каталог /iso_lib.

  6. По окончанию копирования .iso в каталог /iso_lib, обновите свой пул и затем проверьте его содержимое:

    
    # virsh pool-refresh iso_library
    Pool iso_library refreshed
    
    # virsh vol-list iso_library
    Name                 Path
    ------------------------------------------------------------------------------
    centos6.iso          /iso_lib/centos6.iso
    Fedora21.iso         /iso_lib/Fedora21.iso
    Fedora22.iso         /iso_lib/Fedora22.iso
    Win7.iso             /iso_lib/Win7.iso
     	   
  7. Будет выведен полный перечень хранимых в данном каталоге образов ISO вместе с путями к ним. Эти образы ISO теперь могут использоваться напрямую виртуальными машинами для установки гостевых операционных систем, инсталляции программного обеспечения или выполнения обновлений.

Удаление пула хранения

Удалить пул хранения достаточно просто. Запомните, пожалуйста, что удаление домена хранения не удаляет никаких файловых/ блочных устройств. Оно протсто отсоединяет это хранилище от вашего virt-manager. Файловое/ блочное устройство необходимо удалять вручную.

Удаление пула хранения с использованием virt-manager

Вначале остановите свой пул хранения. Чтобы сделать это, выберите тот пул хранения, который вы хотите остановить и кликните по красной иконке X в нижней части своего окна Storage:

 

Рисунок 28



Кликнув по красной иконке X вы сделаете домен хранения не активным (inactive). Ненужное нажатие может удалить ваш домен хранения.

Удаление пула хранения с использованием virsh

Последовательность аналогичная; вам вначале необходимо остановить свой пул выполнив virsh pooldestroy <pool-name>, а затем отменить определение воспользовавшись virsh undefine <pool-name>.

Создание томов хранения

Тома хранения создаются поверх пулов хранения и подключаются как виртуальные диски к виртуальным машинам. Чтобы создать том хранения, запустите консоль управления хранилищем, перейдите к virt-manager. Кликните на Edit | connection Details | Storage и выберите тот пул хранения, в которм вы хотите создать новый том; кликните на кнопку + в своём Create New Volume.

 

Рисунок 29



Далее снабдите свой новый том именем, выберите формат диска для его выделения и кликните по кнопке Finish чтобы построить новый том и получить его в готовности для подключения к ВМ. Вы можете подключить его с применением virt-manager или команды virsh.

Существует ряд форматов, которые поддерживает libvirt (raw, cow, qcow, qcow2, qed, vmdk). Воспользуйтесь дисковым форматом, максимально соответствующим вашей среде и установите соответствующие размеры в полях Max Capacity и Allocation для принятия решения о том собираетесь ли вы осуществлять предварительное либо динамичное выделение. Если оставите размер своего диска одинаковым в Max Capacity иAllocation, он будет предварительно выделенным, в противном случае выделение будет динамичным (thin-provisioned). Отметим, что формат qcow2 не поддерживает метод динамичного выделения.

В Главе 7, Шаблоны и снимки все перечисленные форматы дисков будут детально объяснены. На текущий момент просто поймите, что qcow2 является специально разработанным дисковым форматом для виртуализации KVM. Он поддерживает расширенные свойства необходимые для создания внутренних моментальных снимков. {Прим. пер.: некоторые подробности о Поддерживаемых форматах образов также можно почерпнуть в нашем переводе 2го издания Полного руководства Proxmox.}

Создание томов при помощи команды virsh

Синтаксис создания тома при помощи команды virsh таков:


# virsh vol-create-as dedicated_storage vm_vol1 10G
 	   

Здесь dedicated_storage это ваш пул хранения, vm_vol1 является именем вашего тома, а 10G его размер:


# virsh vol-info --pool dedicated_storage vm_vol1
Name:         vm_vol1
Type:         file
Capacity:     1.00 GiB
Allocation:   1.00 GiB
 	   
[Замечание]Замечание

Сама команда virsh и аргументы создания тома хранения почти одни и те же вне зависимости от типа пула хранения, в котором он создаётся. Просто введите соответствующие данные в переключатель --pool.

Удаление тома при помощи команды virsh

Синтаксис удаления тома при помощи команды virsh таков:


#virsh vol-delete dedicated_storage vm_vol2
 	   

Выполнение данной команды удалит том vm_vol2 из пула хранения dedicated_storage.

[Замечание]Замечание

Сама команда virsh и аргументы создания тома хранения почти одни и те же вне зависимости от типа пула хранения, в котором он создаётся. Просто введите соответствующие данные в переключатель --pool.

Выводы

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