วิธีการ SSH จากโฮสต์ถึงแขกโดยใช้ QEMU


29

ฉันจะตั้งค่า ssh จากโฮสต์ไปยังแขกโดยใช้ qemu ได้อย่างไร? ฉันสามารถใช้การเปลี่ยนเส้นทางพอร์ตเมื่อฉันบูต VM โดยไม่มีพารามิเตอร์พิเศษดังต่อไปนี้:

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

แต่เมื่อฉันพยายามบูตโดยใช้สิ่งต่อไปนี้:

/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

ฉันได้รับข้อผิดพลาดต่อไปนี้และ VM ไม่บูต:

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

โปรดทราบว่าฉันสามารถบูต VM โดยไม่มี-netพารามิเตอร์โดยไม่มีปัญหาใด ๆ อย่างไรก็ตามฉันต้องการตั้งค่า ssh จากโฮสต์ไปยังแขก ssh จากแขกสู่โฮสต์ทำงานได้ดีอย่างที่คาดไว้

แก้ไข

ฉันได้ลองใช้

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

เช่นกัน

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

แต่ข้อผิดพลาดยังคงมีอยู่และ VM ไม่สามารถบู๊ตได้


คำตอบ:


37

ฉันคิดว่าข้อผิดพลาดไม่ได้มาจากคำสั่ง -net แต่มาจาก:

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

คำสั่งใช้พอร์ต 7777 แล้วสำหรับการส่งต่อพอร์ตด้วย

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

มันทำงานได้ดีเมื่อไม่ได้ตั้งค่าช่องสัญญาณอนุกรม virtio

หากฉันเข้าใจถูกต้องคุณต้องการตั้งค่าแชนเนลซีเรียลอนุกรมสำหรับการสื่อสารจากโฮสต์ไปยัง VM โดยใช้ Unix Domain Socket หรือไม่

ในกรณีนี้สิ่งต่อไปนี้สามารถทำงานได้:

/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

แก้ไข:

ตัวอย่างของวิธีการเชื่อมต่อจากโฮสต์โดยใช้ ssh กับ VM:

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

การส่งต่อโฮสต์นี้แม็พโลคัลโฮสต์ (โฮสต์) พอร์ต 10022 กับพอร์ต 22 บน VM เมื่อ VM เริ่มต้นเช่นนี้คุณสามารถเข้าถึงได้จาก localhost ดังนี้:

ssh vmuser@localhost -p10022

คำสั่ง -net nic เตรียมใช้งานการ์ดอินเตอร์เฟสเครือข่ายเสมือนพื้นฐานที่พื้นฐานมาก


ใช่คุณพูดถูกฉันกำลังพยายามใช้ virtio-serial เพื่อสร้างการสื่อสารจากโฮสต์ถึงแขก VM ทำการบูทโดยให้คำเตือนที่โฮสต์คอนโซลWarning: vlan 0 with no nicsแต่เมื่อฉันทำifconfigกับแขกฉันเห็นเท่านั้นloและฉันก็ยังได้ssh: connect to host 10.0.2.15 port 22: Connection timed outเมื่อฉันพยายาม ssh; IP ที่ฉันใช้กับ ssh คือ 10.0.2.15 ซึ่งตามที่man qemu-system-x86_64เป็น IP ที่กำหนดให้กับ VM เครื่องแรกที่เริ่มระบบหากไม่ได้กำหนด IP แบบคงที่ และตอนนี้ไม่มีการเชื่อมต่ออินเทอร์เน็ตกับแขก
jobin

สิ่งที่คุณอาจต้องทำคือการแมปพอร์ต 22 ที่ใช้สำหรับ ssh บนพอร์ตอื่นแล้วเชื่อมต่อจากเครื่องโฮสต์เพื่อเข้าถึง VM ฉันแก้ไขคำตอบด้วยตัวอย่าง
mas_kur1

คำตอบที่แก้ไขทำงานได้อย่างสมบูรณ์แบบ!
dbernard

19

ลองใช้เมื่อเปิดตัว qemu -redir tcp:2222::22

$ ssh -p 2222 localhost

แฟล็ก tcp: 2222 :: 22 ในคำสั่งเรียกใช้ qemu แม็พพอร์ต 2222 ของเครื่องโฮสต์กับพอร์ต 22 (พอร์ต ssh เริ่มต้น) บนเครื่องเสมือน

