Найти тему
HippoLab - блог про Linux

QuickFix - заставляем virsh console работать

Из документации, доступной на просторах интернета, ясно как день - добавьте в конфиг вашей виртуальной машины в секцию <devices>...</devices>

<console type='pty'>
<target type='virtio' port='0'/>
</console>

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

virsh console ${vm_name}

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

И если на CentOS это скорее всего заработает, то вот на Debian не тут-то было. Более того, если вы пытались добавить “console=hvc0” в параметры запуска ядра, то наверняка тачка вообще зависала и не отображала ничего нигде. Давайте разбираться.

Механика этого процесса такова, что кто-то (не будем показывать на systemd пальцем) должен запустить на новом устройстве эмулятор терминала - программу которая обрабатывает ввод от пользователя, запускает запрашиваемые им программы и отображает результат обратно.

Делает он это как? Как известно, systemd может запускать только свои "юниты", а значит, что когда придет время запускать терминал, соответствующий юнит должен существовать. Поскольку такую вещь, как терминал и их количество трудно предсказать для каждого компьютера в мире, systemd применяет "генераторы" - программы, которые на раннем этапе загрузки проходятся по доступному в системе оборудованию и, если надо, создают для него юниты, которые уже потом радостно обрабатываются systemd.

Доступному оборудованию это как? Это, в первую очередь, наличие драйвера и способность системы этот драйвер загрузить в ядро. Поскольку генераторы запускаются на раннем этапе загрузки, тогда, когда еще даже rootfs не смонтирована, драйвера брать неоткуда, кроме как из initramfs - специального бандла, который используется ядром для того, чтобы достать драйвера для разного оборудования, в том числе и для rootfs, когда rootfs, где лежат драйвера еще не доступна. Курица или яйцо?

Вот тут-то у Debian и случился косячок - они не включают в initramfs дрйвера для консолей типа virtio. Соответственно лечением бага будет ребилд initramfs с включенным virtio драйвером.

Добавляем строку “virtio_console” в /etc/initramfs-tools/modules и запускаем

update-initramfs -u

Всё, перезагружаем виртуалку и наслаждаемся работающей консолью. Теперь даже параметр ядра “console=hvc0” не приведет к зависанию.

_______________

Прочитали - поставьте лайк👍! Больше про сетевое администрирование- на моем канале.