我有一个/etc/qemu-ifup
在启动/usr/bin/qemu-system-i386
二进制文件时执行的以下脚本:
#!/bin/sh
set -x
switch=br0
if [ -n "$1" ];then
/usr/sbin/tunctl -u `whoami` -t $1
/sbin/ip link set dev $1 up
sleep 0.5s
/sbin/brctl addif $switch $1
exit 0
else
echo "Error: no interface specified"
exit 1
fi
问题是,tunctl
抱怨设备或资源正忙:
root@VM-host:~# qemu -hda /root/1.raw -device e1000,netdev=net0,mac=DE:AD:BE:EF:69:01 -netdev tap,id=net0 -display vnc=:1
+ switch=br0
+ [ -n tap0 ]
+ whoami
+ /usr/sbin/tunctl -u root -t tap0
TUNSETIFF: Device or resource busy
+ /sbin/ip link set dev tap0 up sleep 0.5s
Error: either "dev" is duplicate, or "sleep" is a garbage.
+ /sbin/brctl addif br0 tap0
+ exit 0
当我简单地执行/usr/sbin/tunctl -u root -t tap0
, thentap0
就被创建了,没有任何问题:
root@VM-host:~# /usr/sbin/tunctl -u root -t tap0
Set 'tap0' persistent and owned by uid 0
root@VM-host:~#
有什么想法导致这种行为吗?
答案1
(我不知道从什么时候开始),qemu将首先创建tap,然后调用你的/etc/qemu-ifup
脚本。所以您会看到错误报告,只是因为相同的水龙头已经存在。
参考:qemu源码:(net/tap-linux.c
查看函数:)tap_open()
。
答案2
错误消息"Error: either "dev" is duplicate, or "sleep" is a garbage"
告诉您问题的原因。
应使用以下命令调出 Tap 界面:
/sbin/ip link set $1 up