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

最近我在一次工作面试中被问到这个问题。我很诚实,说我知道符号链接的行为以及如何创建一个,但不明白硬链接的使用以及它与符号链接的区别。

446510 次浏览

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

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

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

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

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

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

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

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

我建议你去Wikipedia:

有几点:

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

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

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

硬链接也需要更少的时间来解析——符号链接可以指向符号链接目录中的其他符号链接。其中一些可能在NFS或其他高延迟文件系统上,因此可能会导致解析流量。硬链接总是在同一个文件系统上,总是在一次查找中解析,并且永远不会涉及网络延迟(如果它是NFS文件系统上的硬链接,NFS服务器会做解析,并且客户端系统不可见)。有时这很重要。对我来说不是,但我可以想象这可能很重要的高性能系统。

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

说到这里,恢复在进程A中打开但在文件系统上未链接的文件围绕使用硬链接来重新创建inode链接,以便文件在打开它的进程关闭它或消失时不会消失。

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

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

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

一些可能有帮助的例子。

创建两个包含数据的文件:

$ printf Cat > foo$ printf Dog > bar

创建一个硬和软(又名符号)链接:

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

通过增加大小以长格式列出目录内容:

ls -lrSlrwxr-xr-x   1 user  staff        3  3 Apr 15:25 bar-soft -> bar-rw-r--r--   2 user  staff        4  3 Apr 15:25 foo-hard-rw-r--r--   2 user  staff        4  3 Apr 15:25 foo-rw-r--r--   1 user  staff        4  3 Apr 15:25 bar

这告诉我们

  • 第1列:软链接和硬链接的文件模式不同

    • 软链接:lrwxr-xr-x
      • 文件类型:l=符号链接
      • 所有者权限:rwx=可读、可写、可执行
      • 组权限:r-x=可读、不可写、可执行
      • 其他权限:r-x=可读,不可写,可执行
    • 硬链接:-rw-r--r--
      • 文件类型:-=普通文件
      • 所有者权限:rw-=可读、可写、不可执行
      • 组权限:r--=可读、不可写、不可执行
      • 其他权限:r--=可读、不可写、不可执行
  • 第2列:硬链接文件的链接数较高

  • 第5列:软链接的大小较小,因为它是引用而不是副本

  • 最后一列:符号链接通过->显示链接到的文件

更改foo的文件名不会影响foo-hard:

$ mv foo foo-new$ cat foo-hardCat

更改foo的内容反映在foo-hard中:

$ printf Dog >> foo$ cat foo-hardCatDog

像foo-hard这样的硬链接指向文件的inode、内容。

这不是像bar-soft这样的软链接的情况:

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

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

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

还有:

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

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

我在当前目录中有一个文件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选项)的硬链接。它将不必要的搜索保存在不同的挂载点。

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

简单地说,硬链接:就是给一个文件添加一个新名字,也就是说,一个文件可以同时有很多名字,所有的名字都是彼此相等的,没有人首选,硬链接并不是说复制文件的所有内容,制作新文件并不是说,它只是创建一个可供选择的名字。

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

软链接

软或符号更像是原始文件的快捷方式……如果您删除原始文件,快捷方式会失败,如果您只删除快捷方式,原始文件不会发生任何事情。

软链接语法ln -s Pathof_Target_file link

输出:link -> ./Target_file

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

删除链接:unlink link

备注:如果你愿意,你的软链接可以工作,即使它从当前目录移动到其他地方。确保在创建软链接时给出绝对路径而不是相对路径。即(从 /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
  • 硬链接不能指向目录。

硬链接有两个限制:

  • 目录不能硬链接。Linux不允许这样做来维护目录的非循环树结构。
  • 不能跨文件系统创建硬链接。这两个文件必须在同一个文件系统上,因为不同的文件系统有不同的独立索引节点表(不同文件系统上的两个文件,但具有相同索引节点号的文件将不同)。

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

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

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

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

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

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

echo "111" > aln a bln -s a c

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

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

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

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

发生了什么事?

因为文件“c”指向文件“a”本身,如果文件“a”被删除,那么文件“c”将没有任何指向,实际上它也被删除了。

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

俗话说,一张图片胜过千言万语。我是这样想象的:

输入图片描述

以下是我们如何得到这张照片:

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

    $ echo 'Hello, World!' > myfile.txt
  2. Create a hard link my-hard-link to the file myfile.txt, which means "create a file that should point to the same inode that myfile.txt points to":

    $ ln myfile.txt my-hard-link
  3. Create a soft link my-soft-link to the file myfile.txt, which means "create a file that should point to the file myfile.txt":

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

Look what will now happen if myfile.txt is deleted (or moved): my-hard-link still points to the same contents, and is thus unaffected, whereas my-soft-link now points to nothing. Other answers discuss the pros/cons of each.

MSDN

符号链接

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

符号链接对用户是透明的;链接显示为正常文件或目录,并且可以由用户或应用程序执行以同样的方式

符号链接旨在帮助迁移和应用程序与UNIX操作系统兼容。Microsoft已实现它的符号链接功能就像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\fileLink: "link" maps to "..\..\theta"Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"Final Path: "C:\theta\gamma\file"

硬链接

A硬链接是文件的文件系统表示,其中多个路径引用单个文件在同一卷

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

mklink /H Link_name target_path

请注意,您可以按任何顺序删除硬链接,而不管它们的创建顺序如何。此外,当

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

结点

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

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

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

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

mklink /J link_name target_path

一个目录条目是链接一个结构:

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

ino是inode的数量,name是文件名,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 */

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

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

硬链接vs软链接

硬链接Vs软链接可以很容易地解释这个图像。

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

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

符号链接是一种特殊的文件。由于它也是一个文件,它将有一个文件名和一个inode号。如上所述,inode号访问指向数据的inode。符号链接的特殊之处在于,符号链接中的inode号访问那些指向另一个文件“路径”的inode。更具体地说,符号链接中的inode号访问那些指向另一个硬链接的inode。

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

关于使用的两分钱:

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

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

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

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

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

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

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

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

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

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

让我们使用终端制作一些硬和符号链接:“为什么这么认真”file.txt

硬链接:file.txtfile_hard

符号链接:ln-sfile.txtfile_sym

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

以下是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

Sym Link:将一个域重定向到另一个域

* 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