用脚本动态创建设备节点

来源:互联网 发布:linux apt get java8 编辑:程序博客网 时间:2024/04/30 22:14

Linux系统的主设备号本来是固定的,这没有什么不好。但是,有许多理由要求Linux系统能够自动为设备动态分配主设备号——只要设备驱动程序提出申请。尤其是当你不打算给你的客户提供驱动程序源代码的时候,为了避免与客户的系统中的其他设备相冲突,采用动态获取主设备号的办法是一个好主意。

系统动态分配主设备号带来的问题是,提前创建的设备节点可能失效。在没有udev或者mdev这类机制的小型嵌入式系统中,这个问题显而易见(但是,在这样封闭的嵌入式系统中为什么还要动态分配主设备号呢?这是哲学家该思考的问题)。所以,有些系统管理员想到用脚本实现设备节点的自动创建。这样,写好一个脚本之后,不管内核被重新编译多少次,也不管module的加载顺序怎么修改,都能够以不变应万变。

其实写这样的脚本很简单,因为最关键的,获取major的代码只需要一句:
major=$(grep -q <driver-name> /proc/devices | cut -b1,2,3)

这里要提到/proc/devices这个文件节点。cat一下你会发现,输出结果类似:
# cat /proc/devices
Character devices:
  1 mem
  4 /dev/vc/0
  4 tty
  4 ttyS
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  6 lp
  7 vcs
 10 misc
 13 input
 14 sound
 21 sg
 29 fb
116 alsa
128 ptm
136 pts
162 raw
180 usb
188 ttyUSB
189 usb_device
216 rfcomm
226 drm
254 pcmcia

Block devices:
  1 ramdisk
  2 fd
  3 ide0
  7 loop
  8 sd
  9 md
 65 sd
 66 sd
 67 sd
 68 sd
 69 sd
 70 sd
 71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
253 device-mapper
254 mdp

因此,"grep -q fb /proc/devices"命令得到的结果是
" 29 fb"
再把这个结果作为输入,执行"cut -b1,2,3"之后得到
major=" 29"
虽然29前面还有个空格,但并不耽误你把它写进"mknod /dev/fb0 c $major 0"这条命令里。

简单地利用grep还可以进一步做些事情,例如用
grep -n "Block devices:" /proc/devices
这条命令可以在得到的结果前面加上行号,类似
27:Block devices
再把该结果作为输入,执行"cut -d':' -f1"命令,即可得到行号27。
用相同的方法得到设备驱动名字所在的行号,与27比较,就可以得知你想要创建的设备节点是字符设备还是块设备。
不过,这个方法有些无聊,因为如果你既知道设备节点的名字,又知道设备驱动的名字,却不知道应该创建字符设备还是块设备,那么你真的应该检讨一下了。

原创粉丝点击