Управление виртуальными машинами с помощью Cockpit

Peter Boy Version F35-F36 Last review: 2022-05-10

Виртуальная машина создаётся исходя из определённых предположений о требуемой памяти, хранилище данных, вычислительной мощности и так далее. Слишком часто эти предположения приходится корректировать на основе фактической практики использования, что требует дополнительной работы по настройке со стороны системного администратора. Cockpit значительно упрощает и облегчает эту работу, особенно для Fedora Server Edition, которая не включает графический интерфейс.

В статье описаны отдельные часто повторяющиеся задачи перенастройки.

Управление конфигурациями виртуальных машин

В локальном браузере откройте Cockpit на хост-системе, используя порт 9090, например https://example.com:9090. Войдите либо как root, либо со своей административной учётной записью. Выберите «Virtual Machines» в левой навигационной колонке.

Обзор виртуальных машин в Cockpit

Если вкладка «Virtual Machines» отсутствует, соответствующий модуль Cockpit — cockpit-machines — ещё не установлен. Обратитесь к руководству Adding Virtualization Support за информацией о том, как установить и подготовить модуль.

Страница обзора виртуальных машин перечисляет в центральной области все установленные виртуальные машины вместе с их текущим состоянием. В приведённом выше примере есть 3 виртуальные машины, 2 из них запущены. Наиболее часто выполняемое действие — завершение работы или запуск — доступно непосредственно в виде кнопки. Дополнительные часто необходимые функции предлагаются в раскрывающемся меню справа от неё. Она даже предлагает (простую) миграцию на другую машину.

Управление базовой средой выполнения виртуальной машины на хосте

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

Основные параметры среды выполнения виртуальной машины в Cockpit

Некоторые из отображаемых параметров в основном информативны, например, сведения о гипервизоре, или вы вряд ли когда-либо захотите их менять, например, тип ЦП. Эти вещи могут оказаться полезными при диагностике проблем.

Более интересной является возможность быстро включать и отключать автозапуск при перезагрузке хоста [1]. Примером может служить (неактивная) резервная виртуальная машина, которая может взять на себя работу при возникновении проблем с основной виртуальной машиной. Своего рода «холодный резерв», возможно, единственная возможность в случае ограниченных ресурсов ЦП и ОЗУ на машине. Действие выполняется немедленно и вступает в силу (при следующей перезагрузке хоста), нет необходимости в явной отправке.

Очень полезной в повседневной работе является информация в реальном времени о потреблении ресурсов для ЦП и ОЗУ [2] и одновременная возможность корректировать эти параметры [3]. Хотя для внесения этих изменений или их вступления в силу потребуется перезагрузить виртуальную машину.

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

Управление хранилищем виртуальной машины

Виртуальная машина обычно использует (виртуальный) диск, предоставляемый как файл образа диска в пуле Libvirt images (/var/lib/libvirt/images), либо в формате qcow2, либо raw. А управление хранилищем означает манипулирование соответствующим файлом.

Увеличение виртуального диска

Cockpit мощный, но (пока) не идеальный. Текущая версия не предоставляет графического инструмента для этой цели. Системному администратору всё ещё приходится полагаться на инструменты командной строки, такие как qemu-img или утилиты virt-* из guestsfs-tools. К счастью, нам нужно использовать инструмент командной строки только для увеличения образа виртуального диска, пока виртуальная машина остановлена. После этого мы можем снова запустить виртуальную машину и использовать Cockpit виртуальной машины для перенастройки хранилища.

В качестве примера используйте Cockpit vm2, чтобы отобразить текущую конфигурацию хранилища. Откройте http://vm2:9090 (опять же, скорректируйте адрес по мере необходимости) в браузере, войдите в систему и выберите Storage в левой навигационной колонке.

Обзор файловых систем в Cockpit

В разделе Filesystems центральной области содержимого [1] есть 2 файловые системы: root размером 11 ГиБ и boot размером 1 ГиБ. Дополнительная информация находится в правой колонке. Раздел Devices указывает группу томов размером 11 ГиБ [2]. Это означает, что корневая файловая система полностью заполняет эту группу томов. Раздел Drives перечисляет виртуальный диск размером 12 ГиБ [3]. Это означает, что этот диск полностью заполнен двумя файловыми системами.

