今天帮一个同事解决在KVM Guest中使用虚拟网卡(桥接方式),我写了个qemu-ifup脚本拿来做guest启动之时使用。但是他使用时,遇到如下的问题。
/etc/qemu-ifup: could not launch network script
qemu-system-x86_64: -net tap,script=/etc/qemu-ifup: Device ‘tap’ could not be initialized
使用的命令为:
qemu-system-x86_64 -m 1024 -smp 2 -net nic,model=rtl8139 -net tap,scritp=/etc/qemu-ifup -hda /root/rhel6u2.img
我的qemu-ifup的小脚本如下:
1 2 3 4 5 | #!/bin/bash switch=sw0 /sbin/ifconfig $1 0.0.0.0 up brctl addif ${switch} $1 |
你能看出其中的错误吗?
网上找了一下,先需要确认如下几个问题:
1. 是否加载tun模块?
lsmod | grep tun
如果没有加载,那么就请先load tun模块:modprobe tun
当然,如果你是把tun模块编译进内核了的,是不需要(也不能)modprobe加载tun的,你可以检查你的kernel config文件(通常在/boot/config-$VERSION),如果有如下的配置,则说明已经编译进kernel了的。
CONFIG_TUN=y
2. 检查/dev/net/tun的权限
ls -l /dev/net/tun
crw-rw-rw- 1 root root 10, 200 Mar 23 18:11 /dev/net/tun
这样的权限是没有问题的。
3. 检查/etc/qemu-ifup的权限
当前用户需要有可执行权限
4. 检查是否已经安装bridge-utils软件包
rpm -qa | grep bridge 来查询,如果没有就请安装bridge-utils包,主要是脚本中一般需要用到brctl这个命令的。
我检查了网上常见的4种说法后,依然没有发现问题。我后来仔细分析我的这个小小脚本,我将其单独执行,这时我发现它会报错说是找不到解释器。
1 2 | [root@vt-nhm9 ~]# /etc/qemu-ifup tap0 -bash: /etc/qemu-ifup: /bin/bash^M: bad interpreter: No such file or directory |
我猛然想起来,这个脚本是我在Windows上写的,然后copy到同事的Linux机器上去执行的,所以它被加了一个“奇特的”符号”^M”,然后就找不到bash了。
解决方法当然是很简单,在linux上重新建立这个文件即可(内容不变),或者使用dos2unix工具转换为linux下的格式类型即可。
关于为什么有个神奇的符号“^M”,可以从参考我曾写过的一篇文章:回车与换行的区别
关于shebang指定脚本解释器,可以参考我前阵子写过的:Linux上的Shebang符号(#!)