使用 CentOS 6 和 LXC,“ifconfig”无法看到网络接口(但 busybox“ifconfig”工作正常)

使用 CentOS 6 和 LXC,“ifconfig”无法看到网络接口(但 busybox“ifconfig”工作正常)

我刚刚开始在 CentOS 6 下使用 LXC(通过 libvirt 适配器)。如果我创建 LXC 容器,则在使用本机系统工具时无法看到任何网络接口:

# ifconfig -a
#

这种行为非常奇怪;通过名称指定接口既不会产生预期的输出,也不会产生错误消息。即使对于明显无效的接口名称也是如此,例如:

# ifconfig foo
#

ip命令表现出相同的行为。

另一方面,如果我使用由忙碌箱,一切都按预期进行:

# busybox ifconfig -a

eth0      Link encap:Ethernet  HWaddr 52:54:00:E0:12:C8  
          inet6 addr: fe80::5054:ff:fee0:12c8/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:268 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:17814 (17.3 KiB)  TX bytes:552 (552.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          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)

那么...busybox 知道什么而本机工具不知道?此环境的 libvirt 配置非常标准;网络定义如下:

<interface type='network'>
  <mac address='52:54:00:e0:12:c8'/>
  <source network='default'/>
  <target dev='veth0'/>
</interface>

完整配置如下这里如果你认为这可能会有帮助。

我在跑:

  • lxc-0.7.2-2.el6.x86_64
  • 内核-2.6.32-71.29.1.el6.x86_64

编辑

越来越奇怪了...这是显示问题,而不是功能问题。如果我将它输入到任何东西中,我都可以看到输出ifconfig,例如:

# ifconfig eth0 | cat
eth0      Link encap:Ethernet  HWaddr 52:54:00:E0:12:C8  
          inet addr:192.168.10.10  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fee0:12c8/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:573 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:37914 (37.0 KiB)  TX bytes:552 (552.0 b)

事实上,即使没有管道输出,也strace显示ifconfig实际上是将输出写入文件描述符 1(又名stdout),因此不清楚为什么没有实际显示输出。virsh我猜这可能是 LXC 或问题。

答案1

通常这种事情发生的时候,明显失败的程序试图更聪明,当终端驱动程序设置不正确或仅为 0 时,通过查询终端驱动程序的大小(查看 stty -a),或使用 terminfo 但使用不正确的 $TERM 或 $LC_* 变量(尝试运行 env),或在某些奇怪的情况下,某些缓冲区正在被使用,并吞噬未填满缓冲区的数据。在 ifconfig 上运行 strace 与 busybox 版本可能会很有趣。普通的 Linux ifconfig 对这种事情真的很谨慎 - 它所做的只是访问区域设置信息。

相关内容