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>