得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

软硬快捷方式

ln 命令用于给文件创建链接,链接的方式分为以下 2 种:

  1. 软链接:类似于 Windows 系统中给文件创建快捷方式,即产生一个特殊的文件,该文件用来指向另一个文件,此链接方式同样适用于目录
  2. 硬链接:文件的基本信息都存储在 inode 中,而硬链接指的就是给一个文件的 inode 分配多个文件名,通过任何一个文件名,都可以找到此文件的 inode,从而读取该文件的数据信息
1
2
3
4
5
6
7
8
9
# ln 命令常用选项:
# -s:建立软链接文件,如果不加 -s 选项,则建立硬链接文件,若目标文件没有文件名,则和原名保持一致;
# -f:如果目标文件已经存在,则删除目标文件后再建立链接文件;

# 创建硬链接
$ ln ~/test /tmp # 建立硬链接文件,此处硬链接文件名为 /tmp/test

# 创建软链接
$ ln -s ~/test /tmp # 注意,软链接的源文件必须写成绝对路径,而不能写成相对路径;硬链接没有这样的要求

影响链接的 inode 和 block

inode(i 节点)

  1. inode 的默认大小为 128 Byte,用来记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件的数据真正保存的 block 编号
  2. 每个文件需要占用一个 inode,文件内容由 inode 的记录来指向
  3. inode 不记录文件名,文件名记录在文件所在目录的 block 中

block

  1. block 的大小可以是 1KB、2KB、4KB,默认为 4KB

  2. block 用于实际的数据存储,如果一个 block 放不下数据,则可以占用多个 block

    例如,有一个 10KB 的文件需要存储,则会占用 3 个 block,虽然最后一个 block 不能占满,但也不能再放入其他文件的数据。这 3 个 block 有可能是连续的,也有可能是分散的。

所以,如果想要读取文件内容,就必须借助目录中记录的文件名找到该文件的 inode,才能成功找到文件内容所在的 block 块

查找 /root/test 要经过以下步骤

  1. 找到根目录的 inode 信息(根目录的 inode 是系统已知的,inode 号是 2),判断用户是否有权限访问根目录的 block
  2. 如果有权限,则可以在根目录的 block 中访问到 /root 的文件名及对应的 inode 号
  3. 通过 /root/ 目录的 inode 号,查找到 /root/ 目录的 inode 信息,接着判断用户是否有权限访问 /root/ 目录的 block
  4. 如果有权限,则可以从 /root/ 目录的 block 中读取到 test 文件的文件名及对应的 inode 号
  5. 通过 test 文件的 inode 号,就可以找到 test 文件的 inode 信息,接着判断用户是否有权限访问 test 文件的 block
  6. 如果有权限,则可以读取 block 中的数据,这样就完成了 /root/test 文件的读取与访问

硬链接

在 inode 中,是不会记录文件名称的,而是把文件名记录在上级目录的 block 中。也就是说,目录的 block 中记录的是这个目录下所有一级子文件和子目录的文件名及对应的 inode;而文件的 block 中记录的才是文件实际的数据

给源文件 /root/test 建立了硬链接文件 /tmp/test_hard 之后,/tmp/ 目录的 block 中就会建立 test_hard 的信息,这个信息主要包含文件名和对应的 inode

通过 /tmp/test_hard 查找 /root/test 要经过以下步骤

  1. 找到根目录的 inode 信息,判断用户是否有权限访问根目录的 block
  2. 如果有权限,则可以在根目录的 block 中访问到 /tmp 的文件名及对应的 inode 号
  3. 通过 /tmp/ 目录的 inode 号,查找到 /tmp/ 目录的 inode 信息,接着判断用户是否有权限访问 /tmp/ 目录的 block
  4. 如果有权限,则可以从 /tmp/ 目录的 block 中读取到 test_hard 文件的文件名及对应的 inode 号
  5. 通过 test_hard 文件的 inode 号,因为 /root/test 和 /tmp/test_hard 有着相同的 inode 号,所以,此时也就是找到了 /root/test 的 inode 信息,接着判断用户是否有权限访问 test_hard 文件的 block
  6. 如果有权限,则可以读取 block 中的数据,这样就完成了 /root/test 文件的读取与访问

硬链接的特点:

  1. 不论是修改源文件,还是修改硬链接文件,另一个文件中的数据都会随之发生改变
  2. 不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件都可以被访问
  3. 硬链接不会建立新的 inode 信息
  4. 硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode 是重新计算的
  5. 硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的 Linux 来讲过于复杂

软链接

软链接和硬链接在原理上最主要的不同在于:硬链接不会建立自己的 inode 索引和 block(数据块),而是直接指向源文件的 inode 信息和 block,所以硬链接和源文件的 inode是一致的;而软链接会真正建立自己的 inode 索引和 block,所以软链接和源文件的 inode是不一致的,而且在软链接的 block 中,写的不是真正的数据,而仅仅是源文件的文件名及 inode。

通过 /tmp/test_soft 查找 /root/test 要经过以下步骤

  1. 找到根目录的 inode 索引信息,然后判断用户是否有权限访问根目录的 block
  2. 如果有权限,则可以在根目录的 block 中访问到 /tmp 的文件名及对应的 inode 号
  3. 接着访问 /tmp/ 目录的 inode 信息,判断用户是否有权限访问 /tmp/ 目录的 block
  4. 如果有权限,就会在 block 中读取到软链接文件 test_soft 的 inode 号,因为软链接文件会真正建立自己的 inode 索引和 block,所以软链接文件和源文件的 inode 号是不一样的
  5. 通过 test_soft 的 inode 号,找到了 test_soft 文件 inode 信息,判断用户是否有权限访问 block
  6. 如果有权限,就会发现 test_soft 文件的 block 中没有实际数据,仅有源文件 /root/test 的 inode 号
  7. 接着通过源文件的 inode 号,访问到源文件 /root/test 的 inode 信息,判断用户是否有权限访问 block
  8. 如果有权限,就会在 /root/test 文件的 block 中读取到真正的数据,从而完成数据访问

软链接的特点(和 Windows 中的快捷方式完全一致):

  1. 不论是修改源文件,还是修改软链接文件,另一个文件中的数据都会随之发生改变
  2. 删除软链接文件,源文件不受影响;删除原文件,软链接文件将找不到实际的数据,从而显示文件不存在
  3. 软链接会新建自己的 inode 信息和 block,只是在 block 中不存储实际文件数据,而存储的是源文件的文件名及 inode
  4. 软链接可以链接目录
  5. 软链接可以跨分区

be slow to promise and quick to perform.