其中有许多文件/proc
,如、/proc/cpuinfo
等,打开时会返回系统信息。/proc/meminfo
/proc/devices
这些文件似乎在现实中不存在,因为运行file
上面只写着它们是空的。
$ file /proc/cpuinfo
/proc/cpuinfo: empty
这些文件究竟是如何工作的?
答案1
它实际上非常简单,至少如果你不需要实现细节的话。
首先,在 Linux 上,所有文件系统(ext2、ext3、btrfs、reiserfs、tmpfs、zfs 等)都是在内核中实现的。有些可以通过 FUSE 将工作卸载到用户空间代码,有些则仅以内核模块的形式出现(原生 ZFS由于许可限制,这是后者的一个显著例子),但无论如何,内核组件仍然存在。这是一个重要的基础。
当程序想要读取文件时,它会发出各种系统库调用,这些调用最终会以open()
、read()
、close()
序列的形式进入内核(可能还会seek()
附加 )。内核获取提供的路径和文件名,并通过文件系统和设备 I/O 层将它们转换为物理读取请求(在许多情况下,也转换为写入请求 - 例如 atime 更新),发送到某些底层存储。
然而,它不需要将这些请求专门翻译成身体的,持久的贮存内核的约定是,发出该组特定的系统调用将提供相关文件的内容。“文件”在我们的物理领域中究竟存在于何处则是次要的。
通常/proc
,会挂载所谓的procfs
。这是一种特殊的文件系统类型,但由于它是一个文件系统,因此它与挂载在某处的文件系统实际上没有什么不同ext3
。因此,请求会传递给 procfs 文件系统驱动程序代码,该代码知道所有这些文件和目录并从内核数据结构返回特定信息。
在这种情况下,“存储层”是内核数据结构,它procfs
提供了一个干净、方便的接口来访问这些数据结构。请记住,将 procfs 挂载到/proc
只是惯例;您也可以轻松地将其挂载到其他地方。事实上,有时会这样做,例如在 chroot jails 中,当在那里运行的进程出于某种原因需要访问 /proc 时。
如果您将一个值写入某个文件,它的工作方式是相同的;在内核级别,这会转换为一系列open()
、、、调用seek()
,这些调用再次传递给文件系统驱动程序;同样,在这种特殊情况下,是 procfs 代码。write()
close()
file
您看到返回的具体原因empty
是 procfs 公开的许多文件都公开了大小为 0 字节。0 字节大小可能是内核方面的优化(/proc 中的许多文件都是动态的,长度很容易变化,甚至可能从一次读取到下一次读取,并且计算每次目录读取时每个文件的长度可能会非常昂贵)。 按照这个答案的评论,您可以通过 strace 或类似工具在自己的系统上进行验证,file
首先发出一个stat()
调用来检测任何特殊文件,然后抓住机会,如果文件大小报告为 0,则中止并报告文件为空。
这种行为实际上是有记录的,可以通过指定-s
或--special-files
在file
调用时覆盖,尽管手册页中指出这可能会产生副作用。下面的引文来自 2011 年 10 月 17 日的 BSD file 5.11 手册页。
通常,file 仅尝试读取并确定 stat(2) 报告为普通文件的参数文件类型。这可以防止出现问题,因为读取特殊文件可能会产生特殊后果。指定该
-s
选项会导致 file 还读取块或字符特殊文件的参数文件。这对于确定原始磁盘分区中数据的文件系统类型(即块特殊文件)很有用。 此选项还会导致文件忽略 stat(2) 报告的文件大小因为在某些系统上它会报告原始磁盘分区的大小为零。
答案2
在此目录中,您可以控制内核如何查看设备、调整内核设置、将设备添加到内核并再次删除它们。在此目录中,您可以直接查看内存使用情况和输入/输出统计数据。
您可以查看安装了哪些磁盘以及使用了哪些文件系统。简而言之,如果您知道要查找什么,则可以从此目录检查 Linux 系统的每个方面。
该/proc
目录不是普通目录。如果您从启动 CD 启动并查看硬盘上的该目录,您会看到它是空的。当您在正常运行的系统下查看它时,它可能非常大。但是,它似乎没有使用任何硬盘空间。这是因为它是一个虚拟文件系统。
由于/proc
文件系统是虚拟文件系统并且驻留在内存中,因此/proc
每次 Linux 机器重新启动时都会创建一个新的文件系统。
换句话说,它只是一种通过文件和目录类型接口轻松窥探 Linux 系统内部的手段。当您查看目录中的文件时/proc
,您实际上是在直接查看 Linux 内核中的一段内存并查看它可以看到的内容。
文件系统的层
例子:
- 在 中
/proc
,每个正在运行的进程都有一个目录,以其进程 ID 命名。这些目录包含有关进程的有用信息的文件,例如:exe
:这是指向启动该进程的磁盘文件的符号链接。cwd
:这是指向进程工作目录的符号链接。wchan
:读取时,返回进程所在的等待通道。maps
:读取时返回进程的内存映射。
/proc/uptime
以秒为单位返回正常运行时间作为两个十进制值,中间用空格分隔:- 自内核启动以来的时间。
- 内核空闲的时间。
/proc/interrupts
:有关中断的信息。/proc/modules
:获取模块列表。
答案3
你说得对,它们不是真正的文件。
简单来说,它是一种使用常规读写文件方法与内核对话的方式,而不是直接调用内核。它符合 Unix 的“一切皆文件”理念。
这些文件/proc
实际上并不存在于任何地方,但内核会对您在其中读取和写入的文件做出反应,它不会写入存储,而是报告信息或执行某些操作。
类似地, 中的文件/dev
并不是传统意义上的真正文件(尽管在某些系统上 中的文件/dev
可能实际上存在于磁盘上,但除了它们引用的设备之外,它们与它们没有太多关系) - 它们使你能够使用普通的 Unix 文件 I/O API 与设备通信 - 或者使用它的任何设备,如 shell
答案4
目录里面/proc
有两种类型的内容,第一是编号目录,第二是系统信息文件。
/proc
是一个虚拟文件系统。例如,如果您执行ls -l /proc/stat
,您会注意到它的大小为 0 字节,但如果您执行“cat /proc/stat”,您将看到文件内的一些内容。
执行ls -l /proc
,你会看到很多只有数字的目录。这些数字代表进程 ID (PID)。这个编号目录中的文件对应于具有该特定 PID 的进程。
在 下可用的某些文件/proc
包含系统信息,例如 cpuinfo、meminfo 和 loadavg。
一些 Linux 命令会从这些文件中读取信息/proc
并显示出来。例如,自由的命令,从文件中读取内存信息/proc/meminfo
,并格式化,并显示。
要了解有关单个/proc
文件的更多信息,请执行“man 5 FILENAME”。
/proc/cmdline – Kernel command line
/proc/cpuinfo – Information about the processors.
/proc/devices – List of device drivers configured into the currently running kernel.
/proc/dma – Shows which DMA channels are being used at the moment.
/proc/fb – Frame Buffer devices.
/proc/filesystems – File systems supported by the kernel.
/proc/interrupts – Number of interrupts per IRQ on architecture.
/proc/iomem – This file shows the current map of the system’s memory for its various devices
/proc/ioports – provides a list of currently registered port regions used for input or output communication with a device
/proc/loadavg – Contains load average of the system
The first three columns measure CPU utilization of the last 1, 5, and 10 minute periods.
The fourth column shows the number of currently running processes and the total number of processes.
The last column displays the last process ID used.
/proc/locks – Displays the files currently locked by the kernel
Sample line:
1: POSIX ADVISORY WRITE 14375 08:03:114727 0 EOF
/proc/meminfo – Current utilization of primary memory on the system
/proc/misc – This file lists miscellaneous drivers registered on the miscellaneous major device, which is number 10
/proc/modules – Displays a list of all modules that have been loaded by the system
/proc/mounts – This file provides a quick list of all mounts in use by the system
/proc/partitions – Very detailed information on the various partitions currently available to the system
/proc/pci – Full listing of every PCI device on your system
/proc/stat – Keeps track of a variety of different statistics about the system since it was last restarted
/proc/swap – Measures swap space and its utilization
/proc/uptime – Contains information about uptime of the system
/proc/version – Version of the Linux kernel, gcc, name of the Linux flavor installed.