--- layout: post title: 特殊文件系统 category: 虚拟文件系统 description: 特殊文件系统... tags: 文件系统 --- 当网络和磁盘文件系统能够使用户处理存放在内核之外的信息时,特殊文件系统可以为系统程序员和管理员提供一种容易的方式来操作内核的数据结构并实现操作系统的特殊特征。下面列出了一些特殊的文件系统,对于其中的每个文件系统,表中给出了它的安装点和简短的描述: 名字 | 安装点 | 说明 ------------ | ------------- | ------------- bdev | 无 | 块设备 binfmt_misc | 任意 | 其他可执行格式 devpts | /dev/pts | 伪终端支持 eventpollfs | 无 | 由有效事件轮询机制使用 futexfs | 无 | 由futex机制使用 pipefs | 无 | 管道 proc | /pros | 对内核数据结构的常规访问点 rootfs | 无 | 为启动阶段提供一个空的根目录 shm | 无 | IPC共享线性区 mqueue | 任意 | 实现POSIX消息队列时使用 sockfs | 无 | 套接字 sysfs | /sys | 对系统数据的常规访问点 tmpfs | 任意 | 临时文件[^1] usbfs | /proc/bus/usb | USB设备 [^1]: 如果不被交换出去就保持在RAM中。 有几个文件系统没有固定的安装点,这些文件系统可以由用户自由地安装和使用。此外,一些特殊文件系统根本没有安装点,它们不是用于与用户交互,但是内核可以用它们来很容易地重新使用VFS层的某些代码[^2]。 [^2]: 例如有了pipefs特殊文件系统,就可以把管道和FIFO文件以相同的方式对待。 特殊文件系统不限于物理块设备,然而,内核给每个安装的特殊文件系统分配一个虚拟的块设备,让其主设备号为0而次设备号具有任意值,而每个特殊文件系统有不同的值。 *set_anon_super()*函数用于初始化特殊文件系统的超级块,这个函数本质上获得一个未使用的次设备号dev,然后用主设备号0和次设备号dev设置超级块的*s_dev*字段。而另一个*kill_anon_super()*函数移走特殊文件系统的超级块。*unnamed_dev_idr*变量包含指向一个辅助结构的指针。 尽管有些内核设计者不喜欢虚拟块设备标识符,但是这些标识符有助于内核以统一的方式处理特殊文件系统和普通文件系统。