mirror of
https://git.busybox.net/busybox.git
synced 2024-12-02 18:13:26 +08:00
92 lines
3.5 KiB
Plaintext
92 lines
3.5 KiB
Plaintext
-------------
|
|
MDEV Primer
|
|
-------------
|
|
|
|
For those of us who know how to use mdev, a primer might seem lame. For
|
|
everyone else, mdev is a weird black box that they hear is awesome, but can't
|
|
seem to get their head around how it works. Thus, a primer.
|
|
|
|
-----------
|
|
Basic Use
|
|
-----------
|
|
|
|
Mdev has two primary uses: initial population and dynamic updates. Both
|
|
require sysfs support in the kernel and have it mounted at /sys. For dynamic
|
|
updates, you also need to have hotplugging enabled in your kernel.
|
|
|
|
Here's a typical code snippet from the init script:
|
|
[1] mount -t sysfs sysfs /sys
|
|
[2] echo /bin/mdev > /proc/sys/kernel/hotplug
|
|
[3] mdev -s
|
|
|
|
Of course, a more "full" setup would entail executing this before the previous
|
|
code snippet:
|
|
[4] mount -t tmpfs mdev /dev
|
|
[5] mkdir /dev/pts
|
|
[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
|
|
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.
|
|
|
|
For the "full" setup, you want to [4] make sure /dev is a tmpfs filesystem
|
|
(assuming you're running out of flash). Then you want to [5] create the
|
|
/dev/pts mount point and finally [6] mount the devpts filesystem on it.
|
|
|
|
-------------
|
|
MDEV Config (/etc/mdev.conf)
|
|
-------------
|
|
|
|
Mdev has an optional config file for controlling ownership/permissions of
|
|
device nodes if your system needs something more than the default root/root
|
|
660 permissions.
|
|
|
|
The file has the format:
|
|
<device regex> <uid>:<gid> <octal permissions>
|
|
For example:
|
|
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/relocate device nodes by using the next optional field.
|
|
<device regex> <uid>:<gid> <octal 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/
|
|
This will relocate "hda" into the drives/ subdirectory.
|
|
hdb 0:3 660 >cdrom
|
|
This will rename "hdb" to "cdrom".
|
|
|
|
If you also enable support for executing your own commands, then the file has
|
|
the format:
|
|
<device regex> <uid>:<gid> <octal permissions> [<@|$|*> <command>]
|
|
The special characters have the meaning:
|
|
@ Run after creating the device.
|
|
$ Run before removing the device.
|
|
* Run both after creating and before removing the device.
|
|
|
|
The command is executed via the system() function (which means you're giving a
|
|
command to the shell), so make sure you have a shell installed at /bin/sh. You
|
|
should also keep in mind that the kernel executes hotplug helpers with stdin,
|
|
stdout, and stderr connected to /dev/null.
|
|
|
|
For your convenience, the shell env var $MDEV is set to the device name. So if
|
|
the device "hdc" was matched, MDEV would be set to "hdc".
|
|
|
|
----------
|
|
FIRMWARE
|
|
----------
|
|
|
|
Some kernel device drivers need to request firmware at runtime in order to
|
|
properly initialize a device. Place all such firmware files into the
|
|
/lib/firmware/ directory. At runtime, the kernel will invoke mdev with the
|
|
filename of the firmware which mdev will load out of /lib/firmware/ and into
|
|
the kernel via the sysfs interface. The exact filename is hardcoded in the
|
|
kernel, so look there if you need to want to know what to name the file in
|
|
userspace.
|