Como SSH de host para convidado usando QEMU?


30

Como eu configuro o ssh do host para o convidado usando o qemu? Consigo usar o redirecionamento de porta ao inicializar a VM sem nenhum parâmetro especial, da seguinte maneira:

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

Mas quando tento inicializar usando o seguinte:

/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

Eu recebo o seguinte erro e a VM não inicializa:

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

Observe que eu posso inicializar a VM sem o -netparâmetro sem problemas, no entanto, desejo configurar o ssh do host para o convidado. O ssh do convidado para o host funciona bem conforme o esperado.

Editar

Eu tentei usar

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

assim como

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

mas ainda assim o erro persiste e a VM não inicializa.


Respostas:


37

Eu acho que o erro não vem da instrução -net, mas de:

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

A instrução já usa a porta 7777. Para o encaminhamento de porta, com

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

funciona bem quando não está configurando o canal serial virtio.

Se bem entendi, você deseja configurar um canal serial virtio para se comunicar do host para a VM usando um soquete de domínio Unix?

Nesse caso, o seguinte poderia fazer o trabalho:

/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

EDITAR:

Um exemplo de como conectar-se do host usando ssh à VM:

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

Esse encaminhamento de host mapeia a porta 10022 do host local (host) para a porta 22 na VM. Depois que a VM foi iniciada assim, você pode acessá-la a partir do host local da seguinte maneira:

ssh vmuser@localhost -p10022

O comando -net nic inicializa uma placa de interface de rede virtual muito básica.


Sim, você está certo, estou tentando usar o virtio-serial para estabelecer a comunicação do host para o convidado. A VM foi inicializada, dando um aviso no console host: Warning: vlan 0 with no nicsmas quando faço isso ifconfigno convidado, vejo apenas loe ainda recebo ssh: connect to host 10.0.2.15 port 22: Connection timed outquando tento ssh; o IP que eu costumava usar no ssh é 10.0.2.15, que de acordo com man qemu-system-x86_64é o IP atribuído à primeira VM inicializada se o IP estático não estiver atribuído. E agora não há conexão com a internet no hóspede.
Jobin

O que você pode querer fazer é mapear a porta 22 usada para ssh em outra porta e, em seguida, conectar-se a ela na máquina host para acessar a VM. Eu editei minha resposta com um exemplo.
precisa saber é o seguinte

A resposta editada funciona perfeitamente!
dbernard

19

Experimente isso ao iniciar qemu -redir tcp:2222::22

$ ssh -p 2222 localhost

O sinalizador tcp: 2222 :: 22 no comando qemu launch mapeia a porta 2222 da máquina host para a porta 22 (a porta ssh padrão) na máquina virtual.

Em seguida, basta fazer o sshing na porta 2222 no host local (a máquina host) redirecionará qualquer tráfego para a porta ssh 22 na máquina virtual, o que deve permitir o ssh como faria normalmente com qualquer outra máquina.


3
Bem-vindo ao Unix e Linux! Estamos procurando respostas longas que forneçam alguma explicação e contexto. Não basta dizer "Tente isso ..."; explique por que sua resposta está correta, idealmente com citações. As respostas que não incluem explicações podem ser removidas.
G-Man diz 'Reinstate Monica'

3
Apenas sinto a necessidade de dizer que esta resposta me ajudou mais do que todas as outras respostas acima. Nenhuma informação supérflua e, acima de tudo, funciona. Perfeito ao aterrar em uma consulta no google "como diabos eu ssh no qemu".
Jan

1
Essa resposta faz o que 99,9% das pessoas realmente querem. Ou seja, a máquina host obtém acesso ssh à máquina virtual, incluindo a capacidade do host de copiar arquivos de e para a máquina virtual usando scp ou similar.
nullUser 25/05

1
Brilhante! Comando Meu Raspberry Pi agora pareceqemu-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: Nota: As opções independentes herdadas -tftp, -bootp, -smb e -redir ainda são processadas e aplicadas ao usuário -net.
Ciro Santilli escreveu

4

Configuração do OpenSSH testada no Buildroot 2016.05, QEMU 2.5.0, host Ubuntu 16.04

Além do encaminhamento de rede QEMU, você também precisa configurar o SSH corretamente, que abordarei aqui.

Comece qemu_x86_64_defconfige ative o pacote openssh:

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

Em seguida, inicie o QEMU com:

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

Em seguida, no convidado:

vi /etc/ssh/sshd_config

Modifique as seguintes configurações:

PermitRootLogin yes
PermitEmptyPasswords yes

E reinicie o servidor:

/etc/init.d/S50sshd restart

É porque esse arquivo existe que o sshd é iniciado por padrão, aqui está a fonte: https://github.com/buildroot/buildroot/blob/2018.02/package/openssh/S50sshd e as principais operações de inicialização são:

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

Em seguida, do host:

ssh root@localhost -p 2222

Em caso de falha, primeiro teste se o encaminhamento de rede está funcionando com uma ferramenta de nível inferior ao sshd: por exemplo, nc -l conforme descrito aqui .

verifique também os logs do servidor no convidado:

less /var/log/messages

Em seguida, no sistema final, você deve automatizar a criação desse arquivo de log com BR2_ROOTFS_OVERLAYou BR2_ROOTFS_POST_BUILD_SCRIPT: Customizando o sistema de arquivos de destino gerado | buildroot.org


-1

Eu acredito que você precisa usar hostfwd=tcp::7777-:8001ouhostfwd=tcp::7777:8001

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.