Comment SSH d'hôte à invité en utilisant QEMU?


30

Comment configurer ssh de l'hôte à l'invité en utilisant qemu? Je peux utiliser la redirection de port lorsque je démarre la machine virtuelle sans aucun paramètre spécial, comme suit:

/usr/bin/qemu-system-x86_64 -hda ubuntu1204 -m 512 -redir tcp:7777::8001

Mais quand j'essaie de démarrer en utilisant ce qui suit:

/usr/bin/qemu-system-x86_64 \
-m 1024 \
-name vserialtest \
-hda ubuntu1204 \
-chardev socket,host=localhost,port=7777,server,nowait,id=port1-char \
-device virtio-serial \
-device virtserialport,id=port1,chardev=port1-char,name=org.fedoraproject.port.0 \
-net user,hostfwd=tcp:7777::8001

J'obtiens l'erreur suivante et la machine virtuelle ne démarre pas:

qemu-system-x86_64: -net user,hostfwd=tcp:7777::8001: invalid host
forwarding rule 'tcp:7777::8001'
qemu-system-x86_64: -net user,hostfwd=tcp:7777::8001: Device 'user'
could not be initialized

Veuillez noter que je suis capable de démarrer la machine virtuelle sans le -netparamètre sans aucun problème, cependant, je veux configurer ssh de l'hôte à l'invité. ssh de l'invité à l'hôte fonctionne bien comme prévu.

modifier

J'ai essayé d'utiliser

-net user,hostfwd=tcp::7777-:8001

aussi bien que

-net user,hostfwd=tcp::7777:8001

mais l'erreur persiste et la machine virtuelle ne démarre pas.


Réponses:


37

Je pense que l'erreur ne vient pas de l'instruction -net, mais de:

-chardev socket,host=localhost,port=7777,server,nowait,id=port1-char

L'instruction utilise déjà le port 7777. Pour la redirection de port, avec

-net user,hostfwd=tcp::7777-:8001

cela fonctionne bien lorsque vous ne configurez pas le canal série virtio.

Si je comprends bien, vous souhaitez configurer un canal série virtio pour communiquer de l'hôte à la machine virtuelle à l'aide d'un socket de domaine Unix?

Dans ce cas, les éléments suivants pourraient faire le travail:

/usr/bin/qemu-system-x86_64 \
-m 1024 \
-name vserialtest \
-hda ubuntu1204 \
-chardev socket,path=/tmp/port1,server,nowait,id=port1-char \
-device virtio-serial \
-device virtserialport,id=port1,chardev=port1-char,name=org.fedoraproject.port.0 \
-net user,hostfwd=tcp::7777-:8001

MODIFIER:

Un exemple de la façon de se connecter de l'hôte à l'aide de ssh à la machine virtuelle:

-net user,hostfwd=tcp::10022-:22
-net nic

Cette transmission d'hôte mappe le port 10022 de l'hôte local (hôte) au port 22 sur la machine virtuelle. Une fois que la machine virtuelle a été démarrée comme ceci, vous pouvez y accéder à partir de l'hôte local comme suit:

ssh vmuser@localhost -p10022

La commande -net nic initialise une carte d'interface réseau virtuelle très basique.


Oui, vous avez raison, j'essaie d'utiliser virtio-serial pour établir une communication d'hôte à invité. La machine virtuelle a démarré en donnant un avertissement sur la console hôte: Warning: vlan 0 with no nicsmais quand je le fais ifconfigsur l'invité, je ne vois que loet je reçois toujours ssh: connect to host 10.0.2.15 port 22: Connection timed outquand j'essaie de ssh; l'IP que j'ai utilisé pour ssh est 10.0.2.15, qui, selon, man qemu-system-x86_64est l'IP attribuée à la première machine virtuelle démarrée si l'IP statique n'est pas attribuée. Et maintenant, il n'y a pas de connexion Internet sur l'invité.
jobin

Ce que vous pourriez vouloir faire est de mapper le port 22 utilisé pour ssh sur un autre port, puis de vous y connecter depuis la machine hôte pour accéder à la machine virtuelle. J'ai édité ma réponse avec un exemple.
mas_kur1

