最近,在面试中有人问我这个问题。我很诚实,说我知道符号链接的行为以及如何创建符号链接,但不了解硬链接的用法以及它与符号链接的区别。
最近,在面试中有人问我这个问题。我很诚实,说我知道符号链接的行为以及如何创建符号链接,但不了解硬链接的用法以及它与符号链接的区别。
Answers:
在文件系统下,文件由inode表示。(或者是多个inode?不确定。)
文件系统中的文件基本上是指向索引节点的链接。
然后,硬链接仅创建另一个文件,该文件具有指向相同基础inode的链接。
删除文件时,它会删除一个指向基础索引节点的链接。仅在删除到该索引节点的所有链接后,该索引节点才被删除(或可删除/可重写)。
符号链接是指向文件系统中另一个名称的链接。
一旦建立了硬链接,该链接即指向inode。删除,重命名或移动原始文件不会影响硬链接,因为它链接到基础索引节点。索引节点上数据的任何更改都会反映在引用该索引节点的所有文件中。
注意:硬链接仅在同一文件系统内有效。符号链接可以跨越文件系统,因为它们只是另一个文件的名称。
使用任何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指向文件的索引节点(即内容)-未被更改。
$ 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
则仅是指向不存在文件的链接。
touch blah1; touch blah2
可以缩短为touch blah1 blah2
俗话说,一张图片值得一千个字。这是我的可视化方式:
这是我们获得该图片的方式:
myfile.txt
在文件系统中创建一个指向新索引节点的名称(该索引节点包含文件的元数据,并指向包含其内容的数据块,即文本“ Hello,World!”:
$ echo 'Hello, World!' > myfile.txt
创建指向my-hard-link
该文件的硬链接myfile.txt
,这意味着“创建一个文件,该文件应指向所指向的相同inode myfile.txt
”:
$ ln myfile.txt my-hard-link
创建指向my-soft-link
该文件的软链接myfile.txt
,这意味着“创建一个应指向该文件的文件myfile.txt
”:
$ ln -s myfile.txt my-soft-link
看一下如果myfile.txt
删除(或移动)将会发生什么:my-hard-link
仍然指向相同的内容,因此不受影响,而my-soft-link
现在却指向任何内容。其他答案则讨论了每种方法的优缺点。
myfile.txt
)。对于软链接,它的引用不是inode(其中包含数据),而是它的引用是myfile.txt
(例如/home/Documents/myfile.txt
)的文件系统路径
当原始文件四处移动时,硬链接很有用。例如,将文件从/ bin移动到/ usr / bin或/ usr / local / bin。到/ bin中的文件的任何符号链接都将由此中断,但是硬链接(直接链接到文件的inode)将不在乎。
硬链接可能只占用一个目录条目,因此可能会占用较少的磁盘空间,而符号链接则需要自己的索引节点来存储其指向的名称。
硬链接也需要较少的时间来解决-符号链接可以指向符号链接目录中的其他符号链接。其中一些可能位于NFS或其他高延迟文件系统上,因此可能导致网络流量无法解决。硬链接始终位于同一文件系统上,始终在单个查找中解决,并且永远不会涉及网络延迟(如果它是NFS文件系统上的硬链接,则NFS服务器将执行解析,并且对于客户端系统)。有时这很重要。不适合我,但是我可以想象高性能系统在其中可能很重要。
我还认为mmap(2)甚至open(2)之类的东西都使用与硬链接相同的功能来保持文件的inode处于活动状态,以便即使将文件取消链接(2),inode仍保留以允许进程继续访问,只有在进程关闭后,文件才真正消失。这样可以使用更安全的临时文件(如果可以自动进行打开和取消链接,可能我不记得其中可能有POSIX API,那么您确实有一个安全的临时文件),您可以在其中读写您的数据,而任何人都无法访问它。好的,在/ proc使每个人都可以查看您的文件描述符之前,确实是这样,但这是另一回事了。
说到此,恢复在进程A中打开但在文件系统上未链接的文件的过程围绕着使用硬链接来重新创建inode链接,因此当打开它的进程关闭文件或关闭文件时,文件也不会消失。
软链接:
软或符号更像是对原始文件的快捷方式。...如果删除原始文件,则快捷方式将失败,并且如果仅删除快捷方式,则原始文件将不会发生任何事情。
软链接语法:ln -s Pathof_Target_file link
输出: link -> ./Target_file
证明: readlink link
另外在ls -l link
输出你会看到的第一个字母lrwxrwxrwx
是升是表明该文件是软链接。
删除链接: unlink link
注意:如果愿意,即使将软链接从当前目录移到其他位置,也可以使用。创建软链接时,请确保提供绝对路径而不是相对路径。即(从/ root / user / Target_file开始,而不是./Target_file)
硬链接:
硬链接更多是镜像副本或指向同一文件的多个路径。对file1做一些操作,它会出现在文件2中。删除其中一个仍然可以使另一个正常。
仅在删除所有(硬)链接或到(相同文件)inode的所有路径时,才删除inode(或文件)。
一旦建立了硬链接,该链接便具有原始文件的索引节点。删除重命名或移动原始文件不会影响硬链接,因为它链接到基础索引节点。索引节点上数据的任何更改都会反映在引用该索引节点的所有文件中。
硬链接语法:ln Target_file link
输出:将创建一个具有名称链接的文件,其索引节点号与Targetfile相同。
证明:( ls -i link Target_file
检查其inode)
删除链接:( rm -f link
就像删除普通文件一样删除链接)
注意:符号链接可以跨越文件系统,因为它们只是另一个文件的名称。而硬链接仅在同一文件系统中有效。
符号链接具有一些功能,硬链接丢失了:
您会立即知道符号链接指向硬链接时所指向的位置,您需要浏览整个文件系统以查找共享相同inode的文件。
# find / -inum 517333
/home/bobbin/sync.sh /root/synchro
硬链接不能指向目录。
硬链接有两个限制:
查看硬链接和符号链接之间差异的简单方法是通过一个简单的示例。硬链接指向文件的存储位置或该文件的索引节点。一个符号链接将指向实际文件本身。
因此,如果我们有一个名为“ 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”的存储位置或索引节点。因此,如果删除文件“ a”,则它将不再指向索引节点,但是由于文件“ b”确实删除了索引节点,因此索引节点将继续存储属于“ a”的任何内容,直到不再有硬链接指向该索引为止。
我会指出您维基百科:
几点:
我补充尼克的问题:硬链接何时有用或必要?我想到的唯一一个其中符号链接无法完成工作的应用程序是在chroot环境中提供系统文件的副本。
符号链接是指向另一个文件系统对象的文件系统对象。指向的对象称为目标。
符号链接对用户是透明的。链接显示为普通文件或目录,并且用户或应用程序可以以完全相同的方式对其进行操作。
符号链接旨在帮助与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
也:
简单地说,硬链接:只是在文件中添加新名称,也就是说,一个文件可以同时具有多个名称,所有名称彼此相等,没有首选,硬链接并不意味着复制所有内容文件并创建新文件不是,它只是创建了一个备用名称而已。
符号链接(symlink):是指向另一个文件的文件指针,如果该符号链接指向一个现有文件,该文件随后被删除,则即使该名称不再为任何文件命名,该符号链接仍指向相同的文件名。
您认为普通的“文件”实际上是两个独立的部分:文件的数据和目录条目。当您为文件创建硬链接时,实际上是在创建第二个目录条目,该目录条目引用相同的数据。这两个目录条目具有完全相同的功能。每个文件都可以用来打开文件进行读取。因此,您实际上并没有“一个文件加一个硬链接”,而是“有两个目录条目的文件数据”。您所认为的删除文件实际上是删除目录条目,并且当删除数据的最后一个目录条目时,数据本身也会被删除。对于只有一个目录条目的普通文件,删除目录条目将照常删除数据。(打开文件时,操作系统会创建指向该文件的临时链接,
例如,创建一个文件A.txt,一个硬链接B.txt,然后删除A.txt。当您创建A.txt时,将创建一些数据以及一个目录条目A.txt。创建硬链接时,将创建另一个目录条目B.txt,指向完全相同的数据。删除A.txt时,仍然拥有所有数据和一个目录条目B.txt,就像您首先创建文件B.txt一样。
软链接只是一个(几乎)普通文件,只不过它不包含数据,而是另一个目录条目的路径。如果删除该软链接引用的文件,则该软链接将包含一个不再指向目录条目的路径。它被打破。如果删除软链接,则就像删除任何其他文件一样,它指向的文件不受影响。
目录条目是链接结构的目录:
struct dentry{
ino_t ino;
char name[256];
}
ino是索引节点的数目,名称是文件名,索引节点的结构可能类似于:
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 */
...
}
然后您创建到文件1的符号链接(可能是/ 200),目录条目可能类似于:
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 */
除上述所有答案外,查找硬链接和软链接文件的区别可以理解如下:
我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
选项)的硬链接。它将不必要的搜索保存到不同的安装点中。
因此,搜索硬链接比搜索软链接要快一些(如果我输入错误或不清楚,请纠正。)
我的用法两分钱:
软链接可用于缩短长路径名,即:
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
在这个答案中,当我说一个文件时,我指的是内存中的位置
所有保存的数据都使用称为inode的数据结构存储在内存中。每个inode都有一个inode编号.inode编号用于访问inode。指向文件的所有硬链接可能具有不同的名称,但共享相同的inode编号。由于所有硬链接都具有相同的索引节点号(依次访问相同的索引节点),因此它们都指向相同的物理内存。
符号链接是一种特殊的文件,由于它也是一个文件,因此将具有文件名和索引节点编号。如上所述,索引节点编号附加了一个指向数据的索引节点。符号链接中的索引节点访问指向另一个文件“路径”的那些索引节点。更具体地说,符号链接中的索引节点编号指向指向另一个硬链接的索引节点。
当我们在GUI中移动,复制,删除文件时,我们在使用文件的硬链接而不是物理内存。在删除文件时,我们正在删除文件的硬链接。我们不会清除物理内存。如果删除了所有与文件的硬链接,那么尽管存储在内存中的数据仍然可能无法访问,