J'ai un VM que je peux commencer par virsh
. Selon virsh dumpxml VM1
, c'est la PTY allouée:
<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>
Le VM est en cours d'exécution:
# virsh list
Id Name State
----------------------------------
7 VM1 running
À l'intérieur de la machine virtuelle, il s'agit de la configuration de GRUB:
kernel /boot/vmlinuz-2.6.24-28-virtual root=UUID=7a1685b9-ecc8-4b70-932c-459a6faac07d ro quiet splash console=tty0 console=ttyS0,9600n8
Et ceci est la ligne de commande lancée par VIRSH pour démarrer la machine virtuelle:
/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
Mais si je me connecte avec virsh console VM1
, ou je fais cat /dev/pts/6
, rien ne montre dans le VM console.
Y a-t-il quelque chose d'autre que je dois considérer?
J'ai deux VMS, on a commencé directement avec kvm
, l'autre via virsh
. Celui qui a commencé a directement une console de travail. J'ai vérifié les fichiers ouverts dans les deux cas:
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
Comme vous pouvez le constater, dans l'un des VMS (le mauvais), il n'y a pas de descripteurs de fichier 1 et 2 et de descripteur de fichier 0 est redirigé vers/dev/null. C'est le problème que je suppose.
La question est, comment puis-je dire à VIRSH de ne pas le faire?
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
C'est ce que j'ajoute normalement à la définition VMS, en utilisant virsh edit
Puis console=ttyS0
annexé dans la ligne de noyau de la machine virtuelle à grub.conf
Ne m'a jamais manqué jusqu'à présent
Exemple de travail d'utilisation de Debian Jessie en tant que système d'exploitation hôte et invité.
créez A VM à l'aide de virt-install ou de Virt-Manager dans tout cas où vous obtiendrez des instructions de console série ajoutées au fichier vm.xml
dans Guest VM Exécutez ce qui suit
systemctl enable [email protected]
systemctl start [email protected]
dans Guest VM en /etc/default/grub
remplacer
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
#GRUB_TERMINAL=console
par
GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0"
GRUB_TERMINAL="serial console"
dans Guest VM Exécutez ce qui suit
guest# update-grub
le VM console pour exécuter VM peut être obtenu par
Host# virsh console VM
ou démarrez le VM avec la console attachée
Host# virsh start VM --console
Sources:
J'ai trouvé la réponse la plus applicable ici :
Supposons que votre domaine virtuel soit myGuest
, votre éditeur préféré est vi
, et votre invité est installé avec grub2
et utilise systemd
. Si la dernière hypothèse n'est pas vraie, vous pourriez avoir un coup d'œil à travailler avec la console de série .
Tout d'abord, installez libguestfs-tools
sur l'hôte: Sudo apt install libguestfs-tools
. Vous aurez besoin de cela lorsque vous travaillez avec des invités sans tête.
Deuxièmement, fermez votre invité: virsh shutdown myGuest
.
Ensuite, montez le disque virtuel: guestmount -d myGuest -i /mnt
(ou utilisez tout autre répertoire existant comme montage). Maintenant en /mnt
Vous devriez être capable de voir le système de fichiers de l'invité.
Avec grub2
et systemd
, il vous suffit de modifier la configuration de GRUB: vi /mnt/etc/default/grub
, et modifier comme
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"
Comme vous devrez courir update-grub
sur l'invité, pour le premier départ, vous devez également modifier /mnt/boot/grub/grub.cfg
. Trouvez l'élément de menu de démarrage par défaut et appendez les informations de la console à l'entrée linux
pour ressembler à
linux /boot/vmlinuz-4.4.0-75-generic root=UUID=76f3e237-d791-4e9d-8ad7-fe5c9165ae55 ro console=ttyS0,19200 earlyprint=serial,ttyS0,19200
Peut-être avez-vous besoin de privilèges root pour monter et éditer les fichiers.
Redémarrez maintenant l'invité et démarrez la console virtuelle:
virsh start myGuest && virsh console myGuest
Vous devriez voir le journal du noyau puis une invite de connexion. Après se connecter, n'oubliez pas de courir Sudo update-grub
.