在linux中,文件链接可以使多个文件名引用同一个文件。有两种方式可以创建指向同一个文件的多个名称,分别是硬链接和软链接(符号链接)
在介绍软链接和硬链接前,我们先看下什么是inode。
索引节点是 Linux 文件系统中的秘密工作者,它们存储文件或目录的元数据,存储了有关文件的各种信息,如权限、所有者、文件大小、时间戳等。每个文件都对应一个唯一的索引节点,这个节点在文件系统中有一个唯一的索引号(inode number)。索引节点可以被看作是文件的“管理者”,它记录了文件的所有关键信息,而文件名则只是指向这个索引节点的一种方式。
索引节点里记录的关键内容示例:
我们可以使用 stat
命令查看某个文件的inode信息。
一般情况下,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。
这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为硬链接(hard link)。
我们可以使用ln
命令创建一个指向现有文件的新硬链接(另一个名称)。该命令至少需要两个参数,即现有文件的路径以及要创建的硬链接的路径。
例如,以下命令为现有文件file.txt创建硬链接file-hlink.txt:
ln file.txt /tmp/file-hlink.txt
我们可以通过ls -l 命令来确定某个文件的硬链接数。
另一种链接方式是这样的,文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的软链接(soft link)或者符号链接(symbolic link)
所以软链接就是新创建了一个新文件,若原文件删了,那么软链接就失效了,而硬链接不会。
这是软链接与硬链接最大的不同:链接文件指向原文件的文件名,而不是原文件的inode号码,原文件的inode链接数不会因此发生变化。
和创建硬链接类似,我们可以使用ln
命令加-s
选项创建一个指向现有文件的软链接。该命令至少需要两个参数,即现有文件的路径以及要创建的软链接的路径。
例如,以下命令为现有文件file.txt创建软链接file-slink.txt:
ln -s file.txt /tmp/file-slink.txt
在使用ls -l命令显示文件和目录信息时,第一个字符代表文件类型,若显示为 l 那么就是软链接。并且会用箭头指向它所对应的原文件。
例如,下面所示图中第一个绿框中是 l ,意味findfiles-slink是一个软链接。第二个框显示了它是findfiles的软链接
我们还可以通过ls
命令和 -i
选项列出文件的索引节点编号,若两个文件处在同一个文件系统且inode编号相同则为硬链接。
例如,以下所示图中,第一列数字即为inode编号。list 和 list-hlink互为硬链接,它们的inode编号相同。而findfiles和它的软链接findfiles-slink的inode编号并不相同。
软链接 | 硬链接 | |
---|---|---|
inode | 原文件和链接文件是两个不同的文件,它们拥有不同的inode号码 | 原文件和链接文件是同一个的文件,它们共用同一个inode号码 |
文件属性 | 明确指明是链接文件 | 和原文件的属性一致。因为在本质上硬链接文件和原文件是平等的关系 |
跨文件系统建立 | 可以 | 不可以 |
指向的文件 | 可以指向目录或特殊文件 | 只能指向常规文件 |
链接数目 | 文件的链接数目不会增加,文件大小是不一样的(可以简单理解为快捷方式) | 文件的链接数会增加,文件大小是一样的 |
删除原文件对链接文件是否有影响 | 是,删除原文件后,软链接文件就失效了 | 否,原文件删除后,链接数会减1,只有链接数减为0时才算真的删除文件 |
好啦,这次的分享就到这里,感谢大家看到这里