当你比别人优秀一点点,别人会嫉妒你。当你比别人优秀很多,别人会羡慕你。
分类: LINUX
2015-02-27 15:23:33
偶尔发现网络接口的名字已经不是eth0 eth1 而是eno1 eno2
看看究竟!
[root@HPA08 ~]# ip addr
1: lo:
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:
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:
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,根据发现网卡的顺序来编号的。
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.
You basically have four options: