README
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:69k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. Devfs (Device File System) FAQ
  2. Linux Devfs (Device File System) FAQ
  3. Richard Gooch
  4. 21-JUL-2002
  5. Document languages:
  6. -----------------------------------------------------------------------------
  7. NOTE: the master copy of this document is available online at:
  8. http://www.atnf.csiro.au/~rgooch/linux/docs/devfs.html
  9. and looks much better than the text version distributed with the
  10. kernel sources. A mirror site is available at:
  11. http://www.ras.ucalgary.ca/~rgooch/linux/docs/devfs.html
  12. There is also an optional daemon that may be used with devfs. You can
  13. find out more about it at:
  14. http://www.atnf.csiro.au/~rgooch/linux/
  15. A mailing list is available which you may subscribe to. Send
  16. email
  17. to majordomo@oss.sgi.com with the following line in the
  18. body of the message:
  19. subscribe devfs
  20. To unsubscribe, send the message body:
  21. unsubscribe devfs
  22. instead. The list is archived at
  23. http://oss.sgi.com/projects/devfs/archive/.
  24. -----------------------------------------------------------------------------
  25. Contents
  26. What is it?
  27. Why do it?
  28. Who else does it?
  29. How it works
  30. Operational issues (essential reading)
  31. Instructions for the impatient
  32. Permissions persistence accross reboots
  33. Dealing with drivers without devfs support
  34. All the way with Devfs
  35. Other Issues
  36. Kernel Naming Scheme
  37. Devfsd Naming Scheme
  38. Old Compatibility Names
  39. SCSI Host Probing Issues
  40. Device drivers currently ported
  41. Allocation of Device Numbers
  42. Questions and Answers
  43. Making things work
  44. Alternatives to devfs
  45. What I don't like about devfs
  46. How to report bugs
  47. Strange kernel messages
  48. Compilation problems with devfsd
  49. Other resources
  50. Translations of this document
  51. -----------------------------------------------------------------------------
  52. What is it?
  53. Devfs is an alternative to "real" character and block special devices
  54. on your root filesystem. Kernel device drivers can register devices by
  55. name rather than major and minor numbers. These devices will appear in
  56. devfs automatically, with whatever default ownership and
  57. protection the driver specified. A daemon (devfsd) can be used to
  58. override these defaults. Devfs has been in the kernel since 2.3.46.
  59. NOTE that devfs is entirely optional. If you prefer the old
  60. disc-based device nodes, then simply leave CONFIG_DEVFS_FS=n (the
  61. default). In this case, nothing will change.  ALSO NOTE that if you do
  62. enable devfs, the defaults are such that full compatibility is
  63. maintained with the old devices names.
  64. There are two aspects to devfs: one is the underlying device
  65. namespace, which is a namespace just like any mounted filesystem. The
  66. other aspect is the filesystem code which provides a view of the
  67. device namespace. The reason I make a distinction is because devfs
  68. can be mounted many times, with each mount showing the same device
  69. namespace. Changes made are global to all mounted devfs filesystems.
  70. Also, because the devfs namespace exists without any devfs mounts, you
  71. can easily mount the root filesystem by referring to an entry in the
  72. devfs namespace.
  73. The cost of devfs is a small increase in kernel code size and memory
  74. usage. About 7 pages of code (some of that in __init sections) and 72
  75. bytes for each entry in the namespace. A modest system has only a
  76. couple of hundred device entries, so this costs a few more
  77. pages. Compare this with the suggestion to put /dev on a <a
  78. href="#why-faq-ramdisc">ramdisc.
  79. On a typical machine, the cost is under 0.2 percent. On a modest
  80. system with 64 MBytes of RAM, the cost is under 0.1 percent.  The
  81. accusations of "bloatware" levelled at devfs are not justified.
  82. -----------------------------------------------------------------------------
  83. Why do it?
  84. There are several problems that devfs addresses. Some of these
  85. problems are more serious than others (depending on your point of
  86. view), and some can be solved without devfs. However, the totality of
  87. these problems really calls out for devfs.
  88. The choice is a patchwork of inefficient user space solutions, which
  89. are complex and likely to be fragile, or to use a simple and efficient
  90. devfs which is robust.
  91. There have been many counter-proposals to devfs, all seeking to
  92. provide some of the benefits without actually implementing devfs. So
  93. far there has been an absence of code and no proposed alternative has
  94. been able to provide all the features that devfs does. Further,
  95. alternative proposals require far more complexity in user-space (and
  96. still deliver less functionality than devfs). Some people have the
  97. mantra of reducing "kernel bloat", but don't consider the effects on
  98. user-space.
  99. A good solution limits the total complexity of kernel-space and
  100. user-space.
  101. Major&minor allocation
  102. The existing scheme requires the allocation of major and minor device
  103. numbers for each and every device. This means that a central
  104. co-ordinating authority is required to issue these device numbers
  105. (unless you're developing a "private" device driver), in order to
  106. preserve uniqueness. Devfs shifts the burden to a namespace. This may
  107. not seem like a huge benefit, but actually it is. Since driver authors
  108. will naturally choose a device name which reflects the functionality
  109. of the device, there is far less potential for namespace conflict.
  110. Solving this requires a kernel change.
  111. /dev management
  112. Because you currently access devices through device nodes, these must
  113. be created by the system administrator. For standard devices you can
  114. usually find a MAKEDEV programme which creates all these (hundreds!)
  115. of nodes. This means that changes in the kernel must be reflected by
  116. changes in the MAKEDEV programme, or else the system administrator
  117. creates device nodes by hand.
  118. The basic problem is that there are two separate databases of
  119. major and minor numbers. One is in the kernel and one is in /dev (or
  120. in a MAKEDEV programme, if you want to look at it that way). This is
  121. duplication of information, which is not good practice.
  122. Solving this requires a kernel change.
  123. /dev growth
  124. A typical /dev has over 1200 nodes! Most of these devices simply don't
  125. exist because the hardware is not available. A huge /dev increases the
  126. time to access devices (I'm just referring to the dentry lookup times
  127. and the time taken to read inodes off disc: the next subsection shows
  128. some more horrors).
  129. An example of how big /dev can grow is if we consider SCSI devices:
  130. host           6  bits  (say up to 64 hosts on a really big machine)
  131. channel        4  bits  (say up to 16 SCSI buses per host)
  132. id             4  bits
  133. lun            3  bits
  134. partition      6  bits
  135. TOTAL          23 bits
  136. This requires 8 Mega (1024*1024) inodes if we want to store all
  137. possible device nodes. Even if we scrap everything but id,partition
  138. and assume a single host adapter with a single SCSI bus and only one
  139. logical unit per SCSI target (id), that's still 10 bits or 1024
  140. inodes. Each VFS inode takes around 256 bytes (kernel 2.1.78), so
  141. that's 256 kBytes of inode storage on disc (assuming real inodes take
  142. a similar amount of space as VFS inodes). This is actually not so bad,
  143. because disc is cheap these days. Embedded systems would care about
  144. 256 kBytes of /dev inodes, but you could argue that embedded systems
  145. would have hand-tuned /dev directories. I've had to do just that on my
  146. embedded systems, but I would rather just leave it to devfs.
  147. Another issue is the time taken to lookup an inode when first
  148. referenced. Not only does this take time in scanning through a list in
  149. memory, but also the seek times to read the inodes off disc.
  150. This could be solved in user-space using a clever programme which
  151. scanned the kernel logs and deleted /dev entries which are not
  152. available and created them when they were available. This programme
  153. would need to be run every time a new module was loaded, which would
  154. slow things down a lot.
  155. There is an existing programme called scsidev which will automatically
  156. create device nodes for SCSI devices. It can do this by scanning files
  157. in /proc/scsi. Unfortunately, to extend this idea to other device
  158. nodes would require significant modifications to existing drivers (so
  159. they too would provide information in /proc). This is a non-trivial
  160. change (I should know: devfs has had to do something similar). Once
  161. you go to this much effort, you may as well use devfs itself (which
  162. also provides this information).  Furthermore, such a system would
  163. likely be implemented in an ad-hoc fashion, as different drivers will
  164. provide their information in different ways.
  165. Devfs is much cleaner, because it (naturally) has a uniform mechanism
  166. to provide this information: the device nodes themselves!
  167. Node to driver file_operations translation
  168. There is an important difference between the way disc-based character
  169. and block nodes and devfs entries make the connection between an entry
  170. in /dev and the actual device driver.
  171. With the current 8 bit major and minor numbers the connection between
  172. disc-based c&b nodes and per-major drivers is done through a
  173. fixed-length table of 128 entries. The various filesystem types set
  174. the inode operations for c&b nodes to {chr,blk}dev_inode_operations,
  175. so when a device is opened a few quick levels of indirection bring us
  176. to the driver file_operations.
  177. For miscellaneous character devices a second step is required: there
  178. is a scan for the driver entry with the same minor number as the file
  179. that was opened, and the appropriate minor open method is called. This
  180. scanning is done *every time* you open a device node. Potentially, you
  181. may be searching through dozens of misc. entries before you find your
  182. open method. While not an enormous performance overhead, this does
  183. seem pointless.
  184. Linux *must* move beyond the 8 bit major and minor barrier,
  185. somehow. If we simply increase each to 16 bits, then the indexing
  186. scheme used for major driver lookup becomes untenable, because the
  187. major tables (one each for character and block devices) would need to
  188. be 64 k entries long (512 kBytes on x86, 1 MByte for 64 bit
  189. systems). So we would have to use a scheme like that used for
  190. miscellaneous character devices, which means the search time goes up
  191. linearly with the average number of major device drivers on your
  192. system. Not all "devices" are hardware, some are higher-level drivers
  193. like KGI, so you can get more "devices" without adding hardware
  194. You can improve this by creating an ordered (balanced:-)
  195. binary tree, in which case your search time becomes log(N).
  196. Alternatively, you can use hashing to speed up the search.
  197. But why do that search at all if you don't have to? Once again, it
  198. seems pointless.
  199. Note that devfs doesn't use the major&minor system. For devfs
  200. entries, the connection is done when you lookup the /dev entry. When
  201. devfs_register() is called, an internal table is appended which has
  202. the entry name and the file_operations. If the dentry cache doesn't
  203. have the /dev entry already, this internal table is scanned to get the
  204. file_operations, and an inode is created. If the dentry cache already
  205. has the entry, there is *no lookup time* (other than the dentry scan
  206. itself, but we can't avoid that anyway, and besides Linux dentries
  207. cream other OS's which don't have them:-). Furthermore, the number of
  208. node entries in a devfs is only the number of available device
  209. entries, not the number of *conceivable* entries. Even if you remove
  210. unnecessary entries in a disc-based /dev, the number of conceivable
  211. entries remains the same: you just limit yourself in order to save
  212. space.
  213. Devfs provides a fast connection between a VFS node and the device
  214. driver, in a scalable way.
  215. /dev as a system administration tool
  216. Right now /dev contains a list of conceivable devices, most of which I
  217. don't have. Devfs only shows those devices available on my
  218. system. This means that listing /dev is a handy way of checking what
  219. devices are available.
  220. Major&minor size
  221. Existing major and minor numbers are limited to 8 bits each. This is
  222. now a limiting factor for some drivers, particularly the SCSI disc
  223. driver, which consumes a single major number. Only 16 discs are
  224. supported, and each disc may have only 15 partitions. Maybe this isn't
  225. a problem for you, but some of us are building huge Linux systems with
  226. disc arrays. With devfs an arbitrary pointer can be associated with
  227. each device entry, which can be used to give an effective 32 bit
  228. device identifier (i.e. that's like having a 32 bit minor
  229. number). Since this is private to the kernel, there are no C library
  230. compatibility issues which you would have with increasing major and
  231. minor number sizes. See the section on "Allocation of Device Numbers"
  232. for details on maintaining compatibility with userspace.
  233. Solving this requires a kernel change.
  234. Since writing this, the kernel has been modified so that the SCSI disc
  235. driver has more major numbers allocated to it and now supports up to
  236. 128 discs. Since these major numbers are non-contiguous (a result of
  237. unplanned expansion), the implementation is a little more cumbersome
  238. than originally.
  239. Just like the changes to IPv4 to fix impending limitations in the
  240. address space, people find ways around the limitations. In the long
  241. run, however, solutions like IPv6 or devfs can't be put off forever.
  242. Read-only root filesystem
  243. Having your device nodes on the root filesystem means that you can't
  244. operate properly with a read-only root filesystem. This is because you
  245. want to change ownerships and protections of tty devices. Existing
  246. practice prevents you using a CD-ROM as your root filesystem for a
  247. *real* system. Sure, you can boot off a CD-ROM, but you can't change
  248. tty ownerships, so it's only good for installing.
  249. Also, you can't use a shared NFS root filesystem for a cluster of
  250. discless Linux machines (having tty ownerships changed on a common
  251. /dev is not good). Nor can you embed your root filesystem in a
  252. ROM-FS.
  253. You can get around this by creating a RAMDISC at boot time, making
  254. an ext2 filesystem in it, mounting it somewhere and copying the
  255. contents of /dev into it, then unmounting it and mounting it over
  256. /dev.
  257. A devfs is a cleaner way of solving this.
  258. Non-Unix root filesystem
  259. Non-Unix filesystems (such as NTFS) can't be used for a root
  260. filesystem because they variously don't support character and block
  261. special files or symbolic links. You can't have a separate disc-based
  262. or RAMDISC-based filesystem mounted on /dev because you need device
  263. nodes before you can mount these. Devfs can be mounted without any
  264. device nodes. Devlinks won't work because symlinks aren't supported.
  265. An alternative solution is to use initrd to mount a RAMDISC initial
  266. root filesystem (which is populated with a minimal set of device
  267. nodes), and then construct a new /dev in another RAMDISC, and finally
  268. switch to your non-Unix root filesystem. This requires clever boot
  269. scripts and a fragile and conceptually complex boot procedure.
  270. Devfs solves this in a robust and conceptually simple way.
  271. PTY security
  272. Current pseudo-tty (pty) devices are owned by root and read-writable
  273. by everyone. The user of a pty-pair cannot change
  274. ownership/protections without being suid-root.
  275. This could be solved with a secure user-space daemon which runs as
  276. root and does the actual creation of pty-pairs. Such a daemon would
  277. require modification to *every* programme that wants to use this new
  278. mechanism. It also slows down creation of pty-pairs.
  279. An alternative is to create a new open_pty() syscall which does much
  280. the same thing as the user-space daemon. Once again, this requires
  281. modifications to pty-handling programmes.
  282. The devfs solution allows a device driver to "tag" certain device
  283. files so that when an unopened device is opened, the ownerships are
  284. changed to the current euid and egid of the opening process, and the
  285. protections are changed to the default registered by the driver. When
  286. the device is closed ownership is set back to root and protections are
  287. set back to read-write for everybody. No programme need be changed.
  288. The devpts filesystem provides this auto-ownership feature for Unix98
  289. ptys. It doesn't support old-style pty devices, nor does it have all
  290. the other features of devfs.
  291. Intelligent device management
  292. Devfs implements a simple yet powerful protocol for communication with
  293. a device management daemon (devfsd) which runs in user space. It is
  294. possible to send a message (either synchronously or asynchronously) to
  295. devfsd on any event, such as registration/unregistration of device
  296. entries, opening and closing devices, looking up inodes, scanning
  297. directories and more. This has many possibilities. Some of these are
  298. already implemented. See:
  299. http://www.atnf.csiro.au/~rgooch/linux/
  300. Device entry registration events can be used by devfsd to change
  301. permissions of newly-created device nodes. This is one mechanism to
  302. control device permissions.
  303. Device entry registration/unregistration events can be used to run
  304. programmes or scripts. This can be used to provide automatic mounting
  305. of filesystems when a new block device media is inserted into the
  306. drive.
  307. Asynchronous device open and close events can be used to implement
  308. clever permissions management. For example, the default permissions on
  309. /dev/dsp do not allow everybody to read from the device. This is
  310. sensible, as you don't want some remote user recording what you say at
  311. your console. However, the console user is also prevented from
  312. recording. This behaviour is not desirable. With asynchronous device
  313. open and close events, you can have devfsd run a programme or script
  314. when console devices are opened to change the ownerships for *other*
  315. device nodes (such as /dev/dsp). On closure, you can run a different
  316. script to restore permissions. An advantage of this scheme over
  317. modifying the C library tty handling is that this works even if your
  318. programme crashes (how many times have you seen the utmp database with
  319. lingering entries for non-existent logins?).
  320. Synchronous device open events can be used to perform intelligent
  321. device access protections. Before the device driver open() method is
  322. called, the daemon must first validate the open attempt, by running an
  323. external programme or script. This is far more flexible than access
  324. control lists, as access can be determined on the basis of other
  325. system conditions instead of just the UID and GID.
  326. Inode lookup events can be used to authenticate module autoload
  327. requests. Instead of using kmod directly, the event is sent to
  328. devfsd which can implement an arbitrary authentication before loading
  329. the module itself.
  330. Inode lookup events can also be used to construct arbitrary
  331. namespaces, without having to resort to populating devfs with symlinks
  332. to devices that don't exist.
  333. Speculative Device Scanning
  334. Consider an application (like cdparanoia) that wants to find all
  335. CD-ROM devices on the system (SCSI, IDE and other types), whether or
  336. not their respective modules are loaded. The application must
  337. speculatively open certain device nodes (such as /dev/sr0 for the SCSI
  338. CD-ROMs) in order to make sure the module is loaded. This requires
  339. that all Linux distributions follow the standard device naming scheme
  340. (last time I looked RedHat did things differently). Devfs solves the
  341. naming problem.
  342. The same application also wants to see which devices are actually
  343. available on the system. With the existing system it needs to read the
  344. /dev directory and speculatively open each /dev/sr* device to
  345. determine if the device exists or not. With a large /dev this is an
  346. inefficient operation, especially if there are many /dev/sr* nodes. A
  347. solution like scsidev could reduce the number of /dev/sr* entries (but
  348. of course that also requires all that inefficient directory scanning).
  349. With devfs, the application can open the /dev/sr directory
  350. (which triggers the module autoloading if required), and proceed to
  351. read /dev/sr. Since only the available devices will have
  352. entries, there are no inefficencies in directory scanning or device
  353. openings.
  354. -----------------------------------------------------------------------------
  355. Who else does it?
  356. FreeBSD has a devfs implementation. Solaris and AIX each have a
  357. pseudo-devfs (something akin to scsidev but for all devices, with some
  358. unspecified kernel support). BeOS, Plan9 and QNX also have it. SGI's
  359. IRIX 6.4 and above also have a device filesystem.
  360. While we shouldn't just automatically do something because others do
  361. it, we should not ignore the work of others either. FreeBSD has a lot
  362. of competent people working on it, so their opinion should not be
  363. blithely ignored.
  364. -----------------------------------------------------------------------------
  365. How it works
  366. Registering device entries
  367. For every entry (device node) in a devfs-based /dev a driver must call
  368. devfs_register(). This adds the name of the device entry, the
  369. file_operations structure pointer and a few other things to an
  370. internal table. Device entries may be added and removed at any
  371. time. When a device entry is registered, it automagically appears in
  372. any mounted devfs'.
  373. Inode lookup
  374. When a lookup operation on an entry is performed and if there is no
  375. driver information for that entry devfs will attempt to call
  376. devfsd. If still no driver information can be found then a negative
  377. dentry is yielded and the next stage operation will be called by the
  378. VFS (such as create() or mknod() inode methods). If driver information
  379. can be found, an inode is created (if one does not exist already) and
  380. all is well.
  381. Manually creating device nodes
  382. The mknod() method allows you to create an ordinary named pipe in the
  383. devfs, or you can create a character or block special inode if one
  384. does not already exist. You may wish to create a character or block
  385. special inode so that you can set permissions and ownership. Later, if
  386. a device driver registers an entry with the same name, the
  387. permissions, ownership and times are retained. This is how you can set
  388. the protections on a device even before the driver is loaded. Once you
  389. create an inode it appears in the directory listing.
  390. Unregistering device entries
  391. A device driver calls devfs_unregister() to unregister an entry.
  392. Chroot() gaols
  393. 2.2.x kernels
  394. The semantics of inode creation are different when devfs is mounted
  395. with the "explicit" option. Now, when a device entry is registered, it
  396. will not appear until you use mknod() to create the device. It doesn't
  397. matter if you mknod() before or after the device is registered with
  398. devfs_register(). The purpose of this behaviour is to support
  399. chroot(2) gaols, where you want to mount a minimal devfs inside the
  400. gaol. Only the devices you specifically want to be available (through
  401. your mknod() setup) will be accessible.
  402. 2.4.x kernels
  403. As of kernel 2.3.99, the VFS has had the ability to rebind parts of
  404. the global filesystem namespace into another part of the namespace.
  405. This now works even at the leaf-node level, which means that
  406. individual files and device nodes may be bound into other parts of the
  407. namespace. This is like making links, but better, because it works
  408. across filesystems (unlike hard links) and works through chroot()
  409. gaols (unlike symbolic links).
  410. Because of these improvements to the VFS, the multi-mount capability
  411. in devfs is no longer needed. The administrator may create a minimal
  412. device tree inside a chroot(2) gaol by using VFS bindings. As this
  413. provides most of the features of the devfs multi-mount capability, I
  414. removed the multi-mount support code (after issuing an RFC). This
  415. yielded code size reductions and simplifications.
  416. If you want to construct a minimal chroot() gaol, the following
  417. command should suffice:
  418. mount --bind /dev/null /gaol/dev/null
  419. Repeat for other device nodes you want to expose. Simple!
  420. -----------------------------------------------------------------------------
  421. Operational issues
  422. Instructions for the impatient
  423. Nobody likes reading documentation. People just want to get in there
  424. and play. So this section tells you quickly the steps you need to take
  425. to run with devfs mounted over /dev. Skip these steps and you will end
  426. up with a nearly unbootable system. Subsequent sections describe the
  427. issues in more detail, and discuss non-essential configuration
  428. options.
  429. Devfsd
  430. OK, if you're reading this, I assume you want to play with
  431. devfs. First you should ensure that /usr/src/linux contains a
  432. recent kernel source tree. Then you need to compile devfsd, the device
  433. management daemon, available at
  434. http://www.atnf.csiro.au/~rgooch/linux/.
  435. Because the kernel has a naming scheme
  436. which is quite different from the old naming scheme, you need to
  437. install devfsd so that software and configuration files that use the
  438. old naming scheme will not break.
  439. Compile and install devfsd. You will be provided with a default
  440. configuration file /etc/devfsd.conf which will provide
  441. compatibility symlinks for the old naming scheme. Don't change this
  442. config file unless you know what you're doing. Even if you think you
  443. do know what you're doing, don't change it until you've followed all
  444. the steps below and booted a devfs-enabled system and verified that it
  445. works.
  446. Now edit your main system boot script so that devfsd is started at the
  447. very beginning (before any filesystem
  448. checks). /etc/rc.d/rc.sysinit is often the main boot script
  449. on systems with SysV-style boot scripts. On systems with BSD-style
  450. boot scripts it is often /etc/rc. Also check
  451. /sbin/rc.
  452. NOTE that the line you put into the boot
  453. script should be exactly:
  454. /sbin/devfsd /dev
  455. DO NOT use some special daemon-launching
  456. programme, otherwise the boot script may not wait for devfsd to finish
  457. initialising.
  458. System Libraries
  459. There may still be some problems because of broken software making
  460. assumptions about device names. In particular, some software does not
  461. handle devices which are symbolic links. If you are running a libc 5
  462. based system, install libc 5.4.44 (if you have libc 5.4.46, go back to
  463. libc 5.4.44, which is actually correct). If you are running a glibc
  464. based system, make sure you have glibc 2.1.3 or later.
  465. /etc/securetty
  466. PAM (Pluggable Authentication Modules) is supposed to be a flexible
  467. mechanism for providing better user authentication and access to
  468. services. Unfortunately, it's also fragile, complex and undocumented
  469. (check out RedHat 6.1, and probably other distributions as well). PAM
  470. has problems with symbolic links. Append the following lines to your
  471. /etc/securetty file:
  472. vc/1
  473. vc/2
  474. vc/3
  475. vc/4
  476. vc/5
  477. vc/6
  478. vc/7
  479. vc/8
  480. This will not weaken security. If you have a version of util-linux
  481. earlier than 2.10.h, please upgrade to 2.10.h or later. If you
  482. absolutely cannot upgrade, then also append the following lines to
  483. your /etc/securetty file:
  484. 1
  485. 2
  486. 3
  487. 4
  488. 5
  489. 6
  490. 7
  491. 8
  492. This may potentially weaken security by allowing root logins over the
  493. network (a password is still required, though). However, since there
  494. are problems with dealing with symlinks, I'm suspicious of the level
  495. of security offered in any case.
  496. XFree86
  497. While not essential, it's probably a good idea to upgrade to XFree86
  498. 4.0, as patches went in to make it more devfs-friendly. If you don't,
  499. you'll probably need to apply the following patch to
  500. /etc/security/console.perms so that ordinary users can run
  501. startx. Note that not all distributions have this file (e.g. Debian),
  502. so if it's not present, don't worry about it.
  503. --- /etc/security/console.perms.orig    Sat Apr 17 16:26:47 1999 
  504. +++ /etc/security/console.perms Fri Feb 25 23:53:55 2000 
  505. @@ -14,7 +14,7 @@ 
  506.  # man 5 console.perms 
  507.  # file classes -- these are regular expressions 
  508. -<console>=tty[0-9][0-9]* :[0-9].[0-9] :[0-9] 
  509. +<console>=tty[0-9][0-9]* vc/[0-9][0-9]* :[0-9].[0-9] :[0-9] 
  510.  # device classes -- these are shell-style globs 
  511.  <floppy>=/dev/fd[0-1]* 
  512. If the patch does not apply, then change the line:
  513. <console>=tty[0-9][0-9]* :[0-9].[0-9] :[0-9]
  514. with:
  515. <console>=tty[0-9][0-9]* vc/[0-9][0-9]* :[0-9].[0-9] :[0-9]
  516. Disable devpts
  517. I've had a report of devpts mounted on /dev/pts not working
  518. correctly. Since devfs will also manage /dev/pts, there is no
  519. need to mount devpts as well. You should either edit your
  520. /etc/fstab so devpts is not mounted, or disable devpts from
  521. your kernel configuration.
  522. Unsupported drivers
  523. Not all drivers have devfs support. If you depend on one of these
  524. drivers, you will need to create a script or tarfile that you can use
  525. at boot time to create device nodes as appropriate. There is a
  526. section which describes this. Another
  527. section lists the drivers which have
  528. devfs support.
  529. /dev/mouse
  530. Many disributions configure /dev/mouse to be the mouse device
  531. for XFree86 and GPM. I actually think this is a bad idea, because it
  532. adds another level of indirection. When looking at a config file, if
  533. you see /dev/mouse you're left wondering which mouse
  534. is being referred to. Hence I recommend putting the actual mouse
  535. device (for example /dev/psaux) into your
  536. /etc/X11/XF86Config file (and similarly for the GPM
  537. configuration file).
  538. Alternatively, use the same technique used for unsupported drivers
  539. described above.
  540. The Kernel
  541. Finally, you need to make sure devfs is compiled into your kernel. Set
  542. CONFIG_EXPERIMENTAL=y, CONFIG_DEVFS_FS=y and CONFIG_DEVFS_MOUNT=y by
  543. using favourite configuration tool (i.e. make config or
  544. make xconfig) and then make dep; make clean and then
  545. recompile your kernel and modules. At boot, devfs will be mounted onto
  546. /dev.
  547. If you encounter problems booting (for example if you forgot a
  548. configuration step), you can pass devfs=nomount at the kernel
  549. boot command line. This will prevent the kernel from mounting devfs at
  550. boot time onto /dev.
  551. In general, a kernel built with CONFIG_DEVFS_FS=y but without mounting
  552. devfs onto /dev is completely safe, and requires no
  553. configuration changes. One exception to take note of is when
  554. LABEL= directives are used in /etc/fstab. In this
  555. case you will be unable to boot properly. This is because the
  556. mount(8) programme uses /proc/partitions as part of
  557. the volume label search process, and the device names it finds are not
  558. available, because setting CONFIG_DEVFS_FS=y changes the names in
  559. /proc/partitions, irrespective of whether devfs is mounted.
  560. Now you've finished all the steps required. You're now ready to boot
  561. your shiny new kernel. Enjoy.
  562. Changing the configuration
  563. OK, you've now booted a devfs-enabled system, and everything works.
  564. Now you may feel like changing the configuration (common targets are
  565. /etc/fstab and /etc/devfsd.conf). Since you have a
  566. system that works, if you make any changes and it doesn't work, you
  567. now know that you only have to restore your configuration files to the
  568. default and it will work again.
  569. Permissions persistence across reboots
  570. If you don't use mknod(2) to create a device file, nor use chmod(2) or
  571. chown(2) to change the ownerships/permissions, the inode ctime will
  572. remain at 0 (the epoch, 12 am, 1-JAN-1970, GMT). Anything with a ctime
  573. later than this has had it's ownership/permissions changed. Hence, a
  574. simple script or programme may be used to tar up all changed inodes,
  575. prior to shutdown. Although effective, many consider this approach a
  576. kludge.
  577. A much better approach is to use devfsd to save and restore
  578. permissions. It may be configured to record changes in permissions and
  579. will save them in a database (in fact a directory tree), and restore
  580. these upon boot. This is an efficient method and results in immediate
  581. saving of current permissions (unlike the tar approach, which saves
  582. permissions at some unspecified future time).
  583. The default configuration file supplied with devfsd has config entries
  584. which you may uncomment to enable persistence management.
  585. If you decide to use the tar approach anyway, be aware that tar will
  586. first unlink(2) an inode before creating a new device node. The
  587. unlink(2) has the effect of breaking the connection between a devfs
  588. entry and the device driver. If you use the "devfs=only" boot option,
  589. you lose access to the device driver, requiring you to reload the
  590. module. I consider this a bug in tar (there is no real need to
  591. unlink(2) the inode first).
  592. Alternatively, you can use devfsd to provide more sophisticated
  593. management of device permissions. You can use devfsd to store
  594. permissions for whole groups of devices with a single configuration
  595. entry, rather than the conventional single entry per device entry.
  596. Permissions database stored in mounted-over /dev
  597. If you wish to save and restore your device permissions into the
  598. disc-based /dev while still mounting devfs onto /dev
  599. you may do so. This requires a 2.4.x kernel (in fact, 2.3.99 or
  600. later), which has the VFS binding facility. You need to do the
  601. following to set this up:
  602. make sure the kernel does not mount devfs at boot time
  603. make sure you have a correct /dev/console entry in your
  604. root file-system (where your disc-based /dev lives)
  605. create the /dev-state directory
  606. add the following lines near the very beginning of your boot
  607. scripts:
  608. mount --bind /dev /dev-state
  609. mount -t devfs none /dev
  610. devfsd /dev
  611. add the following lines to your /etc/devfsd.conf file:
  612. REGISTER ^pt[sy] IGNORE
  613. CREATE ^pt[sy] IGNORE
  614. CHANGE ^pt[sy] IGNORE
  615. DELETE ^pt[sy] IGNORE
  616. REGISTER .* COPY /dev-state/$devname $devpath
  617. CREATE .* COPY $devpath /dev-state/$devname
  618. CHANGE .* COPY $devpath /dev-state/$devname
  619. DELETE .* CFUNCTION GLOBAL unlink /dev-state/$devname
  620. RESTORE /dev-state
  621. Note that the sample devfsd.conf file contains these lines,
  622. as well as other sample configurations you may find useful. See the
  623. devfsd distribution
  624. reboot.
  625. Permissions database stored in normal directory
  626. If you are using an older kernel which doesn't support VFS binding,
  627. then you won't be able to have the permissions database in a
  628. mounted-over /dev. However, you can still use a regular
  629. directory to store the database. The sample /etc/devfsd.conf
  630. file above may still be used. You will need to create the
  631. /dev-state directory prior to installing devfsd. If you have
  632. old permissions in /dev, then just copy (or move) the device
  633. nodes over to the new directory.
  634. Which method is better?
  635. The best method is to have the permissions database stored in the
  636. mounted-over /dev. This is because you will not need to copy
  637. device nodes over to /dev-state, and because it allows you to
  638. switch between devfs and non-devfs kernels, without requiring you to
  639. copy permissions between /dev-state (for devfs) and
  640. /dev (for non-devfs).
  641. Dealing with drivers without devfs support
  642. Currently, not all device drivers in the kernel have been modified to
  643. use devfs. Device drivers which do not yet have devfs support will not
  644. automagically appear in devfs. The simplest way to create device nodes
  645. for these drivers is to unpack a tarfile containing the required
  646. device nodes. You can do this in your boot scripts. All your drivers
  647. will now work as before.
  648. Hopefully for most people devfs will have enough support so that they
  649. can mount devfs directly over /dev without losing most functionality
  650. (i.e. losing access to various devices). As of 22-JAN-1998 (devfs
  651. patch version 10) I am now running this way. All the devices I have
  652. are available in devfs, so I don't lose anything.
  653. WARNING: if your configuration requires the old-style device names
  654. (i.e. /dev/hda1 or /dev/sda1), you must install devfsd and configure
  655. it to maintain compatibility entries. It is almost certain that you
  656. will require this. Note that the kernel creates a compatibility entry
  657. for the root device, so you don't need initrd.
  658. Note that you no longer need to mount devpts if you use Unix98 PTYs,
  659. as devfs can manage /dev/pts itself. This saves you some RAM, as you
  660. don't need to compile and install devpts. Note that some versions of
  661. glibc have a bug with Unix98 pty handling on devfs systems. Contact
  662. the glibc maintainers for a fix. Glibc 2.1.3 has the fix.
  663. Note also that apart from editing /etc/fstab, other things will need
  664. to be changed if you *don't* install devfsd. Some software (like the X
  665. server) hard-wire device names in their source. It really is much
  666. easier to install devfsd so that compatibility entries are created.
  667. You can then slowly migrate your system to using the new device names
  668. (for example, by starting with /etc/fstab), and then limiting the
  669. compatibility entries that devfsd creates.
  670. IF YOU CONFIGURE TO MOUNT DEVFS AT BOOT, MAKE SURE YOU INSTALL DEVFSD
  671. BEFORE YOU BOOT A DEVFS-ENABLED KERNEL!
  672. Now that devfs has gone into the 2.3.46 kernel, I'm getting a lot of
  673. reports back. Many of these are because people are trying to run
  674. without devfsd, and hence some things break. Please just run devfsd if
  675. things break. I want to concentrate on real bugs rather than
  676. misconfiguration problems at the moment. If people are willing to fix
  677. bugs/false assumptions in other code (i.e. glibc, X server) and submit
  678. that to the respective maintainers, that would be great.
  679. All the way with Devfs
  680. The devfs kernel patch creates a rationalised device tree. As stated
  681. above, if you want to keep using the old /dev naming scheme,
  682. you just need to configure devfsd appopriately (see the man
  683. page). People who prefer the old names can ignore this section. For
  684. those of us who like the rationalised names and an uncluttered
  685. /dev, read on.
  686. If you don't run devfsd, or don't enable compatibility entry
  687. management, then you will have to configure your system to use the new
  688. names. For example, you will then need to edit your
  689. /etc/fstab to use the new disc naming scheme. If you want to
  690. be able to boot non-devfs kernels, you will need compatibility
  691. symlinks in the underlying disc-based /dev pointing back to
  692. the old-style names for when you boot a kernel without devfs.
  693. You can selectively decide which devices you want compatibility
  694. entries for. For example, you may only want compatibility entries for
  695. BSD pseudo-terminal devices (otherwise you'll have to patch you C
  696. library or use Unix98 ptys instead). It's just a matter of putting in
  697. the correct regular expression into /dev/devfsd.conf.
  698. There are other choices of naming schemes that you may prefer. For
  699. example, I don't use the kernel-supplied
  700. names, because they are too verbose. A common misconception is
  701. that the kernel-supplied names are meant to be used directly in
  702. configuration files. This is not the case. They are designed to
  703. reflect the layout of the devices attached and to provide easy
  704. classification.
  705. If you like the kernel-supplied names, that's fine. If you don't then
  706. you should be using devfsd to construct a namespace more to your
  707. liking. Devfsd has built-in code to construct a
  708. namespace that is both logical and easy to
  709. manage. In essence, it creates a convenient abbreviation of the
  710. kernel-supplied namespace.
  711. You are of course free to build your own namespace. Devfsd has all the
  712. infrastructure required to make this easy for you. All you need do is
  713. write a script. You can even write some C code and devfsd can load the
  714. shared object as a callable extension.
  715. Other Issues
  716. The init programme
  717. Another thing to take note of is whether your init programme
  718. creates a Unix socket /dev/telinit. Some versions of init
  719. create /dev/telinit so that the telinit programme can
  720. communicate with the init process. If you have such a system you need
  721. to make sure that devfs is mounted over /dev *before* init
  722. starts. In other words, you can't leave the mounting of devfs to
  723. /etc/rc, since this is executed after init. Other
  724. versions of init require a named pipe /dev/initctl
  725. which must exist *before* init starts. Once again, you need to
  726. mount devfs and then create the named pipe *before* init
  727. starts.
  728. The default behaviour now is not to mount devfs onto /dev at
  729. boot time for 2.3.x and later kernels. You can correct this with the
  730. "devfs=mount" boot option. This solves any problems with init,
  731. and also prevents the dreaded:
  732. Cannot open initial console
  733. message. For 2.2.x kernels where you need to apply the devfs patch,
  734. the default is to mount.
  735. If you have automatic mounting of devfs onto /dev then you
  736. may need to create /dev/initctl in your boot scripts. The
  737. following lines should suffice:
  738. mknod /dev/initctl p
  739. kill -SIGUSR1 1       # tell init that /dev/initctl now exists
  740. Alternatively, if you don't want the kernel to mount devfs onto
  741. /dev then you could use the following procedure is a
  742. guideline for how to get around /dev/initctl problems:
  743. # cd /sbin
  744. # mv init init.real
  745. # cat > init
  746. #! /bin/sh
  747. mount -n -t devfs none /dev
  748. mknod /dev/initctl p
  749. exec /sbin/init.real $*
  750. [control-D]
  751. # chmod a+x init
  752. Note that newer versions of init create /dev/initctl
  753. automatically, so you don't have to worry about this.
  754. Module autoloading
  755. You will need to configure devfsd to enable module
  756. autoloading. The following lines should be placed in your
  757. /etc/devfsd.conf file:
  758. LOOKUP .* MODLOAD
  759. As of devfsd-v1.3.10, a generic /etc/modules.devfs
  760. configuration file is installed, which is used by the MODLOAD
  761. action. This should be sufficient for most configurations. If you
  762. require further configuration, edit your /etc/modules.conf
  763. file. The way module autoloading work with devfs is:
  764. a process attempts to lookup a device node (e.g. /dev/fred)
  765. if that device node does not exist, the full pathname is passed to
  766. devfsd as a string
  767. devfsd will pass the string to the modprobe programme (provided the
  768. configuration line shown above is present), and specifies that
  769. /etc/modules.devfs is the configuration file
  770. /etc/modules.devfs includes /etc/modules.conf to
  771. access local configurations
  772. modprobe will search it's configuration files, looking for an alias
  773. that translates the pathname into a module name
  774. the translated pathname is then used to load the module.
  775. If you wanted a lookup of /dev/fred to load the
  776. mymod module, you would require the following configuration
  777. line in /etc/modules.conf:
  778. alias    /dev/fred    mymod
  779. The /etc/modules.devfs configuration file provides many such
  780. aliases for standard device names. If you look closely at this file,
  781. you will note that some modules require multiple alias configuration
  782. lines. This is required to support module autoloading for old and new
  783. device names.
  784. Mounting root off a devfs device
  785. If you wish to mount root off a devfs device when you pass the
  786. "devfs=only" boot option, then you need to pass in the
  787. "root=<device>" option to the kernel when booting. If you use
  788. LILO, then you must have this in lilo.conf:
  789. append = "root=<device>"
  790. Surprised? Yep, so was I. It turns out if you have (as most people
  791. do):
  792. root = <device>
  793. then LILO will determine the device number of <device> and will
  794. write that device number into a special place in the kernel image
  795. before starting the kernel, and the kernel will use that device number
  796. to mount the root filesystem. So, using the "append" variety ensures
  797. that LILO passes the root filesystem device as a string, which devfs
  798. can then use.
  799. Note that this isn't an issue if you don't pass "devfs=only".
  800. TTY issues
  801. The ttyname(3) function in some versions of the C library makes
  802. false assumptions about device entries which are symbolic links.  The
  803. tty(1) programme is one that depends on this function.  I've
  804. written a patch to libc 5.4.43 which fixes this. This has been
  805. included in libc 5.4.44 and a similar fix is in glibc 2.1.3.
  806. Kernel Naming Scheme
  807. The kernel provides a default naming scheme. This scheme is designed
  808. to make it easy to search for specific devices or device types, and to
  809. view the available devices. Some device types (such as hard discs),
  810. have a directory of entries, making it easy to see what devices of
  811. that class are available. Often, the entries are symbolic links into a
  812. directory tree that reflects the topology of available devices. The
  813. topological tree is useful for finding how your devices are arranged.
  814. Below is a list of the naming schemes for the most common drivers. A
  815. list of reserved device names is
  816. available for reference. Please send email to
  817. rgooch@atnf.csiro.au to obtain an allocation. Please be
  818. patient (the maintainer is busy). An alternative name may be allocated
  819. instead of the requested name, at the discretion of the maintainer.
  820. Disc Devices
  821. All discs, whether SCSI, IDE or whatever, are placed under the
  822. /dev/discs hierarchy:
  823. /dev/discs/disc0 first disc
  824. /dev/discs/disc1 second disc
  825. Each of these entries is a symbolic link to the directory for that
  826. device. The device directory contains:
  827. disc for the whole disc
  828. part* for individual partitions
  829. CD-ROM Devices
  830. All CD-ROMs, whether SCSI, IDE or whatever, are placed under the
  831. /dev/cdroms hierarchy:
  832. /dev/cdroms/cdrom0 first CD-ROM
  833. /dev/cdroms/cdrom1 second CD-ROM
  834. Each of these entries is a symbolic link to the real device entry for
  835. that device.
  836. Tape Devices
  837. All tapes, whether SCSI, IDE or whatever, are placed under the
  838. /dev/tapes hierarchy:
  839. /dev/tapes/tape0 first tape
  840. /dev/tapes/tape1 second tape
  841. Each of these entries is a symbolic link to the directory for that
  842. device. The device directory contains:
  843. mt for mode 0
  844. mtl for mode 1
  845. mtm for mode 2
  846. mta for mode 3
  847. mtn for mode 0, no rewind
  848. mtln for mode 1, no rewind
  849. mtmn for mode 2, no rewind
  850. mtan for mode 3, no rewind
  851. SCSI Devices
  852. To uniquely identify any SCSI device requires the following
  853. information:
  854.   controller (host adapter)
  855.   bus (SCSI channel)
  856.   target (SCSI ID)
  857.   unit (Logical Unit Number)
  858. All SCSI devices are placed under /dev/scsi (assuming devfs
  859. is mounted on /dev). Hence, a SCSI device with the following
  860. parameters: c=1,b=2,t=3,u=4 would appear as:
  861. /dev/scsi/host1/bus2/target3/lun4 device directory
  862. Inside this directory, a number of device entries may be created,
  863. depending on which SCSI device-type drivers were installed.
  864. See the section on the disc naming scheme to see what entries the SCSI
  865. disc driver creates.
  866. See the section on the tape naming scheme to see what entries the SCSI
  867. tape driver creates.
  868. The SCSI CD-ROM driver creates:
  869. cd
  870. The SCSI generic driver creates:
  871. generic
  872. IDE Devices
  873. To uniquely identify any IDE device requires the following
  874. information:
  875.   controller
  876.   bus (aka. primary/secondary)
  877.   target (aka. master/slave)
  878.   unit
  879. All IDE devices are placed under /dev/ide, and uses a similar
  880. naming scheme to the SCSI subsystem.
  881. XT Hard Discs
  882. All XT discs are placed under /dev/xd. The first XT disc has
  883. the directory /dev/xd/disc0.
  884. TTY devices
  885. The tty devices now appear as:
  886.   New name                   Old-name                   Device Type
  887.   --------                   --------                   -----------
  888.   /dev/tts/{0,1,...}         /dev/ttyS{0,1,...}         Serial ports
  889.   /dev/cua/{0,1,...}         /dev/cua{0,1,...}          Call out devices
  890.   /dev/vc/0                  /dev/tty                   Current virtual console
  891.   /dev/vc/{1,2,...}          /dev/tty{1...63}           Virtual consoles
  892.   /dev/vcc/{0,1,...}         /dev/vcs{1...63}           Virtual consoles
  893.   /dev/pty/m{0,1,...}        /dev/ptyp??                PTY masters
  894.   /dev/pty/s{0,1,...}        /dev/ttyp??                PTY slaves
  895. RAMDISCS
  896. The RAMDISCS are placed in their own directory, and are named thus:
  897.   /dev/rd/{0,1,2,...}
  898. Meta Devices
  899. The meta devices are placed in their own directory, and are named
  900. thus:
  901.   /dev/md/{0,1,2,...}
  902. Floppy discs
  903. Floppy discs are placed in the /dev/floppy directory.
  904. Loop devices
  905. Loop devices are placed in the /dev/loop directory.
  906. Sound devices
  907. Sound devices are placed in the /dev/sound directory
  908. (audio, sequencer, ...).
  909. Devfsd Naming Scheme
  910. Devfsd provides a naming scheme which is a convenient abbreviation of
  911. the kernel-supplied namespace. In some
  912. cases, the kernel-supplied naming scheme is quite convenient, so
  913. devfsd does not provide another naming scheme. The convenience names
  914. that devfsd creates are in fact the same names as the original devfs
  915. kernel patch created (before Linus mandated the Big Name
  916. Change). These are referred to as "new compatibility entries".
  917. In order to configure devfsd to create these convenience names, the
  918. following lines should be placed in your /etc/devfsd.conf:
  919. REGISTER .* MKNEWCOMPAT
  920. UNREGISTER .* RMNEWCOMPAT
  921. This will cause devfsd to create (and destroy) symbolic links which
  922. point to the kernel-supplied names.
  923. SCSI Hard Discs
  924. All SCSI discs are placed under /dev/sd (assuming devfs is
  925. mounted on /dev). Hence, a SCSI disc with the following
  926. parameters: c=1,b=2,t=3,u=4 would appear as:
  927. /dev/sd/c1b2t3u4 for the whole disc
  928. /dev/sd/c1b2t3u4p5 for the 5th partition
  929. /dev/sd/c1b2t3u4p5s6 for the 6th slice in the 5th partition
  930. SCSI Tapes
  931. All SCSI tapes are placed under /dev/st. A similar naming
  932. scheme is used as for SCSI discs. A SCSI tape with the
  933. parameters:c=1,b=2,t=3,u=4 would appear as:
  934. /dev/st/c1b2t3u4m0 for mode 0
  935. /dev/st/c1b2t3u4m1 for mode 1
  936. /dev/st/c1b2t3u4m2 for mode 2
  937. /dev/st/c1b2t3u4m3 for mode 3
  938. /dev/st/c1b2t3u4m0n for mode 0, no rewind
  939. /dev/st/c1b2t3u4m1n for mode 1, no rewind
  940. /dev/st/c1b2t3u4m2n for mode 2, no rewind
  941. /dev/st/c1b2t3u4m3n for mode 3, no rewind
  942. SCSI CD-ROMs
  943. All SCSI CD-ROMs are placed under /dev/sr. A similar naming
  944. scheme is used as for SCSI discs. A SCSI CD-ROM with the
  945. parameters:c=1,b=2,t=3,u=4 would appear as:
  946. /dev/sr/c1b2t3u4
  947. SCSI Generic Devices
  948. The generic (aka. raw) interface for all SCSI devices are placed under
  949. /dev/sg. A similar naming scheme is used as for SCSI discs. A
  950. SCSI generic device with the parameters:c=1,b=2,t=3,u=4 would appear
  951. as:
  952. /dev/sg/c1b2t3u4
  953. IDE Hard Discs
  954. All IDE discs are placed under /dev/ide/hd, using a similar
  955. convention to SCSI discs. The following mappings exist between the new
  956. and the old names:
  957. /dev/hda /dev/ide/hd/c0b0t0u0
  958. /dev/hdb /dev/ide/hd/c0b0t1u0
  959. /dev/hdc /dev/ide/hd/c0b1t0u0
  960. /dev/hdd /dev/ide/hd/c0b1t1u0
  961. IDE Tapes
  962. A similar naming scheme is used as for IDE discs. The entries will
  963. appear in the /dev/ide/mt directory.
  964. IDE CD-ROM
  965. A similar naming scheme is used as for IDE discs. The entries will
  966. appear in the /dev/ide/cd directory.
  967. IDE Floppies
  968. A similar naming scheme is used as for IDE discs. The entries will
  969. appear in the /dev/ide/fd directory.
  970. XT Hard Discs
  971. All XT discs are placed under /dev/xd. The first XT disc
  972. would appear as /dev/xd/c0t0.
  973. Old Compatibility Names
  974. The old compatibility names are the legacy device names, such as
  975. /dev/hda, /dev/sda, /dev/rtc and so on.
  976. Devfsd can be configured to create compatibility symlinks so that you
  977. may continue to use the old names in your configuration files and so
  978. that old applications will continue to function correctly.
  979. In order to configure devfsd to create these legacy names, the
  980. following lines should be placed in your /etc/devfsd.conf:
  981. REGISTER .* MKOLDCOMPAT
  982. UNREGISTER .* RMOLDCOMPAT
  983. This will cause devfsd to create (and destroy) symbolic links which
  984. point to the kernel-supplied names.
  985. SCSI Host Probing Issues
  986. Devfs allows you to identify SCSI discs based in part on SCSI host
  987. numbers. If you have only one SCSI host (card) in your computer, then
  988. clearly it will be given host number 0. Life is not always that easy
  989. is you have multiple SCSI hosts. Unfortunately, it can sometimes be
  990. difficult to guess what the probing order of SCSI hosts is. You need
  991. to know the probe order before you can use device names. To make this
  992. easy, there is a kernel boot parameter called "scsihosts". This allows
  993. you to specify the probe order for different types of SCSI hosts. The
  994. syntax of this parameter is:
  995. scsihosts=<name_1>:<name_2>:<name_3>:...:<name_n>
  996. where <name_1>,<name_2>,...,<name_n> are the names
  997. of drivers used in the /proc filesystem. For example:
  998.     scsihosts=aha1542:ppa:aha1542::ncr53c7xx
  999. means that devices connected to
  1000. - first aha1542 controller   - will be /dev/scsi/host0/bus#/target#/lun#
  1001. - first parallel port ZIP    - will be /dev/scsi/host1/bus#/target#/lun#
  1002. - second aha1542 controller  - will be /dev/scsi/host2/bus#/target#/lun#
  1003. - first NCR53C7xx controller - will be /dev/scsi/host4/bus#/target#/lun#
  1004. - any extra controller       - will be /dev/scsi/host5/bus#/target#/lun#,
  1005.                                        /dev/scsi/host6/bus#/target#/lun#, etc
  1006. - if any of above controllers will not be found - the reserved names will
  1007.   not be used by any other device.
  1008. - /dev/scsi/host3/bus#/target#/lun# names will never be used
  1009. You can use ',' instead of ':' as the separator character if you
  1010. wish. I have used the devfsd naming scheme
  1011. here.
  1012. Note that this scheme does not address the SCSI host order if you have
  1013. multiple cards of the same type (such as NCR53c8xx). In this case you
  1014. need to use the driver-specific boot parameters to control this.
  1015. -----------------------------------------------------------------------------
  1016. Device drivers currently ported
  1017. - All miscellaneous character devices support devfs (this is done
  1018.   transparently through misc_register())
  1019. - SCSI discs and generic hard discs
  1020. - Character memory devices (null, zero, full and so on)
  1021.   Thanks to C. Scott Ananian <cananian@alumni.princeton.edu>
  1022. - Loop devices (/dev/loop?)
  1023.  
  1024. - TTY devices (console, serial ports, terminals and pseudo-terminals)
  1025.   Thanks to C. Scott Ananian <cananian@alumni.princeton.edu>
  1026. - SCSI tapes (/dev/scsi and /dev/tapes)
  1027. - SCSI CD-ROMs (/dev/scsi and /dev/cdroms)
  1028. - SCSI generic devices (/dev/scsi)
  1029. - RAMDISCS (/dev/ram?)
  1030. - Meta Devices (/dev/md*)
  1031. - Floppy discs (/dev/floppy)
  1032. - Parallel port printers (/dev/printers)
  1033. - Sound devices (/dev/sound)
  1034.   Thanks to Eric Dumas <dumas@linux.eu.org> and
  1035.   C. Scott Ananian <cananian@alumni.princeton.edu>
  1036. - Joysticks (/dev/joysticks)
  1037. - Sparc keyboard (/dev/kbd)
  1038. - DSP56001 digital signal processor (/dev/dsp56k)
  1039. - Apple Desktop Bus (/dev/adb)
  1040. - Coda network file system (/dev/cfs*)
  1041. - Virtual console capture devices (/dev/vcc)
  1042.   Thanks to Dennis Hou <smilax@mindmeld.yi.org>
  1043. - Frame buffer devices (/dev/fb)
  1044. - Video capture devices (/dev/v4l)
  1045. -----------------------------------------------------------------------------
  1046. Allocation of Device Numbers
  1047. Devfs allows you to write a driver which doesn't need to allocate a
  1048. device number (major&minor numbers) for the internal operation of the
  1049. kernel. However, there are a number of userspace programmes that use
  1050. the device number as a unique handle for a device. An example is the
  1051. find programme, which uses device numbers to determine whether
  1052. an inode is on a different filesystem than another inode. The device
  1053. number used is the one for the block device which a filesystem is
  1054. using. To preserve compatibility with userspace programmes, block
  1055. devices using devfs need to have unique device numbers allocated to
  1056. them. Furthermore, POSIX specifies device numbers, so some kind of
  1057. device number needs to be presented to userspace.
  1058. The simplest option (especially when porting drivers to devfs) is to
  1059. keep using the old major and minor numbers. Devfs will take whatever
  1060. values are given for major&minor and pass them onto userspace.
  1061. Alternatively, you can have devfs choose unique device numbers for
  1062. you. When you register a character or block device using
  1063. devfs_register you can provide the optional
  1064. DEVFS_FL_AUTO_DEVNUM flag, which will then automatically allocate a
  1065. unique device number (the allocation is separated for the character
  1066. and block devices).
  1067. This device number is a 16 bit number, so this leaves plenty of space
  1068. for large numbers of discs and partitions. This scheme can also be
  1069. used for character devices, in particular the tty devices, which are
  1070. currently limited to 256 pseudo-ttys (this limits the total number of
  1071. simultaneous xterms and remote logins).  Note that the device number
  1072. is limited to the range 36864-61439 (majors 144-239), in order to
  1073. avoid any possible conflicts with existing official allocations.
  1074. Please note that using dynamically allocated block device numbers may
  1075. break the NFS daemons (both user and kernel mode), which expect dev_t
  1076. for a given device to be constant over the lifetime of remote mounts.
  1077. A final note on this scheme: since it doesn't increase the size of
  1078. device numbers, there are no compatibility issues with userspace.
  1079. -----------------------------------------------------------------------------
  1080. Questions and Answers
  1081. Making things work
  1082. Alternatives to devfs
  1083. What I don't like about devfs
  1084. How to report bugs
  1085. Strange kernel messages
  1086. Compilation problems with devfsd
  1087. Making things work
  1088. Here are some common questions and answers.
  1089. Devfsd is not managing all my permissions
  1090. Make sure you are capturing the appropriate events. For example,
  1091. device entries created by the kernel generate REGISTER events,
  1092. but those created by devfsd generate CREATE events.
  1093. Devfsd is not capturing all REGISTER events
  1094. See the previous entry: you may need to capture CREATE events.
  1095. X will not start
  1096. Make sure you followed the steps 
  1097. outlined above.
  1098. Why don't my network devices appear in devfs?
  1099. This is not a bug. Network devices have their own, completely separate
  1100. namespace. They are accessed via socket(2) and
  1101. setsockopt(2) calls, and thus require no device nodes. I have
  1102. raised the possibilty of moving network devices into the device
  1103. namespace, but have had no response.
  1104. How can I test if I have devfs compiled into my kernel?
  1105. All filesystems built-in or currently loaded are listed in
  1106. /proc/filesystems. If you see a devfs entry, then
  1107. you know that devfs was compiled into your kernel. If you have
  1108. correctly configured and rebuilt your kernel, then devfs will be
  1109. built-in. If you think you've configured it in, but
  1110. /proc/filesystems doesn't show it, you've made a mistake.
  1111. Common mistakes include:
  1112. Using a 2.2.x kernel without applying the devfs patch (if you
  1113. don't know how to patch your kernel, use 2.4.x instead, don't bother
  1114. asking me how to patch)
  1115. Forgetting to set CONFIG_EXPERIMENTAL=y
  1116. Forgetting to set CONFIG_DEVFS_FS=y
  1117. Forgetting to set CONFIG_DEVFS_MOUNT=y (if you want devfs
  1118. to be automatically mounted at boot)
  1119. Editing your .config manually, instead of using make
  1120. config or make xconfig
  1121. Forgetting to run make dep; make clean after changing the
  1122. configuration and before compiling
  1123. Forgetting to compile your kernel and modules
  1124. Forgetting to install your kernel
  1125. Forgetting to install your modules
  1126. Please check twice that you've done all these steps before sending in
  1127. a bug report.
  1128. How can I test if devfs is mounted on /dev?
  1129. The device filesystem will always create an entry called
  1130. ".devfsd", which is used to communicate with the daemon. Even
  1131. if the daemon is not running, this entry will exist. Testing for the
  1132. existence of this entry is the approved method of determining if devfs
  1133. is mounted or not. Note that the type of entry (i.e. regular file,
  1134. character device, named pipe, etc.) may change without notice. Only
  1135. the existence of the entry should be relied upon.
  1136. When I start devfsd, I see the error:
  1137. Error opening file: ".devfsd"   No such file or directory?
  1138. This means that devfs is not mounted. Make sure you have devfs mounted.
  1139. How do I mount devfs?
  1140. First make sure you have devfs compiled into your kernel (see
  1141. above). Then you will either need to:
  1142. set CONFIG_DEVFS_MOUNT=y in your kernel config
  1143. pass devfs=mount to your boot loader
  1144. mount devfs manually in your boot scripts with:
  1145. mount -t none devfs /dev
  1146. Mount by volume LABEL=<label> doesn't work with
  1147. devfs
  1148. Most probably you are not mounting devfs onto /dev. What
  1149. happens is that if your kernel config has CONFIG_DEVFS_FS=y
  1150. then the contents of /proc/partitions will have the devfs
  1151. names (such as scsi/host0/bus0/target0/lun0/part1). The
  1152. contents of /proc/partitions are used by mount(8) when
  1153. mounting by volume label. If devfs is not mounted on /dev,
  1154. then mount(8) will fail to find devices. The solution is to
  1155. make sure that devfs is mounted on /dev. See above for how to
  1156. do that.
  1157. I have extra or incorrect entries in /dev
  1158. You may have stale entries in your dev-state area. Check for a
  1159. RESTORE configuration line in your devfsd configuration
  1160. (typically /etc/devfsd.conf). If you have this line, check
  1161. the contents of the specified directory for stale entries. Remove
  1162. any entries which are incorrect, then reboot.
  1163. I get "Unable to open initial console" messages at boot
  1164. This usually happens when you don't have devfs automounted onto
  1165. /dev at boot time, and there is no valid
  1166. /dev/console entry on your root file-system. Create a valid
  1167. /dev/console device node.
  1168. Alternatives to devfs
  1169. I've attempted to collate all the anti-devfs proposals and explain
  1170. their limitations. Under construction.
  1171. Why not just pass device create/remove events to a daemon?
  1172. Here the suggestion is to develop an API in the kernel so that devices
  1173. can register create and remove events, and a daemon listens for those
  1174. events. The daemon would then populate/depopulate /dev (which
  1175. resides on disc).
  1176. This has several limitations:
  1177. it only works for modules loaded and unloaded (or devices inserted
  1178. and removed) after the kernel has finished booting. Without a database
  1179. of events, there is no way the daemon could fully populate
  1180. /dev
  1181. if you add a database to this scheme, the question is then how to
  1182. present that database to user-space. If you make it a list of strings
  1183. with embedded event codes which are passed through a pipe to the
  1184. daemon, then this is only of use to the daemon. I would argue that the
  1185. natural way to present this data is via a filesystem (since many of
  1186. the events will be of a hierarchical nature), such as devfs.
  1187. Presenting the data as a filesystem makes it easy for the user to see
  1188. what is available and also makes it easy to write scripts to scan the
  1189. "database"
  1190. the tight binding between device nodes and drivers is no longer
  1191. possible (requiring the otherwise perfectly avoidable
  1192. table lookups)
  1193. you cannot catch inode lookup events on /dev which means
  1194. that module autoloading requires device nodes to be created. This is a
  1195. problem, particularly for drivers where only a few inodes are created
  1196. from a potentially large set
  1197. this technique can't be used when the root FS is mounted
  1198. read-only
  1199. Just implement a better scsidev
  1200. This suggestion involves taking the scsidev programme and
  1201. extending it to scan for all devices, not just SCSI devices. The
  1202. scsidev programme works by scanning /proc/scsi
  1203. Problems:
  1204. the kernel does not currently provide a list of all devices
  1205. available. Not all drivers register entries in /proc or
  1206. generate kernel messages
  1207. there is no uniform mechanism to register devices other than the
  1208. devfs API
  1209. implementing such an API is then the same as the
  1210. proposal above
  1211. Put /dev on a ramdisc
  1212. This suggestion involves creating a ramdisc and populating it with
  1213. device nodes and then mounting it over /dev.
  1214. Problems:
  1215. this doesn't help when mounting the root filesystem, since you
  1216. still need a device node to do that
  1217. if you want to use this technique for the root device node as
  1218. well, you need to use initrd. This complicates the booting sequence
  1219. and makes it significantly harder to administer and configure. The
  1220. initrd is essentially opaque, robbing the system administrator of easy
  1221. configuration
  1222. insufficient information is available to correctly populate the
  1223. ramdisc. So we come back to the
  1224. proposal above to "solve" this
  1225. a ramdisc-based solution would take more kernel memory, since the
  1226. backing store would be (at best) normal VFS inodes and dentries, which
  1227. take 284 bytes and 112 bytes, respectively, for each entry. Compare
  1228. that to 72 bytes for devfs
  1229. Do nothing: there's no problem
  1230. Sometimes people can be heard to claim that the existing scheme is
  1231. fine. This is what they're ignoring:
  1232. device number size (8 bits each for major and minor) is a real
  1233. limitation, and must be fixed somehow. Systems with large numbers of
  1234. SCSI devices, for example, will continue to consume the remaining
  1235. unallocated major numbers. USB will also need to push beyond the 8 bit
  1236. minor limitation
  1237. simply increasing the device number size is insufficient. Apart
  1238. from causing a lot of pain, it doesn't solve the management issues
  1239. of a /dev with thousands or more device nodes
  1240. ignoring the problem of a huge /dev will not make it go
  1241. away, and dismisses the legitimacy of a large number of people who
  1242. want a dynamic /dev
  1243. the standard response then becomes: "write a device management
  1244. daemon", which brings us back to the
  1245. proposal above
  1246. What I don't like about devfs
  1247. Here are some common complaints about devfs, and some suggestions and
  1248. solutions that may make it more palatable for you. I can't please
  1249. everybody, but I do try :-)
  1250. I hate the naming scheme
  1251. First, remember that no naming scheme will please everybody. You hate
  1252. the scheme, others love it. Who's to say who's right and who's wrong?
  1253. Ultimately, the person who writes the code gets to choose, and what
  1254. exists now is a combination of the choices made by the
  1255. devfs author and the
  1256. kernel maintainer (Linus).
  1257. However, not all is lost. If you want to create your own naming
  1258. scheme, it is a simple matter to write a standalone script, hack
  1259. devfsd, or write a script called by devfsd. You can create whatever
  1260. naming scheme you like.
  1261. Further, if you want to remove all traces of the devfs naming scheme
  1262. from /dev, you can mount devfs elsewhere (say
  1263. /devfs) and populate /dev with links into
  1264. /devfs. This population can be automated using devfsd if you
  1265. wish.
  1266. You can even use the VFS binding facility to make the links, rather
  1267. than using symbolic links. This way, you don't even have to see the
  1268. "destination" of these symbolic links.
  1269. Devfs puts policy into the kernel
  1270. There's already policy in the kernel. Device numbers are in fact
  1271. policy (why should the kernel dictate what device numbers I use?).
  1272. Face it, some policy has to be in the kernel. The real difference
  1273. between device names as policy and device numbers as policy is that
  1274. no one will use device numbers directly, because device
  1275. numbers are devoid of meaning to humans and are ugly. At least with
  1276. the devfs device names, (even though you can add your own naming
  1277. scheme) some people will use the devfs-supplied names directly. This
  1278. offends some people :-)
  1279. Devfs is bloatware
  1280. This is not even remotely true. As shown above,
  1281. both code and data size are quite modest.
  1282. How to report bugs
  1283. If you have (or think you have) a bug with devfs, please follow the
  1284. steps below:
  1285. make sure you have enabled debugging output when configuring your
  1286. kernel. You will need to set (at least) the following config options:
  1287. CONFIG_DEVFS_DEBUG=y
  1288. CONFIG_DEBUG_KERNEL=y
  1289. CONFIG_DEBUG_SLAB=y
  1290. please make sure you have the latest devfs patches applied. The
  1291. latest kernel version might not have the latest devfs patches applied
  1292. yet (Linus is very busy)
  1293. save a copy of your complete kernel logs (preferably by
  1294. using the dmesg programme) for later inclusion in your bug
  1295. report. You may need to use the -s switch to increase the
  1296. internal buffer size so you can capture all the boot messages.
  1297. Don't edit or trim the dmesg output
  1298. try booting with devfs=dall passed to the kernel boot
  1299. command line (read the documentation on your bootloader on how to do
  1300. this), and save the result to a file. This may be quite verbose, and
  1301. it may overflow the messages buffer, but try to get as much of it as
  1302. you can
  1303. if you get an Oops, run ksymoops to decode it so that the
  1304. names of the offending functions are provided. A non-decoded Oops is
  1305. pretty useless
  1306. send a copy of your devfsd configuration file(s)
  1307. send the bug report to me first.
  1308. Don't expect that I will see it if you post it to the linux-kernel
  1309. mailing list. Include all the information listed above, plus
  1310. anything else that you think might be relevant. Put the string
  1311. devfs somewhere in the subject line, so my mail filters mark
  1312. it as urgent
  1313. Here is a general guide on how to ask questions in a way that greatly
  1314. improves your chances of getting a reply:
  1315. http://www.tuxedo.org/~esr/faqs/smart-questions.html. If you have
  1316. a bug to report, you should also read
  1317. http://www.chiark.greenend.org.uk/~sgtatham/bugs.html.
  1318. Strange kernel messages
  1319. You may see devfs-related messages in your kernel logs. Below are some
  1320. messages and what they mean (and what you should do about them, if
  1321. anything).
  1322. devfs_register(fred): could not append to parent, err: -17
  1323. You need to check what the error code means, but usually 17 means
  1324. EEXIST. This means that a driver attempted to create an entry
  1325. fred in a directory, but there already was an entry with that
  1326. name. This is often caused by flawed boot scripts which untar a bunch
  1327. of inodes into /dev, as a way to restore permissions. This
  1328. message is harmless, as the device nodes will still
  1329. provide access to the driver (unless you use the devfs=only
  1330. boot option, which is only for dedicated souls:-). If you want to get
  1331. rid of these annoying messages, upgrade to devfsd-v1.3.20 and use the
  1332. recommended RESTORE directive to restore permissions.
  1333. devfs_mk_dir(bill): using old entry in dir: c1808724 ""
  1334. This is similar to the message above, except that a driver attempted
  1335. to create a directory named bill, and the parent directory
  1336. has an entry with the same name. In this case, to ensure that drivers
  1337. continue to work properly, the old entry is re-used and given to the
  1338. driver. In 2.5 kernels, the driver is given a NULL entry, and thus,
  1339. under rare circumstances, may not create the require device nodes.
  1340. The solution is the same as above.
  1341. Compilation problems with devfsd
  1342. Usually, you can compile devfsd just by typing in
  1343. make in the source directory, followed by a make
  1344. install (as root). Sometimes, you may have problems, particularly
  1345. on broken configurations.
  1346. error messages relating to DEVFSD_NOTIFY_DELETE
  1347. This happened because you have an ancient set of kernel headers
  1348. installed in /usr/include/linux or /usr/src/linux.
  1349. Install kernel 2.4.10 or later. You may need to pass the
  1350. KERNEL_DIR variable to make (if you did not install
  1351. the new kernel sources as /usr/src/linux), or you may copy
  1352. the devfs_fs.h file in the kernel source tree into
  1353. /usr/include/linux.
  1354. -----------------------------------------------------------------------------
  1355. Other resources
  1356. Douglas Gilbert has written a useful document at
  1357. http://www.torque.net/sg/devfs_scsi.html which
  1358. explores the SCSI subsystem and how it interacts with devfs
  1359. Douglas Gilbert has written another useful document at
  1360. http://www.torque.net/scsi/scsihosts.html which
  1361. discusses the scsihosts= boot option
  1362. Douglas Gilbert has written yet another useful document at
  1363. http://www.torque.net/scsi/SCSI-2.4-HOWTO/ which
  1364. discusses the Linux SCSI subsystem in 2.4.
  1365. Johannes Erdfelt has started a discussion paper on Linux and
  1366. hot-swap devices, describing what the requirements are for a scalable
  1367. solution and how and why he's used devfs+devfsd. Note that this is an
  1368. early draft only, available in plain text form at:
  1369. http://johannes.erdfelt.com/hotswap.txt.
  1370. Johannes has promised a HTML version will follow.
  1371. I presented an invited 
  1372. paper
  1373. at the
  1374. 2nd Annual Storage Management Workshop held in Miamia, Florida,
  1375. U.S.A. in October 2000.
  1376. -----------------------------------------------------------------------------
  1377. Translations of this document
  1378. This document has been translated into other languages.
  1379. The document master (in English) by rgooch@atnf.csiro.au is
  1380. available at
  1381. http://www.atnf.csiro.au/~rgooch/linux/docs/devfs.html
  1382. A Korean translation by viatoris@nownuri.net is available at
  1383. http://your.destiny.pe.kr/devfs/devfs.html
  1384. -----------------------------------------------------------------------------
  1385. Most flags courtesy of ITA's 
  1386. Flags of All Countries
  1387. used with permission.