После завершения работы vm2 мы можем увеличить виртуальный диск на 20 ГиБ до общего размера 32 ГиБ в терминале Cockpit хоста.

# qemu-img  resize  /var/lib/libvirt/images/vm2.qcow2  +20G
Image resized.
# qemu-img  info  /var/lib/libvirt/images/vm2.qcow2
file format: qcow2
virtual size: 32 GiB (34359738368 bytes)
disk size: 2.01 GiB
...

Как показывает информация, размер виртуального диска теперь составляет 32 ГиБ. Файл по-прежнему занимает только 2,01 ГиБ в каталоге благодаря динамическому формату файла qcow2.

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

Перенастройка увеличенного виртуального диска

После повторного запуска vm2 страница Storage теперь, что неудивительно, показывает диск размером 32 ГиБ, но больше ничего не изменилось. Таким образом, на диске теперь 20 ГиБ нераспределённого пространства.

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

Теперь у вас есть три варианта:

  1. Увеличьте существующий раздел и группу томов, чтобы добавлять логические тома по мере необходимости. Это способ схемы разбиения по умолчанию в Fedora Server. К сожалению, вы не можете увеличить раздел и группу томов с помощью Cockpit, но должны однократно использовать терминал командной строки. Позже вы сможете использовать Cockpit для добавления или увеличения логических томов по мере необходимости.

  2. Избегайте использования терминала и создайте дополнительный раздел и группу томов, используя только Cockpit. Как и в случае с вариантом 1, вы снова можете использовать Cockpit для добавления или увеличения логических томов по мере необходимости.

  3. Игнорируйте логику хранилища Fedora Server и просто расширьте всё до максимального размера.

Здесь мы продолжим с вариантом 2. Он так же привержен логике Fedora Server, как и вариант 1, если не даже строже. С Cockpit это более удобный вариант, и в конечном счёте он выполняет те же действия, то есть создание логического тома с файловой системой и монтирование его в подходящем месте дерева каталогов. А вариант 3 концептуально худший из всех.

На странице Storage vm2 выберите виртуальный диск размером 32 ГиБ и на открывшейся новой странице нажмите кнопку «Create partition» прямо под разделом /dev/vda2 [1].

Форма создания раздела в Cockpit

Вам нужно только изменить тип на «No filesystem» [2] и создать раздел. Проходит некоторое время, прежде чем в списке отображается третий раздел.

Вернитесь на страницу Storage. В верхней части правой колонки активируйте значок меню рядом с Devices и выберите «Create volume group».

Форма создания группы томов в Cockpit

В открывшейся форме введите имя группы томов, здесь по аналогии с fedora_fedora системной области — fedora_user, выберите только что созданный раздел /dev/vda3 и создайте группу томов. Форма закроется, и на странице Storage вы найдёте новое устройство — группу томов fedora_user размером 20,0 ГиБ.

Настройка отдельного дискового пространства для пользовательских данных

Как уже упоминалось, в соответствии с концепцией хранилища Fedora Server, область данных, отдельная от системных данных, должна содержать служебные и пользовательские данные. Один из способов, совместимых с FHS, — смонтировать каталог /srv в отдельном логическом томе и хранить там соответствующие данные для всех служб. Другой способ — смонтировать известный выделенный каталог приложения в его собственном логическом томе. Например, в Fedora Server PostgreSQL хранит все свои данные в /var/lib/pgsql, а Apache httpd — в /var/www. Эти каталоги монтируются каждый в своём логическом томе, предпочтительно до установки программного обеспечения.

В качестве примера мы установим данные httpd в отдельный логический том. На случай, если программное обеспечение уже установлено, остановите httpd и временно переместите данные в сторону. Мы восстановим их позже. Каталог /var/www должен быть пустым.

Страница Storage виртуальной машины (vm2) отображает раздел Devices в верхней правой колонке, а внутри — группу томов fedora_user, которую мы настроили ранее. Нажатие на fedora_user открывает страницу конфигурации группы томов. Под блоком с подробностями группы томов находится список существующих логических томов этой группы томов. Справа от заголовка предоставляется ссылка «Create new logical volume», которая открывает форму конфигурации.

