设备文件目录 /dev

/dev/ 是由 Linux 的 devfs (device file system)建立起来的 , 主要使用来存放系统中的 device 的相关信息 . 该目录下的文件都是一些让用户对应到 kernel 的虚拟文件 , 但又介于系统模块之间 , 所以模块是 Ring 2 , 而 devfs 的位置属于 Ring 1 的部分 .  但是 devfs 的目录架构太大太凌乱 , 对硬件没有一套管理机制 , 所谓管理就是通过检测硬件做出适当的操作 . 因此 devfs 的机制已经被 udev 做取代 . 关于 udev 的详细解释请点击这里 .
在 /dev/ 下有一些是基本的文件 , 没有归类到子目录中 , 如下 :
: 括号里以逗号分割 , 分别代表 (Mayor ID,Minor ID,Device Type)

mem (1,1,char) : 读写物理内存时用
kmem (1,2,char) : 读写 kernel 的虚拟内存使用
null (1,3,char) : 常用的空文件设备
zero (1,5,char) : 帮助用户产生固定大小的文件
random (1,8,char) : 随机数发生器
urandom (1,9,char) : 快速但低安全的随机数发生器
ram0 (1,0,block) : 第一个 RAM disk , 一般用该设备文件做 initrd 的 RAM disk

fd0 (2,0,block) : floopy 磁盘的设备文件

hda (3,0,block) : IDE 硬盘 , 这是 IDE  Primary 插槽所在的 Master 接口
hdb (3,64,block) : IDE Primary 插槽所在的 Slave 接口, 其 Minor number 为 64 , 代表 hda 一共可以有 63 个分区

tty0 (4,0,char) : TTY 就是用户登录时所使用的 Terminal , tty0 代表第一个 Terminal , 也就是用户用 Alt+F1 进入的那个 Terminal , 最多可以有 64 个 TTY (tty63)
ttyS0 (4,64,char) : 通过 Serial Port (COM port) 所使用的 Terminal 接口, 最多可以有 192 个 (ttyS191)

tty (5,0,char) : 目前正在使用的 tty 接口 , 不论用户z处在哪个 tty , 只要将信息发送到 /dev/tty 就会由用户当前的 tty 界面发送
console (5,1,char) : 系统的终端用户 , 一开始气动式不会使用 tty , 因为 tty 是给用户用的 , 用户所看到的启动信息全部是通过 /dev/console 发送的 , 如果用户将信息发送给 /dev/console , 所以一样会从用户当前的 tty 界面看到
ptmx (5,2,char) : /dev/pts 目录下文件的来源 , 有了该文件 , 才可以让远程用户通过终端接口有登录系统的画面

vcs (7,0,char) : vcs 用来对应当前所使用 virtual console (tty or pts) 的文字内容 . 比如 : 用户在 tty2 登录 , 管理员可以通过读取 /dev/vcs2 ( $ cat /dev/vcs2 ) 文件就可以直接看到 tty2 的当前画面 . 不只是读取 , 也可以将信息通过不同的 vcs 设备文件 , 直接传送到对应的 tty 接口
vcsa (7,128,char) : 和上面的设备文件一样 , 都是用来显示目前的 virtual console 画面的 , 但 vcsa 又多了该 virtual console 中的属性 , 前位置和鼠标位置

sda (8,0,block) : SCSI 硬盘的设备文件 , sda 代表第一块硬盘
sdb (8,16,block) : 第二块硬盘 , 其 Minor 号为 16 可推测第一块硬盘最多可以有 15 个分区

scd0 (11,0,block) : SCSI 光驱设备文件 (先通常用 USB 光驱) , scd0 代表第一个光驱

hdc (22,0,block) : IDE 的 Secondary 插槽上的 Master 硬盘

/dev/bus/

在该目录中将硬件根据不同的总线 (bus) 进行分类 , 目前常用的总线大都是 USB , 所以该目录下也只剩下 USB 了 .

# pwd
/dev/bus/usb
# ll
total 0
drwxr-xr-x 2 root root 60 2011-01-15 18:20 001/
drwxr-xr-x 2 root root 60 2011-01-15 18:20 002/
# lsusb
Bus 002 Device 001: ID 0000:0000  
Bus 001 Device 001: ID 0000:0000  

/dev/disk/

该目录存放的是连接到该主机上的硬盘信息 , 按不同的分类方式显示 .

# ll
by-id/  by-label/  by-path/  by-uuid/

按照不同的分类方法都可以找到相应的分类信息 .

# pwd
/dev/disk/by-label
# ll
total 0
lrwxrwxrwx 1 root root 10 2011-01-15 18:20 boot -> ../../sdb1
lrwxrwxrwx 1 root root 10 2011-01-15 18:20 home -> ../../sdb5
lrwxrwxrwx 1 root root 10 2011-01-15 18:20 SWAP-hda3 -> ../../sdb3
# e2label /dev/sdb1
/dev/sdb5
# e2label /dev/sdb5
/home

/dev/input/

