Mike Frysinger | ae30210 | 2007-02-14 13:20:29 +0000 | [diff] [blame] | 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 | |
Mike Frysinger | f0044c4 | 2008-02-01 06:53:50 +0000 | [diff] [blame] | 56 | You can rename/relocate device nodes by using the next optional field. |
| 57 | <device regex> <uid>:<gid> <octal permissions> [>path] |
| 58 | So if you want to place the device node into a subdirectory, make sure the path |
| 59 | has a trailing /. If you want to rename the device node, just place the name. |
| 60 | hda 0:3 660 >drives/ |
| 61 | This will relocate "hda" into the drives/ subdirectory. |
| 62 | hdb 0:3 660 >cdrom |
| 63 | This will rename "hdb" to "cdrom". |
| 64 | |
Mike Frysinger | ae30210 | 2007-02-14 13:20:29 +0000 | [diff] [blame] | 65 | If you also enable support for executing your own commands, then the file has |
| 66 | the format: |
| 67 | <device regex> <uid>:<gid> <octal permissions> [<@|$|*> <command>] |
| 68 | The special characters have the meaning: |
| 69 | @ Run after creating the device. |
| 70 | $ Run before removing the device. |
| 71 | * Run both after creating and before removing the device. |
| 72 | |
| 73 | The command is executed via the system() function (which means you're giving a |
Mike Frysinger | c348e0b | 2008-02-01 01:41:57 +0000 | [diff] [blame] | 74 | command to the shell), so make sure you have a shell installed at /bin/sh. You |
| 75 | should also keep in mind that the kernel executes hotplug helpers with stdin, |
| 76 | stdout, and stderr connected to /dev/null. |
Mike Frysinger | ae30210 | 2007-02-14 13:20:29 +0000 | [diff] [blame] | 77 | |
| 78 | For your convenience, the shell env var $MDEV is set to the device name. So if |
Mike Frysinger | c348e0b | 2008-02-01 01:41:57 +0000 | [diff] [blame] | 79 | the device "hdc" was matched, MDEV would be set to "hdc". |
Mike Frysinger | ae7f7eb | 2007-06-28 17:13:51 +0000 | [diff] [blame] | 80 | |
| 81 | ---------- |
| 82 | FIRMWARE |
| 83 | ---------- |
| 84 | |
| 85 | Some kernel device drivers need to request firmware at runtime in order to |
| 86 | properly initialize a device. Place all such firmware files into the |
| 87 | /lib/firmware/ directory. At runtime, the kernel will invoke mdev with the |
| 88 | filename of the firmware which mdev will load out of /lib/firmware/ and into |
| 89 | the kernel via the sysfs interface. The exact filename is hardcoded in the |
| 90 | kernel, so look there if you need to want to know what to name the file in |
| 91 | userspace. |