之前在简述udev的自定义规则一文中,曾描述过如何绑定block 块设备,也提到可以用于绑定其他的物理设备,例如网卡等。以Asianux 3.0 为例,使用udev 后,经常发生网卡设备在重启或关机后改变的问题。过去,我们是通过在ifcfg-ethx配置文件中,利用MAC地址进行绑定,详细可见解决Asianux 3.0上多网卡设备号变动的问题中的介绍。但这方法有明显的缺陷:即使某网卡不同,也必须加入MAC指定,给一个不用的IP地址,并激活,否则,还是会出现网卡设备变动的问题。
而使用udev 规则就不会有这问题,它是通过网卡的物理信息在初始化硬件时完成的,还可以自定义设备名称,使用非常方便。
一、编写规则
如果您对udev 不熟悉,建议先回顾一下简述udev的自定义规则一文,下面我只讲解一下步骤。由于修改网络设备,必须停止网络及卸载网卡驱动模块,因此,下面的动作建议在本地环境中运行,远程环境可能不能成功。
1、获取物理设备信息
以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 获取网卡物理设备信息:
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 文件中:
※ 注意:在udev规则文件中必须使用小写的16进制MAC地址,udev无法识别大写的MAC地址(或直接以udevinfo 的输出为准)。
另外,不建议使用系统核心会使用的设备名称,例如: eth0、eth1,等等。可改用“lan”或者“wlan”之类的名字。
3、编写设备文件
激活网卡时,系统会使用if-up 脚本读取/etc/sysconfig/network-scripts/下的ifcfg-xxx 配置文件,因此,需编写该配置文件。
从系统创建的ifcfg-eth0 拷贝为ifcfg-lan0:
# cp ifcfg-eth0 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 服务
由于需重命名网络设备,故需停止网络,并卸载网卡驱动模块:
# lsmod|grep 8139
8139too 28928 0
8139cp 26368 0
mii 9216 2 8139too,8139cp
# rmmod 8139cp
# rmmod 8139too
然后把原来的网卡配置文件移走:
启动udev 服务:
重启网络服务:
新的网络设备:
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 服务时,会报错:
2、远程操作
如果您必须远程操作,而且很有把握的话。在编写完规则后,参考我下面的命令运行:
正在关闭接口 eth0: [确定]
正在关闭接口 eth1: [确定]
关闭环回接口: [确定]
启动 udev: [确定]
弹出环回接口: [确定]
弹出界面 eth1: [确定]
弹出界面 lan0: [确定]
四、补充
Asianux 3.0 中可以使用udev 绑定裸设备:
1、使用udev 绑定LVM 设备的写法
在60-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中,把下面的注释掉:
2、普通设备绑定裸设备
修改60-raw.rules 文件为:
ACTION==”add”,KERNEL==”sda10″,RUN+=”/bin/raw /dev/raw/raw12 %N”
同样的,可加入权限控制:
KERNEL==”raw1″, OWNER=”oracle”, GROUP=”oinstall”, MODE=”660″ ==>vote文件
查询结果:
/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 修改MAC地址后网卡不能启动的错误
简述udev的自定义规则
[转]理解和认识udev
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/linux/104181.html