Here's a typical code snippet from the init script:
[0] mount -t proc proc /proc
[1] mount -t sysfs sysfs /sys
-[2] echo /bin/mdev > /proc/sys/kernel/hotplug
+[2] echo /sbin/mdev > /proc/sys/kernel/hotplug
[3] mdev -s
Alternatively, without procfs the above becomes:
[1] mount -t sysfs sysfs /sys
-[2] sysctl -w kernel.hotplug=/bin/mdev
+[2] sysctl -w kernel.hotplug=/sbin/mdev
[3] mdev -s
[6] mount -t devpts devpts /dev/pts
The simple explanation here is that [1] you need to have /sys mounted before
-executing mdev. Then you [2] instruct the kernel to execute /bin/mdev whenever
+executing mdev. Then you [2] instruct the kernel to execute /sbin/mdev whenever
a device is added or removed so that the device node can be created or
destroyed. Then you [3] seed /dev with all the device nodes that were created
while the system was booting.
660 permissions.
The file has the format:
- <device regex> <uid>:<gid> <octal permissions>
- or @<maj[,min1[-min2]]> <uid>:<gid> <octal permissions>
+ [-][envmatch]<device regex> <uid>:<gid> <permissions>
+or
+ [envmatch]@<maj[,min1[-min2]]> <uid>:<gid> <permissions>
+or
+ $envvar=<regex> <uid>:<gid> <permissions>
For example:
- hd[a-z][0-9]* 0:3 660
+ hd[a-z][0-9]* 0:3 660
The config file parsing stops at the first matching line. If no line is
matched, then the default of 0:0 660 is used. To set your own default, simply
create your own total match like so:
+
.* 1:1 777
You can rename/move device nodes by using the next optional field.
- <device regex> <uid>:<gid> <octal permissions> [=path]
+
+ <device regex> <uid>:<gid> <permissions> [=path]
+
So if you want to place the device node into a subdirectory, make sure the path
has a trailing /. If you want to rename the device node, just place the name.
hda 0:3 660 =drives/
Similarly, ">path" renames/moves the device but it also creates
a direct symlink /dev/DEVNAME to the renamed/moved device.
+You can also prevent creation of device nodes with the 4th field as "!":
+ tty[a-z]. 0:0 660 !
+ pty[a-z]. 0:0 660 !
+
If you also enable support for executing your own commands, then the file has
the format:
- <device regex> <uid>:<gid> <octal permissions> [=path] [@|$|*<command>]
+ <device regex> <uid>:<gid> <permissions> [=path] [@|$|*<command>]
or
- <device regex> <uid>:<gid> <octal permissions> [>path] [@|$|*<command>]
+ <device regex> <uid>:<gid> <permissions> [>path] [@|$|*<command>]
+ or
+ <device regex> <uid>:<gid> <permissions> [!] [@|$|*<command>]
+
+For example:
+---8<---
+# block devices
+([hs]d[a-z]) root:disk 660 >disk/%1/0
+([hs]d[a-z])([0-9]+) root:disk 660 >disk/%1/%2
+mmcblk([0-9]+) root:disk 660 >disk/mmc/%1/0
+mmcblk([0-9]+)p([0-9]+) root:disk 660 >disk/mmc/%1/%2
+# network devices
+(tun|tap) root:network 660 >net/%1
+---8<---
+
The special characters have the meaning:
@ Run after creating the device.
$ Run before removing the device.
If you want to activate this feature, execute "echo >/dev/mdev.seq" prior to
setting mdev to be the hotplug handler. This writes single '\n' to the file.
-NB: mdev recognizes /dev/mdev.seq consisting of single '\n' characher
+NB: mdev recognizes /dev/mdev.seq consisting of single '\n' character
as a special case. IOW: this will not make your first hotplug event
to stall for two seconds.