Jak SSH z hosta na gościa za pomocą QEMU?

30

Jak skonfigurować ssh z hosta na gościa za pomocą qemu? Jestem w stanie użyć przekierowania portu, gdy uruchamiam maszynę wirtualną bez żadnych specjalnych parametrów, w następujący sposób:

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

Ale kiedy próbuję uruchomić komputer za pomocą:

/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

Otrzymuję następujący błąd i maszyna wirtualna nie uruchamia się:

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

Pamiętaj, że jestem w stanie uruchomić maszynę wirtualną bez -netparametru bez żadnych problemów, jednak chcę skonfigurować ssh z hosta na gościa. ssh od gościa do hosta działa zgodnie z oczekiwaniami.

Edytować

Próbowałem użyć

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

jak również

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

ale błąd nadal występuje, a maszyna wirtualna nie uruchamia się.

Praca w
źródło
powiązane stackoverflow.com/questions/23106012/...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

37

Myślę, że błąd nie pochodzi z instrukcji -net, ale z:

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

Instrukcja używa już portu 7777. Do przekierowania portów, za pomocą

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

działa dobrze, gdy nie konfigurujesz kanału szeregowego virtio.

Jeśli dobrze rozumiem, chcesz skonfigurować kanał szeregowy virtio do komunikacji między hostem a maszyną wirtualną przy użyciu uniksowego gniazda domeny?

W takim przypadku zadanie może wykonać:

/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

EDYTOWAĆ:

Przykład połączenia z hosta za pomocą ssh z maszyną wirtualną:

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

To przekazywanie hosta mapuje port 10022 hosta lokalnego (hosta) na port 22 na maszynie wirtualnej. Po uruchomieniu maszyny wirtualnej w ten sposób możesz uzyskać do niej dostęp z hosta lokalnego w następujący sposób:

ssh vmuser@localhost -p10022

Polecenie -net nic inicjuje bardzo podstawową wirtualną kartę interfejsu sieciowego.

mas_kur1
źródło
Tak, masz rację, próbuję użyć virtio-serial do nawiązania komunikacji między hostem a gościem. Maszyna wirtualna uruchomiła się, dając ostrzeżenie w konsoli hosta: Warning: vlan 0 with no nicsale kiedy to zrobię ifconfigna gościu, widzę tylko loi wciąż otrzymuję, ssh: connect to host 10.0.2.15 port 22: Connection timed outgdy próbuję ssh; IP, którego użyłem do ssh to 10.0.2.15, co zgodnie z tym man qemu-system-x86_64jest IP przypisanym do pierwszej VM uruchomionej, jeśli statyczny IP nie jest przypisany. A teraz gość nie ma połączenia z Internetem.
jobin
Co możesz zrobić, to zmapować port 22 używany dla ssh na innym porcie, a następnie połączyć się z nim z komputera hosta, aby uzyskać dostęp do maszyny wirtualnej. Zredagowałem swoją odpowiedź na przykładzie.
mas_kur1
Edytowana odpowiedź działa idealnie!
dbernard
19

Wypróbuj to podczas uruchamiania qemu -redir tcp:2222::22

$ ssh -p 2222 localhost

Flaga tcp: 2222 :: 22 w poleceniu uruchomienia qemu odwzorowuje port 2222 komputera hosta na port 22 (domyślny port ssh) na maszynie wirtualnej.

Następnie po prostu sshing do portu 2222 na twoim hoście lokalnym (maszynie hosta) przekieruje wszelki ruch do portu ssh 22 na maszynie wirtualnej, co powinno pozwolić ci na ssh, tak jak normalnie na każdej innej maszynie.

mikeschuld
źródło
3
Witamy w systemach Unix i Linux! Szukamy długich odpowiedzi, które zawierają wyjaśnienia i kontekst. Nie mów tylko „Spróbuj tego ...”; wyjaśnij, dlaczego Twoja odpowiedź jest poprawna, najlepiej z cytatami. Odpowiedzi, które nie zawierają wyjaśnień, mogą zostać usunięte.
G-Man mówi „Reinstate Monica”
3
Po prostu czuję potrzebę powiedzenia, że ​​ta odpowiedź pomogła mi bardziej niż wszystkie inne odpowiedzi powyżej. Brak zbędnych informacji, a przede wszystkim działa. Idealny podczas lądowania z zapytania Google „jak do cholery mam ssh w qemu”.
styczeń
1
Ta odpowiedź spełnia oczekiwania 99,9% osób. Tj. Maszyna hosta otrzymuje dostęp ssh do maszyny wirtualnej, w tym możliwość kopiowania plików przez maszynę do i z maszyny wirtualnej za pomocą scp lub podobnego.
null Użytkownik
1
Znakomity! Teraz wygląda moja komenda Raspberry Piqemu-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
entuzjastyczny
2
man qemu-system-x86_642.5.0: Uwaga: Starsze autonomiczne opcje -tftp, -bootp, -smb i -redir są nadal przetwarzane i stosowane do użytkownika -net.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
4

Konfiguracja OpenSSH przetestowana na Buildroot 2016.05, QEMU 2.5.0, host Ubuntu 16.04

Oprócz przekierowywania sieci QEMU, musisz również poprawnie skonfigurować SSH, co omówię tutaj.

Zacznij od qemu_x86_64_defconfigi włącz pakiet openssh:

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

Następnie uruchom QEMU za pomocą:

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

Następnie na gościu:

vi /etc/ssh/sshd_config

Zmodyfikuj następujące ustawienia:

PermitRootLogin yes
PermitEmptyPasswords yes

I zrestartuj serwer:

/etc/init.d/S50sshd restart

To dlatego, że istnieje ten plik, który domyślnie uruchamia się sshd, oto źródło: https://github.com/buildroot/buildroot/blob/2018.02/package/openssh/S50sshd, a kluczowymi operacjami uruchamiania są:

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

Następnie z hosta:

ssh root@localhost -p 2222

W przypadku awarii najpierw sprawdź, czy przekazywanie sieciowe działa z narzędziem niższego poziomu niż sshd: np. nc -l Jak opisano tutaj .

sprawdź także dzienniki serwera gościa:

less /var/log/messages

Następnie w systemie końcowym powinieneś zautomatyzować tworzenie tego pliku dziennika za pomocą BR2_ROOTFS_OVERLAYlub BR2_ROOTFS_POST_BUILD_SCRIPT: Dostosowanie wygenerowanego docelowego systemu plików | buildroot.org

Ciro Santilli
źródło
-1

Uważam, że musisz użyć hostfwd=tcp::7777-:8001lubhostfwd=tcp::7777:8001

phoops
źródło