Linux文件系统

  1. linux文件系统
    1. inode 与 数据块
    2. 实战
    3. 参考资料

linux文件系统

在linux中一切皆文件,事实上并不是这样的,linux中有个VFS虚拟文件系统,对上层来说,一切皆文件,但是下层,每种设备类型有他自己的操作方式。
这里以磁盘举例主要是参考APUE,然后外加一些其他资料。

如下图,这是磁盘与文件系统关系 (APUE 4.14)
Alt text

inode 与 数据块

这里主要说Inode节点与数据块的关系。
首先,inode节点是什么,为什么需要inode节点。
实现控制信息与实际数据块的分离。并不是必须是这样的,不过linux中是这样的,在linux中移动一个文件速度是很快的,因为这里不需要实际的移动数据块,只是需修改指向。
renaming a file means removing its directory entry from the directory that contains it, and creating a directory elsewhere.
inode 节点主要包含了文件的有关信息,文件类型,文件访问权限位,文件长度,指向文件所占用的数据块的指针等。
数据块:实际存储的信息的地方,数据块包含了 普通文件数据块与目录块。

下图是 inode节点与普通文件的关系。这里需要注意了,一个文件对应了一个inode节点,但是一个inode节点可能指向了多个数据块(根据文件大小来定,有多少个数据块),这就是为什么linux不会产生磁盘碎片的原因。
Alt text

下图是 inode节点与目录块的关系。
Alt text
APUE中牵扯到一个名词 目录项,一直很费解,不太懂什么意思,英文原版是 directory entries 目录条目的意思。
目录项: 路径中的每一部分都被称作目录条目,”/home/wolfman/butter”是文件路径的一个例子,根目录/,目录home,wolfman和文件butter都是目录条目,这些统称为目录项。 其实应该理解为目录条目,他跟目录项对象有关联但不等价。
这里需要解释下了,一个目录块中起码保存了两个目录项,一个是. 指向自己的inode节点,另一个是..指向的父目录节点,如果还有其他文件或者目录,会对应添加目录项。
自己的目录块中记录的没有自己目录项应对名称(如果算的话. 这个目录项算是),这个是在父目录块中记录的。如上图的testdir的inode节点是2549, 对应的目录项只有.与..,父目录项中记录的有 2549<—–>testdir 的目录项。

下图是inode节点的结构
Alt text
(声明这个是盗的图)

最重要的就是里边的直接块指针,指向了存储数据的数据块。
这里有一个巧吧,当数据块比较小时候,直接用 直接块指针 就能寻址,达到快速访问。
本质上讲文件系统是特殊的数据分层存储结构,它包含文件、目录和相关的控制信息。
unix使用了四种和文件系统相关的传统抽象概念: 文件,目录项,索引节点,和安装点。
–《linux内核设计与实现》
这里指,文件系统操作的是 把磁盘中的数据加载到内存,形成不同的数据结构,在这里比如 索引节点
索引节点,会加载对应文件的i节点信息到inode对象,inode类型的对象会有inode对象的操作,struct inode_operations *i_op中记录了 一些列可以对inode节点操作的函数,比如创建文件,link,unlink等等。

文件的查找实质是通过 内核中的 目录项对象 来找的。

比如调用write函数有如下顺序
write(用户层)==>sys_write(系统调用)==>vfs_write(内核层)==>__vfs_write==>f_op->write
对上层来说不管是socket还是文件描述符,统统调用write,下层根据不同类型,调用不同的操作。OO思想。

实战

看了上图难免有点看不懂,APUE就是这吊样(虽然是圣经级别),但全都点到为止,其他全靠悟。
这里举例演示下。

比如有如下一个文件 1.txt,内容如下

    hello world

此时会有一个inode节点与其对应,假设为101节点,并且你在创建文件的目录中的目录块会添加一个一行记录(记录文件名,与inode节点号)

ls dir

  1. 查看目录项 找到1.txt文件名称

ls -l dir/1.txt

  1. 查看目录项 找到1.txt文件名称。
  2. 根据1.txt文件名,找1.txt的inode节点号。
  3. 根据inode节点中的信息显示文件相关控制信息。

cat 1.txt 会执行一下顺序

  1. 查看目录项 找到1.txt文件名称。
  2. 根据1.txt文件名,找1.txt的inode节点号。
  3. 根据inode节点,找出数据块标号。
  4. 读取数据块编号信息。

参考资料

apue
linux/unix 系统环境编程手册
linux内核设计与实现
https://www.youtube.com/watch?v=oHrlU3b1ZAw


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 68813175@qq.com