符号链接和硬链接有什么区别?

最近我在面试时被问到这个问题。 我诚实地说,我知道一个符号链接是如何运作的,以及如何build立一个符号链接,但是不明白硬链接的使用,以及它与符号链接的区别。

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

文件系统中的文件基本上是一个到inode的链接。
一个硬链接然后只是创build另一个链接到相同的底层inode的文件。

当你删除一个文件时,它会删除一个到底层inode的链接。 当inode的所有链接都被删除时,inode只被删除(或可删除/可写)。

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

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

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

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

创build两个文件:

$ touch blah1; touch blah2 

在其中input一些数据:

 $ echo "Cat" > blah1 $ echo "Dog" > blah2 

(实际上,我本来可以使用echo,因为如果它们不存在,它会创build这些文件…但是不用担心。)

和预期的一样:

 $cat blah1; cat blah2 Cat Dog 

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

 $ ln blah1 blah1-hard $ ln -s blah2 blah2-soft 

让我们看看刚刚发生的事情:

 $ ls -l blah1 blah1-hard blah2 blah2-soft -> blah2 

更改blah1的名称并不重要:

 $ mv blah1 blah1-new $ cat blah1-hard Cat 

blah1-hard指向inode,文件的内容 – 没有改变。

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

该文件的内容找不到,因为软链接指向的名称,已更改,而不是内容。 同样,如果blah1被删除,blah1-hard仍然保存内容; 如果blah2被删除,blah2-soft只是一个不存在的文件的链接。

俗话说,一张图片胜过千言万语。 这是我如何可视化它:

在这里输入图像说明

下面是我们如何得到这个图片:

  1. 在文件系统中创build一个名为myfile.txt的文件,该文件指向一个新的inode(包含文件的元数据并指向包含其内容的数据块,即文本“Hello,World!”):

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

     $ ln myfile.txt my-hard-link 
  3. 创build一个软链接my-soft-link到文件myfile.txt ,这意味着“创build一个文件,指向文件myfile.txt ”:

     $ ln -s myfile.txt my-soft-link 

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

当原始文件移动时,硬链接很有用。 例如,将文件从/ bin移动到/ usr / bin或移动到/ usr / local / bin。 任何符号链接到/ bin中的文件将被打破,但硬链接,直接链接到该文件的inode,不会在乎。

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

硬链接也需要较less的时间来解决 – 符号链接可以指向符号链接目录中的其他符号链接。 其中一些可能在NFS或其他高延迟文件系统上,因此可能导致networkingstream量解决。 硬链接始终在同一个文件系统上,总是在一次查询中解决,并且永远不会涉及networking延迟(如果它是NFS文件系统上的硬链接,则NFS服务器将执行parsing,并且对于客户端系统)。 有时候这很重要。 不适合我,但我可以想象这可能是重要的高性能系统。

我也认为像mmap(2)甚至打开(2)使用硬链接相同的function,以保持文件的inode活动,即使文件取消链接(2),inode仍然允许进程继续访问,只有一旦进程closures,文件真的会消失。 这允许更安全的临时文件(如果你可以打开和断开链接发生primefaces,可能有一个POSIX API,因为我不记得,那么你真的有一个安全的临时文件),你可以读/写你的数据没有人能够访问它。 那么在/ proc给大家看看你的文件描述符的能力之前是这样的,但那是另一回事。

说到这一点,恢复在进程A中打开但在文件系统上未链接的文件围绕使用硬链接来重新创build索引节点链接,以便文件在打开的进程closures或离开时不会消失。

符号链接链接到path名称。 这可以在系统的文件树中的任何地方,甚至在链接创build时甚至不必存在。 目标path可以是相对的或绝对的。

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

通过一个简单的例子来看看硬链接和符号链接之间的区别。 指向文件的硬链接将指向文件的存储位置或该文件的inode。 符号链接将指向实际的文件本身。

因此,如果我们有一个名为“a”的文件,并创build一个硬链接“b”和一个符号链接“c”,它们都引用文件“a”:

 echo "111" > a ln ab ln -sac 

“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”指向文件“a”的存储位置或inode。 因此,如果文件“a”被删除,那么它将不再指向inode,而是因为文件“b”,inode将继续存储属于“a”的所有内容,直到没有更多的硬链接指向它。

软链接

软或符号是更多的原始文件的捷径….如果你删除原来的快捷方式失败,如果你只删除捷径没有发生原来的事情。

软链接语法 :ln -s file1 file2

