V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shijingshijing
V2EX  ›  程序员

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

  •  
  •   shijingshijing · 2018-11-12 11:08:51 +08:00 · 3050 次点击
    这是一个创建于 2201 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    正常应该是这样对应:

    实际的 ifconfig 信息:

    当前 interface 的配置:

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

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

    第 1 条附言  ·  2018-11-14 16:27:55 +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/
    6 条回复    2018-11-16 23:58:42 +08:00
    wwqgtxx
        1
    wwqgtxx  
       2018-11-12 12:09:11 +08:00 via iPhone
    通过 systemd 的 udev 应该能把网卡名称根据 mac 固定为 ensXX 这种,ubuntu 的默认设定就是这样,你可以去翻翻这方面的文档
    iwtbauh
        2
    iwtbauh  
       2018-11-12 12:14:30 +08:00 via Android
    编辑 udev 配置文件,根据 mac 地址分配设备名
    linnil
        3
    linnil  
       2018-11-12 13:40:06 +08:00   ❤️ 1
    老系统会读取 /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
        4
    shijingshijing  
    OP
       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
        5
    shijingshijing  
    OP
       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
        6
    CEBBCAT  
       2018-11-16 23:58:42 +08:00
    写博客了吗?收一波 RSS
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4778 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 09:46 · PVG 17:46 · LAX 01:46 · JFK 04:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.