Sep
1
之前在[原]简述udev的自定义规则一文中,曾描述过如何绑定block 块设备,也提到可以用于绑定其他的物理设备,例如网卡等。以Asianux 3.0 为例,使用udev 后,经常发生网卡设备在重启或关机后改变的问题。过去,我们是通过在ifcfg-ethx配置文件中,利用MAC地址进行绑定,详细可见[原]解决Asianux 3.0上多网卡设备号变动的问题中的介绍。但这方法有明显的缺陷:即使某网卡不同,也必须加入MAC指定,给一个不用的IP地址,并激活,否则,还是会出现网卡设备变动的问题。
而使用udev 规则就不会有这问题,它是通过网卡的物理信息在初始化硬件时完成的,还可以自定义设备名称,使用非常方便。
一、编写规则
如果您对udev 不熟悉,建议先回顾一下[原]简述udev的自定义规则一文,下面我只讲解一下步骤。由于修改网络设备,必须停止网络及卸载网卡驱动模块,因此,下面的动作建议在本地环境中运行,远程环境可能不能成功。
1、获取物理设备信息
以eth0为例,以下是初始状态:
首先,使用udevinfo 获取网卡物理设备信息:
从输出信息中,寻找可用于编写规则的常量信息,如蓝色部分的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:
然后修改为:
至此,准备工作完成。
二、重启udev 服务
由于需重命名网络设备,故需停止网络,并卸载网卡驱动模块:
然后把原来的网卡配置文件移走:
启动udev 服务:
重启网络服务:
新的网络设备:
三、注意事项
1、设备使用中
若没有停止网络,而该网卡设备仍在使用中,重启udev 服务时,会报错:
2、远程操作
如果您必须远程操作,而且很有把握的话。在编写完规则后,参考我下面的命令运行:
四、补充
Asianux 3.0 中可以使用udev 绑定裸设备:
1、使用udev 绑定LVM 设备的写法
在60-raw.rules中添加:
(当然,RESULT 中描写的就是PROGRAM 命令输出的结果)
另外,和dm设备相关的某些rules文件,使用了一些特殊的选项导致后面的规则没有生效,可屏蔽。
例如,50-udev.rules中,把下面的注释掉:
2、普通设备绑定裸设备
修改60-raw.rules 文件为:
同样的,可加入权限控制:
查询结果:
以上裸设备的内容,由zhaochao#redflag-linux.com 和 zhengyiyun#redflag-linux.com 提供,谢谢!
五、参考资料
archlinux wiki udev 简介
而使用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
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"
......
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
# 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
# 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
# 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
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: [确定]
正在关闭接口 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"
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"
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文件
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
/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 简介