第三章:命名空间文件系统

FreeBSD包括几个较小的文件系统,它们以文件系统的方式呈现内部系统信息。

这些文件系统几乎总是用于支持或调试特定的软件。

进程文件系统procfs显示进程信息,让你可以检查文件,而无需使用ps等工具。

一些Linux软件还希望找到作为系统文件系统可用的硬件信息。

FreeBSD还支持带有mqueuefs的POSIX消息队列文件系统和文件描述文件系统fdescfs。

FreeBSD默认不启用这些文件系统中的任何一个,仅在应用程序需要时加载或装载它们。

运行mount通常需要背后有某种存储设备。但是命名空间没有任何类型的后备存储。mount命令要求在备份存储应该所在的空间中有一个参数。

对于命名空间文件系统,习惯上使用文件系统的类型作为该参数,但实际上mount忽略了该参数。

进程文件系统

进程文件系统procfs将系统的当前进程显示为文件。使用procfs可以让你使用cat和grep等程序收集进程信息,而不是使用ps之类的进程特定工具。

进程信息时安全敏感的(security sensitive),跨操作系统的procfs有着悠久的安全问题历史,因此FreeBSD默认情况下不使用procfs。

procfs中可用的所有信息也可以通过首选的sysctl接口获取。

然而一些附加包,特别是从Linux移植的软件,被设计为使用procfs。

procfs在FreeBSD jail主机上很有用——不是单个jail,而是支持这些jail的操作系统实例。管理这些系统的系统管理员需要procfs。

挂载 procfs(5)

进程文件系统通常挂载在/proc。即使procfs未被挂载,挂载点也存在于默认安装中。以下操作从命令行临时挂载/proc:

要在启动时使FreeBSD挂载/proc,可以在/etc/fstab增加条目:

既然现在有了/proc,那就聊点深入的。

/proc里有什么?

查看/proc显示了一堆编号的目录。每个进程代表一个进程ID,也就是说,进程844的信息在/proc/844中。该目录中的文件归进程所有者所有。每个进程都有不同的文件来表示进程的状态。阅读procfs(5)了解所有痛苦的细节。

奇怪的目录是/proc/curproc。这提供了有关访问/proc/curproc的进程的信息。

程序使用/proc/curproc来检查自己的状态。

如果你使用ls和more等工具以交互方式检查/proc,/proc/curproc将描述该工具的过程。如果你想检查你的shell进程,可以尝试类似 ls /proc/$$ 的命令,shell会在启动子进程之前为你展开它。

进程文件系统公开了操作系统内部。你永远不应该假设一个操作系统的procfs会与另一个系统的procfs匹配。值得注意的是,FreeBSD的procfs与Linux不兼容。

Linux的/proc 和 /sys

FreeBSD的Linux模块允许你在FreeBSD上运行本机Linux软件。

FreeBSD支持多个内核接口,而不是模拟Lunux。FreeBSD将Linux软件引导到Linux界面。一些Linux程序在FreeBSD上的运行速度比在原生Linux上快。

Linux程序希望有一个支持Linux的用户区。在FreeBSD上运行Linux需要在/compat/Linux中拥有Linux用户区的一个子集。同样,一些Linux软件可能需要Linux的/proc,甚至Linux系统文件系统。

Linux /proc

Linux广泛使用/proc。然而,Linux procfs与FreeBSD并不完全兼容。

Linux procfs中的一些文件与FreeBSD的文件同名,但包含不同的信息、遵循不同的格式或涵盖FreeBSD中未使用的概念。

例如,FreeBSD进程文件系统没有/proc/cpuinfo,因为FreeBSD没有bogomips概念;FreeBSD上没有/proc/version,即使有,它也不包含与Linux上/proc/version相同的信息。

FreeBSD包含一个Linux风格的procfs,供需要Linux进程文件系统的软件或在Linux模式下运行的软件使用,linprocfs(5)。linprocfs需要一个内核模块linuxprocfs.ko,当你挂载文件系统时,它会自动加载。

不要在/proc上挂载Linux procfs。可以使用procfs的FreeBSD软件会认为它是FreeBSD procfs。接触Linux procfs会让这些软件感到痛苦。

将Linux procfs挂载到/compat/Linux/proc:

在/etc/fstab中加入一条,使得系统启动时自动挂载Linux的procfs:

FreeBSD的Linux仿真层(emulation layer)转换Linux软件的文件系统,欺骗它,使其在/proc中找到Linux procfs。

Linux /sys

Linux不仅通过文件系统公开进程信息。它还公开了硬件信息。

Linux的/sys文件系统声明了可用的硬件及其配置方式。与/proc一样,某些Linux软件希望在/sys中查找信息并寻找硬件。

如果你使用linsysfs(5)挂载Linux的/sys,你可以在FreeBSD中使用许多只支持Linux的配置软件。

在FreeBSD上,/sys是一个内核源代码的链接。以下命令将Linux的/sys挂载到/compat/linux/sys下:

在/etc/fstab中添加条目以自动挂载Linux的/sys:

当你用Linux特定的软件配置完硬件后,可以抱怨硬件供应商没有提供FreeBSD版本的使用程序。

linprocfs和linsysfs以及FreeBSD原生procfs都构建在名为pseudofs的文件系统层上。

pseudofs是一个内核编程框架,用于呈现每次访问时都会更改的文件系统信息。系统管理从来不直接与pseudofs交互,但偶尔会看到对它的引用。

消息传递文件系统

某些消息传递和进程管理设施也被实现为文件系统或类似文件系统的功能。

最流行的是文件描述符文件系统和POSIX消息队列。只有当应用程序需要这些文件系统时,你才需要它们。

文件描述符文件系统

文件描述符文件系统fdescfs(5)允许进程以文件系统风格访问自己的文件描述符。文件描述符包括:标准输入(描述符0)、标准输出(1)、标准错误(2),以及程序创建的任何描述符。

FreeBSD在/dev/fd下显示了三个标准文件描述符。进程只能在该目录中看到自己的文件描述符。

然而,程序可以创建数十个或数百个文件描述符,如果没有对其描述符的文件系统级访问,一些程序(尤其是java)将无法工作。查看这些额外的文件描述符需要fdescfs(5)。

挂载fdscfs到/dev/fd:

或修改/etc/fstab,添加以下条目:

现在可以用Java了。

POSIX 消息队列

POSIX进程间通信(inter-process communication——IPC)和信号量(semaphore)标准包括命名消息队列。

FreeBSD提供了将这些作为文件系统公开的选项。

使用消息队列需要同时加载消息队列文件系统mqueuefs(5)和信号量内核模块。不需要实际挂载mqueuefs分区;内核模块的存在将允许使用这些队列。

在引导时使用这些loader.conf条目加载模块:

挂载mqueue文件系统可以让你将现有队列视为文件。文件的内容描述了队列的属性。这可能对调试有用。以下示例将mqueuefs挂载到/mnt:

检查队列,找出问题,然后卸载文件系统。

也可以修改/etc/fstab,添加以下条目使得系统启动时自动挂载mqueuefs:

虽然可以手动创建文件来创建POSIX队列,但强烈不建议这样做。

POSIX消息队列是未API使用而设计的,而不是在命令行使用。