文件系统,是对磁盘数据进行组织和管理的一种机制。
可通过装载,以目录和文件的形式向用户层呈现。但,文件和目录其实只是文件系统的前端而已,只是文件系统的用户视图,其本质还在于这样的一个数据结构:inode。
那纯粹从inode角度来描述一个文件系统,会是什么情况?
伪文件系统,就是这样的一种表示,它不能装载,不可能从用户空间看到,但它不会带来任何的信息损失。看不到,不等于它不存在。
伪文件系统,包括1)负责管理块设备inode的bdev;2)负责处理管道的pipefs;3)处理套接字的sockfs; 这些都出现在 /proc/filesystems中。
伪文件系统对于内核来说,就是一个普通的文件系统,按通用方法来使用即可,对于用户来说,他不存在.
所有表示块设备的inode都保存在伪文件系统 bdev中,这些对用户层不可见。这使得可以使用标准的VFS函数,来处理块设备inode。
读取一个文件,首先必须确定文件块所属的磁盘块,也就是文件的元数据。由get_block函数(针对不同文件系统,有不同实现,祼设备也其对应函数),而这种对应关系会记录在buffer_head中,它记录了磁盘块和文件块之间的映射关系。读到的文件的元数据会缓存到该文件对应的块设备block_device的地址空间address_space,如果下次再读到同一文件,其元数据就可以从该文件对应bdev的cache中取得了。
如果,我们直接对块设备文件(如/dev/sdx)进行读写,那么块设备文件也会被缓存到内存中其对应的基树address_space中。对bdev这种特殊文件来说,其不光缓存常规文件的元数据,也会缓存真实的数据,dd命令就是这种应用。
可以通过dd if=/dev/sda of=/tmp/dest bs=1 count=4096命令,然后用free来查看cache的变化,记住在执行上述命令之前首先通过sysctl -w vm.drop_caches=3来清空文件的cache。对于文件系统层的代码来看,它根本不管你是块设备还是常规文件或者是一个字符设备文件,它只要你提供file_operations函数集合而不会平白无故给与任何文件系统以特权。