免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 13176 | 回复: 8

[网络子系统] linux下网卡名字eth0 eth1保存在哪里? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2014-11-18 19:11 |显示全部楼层
以前一直认为ifconfig看到的eth0、eth1这些值是在网卡驱动中的struct net_device 结构体的 char name[IFNAMSIZ];中保存的
驱动中指定net_device 的name为eth0,那么ifconfig看到的就是eth0

今天看到在/etc/udev/rules.d下的70-persistent-net.rules下有这么一条规则可以设定网卡的名字:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="3c:97:0e:c2:fc:f1", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

难道这条语句还会通过netlink把eth0这个名字传给内核,然后修改net_device结构体中的name成员么?
假如是这样,那么是怎么做到的?

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
发表于 2014-11-18 23:48 |显示全部楼层
回复 1# jinxinxin163


除了udev外,你可以看看ifrename,这是改网卡名字的独立程序。对应的源码可以看下面的网站(不是官网):
http://sourceforge.net/mirror/an ... ols/ifrename.c#l582

当然也可以自己写程序:
http://linux.die.net/man/7/netdevice

其中SIOCSIFNAME就是用来改名字的。
Changes the name of the interface specified in ifr_name to ifr_newname. This is a privileged operation. It is only allowed when the interface is not up.

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
发表于 2014-11-18 23:51 |显示全部楼层
对应的内核源码为:
  1. /**
  2. *        dev_change_name - change name of a device
  3. *        @dev: device
  4. *        @newname: name (or format string) must be at least IFNAMSIZ
  5. *
  6. *        Change name of a device, can pass format strings "eth%d".
  7. *        for wildcarding.
  8. */
  9. int dev_change_name(struct net_device *dev, char *newname)
  10. {
  11.         char oldname[IFNAMSIZ];
  12.         int err = 0;
  13.         int ret;
  14.         struct net *net;

  15.         ASSERT_RTNL();
  16.         BUG_ON(!dev->nd_net);

  17.         net = dev->nd_net;
  18.         if (dev->flags & IFF_UP)
  19.                 return -EBUSY;

  20.         if (!dev_valid_name(newname))
  21.                 return -EINVAL;

  22.         if (strncmp(newname, dev->name, IFNAMSIZ) == 0)
  23.                 return 0;

  24.         memcpy(oldname, dev->name, IFNAMSIZ);

  25.         if (strchr(newname, '%')) {
  26.                 err = dev_alloc_name(dev, newname);
  27.                 if (err < 0)
  28.                         return err;
  29.                 strcpy(newname, dev->name);
  30.         }
  31.         else if (__dev_get_by_name(net, newname))
  32.                 return -EEXIST;
  33.         else
  34.                 strlcpy(dev->name, newname, IFNAMSIZ);

  35. rollback:
  36.         device_rename(&dev->dev, dev->name);

  37.         write_lock_bh(&dev_base_lock);
  38.         hlist_del(&dev->name_hlist);
  39.         hlist_add_head(&dev->name_hlist, dev_name_hash(net, dev->name));
  40.         write_unlock_bh(&dev_base_lock);

  41.         ret = call_netdevice_notifiers(NETDEV_CHANGENAME, dev);
  42.         ret = notifier_to_errno(ret);

  43.         if (ret) {
  44.                 if (err) {
  45.                         printk(KERN_ERR
  46.                                "%s: name change rollback failed: %d.\n",
  47.                                dev->name, ret);
  48.                 } else {
  49.                         err = ret;
  50.                         memcpy(dev->name, oldname, IFNAMSIZ);
  51.                         goto rollback;
  52.                 }
  53.         }

  54.         return err;
  55. }
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2014-11-24 20:04 |显示全部楼层
谢谢回复啊,你的意思是udev会调用ioctl来改变网卡的名字?

但是“udev调用ioctl来改变网卡的名字”是在哪里实现的?肯定不是udev的代码里,udev的rules里我也没有看到相关的配置啊

回复 3# Tinnal


   

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
发表于 2014-11-24 22:50 |显示全部楼层
jinxinxin163 发表于 2014-11-24 20:04
谢谢回复啊,你的意思是udev会调用ioctl来改变网卡的名字?

但是“udev调用ioctl来改变网卡的名字”是在 ...


我没有看过udev源码,但对你这个问法觉得很奇怪。为什么就不能在udev里ioctl呢?这不是很正常的事情吗?

至于你于的“udev的rules里我也没有看到相关的配置啊”我想你连最基本的udev man手册都没有去看。
给你一个在线版本的:
http://linux.die.net/man/8/udev

其中对NAME关键字的说明为:
NAME
The name of the node to be created, or the name, the network interface should be renamed to.
If given with the attribute NAME{all_partitions} it will create all 15 partitions of a blockdevice. This may be useful for removable media devices.

兄台,学Linux要多google,多看man手册。

论坛徽章:
0
发表于 2014-12-11 23:26 |显示全部楼层
...

版主好,请教个问题,假如没用udev,内核初始化的时候是根据什么来决定eth0,eth1,....的顺序的?如果我想改变这种顺序,有什么办法?

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
发表于 2014-12-12 13:12 |显示全部楼层

key:

ioctl &&  SIOCSIFNAME

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
发表于 2014-12-15 13:03 |显示全部楼层
回复 6# pingmm


   根据网卡驱动插入的先后顺序。先插入的得eth0,后插入的得eth1, 以此类推。

论坛徽章:
0
发表于 2014-12-17 13:33 |显示全部楼层
回复 8# Tinnal


    谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP