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

时间:2008-10-09 04:05:42

标签: unix symlink hardlink

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

24 个答案:

答案 0 :(得分:716)

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

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

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

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

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

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

答案 1 :(得分:410)

使用任何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只是指向不存在的文件的链接。

答案 2 :(得分:385)

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

enter image description here

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

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

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

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

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

答案 3 :(得分:67)

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

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

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

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

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

答案 4 :(得分:33)

查看硬链接和符号链接之间差异的简单方法是通过一个简单的示例。指向文件的硬链接将指向存储文件的位置或该文件的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”指向文件“a”的存储位置或inode。因此,如果文件“a”被删除,那么它将不再指向inode,但由于文件“b”,因此inode将继续存储属于“a”的任何内容,直到不再有硬链接指向它为止。< / p>

答案 5 :(得分:32)

软链接

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

软链接语法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的编号相同。

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

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

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

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

  • 硬链接指向文件内容。而软链接指向 文件名。
  • 虽然硬链接的大小是内容的大小,而软链接是 文件名大小。
  • 硬链接共享相同的inode。软链接没有。
  • 硬链接无法跨文件系统。软链接。
  • 你很快就会知道符号链接指向的位置 链接,你需要探索整个文件系统来查找文件 共享同一个inode。

    # find / -inum 517333

    /home/bobbin/sync.sh
    /root/synchro
    
  • 硬链接无法指向目录。

硬链接有两个限制:

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

答案 6 :(得分:29)

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

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

答案 7 :(得分:19)

我会指向维基百科:

几点:

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

答案 8 :(得分:8)

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

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

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

答案 9 :(得分:5)

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

答案 10 :(得分:4)

Hard link vs Soft link

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

答案 11 :(得分:3)

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

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

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

答案 12 :(得分:3)

来自MSDN

Symbolic link

  

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

     

符号链接对用户是透明的;链接显示正常   文件或目录,可由用户或应用程序执行操作   以完全相同的方式。

     

符号链接旨在帮助迁移和应用   与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"

Hard link

  

硬链接是文件的文件系统表示形式   多个路径引用同一卷中的单个文件

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

mklink /H Link_name target_path

请注意,您可以删除任何订单的硬链接,无论它们的创建顺序如何。此外,

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

Junction

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

  

联结(也称为软链接)与硬链接的不同之处在于,它引用的存储对象是单独的目录,联结可以链接位于同一台计算机上不同本地卷上的目录 。否则,交叉点的运行方式与硬链路相同。

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

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

mklink /J link_name target_path

答案 13 :(得分:3)

此外:

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

答案 14 :(得分:2)

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

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

答案 15 :(得分:2)

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

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

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

名为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选项)的硬链接。它将不必要的搜索保存到不同的挂载点。

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

答案 16 :(得分:2)

目录条目是链接结构:

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

ino是inode的数量,名称是文件名,inode结构可能像:

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 */

答案 17 :(得分:1)

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

答案 18 :(得分:0)

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

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

答案 19 :(得分:0)

IN this answer when i say a file i mean the location in memory

All the data that is saved is stored in memory using a data structure called inodes Every inode has a inodenumber.The inode number is used to access the inode.All the hard links to a file may have different names but share the same inode number.Since all the hard links have the same inodenumber(which inturn access the same inode),all of them point to the same physical memory.

A symbolic link is a special kind of file.Since it is also a file it will have a file name and an inode number.As said above the inode number acceses an inode which points to data.Now what makes a symbolic link special is that the inodenumbers in symbolic links access those inodes which point to "a path" to another file.More specifically the inode number in symbolic link acceses those inodes who point to another hard link.

when we are moving,copying,deleting a file in GUI we are playing with the hardlinks of the file not the physical memory.when we delete a file we are deleting the hardlink of the file. we are not wiping out the physical memory.If all the hardlinks to file are deleted then it will not be possible to access the data stored although it may still be present in memory

答案 20 :(得分:0)

我使用的两分钱:

链接可用于缩短长路径名称,即:

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上的文件

答案 21 :(得分:0)

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

有一天,我将一个软件下载到了 Downloads 文件夹中进行安装。在我执行 sudo make install 之后,一些可执行文件被 cped 到本地 bin 文件夹。在这里, cp 创建硬链接。我对软件很满意,但很快意识到从长远来看下载不是一个好地方。所以我将软件文件夹移动到源目录。好吧,我仍然可以像以前一样运行该软件,而无需担心任何目标链接的事情,就像在 Windows 中一样。这意味着硬链接直接查找 inode 和其他文件。

答案 22 :(得分:0)

硬链接是 unix,就像它在 unix 和 linux 中的旧使用一样,但符号链接在 linux 中是新的。

硬链接 inode 与原始文件 inode 相同。但symbolik 链接inode 与原始文件inode 不同。

以字节为单位的硬链接文件大小与以字节为单位的原始文件大小相同。但是以字节为单位的符号链接文件大小与以字节为单位的原始文件大小不同。符号链接文件大小小于原始文件大小。

硬链接是原始文件的镜像副本。符号链接或软链接就像 Windows 中的快捷方式。

如果您删除原始文件,硬链接将保留其文件,您可以看到硬链接文件内容。在符号链接中,如果删除原始文件,其符号链接将断开,符号链接仍然存在,但无法显示符号链接内容。

符号链接是新的,它有很多功能,但硬链接是旧的,这就是为什么它的功能较少。

让我们使用终端创建一些硬链接和符号链接: echo "为什么这么严重" > file.txt

硬链接: ln file.txt file_hard

符号链接: ln -s file.txt file_sym

让我们看看 inode 的内容: ls -li

答案 23 :(得分:-1)

解析为内容为 pathname 的文件的链接(文件名)为符号链接,否则为硬链接。

目录本质上是一个表,其中的条目是文件名(链接)和 inode 编号。链接 - 硬链接或符号链接 - 解析为目录中的 inode 编号,然后目录中的 inode 解析为 inode 表中的 inode 记录(有关文件的信息)。 inode 记录中的一条信息是文件类型。

然后文件系统可以从 inode 记录访问 inode 所代表的文件的数据,因为文件的地址是构成记录的信息集合的一部分。

如果文件的数据为a,则链接为符号链接,否则为硬链接。