存放输入信息的目录 , 主要针对键盘和鼠标 . 同意文件为 event , 但鼠标可用通用的设备文件 /dev/input/mice .
若想知道鼠标如何传递信息 , 必须先知道 mice 文件的作用就是鼠标在移动时传递参数给系统 , 可通过下面的实验实现 :
1) 直接打开 mice 文件 “ # cat /dev/input/mice
2) 移动鼠标 , 此时能够看到 mice 文件的变化
3) 若先看到源码 , 请使用 xxd 来替换 cat

/dev/mapper/

跟 LVM 相关的文件 , 该目录中的文件其实就是我们在做 LVM 时产生的对应文件 . /dev/VolGroup00/ ( 不一定是 VolGroup00 , 根据实际情况而定 ) 下的文件其实是该目录下文件的链接 .

# ll /dev/VolGroup00/
total 0
lrwxrwxrwx 1 root root 31 2011-01-15 18:20 LogVol00 -> /dev/mapper/VolGroup00-LogVol00
lrwxrwxrwx 1 root root 31 2011-01-15 18:20 LogVol01 -> /dev/mapper/VolGroup00-LogVol01

该目录下还有一个 control 文件 , 它是 device mapper 的控制文件 , 所以一定需要 , 不过因为是由 devfs 产生的 , 即使不小心删除 , 重启后一样会还原 .

/dev/net/

默认只有 tun 这个设备文件 , 因为此文件使用来建立 VPN 的 tunnel 专用通道 .

/dev/pts/

pts 全名为 Pseudo-terminal slave , 另一个和 pts 有关系的是 ptmx , 全名为 Pseudo-terminal master . 由文件名可知他们都与 terminal 有关 .
该目录下的文件 , 是当用户通过非本机登录时 , 产生出可使用的 terminal 界面 , 像 0 , 1 等表示目前有几个通过远程或者 X Window 的用户在线文件 .
其 实 pts/ 下的文件都是由 /dev/ptmx 这个文件建立的 , 而 pts/ 目录主要用于存放 ptmx 为用户所产生的 slave terminal 接口设备文件 , 其使用场合为 X Window 下的 terminal (Xterm) 窗口以及使用 ssh 登录时的接口 .

/dev/shm/

shm 是 Linux 专门用来分享内存的 API , 通过该机制让内存直接变为一种可让用户读写数据的空间 . 系统启动时会默认将 shm/ 目录以 tmpfs 的文件格式挂载 .

# df
Filesystem                                         1K-blocks   Used      Available  Use%  Mounted on
/dev/mapper/VolGroup00-LogVol00  6919612    2479216 4083228   38%     /
/dev/sda1                                           101086      12190      83677      13%     /boot
tmpfs                                                  192620      0              192620     0%      /dev/shm

只要以 tmpfs 的格式将要用的目录挂载起来 , 就可以直接指向内存的资源, 使得读写速度大大提升 . 下面以 tmpfs 的格式挂载到 /mnt/ 目录下 , 大小为 10M .

# mount -t tmpfs -o size=10M tmpfs /mnt/
# df
Filesystem                                         1K-blocks  Used       Available  Use%   Mounted on
/dev/mapper/VolGroup00-LogVol00  6919612   2479216  4083228   38%      /
/dev/sda1                                           101086     12190         83677     13%     /boot
tmpfs                                                  192620     0                192620     0%      /dev/shm
tmpfs                                                 10240       0                10240       0%      /mnt
如一开始所说 , 系统启动时 , 已将 tmpfs 挂载到 shm/ 下了 , 因为该目录是以不限大小的方式挂载的 , 所以其可用的空间将会是全部可用的内存大小 , 如不注意使用 , 内存将使用过量造成系统问题 .
这里是一个应用实例 , 请猛击 .

/dev/.udev/

在 udev 的机制中 , 有大量的数据都是来自 /dev/ 目录 , 因为一开始就是为了取代 devfs , 也就是 /dev/ 目录下的杂乱方式 . udev 在存放时便是以其在 /sys/ 目录中的位置为文件名称的 , 在 db/ 中的文件大部分是链接文件 , 他们都是经由 udev 的 rules ( /etc/udev/rules.d/ ) 所建立的 .
在 db/ 目录中假设存在某个文件 class@vc@vcsa7 ( 将 @ 看成一个目录的分割符号 ) , 一定能够在 /sys/class/vc/vcsa7/ 中找到

# pwd
/dev/.udev/db
# ll class\@vc\@vcsa7
lrwxrwxrwx 1 root root 5 2011-01-15 18:22 class@vc@vcsa7 -> vcsa7
# ll /sys/class/vc/vcsa7
total 0
-r–r–r–       1 root root 4096 2011-01-16 00:03 dev
drwxr-xr-x   2 root root       0 2011-01-15 18:22 power/
lrwxrwxrwx 1 root root       0 2011-01-16 00:03 subsystem -> ../../../class/vc/
–w——-      1 root root 4096 2011-01-16 00:03 uevent

/dev/VolGroup00/

在安装系统时 , 如果使用 LVM 方式安装可能出现该目录 , 后面的数字 (00) 依你设定的 LVM 而定 , 详细的可以参见前面的 /dev/mapper/ 目录 .

参考自 : 邱世华 Linux 系统架构与目录解析