Bagaimana cara SSH dari host ke tamu menggunakan QEMU?


30

Bagaimana cara mengatur ssh dari host ke tamu menggunakan qemu? Saya dapat menggunakan pengalihan port ketika saya mem-boot VM tanpa parameter khusus, sebagai berikut:

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

Tetapi ketika saya mencoba untuk boot menggunakan yang berikut ini:

/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

Saya mendapatkan kesalahan berikut dan VM tidak bisa boot:

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

Harap dicatat bahwa saya dapat mem-boot VM tanpa -netparameter tanpa masalah, namun, saya ingin mengatur ssh dari host ke guest. ssh dari guest to host berfungsi dengan baik seperti yang diharapkan.

Edit

Saya sudah mencoba menggunakan

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

sebaik

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

tapi kesalahan tetap ada dan VM tidak bisa boot.


Jawaban:


37

Saya berpikir bahwa kesalahan tidak berasal dari pernyataan -net, tetapi dari:

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

Pernyataan ini sudah menggunakan port 7777. Untuk penerusan port, with

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

itu berfungsi dengan baik ketika tidak mengatur saluran serial virtio.

Jika saya mengerti benar, Anda ingin mengatur saluran serial virtio untuk berkomunikasi dari host ke VM menggunakan Unix Domain Socket?

Dalam hal ini, berikut ini dapat melakukan pekerjaan:

/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

EDIT:

Contoh cara terhubung dari host menggunakan ssh ke VM:

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

Hostforwarding ini memetakan localhost (host) port 10022 ke port 22 pada VM. Setelah VM dimulai seperti ini, Anda dapat mengaksesnya dari localhost sebagai berikut:

ssh vmuser@localhost -p10022

Perintah -net nic menginisialisasi kartu antarmuka jaringan virtual yang sangat dasar.


Ya, Anda benar, saya mencoba menggunakan virtio-serial untuk membangun komunikasi dari tuan rumah ke tamu. VM telah boot memberikan peringatan di konsol tuan rumah: Warning: vlan 0 with no nicstetapi ketika saya lakukan ifconfigpada tamu saya hanya melihat lodan saya masih mendapatkan ssh: connect to host 10.0.2.15 port 22: Connection timed outketika saya mencoba ssh; IP yang saya gunakan untuk ssh adalah 10.0.2.15, yang menurutnya man qemu-system-x86_64adalah IP yang ditetapkan untuk VM pertama yang di-boot jika IP statis tidak ditetapkan. Dan sekarang tidak ada koneksi internet pada tamu.
jobin

Apa yang Anda mungkin ingin lakukan adalah memetakan port 22 yang digunakan untuk ssh pada port lain dan kemudian menghubungkannya dari mesin host untuk mengakses VM. Saya mengedit jawaban saya dengan sebuah contoh.
mas_kur1

Jawaban yang diedit bekerja dengan sempurna!
dbernard

19

Coba ini ketika meluncurkan qemu -redir tcp:2222::22

$ ssh -p 2222 localhost

Bendera tcp: 2222 :: 22 di perintah peluncuran qemu memetakan port 2222 dari mesin host ke port 22 (port ssh default) pada mesin virtual.

Kemudian, cukup sshing ke port 2222 di localhost Anda (mesin host) akan mengarahkan lalu lintas ke port ssh 22 di mesin virtual, yang akan memungkinkan Anda untuk ssh seperti yang biasanya Anda lakukan pada mesin lain.


3
Selamat datang di Unix & Linux! Kami mencari jawaban panjang yang memberikan penjelasan dan konteks. Jangan hanya mengatakan "Coba ini ..."; jelaskan mengapa jawaban Anda benar, idealnya dengan kutipan. Jawaban yang tidak termasuk penjelasan dapat dihapus.
G-Man Mengatakan 'Reinstate Monica'

3
Saya hanya merasa perlu untuk mengatakan bahwa jawaban ini membantu saya lebih dari semua jawaban di atas. Tidak ada informasi yang berlebihan dan di atas semua itu, ia berfungsi. Sempurna saat mendarat dari kueri-google "bagaimana sih saya ssh ke qemu".
Januari

1
Jawaban ini melakukan apa yang diinginkan 99,9% orang. Yaitu mesin host mendapat akses ssh ke mesin virtual, termasuk kemampuan bagi host untuk menyalin file ke dan dari mesin virtual menggunakan scp atau serupa.
null Pengguna

1
Cemerlang! Perintah Raspberry Pi saya sekarang terlihat sepertiqemu-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
antusias

2
man qemu-system-x86_642.5.0: Catatan: Opsi stand-alone Legacy -tftp, -bootp, -smb dan -redir masih diproses dan diterapkan pada pengguna -net.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

4

Konfigurasi OpenSSH diuji pada Buildroot 2016.05, QEMU 2.5.0, host Ubuntu 16.04

Selain penerusan jaringan QEMU, Anda juga perlu mengatur SSH dengan benar, yang akan saya bahas di sini.

Mulai dengan qemu_x86_64_defconfigdan aktifkan paket openssh:

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

Kemudian mulai QEMU dengan:

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

Kemudian pada tamu:

vi /etc/ssh/sshd_config

Ubah pengaturan berikut:

PermitRootLogin yes
PermitEmptyPasswords yes

Dan restart server:

/etc/init.d/S50sshd restart

Karena file ini ada, sshd memulai secara default, ini adalah sumbernya: https://github.com/buildroot/buildroot/blob/2018.02/package/openssh/S50sshd dan operasi startup utama adalah:

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

Kemudian dari host:

ssh root@localhost -p 2222

Dalam hal kegagalan, tes pertama bahwa penerusan jaringan bekerja dengan alat tingkat yang lebih rendah daripada sshd: misalnya nc -l seperti yang dijelaskan di sini .

juga periksa log server pada tamu:

less /var/log/messages

Kemudian pada sistem terakhir Anda harus mengotomatiskan pembuatan file log itu dengan BR2_ROOTFS_OVERLAYatau BR2_ROOTFS_POST_BUILD_SCRIPT: Menyesuaikan sistem file target yang dihasilkan | buildroot.org


-1

Saya yakin Anda perlu menggunakan hostfwd=tcp::7777-:8001atauhostfwd=tcp::7777:8001

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.