[1765] | 1 | -------------
|
---|
| 2 | MDEV Primer
|
---|
| 3 | -------------
|
---|
| 4 |
|
---|
| 5 | For those of us who know how to use mdev, a primer might seem lame. For
|
---|
| 6 | everyone else, mdev is a weird black box that they hear is awesome, but can't
|
---|
| 7 | seem to get their head around how it works. Thus, a primer.
|
---|
| 8 |
|
---|
| 9 | -----------
|
---|
| 10 | Basic Use
|
---|
| 11 | -----------
|
---|
| 12 |
|
---|
| 13 | Mdev has two primary uses: initial population and dynamic updates. Both
|
---|
| 14 | require sysfs support in the kernel and have it mounted at /sys. For dynamic
|
---|
| 15 | updates, you also need to have hotplugging enabled in your kernel.
|
---|
| 16 |
|
---|
| 17 | Here's a typical code snippet from the init script:
|
---|
| 18 | [1] mount -t sysfs sysfs /sys
|
---|
| 19 | [2] echo /bin/mdev > /proc/sys/kernel/hotplug
|
---|
| 20 | [3] mdev -s
|
---|
| 21 |
|
---|
| 22 | Of course, a more "full" setup would entail executing this before the previous
|
---|
| 23 | code snippet:
|
---|
| 24 | [4] mount -t tmpfs mdev /dev
|
---|
| 25 | [5] mkdir /dev/pts
|
---|
| 26 | [6] mount -t devpts devpts /dev/pts
|
---|
| 27 |
|
---|
| 28 | The simple explanation here is that [1] you need to have /sys mounted before
|
---|
| 29 | executing mdev. Then you [2] instruct the kernel to execute /bin/mdev whenever
|
---|
| 30 | a device is added or removed so that the device node can be created or
|
---|
| 31 | destroyed. Then you [3] seed /dev with all the device nodes that were created
|
---|
| 32 | while the system was booting.
|
---|
| 33 |
|
---|
| 34 | For the "full" setup, you want to [4] make sure /dev is a tmpfs filesystem
|
---|
| 35 | (assuming you're running out of flash). Then you want to [5] create the
|
---|
| 36 | /dev/pts mount point and finally [6] mount the devpts filesystem on it.
|
---|
| 37 |
|
---|
| 38 | -------------
|
---|
| 39 | MDEV Config (/etc/mdev.conf)
|
---|
| 40 | -------------
|
---|
| 41 |
|
---|
| 42 | Mdev has an optional config file for controlling ownership/permissions of
|
---|
| 43 | device nodes if your system needs something more than the default root/root
|
---|
| 44 | 660 permissions.
|
---|
| 45 |
|
---|
| 46 | The file has the format:
|
---|
| 47 | <device regex> <uid>:<gid> <octal permissions>
|
---|
| 48 | For example:
|
---|
| 49 | hd[a-z][0-9]* 0:3 660
|
---|
| 50 |
|
---|
| 51 | The config file parsing stops at the first matching line. If no line is
|
---|
| 52 | matched, then the default of 0:0 660 is used. To set your own default, simply
|
---|
| 53 | create your own total match like so:
|
---|
| 54 | .* 1:1 777
|
---|
| 55 |
|
---|
| 56 | If you also enable support for executing your own commands, then the file has
|
---|
| 57 | the format:
|
---|
| 58 | <device regex> <uid>:<gid> <octal permissions> [<@|$|*> <command>]
|
---|
| 59 | The special characters have the meaning:
|
---|
| 60 | @ Run after creating the device.
|
---|
| 61 | $ Run before removing the device.
|
---|
| 62 | * Run both after creating and before removing the device.
|
---|
| 63 |
|
---|
| 64 | The command is executed via the system() function (which means you're giving a
|
---|
| 65 | command to the shell), so make sure you have a shell installed at /bin/sh.
|
---|
| 66 |
|
---|
| 67 | For your convenience, the shell env var $MDEV is set to the device name. So if
|
---|
| 68 | the device 'hdc' was matched, MDEV would be set to "hdc".
|
---|
| 69 |
|
---|
| 70 | ----------
|
---|
| 71 | FIRMWARE
|
---|
| 72 | ----------
|
---|
| 73 |
|
---|
| 74 | Some kernel device drivers need to request firmware at runtime in order to
|
---|
| 75 | properly initialize a device. Place all such firmware files into the
|
---|
| 76 | /lib/firmware/ directory. At runtime, the kernel will invoke mdev with the
|
---|
| 77 | filename of the firmware which mdev will load out of /lib/firmware/ and into
|
---|
| 78 | the kernel via the sysfs interface. The exact filename is hardcoded in the
|
---|
| 79 | kernel, so look there if you need to want to know what to name the file in
|
---|
| 80 | userspace.
|
---|