之间的区别是什么一个象征性的链接和一个硬链路?
题
最近,我被要求在一个工作面试。我是诚实的说我知道怎么一个象征性的链路的行为和如何创建一个,但不理解所使用的硬的链接,以及它如何不同于一个象征性的一个。
解决方案
文件系统下面的文件由inode表示(或者多个inode不确定)
文件系统中的文件基本上是指向inode的链接 然后,硬链接只创建另一个文件,其中包含指向同一底层inode的链接。
删除文件时,会删除一个指向底层inode的链接。只有删除了所有指向inode的链接后,才会删除(或删除/可覆写)inode。
符号链接是指向文件系统中另一个名称的链接。
一旦建立了硬链接,就会链接到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指向文件的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
只是一个指向不存在文件的链接。
俗话说,一张图片胜过千言万语。以下是我将其可视化的方式:
以下是我们如何了解这张照片:
-
在文件系统中创建一个名称
myfile.txt
,指向新的inode(包含文件的元数据并指向包含其内容的数据块,即文字“你好,世界!”:$ echo 'Hello, World!' > myfile.txt
-
为文件
myfile.txt
创建一个硬链接my-hard-link
,这意味着“创建一个应该指向同一个inode的文件”myfile.txt
指向":$ ln myfile.txt my-hard-link
-
为文件
myfile.txt
创建一个软链接my-soft-link
,这意味着“创建一个应指向该文件的文件<代码> myfile.txt的代码>&QUOT;:$ ln -s myfile.txt my-soft-link
醇>
如果 myfile.txt
被删除(或移动),看看现在会发生什么: my-hard-link
仍然指向相同的内容,因此不受影响,而 my-soft-link
现在却什么都没有。其他答案讨论了每个人的利弊。
当原始文件被移动时,硬链接很有用。例如,将文件从/ bin移动到/ usr / bin或移动到/ usr / local / bin。 / bin中文件的任何符号链接都会被这个打破,但是硬链接(直接指向文件的inode的链接)并不关心。
硬链接可能占用较少的磁盘空间,因为它们只占用目录条目,而符号链接需要自己的inode来存储它指向的名称。
硬链接也需要更少的时间来解决 - 符号链接可以指向符号链接目录中的其他符号链接。其中一些可能在NFS或其他高延迟文件系统上,因此可能导致网络流量得到解决。始终在同一文件系统上的硬链接总是在一次查找中解决,并且从不涉及网络延迟(如果它是NFS文件系统上的硬链接,NFS服务器将执行解析,并且它将不可见客户系统)。有时这很重要。不适合我,但我可以想象这可能很重要的高性能系统。
我还认为像mmap(2)甚至open(2)这样的东西使用与硬链接相同的功能来保持文件的inode活动,这样即使文件被取消链接(2),inode仍然允许进程继续访问,只有在进程关闭后,文件才会真正消失。这允许更安全的临时文件(如果你可以原子地进行打开和取消链接,可能有一个我不记得的POSIX API,那么你真的有一个安全的临时文件)你可以读/写没有任何人能够访问您的数据。好吧,在/ proc让每个人都能够查看你的文件描述符之前,这是真的,但这是另一个故事。
说到这一点,恢复在进程A中打开但在文件系统上取消链接的文件围绕使用硬链接重新创建inode链接,这样当打开它的进程关闭它时,文件不会消失或者走了。
查看硬链接和符号链接之间差异的简单方法是通过一个简单的示例。指向文件的硬链接将指向存储文件的位置或该文件的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”表示文件“b”。指向文件“a”的存储位置或inode。因此,如果文件“a”,被删除然后它将不再指向inode,而是因为文件“b”被删除。确实如此,inode将继续存储属于“a”的任何内容。直到没有更多的硬链接指向它。
柔软的链接:
柔软的或象征性更多的是一个短期切的原始文件。...如果删除原来的快捷方式的失败,并且如果你仅仅删除该短切没有发生原来的。
软链接的语法: ln -s Pathof_Target_file link
输出: link -> ./Target_file
证明: readlink link
还在 ls -l link
输出你会看到的第一个字母 lrwxrwxrwx
作为 我 这是指示,该文件是软的链接。
删除的链接: unlink link
注: 如果你愿意,你的软链接可以工作,即使后移动它在其他地方从目前的目录。确保你得到绝对的道路并不相对路径,同时创造一个柔软的链接。即(从开始/root/用户/Target_file和不./Target_file)
硬的链接:
硬的链接,更多的是一面镜子副本或多个路径相同的文件。做些什么来1和它出现在文件2中。删除一个仍然保持其他确定。
Inode(或文件)是仅删除所有的(硬的)链接或所有的路径(同文件)inode已被删除。
一旦一个硬链路已经作出的链接拥有的索引的原始文件。删除名或运动原始文件将不会影响很难链接,链接到基础的索引节点。任何修改的数据点反映在所有文件的参考索引节点。
硬链接的语法: ln Target_file link
输出: 文件的链接,将创建具有相同的索引编号为的Targetfile.
证明: ls -i link Target_file
(检查他们的节点)
删除的链接: rm -f link
(删除链就像一个正常的文件)
注意到:象征性的链接,可以跨越文件系统,因为他们都只是名称的另一个文件。而硬的链接,是唯一有效的在相同文件的系统。
象征性的联系的一些特点硬的链接缺失:
- 硬链接的点对该文件的内容。虽然软链接指向 文件名称。
- 虽然大小的硬链接的内容,同时软链接 具有的文件名称尺寸。
- 硬的链接,共享相同的索引节点。柔软的链接不这样做。
- 硬的链接不能跨文件系统。柔软的链接做。
你马上就知道其中一个象征性的链接点,同时与难 链接,需要探索整个文件系统查找文件 共同的索引节点。
# find / -inum 517333
/home/bobbin/sync.sh /root/synchro
硬的链接不能指向的目录。
硬的链接有两个限制:
- 该目录不是很难相联系。Linux不允许这个以维持环树形结构的目录。
- 硬的链接,不可能创建的跨文件系统。这两个文件必须在同一文件系统,因为不同的文件系统具有不同的独立的索引表(两个文件在不同文件系统,但具有相同的索引编号将是不同的)。
符号链接链接到路径名称。这可以是系统文件树中的任何位置,甚至在创建链接时也不必存在。目标路径可以是相对路径或绝对路径。
硬链接是指向inode的附加指针,这意味着它们只能存在于与目标相同的卷上。到文件的附加硬链接与“原始”文件无法区分。用于引用文件的名称。
硬链接是非常有用的做递增的备份。看看 rsnapshot, 例。这个想法是做复制使用硬链接:
- 复制备份数量n n+1
- 复制备份n-1到n
- ...
- 复制备份0到备份的1
- 更新的备份0任何更改的文件。
新的备份不会采取任何额外的空间,除了任何更改,因为所有的增加备份将指向同一集的节点对于文件没有改变。
我补充说尼克的问题:什么硬链接有用还是必要?我想到的唯一一个符号链接无法完成工作的应用程序是在chrooted环境中提供系统文件的副本。
此外:
- 读取硬链接的性能优于符号链接(微观性能)
- 符号链接可以复制,版本控制,..等。换句话说,它们是一个实际的文件。另一方面,硬链接稍微低一些,你会发现与符号链接相比,有更少的工具可以提供硬链接作为硬链接而不是普通文件的方法 醇>
您认为普通的“文件”是什么?实际上是两个独立的东西:文件的数据和目录条目。为文件创建硬链接时,实际上会创建第二个目录条目,该条目引用相同的数据。两个目录条目具有完全相同的功能;每个都可以用来打开文件来读取它。因此,您实际上没有“文件加硬链接”,您有“具有两个目录条目的文件数据”。您认为删除文件实际上会删除目录条目,并且当删除数据的最后一个目录条目时,也会删除数据本身。对于只有一个目录条目的普通文件,删除目录条目将一如既往地删除数据。 (当文件打开时,操作系统会创建一个指向该文件的临时链接,因此即使删除所有目录条目,数据也会在关闭文件后保持但消失)。
例如,创建文件A.txt,硬链接B.txt,并删除A.txt。创建A.txt时,会创建一些数据,并创建目录条目A.txt。创建硬链接时,会创建另一个目录条目B.txt,指向完全相同的数据。当您删除A.txt时,您仍然拥有所有数据和单个目录条目B.txt,就像您首先创建文件B.txt一样。
软链接只是一个(几乎)普通文件,除了它不包含数据,而是包含另一个目录条目的路径。如果删除软链接引用的文件,则软链接将包含不再指向目录条目的路径;它被打破。如果删除软链接,就像删除任何其他文件一样,它指向的文件不受影响。
从 MSDN,
象征性的链接
一个象征性的链接,是一个文件体系对象指向另一个文件系统的对象。对被指称为目标。
象征性的链接对用户透明;链接出现正常 文件或目录,并且可以采取行动的用户或应用程序 在完全相同的方式。
象征性的链接,是设计来帮助迁移和应用程序 兼容性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"
硬链接
一个 硬链接 是的文件系统表示的文件,通过它 超过一个路径引用一个单一的文件 在相同体积.
创建硬链接在窗户,导航链接,是设立和进入这个命令:
mklink /H Link_name target_path
注意,你可以删除硬链接的任何顺序,而不论它们的顺序。此外,硬的链接,不可能创造时
- 参考文献在不同的地盘
- 参考文献包括网络驱动器。换句话说,一个参考文献被一网络驱动器
- 硬链接须建立在相同的路径作为目标
结
NTFS支持的另一个链接类型称为结。MSDN定义如下:
一个连接(也称为软链接)的不同而不同,从一个难链接储存的对象,它所引用的都是单独的目录,以及一个结可以链接目录的位置上 不同地方上的卷相同的计算机.否则,结以相同方式来硬的链接。
这加粗的部分在难链接的部分和结部分之间的基本差别的两个。
命令创建一个联结在窗户,导航链接,是设立和随后输入:
mklink /J link_name target_path
简单来说,硬链接:只是为文件添加新名称,这意味着,一个文件可以同时拥有多个名称,所有名称彼此相等,没有人首选,硬链接并不意味着要复制文件的所有内容和创建新文件不是那样的,它只是创建一个可以知道的替代名称。
符号链接(符号链接):是指向另一个文件的文件指针,如果符号链接指向稍后删除的现有文件,则符号链接继续指向相同的文件名,即使该名称不再指定任何文件名文件。
目录条目是链接结构:
struct dentry{
ino_t ino;
char name[256];
}
ino是inode的数量,名称是文件名,inode结构可能像&#65306;
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 */
添加上述所有答案后,查找硬链接和软链接文件的区别可以理解如下:
我当前目录中有一个 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
选项)的硬链接 - 系统/挂载点。它将不必要的搜索保存到不同的挂载点。
因此搜索硬链接比搜索软链接要快一些(如果我错了或不清楚,请纠正)。
符号链接以类似于硬链接的方式为文件指定另一个名称。但即使有剩余的符号链接,也可以删除文件。
我刚刚找到了一种简单的方法来理解常见场景中的硬链接,软件安装。
有一天,我将软件下载到文件夹 Downloads
进行安装。在我执行 sudo make install
之后,一些可执行文件被 cp
编辑到本地bin文件夹。在这里, cp
会创建 硬链接 。我对软件感到满意,但很快意识到 Downloads
从长远来看并不是一个好地方。所以我 mv
将软件文件夹编辑到 source
目录。好吧,我仍然可以像以前一样运行软件而不必担心任何目标链接的东西,比如在Windows中。这意味着 硬链接 直接找到inode和其他文件。
在这个答案当我说一个文件我的意思是内存中的位置
使用名为inode的数据结构将保存的所有数据存储在内存中每个inode都有一个inodenumber .inode号用于访问inode。所有到文件的硬链接可能有不同的名称但共享相同的名称inode number。由于所有硬链接都具有相同的inodenumber(访问同一个inode),所以它们都指向相同的物理内存。
符号链接是一种特殊的文件。因为它也是一个文件,它将具有文件名和inode编号。如上所述,inode编号接受指向data的inode。现在是什么使符号链接特别的是符号链接中的inodenumbers访问指向“路径”的那些inode。更具体地说,符号链接中的inode号接收那些指向另一个硬链接的inode。
当我们在GUI中移动,复制,删除文件时,我们正在使用文件的硬链接而不是物理内存。当我们删除文件时,我们正在删除文件的硬链接。我们没有消除物理内存。如果文件的所有硬链接都被删除,那么虽然它可能仍然存在于内存中,但是无法访问存储的数据
我的两美分的使用情况:
柔软的 链接可用来缩短漫长道路的名称,即:
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