Linux 文件系统 inode

在linux系统中,每一个目录或者文件都会被分配一个 inode 与 block。inode的内容在记录档案的权限与相关属性,至于block区块则是在记录档案的实际内容。

inode 存储的数据:

  • 文件的访问模式(r/w/x)
  • 文件所有者和组(owner/group)
  • 文件大小
  • 文件创建或状态改变的时间(ctime)
  • 最近一次的读取时间(atime)
  • 最近修改的时间(mtime)
  • 定义文件特性的标志(flag)
  • 文件真正内容指向的数据块(pointer)
  • 原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);

  • 每个block 内最多只能够放置一个档案的资料;

  • 如果档案大于block 的大小,则一个档案会占用多个block 数量;

  • 若档案小于block ,则该block 的剩余容量就不能够再被使用了(磁碟空间会浪费)。

那么我们时如何访问到一个文件的呢?

由于目录树是由根目录开始读起,因此系统透过挂载的资讯可以找到挂载点的inode 号码,此时就能够得到根目录的inode 内容,并依据该inode 读取根目录的block 内的档名资料,再一层一层的往下读到正确的档名。

举例来说,如果我想要读取/etc/passwd 这个档案时,系统是如何读取的呢?首先我们通过以下命令着目录与文件所在的 inode 号码。

root@:~ $ ll -di / /etc /etc/passwd
   2 drwxr-xr-x 23 root root 4096 Feb  5 06:44 //
 283 drwxr-xr-x 94 root root 4096 Mar  1 06:14 /etc/
1269 -rw-r--r--  1 root root 1566 May 22  2018 /etc/passwd

想要找到/etc/passwd 先找到 / 的 inode 号为 2, inode 有 r x 权限所以可以去访问该 inode 指向的 block 的数据,然后找到/etc 的inode号。而 etc 的inode号码为 283,所以找到这个 inode,然后通过再找到 passwd 的 inode 最后找到文件的block过程如图所示:

image

关于 symbol link 与 hard link 的区别

symbol link 的命令

ln -s src_file_path des_file_path

Symbolic link就是在建立一个独立的文件,而这个文件的内容是它说链接的那个文件的路径。

例如:

ls -s /etc/aabbcc ./abc

如果我们访问 ./abc 事实上是会去访问 /etc/aabbcc 这个文件,而当这个文件被删除时,系统就会报错。

hard link 的命令

而hard命令则不同,hard link 只是在某个目录下的一条文件连结到某inode号码的关连记录而已。所以不管目标文件在原目录下如何修改名字或者删除,由于存储在file的名字只是与目录的block里面记录的数据相关,通过所以在当前目录下链接,你还是能够找到这个文件。并且 hard link 的文件除非将指向这个 inode 的所有链接都删除了其才会被删除。这个有点像 python 对象里面的引用计数。

两者的异同

soft link Hard link
可以给目录创建硬链接 不允许给目录创建硬链接
允许在不同文件系统之间才能链接 只允许在同一文件系统中的文件之间才能创建链接
原文件改名,删除后无法找到 原文件改名,删除后无影响
是一个文件 目录下的一条文件连结到某inode号码的关连记录
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容