最近,我被要求在一个工作面试。我是诚实的说我知道怎么一个象征性的链路的行为和如何创建一个,但不理解所使用的硬的链接,以及它如何不同于一个象征性的一个。

有帮助吗?

解决方案

文件系统下面的文件由inode表示(或者多个inode不确定)

文件系统中的文件基本上是指向inode的链接 然后,硬链接只创建另一个文件,其中包含指向同一底层inode的链接。

删除文件时,会删除一个指向底层inode的链接。只有删除了所有指向inode的链接后,才会删除(或删除/可覆写)inode。

符号链接是指向文件系统中另一个名称的链接。

一旦建立了硬链接,就会链接到inode。删除重命名或移动原始文件不会影响硬链接,因为它链接到底层的inode。对inode数据的任何更改都会反映在引用该inode的所有文件中。

注意:硬链接仅在同一文件系统中有效。符号链接可以跨越文件系统,因为它们只是另一个文件的名称。

其他提示

使用任何Linux(ish)控制台可能会有所帮助。

创建两个文件:

$ touch foo; touch bar

在其中输入一些数据:

$ echo "Cat" > foo
$ echo "Dog" > bar

(实际上,我可以首先使用echo,因为它创建了文件,如果它们不存在......但不要介意。)

正如所料:

$cat foo; cat bar
Cat
Dog

让我们创建硬链接和软链接:

$ ln foo foo-hard
$ ln -s bar bar-soft

让我们看看刚刚发生了什么:

$ ls -l

foo
foo-hard
bar
bar-soft -> bar

更改foo的名称无关紧要:

$ mv foo foo-new
$ cat foo-hard
Cat

foo-hard指向文件的inode,内容 - 未更改。

$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft  
cat: bar-soft: No such file or directory

无法找到文件的内容,因为软链接指向已更改的名称,而不是内容。

同样,如果 foo 被删除, foo-hard 仍保留内容;如果 bar 被删除, bar-soft 只是一个指向不存在文件的链接。

俗话说,一张图片胜过千言万语。以下是我将其可视化的方式:

以下是我们如何了解这张照片:

  1. 在文件系统中创建一个名称 myfile.txt ,指向新的inode(包含文件的元数据并指向包含其内容的数据块,即文字“你好,世界!”:

    $ echo 'Hello, World!' > myfile.txt
    
  2. 为文件 myfile.txt 创建一个硬链接 my-hard-link ,这意味着“创建一个应该指向同一个inode的文件” myfile.txt 指向":

    $ ln myfile.txt my-hard-link
    
  3. 为文件 myfile.txt 创建一个软链接 my-soft-link ,这意味着“创建一个应指向该文件的文件<代码> myfile.txt的&QUOT;:

    $ ln -s myfile.txt my-soft-link
    
  4. 如果 myfile.txt 被删除(或移动),看看现在会发生什么: my-hard-link 仍然指向相同的内容,因此不受影响,而 my-soft-link 现在却什么都没有。其他答案讨论了每个人的利弊。

当原始文件被移动时,硬链接很有用。例如,将文件从/ bin移动到/ usr / bin或移动到/ usr / local / bin。 / bin中文件的任何符号链接都会被这个打破,但是硬链接(直接指向文件的inode的链接)并不关心。

硬链接可能占用较少的磁盘空间,因为它们只占用目录条目,而符号链接需要自己的inode来存储它指向的名称。

硬链接也需要更少的时间来解决 - 符号链接可以指向符号链接目录中的其他符号链接。其中一些可能在NFS或其他高延迟文件系统上,因此可能导致网络流量得到解决。始终在同一文件系统上的硬链接总是在一次查找中解决,并且从不涉及网络延迟(如果它是NFS文件系统上的硬链接,NFS服务器将执行解析,并且它将不可见客户系统)。有时这很重要。不适合我,但我可以想象这可能很重要的高性能系统。

我还认为像mmap(2)甚至open(2)这样的东西使用与硬链接相同的功能来保持文件的inode活动,这样即使文件被取消链接(2),inode仍然允许进程继续访问,只有在进程关闭后,文件才会真正消失。这允许更安全的临时文件(如果你可以原子地进行打开和取消链接,可能有一个我不记得的POSIX API,那么你真的有一个安全的临时文件)你可以读/写没有任何人能够访问您的数据。好吧,在/ proc让每个人都能够查看你的文件描述符之前,这是真的,但这是另一个故事。

说到这一点,恢复在进程A中打开但在文件系统上取消链接的文件围绕使用硬链接重新创建inode链接,这样当打开它的进程关闭它时,文件不会消失或者走了。

查看硬链接和符号链接之间差异的简单方法是通过一个简单的示例。指向文件的硬链接将指向存储文件的位置或该文件的inode。符号链接将指向实际文件本身。

因此,如果我们有一个名为“a”的文件,那么并创建一个硬链接“b”和符号链接“c”所有这些都是指文件“a”。 :

echo "111" > a
ln a b
ln -s a c

“a”,“b”和“c”的输出。将是:

cat a --> 111
cat b --> 111
cat c --> 111

现在让我们删除文件“a”并看看“a”,“b”和“c”的输出会发生什么:

rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory

那发生了什么?

因为文件“c”是指向文件“a”本身,如果文件“a”,然后删除文件“c”。没有什么可说的,实际上它也被删除了。

但是,文件“b”表示文件“b”。指向文件“a”的存储位置或inode。因此,如果文件“a”,被删除然后它将不再指向inode,而是因为文件“b”被删除。确实如此,inode将继续存储属于“a”的任何内容。直到没有更多的硬链接指向它。

柔软的链接:

柔软的或象征性更多的是一个短期切的原始文件。...如果删除原来的快捷方式的失败,并且如果你仅仅删除该短切没有发生原来的。

软链接的语法: ln -s Pathof_Target_file link

输出: link -> ./Target_file

证明: readlink link 还在 ls -l link 输出你会看到的第一个字母 lrwxrwxrwx 作为 这是指示,该文件是软的链接。

删除的链接: unlink link

注: 如果你愿意,你的软链接可以工作,即使后移动它在其他地方从目前的目录。确保你得到绝对的道路并不相对路径,同时创造一个柔软的链接。即(从开始/root/用户/Target_file和不./Target_file)

硬的链接:

硬的链接,更多的是一面镜子副本或多个路径相同的文件。做些什么来1和它出现在文件2中。删除一个仍然保持其他确定。

Inode(或文件)是仅删除所有的(硬的)链接或所有的路径(同文件)inode已被删除。

一旦一个硬链路已经作出的链接拥有的索引的原始文件。删除名或运动原始文件将不会影响很难链接,链接到基础的索引节点。任何修改的数据点反映在所有文件的参考索引节点。

硬链接的语法: ln Target_file link

输出: 文件的链接,将创建具有相同的索引编号为的Targetfile.

证明: ls -i link Target_file (检查他们的节点)

删除的链接: rm -f link (删除链就像一个正常的文件)

注意到:象征性的链接,可以跨越文件系统,因为他们都只是名称的另一个文件。而硬的链接,是唯一有效的在相同文件的系统。

象征性的联系的一些特点硬的链接缺失:

  • 硬链接的点对该文件的内容。虽然软链接指向 文件名称。
  • 虽然大小的硬链接的内容,同时软链接 具有的文件名称尺寸。
  • 硬的链接,共享相同的索引节点。柔软的链接不这样做。
  • 硬的链接不能跨文件系统。柔软的链接做。
  • 你马上就知道其中一个象征性的链接点,同时与难 链接,需要探索整个文件系统查找文件 共同的索引节点。

    # find / -inum 517333

    /home/bobbin/sync.sh
    /root/synchro
    
  • 硬的链接不能指向的目录。

硬的链接有两个限制:

  • 该目录不是很难相联系。Linux不允许这个以维持环树形结构的目录。
  • 硬的链接,不可能创建的跨文件系统。这两个文件必须在同一文件系统,因为不同的文件系统具有不同的独立的索引表(两个文件在不同文件系统,但具有相同的索引编号将是不同的)。

符号链接链接到路径名称。这可以是系统文件树中的任何位置,甚至在创建链接时也不必存在。目标路径可以是相对路径或绝对路径。

硬链接是指向inode的附加指针,这意味着它们只能存在于与目标相同的卷上。到文件的附加硬链接与“原始”文件无法区分。用于引用文件的名称。

我点你到维基百科:

几点:

  • 链接,与硬的链接,可以跨文件系统(大多数时间)。
  • 链接可以点的目录。
  • 硬链接指向一个文件,并启用你来指同一文件中有多个名称。
  • 只要至少有一个链接,该数据仍然是可用的。

硬链接是非常有用的做递增的备份。看看 rsnapshot, 例。这个想法是做复制使用硬链接:

  • 复制备份数量n n+1
  • 复制备份n-1到n
  • ...
  • 复制备份0到备份的1
  • 更新的备份0任何更改的文件。

新的备份不会采取任何额外的空间,除了任何更改,因为所有的增加备份将指向同一集的节点对于文件没有改变。

我补充说尼克的问题:什么硬链接有用还是必要?我想到的唯一一个符号链接无法完成工作的应用程序是在chrooted环境中提供系统文件的副本。

硬链接Vs软链接可以通过此图像轻松解释。

此外:

  1. 读取硬链接的性能优于符号链接(微观性能)
  2. 符号链接可以复制,版本控制,..等。换句话说,它们是一个实际的文件。另一方面,硬链接稍微低一些,你会发现与符号链接相比,有更少的工具可以提供硬链接作为硬链接而不是普通文件的方法

您认为普通的“文件”是什么?实际上是两个独立的东西:文件的数据和目录条目。为文件创建硬链接时,实际上会创建第二个目录条目,该条目引用相同的数据。两个目录条目具有完全相同的功能;每个都可以用来打开文件来读取它。因此,您实际上没有“文件加硬链接”,您有“具有两个目录条目的文件数据”。您认为删除文件实际上会删除目录条目,并且当删除数据的最后一个目录条目时,也会删除数据本身。对于只有一个目录条目的普通文件,删除目录条目将一如既往地删除数据。 (当文件打开时,操作系统会创建一个指向该文件的临时链接,因此即使删除所有目录条目,数据也会在关闭文件后保持但消失)。

例如,创建文件A.txt,硬链接B.txt,并删除A.txt。创建A.txt时,会创建一些数据,并创建目录条目A.txt。创建硬链接时,会创建另一个目录条目B.txt,指向完全相同的数据。当您删除A.txt时,您仍然拥有所有数据和单个目录条目B.txt,就像您首先创建文件B.txt一样。

软链接只是一个(几乎)普通文件,除了它不包含数据,而是包含另一个目录条目的路径。如果删除软链接引用的文件,则软链接将包含不再指向目录条目的路径;它被打破。如果删除软链接,就像删除任何其他文件一样,它指向的文件不受影响。

MSDN,

象征性的链接

一个象征性的链接,是一个文件体系对象指向另一个文件系统的对象。对被指称为目标。

象征性的链接对用户透明;链接出现正常 文件或目录,并且可以采取行动的用户或应用程序 在完全相同的方式。

象征性的链接,是设计来帮助迁移和应用程序 兼容性UNIX操作系统。微软已经实现的 它的象征意义的链接功能只是像UNIX链接。

象征性的链接,可以绝对或相对的链接。绝对的 链接是指定每个部分的道路的名称;相对 链接是确定相对于其相对链接指定者都在 一个指定的路径

一个例子绝对象征性的链接

X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"

一个例子相对象征性的链接

X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"

硬链接

一个 硬链接 是的文件系统表示的文件,通过它 超过一个路径引用一个单一的文件 在相同体积.

创建硬链接在窗户,导航链接,是设立和进入这个命令:

mklink /H Link_name target_path

注意,你可以删除硬链接的任何顺序,而不论它们的顺序。此外,硬的链接,不可能创造时

  • 参考文献在不同的地盘
  • 参考文献包括网络驱动器。换句话说,一个参考文献被一网络驱动器
  • 硬链接须建立在相同的路径作为目标

NTFS支持的另一个链接类型称为结。MSDN定义如下:

一个连接(也称为软链接)的不同而不同,从一个难链接储存的对象,它所引用的都是单独的目录,以及一个结可以链接目录的位置上 不同地方上的卷相同的计算机.否则,结以相同方式来硬的链接。

这加粗的部分在难链接的部分和结部分之间的基本差别的两个。

命令创建一个联结在窗户,导航链接,是设立和随后输入:

mklink /J link_name target_path

简单来说,硬链接:只是为文件添加新名称,这意味着,一个文件可以同时拥有多个名称,所有名称彼此相等,没有人首选,硬链接并不意味着要复制文件的所有内容和创建新文件不是那样的,它只是创建一个可以知道的替代名称。

符号链接(符号链接):是指向另一个文件的文件指针,如果符号链接指向稍后删除的现有文件,则符号链接继续指向相同的文件名,即使该名称不再指定任何文件名文件。

目录条目是链接结构:

struct dentry{
    ino_t ino;
    char  name[256];
}

ino是inode的数量,名称是文件名,inode结构可能像&#65306;

struct inode{
      link_t nlink; 
      ...
}
例如,你创建了一个文件/ 1,目录条目可能是:

struct dentry{
     ino_t ino; /* such as 15 */
     char  name[256]; /* "1" */
} 

inode结构可能像:

   struct inode{ /* inode number 15 */
         link_t nlink; /* nlink = 1 */
         ...
    }

然后你创建一个硬链接(可能是/ 100),目录条目可能是:

  struct dentry{
     ino_t ino; /* 15 */
     char  name[256]; /* 100 */
  }

inode结构可能像:

   struct inode{ /* inode numebr 15 */
         link_t nlink; /* nlink = 2 */
         ...
    }

然后你创建一个符号链接(可能是/ 200)到文件1,目录条目可能像:

  struct dentry{
        ino_t ino; /* such as 16 */
        char  name[256]; /* "200" */
  }

inode结构可能像:

   struct inode{ /* inode number 15 */ 
         link_t nlink; /* nlink = 2 */
         ...
    }

   struct inode{ /* inode number 16 */
         link_t nlink; /* nlink = 1 */
         ...
    } /* the data of inode 16 maybe /1 or 1 */

添加上述所有答案后,查找硬链接和软链接文件的区别可以理解如下:

我当前目录中有一个 f6 文件,以及一个名为 t2 的目录。

名为 f1 的文件和 ./ t2 / f2 f6 的符号链接。

名为 f7 的文件和 ./ t2 / f8 f6 的硬链接。

要找到我们可以使用的软链接和硬链接:

$ find -L . -samefile f6 

> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8

要查找我们可以使用的硬链接:

$ find . -xdev -samefile f6

> ./f6
> ./f7
> ./t2/f8

由于可以在同一文件系统上创建硬链接,因此我们可以在同一文件中搜索所有未使用 -L 选项(带 -xdev 选项)的硬链接 - 系统/挂载点。它将不必要的搜索保存到不同的挂载点。

因此搜索硬链接比搜索软链接要快一些(如果我错了或不清楚,请纠正)。

符号链接以类似于硬链接的方式为文件指定另一个名称。但即使有剩余的符号链接,也可以删除文件。

我刚刚找到了一种简单的方法来理解常见场景中的硬链接,软件安装。

有一天,我将软件下载到文件夹 Downloads 进行安装。在我执行 sudo make install 之后,一些可执行文件被 cp 编辑到本地bin文件夹。在这里, cp 会创建 硬链接 。我对软件感到满意,但很快意识到 Downloads 从长远来看并不是一个好地方。所以我 mv 将软件文件夹编辑到 source 目录。好吧,我仍然可以像以前一样运行软件而不必担心任何目标链接的东西,比如在Windows中。这意味着 硬链接 直接找到inode和其他文件。

在这个答案当我说一个文件我的意思是内存中的位置

使用名为inode的数据结构将保存的所有数据存储在内存中每个inode都有一个inodenumber .inode号用于访问inode。所有到文件的硬链接可能有不同的名称但共享相同的名称inode number。由于所有硬链接都具有相同的inodenumber(访问同一个inode),所以它们都指向相同的物理内存。

符号链接是一种特殊的文件。因为它也是一个文件,它将具有文件名和inode编号。如上所述,inode编号接受指向data的inode。现在是什么使符号链接特别的是符号链接中的inodenumbers访问指向“路径”的那些inode。更具体地说,符号链接中的inode号接收那些指向另一个硬链接的inode。

当我们在GUI中移动,复制,删除文件时,我们正在使用文件的硬链接而不是物理内存。当我们删除文件时,我们正在删除文件的硬链接。我们没有消除物理内存。如果文件的所有硬链接都被删除,那么虽然它可能仍然存在于内存中,但是无法访问存储的数据

我的两美分的使用情况:

柔软的 链接可用来缩短漫长道路的名称,即:

ln -s /long/folder/name/on/long/path/file.txt /short/file.txt

改变了 /short/file.txt 将应用于原始文件。

链接可以使用移动,大文件:

$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin

ln /myapp/dev/application.bin /myapp/prd/application.bin

即时的副本,以不同的文件夹中,原始文件(上 /myapp/dev)可能移动或删除,而不触及的文件 /myapp/prd

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top