Sep 1

[原]补充udev 绑定网卡的方法 晴

linuxing , 17:20 , 基础知识 » 硬件处理 , 评论(0) , 引用(0) , 阅读(34424) , Via 本站原创 | |
    之前在[原]简述udev的自定义规则一文中,曾描述过如何绑定block 块设备,也提到可以用于绑定其他的物理设备,例如网卡等。以Asianux 3.0 为例,使用udev 后,经常发生网卡设备在重启或关机后改变的问题。过去,我们是通过在ifcfg-ethx配置文件中,利用MAC地址进行绑定,详细可见[原]解决Asianux 3.0上多网卡设备号变动的问题中的介绍。但这方法有明显的缺陷:即使某网卡不同,也必须加入MAC指定,给一个不用的IP地址,并激活,否则,还是会出现网卡设备变动的问题。
    而使用udev 规则就不会有这问题,它是通过网卡的物理信息在初始化硬件时完成的,还可以自定义设备名称,使用非常方便。

一、编写规则
如果您对udev 不熟悉,建议先回顾一下[原]简述udev的自定义规则一文,下面我只讲解一下步骤。由于修改网络设备,必须停止网络及卸载网卡驱动模块,因此,下面的动作建议在本地环境中运行,远程环境可能不能成功。
1、获取物理设备信息
以eth0为例,以下是初始状态:
引用
# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:11:5B:D1:0E:F8
          inet addr:192.168.228.161  Bcast:192.168.228.255  Mask:255.255.255.0
          inet6 addr: fe80::211:5bff:fed1:ef8/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2357 errors:0 dropped:0 overruns:0 frame:0
          TX packets:742 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:177259 (173.1 KiB)  TX bytes:133102 (129.9 KiB)
          Interrupt:11 Base address:0xe000

首先,使用udevinfo 获取网卡物理设备信息:
引用
# udevinfo -a -p /sys/class/net/eth0
  looking at device '/class/net/eth0':
    KERNEL=="eth0"
    SUBSYSTEM=="net"
    SYSFS{weight}=="64"
    SYSFS{tx_queue_len}=="1000"
    SYSFS{flags}=="0x1003"
    SYSFS{mtu}=="1500"
    SYSFS{operstate}=="unknown"
    SYSFS{dormant}=="0"
    SYSFS{carrier}=="1"
    SYSFS{broadcast}=="ff:ff:ff:ff:ff:ff"
    SYSFS{address}=="00:11:5b:d1:0e:f8"
    SYSFS{link_mode}=="0"
    SYSFS{type}=="1"
    SYSFS{features}=="0x29"
    SYSFS{ifindex}=="12"
    SYSFS{iflink}=="12"
    SYSFS{addr_len}=="6"
......

从输出信息中,寻找可用于编写规则的常量信息,如蓝色部分的MAC 地址。

2、编写规则
以Asianux 3.0系统环境,可以把规则加载默认的/etc/udev/rules.d/60-net.rules 文件中:
引用
SUBSYSTEM=="net",SYSFS{address}=="00:11:5b:d1:0e:f8",NAME="lan0"

※ 注意:在udev规则文件中必须使用小写的16进制MAC地址,udev无法识别大写的MAC地址(或直接以udevinfo 的输出为准)。
另外,不建议使用系统核心会使用的设备名称,例如: eth0、eth1,等等。可改用“lan”或者“wlan”之类的名字。


3、编写设备文件
激活网卡时,系统会使用if-up 脚本读取/etc/sysconfig/network-scripts/下的ifcfg-xxx 配置文件,因此,需编写该配置文件。
从系统创建的ifcfg-eth0 拷贝为ifcfg-lan0:

# cd /etc/sysconfig/network-scripts/
# cp ifcfg-eth0 ifcfg-lan0