Форма создания логического тома в Cockpit

Замените предустановленное имя описательным термином, здесь, например, web service, и выберите подходящий размер. Благодаря динамическому распределению пространства формата qcow2 вы можете выбрать размер определённо немного щедрее. Однако последующее расширение с помощью Cockpit выполняется очень легко.

С помощью Purpose форма также предлагает возможность создать пул для «тонко резервируемых томов», который, в свою очередь, вмещает логические тома, динамически распределяющие пространство. В случае виртуальной машины это обычно не так полезно, как на физических машинах, потому что файлы образов дисков qcow2 уже обеспечивают своего рода тонкое резервирование. Но ваш опыт может отличаться.

После создания логического тома вы найдёте запись в списке «Logical volumes». Разверните строку с помощью значка треугольника. Вы найдёте кнопку Format. Связанная форма позволяет создать и смонтировать файловую систему за один проход.

Создание файловой системы в Cockpit

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

# df -h
Filesystem                          Size  Used Avail Use% Mounted on
...
/dev/mapper/fedora_fedora-root       11G  1.8G  9.3G  16% /
tmpfs                               1.5G  4.0K  1.5G   1% /tmp
/dev/vda1                          1014M  187M  828M  19% /boot
/dev/mapper/fedora_user-webservice  8.0G   90M  8.0G   2% /var/www

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

Если вы переместили файлы в сторону в начале, теперь вы можете их восстановить. Для надёжности восстановите метки SELinux.

# /sbin/restorecon -R -vF /var/www

Теперь самое время установить соответствующие программы. Программное обеспечение, предоставляемое дистрибутивом Fedora в виде rpm, устанавливается в соответствующие системные каталоги с помощью инструмента dnf. Внешнее программное обеспечение следует устанавливать в /opt или /usr/local, чтобы держать его отдельно от файлов дистрибутива и предотвратить любое потенциальное взаимное вмешательство. В соответствии с логикой хранилища вам также следует создать отдельный логический том и смонтировать его в /opt. Примером этого может служить сервер приложений Wildfly, который хранит программу, конфигурацию и, возможно, данные в одном месте.

Добавление виртуального диска

Расширение виртуального (системного) диска — не единственный способ предоставить дополнительное хранилище и не обязательно лучший. В случае образов виртуальных дисков создание выделенного виртуального диска вместо создания логических томов является надёжной, часто лучшей альтернативой. Это добавляет больше гибкости. Например, в случае упомянутой выше виртуальной машины «холодного резерва» системный администратор может назначить (виртуальный) диск со всем текущим набором данных другой виртуальной машине менее чем за минуту.

Cockpit поддерживает создание дополнительных виртуальных дисков (но, к сожалению, не изменение существующего). На странице подробностей виртуальной машины в разделе Disks вы найдёте кнопку Add Disk. Она открывает форму для заполнения.

Форма добавления виртуального диска в Cockpit

В приведённом выше примере мы создаём диск размером 30 ГБ для Web service. Add создаёт образ диска в /var/lib/libvirt/images и добавляет его на страницу подробностей виртуальной машины в Cockpit. Вы можете проверить в окне терминала с помощью lsblk. Он показывает диск vdb пока без каких-либо разделов.

Cockpit хоста просто создаёт новый (виртуальный) жёсткий диск и «вставляет» его в виртуальную машину. Конфигурация и настройка жёсткого диска происходят внутри виртуальной машины. Их Cockpit может выполнить это очень легко. Откройте новую вкладку в браузере, откройте Cockpit виртуальной машины и выберите там Storage.

Дополнительный виртуальный диск в Cockpit

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

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

Управление дисковым пулом libvirt

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

Системный администратор, приверженный логике хранилища Fedora Server, настроил выделенную отдельную файловую систему для пула образов или в целом для каталога libvirt. На странице Storage Cockpit хоста определите эту файловую систему и выберите её. Разверните строку с помощью значка треугольника.

Увеличение пула libvirt в Cockpit

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

Проще или быстрее не бывает.

