一直想写有些关于文件系统的博文,但是由于近一年来实在太忙,所以没有时间写。前几日赶上放国庆节假期,回来后又正好处在RHEL-6.6刚发布,RHEL-7.1还没有开始繁重工作的阶段,所以抽出一些时间准备写一些东西。不知道是否能坚持长久,可能在忙起来后会拖后进度吧。反正也不着急,慢慢写。
既然要分析就要选择一个确定的linux版本进行说明,目前最新的linux稳定版是3.16.3,就选这个内核了。之后的文章都以这个版本为基础。
研究linux fs的入手点应该是哪呢?可能仁者见仁,智者见智。我一直以来也都是零零散散的翻阅着有关super block, inode, dentry, file等等内容的各种代码和资料,但是知识始终是散乱的,无法拼凑成完整的体系。现在我要试图整理顺一个整套的文件系统知识,我决定从file_system_type入手。
本文是要尽力将我已经掌握的分块的知识串连起来,所以至少了解linux vfs的几个结构是必须的,super_block, inode, dentry, file等。
在include/linux/fs.h里定义着几个基本数据结构——block_device, file_system_type, inode和file。其中block_device一般和块设备操作,如硬盘、分区等有关,文件系统的操作多半都会反映到硬盘等块设备上的操作,如读取super block、读写数据等,所以block_device掌管着文件系统的底层设备。由于我们从file_system_type开始研究,所以这里先不管block_device。
来看file_system_type的结构:
struct file_system_type {
const char *name;
int fs_flags;
#define FS_REQUIRES_DEV 1
#define FS_BINARY_MOUNTDATA 2
#define FS_HAS_SUBTYPE 4
#define FS_USERNS_MOUNT 8 /* Can be mounted by userns root */
#define FS_USERNS_DEV_MOUNT 16 /* A userns mount does not imply