Linux 上的软链接与硬链接

在 linux 中,软链接与硬链接的原理及区别

Linux 系统中,文件分为哪 2 部分?

  • ext4 文件系统会把分区主要分为两大部分(暂时不提超级块):小部分为 Linux 文件的元数据 ;剩余的大部分为 [Linux 文件的用户数据

Linux 系统中,文件的元数据指什么?

  • 元数据记录的信息: 文件的索引节点(inode),用来记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件数据的 block 编号
  • 索引节点(inode)的默认大小: 128Byte,新的 ext4 和 xfs 可以设置为 256Byte
  • 索引节点(inode)的作用: 文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块
  • 在 Linux 系统中,多个文件名指向同一索引节点 (Inode) 是正常且允许的。一般这种链接就称为硬链接 (Hard Link)

Linux 系统中,文件的用户数据指什么?

  • 用户数据记录的内容: 即文件数据块(block),记录了文件的真实内容,包括文件名,文件名会被记录在上级目录的 block 中。也就是说,目录的 block 中记录的是这个目录下所有一级子文件和子目录的文件名及 inode 的对应,而文件的 block 中记录的才是文件实际的数据
  • 文件数据块(block)的大小: 可以是 1KB、2KB、4KB,默认为 4KB。block 用于实际的数据存储,如果一个 block 放不下数据,则可以占用多个 block,最后一个 block 可能不会占满,但也不能再放入其他文件的数据。多个 block 有可能是连续的,也有可能是分散的
  • 1)不论是修改源文件(test 文件),还是修改硬链接文件(test-hard 文件),另一个文件中的数据都会发生改变
  • 2)不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件都可以被访问 (可以防止误删除)
  • 3)硬链接不会建立新的 inode 信息,也不会更改 inode 的总数
  • 4)硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode 号是重新计算的
  • 5)硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的 Linux 来讲过于复杂
  • 6)硬链接不会占用 inode 和 block
  • 1) 类似于 windows 系统中的快捷方式,与硬链接不同,软链接就是一个普通文件
  • 2)删除软链接文件,源文件不受影响。而删除原文件,软链接文件将找不到实际的数据,从而显示文件不存在
  • 3)软链接会新建自己的 inode 信息和 block,只是在 block 中不存储实际文件数据,而存储的是源文件的文件名及 inode 号
  • 4)软链接可以链接目录
  • 5)软链接可以跨分区
  • 6)软链接会占用 inode 和 block

Linux 上查找硬链接文件 (比如 /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 文件的读取与访问。

Linux 上查找软链接文件 (比如 /root/test-soft) 的步骤?

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

Linux 上如何创建硬链接?

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    (base) wushaogui@AI2:~/Test/testlinkfile$ mkdir testlinkfile;cd testlinkfile
    (base) wushaogui@AI2:~/Test/testlinkfile$ mkdir dir1 dir2
    (base) wushaogui@AI2:~/Test/testlinkfile$ touch file1 file2
    (base) wushaogui@AI2:~/Test/testlinkfile$ ln file1 file1.hard_link
    (base) wushaogui@AI2:~/Test/testlinkfile$ ln dir1 dir1.hard_link
    ln: dir1: hard link not allowed for directory
    (base) wushaogui@AI2:~/Test/testlinkfile$ ls -lh
    total 8.0K
    drwxrwxr-x 2 wushaogui wushaogui 4.0K 1月 25 09:15 dir1
    drwxrwxr-x 2 wushaogui wushaogui 4.0K 1月 25 09:15 dir2
    -rw-rw-r-- 2 wushaogui wushaogui 0 1月 25 09:16 file1
    -rw-rw-r-- 2 wushaogui wushaogui 0 1月 25 09:16 file1.hard_link
    -rw-rw-r-- 1 wushaogui wushaogui 0 1月 25 09:17 file2
    (base) wushaogui@AI2:~/Test/testlinkfile$ ls -li #查看文件索引号(i节点),硬链接与源文件相等
    total 8
    7200952 drwxrwxr-x 2 wushaogui wushaogui 4096 1月 25 09:15 dir1
    7201061 drwxrwxr-x 2 wushaogui wushaogui 4096 1月 25 09:15 dir2
    7080095 -rw-rw-r-- 2 wushaogui wushaogui 0 1月 25 09:16 file1
    7080095 -rw-rw-r-- 2 wushaogui wushaogui 0 1月 25 09:16 file1.hard_link
    7082613 -rw-rw-r-- 1 wushaogui wushaogui 0 1月 25 09:17 file2
  • 硬链接的文件类型和普通文件类型一样,都是 (-)

Linux 上如何创建软链接?

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    (base) wushaogui@AI2:~/Test/testlinkfile$ mkdir testlinkfile;cd testlinkfile
    (base) wushaogui@AI2:~/Test/testlinkfile$ mkdir dir1 dir2
    (base) wushaogui@AI2:~/Test/testlinkfile$ touch file1 file2
    (base) wushaogui@AI2:~/Test/testlinkfile$ ln -s file2 file2.soft_link
    (base) wushaogui@AI2:~/Test/testlinkfile$ ln -s dir2 dir2.soft_link
    (base) wushaogui@AI2:~/Test/testlinkfile$ ls -lh
    total 8.0K
    drwxrwxr-x 2 wushaogui wushaogui 4.0K 1月 25 09:15 dir1
    drwxrwxr-x 2 wushaogui wushaogui 4.0K 1月 25 09:15 dir2
    lrwxrwxrwx 1 wushaogui wushaogui 4 1月 25 09:24 dir2.soft_link -> dir2
    -rw-rw-r-- 2 wushaogui wushaogui 0 1月 25 09:16 file1
    -rw-rw-r-- 2 wushaogui wushaogui 0 1月 25 09:16 file1.hard_link
    -rw-rw-r-- 1 wushaogui wushaogui 0 1月 25 09:17 file2
    lrwxrwxrwx 1 wushaogui wushaogui 5 1月 25 09:24 file2.soft_link -> file2
  • 软链接的文件标识符为 (l)
  • 软链接所有者和所属组具有全部操作的权限,rwxrwxrwx