Jak udostępnić katalog hostowi bez sieci w QEMU?

10

Mój problem polega na tym, że urządzenia sieciowe w moim drzewie urządzeń nie są bardzo stabilne, więc pomyślałem, że najlepszym sposobem na udostępnienie folderu między qemu a systemem hosta jest zamontowanie tego samego obrazu bez pamięci podręcznej po obu stronach, ale opcja -hda na qemu nie powoduje hd dostępny w / dev /.

Oto polecenie, które uruchamiam.

./qemu-xilinx/arm-softmmu/qemu-system-arm -M xilinx-zynq-a9 -m 1024 -serial null -serial mon:stdio -dtb resources/devicetree.dtb -kernel resources/zImage -initrd resources.qemu/ramdisk.img -nographic -s

Pytanie brzmi: czy istnieje sposób na uniknięcie pracy w sieci, a mimo to udostępnienie katalogu między qemu a hostem?

EDYCJA: Kompilowałem

./configure --target-list="arm-softmmu,microblazeel-softmmu" --enable-fdt --disable-kvm --enable-virtfs

co powinno umożliwić wszystko, co potrzebne. Jednak kiedy biegnę

./qemu-xilinx/arm-softmmu/qemu-system-arm -M xilinx-zynq-a9 -m 1024 -serial null -serial mon:stdio -dtb /homes/cperivol/Sandbox/xilinx-zynq-bootstrap/resources/devicetree.dtb -kernel /homes/cperivol/Sandbox/xilinx-zynq-bootstrap/resources/zImage -initrd /homes/cperivol/Sandbox/xilinx-zynq-bootstrap/resources.qemu/ramdisk.img -nographic -s -fsdev local,path=/homes/cperivol/Sandbox/xilinx-zynq-bootstrap/qemu-sandbox/,security_model=passthrough,id=host0 -device virtio-9p-pci,fsdev=host0,mount_tag=host_tag0

lub

./qemu-xilinx/arm-softmmu/qemu-system-arm -M xilinx-zynq-a9 -m 1024 -serial null -serial mon:stdio -dtb resources/devicetree.dtb -kernel resources/zImage -initrd resources.qemu/ramdisk.img -nographic -s -virtfs local,path=/homes/cperivol/Sandbox/xilinx-zynq-bootstrap/qemu-sandbox/,mount_tag=host0,security_model=passthrough,id=host0

dostaję

No 'PCI' bus found for device 'virtio-9p-pci'

Może powinienem również wspomnieć, że arm-softmmu/config-devices.maktam jest CONFIG_PCI=y, i na pewno są tam pliki obiektowe pci hw/pci.

EDYCJA 2: Patrząc na drzewo urządzeń zrzucone przez qemu, emulowany system nie zawiera magistrali PCI.