La réponse modifiée fonctionne parfaitement!
dbernard

19

Essayez ceci lors du lancement qemu -redir tcp:2222::22

$ ssh -p 2222 localhost

L'indicateur tcp: 2222 :: 22 dans la commande de lancement qemu mappe le port 2222 de la machine hôte au port 22 (le port ssh par défaut) sur la machine virtuelle.

Ensuite, il suffit de sshing vers le port 2222 de votre hôte local (la machine hôte) pour rediriger tout le trafic vers le port ssh 22 de la machine virtuelle, ce qui devrait vous permettre de ssh comme vous le feriez normalement avec n'importe quelle autre machine.


3
Bienvenue sur Unix et Linux! Nous recherchons de longues réponses qui fournissent une explication et un contexte. Ne vous contentez pas de dire "Essayez ceci ..."; expliquez pourquoi votre réponse est juste, idéalement avec des citations. Les réponses qui ne contiennent pas d'explications peuvent être supprimées.
G-Man dit `` Réintègre Monica '' le

3
Je ressens juste le besoin de dire que cette réponse m'a aidé plus que toutes les autres réponses ci-dessus. Aucune information superflue et surtout ça marche. Parfait lors de l'atterrissage à partir d'une requête Google "comment diable puis-je ssh dans qemu".
jan

1
Cette réponse fait ce que 99,9% des gens veulent réellement. C'est-à-dire que la machine hôte obtient un accès ssh à la machine virtuelle, y compris la possibilité pour l'hôte de copier des fichiers vers et depuis la machine virtuelle en utilisant scp ou similaire.
nullUser

1
Brillant! Ma commande Raspberry Pi ressemble maintenant àqemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw console=ttyAMA0,115200" -hda 2014-01-07-wheezy-raspbian.img -nographic -redir tcp:2222::22
enthousiastegeek

2
man qemu-system-x86_642.5.0: Remarque: les options autonomes héritées -tftp, -bootp, -smb et -redir sont toujours traitées et appliquées à l'utilisateur -net.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

4

Configuration OpenSSH testée sur Buildroot 2016.05, QEMU 2.5.0, hôte Ubuntu 16.04

Outre la redirection de réseau QEMU, vous devez également configurer correctement SSH, que je couvrirai ici.

Commencez avec qemu_x86_64_defconfiget activez le paquet openssh:

make qemu_x86_64_defconfig
echo 'BR2_PACKAGE_OPENSSH=y' >> .config
make BR2_JLEVEL=$(nproc)

Ensuite, démarrez QEMU avec:

qemu-system-x86_64 \
  -M pc \
  -append root=/dev/vda \
  -drive file=output/images/rootfs.ext2,if=virtio,format=raw \
  -enable-kvm \
  -kernel output/images/bzImage \
  -m 512 \
  -net nic,model=virtio \
  -net user,hostfwd=tcp::2222-:22

Puis sur invité:

vi /etc/ssh/sshd_config

Modifiez les paramètres suivants:

PermitRootLogin yes
PermitEmptyPasswords yes

Et redémarrez le serveur:

/etc/init.d/S50sshd restart

C'est parce que ce fichier existe que sshd démarre par défaut, voici la source: https://github.com/buildroot/buildroot/blob/2018.02/package/openssh/S50sshd et les principales opérations de démarrage sont:

/usr/bin/ssh-keygen -A
/usr/sbin/sshd
touch /var/lock/sshd

Puis de l'hôte:

ssh root@localhost -p 2222

En cas d'échec, testez d'abord que le transfert de réseau fonctionne avec un outil de niveau inférieur à sshd: par exemple nc -l comme décrit ici .

vérifiez également les journaux du serveur sur l'invité:

less /var/log/messages

Ensuite, sur le système final, vous devez automatiser la création de ce fichier journal avec BR2_ROOTFS_OVERLAYou BR2_ROOTFS_POST_BUILD_SCRIPT: Personnalisation du système de fichiers cible généré | buildroot.org


-1

Je crois que vous devez utiliser hostfwd=tcp::7777-:8001ouhostfwd=tcp::7777:8001

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.