文件系统是
为了处理信息的,以目录的方式展示这些信息,并供用户增删改查
且用户的接口是文件名
信息存储在内核之中:sysfs,procfs,rootfs,devtmpfs
信息存储在内核之外:
存储在 网络 : nfs cifs
存储在 硬盘 : ext2/3/4 ntfs
从流程去熟悉
1. 挂载 : 涉及到 super_block
2. 文件操作 : 涉及到 inode
3. search及真实文件系统中层级目录的维护 : 涉及到 dentry
4. 文件IO : 涉及到 file
每个流程(例如挂载都会涉及到)
1. VFS
2. 真实文件系统(sysfs或者nfs或者ext2)
- linux运行时 , 文件系统在哪里 与 文件系统访问加速
如果是 sysfs , 则 只在本机内存中
如果是 nfs , 则在 本机内存中和 服务器端硬盘
如果是 ext4, 则在 本机内存中 和 本机硬盘
对于 ext4 这些硬盘文件系统来讲
内存访问比硬盘访问快
所以打算将硬盘上的整个文件系统加载到内存中
但是内存空间比硬盘小
所以实现中会将硬盘上的部分信息加载到内存中
因为同样的信息在内存和硬盘上是两份,且我们会改动内存中的信息
所以需要用同步机制来保证内存和硬盘中文件系统相关信息的一致
文件系统加速涉及到
super_block
dentry
inode
address_space
file
文件系统 访问实例
- 从文件名(/home/pop/xxx/yyy/my_file)到文件内容
1."/" -> inode
一开始是/,可以直接获取 根目录的inode号码
2. inode -> dentry
inode之后,读取该inode通常在高速缓冲中,然后根据其磁盘块指针(应该是很小的,直接指针,找到对应的磁盘块,理论上应该也在高速缓冲中),从这里面就可以获取到目录表项,
3. dentry -> inode
然后查询两个/之间的那个文件的名称,如果有,再看下当前进程的用户是否有权限搜索、读取目录等,类似于权限控制,如果有的话,就把这个节点的inode号得到
4. 重复 2 和 3 ,直到找到 目标对象(在这里为my_file)的inode (目标对象可以是目录文件和普通文件和其他类型文件)
以 /home/pop/xxx/yyy/my_file 为例
"/" -> "/"的inode -> "/" 的dentry ->
"home"的inode -> "home" 的dentry ->
"pop"的inode -> "pop" 的dentry ->
"xxx"的inode -> "xxx" 的dentry ->
"yyy"的inode -> "yyy" 的dentry ->
"my_file"的inode-> "my_file" 的地址块,大小,权限