硬链接:

硬链接更多的是镜像副本或多个path到同一个文件。 做一些文件1,它出现在文件2中。删除一个仍然保持其他好。

inode(或文件)仅在删除所有(硬)链接或到(同一文件)inode的所有path时被删除。

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

硬链接语法 :ln file1 file2

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

符号链接有一些function缺less硬链接:

  • 硬链接指向文件内容。 而软链接指向文件名。
  • 而硬链接的大小是内容的大小,而软链接是文件名的大小。
  • 硬链接共享相同的inode。 软链接不。
  • 硬链接不能跨文件系统。 软链接呢。
  • 您可以立即知道符号链接在硬链接中指向的位置,您需要浏览整个文件系统以查找共享相同索引节点的文件。
  • 硬链接不能指向目录。

硬链接不能跨文件系统或分区的原因:

在硬盘上有很多扇区。

假设一个文件从inode(sector)4001开始,到5000结束。文件是“/export/home/john/mail.doc”

然后:1.硬链接到名为“hardLinkToMail”的“mail.doc”包含值:“4001”。 2.名为“softLinkToMail”的“mail.doc”的软链接包含值:“/export/home/john/mail.doc”。

1)硬链接只能指向同一个磁盘。 它不能指向另一个驱动器。 所有驱动器都有一个值为“4001”的索引节点,硬链接如何区分所有光盘? 哪个驱动器的“4001”是?

2)软链接包含一个string。 该string可以指向另一个驱动器上的另一个文件系统,因为指定了完整path。

我会把你指向维基百科:

  • 符号链接
  • 硬链接

几点:

  • 与硬链接不同,符号链接可以跨越文件系统(大部分时间)。
  • 符号链接可以指向目录。
  • 硬链接指向一个文件,并使您能够引用具有多个名称的相同文件。
  • 只要至less有一个链接,数据仍然可用。

硬链接在进行增量备份时非常有用。 例如,请参阅rsnapshot 。 这个想法是使用硬链接进行复制:

  • 将备份号码n复制到n + 1
  • 将备份n – 1复制到n
  • 将备份0复制到备份1
  • 更新备份0与任何更改的文件。

新备份不会占用任何额外的空间,因为所有增量备份都将指向同一组文件的inode,而这些文件并未更改。

我加上尼克的问题: 硬链接何时有用或必要? 我想到的唯一一个符号链接不能完成这个工作的应用是在chrooted环境中提供一个系统文件的副本。

硬链接可以是有用的,因为它使您能够从多个不同的位置访问文件。 它直接访问inode。 一些限制是:

  1. 硬链接必须存在于同一个设备上。
  2. 我们不能创build硬链接到目录。
  3. 原始文件具有的别名数量。 当姓氏被删除时,内容也被删除。

硬链接的好处是第一个硬链接和第二个硬链接没有区别。 它们都是硬链接,如果一个文件的第一个硬链接被删除了,那么这个链接就不会影响其他仍然存在的硬链接。 Linux操作系统使用许多位置上的链接来使文件更易于访问。

作为一个符号链接 (也称为软链接),不直接链接到索引节点,而是链接到文件的名称。主要缺点是当原始文件被删除时,符号链接变得无效并且不起作用更长的时间。

有关Inode的一些信息:

Linux存储有关inode的文件的pipe理数据。 Linux上的每个文件都有一个inode,在inode中存储有关该文件的重要信息:

  1. 存储文件内容的数据块
  2. 创build,访问和修改date
  3. 权限
  4. 文件所有者

只有一个重要的信息不存储在inode中:名称。 名称存储在目录中,并且每个文件名都知道它必须解决哪个inode以访问更多的文件信息。 知道一个inode不知道它拥有哪个名字是很有趣的。 它只知道有多less个名字与inode相关联。 这些名称被称为硬链接。 当你创build一个文件,你给它一个名字。 基本上,这个名字是一个硬链接。

也:

  1. 阅读硬链接的性能优于符号链接(微型性能)
  2. 符号链接可以被复制,版本控制,..等等。 换句话说,他们是一个真正的文件。 另一方面,一个硬链接是在一个稍低一点的水平,你会发现,与符号链接相比,有更less的工具,提供手段作为硬链接硬链接,而不是正常的文件

