|
Linux Filesystem Hierarchy: |
Prev |
Chapter 1. Linux
Filesystem Hierarchy |
Next |
1.5. /dev
/dev is the location of special or device files. It is a very
interesting directory that highlights one important aspect of the
Linux filesystem - everything is a file or a directory. Look
through this directory and you should hopefully see hda1, hda2
etc.... which represent the various partitions on the first master
drive of the system. /dev/cdrom and /dev/fd0 represent your CD-ROM
drive and your floppy drive. This may seem strange but it will make
sense if you compare the characteristics of files to that of your
hardware. Both can be read from and written to. Take /dev/dsp, for
instance. This file represents your speaker device. Any data
written to this file will be re-directed to your speaker. If you
try 'cat /boot/vmlinuz > /dev/dsp' (on a properly configured
system) you should hear some sound on the speaker. That's the sound
of your kernel! A file sent to /dev/lp0 gets printed. Sending data
to and reading from /dev/ttyS0 will allow you to communicate with a
device attached there - for instance, your modem.
The majority of devices are either block or character devices;
however other types of devices exist and can be created. In
general, 'block devices' are devices that store or hold data,
'character devices' can be thought of as devices that transmit or
transfer data. For example, diskette drives, hard drives and CD-ROM
drives are all block devices while serial ports, mice and parallel
printer ports are all character devices. There is a naming scheme
of sorts but in the vast majority of cases these are completely
illogical.
total 724
lrwxrwxrwx 1 root root 13 Sep 28 18:06 MAKEDEV -> /sbin/MAKEDEV
crw-rw---- 1 root audio 14, 14 Oct 7 16:26 admmidi0
crw-rw---- 1 root audio 14, 30 Oct 7 16:26 admmidi1
lrwxrwxrwx 1 root root 11 Oct 7 16:26 amidi -> /dev/amidi0
crw-rw---- 1 root audio 14, 13 Oct 7 16:26 amidi0
crw-rw---- 1 root audio 14, 29 Oct 7 16:26 amidi1
crw-rw---- 1 root audio 14, 11 Oct 7 16:26 amixer0
crw-rw---- 1 root audio 14, 27 Oct 7 16:26 amixer1
drwxr-xr-x 2 root root 4096 Sep 28 18:05 ataraid
lrwxrwxrwx 1 root root 11 Oct 7 16:26 audio -> /dev/audio0
crw-rw---- 1 root audio 14, 4 Oct 7 16:26 audio0
crw-rw---- 1 root audio 14, 20 Oct 7 16:26 audio1
crw-rw---- 1 root audio 14, 7 Mar 15 2002 audioctl
lrwxrwxrwx 1 root root 9 Oct 14 22:51 cdrom -> /dev/scd1
lrwxrwxrwx 1 root root 9 Oct 14 22:52 cdrom1 -> /dev/scd0
crw------- 1 root tty 5, 1 Jan 19 20:47 console
lrwxrwxrwx 1 root root 11 Sep 28 18:06 core -> /proc/kcore
crw-rw---- 1 root audio 14, 10 Oct 7 16:26 dmfm0
crw-rw---- 1 root audio 14, 26 Oct 7 16:26 dmfm1
crw-rw---- 1 root audio 14, 9 Oct 7 16:26 dmmidi0
crw-rw---- 1 root audio 14, 25 Oct 7 16:26 dmmidi1
lrwxrwxrwx 1 root root 9 Oct 7 16:26 dsp -> /dev/dsp0
crw-rw---- 1 root audio 14, 3 Oct 7 16:26 dsp0
crw-rw---- 1 root audio 14, 19 Oct 7 16:26 dsp1
crw--w---- 1 root video 29, 0 Mar 15 2002 fb0
crw--w---- 1 root video 29, 1 Mar 15 2002 fb0autodetect
crw--w---- 1 root video 29, 0 Mar 15 2002 fb0current
crw--w---- 1 root video 29, 32 Mar 15 2002 fb1
crw--w---- 1 root video 29, 33 Mar 15 2002 fb1autodetect
crw--w---- 1 root video 29, 32 Mar 15 2002 fb1current
lrwxrwxrwx 1 root root 13 Sep 28 18:05 fd -> /proc/self/fd
brw-rw---- 1 root floppy 2, 0 Mar 15 2002 fd0
brw-rw---- 1 root floppy 2, 1 Mar 15 2002 fd1
crw--w--w- 1 root root 1, 7 Sep 28 18:06 full
brw-rw---- 1 root disk 3, 0 Mar 15 2002 hda
brw-rw---- 1 root disk 3, 64 Mar 15 2002 hdb
brw-rw---- 1 root disk 22, 0 Mar 15 2002 hdc
brw-rw---- 1 root disk 22, 64 Mar 15 2002 hdd
drwxr-xr-x 2 root root 12288 Sep 28 18:05 ida
prw------- 1 root root 0 Jan 19 20:46 initctl
brw-rw---- 1 root disk 1, 250 Mar 15 2002 initrd
drwxr-xr-x 2 root root 4096 Sep 28 18:05 input
crw-rw---- 1 root dialout 45, 128 Mar 15 2002 ippp0
crw-rw---- 1 root dialout 45, 0 Mar 15 2002 isdn0
crw-rw---- 1 root dialout 45, 64 Mar 15 2002 isdnctrl0
crw-rw---- 1 root dialout 45, 255 Mar 15 2002 isdninfo
crw------- 1 root root 10, 4 Mar 15 2002 jbm
crw-r----- 1 root kmem 1, 2 Sep 28 18:06 kmem
brw-rw---- 1 root cdrom 24, 0 Mar 15 2002 lmscd
crw------- 1 root root 10, 0 Mar 15 2002 logibm
brw-rw---- 1 root disk 7, 0 Sep 28 18:06 loop0
brw-rw---- 1 root disk 7, 1 Sep 28 18:06 loop1
crw-rw---- 1 root lp 6, 0 Mar 15 2002 lp0
crw-rw---- 1 root lp 6, 1 Mar 15 2002 lp1
crw-rw---- 1 root lp 6, 2 Mar 15 2002 lp2
crw-r----- 1 root kmem 1, 1 Sep 28 18:06 mem
lrwxrwxrwx 1 root root 10 Oct 7 16:26 midi -> /dev/midi0
crw-rw---- 1 root audio 14, 2 Oct 7 16:26 midi0
crw-rw---- 1 root audio 14, 18 Oct 7 16:26 midi1
lrwxrwxrwx 1 root root 11 Oct 7 16:26 mixer -> /dev/mixer0
crw-rw-rw- 1 root root 14, 0 Nov 11 16:22 mixer0
crw-rw---- 1 root audio 14, 16 Oct 7 16:26 mixer1
lrwxrwxrwx 1 root root 11 Oct 7 06:50 modem -> /dev/ttyLT0
crw-rw---- 1 root audio 31, 0 Mar 15 2002 mpu401data
crw-rw---- 1 root audio 31, 1 Mar 15 2002 mpu401stat
crw-rw---- 1 root audio 14, 8 Oct 7 16:26 music
crw-rw-rw- 1 root root 1, 3 Sep 28 18:06 null
crw-rw-rw- 1 root root 195, 0 Jan 6 03:03 nvidia0
crw-rw-rw- 1 root root 195, 1 Jan 6 03:03 nvidia1
crw-rw-rw- 1 root root 195, 255 Jan 6 03:03 nvidiactl
crw-rw---- 1 root lp 6, 0 Mar 15 2002 par0
crw-rw---- 1 root lp 6, 1 Mar 15 2002 par1
crw-rw---- 1 root lp 6, 2 Mar 15 2002 par2
-rw-r--r-- 1 root root 665509 Oct 7 16:41 pcm
crw-r----- 1 root kmem 1, 4 Sep 28 18:06 port
crw-rw---- 1 root dip 108, 0 Sep 28 18:07 ppp
crw------- 1 root root 10, 1 Mar 15 2002 psaux
crw-rw-rw- 1 root root 1, 8 Sep 28 18:06 random
crw-rw---- 1 root root 10, 135 Mar 15 2002 rtc
brw-rw---- 1 root cdrom 11, 0 Mar 15 2002 scd0
brw-rw---- 1 root cdrom 11, 1 Mar 15 2002 scd1
brw-rw---- 1 root disk 8, 0 Mar 15 2002 sda
brw-rw---- 1 root disk 8, 1 Mar 15 2002 sda1
brw-rw---- 1 root disk 8, 2 Mar 15 2002 sda2
brw-rw---- 1 root disk 8, 3 Mar 15 2002 sda3
brw-rw---- 1 root disk 8, 4 Mar 15 2002 sda4
brw-rw---- 1 root disk 8, 16 Mar 15 2002 sdb
brw-rw---- 1 root disk 8, 17 Mar 15 2002 sdb1
brw-rw---- 1 root disk 8, 18 Mar 15 2002 sdb2
brw-rw---- 1 root disk 8, 19 Mar 15 2002 sdb3
brw-rw---- 1 root disk 8, 20 Mar 15 2002 sdb4
crw-rw---- 1 root audio 14, 1 Oct 7 16:26 sequencer
lrwxrwxrwx 1 root root 10 Oct 7 16:26 sequencer2 -> /dev/music
lrwxrwxrwx 1 root root 4 Sep 28 18:05 stderr -> fd/2
lrwxrwxrwx 1 root root 4 Sep 28 18:05 stdin -> fd/0
lrwxrwxrwx 1 root root 4 Sep 28 18:05 stdout -> fd/1
crw-rw-rw- 1 root tty 5, 0 Sep 28 18:06 tty
crw------- 1 root root 4, 0 Sep 28 18:06 tty0
crw------- 1 root root 4, 1 Jan 19 14:59 tty1
crw-rw---- 1 root dialout 62, 64 Oct 7 06:50 ttyLT0
crw-rw---- 1 root dialout 4, 64 Mar 15 2002 ttyS0
crw-rw---- 1 root dialout 4, 65 Mar 15 2002 ttyS1
crw-rw---- 1 root dialout 4, 66 Mar 15 2002 ttyS2
crw-rw---- 1 root dialout 4, 67 Mar 15 2002 ttyS3
crw-rw---- 1 root dialout 188, 0 Mar 15 2002 ttyUSB0
crw-rw---- 1 root dialout 188, 1 Mar 15 2002 ttyUSB1
cr--r--r-- 1 root root 1, 9 Jan 19 20:46 urandom
drwxr-xr-x 2 root root 4096 Sep 28 18:05 usb
prw-r----- 1 root adm 0 Jan 19 14:58 xconsole
crw-rw-rw- 1 root root 1, 5 Sep 28 18:06 zero
|
Some common device files as well as their equivalent
counterparts under Windows that you may wish to remember are:
- /dev/ttyS0 (First communications port, COM1)
-
First serial port (mice, modems).
- /dev/psaux (PS/2)
-
PS/2 mouse connection (mice, keyboards).
- /dev/lp0 (First printer port, LPT1)
-
First parallel port (printers, scanners, etc).
- /dev/dsp (First audio device)
-
The name DSP comes from the term digital signal processor, a
specialized processor chip optimized for digital signal analysis.
Sound cards may use a dedicated DSP chip, or may implement the
functions with a number of discrete devices. Other terms that may
be used for this device are digitized voice and PCM.
- /dev/usb (USB Devices)
-
This subdirectory contains most of the USB device nodes. Device
name allocations are fairly simplistic so no elaboration is be
necessary.
- /dev/sda (C:\, SCSI device)
-
First SCSI device (HDD, Memory Sticks, external mass storage
devices such as CD-ROM drives on laptops, etc).
- /dev/scd (D:\, SCSI CD-ROM device)
-
First SCSI CD-ROM device.
- /dev/js0 (Standard gameport joystick)
-
First joystick device.
Devices are defined by type, such as 'block' or 'character', and
'major' and 'minor' number. The major number is used to categorize
a device and the minor number is used to identify a specific device
type. For example, all IDE device connected to the primary
controller have a major number of 3. Master and slave devices, as
well as individual partitions are further defined by the use of
minor numbers. These are the two numbers precede the date in the
following display:
# ls -l /dev/hd*
brw-rw---- 1 root disk 3, 0 Mar 15 2002 /dev/hda
brw-rw---- 1 root disk 3, 1 Mar 15 2002 /dev/hda1
brw-rw---- 1 root disk 3, 10 Mar 15 2002 /dev/hda10
brw-rw---- 1 root disk 3, 11 Mar 15 2002 /dev/hda11
brw-rw---- 1 root disk 3, 12 Mar 15 2002 /dev/hda12
brw-rw---- 1 root disk 3, 13 Mar 15 2002 /dev/hda13
brw-rw---- 1 root disk 3, 14 Mar 15 2002 /dev/hda14
brw-rw---- 1 root disk 3, 15 Mar 15 2002 /dev/hda15
brw-rw---- 1 root disk 3, 16 Mar 15 2002 /dev/hda16
brw-rw---- 1 root disk 3, 17 Mar 15 2002 /dev/hda17
brw-rw---- 1 root disk 3, 18 Mar 15 2002 /dev/hda18
brw-rw---- 1 root disk 3, 19 Mar 15 2002 /dev/hda19
brw-rw---- 1 root disk 3, 2 Mar 15 2002 /dev/hda2
brw-rw---- 1 root disk 3, 20 Mar 15 2002 /dev/hda20
brw-rw---- 1 root disk 3, 3 Mar 15 2002 /dev/hda3
brw-rw---- 1 root disk 3, 4 Mar 15 2002 /dev/hda4
brw-rw---- 1 root disk 3, 5 Mar 15 2002 /dev/hda5
brw-rw---- 1 root disk 3, 6 Mar 15 2002 /dev/hda6
brw-rw---- 1 root disk 3, 7 Mar 15 2002 /dev/hda7
brw-rw---- 1 root disk 3, 8 Mar 15 2002 /dev/hda8
brw-rw---- 1 root disk 3, 9 Mar 15 2002 /dev/hda9
brw-rw---- 1 root disk 3, 64 Mar 15 2002 /dev/hdb
brw-rw---- 1 root disk 3, 65 Mar 15 2002 /dev/hdb1
brw-rw---- 1 root disk 3, 74 Mar 15 2002 /dev/hdb10
brw-rw---- 1 root disk 3, 75 Mar 15 2002 /dev/hdb11
brw-rw---- 1 root disk 3, 76 Mar 15 2002 /dev/hdb12
brw-rw---- 1 root disk 3, 77 Mar 15 2002 /dev/hdb13
brw-rw---- 1 root disk 3, 78 Mar 15 2002 /dev/hdb14
brw-rw---- 1 root disk 3, 79 Mar 15 2002 /dev/hdb15
brw-rw---- 1 root disk 3, 80 Mar 15 2002 /dev/hdb16
brw-rw---- 1 root disk 3, 81 Mar 15 2002 /dev/hdb17
brw-rw---- 1 root disk 3, 82 Mar 15 2002 /dev/hdb18
brw-rw---- 1 root disk 3, 83 Mar 15 2002 /dev/hdb19
brw-rw---- 1 root disk 3, 66 Mar 15 2002 /dev/hdb2
brw-rw---- 1 root disk 3, 84 Mar 15 2002 /dev/hdb20
brw-rw---- 1 root disk 3, 67 Mar 15 2002 /dev/hdb3
brw-rw---- 1 root disk 3, 68 Mar 15 2002 /dev/hdb4
brw-rw---- 1 root disk 3, 69 Mar 15 2002 /dev/hdb5
brw-rw---- 1 root disk 3, 70 Mar 15 2002 /dev/hdb6
brw-rw---- 1 root disk 3, 71 Mar 15 2002 /dev/hdb7
brw-rw---- 1 root disk 3, 72 Mar 15 2002 /dev/hdb8
brw-rw---- 1 root disk 3, 73 Mar 15 2002 /dev/hdb9
brw-rw---- 1 root disk 22, 0 Mar 15 2002 /dev/hdc
brw-rw---- 1 root disk 22, 64 Mar 15 2002 /dev/hdd
|
The major number for both hda and hdb devices is 3. Of course,
the minor number changes for each specific partition. The
definition of each major number category can be examined by looking
at the contents of the /usr/src/linux/include/linux/major.h file.
The devices.txt also documents major and minor numbers. It is
located in the /usr/src/linux/Documentation directory. This file
defines the major numbers. Almost all files devices are created by
default at the install time. However, you can always create a
device using the mknod command or the MAKEDEV script which is
located in the /dev directory itself. Devices can be created with
this utility by supplying the device to be created, the device type
(block or character) and the major and minor numbers. For example,
let's say you have accidentally deleted /dev/ttyS0 (COM1 under
Windows), it can be recreated using the following command
# mknod ttyS0 c 4 64
For those of us who are rather lazy you can simply run the
MAKEDEV script as such
# MAKEDEV *
which will create all devices known.
If is possible that /dev may also contain a MAKEDEV.local for
the creation of any local device files.
In general and as required by the FSSTND, MAKEDEV will have
provisions for creating any device that may be found on the system,
not just those that a particular implementation installs.
For those of you who are wondering why Linux is using such a
primitive system to reference devices its because we haven't been
able to devise a sufficiently sophisticated mechanism which
provides enough advantages over the current system in order to
achieve widespread adoption.
To date (as of kernel version 2.4), the best attempt has been
made by Richard Gooch of the CSIRO. It's called devfsd and has been
a part of the kernel for a number of years now. It has been
sanctioned by the kernel developers and Linus himself and details
of its implementation can be found at
/usr/src/linux/Documentation/filesystems/devfs/README. Below is an
excerpt from this document.
Devfs is an alternative to "real" character and block special
devices on your root filesystem. Kernel device drivers can register
devices by name rather than major and minor numbers. These devices
will appear in devfs automatically, with whatever default ownership
and protection the driver specified. A daemon (devfsd) can be used
to override these defaults. Devfs has been in the kernel since
2.3.46.
NOTE that devfs is entirely optional. If you prefer the old
disc-based device nodes, then simply leave CONFIG_DEVFS_FS=n (the
default). In this case, nothing will change. ALSO NOTE that if you
do enable devfs, the defaults are such that full compatibility is
maintained with the old devices names.
There are two aspects to devfs: one is the underlying device
namespace, which is a namespace just like any mounted filesystem.
The other aspect is the filesystem code which provides a view of
the device namespace. The reason I make a distinction is because
devfs can be mounted many times, with each mount showing the same
device namespace. Changes made are global to all mounted devfs
filesystems. Also, because the devfs namespace exists without any
devfs mounts, you can easily mount the root filesystem by referring
to an entry in the devfs namespace.
The cost of devfs is a small increase in kernel code size and
memory usage. About 7 pages of code (some of that in __init
sections) and 72 bytes for each entry in the namespace. A modest
system has only a couple of hundred device entries, so this costs a
few more pages. Compare this with the suggestion to put /dev on a
ramdisc.
On a typical machine, the cost is under 0.2 percent. On a modest
system with 64 MBytes of RAM, the cost is under 0.1 percent. The
accusations of "bloatware" levelled at devfs are not justified.
As of kernel version 2.6, devfs has been marked obsolete and has
now been replaced by udev. A system very similar (at least from a
the end user's point of view) to devfs but which works entirely in
userspace. An overview of udev can be found at https://www.kroah.com/linux/talks/ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf
|
|