前面几节所介绍的目录和文件,都是真真正正、实实在在的存储在具体的外部
存储设备上的,它们可能是在本机的硬盘、闪存、光盘中,可能保存在不只一个磁
盘分区中,也可能保存在网络中其它主机的存储设备中的。本节所介绍的几个文件
系统,虽然它们出现在根文件系统中,但它里面的内容却无法在任何外部存储设备
中找到,因为它们都在内存中。
2.6.1 proc文件系统
proc是一个重要虚拟文件系统,通过它里面的一些文件,可以获取系统状态信
息并修改某些系统的配置信息。proc文件系统本身不占用磁盘空间,它仅存在于内
存之中,为操作系统本身和应用程序之间的通信提供了一个安全的接口。当我们在
内核中添加了新功能或设备驱动时,经常需要得到一些系统状态的信息,一般这样
的功能可能需要经过一些象ioctl()这样的系统调用来完成。系统调用接口对于一些功
能性的信息可能是适合的,因为应用程序必须将这些信息读出后再做一定的处理。
但对于一些实时性的系统信息,例如内存的使用状况,或者是驱动设备的统计资料
等,我们更需要一个比较简单易用的接口来取得它们。proc文件系统就是这样的一
个接口,我们可以简单的用cat、strings程序来查看这些信息。例如,执行下面的命
令:
#cat /proc/meminfo
你可能会得到如下结果:
MemTotal: 254272 kB
MemFree: 104416 kB
Buffers: 23940 kB
Cached: 103972 kB
SwapCached: 0 kB
Active: 64660 kB
Inactive: 69276 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 254272 kB
LowFree: 104416 kB
SwapTotal: 522072 kB
SwapFree: 522072 kB
Dirty: 48 kB
Writeback: 0 kB
Mapped: 11708 kB
Slab: 11364 kB
CommitLimit: 649208 kB
Committed_AS: 16064 kB
PageTables: 320 kB
VmallocTotal: 770040 kB
VmallocUsed: 7916 kB
VmallocChunk: 760564 kB
HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 4096 kB
同样的,free、df、top、ps等程序的功能实现,强烈依赖于proc文件系统,为了使用
那些程序,一定要使内核支持proc文件系统,并将其挂接到根文件系统的/proc目录
下。
下表所列的文件或符号连接会出现在/proc目录下,但并不详尽,具体都包含那
些,取决于你的内核配置和具体的硬件设备。
名称 |
功能 |
apm |
高级电源管理信息。 |
buddyinfo |
Buddy算法内存分配信息。 |
cmdline |
内核的命令行参数。 |
config.gz |
当前内核的.config文件。 |
cpuinfo |
cpu信息 |
devices |
可以用到的设备(块设备/字符设备) |
diskstats |
磁盘I/O统计信息。 |
dma |
使用的DMA通道 |
execdomains |
执行区域列表。 |
fb |
Frame buffer信息 |
filesystems |
支持的文件系统 |
interrupts |
中断的使用情况,记录中断产生次数。 |
iomem |
I/O内存映射信息 |
ioports |
I/O端口分配情况 |
kcore |
内核核心映像,GDB可以利用它查看当前内核的所有数据结构状态。 |
key-users |
密钥保留服务文件 |
kmsg |
内核消息 |
ksyms |
内核符号表 |
loadavg |
负载均衡信息 |
locks |
内核锁 |
mdstat |
磁盘阵列状态 |
meminfo |
内存信息 |
misc |
杂项信息 |
modules |
系统已经加载的模块文本列表 |
mounts |
已挂接的文件系统列表 |
partitions |
磁盘分区信息 |
pci |
内核识别的PCI设备列表 |
self |
访问proc文件系统的进程信息 |
slabinfo |
内核缓存信息 |
splash |
splash信息 |
stat |
全面统计状态表 |
swaps |
交换空间使用情况 |
uptime |
系统正常运行时间 |
version |
内核版本 |
vmstat |
虚拟内存统计表 |
zoneinfo |
内存管理区信息 |
表2-6-1
下表所列的目录会出现在/proc目录下,但并不详尽,具体包含那些,取决于你
的内核配置和具体的硬件设备。
名称 |
功能 |
[number] |
进程信息 |
acpi |
高级配置与电源接口 |
asound |
ALSA声卡驱动接口 |
bus |
系统中已安装的总线信息 |
dirver |
空目录 |
fs |
空目录 |
ide |
IDE设备信息 |
irq |
中断请求设置接口 |
net |
网络各种状态信息 |
scsi |
SCSI设备信息 |
sys |
内核配置接口 |
sysvipc |
中断的使用情况,记录中断产生次数。 |
tty |
tty驱动信息 |
表2-6-2
proc文件系统的详细内容可以通过执行 man proc命令获得,这里就不再进行更为详
细的介绍了。
2.6.2 sysfs文件系统
与proc文件系统类似,sysfs文件系统也是一个不占有任何磁盘空间的虚拟文件系
统。它通常被挂接在/sys目录下。sysfs文件系统是Linux2.6内核引入的,它把连接在系
统上的设备和总线组织成为一个分级的文件,使得它们可以在用户空间存取。其实
sysfs是从proc和devfs中划分出来的。
/sys目录下会包含下表所列的目录,但并不详尽,不过具体内容还取决于内的配
置和具体的硬件设备。
名称 |
功能 |
block |
块设备 |
bus |
系统总线 |
class |
设备组 |
devices |
系统设备 |
firmware |
固件 |
kernel |
内核 |
module |
内核模块 |
power |
供电系统 |
表2-6-3
讲述sysfs文件系统各目录的详细内容已经超出本文的范围,感兴趣的读者可以查看
有关Linux驱动程序开发的书籍。
2.6.3 devfs文件系统
devfs,也叫设备文件系统(Device Filesystem),设计它的唯一目的就是提供一
个新的(更理性的)方式管理通常位于/dev的所有块设备和字符设备。典型的 /dev
树包含数百个块特殊文件和字符特殊文件,它们全都在根文件系统上。每个特殊文
件都可以让用户空间进程轻松地与内核设备实现交互。举例来说,通过对这些特殊
文件执行操作,你的X服务器就能够访问视频硬件,fsck可以执行文件系统检验,lpd
可以通过并行端口向打印机发送数据。
实际上,通常Linux和Unix更“酷”的方面是,设备不是简单地隐藏在晦涩的
API 之后,而是真正地与普通文件、目录和符号链接一样存在于文件系统上。因为
字符和块设备是映射到普通文件系统名称空间的,我们通常可以用有意义的方式来
与硬件交互,可以仅使用标准 Unix 命令,如 cat 和 dd。除了有趣之外,这还使我
们有更强的能力,并提高生产力。
下表所列的文件或符号连接可能会出现在/dev目录下,但并不详尽,具体内容取
决于你的具体硬件设备。
名称 |
功能 |
audio |
音品设备 |
cdrom[0-9] |
cdrom设备,这往往是一个符号连接 |
console |
系统控制台 |
core |
内核镜像,为/proc/kcore的符号连接 |
dmmidi |
固件 |
dsp |
内核 |
dvd |
dvd设备,这往往是一个符号连接 |
fb |
Frame buffer,一般为/dev/fb0的符号连接 |
fb0 |
Frame buffer设备 |
fd |
文件描述符,/proc/self/fd的符号连接 |
fd[0-9]+ |
软盘设备 |
floppy |
软盘设备,一般为fd[0-9]的符号连接 |
full |
满设备,任何写入操作都会失败,并把errno设为ENOSPC,以表示没有剩余空间。 |
fuse |
用户空间的虚拟文件系统 |
hd[a-z][1-9]+ |
IDE硬盘 |
sd[a-z][1-9]+ |
SCSI或SATA硬盘 |
hpet |
HPET设备 |
initctl |
用户与init进程交互的通道。 |
kmem |
存取经过内核虚拟之后的内存 |
kmsg |
任何对该文件的写入都将作为printk的输出 |
log |
syslog的本地套接字 |
loop[0-9] |
回环设备,一个磁盘文件模拟一个块设备。 |
lp[0-9] |
打印机 |
md[0-9] |
RAID设备 |
mem |
直接存取物理内存 |
midi |
MIDI设备 |
mixer |
混音器 |
null |
控设备。任何写入都将直接被丢弃,任何读取都将得到EOF |
parport[0-9] |
并口 |
port |
存取I/O端口 |
ppp |
ppp拨号设备 |
psaux |
PS/2鼠标 |
ptmx |
所有PTY master的复用器 |
pty[a-z]+[1-9]+ |
伪终端,用于创建ssh等登陆会话 |
ram[0-9]+ |
RAM disk,initrd只能使用ram0 |
ramdisk |
ram0的符号连接 |
random |
随机数发生器。完全有用户的输入来产生随机数。如果用户停止所有动作,则停止产生随机数。 |
root |
根分区,这是一个到根分区设备的符号连接。 |
rtc |
实时时钟 |
stderr |
标准错误输出,/proc/self/fd/2的符号连接 |
stdin |
标准输入,/proc/self/fd/0的符号连接 |
stdout |
标准输出,/proc/self/fd/1的符号连接 |
tty[1-9,a-z]+ |
tty虚拟控制台,tty为当前控制台 |
ttyS[0-9] |
串口 |
urandom |
更快,但是不够安全的随机数发生器。 |
vcs[1-9,a-z]+ |
虚拟控制台的文本内容,一一对应。 |
X0R |
/dev/null的符号连接 |
XOR |
/dev/null的符号连接 |
zero |
0字节源,可以读取到无限多的0字节。 |
表2-6-4
下表所列的目录可能会出现在/dev目录下,但不是全部,具体情况与你的内核配
置和硬件设备有关。
名称 |
功能 |
cpu |
cpu信息 |
disk |
磁盘/光盘信息,里面的内容为具体设备的符号连接 |
input |
设备组 |
mapper |
RAID和LVM控制接口 |
net |
VMware和Qemu等使用的虚拟网卡 |
pts |
devpts文件系统挂载点,用于实现伪终端 |
raw |
裸设备操作 |
shm |
Linux独有的tmpfs文件系统挂接点。 |
snd |
声卡控制接口 |
表2-6-5
devfs文件文件系统是内核自动挂接的,当挂接好devfs文件系统后,才能正确执
行init程序。Linux上devfs文件系统与后面讲述的tmpfs文件系统使用相同结构。
2.6.4 tmpfs文件系统
tmpfs文件系统是Linux特有的文件系统,唯一的标准挂接点是/dev/shm。当然,用
户可以将其挂接在其他地方。
tmpfs有些像虚拟磁盘(ramdisk),但不是一回事。说其像虚拟磁盘,是因为它
可以使用你的RAM,但它也可以使用你的交换分区。传统的虚拟磁盘是一个块设
备,而且需要一个mkfs之类的命令格式化它才能使用。tmpfs是一个独立的文件系
统,不是块设备,只要挂接,立即就可以使用。
tmpfs的大下是不确定的,它最初只有很小的空间,但随着文件的复制和创建,
它的大小就会不断变化,换句话说,它会根据你的实际需要而改变大小;tmpfs的速
度非常惊人,毕竟它是驻留在RAM中的,即使用了交换分区,性能仍然非常卓越;
由于tmpfs是驻留在RAM的,因此它的内容是不持久的,断电后,tmpfs的内容就消失
了,这也是被称作tmpfs的根本原因。
有效的使用tmpfs可以极大的提高应用程序或整个系统的性能。有关tmpfs的详细
内容,还请读者参阅其他相关著作,毕竟本文讲述的是一个Linux发行版的开发。
2.6.5 usbdevfs文件系统
顾名思义,usbdevfs就是USB设备文件系统,它是一个动态生成的文件系统,有
些类似于proc文件系统。它的标准挂接点是/proc/bus/usb,当然,也可以挂接到其他
地方。它主要用于:用户级驱动、即插即用、提供USB设备信息、应用程序轮询
USB设备的变化等。
2.6.6 devpts文件系统
devpts文件系统为伪终端提供了一个标准接口,它的标准挂接点是/dev/pts。只要
pty的主复合设备/dev/ptmx被打开,就会在/dev/pts下动态的创建一个新的pty设备文
件。挂接时,UID、GID及其工作模式会指定给devpts文件系统的所有pty文件。这可
以保证伪终端的安全性。
讨论devpts文件系统的详细内容,已经超过本文范围,还请读者参考其他专
著。
贯穿Linux的整个文件组织结构,无不洋溢着那继承自Unix的深厚的文化底蕴,
美不胜收。使我不得不感叹,Linux是多么伟大的一个操作系统。正是由于这些,
Linux才长久不衰,越发显得青春洋溢,让我们这些热爱Linux的人为其流连忘返。
到了这里,对于Linux的文件组织结构,我相信各位读者应该有了感官上的认识
了,我也再次感谢你,为了Magic Linux,能够坚持将这些丑陋的文字读到这里。在
下一章里,我将讲述如何利用本章与上一章的知识,来构建一个能够工作的基本系
统。
(未完...待续...)