Сегодня использование виртуальных машин повсеместно. Кто-то на них держит продакшн-сервисы, кто-то тестовые хосты, кто-то раскатывает на них лабораторные работы.
Я сижу на Linux и для виртуализации использую KVM. Иногда у меня нет возможности подключиться к VM через ssh, также невозможно и через virt-manager

- Что делать?
- Использовать virsh console

Окей, давайте посмотрим.

virsh — утилита, из состава библиотеки libvirt, для командной строки Linux, предназначенная для управления виртуальными машинами и гипервизорами KVM и Xen.

Библиотека libvirt используется в качестве интерфейса к различным технологиям виртуализации.

Все, что нам нужно сделать - это предварительно настроить виртуальную машину

Необходимо внести изменения в параметры конфигурации загрузчика GRUB.
У меня на VM установлен Debian 11, конфиг располагается по пути /etc/default/grub

Учтите, что я все настраиваю на свежей системе, если у вас измененный конфиг GRUB, то вносите изменения вручную.
Буду делать заметки для CentOS, под командами Debian, т.к. настройка немного отличается.

Для начала сделаем бэкап конфигурации (Всегда это делаю при изменении конфигов и вам советую)

sudo cp /etc/default/grub /etc/default/grub.default

Передаем ядру параметр вывода в tty
GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0"

sudo sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="quiet"/GRUB_CMDLINE_LINUX_DEFAULT="quiet console=tty0 console=ttyS0"/g' /etc/default/grub

В CentOS нет строки GRUB_CMDLINE_LINUX_DEFAULT, поэтому добавим её следующей командой:

echo 'GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0"' | sudo tee -a /etc/default/grub

Раскоментируем строку включения консольного режима

sudo sed -i 's/#GRUB_TERMINAL=console/GRUB_TERMINAL=console/g' /etc/default/grub

В CentOS по-умолчанию режим уже активирован в параметре GRUB_TERMINAL_OUTPUT

Укажем настройки serial

echo 'GRUB_SERIAL_COMMAND="serial -unit=0 -speed=115200 -word=8 -parity=no -stop=1"' | sudo tee -a /etc/default/grub

Обновим GRUB

sudo update-grub

Обновление изменений GRUB в CentOS:

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

Запустим и добавим в автозапуск сервис serial-getty с указанным нами ранее ttyS0

sudo systemctl enable --now serial-getty@ttyS0

Теперь можно пробовать подключиться к VM

Переходим на наш гипервизор и смотрим под каким ID/Name работает VM c помощью команды virsh list.
Стоит учесть, что лучше всего для подключений использовать Name, при перезапусках VM - ID может меняться.

┌[user@sdnv-pc]-(~)
└> virsh list
 Id   Name     State
------------------------
 9    debian   running

Пробуем зайти в консоль VM debian с помощью команды virsh console "Name" и видим сообщение о подключении.

┌[user@sdnv-pc]-(~)
└> virsh console debian
Connected to domain 'debian'
Escape character is ^] (Ctrl + ])

Нажимаем Enter, чтобы попасть в приглашение, логинимся под нашим пользователем VM и проверяем под каким tty мы зашли:

debian login: user
Password: 

user@debian: w
16:23:01 up 4 min,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user     ttyS0    -                16:22    0.00s  0.16s  0.00s w

Все работает! Теперь можно не бояться за свои виртуалки и всегда иметь доступ к ним из KVM-хоста.

Комментарии (10)


  1. estet
    18.11.2022 15:13
    +1

    nemu - вот это действительно легко.


    1. sdnv Автор
      19.11.2022 23:58

      Крутая штука, будет интересно глянуть!


  1. AlexGluck
    19.11.2022 04:00

    Не очень понятно почему нельзя было подключиться через virt-manager в serial-console?


    1. sdnv Автор
      19.11.2022 23:46

      Мною рассматривалась ситуация, когда нет возможности использовать virt-manager
      Например, когда под рукой только винда


      1. A1EF
        21.11.2022 09:46

        Под Windows есть virt-viewer. Правда, он не слишком-то удобный.


        1. sdnv Автор
          21.11.2022 10:15

          О, кайф, спасибо за подсказку. Я только в докере поднимал веб-интерфейс для virt-manager. Лагает, но основную функцию выполнять может


  1. S-trace
    19.11.2022 09:40
    +2

    Вместо 2 команд systemctl start + systemctl enable можно просто сделать sudo systemctl enable --now serial-getty@ttyS0


    1. sdnv Автор
      19.11.2022 23:48

      Точно, забываю про это. Спасибо, поправил в статье!


  1. litos
    19.11.2022 09:58

    Чем не устраивает подключение к виртуальной машине через VNC? Я имею ввиду тот, что встроен в гипервизор KVM естественно.

    Если не работает ssh, то надо его чинить, равно как и сеть (и как раз VNC поможет), а остальное уже полумеры

    (Ну это как правило, сценарии использования могут быть разные, может вообще сеть кому-то не нужна)


    1. sdnv Автор
      19.11.2022 23:55

      Как вариант, кстати. Попробую настроить и VNC, в идеале - через SSH-туннель