然后修改为:
引用
# cat ifcfg-lan0
# Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+
DEVICE=lan0
BOOTPROTO=none
BROADCAST=192.168.228.255
HWADDR=00:11:5B:D1:0E:F8
IPADDR=192.168.228.161
NETMASK=255.255.255.0
NETWORK=192.168.228.0
ONBOOT=yes
GATEWAY=192.168.228.153
TYPE=Ethernet

至此,准备工作完成。

二、重启udev 服务
由于需重命名网络设备,故需停止网络,并卸载网卡驱动模块:
引用
# service network stop
# lsmod|grep 8139
8139too                28928  0
8139cp                 26368  0
mii                     9216  2 8139too,8139cp
# rmmod 8139cp
# rmmod 8139too

然后把原来的网卡配置文件移走:

# mv ifcfg-eth0 /tmp/

启动udev 服务:

# start_udev

重启网络服务:

# service network start

新的网络设备:
引用
# ifconfig lan0
lan0      Link encap:Ethernet  HWaddr 00:11:5B:D1:0E:F8
          inet addr:192.168.228.161  Bcast:192.168.228.255  Mask:255.255.255.0
          inet6 addr: fe80::211:5bff:fed1:ef8/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:584 (584.0 b)  TX bytes:708 (708.0 b)
          Interrupt:11 Base address:0xe000

三、注意事项
1、设备使用中
若没有停止网络,而该网卡设备仍在使用中,重启udev 服务时,会报错:
引用
Sep  1 15:43:57 ax3sp3 udevd-event[3077]: rename_netif: error changing netif name: Device or resource busy

2、远程操作
如果您必须远程操作,而且很有把握的话。在编写完规则后,参考我下面的命令运行:
引用
# service network stop;rmmod 8139cp;rmmod 8139too;start_udev;service network start
正在关闭接口 eth0:                                        [确定]
正在关闭接口 eth1:                                        [确定]
关闭环回接口:                                             [确定]
启动 udev:                                                [确定]
弹出环回接口:                                             [确定]
弹出界面 eth1:                                            [确定]
弹出界面 lan0:                                            [确定]

四、补充
Asianux 3.0 中可以使用udev 绑定裸设备:
1、使用udev 绑定LVM 设备的写法
在60-raw.rules中添加:
引用
# Device mapper raw rules
KERNEL!="dm-[0-9]*", GOTO="skip_dm"
PROGRAM!="/sbin/dmsetup ls --exec /bin/basename -j %M -m %m", GOTO="skip_dm"
RESULT=="mpath2", RUN+="/bin/raw /dev/raw/raw2 /dev/mapper/mpath2"
RESULT=="mpath1", RUN+="/bin/raw /dev/raw/raw1 /dev/mapper/mpath1"
LABEL="skip_dm"

(当然,RESULT 中描写的就是PROGRAM 命令输出的结果)
另外,和dm设备相关的某些rules文件,使用了一些特殊的选项导致后面的规则没有生效,可屏蔽。
例如,50-udev.rules中,把下面的注释掉:
引用
# KERNEL=="dm-[0-9]*", ACTION=="add", OPTIONS+="ignore_device"

2、普通设备绑定裸设备
修改60-raw.rules 文件为:
引用
ACTION=="add",KERNEL=="sda9",RUN+="/bin/raw /dev/raw/raw11 %N"
ACTION=="add",KERNEL=="sda10",RUN+="/bin/raw /dev/raw/raw12 %N"

同样的,可加入权限控制:
引用
KERNEL=="raw1", OWNER="root", GROUP="oinstall", MODE="660"    ==>CRS文件的权限必须为此值
KERNEL=="raw1", OWNER="oracle", GROUP="oinstall", MODE="660"  ==>vote文件

查询结果:
引用
# raw -aq
/dev/raw/raw11: bound to major 8, minor 9
/dev/raw/raw12: bound to major 8, minor 10

以上裸设备的内容,由zhaochao#redflag-linux.com 和 zhengyiyun#redflag-linux.com 提供,谢谢!

五、参考资料
archlinux wiki udev 简介
Tags: ,
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]