1、mdev.conf格式说明
mdev.conf的格式:
: [<@|$|*> ]
device regex:正则表达式,表示哪一个设备
uid: owner
gid: 组ID
octal permissions:以八进制表示的属性
@:创建设备节点之后执行命令
$:删除设备节点之前执行命令
*:创建设备节点之后 和 删除设备节点之前 执行命令
command:要执行的命令
2、配置mdev.conf
按照韦老师的教学,操作
vi /etc/mdev.conf
//加入
xyz 0:0 777
insmod led_drv.ko
led_base = 0xfea43010
led_dir = 0xfea43400
ls -l dev/xyz
crw------- 1 0 0 253, 0 Jan 1 00:00 dev/xyz
发现xyz权限并没有更改,设备在启动的时候打印这么一句话
/etc/init.d/rcS: line 5: can't create /proc/sys/kernel/hotplug: nonexistent directory
百度发现编译内核的时候需要把下面几选项加上
CONFIG_PROC_FS=y
CONFIG_PROC_SYSCTL=y
CONFIG_HOTPLUG=y
CONFIG_NET=y
如果CONFIG_HOTPLUG和CONFIG_NET不选或没全选上的话,/proc/sys/kernel下将不会创建hotplug文件.(参见kernel/sysctl.c)
检查Hi3519v101的内核,发现并没有CONFIG_HOTPLUG,该问题现无解。
3、修改mdev.conf
在mdev.conf添加
vi /etc/mdev.conf
//加入
i2c-0 0:0 777
reboot
//启动之后
ls -l dev/i2c-*
crwxrwxrwx 1 0 0 89, 0 Jan 1 00:00 dev/i2c-0
crw-rw---- 1 0 0 89, 1 Jan 1 00:00 dev/i2c-1
crw-rw---- 1 0 0 89, 2 Jan 1 00:00 dev/i2c-2
crw-rw---- 1 0 0 89, 3 Jan 1 00:00 dev/i2c-3
insmod led_drv.ko
led_base = 0xfea43010
led_dir = 0xfea43400
ls -l dev/xyz
crw------- 1 0 0 253, 0 Jan 1 00:00 dev/xyz
发现重启之后i2c-0的权限更改了,说明mdev.conf是起效了的,只是不支持新加载的驱动,也就是不支持热插拔,跟上面的hotplug不能创建有关系。
3、完善mdev.conf
3.1加上正则表达式
vi /etc/mdev.conf
//修改为
i2c-[0123]? 0:0 777
reboot
//启动之后
ls -l dev/i2c-*
crwxrwxrwx 1 0 0 89, 0 Jan 1 00:00 dev/i2c-0
crwxrwxrwx 1 0 0 89, 1 Jan 1 00:00 dev/i2c-1
crwxrwxrwx 1 0 0 89, 2 Jan 1 00:00 dev/i2c-2
crwxrwxrwx 1 0 0 89, 3 Jan 1 00:00 dev/i2c-3
3.2创建节点后执行某个命令 @
vi /etc/mdev.conf
//修改,$MDEV 环境变量表示哪个设备节点
i2c-[0123]? 0:0 777 @ echo create /dev/$MDEV > /dev/console
reboot
//启动之后,进入系统之前可看到如下打印
create /dev/i2c-0
create /dev/i2c-1
create /dev/i2c-2
create /dev/i2c-3
3.3创建节点后,删除节点之前都执行某个命令 *
vi /etc/mdev.conf
//修改,$MDEV 环境变量表示哪个设备节点
i2c-[0123]? 0:0 777 * if [ $ACTION = "add" ]; then echo create /dev/$MDEV > /dev/console; else echo remove /dev/$MDEV > /dev/console; fi
reboot
//启动之后,进入系统之前可看到如下打印
sh: missing ]
remove /dev/i2c-0
sh: missing ]
remove /dev/i2c-1
sh: missing ]
remove /dev/i2c-2
sh: missing ]
remove /dev/i2c-3
ls -l dev/i2c-*
crwxrwxrwx 1 0 0 89, 0 Jan 1 00:00 dev/i2c-0
crwxrwxrwx 1 0 0 89, 1 Jan 1 00:00 dev/i2c-1
crwxrwxrwx 1 0 0 89, 2 Jan 1 00:00 dev/i2c-2
crwxrwxrwx 1 0 0 89, 3 Jan 1 00:00 dev/i2c-3
创建成功的,但打印并没有按照意愿执行,说明if [ $ACTION = “add” ]这里有问题,可能环境变量并不是这个,这里不深究了,后续再解决。
也可以采用@ 与 $代替*,这样就用判断了。
如果是可加载模块,在移除模块的时候,还会有相关打印出现。
3.4创建命令脚本
vi /sbin/add_remove_i2c.sh
//添加内容
if [ $ACTION = "add" ];
then
echo create /dev/$MDEV > /dev/console;
else
echo remove /dev/$MDEV > /dev/console;
fi
vi /etc/mdev.conf
//添加内容
i2c-[0123]? 0:0 777 * /sbin/add_remove_i2c.sh
reboot
//出现如下打印,说明无权限执行
/bin/sh: /sbin/add_remove_i2c.sh: Permission denied
/bin/sh: /sbin/add_remove_i2c.sh: Permission denied
/bin/sh: /sbin/add_remove_i2c.sh: Permission denied
/bin/sh: /sbin/add_remove_i2c.sh: Permission denied
//加上可执行权限:chmod +x /sbin/add_remove_i2c.sh
reboot
//打印如下,说明/sbin/add_remove_i2c.sh 起效了
ash: add: unknown operand
remove /dev/i2c-0
ash: add: unknown operand
remove /dev/i2c-1
ash: add: unknown operand
remove /dev/i2c-2
ash: add: unknown operand
remove /dev/i2c-3
3.5加载U盘
vi /sbin/add_usb.sh
//添加内容
mount /dev/$MDEV /mnt;
echo mount /dev/$MDEV /mnt > /dev/console;
vi /sbin/remove_usb.sh
//添加内容
umount /mnt;
echo umount ok!
vi /etc/mdev.conf
//添加内容
sda[1-9]+ 0:0 777 @ /sbin/add_usb.sh
sda[1-9]+ 0:0 777 $ /sbin/remove_usb.sh
reboot
/etc/init.d/rcS: line 5: can't create /proc/sys/kernel/hotplug: nonexistent directory
mount /dev/sda1
EXT4-fs (sda2): couldn't mount as ext3 due to feature incompatibilities
EXT4-fs (sda2): couldn't mount as ext2 due to feature incompatibilities
EXT4-fs (sda2): mounted filesystem with ordered data mode. Opts: (null)
mount /dev/sda2
cat proc/mounts
rootfs / rootfs rw 0 0
10.117.197.252:/home/osrc/Hi3519V101_SDK_V1.0.4.0/osdrv/opensource/busybox/busybox-1.20.2/rootbox / nfs rw,relatime,vers=3,rsize=4096,wsize=4096,namlen=255,hard,nolock,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.117.197.252,mountvers=3,mountproto=tcp,local_lock=all,addr=10.117.197.252 0 0
devtmpfs /dev devtmpfs rw,relatime,size=37300k,nr_inodes=9325,mode=755 0 0
proc /proc proc rw,relatime 0 0
tmpfs /tmp tmpfs rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
/dev/sda1 /mnt vfat rw,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 0
/dev/sda2 /mnt ext4 rw,relatime,data=ordered 0 0
因为不支持hotplug,拔掉U盘也没有相应的打印信息,移除的操作无法实现。