在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过程如图所示:
关于 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号码的关连记录 |