Управление сетевым подключением

Управление виртуальной сетью libvirt

Текущая версия Cockpit (255) пока не предлагает так много параметров конфигурации для управляемой libvirt виртуальной сети. Cockpit перечисляет существующие виртуальные сети под ссылкой «Network» в верхней части строка за строкой. В основном это только сеть по умолчанию. При развёртывании строки становятся видны параметры редактирования.

Обзор виртуальных сетей libvirt в Cockpit

Для производственной эксплуатации наиболее важным может быть обеспечение или возможность проверки запуска сети при перезагрузке хоста. Все остальные параметры конфигурации, в частности, например, включение и отключение NAT, требуют использования « virsh net-edit default» в командной строке.

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

Создание виртуальной сети libvirt в Cockpit

Системный администратор может выбрать Forward mode, либо NAT, Open, либо none (изолированный), что может быть очень удобно. Device по умолчанию — automatic, в качестве альтернативы вы можете выбрать существующее устройство. Автоматический вариант создаёт новое устройство virbr<x>. Более сложная конфигурация, такая как доменное имя и разрешение имён, также потребует здесь работы с инструментами командной строки.

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

Управление сетевым подключением виртуальной машины

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

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

Добавление интерфейса

Возможно, вы настроили виртуальную машину только с публичным интерфейсом, чтобы предоставить некоторую публичную службу. Согласно общим рекомендациям она использует mac-vlan в качестве эффективного типа подключения. В графическом интерфейсе Cockpit виртуальной машины он отображается как «type: direct» и «Source: enp1s0», физический интерфейс хоста [1].

Публичный виртуальный интерфейс libvirt в Cockpit

Через некоторое время вам может потребоваться доступ к службе, предоставляемой хостом, например, к службе базы данных. Поскольку публичный интерфейс использует mac-vlan, прямое взаимодействие между хостом и виртуальной машиной невозможно (из-за технических ограничений этого типа). Кроме того, вы можете захотеть защитить это взаимодействие и его данные от публичного доступа. Решение состоит в том, чтобы добавить виртуальной машине интерфейс, который подключается к внутренней виртуальной сети libvirt с именем default и использованием virbr0.

С Cockpit это всего лишь нажатие на ссылку «Add network interface» справа от заголовка раздела [2] и заполнение простой формы.

Добавление внутреннего виртуального интерфейса libvirt в Cockpit

В случае внутреннего интерфейса оставьте всё как предложено, но просто активируйте «Always attach», чтобы он автоматически становился доступным после перезагрузки. Используйте кнопку «Add» для создания интерфейса.

Интерфейс появляется ниже публичного интерфейса. А внутри виртуальной машины ip a показывает дополнительное подключение «enp7s0». Cockpit всё настраивает самостоятельно, дальнейшее участие системного администратора не требуется.

Изменение интерфейса

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

В разделе network страницы подробностей виртуальной машины есть только один интерфейс с 3 кнопками: Delete, Unplug и Edit. Последняя открывает форму свойств интерфейса.

Редактирование виртуального интерфейса libvirt в Cockpit

Форма показывает определение текущей внутренней сети. Просто измените Interface type с «Virtual network» на «Direct attachment» и Source с «default» на «enp1s0», физический интерфейс хоста. Сохраните выбор и перезагрузитесь. Предполагая, что DHCP работает, виртуальная машина имеет прекрасно работающее подключение к публичной сети, включая разрешение имён и конфигурацию брандмауэра по умолчанию. В противном случае вам придётся определить статическую сетевую конфигурацию.

Даже если вам нужен публичный интерфейс в дополнение к существующему внутреннему интерфейсу, вы можете предпочесть отредактировать существующий интерфейс и позже добавить новый внутренний интерфейс. Таким образом вы следуете общепринятой практике всегда настраивать публичный интерфейс как «первый», то есть enp1s0 или eth0.

Удаление интерфейса

В качестве примера виртуальная машина оснащена двумя интерфейсами: публичным (enp1s0) и внутренним (enp7s0).

Удаление виртуального интерфейса libvirt в Cockpit

