Làm / dev / net / tun có sẵn cho qemu?


8

Tôi đã tạo một thiết bị nhấn ( tap0) mà tôi muốn cung cấp dưới dạng giao diện mạng cho qemu. Tôi đã tạo thiết bị bằng lệnh sau và gắn nó vào cầu nối mạng mà tôi đã thiết lập:

tunctl -t tap0
ifconfig tap0 up
brctl addif virbr0 tap0

Sau đó tôi đã chạy các lệnh được đề xuất trong câu trả lời này :

chgrp netdev /dev/net/tun
chmod 660 /dev/net/tun

Cả hai lệnh đã hoàn thành thành công và tôi xác nhận rằng chúng có hiệu lực:

nathan@nathan-desktop:~$ stat /dev/net/tun
  File: ‘/dev/net/tun’
  Size: 0           Blocks: 0          IO Block: 4096   character special file
Device: 6h/6d   Inode: 1224        Links: 1     Device type: a,c8
Access: (0660/crw-rw----)  Uid: (    0/    root)   Gid: (  108/  netdev)
Access: 2015-11-16 10:16:35.127338320 -0800
Modify: 2015-11-16 10:16:35.127338320 -0800
Change: 2015-11-16 10:37:18.338948110 -0800
 Birth: -

Tôi cũng xác nhận rằng tôi thuộc netdevnhóm:

nathan@nathan-desktop:~$ groups
[...] netdev [...]

Tuy nhiên, khi tôi cố gắng khởi động máy ảo qemu với giao diện, tôi đã gặp phải lỗi sau:

nathan@nathan-desktop:~$ qemu-system-arm [...] -net tap,ifname=tap0
qemu-system-arm: -net tap,ifname=tap0: could not configure /dev/net/tun (tap0): Operation not permitted
qemu-system-arm: -net tap,ifname=tap0: Device 'tap' could not be initialized

bước đi

Các đầu ra có liên quan từ straceđược trình bày dưới đây:

open("/dev/net/tun", O_RDWR)            = 7
ioctl(7, TUNGETFEATURES, 0x7ffcc532ab2c) = 0
ioctl(7, TUNSETVNETHDRSZ, 0x7ffcc532ab28) = -1 EBADFD (File descriptor in bad state)
ioctl(7, TUNSETIFF, 0x7ffcc532ab30)     = -1 EPERM (Operation not permitted)
write(2, "qemu-system-arm:", 16qemu-system-arm:)        = 16
write(2, " -net", 5 -net)                    = 5
write(2, " tap,ifname=tap0", 16 tap,ifname=tap0)        = 16
write(2, ": ", 2: )                       = 2
write(2, "could not configure /dev/net/tun"..., 64could not configure /dev/net/tun (tap0): Operation not permitted) = 64
write(2, "\n", 1
)                       = 1
close(7)                                = 0
write(2, "qemu-system-arm:", 16qemu-system-arm:)        = 16
write(2, " -net", 5 -net)                    = 5
write(2, " tap,ifname=tap0", 16 tap,ifname=tap0)        = 16
write(2, ": ", 2: )                       = 2
write(2, "Device 'tap' could not be initia"..., 37Device 'tap' could not be initialized) = 37
write(2, "\n", 1
)

1
À, lỗi là do hoạt động của Viking không được phép, không được phép truy cập từ chối. Điều này có nghĩa là sự cố không truy cập được vào tệp thiết bị, nhưng một số thao tác yêu cầu các đặc quyền bổ sung (ở đây sẽ là một cuộc gọi ioctl yêu cầu root hoặc một số khả năng mà các kết hợp tham số khác không yêu cầu). Vì vậy, xin vui lòng chạy stracevà xem chính xác những gì ioctl đang thất bại.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles straceđầu ra được thêm vào.
Nathan Osman

@NathanOsman có đề xuất nào về việc cần làm nếu tunctlkhông có sẵn trên hệ thống (ArchLinux 2018 tại đây)? Tôi đang cố gắng để đạt được điều tương tự như bạn đã cố gắng, nhưng tôi thất bại ở bước này tunctl.
VasyaNovikov

@Nathan Osman Bạn đã giải quyết vấn đề này chưa?
71GA

Câu trả lời:


7

qemu sẽ cố chạy một số tập lệnh mặc định sẽ thất bại nếu bạn không root. Dưới đây là tùy chọn dòng lệnh hoạt động khi bạn có quyền truy cập thích hợp vào thiết bị nhấn phù hợp:

qemu-system-x86_64 ... \
    -net nic,model=virtio -net tap,ifname=tap0,script=no,downscript=no

Điều script=no,downscript=noquan trọng là tránh thất bại đó.

Bạn cũng phải đảm bảo rằng bạn có quyền truy cập vào đầu kia của thiết bị nhấn (không chỉ thiết bị điều khiển /dev/net/tun). Không chắc chắn về tunctl, nhưng với iproute2, bạn phải nói ip tuntap add dev tap0 mode tap group netdev(hoặc user, v.v.).


5

Bạn cần chỉ định nhóm netdev trong cuộc gọi kết thúc ban đầu của mình:

tunctl -t tap0 -g netdev

[Tôi cũng phát hiện ra rằng, vì một số lý do, tôi phải cấp quyền thực thi (770) trên thư mục / dev / net. Điều này có thể không liên quan.]


3

Tạo giao diện nhấn với người dùng bạn đang làm việc.

sudo tunctl -p -t tap0 -u <user>

Sau đó thử chạy Qemu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.