【问题标题】:What is there behind a symbolic link?符号链接背后有什么?
【发布时间】:2013-05-30 13:31:33
【问题描述】:

UNIX/Linux 系统内部如何管理符号链接。众所周知,即使没有实际的目标文件(悬空链接),符号链接也可能存在。那么在内部代表符号链接的是什么。

在 Windows 中,答案是reparse point

问题:

答案是 UNIX/Linux 中的 inode 吗?

如果是,那么目标和链接的 inode 编号是否相同?

如果是,链接inode是否可以拥有与目标inode不同的权限(如果存在)?

【问题讨论】:

    标签: linux unix linux-kernel symlink inode


    【解决方案1】:

    这不是关于 UNIX/Linux 而是关于文件系统实现 - 但是,是的,Unix/Linux 在内核级别使用 inode,而文件系统实现具有 inode(至少是虚拟的)。

    一般来说,符号链接只是文件(顺便说一句,目录也是文件),它具有:

    • 标志“inode”中的file-type 告诉系统该文件是“符号链接”
    • file-content:目标的路径 - 换句话说:符号链接只是一个文件,其中包含一个文件名和 inode 中的标志。

    虚拟文件系统也可以有符号链接,因此,请检查 FUSE 或其他一些文件系统实现源。 (ext2/ext3/ufs..等)

    所以,

    答案是 UNIX/Linux 中的 inode 吗?

    取决于文件系统实现,但是是的,通常 inode 包含“文件类型”(以及所有者、访问权限、时间戳、大小、指向数据块的指针)。有些文件系统没有inodes(在物理实现中),但只有“虚拟inode”来保持与内核的兼容性。

    如果是,那么目标和链接的 inode 编号是否相同?

    。通常,符号链接是一个带有自己的 inode 的文件,(带有文件类型、自己的数据块等)

    如果是,链接inode是否可以拥有与目标不同的权限? inode(如果存在的话)?

    这是关于如何处理符号链接文件的。通常,内核不允许更改符号链接权限 - 符号链接始终具有默认权限。你可以编写自己的文件系统来允许符号链接的不同权限,但你会遇到麻烦,因为像chmod 这样的普通程序不会更改符号链接本身的权限,所以无论如何制作这样的文件系统毫无意义)

    要了解硬链接和符号链接之间的区别,您应该首先了解目录。

    目录是告诉内核“将此文件作为file-nameinode_number 的映射处理”的文件(由inode 中的标志区分)。硬链接只是映射到相同inode 的文件名。所以如果目录文件包含:

    file_a: 1000
    file_b: 1001
    file_c: 1000
    

    上面的意思是,在这个目录下,有3个文件:

    • inode 1000 描述的file_a
    • file_b 由 inode 1001 和
    • 描述
    • file_c 再次由 inode 1000 描述(因此它是 with file_a 的硬链接,而不是 to file_a 的硬链接 - 因为无法分辨哪个文件名在前 - 它们相同)。

    这是符号链接的主要区别,其中file_b(inode 1001)的 inode 可以具有 content“file_a”和一个表示“这是一个符号链接”的标志。在这种情况下,file_b 将是指向file_a 的符号链接。

    【讨论】:

      【解决方案2】:

      您也可以轻松地自行探索:

      $ touch a
      $ ln -s a b
      $ ln a c
      $ ls -li
      total 0
      95905 -rw-r--r-- 1 regnarg regnarg 0 Jun 19 19:01 a
      96990 lrwxrwxrwx 1 regnarg regnarg 1 Jun 19 19:01 b -> a
      95905 -rw-r--r-- 2 regnarg regnarg 0 Jun 19 19:01 c
      

      ls-i 选项在第一列中显示 inode 编号。您可以看到符号链接具有不同的 inode 编号,而硬链接具有相同的索引节点编号。您也可以使用stat(1) 命令:

      $ stat a
        File: 'a'
        Size: 0           Blocks: 0          IO Block: 4096   regular empty file
      Device: 28h/40d Inode: 95905       Links: 2
      [...]
      
      $ stat b
        File: 'b' -> 'a'
        Size: 1           Blocks: 0          IO Block: 4096   symbolic link
      Device: 28h/40d Inode: 96990       Links: 1
      [...]
      

      如果您想以编程方式执行此操作,您可以使用 lstat(2) 系统调用来查找有关符号链接本身的信息(其 inode 编号等),而 stat(2) 显示有关目标的信息 符号链接(如果存在)。 Python 中的示例:

      >>> import os
      >>> os.stat("b").st_ino
      95905
      >>> os.lstat("b").st_ino
      96990
      

      【讨论】:

      • readlink() 允许您在给定的符号链接中查找作为路径名存储的内容——但是当一个符号链接中的路径名遍历的元素之一本身就是一个符号链接时,生活变得非常有趣。内核沉着地处理它;人们不一定。还有realpath() 确定给定文件的无符号链接绝对路径。
      猜你喜欢
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 2013-07-11
      • 2012-10-03
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      相关资源
      最近更新 更多