(qemu) info qtree
bus: main-system-bus
  type System
  dev: xlnx.ps7-dev-cfg, id ""
    irq 1
    mmio 00000000f8007000/000000000000011c
  dev: pl330, id ""
    gpio-in 32
    num_chnls = 8
    num_periph_req = 4
    num_events = 16
    mgr_ns_at_rst = 0
    i-cache_len = 4
    num_i-cache_lines = 8
    boot_addr = 0
    INS = 0
    PNS = 0
    data_width = 64
    wr_cap = 8
    wr_q_dep = 16
    rd_cap = 8
    rd_q_dep = 16
    data_buffer_dep = 256
    irq 17
    mmio 00000000f8003000/0000000000001000
  dev: generic-sdhci, id ""
    capareg = 0x5780080
    maxcurr = 0x0
    irq 1
    mmio 00000000e0101000/0000000000000100
  dev: generic-sdhci, id ""
    capareg = 0x5780080
    maxcurr = 0x0
    irq 1
    mmio 00000000e0100000/0000000000000100
  dev: cadence_gem, id ""
    mac = 52:54:00:12:34:56
    vlan = 0
    netdev = hub0port0
    bootindex = -1
    irq 1
    mmio 00000000e000b000/0000000000000640
  dev: cadence_ttc, id ""
    irq 3
    mmio 00000000f8002000/0000000000001000
  dev: cadence_ttc, id ""
    irq 3
    mmio 00000000f8001000/0000000000001000
  dev: cadence_uart, id ""
    irq 1
    mmio 00000000e0001000/0000000000001000
  dev: cadence_uart, id ""
    irq 1
    mmio 00000000e0000000/0000000000001000
  dev: xlnx.ps7-qspi, id ""
    num-busses = 2
    num-ss-bits = 1
    num-txrx-bytes = 4
    irq 3
    mmio 00000000e000d000/0000000000000100
    mmio 00000000fc000000/0000000002000000
    bus: spi1
      type SSI
      dev: n25q128, id ""
        gpio-in 1
    bus: spi0
      type SSI
      dev: n25q128, id ""
        gpio-in 1
  dev: xlnx.ps7-spi, id ""
    num-busses = 1
    num-ss-bits = 4
    num-txrx-bytes = 1
    irq 5
    mmio 00000000e0007000/0000000000000100
    bus: spi0
      type SSI
      dev: n25q128, id ""
        gpio-in 1
      dev: n25q128, id ""
        gpio-in 1
      dev: n25q128, id ""
        gpio-in 1
      dev: n25q128, id ""
        gpio-in 1
  dev: xlnx.ps7-spi, id ""
    num-busses = 1
    num-ss-bits = 4
    num-txrx-bytes = 1
    irq 5
    mmio 00000000e0006000/0000000000000100
    bus: spi0
      type SSI
      dev: n25q128, id ""
        gpio-in 1
      dev: n25q128, id ""
        gpio-in 1
      dev: n25q128, id ""
        gpio-in 1
      dev: n25q128, id ""
        gpio-in 1
  dev: xlnx,ps7-usb, id "zynq-usb-1"
    maxframes = 128
    irq 1
    mmio 00000000e0003000/0000000000001000
    bus: zynq-usb-1.0
      type usb-bus
  dev: xlnx,ps7-usb, id "zynq-usb-0"
    maxframes = 128
    irq 1
    mmio 00000000e0002000/0000000000001000
    bus: zynq-usb-0.0
      type usb-bus
  dev: xlnx.ps7-i2c, id ""
    irq 1
    mmio 00000000e0005000/000000000000002c
    bus: i2c
      type i2c-bus
      dev: pca9548, id ""
        chip-enable = 0
        address = 0
        address-range = 128
        reg = 0
        bus: i2c@7
          type i2c-bus
        bus: i2c@6
          type i2c-bus
        bus: i2c@5
          type i2c-bus
        bus: i2c@4
          type i2c-bus
        bus: i2c@3
          type i2c-bus
          dev: at.24c08, id ""
            size = 1024
            address = 84
            address-range = 4
            reg = 84
          dev: at.24c08, id ""
            size = 1024
            address = 80
            address-range = 4
            reg = 80
        bus: i2c@2
          type i2c-bus
          dev: at.24c08, id ""
            size = 1024
            address = 84
            address-range = 4
            reg = 84
          dev: at.24c08, id ""
            size = 1024
            address = 80
            address-range = 4
            reg = 80
        bus: i2c@1
          type i2c-bus
        bus: i2c@0
          type i2c-bus
  dev: xlnx.ps7-i2c, id ""
    irq 1
    mmio 00000000e0004000/000000000000002c
    bus: i2c
      type i2c-bus
      dev: pca9548, id ""
        chip-enable = 0
        address = 0
        address-range = 128
        reg = 0
        bus: i2c@7
          type i2c-bus
        bus: i2c@6
          type i2c-bus
        bus: i2c@5
          type i2c-bus
        bus: i2c@4
          type i2c-bus
        bus: i2c@3
          type i2c-bus
          dev: at.24c08, id ""
            size = 1024
            address = 84
            address-range = 4
            reg = 84
          dev: at.24c08, id ""
            size = 1024
            address = 80
            address-range = 4
            reg = 80
        bus: i2c@2
          type i2c-bus
          dev: at.24c08, id ""
            size = 1024
            address = 84
            address-range = 4
            reg = 84
          dev: at.24c08, id ""
            size = 1024
            address = 80
            address-range = 4
            reg = 80
        bus: i2c@1
          type i2c-bus
        bus: i2c@0
          type i2c-bus
  dev: arm_mptimer, id ""
    num-cpu = 1
    irq 1
    mmio ffffffffffffffff/0000000000000020
    mmio ffffffffffffffff/0000000000000020
  dev: arm_mptimer, id ""
    num-cpu = 1
    irq 1
    mmio ffffffffffffffff/0000000000000020
    mmio ffffffffffffffff/0000000000000020
  dev: a9-scu, id ""
    num-cpu = 1
    irq 0
    mmio ffffffffffffffff/0000000000000100
  dev: arm_gic, id ""
    gpio-in 96
    num-cpu = 1
    num-irq = 96
    revision = 1
    irq 1
    mmio ffffffffffffffff/0000000000001000
    mmio ffffffffffffffff/0000000000000100
    mmio ffffffffffffffff/0000000000000100
  dev: a9mpcore_priv, id ""
    gpio-in 64
    num-cpu = 1
    num-irq = 96
    irq 1
    mmio 00000000f8f00000/0000000000002000
  dev: xilinx,zynq_slcr, id ""
    irq 0
    mmio 00000000f8000000/0000000000001000
  dev: nand, id ""
    manufacturer_id = 32
    chip_id = 170
    drive = <null>
    irq 0
  dev: cfi.pflash02, id ""
    drive = <null>
    num-blocks = 512
    sector-length = 131072
    width = 1
    mappings = 1
    big-endian = 0
    id0 = 102
    id1 = 34
    id2 = 0
    id3 = 0
    unlock-addr0 = 2730
    unlock-addr1 = 1365
    name = "pl353.pflash"
    irq 0
    mmio ffffffffffffffff/0000000004000000
  dev: arm.pl35x, id ""
    x = 3
    irq 0
    mmio 00000000e000e000/0000000000001000
    mmio 00000000e2000000/0000000001000000
    mmio 00000000e1000000/0000000001000000
