Annotation of /trunk/mkinitrd-magellan/busybox/docs/mdev.txt
Parent Directory | Revision Log
Revision 816 -
(hide annotations)
(download)
Fri Apr 24 18:33:46 2009 UTC (15 years, 1 month ago) by niro
File MIME type: text/plain
File size: 5021 byte(s)
Fri Apr 24 18:33:46 2009 UTC (15 years, 1 month ago) by niro
File MIME type: text/plain
File size: 5021 byte(s)
-updated to busybox-1.13.4
1 | niro | 816 | ------------- |
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 | [0] mount -t proc proc /proc | ||
19 | [1] mount -t sysfs sysfs /sys | ||
20 | [2] echo /bin/mdev > /proc/sys/kernel/hotplug | ||
21 | [3] mdev -s | ||
22 | |||
23 | Alternatively, without procfs the above becomes: | ||
24 | [1] mount -t sysfs sysfs /sys | ||
25 | [2] sysctl -w kernel.hotplug=/bin/mdev | ||
26 | [3] mdev -s | ||
27 | |||
28 | |||
29 | Of course, a more "full" setup would entail executing this before the previous | ||
30 | code snippet: | ||
31 | [4] mount -t tmpfs -o size=64k,mode=0755 tmpfs /dev | ||
32 | [5] mkdir /dev/pts | ||
33 | [6] mount -t devpts devpts /dev/pts | ||
34 | |||
35 | The simple explanation here is that [1] you need to have /sys mounted before | ||
36 | executing mdev. Then you [2] instruct the kernel to execute /bin/mdev whenever | ||
37 | a device is added or removed so that the device node can be created or | ||
38 | destroyed. Then you [3] seed /dev with all the device nodes that were created | ||
39 | while the system was booting. | ||
40 | |||
41 | For the "full" setup, you want to [4] make sure /dev is a tmpfs filesystem | ||
42 | (assuming you're running out of flash). Then you want to [5] create the | ||
43 | /dev/pts mount point and finally [6] mount the devpts filesystem on it. | ||
44 | |||
45 | ------------- | ||
46 | MDEV Config (/etc/mdev.conf) | ||
47 | ------------- | ||
48 | |||
49 | Mdev has an optional config file for controlling ownership/permissions of | ||
50 | device nodes if your system needs something more than the default root/root | ||
51 | 660 permissions. | ||
52 | |||
53 | The file has the format: | ||
54 | <device regex> <uid>:<gid> <octal permissions> | ||
55 | or @<maj[,min1[-min2]]> <uid>:<gid> <octal permissions> | ||
56 | |||
57 | For example: | ||
58 | hd[a-z][0-9]* 0:3 660 | ||
59 | |||
60 | The config file parsing stops at the first matching line. If no line is | ||
61 | matched, then the default of 0:0 660 is used. To set your own default, simply | ||
62 | create your own total match like so: | ||
63 | .* 1:1 777 | ||
64 | |||
65 | You can rename/move device nodes by using the next optional field. | ||
66 | <device regex> <uid>:<gid> <octal permissions> [=path] | ||
67 | So if you want to place the device node into a subdirectory, make sure the path | ||
68 | has a trailing /. If you want to rename the device node, just place the name. | ||
69 | hda 0:3 660 =drives/ | ||
70 | This will move "hda" into the drives/ subdirectory. | ||
71 | hdb 0:3 660 =cdrom | ||
72 | This will rename "hdb" to "cdrom". | ||
73 | |||
74 | Similarly, ">path" renames/moves the device but it also creates | ||
75 | a direct symlink /dev/DEVNAME to the renamed/moved device. | ||
76 | |||
77 | If you also enable support for executing your own commands, then the file has | ||
78 | the format: | ||
79 | <device regex> <uid>:<gid> <octal permissions> [=path] [@|$|*<command>] | ||
80 | or | ||
81 | <device regex> <uid>:<gid> <octal permissions> [>path] [@|$|*<command>] | ||
82 | The special characters have the meaning: | ||
83 | @ Run after creating the device. | ||
84 | $ Run before removing the device. | ||
85 | * Run both after creating and before removing the device. | ||
86 | |||
87 | The command is executed via the system() function (which means you're giving a | ||
88 | command to the shell), so make sure you have a shell installed at /bin/sh. You | ||
89 | should also keep in mind that the kernel executes hotplug helpers with stdin, | ||
90 | stdout, and stderr connected to /dev/null. | ||
91 | |||
92 | For your convenience, the shell env var $MDEV is set to the device name. So if | ||
93 | the device "hdc" was matched, MDEV would be set to "hdc". | ||
94 | |||
95 | ---------- | ||
96 | FIRMWARE | ||
97 | ---------- | ||
98 | |||
99 | Some kernel device drivers need to request firmware at runtime in order to | ||
100 | properly initialize a device. Place all such firmware files into the | ||
101 | /lib/firmware/ directory. At runtime, the kernel will invoke mdev with the | ||
102 | filename of the firmware which mdev will load out of /lib/firmware/ and into | ||
103 | the kernel via the sysfs interface. The exact filename is hardcoded in the | ||
104 | kernel, so look there if you need to know how to name the file in userspace. | ||
105 | |||
106 | ------------ | ||
107 | SEQUENCING | ||
108 | ------------ | ||
109 | |||
110 | Kernel does not serialize hotplug events. It increments SEQNUM environmental | ||
111 | variable for each successive hotplug invocation. Normally, mdev doesn't care. | ||
112 | This may reorder hotplug and hot-unplug events, with typical symptoms of | ||
113 | device nodes sometimes not created as expected. | ||
114 | |||
115 | However, if /dev/mdev.seq file is found, mdev will compare its | ||
116 | contents with SEQNUM. It will retry up to two seconds, waiting for them | ||
117 | to match. If they match exactly (not even trailing '\n' is allowed), | ||
118 | or if two seconds pass, mdev runs as usual, then it rewrites /dev/mdev.seq | ||
119 | with SEQNUM+1. | ||
120 | |||
121 | IOW: this will serialize concurrent mdev invocations. | ||
122 | |||
123 | If you want to activate this feature, execute "echo >/dev/mdev.seq" prior to | ||
124 | setting mdev to be the hotplug handler. This writes single '\n' to the file. | ||
125 | NB: mdev recognizes /dev/mdev.seq consisting of single '\n' characher | ||
126 | as a special case. IOW: this will not make your first hotplug event | ||
127 | to stall for two seconds. |