在使用者模式網路中通過 libvirt 使用 qemu 轉發主機埠
我在編輯 libvirt 的 host-xml 以使 qemu 將 TCP 連接轉發給來賓時遇到問題。 這個問題連結到推薦添加到 Qemu 命令行的部落格文章。
-redir
但這直到最近才停止工作。錯誤:內部錯誤:qemu 意外關閉了監視器:qemu-system-x86_64:-redir tcp:5564::3389: -redir 選項已棄用。請改用“-netdev user,hostfwd=…”。
然而,這並不是開箱即用的,即我在主機上獲得了開放埠,但它沒有通過客戶端。
我像這樣編輯了我的 XML:
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> . . . </devices> <qemu:commandline> <qemu:arg value='-net'/> <qemu:arg value='user,hostfwd=tcp::22222-:22,hostfwd=tcp::8000-:8000'/> </qemu:commandline> </domain>
我的測試是
nc -l -p 8000
在客戶端和telnet localhost 8000
主機上執行。Telnet 指示打開的 TCP 連接,但客戶端沒有收到任何內容。我想這是因為 libvirt 已經包含一個
-net user,...
選項,並且不知何故我新定義的選項沒有正確處理。ps aux | grep qemu
顯示了這一點:qemu-system-x86_64 -enable-kvm -name guest=myguestsname,debug-threads=on -S -object secret,id=masterKey0,format=raw,file=~/.config/libvirt/qemu/lib/domain-28 -myguestsname/master-key.aes -machine pc-i440fx-artful,accel=kvm,usb=off,vmport=off,dump-guest-core=off -cpu Skylake-Client -m 1024 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid 713287321 -no-user-config -nodefaults -chardev socket,id=charmonitor,path=~/.config/libvirt/qemu/lib/domain-28-myguestsname /monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=delay -no-hpet -no-shutdown -global PIIX4_PM .disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x5.0x7 -device ich9-usb-uhci1,masterbus=usb .0,firstport=0,bus=pci.0,多功能=on,addr=0x5 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x5.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4, bus=pci.0,addr=0x5.0x2 -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x6 -drive file=~/.local/share/libvirt/images/myguestsname .img,format=qcow2,if=none,id=drive-virtio-disk0 -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x7,drive=drive-virtio-disk0,id= virtio-disk0,bootindex=1 -drive file=Cloud-Init-ISO/master-init.iso,format=raw,if=none,id=drive-ide0-0-0,readonly=on -device ide-cd, bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 -fsdev local,security_model=mapped,id=fsdev-fs0,path=~/guestfs -device virtio- 9p-pci,id=fs0,fsdev=fsdev-fs0,mount_tag=guestsfs,bus=pci.0,addr=0x9 -netdev user,id=hostnet0 -device virtio-net-pci,netdev=hostnet0,id=net0, mac=52:54:00:aa:aa:0a,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -chardev spicevmc,id=charchannel0,name=vdagent -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0 ,name=com.redhat.spice.0 -device usb-tablet,id=input0,bus=usb.0,port=1 -spice port=5900,addr=127.0.0.1,disable-ticketing,image-compression=off ,無縫遷移=on -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,vram64_size_mb=0,vgamem_mb=16,max_outputs=1,bus=pci.0,addr=0x2 -device intel-hda ,id=sound0,bus=pci.0,addr=0x4 -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 -chardev spicevmc,id=charredir0,name=usbredir -device usb- redir,chardev=charredir0,id=redir0,bus=usb.0,port=2 -chardev spicevmc,id=charredir1,name=usbredir -device usb-redir,chardev=charredir1,id=redir1,bus=usb.0,埠=3-設備 virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8 -net user,hostfwd=tcp::22222-:22,hostfwd=tcp::8000-:8000 -msg timestamp=on
我們可以看到
-netdev user,id=hostnet0
。我嘗試在自定義命令行中使用相同的名稱,但失敗了:錯誤:內部錯誤:連接到監視器時程序退出:qemu-system-x86_64:-chardev pty,id=charserial0:char 設備重定向到 /dev/pts/23(標籤 charserial0)
qemu-system-x86_64:-device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:aa:aa:0a,bus=pci.0,addr=0x3: 屬性 ‘virtio- net-device.netdev’ 不能取值’hostnet0’,它正在使用中
對於非使用者模式的網路設置,已經存在幾個 問題。但我需要使用使用者模式網路。
如何使用帶有 qemu 和使用者模式網路的 libvirt 正確轉發埠?
該文件在這裡並沒有真正的幫助,因為它沒有說明如何覆蓋已經存在的設備定義。
此處描述了您的配置中缺少的部分:https ://www.linux-kvm.org/page/Networking 。您必須添加另一個具有新地址的 netdev,如下所示:
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> . . . </devices> <qemu:commandline> <qemu:arg value='-netdev'/> <qemu:arg value='user,id=mynet.0,net=10.0.10.0/24,hostfwd=tcp::22222-:22,hostfwd=tcp::8000-:8000'/> <qemu:arg value='-device'/> <qemu:arg value='e1000,netdev=mynet.0'/> </qemu:commandline> </domain>