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

    之前在简述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 简介

Asianux 4.0 中KVM 使用桥接
解决Asianux 4.0 修改MAC地址后网卡不能启动的错误
简述udev的自定义规则
[转]理解和认识udev

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/linux/104181.html

(0)
上一篇 2021年8月25日 13:04
下一篇 2021年8月25日 13:04

相关推荐

发表回复

登录后才能评论