Linux文件系统
Linux作为开源操作系统, 最大的优势是它可以支持各类文件系统。现代的Linux内核能够支持几乎每种文件系统, 从基础的FAT,Ext2、 Ext3和ReiserFS,到高性能的日志文件系统(JFS)都能可以。
Linux作为开源操作系统, 最大的优势是它可以支持各类文件系统。 现代的Linux内核能够支持几乎每种文件系统, 从基础的FAT,Ext2、 Ext3和ReiserFS,到高性能的日志文件系统(JFS)都能可以。
一、虚拟文件系统
虚拟文件系统(VFS)是一个处于用户进程和各类文件系统之间的抽象接口层, VFS提供访问文件系统对象的通用对象模型(例如, i-node、 文件对象、 页缓存、 )和方法, 它对用户进程隐藏了各种文件系统的差别。 正是因为有VFS,所以用户进程不用关心使用的是那种文件系统, 也更不需要知道各个文件系统应该使用哪个系统调用。 下图显示了VFS的概况。

二、Ext2文件系统
Ext2文件系统是Ext3的前身。 和大多数现代文件系统不一样, Ext2是一个简单和快速的文件系统, 没有日志功能。
下图展示了Ext2的文件系统数据结构, 文件系统由一个引导扇区(boot sector)开始, 后面跟着块组(blockgroups)。 整个文件系统被分成许多小块组来获得高性能, 因为i-node表和保存用户数据的数据块驻留在较前的磁盘, 所以节约寻址时间。 一个块组包含如下项目:
1. + 超级块(Super block) 磁盘上信息存放在这里, 超级块的副本保存在每个块组的顶部。
2. + 块组描述符(Block group descriptor) 块组的信息存在这里
3. + 数据块位图(Data block bitmaps) 空闲块管理
4. + i-node位图(i-node bitmaps) 空闲i-node管理
5. + i-node表(i-node tables) 存放i-node表。 每个文件都有相应的i-node表, 存放文件的元数据, 譬如文件模式、 uid、 gid、 atime、 ctime、 mtime、 dtime和数据块的指针。
6. + 数据块(Data blocks) 存放真正的用户数据。

先搜索文件的i-node。 在接到进程打开/var/log/messages文件的请求时, 内核分析文件路径, 然后搜索/(根目录)的条目, 其中包含了它自己目录下的文件和目录信息。 这时候, 内核会找到/var目录的i-node, 然后再来看看/var目录, 它也有它自己目录下的文件和目录的信息。 内核会一直执行上面的过程, 直到找到/var/log/messages文件的i-node。 Linux内核使用对象缓存, 比如目录条目缓存或者i-node缓存来加速寻找i-node的过程。
一旦内核找到了文件的i-node, 然后就试着访问真正的用户数据块。 如前面解释的那样, i-node有数据块的指针。参照它, 内核就能获得数据块了。 对于大文件来说, Ext2提供到数据块的直接/非直接参照。

三、 Ext3文件系统
现在, Linux的企业发行版都已经支持Ext3(Extended 3)文件系统, 它是被广泛使用的Ext2的更新版本。 Ext3和Ext2的基本结构是相似的, 主要区别是Ext3支持日志。 Ext3有如下亮点:
可用性: Ext3采用一致性的方式把数据写入磁盘, 所以, 当系统出现意外宕机(断电或者系统崩溃), 服务器再次启动时不用检查数据的一致性。 可以把系统恢复时间从几小时缩短到几秒钟!
数据完整性: 在mount命令中使用data=journal打开日志记录模式, 所有的数据, 包括文件和元数据都会记录日志!
速度: 通过指定日志模式data=writeback, 你可以在你的业务场景下, 在速度和完整性之间做权衡。 在有大量同步写的时候, 这个效果会十分显著。
灵活性: 把现有的Ext2很简单就能升级到Ext3, 而且不用重新格式化。 通过执行tune2fs命令和修
改/etc/fstab文件, 你能够很简单的把Ext2升级到Ext3文件系统!同样, 在关掉Ext3日志的情况下, Ext3能够作为Ext2文件系统进行挂载。 很多第三方工具都能修改Ext3的文件系统!例如, PartionMagic能够修正Ext3分区。
日志模式:
Ext3支持3种日志模式
日志(journal): 通过记录文件数据和元数据, 这个模式提供了最高的数据一致性。 它的性能消耗也是最大的。
有序(ordered): 该模式下只记录元数据。 然而, 优先保证写入文件数据!
回写(writeback): 这个日志选项提供最快的数据访问能力, 但是牺牲了数据的一致性!保证数据一致性的元数据也会被记录, 但是没有处理确定的文件数据, 在系统崩溃的时候, 这可能导致旧的数据出现在文件中。
四、日志系统
在非日志文件系统上, 当执行写操作时, 内核先修改文件系统的元数据, 然后写入实际的用户数据。 这个操作可能会丢失数据的完整性。 如果在写入文件系统元数据的时候系统突然崩溃, 文件系统的一致性就可能被破坏。 fsck会在下次启动时检查所有的元数据, 并修复文件系统上的不一致,。
但是如果卷特别大的时候, 这个修复过程就会变得很漫长, 只能干等着fsck工作完之后才能使用这系统。 日志文件系统解决了这个问题, 在写入实际的文件系统之前, 它先把要修改的数据写入一个叫做日志区域(journal area)的地方。 日志区域可以在文件系统上, 也可以不在文件系统上。 写入日志区域的数据叫做日志记录(joutnal log)。
如果系统支持的话, 它内容包括文件系统元数据和真正的文件数据。 因为在写入真正用户数据之前要写记录日志, 和非日志文件系统相比会产生性能开销。 维护数据高度一致性所牺牲的性能开销大小, 取决于在写入用户数据之前要写入多少信息到磁盘上。
参考:
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)