Come SSH da host a guest utilizzando QEMU?


30

Come configuro ssh dall'host al guest usando qemu? Sono in grado di utilizzare il reindirizzamento delle porte quando avvio la VM senza parametri speciali, come segue:

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

Ma quando provo ad avviare utilizzando quanto segue:

/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

Ottengo il seguente errore e la macchina virtuale non si avvia:

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

Si noti che sono in grado di avviare la VM senza il -netparametro senza problemi, tuttavia, desidero impostare ssh dall'host al guest. ssh dall'ospite all'host funziona bene come previsto.

modificare

Ho provato ad usare

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

così come

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

ma l'errore persiste e la macchina virtuale non si avvia.


Risposte:


37

Penso che l'errore non provenga dall'istruzione -net, ma da:

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

L'istruzione utilizza già la porta 7777. Per il port forwarding, con

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

funziona bene quando non si configura il canale seriale virtio.

Se ho capito bene, vuoi impostare un canale seriale virtio per comunicare dall'host alla VM usando un socket di dominio Unix?

In questo caso, il seguente potrebbe fare il lavoro:

/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

MODIFICARE:

Un esempio di come connettersi dall'host usando ssh alla VM:

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

Questo hostforwarding mappa la porta localhost (host) 10022 sulla porta 22 della VM. Una volta avviata la VM in questo modo, è possibile accedervi dall'host locale come segue:

ssh vmuser@localhost -p10022

Il comando -net nic inizializza una scheda di interfaccia di rete virtuale molto semplice.


Sì, hai ragione, sto cercando di usare virtio-serial per stabilire la comunicazione da host a guest. La VM si è avviata dando un avviso sulla console host: Warning: vlan 0 with no nicsma quando lo faccio ifconfigsul guest vedo solo loe ottengo ancora ssh: connect to host 10.0.2.15 port 22: Connection timed outquando provo a ssh; l'IP che ho usato per ssh è 10.0.2.15, che secondo man qemu-system-x86_64IP è assegnato alla prima macchina virtuale avviata se l'IP statico non è assegnato. E ora non c'è connessione a Internet sull'ospite.
jobin

Quello che potresti voler fare è mappare la porta 22 utilizzata per ssh su un'altra porta e quindi collegarti dal computer host per accedere alla VM. Ho modificato la mia risposta con un esempio.
mas_kur1,

La risposta modificata funziona perfettamente!
dbernard,

19

Prova questo all'avvio qemu -redir tcp:2222::22

$ ssh -p 2222 localhost

Il flag tcp: 2222 :: 22 nel comando di avvio di qemu mappa la porta 2222 della macchina host sulla porta 22 (la porta ssh predefinita) sulla macchina virtuale.

Quindi, semplicemente inviando alla porta 2222 sul tuo localhost (la macchina host) reindirizzerai tutto il traffico sulla porta ssh 22 nella macchina virtuale, che dovrebbe permetterti di ssh come faresti normalmente con qualsiasi altra macchina.


3
Benvenuti in Unix e Linux! Siamo alla ricerca di risposte lunghe che forniscano una spiegazione e un contesto. Non limitarti a dire "Prova questo ..."; spiega perché la tua risposta è giusta, idealmente con citazioni. Le risposte che non includono spiegazioni potrebbero essere rimosse.
G-Man dice "Ripristina Monica" il

3
Sento solo il bisogno di dire che questa risposta mi ha aiutato più di tutte le altre risposte sopra. Nessuna informazione superflua e, soprattutto, funziona. Perfetto quando atterrando da una query di Google "come diamine faccio ssh in qemu".
gennaio

1
Questa risposta fa ciò che il 99,9% delle persone vuole davvero. Vale a dire la macchina host ottiene l'accesso ssh alla macchina virtuale, inclusa la possibilità per l'host di copiare file da e verso la macchina virtuale usando scp o simili.
null Utente

1
Brillante! Il mio comando Raspberry Pi ora assomiglia aqemu-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
entusiastageek

2
man qemu-system-x86_642.5.0: Nota: le opzioni autonome legacy -tftp, -bootp, -smb e -redir sono ancora elaborate e applicate all'utente -net.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

4

Configurazione OpenSSH testata su Buildroot 2016.05, QEMU 2.5.0, host Ubuntu 16.04

Oltre all'inoltro di rete QEMU, devi anche impostare correttamente SSH, che tratterò qui.

Inizia con qemu_x86_64_defconfige abilita il pacchetto openssh:

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

Quindi avviare QEMU con:

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

Quindi ospite:

vi /etc/ssh/sshd_config

Modifica le seguenti impostazioni:

PermitRootLogin yes
PermitEmptyPasswords yes

E riavvia il server:

/etc/init.d/S50sshd restart

È perché questo file esiste che sshd si avvia di default, ecco la fonte: https://github.com/buildroot/buildroot/blob/2018.02/package/openssh/S50sshd e le operazioni di avvio chiave sono:

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

Quindi dall'host:

ssh root@localhost -p 2222

In caso di errore, verificare innanzitutto che l'inoltro di rete nc -l funzioni con uno strumento di livello inferiore rispetto a sshd: ad esempio, come descritto qui .

controlla anche i log del server sul guest:

less /var/log/messages

Quindi sul sistema finale dovresti automatizzare la creazione di quel file di registro con BR2_ROOTFS_OVERLAYo BR2_ROOTFS_POST_BUILD_SCRIPT: Personalizzare il filesystem di destinazione generato | buildroot.org


-1

Credo che tu debba usare hostfwd=tcp::7777-:8001ohostfwd=tcp::7777:8001

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.