虚拟机装的 Debian,如何指定多个网卡与 eth 的对应关系

2018-11-12 11:08:51 +08:00
 shijingshijing

刚刚折腾 Debian,发现一个有意思的事情,本来一直是让 Debian 自动识别并配置多网卡的,现在改了一下 VirtualBox 的配置,然后重新配置了一下 /etc/network/interfaces,发现虚拟机网卡与配置的 eth 编号出现了问题,完全错乱了。想问一下怎么处理。

正常应该是这样对应:

实际的 ifconfig 信息:

当前 interface 的配置:

可以发现,在当前配置下,本应该是 eth0 的 NAT 网卡识别成了 eth2,本应该是 eth1 的桥接网卡识别成了 eth0,本应该是 eth2 的 Host-only 网卡识别成了 eth1。

想请教一下,这种怎么处理,怎么手动指定网卡与 eth 的对应关系。

3037 次点击
所在节点    程序员
6 条回复
wwqgtxx
2018-11-12 12:09:11 +08:00
通过 systemd 的 udev 应该能把网卡名称根据 mac 固定为 ensXX 这种,ubuntu 的默认设定就是这样,你可以去翻翻这方面的文档
iwtbauh
2018-11-12 12:14:30 +08:00
编辑 udev 配置文件,根据 mac 地址分配设备名
linnil
2018-11-12 13:40:06 +08:00
老系统会读取 /etc/udev/rules.d/70-persistent-net.rules 文件,新的貌似也会,但是不确定。你可以写个这样的文件试试。
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}==MAC 地址, ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth9"
shijingshijing
2018-11-14 16:27:32 +08:00
折腾了几天,踩了不少坑,终于搞定了,来汇报一下。
首先,下面的方案只适合于 Debian 8 Jessie。从 Debian 9 开始,不确定下面的方法行不行,好象是 Debian 9 启用了 Predictable Network Interface Names,也叫 Consistent Network Device Naming,下面的方法不一定适用。

方法很简单,修改 /etc/udev/rules.d/70-persistent-net.rules 文件,如果这个文件没有,就 vim 或者 nano 创建这个文件。(网上说 70-persisten-net.rules 是运行 /lib/udev/write_net_rules 然后根据 /lib/udev/rules.d/75-persistent-net-generator-rules 自动创建出来的,the 70-persisten-net.rules file is (somehow) created by the /lib/udev/write_net_rules program, run by the /lib/udev/rules.d/75-persistent-net-generator-rules rules file. 我试了几次,不行,死活出不来这个文件,于是直接手动 create 了。)

在 70-persistent-net.rules 这个文件中,加入楼上说的:
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}==MAC 地址, ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth9"

注意:这里有个巨坑!!!
ATTR{address}==MAC 地址 这里的 MAC 地址,必须小写!!!比如 E0:8D:B0:27:D0:32 这种是不行的,必须 ATTR{address}==“ e0:8d:b0:27:d0:32 ”

修改好之后,重启。

如果上面操作后没有反应,尝试 update-initramfs -u,重新生成启动镜像,然后重启。

启动完毕之后,执行 dmesg | grep eth,发现其实系统开机还是将 MAC 为“ e0:8d:b0:27:d0:32 ”识别成了 eth0,而不是一开始就是 eth9,在后续启动过程中,systemd 会根据规则对该网卡重命名。

参考:
( MAC 必须小写,我是找到这个地方才发现的,其实开始的方法就是对的,但是因为不知道这一点,折腾了很久。)
https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_network_interface_name
http://www.reactivated.net/writing_udev_rules.html
中文:
http://xiaoxuenotes.com/blog/2013/05/03/udev-update-interface-name-mac-mapping.html

英文 StackExchange 高票答案是正确的,第一种永久方案我没试验。可惜也没说 MAC 小写:
https://unix.stackexchange.com/questions/396382/how-can-i-show-the-old-eth0-names-and-also-rename-network-interfaces-in-debian-9/396383

另一个答案也是很好的,我开始没注意小写的问题,这里其实就是用的小写:
https://www.cyberciti.biz/faq/howto-linux-rename-ethernet-devices-named-using-udev/
shijingshijing
2018-11-14 16:36:42 +08:00
关于用 udevadm 生成 70-persistent-net.rules 文件的更多帖子:
https://askubuntu.com/questions/768064/missing-etc-udev-rules-d-70-persistent-net-rules

这个也是一开始就对了的。
https://serverfault.com/questions/52826/how-can-i-force-an-ethernet-port-device-name-to-always-be-eth0

有人在 Ubuntu Server 16.04LTS 不通过 70-persistent-net.rules 来实现的做法,我也试了,不管用,不知道是不是我没弄对:
https://unix.stackexchange.com/questions/255715/how-to-regenerate-70-persistent-net-rules-without-reboot

前两个高票答案说了两种不同的方法:
https://unix.stackexchange.com/questions/28878/changing-the-names-of-network-interfaces-debian-wheezy

官方的,Example 2,我试验了一下,没成功,也就没继续折腾:
https://manpages.debian.org/stretch/udev/systemd.link.5.en.html
CEBBCAT
2018-11-16 23:58:42 +08:00
写博客了吗?收一波 RSS

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/506907

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX