伪文件系统

来自百问网嵌入式Linux wiki
Wiki讨论 | 贡献2020年1月10日 (五) 15:46的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

伪文件系统(Pseudo filesystem)

简介

运行时,Linux 操作系统会创建并填充 Linux 分发镜像的 rootfs 文件系统上不存在的一些文件系统:
- 伪文件系统: sysfs (/sys), procfs (/proc), debugfs (/sys/kernel/debug), configfs (/sys/kernel/config), tracefs (/sys/kernel/tracing)
- 临时文件系统:tmppfs (/dev/shm, /run, /sys/fs/cgroup, /tmp/, /var/volatile, /run/user/<id>), devtmpfs (/dev)
伪文件系统包含有关当前正在运行的内核的许多信息、配置和日志。
这些伪文件系统中的信息非常有用,任何调试会话都应从浏览它们开始。
这两个文件系统都是 Linux 操作系统的文件层次结构标准(FHS)的一部分。
由于它们放置在易失性存储器中,因此它们仅在运行时可用,而在关闭时消失。

procfs(/proc)-内核和进程信息

PROCFS [1 ]已启用并准备在所有地 STM32MPU 嵌入式软件分发使用,通过在 Linux 内核配置选项 CONFIG_PROC_FS 默认设置为是。
	Symbol: PROC_FS
	Location:
	  File systems --->
	    Pseudo filesystems -->
	      [*] /proc file system support
请参阅 Menuconfig 或 如何配置内核 一文,以获取有关在分发包上下文中修改配置和重新编译 Linux 内核镜像的说明。
Procfs 有时被称为过程信息伪文件系统。它不包含“实际”文件,而是包含运行时系统信息(例如,系统内存、安装的设备、硬件配置等)。
因此,可以将其视为内核的控制和信息中心。实际上,很多系统实用程序只是对该目录中文件的调用。
例如,"lsmod”与"cat/proc/modules”相同,而"lspci”是"cat/proc/pci”的同义词。通过更改此目录中的文件,你甚至可以在系统运行时读取/更改内核参数(sysctl)。
在Linux文档项目[2 ]或维基百科[3 ]中详细说明了 Procfs 。
名称 描述
/proc/<PID>/ 该目录包含有关内核进程< PID >的信息
/prod/cmdline 提供引导选项传递给内核
/proc/cpuinfo 提供有关处理器的信息:其类型,制造商,型号和性能
/proc/device 列出了当前正在运行的系统上可用的所有设备(分为“块”和“字符”类别),也给出了/ dev名称的主要部分
/proc/device-tree 包含有关设备树源文件中定义的所有节点的设备树信息
/proc/interrupts 显示正在使用的中断,以及每个中断有多少个
/proc/iomem 提供有关你存映射的信息
/proc/kallsyms 包含动态内核符号表
/proc/kmsg 保留内核输出的消息
/proc/meminfo 包含内核如何管理其你存(物理你存和交换你存)的摘要
/proc/misc 杂项信息,还列出了杂项功能设备
/proc/modules /proc中最重要的文件之一;包含当前加载的内核模块的列表。它提供了一些依赖性的指示。

sysfs(/sys)-系统文件系统

Sysfs [4 ]是最初基于ramfs的基于RAM的文件系统。它提供了一种将内核数据结构,它们的属性以及它们之间的链接导出到用户空间的方法。
通过 Linux 内核配置选项 CONFIG_SYSFS,Sysfs已启用并准备在所有STM32MPU嵌入式软件发行版中使用,默认情况下设置为yes。
	Symbol: SYSFS
	Location:
	  File systems --->
	    Pseudo filesystems -->
	      [*] sysfs file system support
请参阅Menuconfig或 如何配置内核 一文,以获取有关在分发包上下文中修改配置和重新编译Linux内核镜像的说明。
在如何访问sysfs中的信息中也提供了有用的信息。

顶层 sysfs 目录布局

