Назад | Перейти на главную страницу

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

У меня есть виртуальная машина, с которой я могу начать virsh. В соответствии с virsh dumpxml VM1, это выделенный объект:

<serial type='pty'>
  <source path='/dev/pts/6'/>
  <target port='0'/>
  <alias name='serial0'/>
</serial>
<console type='pty' tty='/dev/pts/6'>
  <source path='/dev/pts/6'/>
  <target type='serial' port='0'/>
  <alias name='serial0'/>
</console>

Виртуальная машина работает:

# virsh list
 Id Name                 State
----------------------------------
  7 VM1                  running

Внутри виртуальной машины это конфигурация grub:

kernel          /boot/vmlinuz-2.6.24-28-virtual root=UUID=7a1685b9-ecc8-4b70-932c-459a6faac07d ro quiet splash console=tty0 console=ttyS0,9600n8

И это командная строка, запускаемая virsh для запуска виртуальной машины:

/usr/bin/kvm -S -M pc-0.12 -enable-kvm -m 256 -smp 1,sockets=1,cores=1,threads=1 -name VM1 -uuid 47ff6ec2-a748-4738-16b9-2ffe5780e456 -nodefaults -chardev socket,id=monitor,path=/var/lib/libvirt/qemu/VM1.monitor,server,nowait -mon chardev=monitor,mode=readline -rtc base=utc -boot c -drive file=/var/VMs/VM1.qcow2,if=none,id=drive-ide0-0-0,boot=on,format=raw -device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 -device virtio-net-pci,vlan=0,id=net0,mac=52:54:00:12:34:50,bus=pci.0,addr=0x3 -net tap,fd=64,vlan=0,name=hostnet0 -chardev pty,id=serial0 -device isa-serial,chardev=serial0 -usb -vnc 127.0.0.1:0 -k de -vga cirrus -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4

Но если я свяжусь с virsh console VM1, или я cat /dev/pts/6, в консоли ВМ ничего не отображается.

Есть еще что-нибудь, что я должен рассмотреть?

ОБНОВИТЬ

У меня две виртуальные машины, одна из которых запущена непосредственно с kvm, другой через virsh. У запущенного напрямую есть рабочая консоль. Я проверил открытые файлы в обоих случаях:

root@host1:~# lsof | grep 25093 | grep dev
kvm       25093         root  DEL       REG                0,4                3758780 /dev/zero
kvm       25093         root  DEL       REG                0,4                3758779 /dev/zero
kvm       25093         root  DEL       REG                0,4                3758777 /dev/zero
kvm       25093         root    0u      CHR              136,3         0t0          6 /dev/pts/3
kvm       25093         root    1u      CHR              136,3         0t0          6 /dev/pts/3
kvm       25093         root    2u      CHR              136,3         0t0          6 /dev/pts/3
kvm       25093         root    3u      CHR             10,232         0t0       8025 /dev/kvm
kvm       25093         root    7u      CHR             10,200         0t0       4983 /dev/net/tun
root@host1:~# lsof | grep 8341 | grep dev
kvm        8341 libvirt-qemu  DEL       REG                0,4                9743486 /dev/zero
kvm        8341 libvirt-qemu  DEL       REG                0,4                9743485 /dev/zero
kvm        8341 libvirt-qemu  DEL       REG                0,4                9743483 /dev/zero
kvm        8341 libvirt-qemu    0r      CHR                1,3         0t0       4640 /dev/null
kvm        8341 libvirt-qemu    4u      CHR                5,2         0t0       4897 /dev/ptmx
kvm        8341 libvirt-qemu    5u      CHR             10,232         0t0       8025 /dev/kvm
kvm        8341 libvirt-qemu   64u      CHR             10,200         0t0       4983 /dev/net/tun

Как видите, в одной из виртуальных машин (не той) нет файловых дескрипторов 1 и 2, а файловый дескриптор 0 перенаправлен на / dev / null. Думаю, в этом проблема.

Вопрос в том, как мне сказать virsh не делать этого?

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

Это то, что я обычно добавляю к определению виртуальных машин, используя virsh edit затем console=ttyS0 добавлен в строку ядра виртуальной машины в grub.conf

Никогда не подводил меня до сих пор

Рабочий пример использования Debian jessie в качестве хостовой и гостевой операционной системы.

  1. создать виртуальную машину с помощью virt-install или virt-manager. В любом случае вы получите операторы последовательной консоли, добавленные в файл VM.xml.

  2. в гостевой виртуальной машине запустите следующее

    systemctl enable serial-getty@ttyS0.service
    systemctl start serial-getty@ttyS0.service
    
  3. в гостевой ВМ в /etc/default/grub заменить

    GRUB_CMDLINE_LINUX_DEFAULT="quiet"
    #GRUB_TERMINAL=console
    

    по

    GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0"
    GRUB_TERMINAL="serial console"
    
  4. в гостевой виртуальной машине запустите следующее

    guest# update-grub
    
  5. консоль ВМ для запуска ВМ можно получить

    host# virsh console VM
    

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

    host# virsh start VM --console
    

Источники:

Я нашел наиболее подходящий ответ Вот:

Предположим, ваш виртуальный домен myGuest, ваш предпочтительный редактор vi, и ваш гость установлен с grub2 и использует systemd. Если последнее предположение неверно, вы можете взглянуть на Работа с последовательной консолью.

Сначала установите libguestfs-tools на хосте: sudo apt install libguestfs-tools. Это понадобится вам при работе с гостями без головы.

Во-вторых, выключите гостя: virsh shutdown myGuest.

Далее монтируем виртуальный диск: guestmount -d myGuest -i /mnt (или используйте любой другой существующий каталог в качестве точки монтирования). Сейчас в /mnt вы должны увидеть файловую систему гостя.

С участием grub2 и systemd, вам нужно только изменить конфигурацию grub: vi /mnt/etc/default/grubи изменить как

GRUB_CMDLINE_LINUX='console=tty0 console=ttyS0,19200n8'
GRUB_TERMINAL=serial
GRUB_SERIAL_COMMAND="serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1"

Как вам придется бежать update-grub на госте, для первого запуска вам также нужно изменить /mnt/boot/grub/grub.cfg. Найдите пункт меню загрузки по умолчанию и добавьте информацию о консоли в linux запись, похожая на

linux   /boot/vmlinuz-4.4.0-75-generic root=UUID=76f3e237-d791-4e9d-8ad7-fe5c9165ae55 ro console=ttyS0,19200 earlyprint=serial,ttyS0,19200

Возможно, вам потребуются права root для монтирования и редактирования файлов.

Теперь перезапустите гостя и запустите виртуальную консоль:

virsh start myGuest && virsh console myGuest

Вы должны увидеть журнал ядра, а затем приглашение для входа в систему. После авторизации не забудьте запустить sudo update-grub.