จากนั้นเพียงแค่ sshing ไปที่พอร์ต 2222 บนเครื่องโฮสต์ของคุณ (เครื่องโฮสต์) จะเปลี่ยนเส้นทางการรับส่งข้อมูลใด ๆ ไปยังพอร์ต ssh 22 ในเครื่องเสมือนซึ่งจะช่วยให้คุณสามารถใช้ ssh ได้ตามปกติเหมือนกับเครื่องอื่น ๆ


3
ยินดีต้อนรับสู่ Unix & Linux! เรากำลังมองหาคำตอบยาว ๆ ที่ให้คำอธิบายและบริบท อย่าพูดว่า "ลองนี่สิ ... "; อธิบายว่าทำไมคำตอบของคุณถึงถูกต้องนึกคิดด้วยการอ้างอิง คำตอบที่ไม่รวมคำอธิบายอาจถูกลบออก
G-Man กล่าวว่า 'Reinstate Monica'

3
ฉันแค่รู้สึกว่าต้องบอกว่าคำตอบนี้ช่วยฉันได้มากกว่าคำตอบอื่น ๆ ทั้งหมดข้างต้น ไม่มีข้อมูลที่ไม่จำเป็นและเหนือสิ่งอื่นใดก็ใช้งานได้ สมบูรณ์แบบเมื่อเชื่อมโยงไปถึงจากคำค้นหาใน google "วิธีที่ heck ทำฉัน ssh ลงใน qemu"
ม.ค.

1
คำตอบนี้ทำในสิ่งที่คน 99.9% ต้องการจริงๆ Ie host machine ได้รับการเข้าถึง ssh ไปยังเครื่องเสมือนรวมถึงความสามารถในการโฮสต์เพื่อคัดลอกไฟล์ไปยังและจากเครื่องเสมือนโดยใช้ scp หรือคล้ายกัน
nullUser

1
ยอดเยี่ยม! คำสั่ง Raspberry Pi ของฉันตอนนี้ดูเหมือนqemu-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
กระตือรือร้น

2
man qemu-system-x86_642.5.0: หมายเหตุ: ตัวเลือกสแตนด์อะโลนดั้งเดิม -tftp, -bootp, -smb และ -redir ยังคงถูกประมวลผลและนำไปใช้กับผู้ใช้ -net
Ciro Santilli 事件改造中心法轮功六四事件

4

ทดสอบการกำหนดค่า OpenSSH บน Buildroot 2016.05, QEMU 2.5.0, Ubuntu 16.04 โฮสต์

นอกจากการส่งต่อเครือข่าย QEMU แล้วคุณยังต้องตั้งค่า SSH ให้ถูกต้องซึ่งฉันจะกล่าวถึงที่นี่

เริ่มต้นด้วยqemu_x86_64_defconfigและเปิดใช้งานแพ็คเกจ openssh:

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

จากนั้นเริ่ม QEMU ด้วย:

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

จากนั้นแขก:

vi /etc/ssh/sshd_config

แก้ไขการตั้งค่าต่อไปนี้:

PermitRootLogin yes
PermitEmptyPasswords yes

และรีสตาร์ทเซิร์ฟเวอร์:

/etc/init.d/S50sshd restart

เป็นเพราะไฟล์นี้มีอยู่ที่ sshd เริ่มต้นตามค่าเริ่มต้นนี่คือแหล่งที่มา: https://github.com/buildroot/buildroot/blob/2018.02/package/openssh/S50sshdและการดำเนินการเริ่มต้นที่สำคัญคือ:

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

จากโฮสต์:

ssh root@localhost -p 2222

ในกรณีของความล้มเหลวการทดสอบครั้งแรกที่ส่งต่อเครือข่ายจะทำงานร่วมกับเครื่องมือที่มีระดับต่ำกว่า sshd: เช่นตามที่อธิบายไว้ที่นี่nc -l

ตรวจสอบล็อกเซิร์ฟเวอร์บนเกสต์:

less /var/log/messages

จากนั้นในระบบสุดท้ายคุณควรสร้างไฟล์บันทึกนั้นโดยอัตโนมัติด้วยBR2_ROOTFS_OVERLAYหรือBR2_ROOTFS_POST_BUILD_SCRIPT: การปรับแต่งระบบไฟล์เป้าหมายที่สร้างขึ้น buildroot.org


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.