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


#1楼

使用任何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 -lfoo
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楼

也:

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

#3楼

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

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


#4楼

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

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

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

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

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

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


#5楼

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

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


#6楼

我会指向维基百科:

  • 符号链接
  • 硬链接

几点:

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

#7楼

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


#8楼

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

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

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

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

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


#9楼

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

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

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


#10楼

软链接

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

软链接语法ln -s Pathof_Target_file link

输出: link -> ./Target_file

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

删除链接: 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 
  • 硬链接不能指向目录。

硬链接有两个限制:

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

#11楼

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


#12楼

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

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

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


#13楼

查看硬链接和符号链接之间差异的简单方法是通过一个简单的示例。 指向文件的硬链接将指向存储文件的位置或该文件的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”的任何内容,直到不再有硬链接指向它为止。


#14楼

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

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

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

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

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

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

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


#15楼

来自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\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"

硬链接

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

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

mklink /H Link_name target_path

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

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

连接点

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

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

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

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

mklink /J link_name target_path

#16楼

目录条目是链接结构:

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楼

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

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


#18楼

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


#19楼

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

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

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

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


#20楼

我使用的两分钱:

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

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楼

除了以上所有答案之外,查找硬链接和软链接文件的区别可以理解如下:

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

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

符号链接和硬链接有什么区别?相关推荐

  1. 软链接(Soft Link,符号链接)和硬链接(Hard Link)。

    目录 引言 创建软连接,硬链接 创建语句 二者区别 引言 链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法.方便文件的共享使用,在Linux操作系统中引入了连接,链接被分为两种:软 ...

  2. 【批处理DOS-CMD命令-汇总和小结】-符号链接、硬链接、软链接、目录联结(mklink)

    以下的测试环境是win10教育版. 参考来源 windows快捷方式,符号链接,软链接和硬链接 关于mklink的/D /J 区别_notback的博客-CSDN博客_mklink 区别 Window ...

  3. HDFS符号链接和硬链接

    前言 初看这个标题,可能很多人会心生疑问:符号链接和硬链接是什么意思?这些概念不是在Linux操作系统下才有的嘛,HDFS目前也有?当然大家可能还会有其他疑问,没关系,在后面的内容讲述中答案会一一揭晓 ...

  4. Linux随笔2 - Linux的目录配置、文件元数据信息、符号链接与硬链接和常用文件和目录管理命令示例

    目录 1. Linux的目录配置与FHS(Filesystem Hierarchy Standard) 1.1 根目录(/)的意义与内容 1.1.1 FHS要求根目录中必须存在的目录 1.1.2 FH ...

  5. linux什么是硬链接和软连接区别,Linux硬链接和软连接的区别与总结

    图示软硬链接的区别 有关硬链接的总结 具有相同inode节点号的多个文件互为硬链接文件: 删除硬链接文件或者删除源文件任意之一,文件实体并未被删除: 只有删除了源文件和所有对应的硬链接文件,文件实体才 ...

  6. linux中硬链接文件,科学网—Linux:文件的符号链接和硬链接 - 刘洋洋的博文

    参考:中国大学MOOC课程<Linux系统管理>,授课教师:颜晨阳. 推荐阅读: t.cn/RLXkhpc 1 符号(symbolic)链接 与Windows的快捷方式很像,这些文件很小, ...

  7. 【Linux】创建文件链接(ln | 符号链接和硬链接)

    摘要 本文将介绍如何在 Linux 中为文件创建硬练级和符号(软)链接,并探讨两者之间的相同和不同之处. 引言 符号链接与 Windows 中的快捷方式很像.Windows 中的快捷方式是一个带箭头的 ...

  8. 【Linux】软连接/符号链接和硬链接

    硬链接和软链接的原理:(软链接又叫符号链接)   通过优缺点来认识硬链接: 硬链接的优点是:当用户误删原文件时,硬链接还能找到存储在磁盘的数据,可以作为新的原文件继续使用,适用于系统文件的链接:一个硬 ...

  9. 硬链接和软链接区别总结

    1.本质:     硬链接:本质是同一个文件     软连接:本质不是同一个文件 2.跨设备     硬链接:不支持     软连接:支持 3.inode     硬链接:相同     软链接:不同 ...

最新文章

  1. 【Vue】Vue1.0+Webpack1+Gulp项目升级构建方案的踩坑路
  2. 对现代软件工程开发看法
  3. Java核心技术卷1心得笔记1---Java程序设计概述
  4. 系统架构:Web应用架构的新趋势 前后端分离的想法
  5. 无法访问你试图使用的功能所在的网络位置_[steam实用工具]解决无法访问商店/社区/好友列表的问题...
  6. input file实现批量上传
  7. React开发(237):dva概念2state
  8. es6箭头函数_javascript-ES6函数进阶(箭头函数,默认参数)(笔记)
  9. 实时计算-多级订单金额,及下级人数
  10. mysql错误码 1045_MySql错误代码1045的解决方法
  11. partition分区(左小右大)
  12. 漫画:如何给女朋友解释什么是单例模式?| 技术头条
  13. 交换机 路由器和集线器的区别
  14. 亚马逊+纽约大学开源图神经网络框架DGL:新手友好,与主流框架无缝衔接
  15. 数组 / 伪数组 判断及方法调用 (权威指南笔记)
  16. 点击列表高亮_办公小技巧:妙用条件格式 高亮显示查询结果
  17. 复旦大学入学计算机考试大纲,《计算机办公自动化》课程入学考试考核大纲和样题-复旦大学外国留学生...
  18. Gurobi运筹学开发教程04:拉格朗日分解技术及其实现
  19. PalmOS开发教程
  20. 分布式和集中式版本控制工具-svn,git,mercurial比较分析

热门文章

  1. Android AOSP 编译sdk
  2. JAVA层HIDL服务的获取原理-Android10.0 HwBinder通信原理(九)
  3. console js刷新页面_Console.js使用说明
  4. c++ opencv 通过网络连接工业相机_OpenCV项目实战之零件缺陷检测(上)
  5. rocketmq广播消息为什么不能重试_几分钟带你看懂“消息队列和RocketMQ”的入门总结
  6. Android之四大组件概念讲解
  7. LifeCycle原理分析
  8. 事件分发机制并不是洪水猛兽
  9. Android9.0 新特性
  10. (016)java后台开发之Eclipse安装反编译插件