Вероятно, вы не хотите публичный интерфейс, а хотите, чтобы машина была хорошо защищена от публичной сети. Поэтому вы удаляете публичный интерфейс. Простое нажатие на Delete удалит этот интерфейс из виртуальной машины (после подтверждения). Если вы проверите сетевую конфигурацию внутри машины, nmcli device show перечислит только одно устройство, привязанное к существующему подключению. А ip a перечислит только lo и enp7s0.

nmcli conn show всё ещё перечисляет подключение enp1s0, но без привязанного устройства. Причина в том, что это был первый интерфейс, явно настроенный во время установки. Поэтому он был сохранён в /etc/NetworkManager/system-connected, и файл всё ещё там (хотя и без каких-либо параметров конфигурации устройства). Cockpit не удаляет файл конфигурации.

Упрощённый доступ к Cockpit виртуальных машин

Обычно (физический) сервер размещает не одну, а несколько или даже огромное количество виртуальных машин. Каждая виртуальная машина будет иметь работающий веб-интерфейс Cockpit. Чтобы получить к нему доступ, вам нужно открыть окно браузера, подключиться и войти в соответствующую виртуальную машину, с которой вы хотите работать, отдельно — даже если вы хотите выполнить самую минималистичную задачу. Это, безусловно, не сложно, но обременительно.

Для удобства Cockpit предоставляет возможность доступа к экземпляру Cockpit виртуальных машин из веб-интерфейса одного экземпляра, удобно — хоста. Взаимодействие между задействованными экземплярами Cockpit осуществляется не по протоколу HTTP, а по SSH. Поэтому аутентификация также может выполняться через файл ключа. Это безопаснее и удобнее.

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

Выбор или добавление экземпляра Cockpit

Ссылка Add new host открывает простую форму для ввода имени хоста и пользователя. И вы можете назначить цвет. Если вы подключаете виртуальную машину через прямой публичный интерфейс (mac-vlan), вы не можете использовать этот интерфейс, потому что прямой доступ от хоста к виртуальной машине через mac-vlan не поддерживается по техническим причинам. Вам нужно использовать внутренний интерфейс (обычно предоставляемый libvirt virbr0). В качестве пользователя вам следует выбрать непривилегированную административную учётную запись, которая может быть создана во время установки виртуальной машины Anaconda.

Затем Cockpit подключится и запросит пароль пользователя.

Вход в удалённый экземпляр Cockpit

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

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

Вопросы безопасности

Установка Fedora предпринимает несколько усилий, чтобы минимизировать публичную экспозицию. Одно из них — предотвратить вход root по паролю через публичный интерфейс. В то же время Fedora Server по умолчанию устанавливает Cockpit и соответственно открывает брандмауэр. Таким образом, он снова вводит вход по паролю, включая доступ к терминалу. Это в некотором смысле противодействует мере ssh.

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

Есть несколько вариантов.

  1. Самый простой способ — закрыть порт брандмауэра Cockpit.

    # firewall-cmd  --permanent --remove-service=cockpit
    # firewall-cmd  --reload

    Чтобы использовать Cockpit, вам нужно подключиться по ssh к серверу и временно открыть порт.

    # firewall-cmd   --add-service=cockpit
  2. Поскольку вы всё равно входите по ssh, вы также можете сразу инициализировать ssh-туннель и использовать его для Cockpit при необходимости. Как описано выше, у вас служба Cockpit удалена из брандмауэра.

    Чтобы использовать Cockpit, войдите на сервер и временно откройте порт.

    # ssh $user@example.com -i $key  -L 9090:example.com:9090

    Вы можете получить доступ к интерфейсу Cockpit, используя https://localhost:9090 в вашем любимом браузере.

  3. Вы можете установить Cockpit на своей локальной рабочей станции Fedora или на лабораторном сервере, защищённом брандмауэром. Настройте этот экземпляр для доступа к любому из ваших экземпляров Cockpit, как описано в предыдущем разделе. Используйте этот защищённый экземпляр в качестве прокси к вашим публичным серверам. Как описано, он использует защищённое ssh-подключение в публичной сети. Конечно, у вас служба Cockpit также удалена из брандмауэра.

Заключительные замечания

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