不管最底层的文件系统是什么样的,我们的最顶层用户端都可以通过系统调用接口(open、write、read等)或者glibc接口(fopen、fwrite、fread等)来访问文件系统中的文件,真正实现了万物皆文件。
真实文件系统
真正的文件系统其实是实际存储设备的文件系统,挂载在EEPROM、Nor FLASH、NAND FLASH、eMMC等存储器中。
1. ext2
EXT2是第二个扩展文件系统(简称ext2),是早期Linux内核使用的文件系统。但随着技术的发展,ext2文件系统已经不再被推荐。ext2是一个非日志文件系统。
2.ext3
EXT3是第三代扩展文件系统(简称ext3),是一种日志文件系统。主要特点:
3. ext4
EXT4是第四个扩展文件系统(简称ext4),是一个日志文件系统,是ext3文件系统的后继者。主要特点:
伪文件系统
Linux内核提供了sysfs、procfs、devtmpfs等伪文件系统,伪文件系统存在于内存中,不占用硬盘,它们以文件的形式向用户提供一些系统信息,用户可以通过读写这些文件来读取和修改一些系统信息。
1. procfs
procfs 是进程文件系统的缩写,其中包含一个用于通过内核访问进程信息的伪文件系统(启动时动态生成的文件系统),此文件系统通常挂载到 /proc 目录下。
由于/proc不是真正的文件系统,因此它不占用存储空间,而只占用有限的内存。
/proc目录的内容如下:
其中,以数字命名的文件夹是与进程相关的部分,这些数字是进程的PID号。
我们可以访问系统信息,比如读取CPU相关的信息:
检查内核支持的文件系统类型:
可以看到,内核支持很多文件系统,上面的文件系统汇总只列出了一小部分,其他的感兴趣的朋友可以自行了解。
我们可以从/proc目录中了解到很多信息,其他信息大家可以自行尝试查看。
2. sysfs
Sysfs 是一个基于内存的文件系统,以文件的形式向用户程序提供内核信息。sysfs 文件系统挂载在 /sys 挂载点上。/sys 目录的内容如下:
在上一篇文章中,我们分享了可以通过读取 /sys/devices/virtual/thermal/thermal_zone0 下的临时文件来获取 CPU 温度。
相比于proc,sysfs有很多优点,其中最重要的就是设计清晰,sysfs的设计原则是一个属性文件只做一件事,sysfs的属性文件一般只有一个值,直接读或者写。
整个 /proc/scsi 目录在 2.6 内核中已被标记为过时(LEGACY),其功能已完全被相应的 /sys 属性文件取代。新设计的内核机制应尽可能使用 sysfs 机制,而将 proc 保留为纯粹的“进程文件系统”。
3. devtmpfs
devtmpfs的作用是在Linux内核启动初期创建一个初步的/dev,这样一般的启动程序就不必等待udev(udev是Linux内核2.6系列的设备管理器,它的主要功能是管理/dev目录下的设备节点。),缩短了GNU/Linux的启动时间。
在 devtmpfs 出现之前,/dev/ 下的设备节点大概都是由 udev-daemon 使用 mknod 程序创建的或者在接收到内核事件后直接调用 mknod() 系统调用创建的。 现在 udev 基本已经不用了,几乎所有的设备文件(比如 /dev/sda1)都是由内核直接创建的。
在之前的 hello 驱动和 LED 驱动实验中,我们动态加载驱动之后,会在 /dev 目录下生成一个对应的节点,我们可以在应用程序中通过操作这个节点来间接控制我们的 LED:
再次体现了Linux一切皆文件的概念。
相关笔记推荐:
网络文件系统
NFS(网络文件系统)是一种网络文件系统,它允许用户像使用自己的计算机一样访问网络上其他地方的文件。它的工作原理是采用客户端/服务器架构:
服务器程序为其他计算机提供对文件系统的访问,这个过程称为导出。当 NFS 客户端程序访问共享文件系统时,它会将它们从 NFS 服务器“传输”出去。
文件通常都是以块为单位进行传输的,在我们的嵌入式Linux中,NFS的主要应用就是将主机上的文件(比如目标板的可执行文件)共享给目标板,这样就可以非常方便的在目标板上运行程序了。比如我们之前笔记中的实验框图:
以上就是本次笔记的分享,如有错误,还请指出,谢谢!本次我们重点分享几个比较重要的文件系统,了解这些文件系统,对我们学习嵌入式Linux会很有帮助。