fakedrake
źródło

Odpowiedzi:

14

Jeśli gość ma obsługę 9p (jak Linux, lub oczywiście Plan 9) i virtio, spróbuj dodać następujący przełącznik.

-virtfs local,path=/path/to/share,mount_tag=host0,security_model=passthrough,id=host0

Możesz zmienić parametr security_model. Zobacz stronę man, qemu (1). Jeśli dobrze pamiętam, to mount_tag jest tym, co widzi gość, pozostawiając id jako manekina.

Upewnij się, że ścieżka jest pod chroot, jeśli chrootujesz. Jest to ścieżka do katalogu na hoście.

Wpis fstab na gościu powinien wyglądać następująco.

host0   /wherever    9p      trans=virtio,version=9p2000.L   0 0

Dodaj to do swojego fstab lub wywołaj odpowiednie polecenie ręcznie lub za pomocą systemu init, cokolwiek by to nie było.

pilona
źródło
Czy / ścieżka / do / udostępnia ścieżkę do katalogu lub obrazu? Myślę też, że to nie ma związku: otrzymujęqemu-system-arm: -virtfs local,path=/path/to/share,mount_tag=host0,security_model=passthrough,id=host0: Parameter 'driver' expects device type
fakedrake
1
jest to katalog, który chcesz udostępnić.
pilona
1
Czy możesz również potwierdzić, że używana wersja qemu została zbudowana z obsługą 9p / virtfs? Zobacz to .
pilona
1
dobre pytanie, jak to sprawdzić?
fakedrake
W czasie wykonywania z twojego pliku binarnego qemu nie wiedziałbym. Musisz sprawdzić skrypty kompilacji swojej dystrybucji. To jest specyficzne dla dystrybucji. Na przykład w Arch Linux to flagi obecne i nieobecne , przekazane do konfiguracji, w PKGBUILD.
pilona
2

