我使用 QEMU 1.4.0 Ubuntu 13.04 发行版。我试图使虚拟机成为主机网络的一部分,所以我使用以下命令:
sudo qemu-system-arm -M overo -m 1024 -sd ./test.img -clock unix -device usb-mouse -device usb-kbd -serial pty -monitor pty -net nic,vlan=1,macaddr=00:aa:00:60:00:01,model=lan9118 -net tap,vlan=1,ifname=tap0,script=no
在 QEMU 的监视器中我看到:
(qemu) info network
hub 1
\ tap.0: index=0,type=tap,ifname=tap0,script=no,downscript=/etc/qemu-ifdown
\ lan9118.0: index=0,type=nic,model=lan9118,macaddr=00:aa:00:60:00:01
(qemu) info qtree
bus: main-system-bus
type System
dev: lan9118, id ""
mac = 00:aa:00:60:00:01
vlan = 1
netdev = hub1port0
bootindex = -1
mode_16bit = 0
irq 1
mmio ffffffffffffffff/0000000000000100
我看到该设备已被模拟并且 VLAN 已附加到 Tap 设备。到目前为止,一切看起来都很好。
在虚拟机中我得到这个:
[root@overo ~]# ifconfig -a
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
usb0 Link encap:Ethernet HWaddr F2:9D:C9:7F:69:F7
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
没有为 lan9118 设备提供 eth0 接口。我安装了一个 USB0,该设备在info qtree
QEMU 监视器的列表中没有。
我猜测可能是lan9118的驱动没有安装。所以我检查了linux-3.2.8.config
文件,这就是以太网部分的样子:
#
# CAIF transport drivers
#
CONFIG_ETHERNET=y
CONFIG_NET_VENDOR_BROADCOM=y
# CONFIG_B44 is not set
CONFIG_NET_VENDOR_CHELSIO=y
# CONFIG_DM9000 is not set
# CONFIG_DNET is not set
CONFIG_NET_VENDOR_FARADAY=y
# CONFIG_FTMAC100 is not set
# CONFIG_FTGMAC100 is not set
CONFIG_NET_VENDOR_INTEL=y
CONFIG_NET_VENDOR_I825XX=y
CONFIG_NET_VENDOR_MARVELL=y
CONFIG_NET_VENDOR_MICREL=y
CONFIG_KS8851=y
CONFIG_KS8851_MLL=y
CONFIG_NET_VENDOR_MICROCHIP=y
# CONFIG_ENC28J60 is not set
CONFIG_NET_VENDOR_NATSEMI=y
CONFIG_NET_VENDOR_8390=y
# CONFIG_AX88796 is not set
# CONFIG_ETHOC is not set
CONFIG_NET_VENDOR_SEEQ=y
# CONFIG_SEEQ8005 is not set
CONFIG_NET_VENDOR_SMSC=y
CONFIG_SMC91X=y
#CONFIG_SMC911X is not set
CONFIG_SMSC911X=y
# CONFIG_SMSC911X_ARCH_HOOKS is not set
CONFIG_NET_VENDOR_STMICRO=y
# CONFIG_STMMAC_ETH is not set
CONFIG_NET_VENDOR_TI=y
# CONFIG_TI_DAVINCI_EMAC is not set
# CONFIG_TI_DAVINCI_MDIO is not set
# CONFIG_TI_DAVINCI_CPDMA is not set
CONFIG_PHYLIB=y
我看到 CONFIG_SMSC911X=y 在这种情况下应该很好。我也尝试过 CONFIG_SMC911X=y 但没有任何改变。
如果有人曾设法在主机网络下引入 overo 虚拟机,我也将很高兴收到您的来信。
另外,我尝试使用相同的方法将 x86-64 虚拟机连接到主机网络,效果很好。 x86-64 VM 使用 e1000 设备。
查看 QEMU 代码上的 hw/overo.c 我看到:
88 /* Strictly this should be a LAN9221 */
89 if (nd_table[0].vlan) {
90 /* The ethernet chip hangs off the GPMC */
91 NICInfo *nd = &nd_table[0];
92 qemu_check_nic_model(nd, "lan9118");
93 s->eth = qdev_create(NULL, "lan9118");
94 qdev_set_nic_properties(s->eth, nd);
95 qdev_init_nofail(s->eth);
96 omap_gpmc_attach(s->cpu->gpmc, OVERO_NET_CS, s->eth, 0, 0);
97 sysbus_connect_irq(sysbus_from_qdev(s->eth), 0,
98 qdev_get_gpio_in(s->cpu->gpio, 176));
第 88 行的注释说它应该严格是 LAN9221 设备,但 qemu_check_nic_model(nd, "lan9118") 是 LAN9118。
那么应该安装什么设备驱动程序呢?
查看 QEMU 代码上的 hw/overo.c 我看到:
88 /* Strictly this should be a LAN9221 */
89 if (nd_table[0].vlan) {
90 /* The ethernet chip hangs off the GPMC */
91 NICInfo *nd = &nd_table[0];
92 qemu_check_nic_model(nd, "lan9118");
93 s->eth = qdev_create(NULL, "lan9118");
94 qdev_set_nic_properties(s->eth, nd);
95 qdev_init_nofail(s->eth);
96 omap_gpmc_attach(s->cpu->gpmc, OVERO_NET_CS, s->eth, 0, 0);
97 sysbus_connect_irq(sysbus_from_qdev(s->eth), 0,
98 qdev_get_gpio_in(s->cpu->gpio, 176));
第 88 行的注释说它应该严格是 LAN9221 设备,但 qemu_check_nic_model(nd, "lan9118") 是 LAN9118。
我在互联网上搜索,SMSC911X 应该是两个设备的相同驱动程序。 CONFIG_SMSC911X=y 我想知道是否CONFIG_SMSC911X_ARCH_HOOKS
也应该设置。但有关此配置的信息并不详细。
在 smsc.com 上我发现了这个; SRC-118-UBOOT-ARM LAN91xx/LAN92xx 用于 ARM 处理器的 UBOOT 驱动程序
但不知道我的 uboot 是否有驱动程序,甚至不知道如何添加它们。