Chinaunix首页 | 论坛 | 博客
  • 博客访问: 394829
  • 博文数量: 138
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1620
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-10 16:55
个人简介

当你比别人优秀一点点,别人会嫉妒你。当你比别人优秀很多,别人会羡慕你。

文章分类

全部博文(138)

文章存档

2016年(2)

2015年(2)

2014年(15)

2013年(119)

我的朋友

分类: LINUX

2015-02-27 15:23:33

偶尔发现网络接口的名字已经不是eth0 eth1 而是eno1 eno2

看看究竟!

 

 [root@HPA08 ~]# ip addr

1: lo: mtu 65536 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eno1: mtu 1500 qdisc mq state UP qlen 1000

    link/ether 38:ea:a7:35:ac:88 brd ff:ff:ff:ff:ff:ff

    inet 135.242.62.218/26 brd 135.242.62.255 scope global eno1

       valid_lft forever preferred_lft forever

    inet6 fe80::3aea:a7ff:fe35:ac88/64 scope link

       valid_lft forever preferred_lft forever

3: eno2: mtu 1500 qdisc mq state UP qlen 1000

link/ether 38:ea:a7:35:ac:89 brd ff:ff:ff:ff:ff:ff

 

 

以前的命名方式有些漏洞,接口的命名是在driver probe 网络接口的时候,自动编号命名的,有可能说,同一个NIC,在一次启动的时候是eth1 下一次启动变成了eth3,这样对于一些依赖于网络接口的程序是不方便的。

比如防火墙规则中,可能有的规则就是依赖网络接口的名字,当重启后,网络接口的名字发生了变化,那么防火墙的规则就匹配到了错误的接口上去了。

有很多solution曾经提出来解决这个问题,比如通过mac地址来唯一确定一个接口卡,这样引入了一些新的问题,比如说,如果我们制定一个MAC地址命名为eth0,那么同样的OS 镜像在安装到不同机器上的时候,就需要做一些修改(MAC地址不同了嘛)这样就太2了。自动检测网卡并命名肯定没这个问题!

还有就是在很多机器上,MAC地址是不固定的,比如很多嵌入式设备,或者虚拟机。

最重要的一点是

The biggest of all however is that the userspace components trying to assign the interface name raced against the kernel assigning new names from the same "ethX" namespace, a race condition with all kinds of weird effects, among them that assignment of names sometimes failed. As a result support for this has been removed from systemd/udev a while back.

 

         Udev程序作为用户空间的程序去按照MAC地址去分配网卡名字,这件事情,会和内核空间,按照probe的顺序去分配网卡名字,这两个行为会有冲突,有可能会导致名字分配失败。

 

Predictable Network Interface Names

 

biosdevname

这个方式是通过bios获取具体的卡槽,slot,如果这个卡槽插入网卡,那么他的名字就是固定的。如果这个卡槽不插入网卡,那么这个名字也不会被占用。

比如三个卡槽,如果都插入网卡,那么就会有eno1 eno2 eno3三个网卡的名字出现。

如果第一个和第二个卡槽都控制,把唯一的一个网卡插入第三个卡槽,那么系统中只会出现eno3, 另外两个卡槽虽然没有网卡,但是名字也被占据了。

 

这是一个feature,有个开关,如果关掉,还是会通过driver probe,根据发现网卡的顺序来编号的。

 

 

  1. Names incorporating Firmware/BIOS provided index numbers for on-board devices (example: eno1) 板载网卡
  2. Names incorporating Firmware/BIOS provided PCI Express hotplug slot index numbers (example: ens1) PCI 拔插网卡
  3. Names incorporating physical/geographical location of the connector of the hardware (example: enp2s0)
  4. Names incorporating the interfaces's MAC address (example: enx78e7d1ea46da)
  5. Classic, unpredictable kernel-native ethX naming (example: eth0)

by default, systemd v197 will now name interfaces following policy 1) if that information from the firmware is applicable and available, falling back to 2) if that information from the firmware is applicable and available, falling back to 3) if applicable, falling back to 5) in all other cases. Policy 4) is not used by default, but is available if the user chooses so.

 

 

 

I don't like this, how do I disable this?

You basically have four options:

  1. You disable the assignment of fixed names, so that the unpredictable kernel names are used again. For this, simply mask udev's rule file for the default policy: ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules (since v209: this file was called 80-net-name-slot.rules in release v197 through v208)
  2. You create your own manual naming scheme, for example by naming your interfaces "internet0", "dmz0" or "lan0". For that create your own udev rules file and set the NAME property for the devices. Make sure to order it before the default policy file, for example by naming it /etc/udev/rules.d/70-my-net-names.rules
  3. You alter the default policy file, for picking a different naming scheme, for example for naming all interface names after their MAC address by default: cp /usr/lib/udev/rules.d/80-net-setup-link.rules /etc/udev/rules.d/80-net-setup-link.rules, then edit the file there and change the lines as necessary.
  4. You pass the net.ifnames=0 on the kernel command line (since v199)

 

阅读(1939) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~