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

Nic*_*tes 742 unix symlink hardlink

最近我在求职面试时被问到这个问题.我是诚实的,并说我知道符号链接的行为以及如何创建一个,但不理解硬链接的使用以及它与符号链接的区别.

Mar*_*ork 754

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

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

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

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

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

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

  • 您可能希望添加符号链接可以跨文件系统的有用功能,硬链接不能(它们必须引用同一文件系统上的文件). (73认同)
  • 在[Linux公报上的文章]中有一个很好的视觉解释(http://linuxgazette.net/105/pitcher.html) (45认同)
  • 我确信i节点依赖于操作系统的特定变体; 但是,我相信它通常是一个单节点.i-node具有关于文件的信息以及有关数据存储在磁盘上的位置的信息.大文件将具有指向其他表的间接指针. (2认同)
  • @Zen:你有一个根。但您可以将文件系统挂载到树中的任何位置。每个分区都有自己的文件系统,您甚至可以使用 nfs 等从其他计算机挂载文件系统... (2认同)
  • @zen:我不喜欢你的 DNS 示例,因为它添加了太多其他间接层,并且取决于你如何解释这些层。就我个人而言,我将所有 DNS 视为软链接的示例(如果我将 www.c.com 从 10.10.10.10 更改为 10.10.10.11,它仍然可以提供文件,但它与原始文件不同。硬链接是链接指向 inode,从而显式地指向数据。无论您对文件做什么,文件总是指向相同的 inode,因此也指向相同的数据。 (2认同)
  • @ThunderWiring:符号链接(软链接)是从一个文件名到另一个文件名的链接。当您打开符号链接时,文件系统将遵循链接链,直到到达真实文件。然后它使用真实的文件来访问底层的iNode数据。命令“readlink -f <fileName>”将遵循符号链到达真实文件。 (2认同)

Ada*_*tan 438

使用任何Linux(ish)控制台可能有所帮助的一些很好的直觉.

创建两个文件:

$ touch foo; touch bar
Run Code Online (Sandbox Code Playgroud)

在其中输入一些数据:

$ echo "Cat" > foo
$ echo "Dog" > bar
Run Code Online (Sandbox Code Playgroud)

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

正如所料:

$cat foo; cat bar
Cat
Dog
Run Code Online (Sandbox Code Playgroud)

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

$ ln foo foo-hard
$ ln -s bar bar-soft
Run Code Online (Sandbox Code Playgroud)

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

$ ls -l

foo
foo-hard
bar
bar-soft -> bar
Run Code Online (Sandbox Code Playgroud)

更改blah1的名称无关紧要:

$ mv foo foo-new
$ cat foo-hard
Cat
Run Code Online (Sandbox Code Playgroud)

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

$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft  
cat: bar-soft: No such file or directory
Run Code Online (Sandbox Code Playgroud)

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

  • 这是否意味着"文件"和"硬链接"是相同的,都指向一个inode?在删除文件或硬链接时,只要还有一个仍指向inode,内容仍然存在? (12认同)
  • @DmitriZaitsev是的,但初学者IMO的可读性会降低. (11认同)
  • 对于我读过的许多答案,我认为这是最好理解的答案.样本比一堆解释文本更好. (7认同)
  • `touch blah1; touch blah2`可缩短为`touch blah1 blah2` (6认同)
  • 您还可以运行“ls -lia”来查看与每个文件关联的实际 inode#。 (3认同)
  • @DanFromGermany 正确。只要至少有一个硬链接(即文件)指向该内容,该内容就可以访问。 (2认同)
  • 最佳答案! (2认同)

aki*_*don 415

俗话说,一张图片胜过千言万语.这是我如何想象它:

在此输入图像描述

以下是我们如何获得该图片:

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

    $ echo 'Hello, World!' > myfile.txt
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个指向my-hard-link该文件的硬链接myfile.txt,这意味着"创建一个应指向指向同一inode的文件myfile.txt":

    $ ln myfile.txt my-hard-link
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建指向my-soft-link该文件的软链接myfile.txt,这意味着"创建一个应指向该文件的文件myfile.txt":

    $ ln -s myfile.txt my-soft-link
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 也许我很慢,但你的照片在大约2秒内就消失了20年的神秘感. (12认同)
  • @user463035818 是的,我自己在 Keynote 中制作了该可视化。那篇文章的作者只是复制了该图像。另外,那篇文章发表于 2017 年,而我的答案发表于 2015 年。 (9认同)
  • 万字! (6认同)
  • 我非常喜欢你的视觉反应@akivajgordon - 真的帮助我更好地理解差异! (4认同)
  • 可能是最好的解释……而且这个答案应该是公认的答案。 (4认同)
  • @ThunderWiring"点",我的意思是链接引用.在硬链接的情况下,它直接引用一个inode(即`myfile.txt`引用的相同inode).对于软链接,它的引用不是inode(包含数据),而是它的引用是`myfile.txt`的文件系统路径(例如`/ home/Documents/myfile.txt`) (3认同)
  • 最有用的答案,我很生气,这在这篇文章中是如此深入。我会给你一百个互联网积分,但可惜我只能给你一个。 (3认同)

Tan*_*lus 68

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

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

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

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

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


Bol*_*boa 34

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

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

echo "111" > a
ln a b
ln -s a c
Run Code Online (Sandbox Code Playgroud)

"a","b"和"c"的输出将是:

cat a --> 111
cat b --> 111
cat c --> 111
Run Code Online (Sandbox Code Playgroud)

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

rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory
Run Code Online (Sandbox Code Playgroud)

所以发生了什么事?

因为文件"c"指向文件"a"本身,如果删除文件"a",则文件"c"将没有任何指向,实际上它也被删除.

但是,文件"b"指向文件"a"的存储位置或inode.因此,如果文件"a"被删除,那么它将不再指向inode,但由于文件"b",因此inode将继续存储属于"a"的任何内容,直到不再有硬链接指向它为止.


Pra*_*ngh 33

软链接:

软或符号更像是对原始文件的快捷方式....如果删除原始文件,则快捷方式会失败,如果只删除快捷方式,则原始文件不会发生任何变化.

软链接语法:ln -s Pathof_Target_file link

输出: link -> ./Target_file

证明: readlink link 同样在ls -l link输出中,您将看到lrwxrwxrwx作为l的第一个字母,表示该文件是软链接.

删除链接: unlink link

注意:如果您愿意,即使将软链接从当前目录移动到其他位置,您的软链接也可以正常工作.确保在创建软链接时给出绝对路径而不是相对路径.ie(从/ root/user/Target_file开始而不是./Target_file)

硬链接:

硬链接更多是镜像副本或同一文件的多个路径.对file1执行某些操作并将其显示在文件2中.删除一个仍然保持另一个正常.

仅当删除了所有(硬)链接或(同一文件)inode的所有路径时,才会删除inode(或文件).

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

硬链接语法:ln Target_file link

输出:将使用与Targetfile相同的inode编号创建具有名称链接的文件.

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

删除链接:( rm -f link删除链接就像普通文件一样)

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

符号链接有一些功能缺少硬链接:

  • 硬链接指向文件内容.而软链接指向文件名.
  • 而硬链接的大小是内容的大小,而软链接具有文件名大小.
  • 硬链接共享相同的inode.软链接没有.
  • 硬链接无法跨文件系统.软链接.
  • 你知道符号链接指向硬链接的位置,你需要浏览整个文件系统来查找共享相同inode的文件.

    # find / -inum 517333

    /home/bobbin/sync.sh
    /root/synchro
    
    Run Code Online (Sandbox Code Playgroud)
  • 硬链接不能指向目录.

硬链接有两个限制:

  • 目录不能硬链接.Linux不允许这样做来维护目录的非循环树结构.
  • 无法跨文件系统创建硬链接.这两个文件必须位于相同的文件系统上,因为不同的文件系统具有不同的独立inode表(不同文件系统上的两个文件,但具有相同的inode编号将不同).

  • "虽然硬链接的大小是内容的大小,而软链接具有文件名大小." 只是为了澄清,制作另一个硬链接只会影响几个字节的可用空间. (3认同)

And*_*ico 28

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

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


Jau*_* Ho 20

我会指向维基百科:

几点:

  • 与硬链接不同,符号链接可以跨文件系统(大多数情况下).
  • 符号链接可以指向目录.
  • 硬链接指向文件,使您能够引用具有多个名称的同一文件.
  • 只要至少有一个链接,数据仍然可用.

  • 理论上(在某些情况下甚至在实践中)硬链接也可以指向目录(实际上“.”是指向当前目录的硬链接,“..”是指向父目录的硬链接)。但它们可能很危险,因此大多数 UNIX 不允许它们(或者要求您采取特殊步骤来实现)。Apple 使用它们来实现时间机器,例如:http://earthlingsoft.net/ssp/blog/2008/03/x5_time_machine (3认同)
  • 您指向文章的链接...这会使您成为一个符号链接吗? (3认同)

Jes*_*erE 9

执行增量备份时,硬链接非常有用.例如,请参阅rsnapshot.我的想法是使用硬链接进行复制:

  • 将备份号码n复制到n + 1
  • 将备份n - 1复制到n
  • ...
  • 将备份0复制到备份1
  • 使用任何更改的文件更新备份0.

除了您所做的任何更改之外,新备份不会占用任何额外空间,因为所有增量备份都将指向未更改的文件的同一组inode.


Sна*_*ƒаӽ 6

来自MSDN

\n\n

符号链接

\n\n
\n

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

\n\n

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

\n\n

符号链接旨在帮助迁移和应用程序与 UNIX 操作系统的兼容性。Microsoft 已经实现了其符号链接,其功能就像 UNIX 链接一样。

\n\n

符号链接可以是绝对链接,也可以是相对链接。绝对链接是指定路径名的每个部分的链接;相对\n 链接是相对于指定路径中相对\xe2\x80\x93 链接说明符的位置确定的

\n
\n\n

绝对符号链接的示例

\n\n
X: "C:\\alpha\\beta\\absLink\\gamma\\file"\nLink: "absLink" maps to "\\\\machineB\\share"\nModified Path: "\\\\machineB\\share\\gamma\\file"\n
Run Code Online (Sandbox Code Playgroud)\n\n

相对符号链接的示例

\n\n
X: C:\\alpha\\beta\\link\\gamma\\file\nLink: "link" maps to "..\\..\\theta"\nModified Path: "C:\\alpha\\beta\\..\\..\\theta\\gamma\\file"\nFinal Path: "C:\\theta\\gamma\\file"\n
Run Code Online (Sandbox Code Playgroud)\n\n

硬链接

\n\n
\n

链接是文件的文件系统表示形式,通过它,多个路径引用同一卷中的单个文件。

\n
\n\n

要在 Windows 中创建硬链接,请导航到要创建链接的位置并输入以下命令:

\n\n
mklink /H Link_name target_path\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,您可以按任意顺序删除硬链接,无论它们的创建顺序如何。此外,在以下情况下无法创建硬链接:

\n\n
    \n
  • 引用位于不同的本地驱动器中
  • \n
  • 参考包括网络驱动器。换句话说,引用之一是网络驱动器
  • \n
  • 要创建的硬链接与目标路径相同
  • \n
\n\n

交界处

\n\n

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

\n\n
\n

联结(也称为软链接)与硬链接的不同之处在于,它引用的存储对象是单独的目录,并且联结可以链接位于同一计算机上不同本地卷上的目录。否则,连接的操作与硬链接相同。

\n
\n\n

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

\n\n

在 Windows 中创建连接的命令,导航到要创建链接的位置,然后输入:

\n\n
mklink /J link_name target_path\n
Run Code Online (Sandbox Code Playgroud)\n


amd*_*amd 6

此答案适用于 Web 开发人员:

硬链接:就像将不同的域名指向同一个主机

* abc.com and def.com -> points to the IP 1.2.3.4
* abc.com and def.com -> files in linux
* IP -> inode in linux
* By deleting the domain abc.com users still access your website through def.com or vice versa
* Mutation through abc.com will affect def.com and vice verca
Run Code Online (Sandbox Code Playgroud)

符号链接:将一个域重定向到另一个域

* accessing abc.com will redirect to def.com as you've accessed def.com directly
* removing the def.com domain will break the link abc.com
Run Code Online (Sandbox Code Playgroud)


Fed*_*oni 5

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


小智 5

简单来说,硬链接:只是给一个文件添加新的名称,也就是说,一个文件可以同时有多个名称,所有名称都相同,没有谁优先,硬链接并不意味着复制所有内容文件并创建新文件不是这样,它只是创建一个已知的替代名称..

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


小智 5

硬链接与软链接

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

  • 我想您的软链接图片不正确。指向:软链接的索引节点不应指向原始文件的索引节点。如果重命名原始文件,则相关的软链接失效 (4认同)