Sysfs目录安排公开了内核数据结构的关系。
/sys有一个子层次结构的文件系统:
子目录 描述
/sys/block/ 对于系统上已发现的每个块设备,包含一个符号链接。符号链接指向/ sys/devices下的相应目录。
/sys/bus/ 内核中每种总线类型都包含一个子目录。每个总线的目录包含两个子目录: ./设备/ ./驱动程序/
/sys/class/ 包含系统中已注册的每个设备类别(例如,终端,网络设备,块设备,图形设备,声音设备等)的其他子目录的单层。在这些子目录的每个你部都有该类中每个设备的符号链接。这些符号链接引用/ sys/devices目录中的条目
/sys/class/net/ 此目录中的每个条目都是一个符号链接,代表实际或虚拟网络设备之一,该设备在访问该目录的进程的网络名称空间中可见。这些符号链接中的每一个都引用/ sys/devices目录中的条目
/sys/dev/ 该目录包含两个子目录block /和char /,分别对应于系统上的block和character设备。在这些子目录的每个你部都有符号链接,其名称格式为major-ID:minor-ID,其中ID值对应于特定设备的主要和次要ID。每个符号链接都指向设备的sysfs目录。因此,/ sys/dev中的符号链接提供了一种简单的方法,可以使用通过调用stat工具(或类似工具)返回的设备ID 来查找sysfs接口。
/sys/devices/ 包含内核设备树的文件系统表示,这是内核中设备结构的层次结构
/sys/firmware/ 包含用于查看和操作特定于固件的对象和属性的界面
/sys/fs/ 包含某些文件系统的子目录。仅当文件系统选择显式创建子目录时,它才会在此处具有子目录
/sys/kernel/ 包含各种文件和子目录,这些文件和子目录提供有关正在运行的内核的信息
/sys/module/ 每个加载到内核的模块都包含一个子目录。每个目录的名称就是模块的名称

缩放到debugfs(/sys/kernel/debug)

请参考debugfs文章

缩放到configfs(/sys/kernel/config)

请参考configfs文章

缩放到tracefs(/sys/kernel/tracing)

Tracefs与 Linux 内核跟踪框架一起使用。
Ftrace文章中给出了用法示例。
挂载tracefs的命令:
	Board $> mount -t tracefs nodev /sys/kernel/tracing
要找出可用的跟踪器,只需阅读跟踪目录中的available_tracers文件:
	Board $> cat /sys/kernel/tracing/available_tracers
	 function_graph function nop
内核构建配置可以添加更多的跟踪器。请参考Ftrace#More_tracers段落。

有关临时文件系统的信息

tmpfs

Tmpfs [5 ]是一个文件系统,它将所有文件保留在虚拟内存中。
通过Linux内核配置CONFIG_TMPFS,它已启用并准备用于所有STM32MPU嵌入式软件发行版,默认情况下设置为yes。
	Symbol: TMPFS
	Location:
	  File systems --->
	    Pseudo filesystems -->
	      [*] Tmpfs virtual memory file system support (former shm fs)
请参阅Menuconfig或如何配置内核一文,以获取有关在分发包上下文中修改配置和重新编译Linux内核镜像的说明。


从某种意义上讲,tmpfs中的所有内容都是临时的,不会在你的硬盘上创建任何文件。如果卸载tmpfs实例,则其中存储的所有内容都会丢失。
在目标板上,你可以使用tmpfs检查目录路径安装:
	Board $> mount | grep tmpfs
	tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
	tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
	tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
	tmpfs on /tmp type tmpfs (rw,nosuid,nodev)
	tmpfs on /var/volatile type tmpfs (rw,relatime)
	tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=43812k,mode=700)
有关所有详细信息,你可以参考有关tmpfs [5 ]的Linux文档。

devtmpfs

通过 Linux 内核配置 CONFIG_DEVTMPFS 和 CONFIG_DEVTMPFS_MOUNT 将 Devtmpfs 启用并准备在所有 STM32MPU 嵌入式软件发行版中使用,默认情况下设置为 yes。
	Symbol: DEVTMPFS
	Location:
	  Device Drivers --->
	    Generic Driver Options -->
	      [*] Maintain a devtmpfs filesystem to mount at /dev

	Symbol: DEVTMPFS_MOUNT
	Location:
	  Device Drivers --->
	    Generic Driver Options -->
	      [*] Maintain a devtmpfs filesystem to mount at /dev
	        [*] Automount devtmpfs at /dev, after the kernel mounted the rootfs
/dev-特殊或设备文件
Devtmpfs挂载在 /dev 上,这是特殊文件或设备文件的位置。其中许多是在启动时甚至在运行时生成的。
这是一个非常有趣的目录,突出了Linux文件系统的一个重要方面:一切皆文件或目录。
浏览该目录,你可以看到代表系统第一个主驱动器上各个分区的设备文件系统条目:
例如:
mmcblk0p < id >(microSD卡),
mmcblk1p < id >(eMMC),
sda < id >,
sdb < id >(NAND或USB密钥),
ttySTM < id >(tty串行链接),
等等...
这些条目既可以读取也可以写入。
以/ dev/ttyUSB0为例。该文件表示USB串行端口。通过向/ dev/ttyUSB0发送数据和从中读取数据,你可以通过minicom应用程序(或等效程序)与主机PC进行通信。
/dev非常有用,更多信息可以在Linux Documentation Project [6 ]中找到。