8 основных команд virsh для управления Виртуальными машинами из командной строки

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

Anton
Anton   Site

Virsh - это утилита командной строки для управления виртуальными машинами через библиотеку libvirt. Libvirt - это и универсальный набор инструментов, и API для управления платформами виртуализации на базе ядра Linux (KVM), а еще он также поддерживает Xen, VMware и другие платформы.

Команда virsh позволяет управлять виртуальными машинами в интерактивном режиме или в скриптах bash. То есть, мы можем использовать как из командной строки Linux, так и в CI/CD и других средствах автоматизации. Например, используя virsh, системный администратор может быстро подключаться к серверу на хостинге с помощью secure shell (SSH) и выполнять операции на своих виртуальных машинах без доступа к графическому интерфейсу.

Когда вы запускаете virsh без каких-либо опций, он пытается подключиться к локальному гипервизору. Для Linux подключение по умолчанию использует локальную систему QEMU для управления локальными машинами KVM. Вы также можете подключиться к удаленному гипервизору, используя опцию -c или --connect и указав единый идентификатор ресурса (URI) удаленного гипервизора, используя синтаксис libvirt.

Virsh предоставляет сотни разных команд и опций, которые позволяют вам управлять каждым аспектом вашей платформы виртуализации или виртуальных машин. В этой статье я поделюсь восемью командами virsh, которые я использую чаще всего. Из-за характера повседневной работы большинство этих подкомандов применяются непосредственно к виртуальным машинам (или доменам в терминологии libvirt), но у virsh также есть команды для управления самой платформой, такие как добавление пулов хранения, сетей и многого другого.

# virsh list

virsh list - основная команда перечисления запущенных доменов (виртуальных машин в терминологии libvirt). Чтобы перечислить все сконфигурированные машины, нужно добавить параметр --all. Таким образом получим список всех доменов, которые можно использовать с другими командами virsh. Пример выполнения команды virsh list:

# virsh list --all
 Id   Name          State
------------------------------
 3    rh8-vm01      running
 -    crc           shut off
 -    rh8-tower01   shut off

You can use the ID or domain name as input for subsequent commands. ID домена можно использовать вместо имени домена во всех подкомандах virsh.

# virsh start / reboot / shutdown

Хоть эти команды несколько отличаются, мы рассмотрим их вместе, так как они выполняют схожие задачи управления запуском виртуальных машин.

Чтобы выключить виртуальную машину rh8-vm01 из списка доменов, полученного выше, в командной строке Linux надо выполнить команду:

# virsh shutdown rh8-vm01
Domain 'rh8-vm01' is being shutdown
# virsh list
 Id   Name   State
--------------------

А чтобы запустить снова -

# virsh start rh8-vm01
Domain 'rh8-vm01' started
# virsh list
 Id   Name       State
--------------------------
 4    rh8-vm01   running

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

# virsh dumpxml

Команда dumpxml выводит XML конфигурацию для указанного в параметрах домена. Можно использовать для экспорта конфигурации в файл, чтобы поменять настройки существующей виртуальной машины, или использовать в качестве шаблона для создания новой виртуальной машины. По умолчанию XML конфигурация выводится на экран, в командной строке перенаправить вывод в файл можно командой >:

# virsh dumpxml rh8-vm01
<domain type='kvm' id='4'>
  <name>rh8-vm01</name>
  <uuid>53b92c48-fce3-4464-95bf-6f442e988c94</uuid>
  <metadata>
    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
      <libosinfo:os id="http://redhat.com/rhel/8.4"/>
    </libosinfo:libosinfo>
  </metadata>
  <memory unit='KiB'>4194304</memory>
  <currentMemory unit='KiB'>4194304</currentMemory>
  <vcpu placement='static'>2</vcpu>

... TRUNCATED OUTPUT ...
</domain>

XML конфигурацию можно использовать в скриптах автоматизации CI/CD.

# virsh domifaddr

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

# virsh domifaddr rh8-vm01

 Name       MAC address          Protocol     Address
 vnet6      52:54:00:c8:17:6e    ipv4         192.168.122.19/24
 vnet7      52:54:00:04:4d:ac    ipv4         192.168.64.210/24

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

# virsh edit

Команда edit в консоли Linux открыватет текущую XML конфигурацию виртуальной машины в редакторе по умолчанию. Так можно быстро поменять настройки виртуальной машины:

# virsh edit rh8-vm01
<domain type='kvm'>
  <name>rh8-vm01</name>
  <uuid>53b92c48-fce3-4464-95bf-6f442e988c94</uuid>
  <metadata>

... TRUNCATED OUTPUT ...
</domain>

После изменения конфигурации сохраните файл для применения настроек. Некоторые изменения сработают только после перезагрузки виртуальной машины.

# virsh net-edit

Команда net-edit нужна для изменения конфигурации виртуальных сетей. Например, можно поменять привязку MAC адреса к IP адресу, используя раздел настроек DHCP. Так же, как и с командой edit, для редактирования XML используется редактор командной строки, и для применения обновленной конфигурации файл нужно сохранить.

# virsh net-edit --network hostonly
<network>
  <name>hostonly</name>
  <uuid>eddd03ff-5825-42ef-bc99-968bddf773c2</uuid>
  <bridge name='virbr1' stp='on' delay='0'/>
  <mac address='52:54:00:67:75:b1'/>
  <domain name='hostonly'/>
  <ip address='192.168.64.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.64.128' end='192.168.64.254'/>
    </dhcp>
  </ip>
</network>