Wie kann man mit QEMU von Host zu Gast SSH?


29

Wie richte ich mit qemu ssh vom Host zum Gast ein? Ich kann die Portumleitung wie folgt verwenden, wenn ich die VM ohne spezielle Parameter starte:

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

Aber wenn ich versuche, mit den folgenden Mitteln zu booten:

/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

Ich erhalte die folgende Fehlermeldung und die VM bootet nicht:

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

Bitte beachten Sie, dass ich die VM ohne den -netParameter ohne Probleme booten kann. Ich möchte jedoch ssh vom Host zum Gast einrichten. ssh von gast zu gast funktioniert wie erwartet einwandfrei.

Bearbeiten

Ich habe versucht mit

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

ebenso gut wie

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

Der Fehler bleibt jedoch bestehen und die VM bootet nicht.


Antworten:


37

Ich denke, dass der Fehler nicht von der -net-Anweisung kommt, sondern von:

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

Die Anweisung verwendet bereits den Port 7777. Für die Portweiterleitung mit

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

Es funktioniert einwandfrei, wenn der virtuelle serielle Kanal nicht eingerichtet wird.

Wenn ich das richtig verstehe, möchten Sie einen virtuellen seriellen Kanal einrichten, um über einen Unix-Domain-Socket vom Host zur VM zu kommunizieren?

In diesem Fall könnten die folgenden Aufgaben erledigt werden:

/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

BEARBEITEN:

Ein Beispiel für das Herstellen einer Verbindung vom Host mithilfe von ssh zur VM:

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

Diese Hostweiterleitung ordnet den lokalen Host (Host) -Port 10022 dem Port 22 auf der VM zu. Sobald die VM auf diese Weise gestartet wurde, können Sie wie folgt vom localhost aus darauf zugreifen:

ssh vmuser@localhost -p10022

Der Befehl -net nic initialisiert eine sehr einfache virtuelle Netzwerkkarte.


Ja, Sie haben Recht, ich versuche virtio-serial zu verwenden, um die Kommunikation vom Host zum Gast herzustellen. Die VM gebootet hat eine Warnung an der Host - Konsole aus : Warning: vlan 0 with no nicsaber wenn ich ifconfigauf den Gästen sehe ich nur , lound ich bekomme immer noch , ssh: connect to host 10.0.2.15 port 22: Connection timed outwenn ich ssh versuchen; Die IP, die ich für ssh verwendet habe, ist 10.0.2.15. Dies man qemu-system-x86_64ist die IP, die der ersten gebooteten VM zugewiesen wurde, wenn keine statische IP zugewiesen ist. Und jetzt gibt es keine Internetverbindung auf dem Gast.
Jobin

Möglicherweise möchten Sie den Port 22, der für ssh verwendet wird, einem anderen Port zuordnen und dann vom Host-Computer aus eine Verbindung dazu herstellen, um auf die VM zuzugreifen. Ich habe meine Antwort mit einem Beispiel bearbeitet.
mas_kur1

Die bearbeitete Antwort funktioniert einwandfrei!
Donnerstag,

19

Probieren Sie dies beim Starten an qemu -redir tcp:2222::22

$ ssh -p 2222 localhost

Das Flag tcp: 2222 :: 22 im Befehl qemu launch ordnet den 2222-Port des Hostcomputers dem Port 22 (dem Standard-SSH-Port) des virtuellen Computers zu.

Wenn Sie dann einfach auf den 2222-Port Ihres lokalen Hosts (der Host-Maschine) sshen, wird jeglicher Datenverkehr auf den ssh-22-Port der virtuellen Maschine umgeleitet, sodass Sie sshen können, wie Sie es normalerweise auf jeder anderen Maschine tun würden.


3
Willkommen bei Unix & Linux! Wir suchen lange Antworten, die einige Erklärungen und Zusammenhänge liefern. Sagen Sie nicht einfach "Probieren Sie es aus ...". Erklären Sie, warum Ihre Antwort richtig ist, idealerweise mit Zitaten. Antworten, die keine Erklärungen enthalten, werden möglicherweise entfernt.
G-Man sagt, dass Monica am

3
Ich habe nur das Bedürfnis zu sagen, dass mir diese Antwort mehr geholfen hat als alle anderen Antworten oben. Keine überflüssigen Informationen und vor allem funktioniert es. Perfekt bei der Landung von einer Google-Abfrage "Wie zum Teufel soll ich in Qemu ssh".
Januar

1
Diese Antwort macht, was 99,9% der Menschen tatsächlich wollen. Das heißt, die Host-Maschine erhält SSH-Zugriff auf die virtuelle Maschine, einschließlich der Fähigkeit des Hosts, Dateien mit scp oder ähnlichem auf die und von der virtuellen Maschine zu kopieren.
nullUser

1
Brillant! Mein Himbeer-Pi-Befehl sieht jetzt so ausqemu-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
enthusiasticgeek

2
man qemu-system-x86_642.5.0: Hinweis: Legacy-Standalone-Optionen -tftp, -bootp, -smb und -redir werden weiterhin verarbeitet und auf -net-Benutzer angewendet.
Ciro Santilli

4

OpenSSH-Konfiguration getestet auf Buildroot 2016.05, QEMU 2.5.0, Ubuntu 16.04-Host

Neben der QEMU-Netzwerkweiterleitung müssen Sie auch SSH ordnungsgemäß einrichten, worauf ich hier eingehen werde.

Beginnen Sie mit qemu_x86_64_defconfigund aktivieren Sie das openssh-Paket:

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

Dann starte QEMU mit:

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

Dann zu Gast:

vi /etc/ssh/sshd_config

Ändern Sie die folgenden Einstellungen:

PermitRootLogin yes
PermitEmptyPasswords yes

Und starte den Server neu:

/etc/init.d/S50sshd restart

Da diese Datei existiert, startet sshd standardmäßig. Hier ist die Quelle: https://github.com/buildroot/buildroot/blob/2018.02/package/openssh/S50sshd und die wichtigsten Startvorgänge sind:

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

Dann vom Gastgeber:

ssh root@localhost -p 2222

Testen Sie im Fehlerfall zunächst, ob die Netzwerkweiterleitung mit einem niedrigeren Tool als sshd funktioniert: z. B. nc -l wie hier beschrieben . .

Überprüfen Sie auch die Server-Logs auf Gast:

less /var/log/messages

Anschließend sollten Sie auf dem endgültigen System die Erstellung dieser Protokolldatei mit BR2_ROOTFS_OVERLAYoder automatisieren BR2_ROOTFS_POST_BUILD_SCRIPT: Anpassen des generierten Zieldateisystems | buildroot.org


-1

Ich glaube, Sie müssen hostfwd=tcp::7777-:8001oder verwendenhostfwd=tcp::7777:8001

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.