最近我在一次工作面试中被问到这个问题。我诚实地说,我知道符号链接的行为和如何创建一个,但不了解硬链接的使用,以及它与符号链接的区别。
当前回答
通过一个简单的例子可以看出硬链接和符号链接之间的区别。指向文件的硬链接将指向存储文件的位置,或者指向该文件的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”的任何内容,直到不再有硬链接指向它。
其他回答
另外:
硬链接的读取性能优于符号链接(微性能) 符号链接可以被复制,版本控制,等等。换句话说,它们是一个实际的文件。另一方面,硬链接的级别略低,您会发现,与符号链接相比,提供将硬链接作为硬链接而不是普通文件处理的工具较少
我对使用的两点看法:
软链接可以用来缩短长路径名,例如:
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上的文件
软链接:
软的或象征性的更像是原始文件....的捷径如果您删除原始的快捷方式失败,如果您只删除快捷方式,原始的不会发生任何变化。
软链接语法:ln -s Pathof_Target_file链接
输出:link -> ./Target_file
证明:readlink链接 同样,在ls -l链接输出中,您将看到lrwxrwxrwx中的第一个字母为l,这表明该文件是一个软链接。
删除链路:unlink链路
注意:如果你愿意,你的软链接即使从当前目录移动到其他地方也可以工作。在创建软链接时,请确保您给出的是绝对路径而不是相对路径。即(从/root/user/Target_file开始,而不是。/Target_file)
硬链接:
硬链接更多的是镜像副本或同一文件的多条路径。对file1做一些操作,它就会出现在文件2中。 删除一个仍然可以保留另一个。
inode(或文件)只有在所有(硬)链接或(同一文件)inode的所有路径都已删除时才会被删除。
一旦创建了硬链接,该链接就具有原始文件的inode。删除重命名或移动原始文件不会影响硬链接,因为它链接到底层inode。对inode上数据的任何更改都反映在引用该inode的所有文件中。
硬链接语法:ln Target_file链接
输出:将创建一个名称为link的文件,其索引节点号与Targetfile相同。
证明:ls -i link Target_file(检查它们的索引节点)
删除链接:rm -f link(像删除普通文件一样删除链接)
注意:符号链接可以跨文件系统,因为它们只是另一个文件的名称。而硬链接只在同一个文件系统中有效。
符号链接有一些硬链接所没有的特性:
Hard link point to the file content. while Soft link points to the file name. while size of hard link is the size of the content while soft link is having the file name size. Hard links share the same inode. Soft links do not. Hard links can't cross file systems. Soft links do. you know immediately where a symbolic link points to while with hard links, you need to explore the whole file system to find files sharing the same inode. # find / -inum 517333 /home/bobbin/sync.sh /root/synchro hard-links cannot point to directories.
硬链接有两个限制:
目录不支持硬链接。Linux不允许这样维护目录的非循环树结构。 不能跨文件系统创建硬链接。这两个文件必须在相同的文件系统上,因为不同的文件系统有不同的独立的inode表(两个文件在不同的文件系统上,但是具有相同的inode号将是不同的)。
我刚刚发现了一个简单的方法来理解硬链接在一个常见的场景,软件安装。
有一天,我下载了一个软件到下载文件夹进行安装。在我做sudo make install后,一些可执行文件被cped到本地bin文件夹。这里,cp创建硬链接。我对这个软件很满意,但很快就意识到,从长远来看,下载并不是一个好地方。所以我把软件文件夹移动到源目录。好吧,我仍然可以像以前一样运行软件而不用担心任何目标链接的事情,就像在Windows中一样。这意味着硬链接可以直接找到inode和其他文件。
在文件系统下面,文件由inode表示。(或者是多个索引节点?不确定。)
文件系统中的文件基本上是一个到inode的链接。 因此,硬链接只是创建另一个文件,该文件具有指向相同底层inode的链接。
当您删除一个文件时,它会删除到底层inode的一个链接。只有当到inode的所有链接都被删除时,inode才会被删除(或可删除/可覆盖)。
符号链接是指向文件系统中另一个名称的链接。
一旦建立了硬链接,链接就指向inode。删除、重命名或移动原始文件不会影响硬链接,因为它链接到底层inode。对inode上数据的任何更改都反映在引用该inode的所有文件中。
注意:硬链接只在同一个文件系统内有效。符号链接可以跨文件系统,因为它们只是另一个文件的名称。