Linux中的硬链接
Linux文件系统有两个主要组件:存储数据的数据块池以及管理此数据池的数据库系统。
inode就像该数据库系统的索引。
Linux中的硬链接是什么?
将文件的硬链接指向文件的inode而不是指向文件本身。
这样,硬链接获取原始文件的所有属性,并指向与原始文件相同的数据块。
如果我们记得符号链接或者软链接,则知道它指向文件。
硬链接是在指向已存在的inode的目录中手动创建的条目。
我将以正确的图表向我们解释。
让我们拍摄此目录结构:
所以基本上,根目录包含DIR_1和DIR_2目录。
Dir_1目录具有File_1和File_2文件,而Dir_2包含File_3和文件2的硬链接。
让我们看看文件系统中的样子。
一切都是代表性的。
实际上,根目录将有数千个文件。
其中我们假设只有两个目录。
记住Linux目录结构?
我们从根(/)开始。
根目录始终具有inode 2.
如果必须访问文件3,则绝对路径将为/dir_2/file_3.
其中我们可以如下阅读它:我们从inode 2开始(root始终indoe 2),然后按照箭头到其数据块。
该数据块具有关于DIR_2的inode(我们的示例中的inode 27)的信息。
现在我们调查inode 27.它的类型是目录。
我们遵循其数据块,该数据块具有关于文件inode的inode(inode88)的信息。
我们调查inode 88.其类型是文件,如果我们遵循其数据块,则访问文件的内容。
我们是否注意到该目录本身并不满足其文件的数据?
目录本质上是一个包含文件和子目录的内部信息的文件。
我们必须想知道上面的图像中的链接计数。
当我们处理硬链接时,特别是超级重要。
链接计数是指向inode的目录条目数。
例如,针对DIR_2忘记27.
inode 27曾在根目录的数据块中,并在其自己的数据块(特殊目录中。
因此它具有2的链接计数。
请注意,除File_2之外,所有文件都有链接计数1?
如果文件有链接数超过1,则意味着存在硬链接"此文件'。
由于硬链接指向与目标文件相同的inode(inode 17),因此我们将获得2个inode 17的目录列表(在DIR_1和DIR_2的数据块中)。
如何在Linux中创建硬链接
我们可以使用LN命令来创建硬链接:
ln target_file link_name
这将创建一个名为link_name的硬链接到target_file。
我们将看到Link_name看起来像常规文件,其属性与目标文件相同。
如果使用ls -li命令(-i选项显示inode号码),则会看到其链接计数为2.链接计数在文件权限字段之后。
134195 -rw-r--r-- 2 igi igi 0 May 17 19:49 target_file 134195 -rw-r--r-- 2 igi igi 0 May 17 19:49 link_target_file
两者都具有相同的inode号码134195,显然是。
要记住硬链接的事情
既然你对Linux中的硬链接有一个好主意让我们进一步取得一点。
删除目标文件如果具有硬链接,则不会再删除其数据
如果删除目标文件,则仍然可以通过硬链接访问其内容。
这是因为目标文件和硬链接都具有相同的inode,因此它们指向相同的数据块。
删除Linux中的文件基本上取消链接。
假设使用RM命令删除File_1.
Linux内核将发现file_1对应于inode 16.
它将从DiR_1的列表中删除File_1条目,并减少inode 16的链接计数1.现在inode 16的链接计数为0,内核知道没有一个链接到此inode,因此删除inode是安全的,以删除inode是安全的与它相关联的数据块。
现在说你删除file_2.
内核将从dir_1的列表中删除文件_2,并将转到inode 17.它将减少inode 17的链接计数,使其降低到1.由于链路计数不为零,内核不会删除与之关联的inode或者数据它。
因此,如果访问硬链接,即使原始文件已被删除,我们仍然可以访问数据。
我们不应该创建到目录的硬链接
我们可以创建一个软链接到目录,但是当我们尝试创建到目录的硬链接时,我们将看到这样的错误:
ln: newdir/test_dir: hard link not allowed for directory
为什么目录不允许硬链接?
这是因为使用目录的硬链接可能会破坏文件系统。
从理论上,我们可以使用-d或者-f选项创建到目录的硬链接。
但即使我们是root用户,大多数Linux发行版也不会允许。
几乎不可能区分硬链接和原始文件
让我们再看一下我之前创建的硬链接:
134195 -rw-r--r-- 2 igi igi 0 May 17 19:49 target_file 134195 -rw-r--r-- 2 igi igi 0 May 17 19:49 link_target_file
它们具有相同的属性,但我们可以猜测哪个是基于上述示例中的名称的链接,但如果名称不明显,则何时何地?
你怎么知道他们的名字是target_1和target_2吗?
如果文件和链接位于不同的目录中,则可以尝试检查MIME和其他参数以知道目录的内容是否更改时,但即使是确定性。
如果文件和硬链接位于同一目录中并且历史记录已被删除,我不确定如何弄清楚哪个是原始文件,哪个是硬链接。
如何查找给定文件的所有硬链接
如果我们发现文件有多个链接计数,则可能会对与其相关联的其他硬链接感到好奇。
一个方法可以使用文件的inode号码。
我们可以使用ls -i命令或者stat命令获取inode号码。
有一个inode号后,我们可以使用查找命令查看与其关联的所有链接。
find . -inum inode_number