你认为作为一个普通的“文件”实际上是两个单独的东西:一个文件的数据和一个目录项。 为文件创build硬链接时,实际上会创build指向相同数据的第二个目录条目。 两个目录条目都具有完全相同的function; 每一个都可以用来打开文件来读取它。 所以你并没有真正的“一个文件加一个硬链接”,你有“两个目录条目的文件数据”。 你认为删除一个文件实际上是删除一个目录项,当数据的最后一个目录项被删除时,数据本身也被删除。 对于只有一个目录条目的普通文件,删除目录条目将一如既往地删除数据。 (打开一个文件时,操作系统会创build一个到文件的临时链接,因此,即使删除了所有的目录条目,数据仍会保留,但只要closures文件就会消失)。

例如,创build一个文件A.txt,一个硬链接B.txt,并删除A.txt。 创buildA.txt时,会创build一些数据和一个目录条目A.txt。 创build硬链接时,会创build另一个目录条目B.txt,指向完全相同的数据。 当你删除A.txt时,你仍然有所有的数据和一个单一的目录条目B.txt,就好像你已经创build了一个B.txt文件。

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

简单来说,硬链接:只是给文件添加新的名字,这意味着一个文件可以同时拥有多个名称,所有名称都相同,没有人喜欢,硬链接并不意味着复制所有内容的文件,并使新文件是不是,它只是创build一个替代的名字是知道的..

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

从MSDN ,

符号链接

符号链接是指向另一个文件系统对象的文件系统对象。 被指向的对象被称为目标。

符号链接对用户是透明的; 链接显示为普通文件或目录,并且可以以完全相同的方式由用户或应用程序执行。

符号链接旨在帮助迁移和应用程序与UNIX操作系统的兼容性。 微软已经实现了象UNIX链接一样的符号链接。

符号链接可以是绝对链接或相对链接。 绝对链接是指定path名称的每个部分的链接; 相对链接是相对于相对链接说明符在指定path中的位置而确定的

绝对符号链接的一个例子

 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" 

硬链接

硬链接是文件的文件系统表示,通过该文件,多个path引用同一个卷中的单个文件。

要在Windows中创build硬链接,请导航到要创build链接的位置,然后input以下命令:

 mklink /H Link_name target_path 

请注意,您可以删除硬链接的任何顺序,无论它们的创build顺序如何。 此外,硬链接不能创build时

  • 引用是在不同的本地驱动器
  • 引用包括networking驱动器。 换句话说,其中一个参考是networking驱动器
  • 要创build的硬链接与目标path相同

连接点

NTFS支持另一种称为联结的链接types。 MSDN定义如下:

结点(也称为软链接)不同于硬链接,因为它引用的存储对象是单独的目录,并且结点可以链接位于同一台计算机不同本地卷上的目录。 否则,路口与硬链路相同。

硬连接部分和连接部分的粗体部分显示了两者之间的基本区别。

在窗口中创build连接的命令,导航到要创build连接的位置,然后input:

 mklink /J link_name target_path 

目录项是链接结构:

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

ino是inode的数目,name是文件名,inode的结构可能是这样的:

 struct inode{ link_t nlink; ... } 

例如你创build一个文件/ 1,目录条目可能是这样的:

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

inode结构可能是这样的:

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

那么你创build一个硬链接(可能是/ 100),目录条目可能是这样的:

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

inode结构可能是这样的:

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

那么你创build一个符号链接(可能是/ 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 */ 

添加上面的所有答案,find硬链接和软链接文件的区别可以理解为如下:

我在当前目录下有一个文件f6 ,还有一个名为t2的目录。

名为f1./t2/f2文件是到f6符号链接。

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

要find软链接和硬链接,我们可以使用:

 $ find -L . -samefile f6 > ./f1 > ./f6 > ./f7 > ./t2/f2 > ./t2/f8 

要find唯一的硬链接,我们可以使用:

 $ find . -xdev -samefile f6 > ./f6 > ./f7 > ./t2/f8 

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

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

符号链接为文件提供了另一个名称,类似于硬链接。 但是即使有剩余的符号链接,文件也可以被删除。

我刚刚find了一个简单的方法来了解常见情况下的硬链接,即软件安装。

有一天,我下载了一个软件文件夹Downloads安装。 在我做sudo make install ,一些可执行文件被复制到本地bin文件夹中。 在这里, cp创build硬链接 。 我对软件很满意,但很快就意识到,从长远来看, Downloads并不是一个好的地方。 所以我把这个软件文件夹转到source目录。 那么,我仍然可以像以前一样运行软件,而不必担心任何目标链接的东西,如在Windows中。 这意味着硬链接直接查找inode和其他文件。

    Interesting Posts