Minimalistyczna, działająca konfiguracja 9P Buildroot dla x86_64, arm i aarch64

Stworzyłem wysoce zautomatyzowaną konfigurację roboczą Buildroot, która może pomóc ci zrozumieć, dlaczego twoje podejście nie działa.

Główne składniki to:

  • ustawienia jądra:

    CONFIG_9P_FS=y
    CONFIG_9P_FS_POSIX_ACL=y
    CONFIG_9P_FS_SECURITY=y
    CONFIG_NETWORK_FILESYSTEMS=y
    CONFIG_NET_9P=y
    CONFIG_NET_9P_DEBUG=y
    CONFIG_NET_9P_VIRTIO=y
    

    W przypadku aarch64 dodaj także:

    CONFIG_PCI=y
    CONFIG_PCI_HOST_COMMON=y
    CONFIG_PCI_HOST_GENERIC=y
    CONFIG_VIRTIO_PCI=y
    CONFIG_VIRTIO_BLK=y
    CONFIG_VIRTIO_NET=y
    

    Jeśli zapomnisz dodać konfiguracje aarch64, a mountnie powiedzie się:

    mount: mounting host0 on /mnt/my9p failed: Invalid argument
    

    i dmesg narzeka na:

    9pnet_virtio: no channels available for device
    

    Dokumentowane na: https://wiki.qemu.org/Documentation/9psetup

  • mój wpis fstab i komenda QEMU były dokładnie takie, jak wyjaśniono na stronie : https://superuser.com/a/628381/128124

    Polecenie ręcznego montażu to:

    mkdir /mnt/my9p
    mount -t 9p -o trans=virtio,version=9p2000.L host0 /mnt/my9p
    

    Dla porównania, moje pełne wiersze poleceń QEMU to: x86:

    ./buildroot/output.x86_64~/host/usr/bin/qemu-system-x86_64 -m 128M -monitor telnet::45454,server,nowait -netdev user,hostfwd=tcp::45455-:45455,id=net0 -smp 1 -virtfs local,path=9p,mount_tag=host0,security_model=mapped,id=host0  -M pc -append 'root=/dev/vda nopat nokaslr norandmaps printk.devkmsg=on printk.time=y' -device edu -device lkmc_pci_min -device virtio-net-pci,netdev=net0 -kernel ./buildroot/output.x86_64~/images/bzImage    -drive file='./buildroot/output.x86_64~/images/rootfs.ext2.qcow2,if=virtio,format=qcow2'
    

    ramię:

    ./buildroot/output.arm~/host/usr/bin/qemu-system-arm -m 128M -monitor telnet::45454,server,nowait -netdev user,hostfwd=tcp::45455-:45455,id=net0 -smp 1 -virtfs local,path=9p,mount_tag=host0,security_model=mapped,id=host0  -M versatilepb -append 'root=/dev/sda nokaslr norandmaps printk.devkmsg=on printk.time=y' -device rtl8139,netdev=net0 -dtb ./buildroot/output.arm~/images/versatile-pb.dtb -kernel ./buildroot/output.arm~/images/zImage -serial stdio    -drive file='./buildroot/output.arm~/images/rootfs.ext2.qcow2,if=scsi,format=qcow2' 
    

    aarch64:

    ./buildroot/output.aarch64~/host/usr/bin/qemu-system-aarch64 -m 128M -monitor telnet::45454,server,nowait -netdev user,hostfwd=tcp::45455-:45455,id=net0 -smp 1 -virtfs local,path=9p,mount_tag=host0,security_model=mapped,id=host0  -M virt -append 'root=/dev/sda nokaslr norandmaps printk.devkmsg=on printk.time=y' -cpu cortex-a57 -device virtio-net-device,netdev=net0 -kernel ./buildroot/output.aarch64~/images/Image -nographic -serial stdio    
    

Testowany na QEMU 2.11 i jądrze Linux gościa 4.15.

Ciro Santilli
źródło