如标题所示,我想知道命令创建的硬链接和软链接之间的区别ln
。该命令man ln
确实提供了信息,但没有充分回答我的问题。
同样,如果有人可以提供一种设置,使硬链接比符号链接更可取,那将是很好的。
如标题所示,我想知道命令创建的硬链接和软链接之间的区别ln
。该命令man ln
确实提供了信息,但没有充分回答我的问题。
同样,如果有人可以提供一种设置,使硬链接比符号链接更可取,那将是很好的。
Answers:
链接有两种类型:软链接(符号链接)或硬链接。
软链接(符号链接)
您可以建立指向文件和目录的链接,并且可以在不同的分区上创建链接(快捷方式),并使用与原始目录不同的inode编号。
如果实际副本被删除,则该链接将不起作用。
硬链接
硬链接仅适用于文件;您无法链接到具有不同inode编号的其他分区上的文件。
如果删除了真实副本,则该链接将起作用,因为该链接访问了真实副本正在访问的基础数据。
问题:如何建立软链接?
答案:可以使用ln -s
; 建立软链接。首先,您需要定义源,然后需要定义目标。(请记住,您需要定义源和目标的完整路径;否则它将不起作用。)
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1
(----------Source-------) ( Destination )
如您所见,它具有不同的inode并可以在不同的分区上进行。
问题:如何进行硬链接?
答:可以使用进行硬链接ln
。首先,您需要定义源,然后需要定义目标。(请记住,您需要定义源和目标的完整路径;否则它将不起作用。)
假设我在/script
名为的目录中有一个脚本firefox
。
ls -i # Shows you the inode
5898242 firefox
ln /scripts/firefox /scripts/on-fire
( Source ) ( Destination )
如您所见,它具有相同的inode。如果我删除原始链接,则该链接将起作用,并且它将充当原始链接。
在上方,我检查链接是否正常运行,然后删除原始的Firefox脚本。
您的问题:如果有人可以提供一种设置,使硬链接比符号链接更可取,那将是很好的。
回答:根据磁盘分区的布局,硬链接具有以下限制:它们必须位于同一分区(-1点),并且只能链接到文件(-1点),但是如果删除原始链接,则为+1点会工作,并且行为就像原来的一样。
另一方面,软链接可以指向目录或文件(+1点),并且没有分区限制(+1点),但是(-1点)如果删除源,则该链接将不起作用。
硬链接不是指向文件的指针,而是指向同一索引节点的目录条目(文件)。即使您更改另一个文件的名称,硬链接仍然指向该文件。如果将另一个文件替换为新版本(通过复制),则硬链接将不会指向新文件。同一文件系统内只能有硬链接。使用硬链接时,您没有原始文件和链接的概念,它们都是相同的(将其视为对对象的引用)。这是一个非常低级的概念。
另一方面,符号链接实际上指向另一个路径(文件名)。每次您通过符号链接访问文件时,它都会解析文件的名称。如果您移动文件,则符号链接将不会跟随。如果将文件替换为另一个文件,并保留名称,则符号链接将指向新文件。符号链接可以跨越文件系统。使用符号链接时,您可以在实际文件和符号链接之间有非常清晰的区别,符号链接不会在指向文件的路径旁边存储任何信息。
而且,“一个例子值得一百段……”
创建两个文件:
$ touch blah1
$ touch blah2
在其中输入一些数据:
$ echo "Cat" > blah1
$ echo "Dog" > blah2
和预期的一样:
$cat blah1; cat blah2
Cat
Dog
让我们创建硬链接和软链接:
$ ln blah1 blah1-hard
$ ln -s blah2 blah2-soft
让我们看看发生了什么:
$ ls -l
blah1
blah1-hard
blah2
blah2-soft -> blah2
更改blah1的名称无关紧要:
$ mv blah1 blah1-new
$ cat blah1-hard
Cat
blah1-hard指向文件的索引节点(即内容)-未更改。
$ mv blah2 blah2-new
$ ls blah2-soft
blah2-soft
$ cat blah2-soft
cat: blah2-soft: No such file or directory
找不到文件的内容,因为软链接指向已更改的名称,而不是内容。
同样,如果删除blah1,则blah1-hard仍保留内容;如果删除blah2,则blah2-soft只是指向不存在的文件的链接。
来源:公然从StackOverflow复制它!
git
是一个坏主意,以防万一有人(对软链接感到沮丧)想知道...也可以应用于其他版本控制系统。
两者都是文件的指针。区别在于指针的种类。符号链接通过名称指向另一个文件。它具有特殊模式位,可将其标识为符号链接,并且其内容是真实文件的名称。因为它仅包含一个名称,所以该名称实际上不必存在,也可以存在于其他文件系统上。如果替换命名文件(更改其内容而不影响其名称),则该链接仍包含相同的名称,因此现在它指向新文件。您可以轻松地识别符号链接并查看其指向的文件的名称。
硬链接通过索引节点号指向文件。因此,硬链接与文件的名相同。没有“真实”名称与硬链接名称;所有硬链接都是文件的有效名称。因此,链接到的文件必须实际存在,并且必须与尝试创建链接的文件系统位于同一文件系统中。如果删除原始名称,则硬链接仍指向同一文件。由于所有硬链接都是文件的同等有效名称,因此您无法查看文件的另一个名称;要找到此文件,您必须查看每个文件并比较它们的inode编号,以找到具有相同inode编号的其他名称。
您可以从的输出中知道一个文件有多少个名称ls -l
。文件模式之后的第一个数字是链接计数。链接多于1个的文件在某处具有其他名称,相反,链接数仅为1的文件没有(其他)硬链接。
If you replace the named file, then the link still contains the same name, and so now it points to the new file
-我认为这没有得到很好的解释。您是说,如果我替换有符号链接的文件,那么包含名称的链接将保持不变。但是,仅当其文件名(即替换旧文件的新文件)与替换文件(即被新文件替换的旧文件)相同时,才指向替换文件,对吗?
硬链接只能在同一文件系统上工作,它只是同一inode的不同名称(文件在内部由inode引用)。一个文件将在最后一个环节,以它的inode走了只能从磁盘上删除(您rm
D或unlink
d是最后一个环节)。硬链接通常仅适用于文件,不适用于目录。
符号链接(符号链接)是一个特殊文件,其中包含另一个文件的路径。此路径可以是绝对路径,也可以是相对路径。符号链接可以跨文件系统工作,甚至可以指向不同的文件,例如,例如,拔出外部硬盘驱动器,然后将其替换为在同一路径中具有不同文件的另一个硬盘驱动器。符号链接可以指向文件或目录。
-d, -F, --directory
开关。是的,我已经出现在笔记ln(1)
页面:)
ln
无法用于建立目录的硬链接。尽管存在到目录的硬链接,最突出的例子是.
和..
。我不想在原始答案中包括该内容,因为那只会使事情复杂化。
另一个线程的答案之一(现在从您的文章顶部链接)提到了此页面,我认为这是一个很好的中级解释。如果您迷失于ascii艺术,请使用tl; dr版本:
涉及的内核和文件系统透明地翻译了所有内容。
因此基于:
../parent.file
)我可能会有些困惑,但是通读各种东西之后,我一直在努力寻找标准文件和硬链接之间的区别。我读取它的方式是每个文件都包含一个硬链接(存储文件名),并链接到一个指向物理数据的索引节点。
添加硬链接只会为inode提供一个额外的基于文件系统的指针。那正确吗?
何时使用软链接:
跨文件系统链接:如果要跨文件系统链接文件,则只能使用符号链接/软链接。
链接到目录:如果要链接目录,则必须使用软链接,因为无法创建到目录的硬链接。
何时使用硬链接:
存储空间:硬链接占用的空间可忽略不计,因为在创建硬链接时不会创建新的索引节点。在软链接中,我们创建一个占用空间的文件(通常为4KB,具体取决于文件系统)
性能:由于直接访问磁盘指针而不是通过另一个文件,因此在访问硬链接时性能会稍好一些。移动文件位置:如果将源文件移动到同一文件系统上的其他位置,则硬链接仍将起作用,但软链接将失败。
冗余:如果要确保数据的安全性,则应使用硬链接,因为在硬链接中,数据是安全的,直到删除了所有指向文件的链接,而不是在软链接中,您将丢失如果删除文件的主实例,则返回数据。
当您尝试查找“文件名”和硬链接之间的差异时,就会出现混乱,因为两者之间没有区别。
您创建的每个文件都包含磁盘上的数据和硬链接 - 硬链接是目录中的文件名以及指向磁盘上数据的指针。故事结局。删除最后一个(或唯一一个)硬链接后,操作系统便知道不再需要该数据。
从中您可以看到,从不删除实际数据,只有硬链接被删除。并且当它在磁盘上足够拥挤时,数据可能会被另一个文件的数据覆盖。在此之前,可能会恢复已删除文件中的数据,但是如果没有硬链接就很难找到它。
如前所述,Symlinks只是告诉您“ <targetname>
在名为<targetfolder>
“ 的文件夹中有一个文件”。他们指向硬链接。他们不知道数据在哪里。硬链接知道这一点。