硬和软是一对反义词,相信很多同学在刚接触硬链接、软链接时都会被这对反义词带入理解概念的误区。那么如何来理解硬链接与软链接呢?
链接是一种允许多个文件名引用磁盘上单个文件的机制。有两种链接:
hard links(硬链接)
symbolic/soft links(一般称为软链接,但我觉得称为符号链接更为贴切)
硬链接会将多个文件名与一个inode(索引节点)关联,每个文件至少有一个硬链接且所有硬链接会共享相同的磁盘数据块,同时也作为独立的目录条目,当你创建一个硬链接后,链接计数将增加1。但需要注意的是无法跨越磁盘创建硬链接,因为inode编号仅在给定设备中是唯一的。
#创建硬链接
ln 文件名 硬链接名
操作系统在读取磁盘时,一次性读取多个扇区(sector),这些扇区组成了“块”(block),块是文件系统存取的最小单位。默认情况下8个sector,组成一个4KB大小的block。文件数据都存储在“块”中,而文件的元数据(属主、属组、创建时间、大小、指向与文件内容关联的数据块的指针等)都保存在“inode”中,也叫这块存储元数据的区域做“索引节点”。操作系统中的每个文件都有一个与之关联的inode,Solaris ZFS除外,它没有inode。inode的工作原理基本上类似于一本书的附录。
符号链接是指向另一个文件的特殊文件类型,其具体内容只是它指向的目标文件的全路径名称,一旦符号链接所指向的文件被删除,该链接仍然指向文件地址,但只留下一个挂起的链接。
#创建符号链接
ln -s 文件名 符号链接名
#查看所有符号链接
find ./* -type l -ls
示例1.
如上图,我们通过ln命令创建了file1的硬链接file2,通过“ln -s”命令创建了file1的符号链接file3。接下来通过“ls -li”命令可以看出file1与file2的权限、属主、属组、文件大小、修改时间都是相同的,且都指向值为“36375454”的inode,第三列则表明有2个硬链接指向这个inode。注意,符号链接file3指向了不同的inode。并且file3的文件大小是5(“file1”的字符长度)。如过以下图方式创建符号链接,则其长度为16(“/home/test/file1”的长度)。
示例2.
如上图,在删除原始文件file1后,硬链接file2仍然可以访问,符号链接仍存在,但是已经无法访问其链接的内容了,且目录变得闪烁,表示此链接不可用。
示例3.
如上图,当前操作系统的/dev/sda3分区挂载在根目录,/dev/sdb1分区挂载在/mnt/sdb1目录。在创建file1的硬链接到/mnt/sdb1/file2时产生报错,提示无法跨设备创建硬链接。接下来使用命令“ln -s file1 /mnt/sdb1/file3”成功创建符号链接,但是方位file3时提示找不到文件,通过命令“ll /mnt/sdb1/file3”看到file3指向的原始文件路径只有“file1”,所以无法正常访问。使用命令“ln -s /home/test/file1 /mnt/sdb1/file4”重新创建符号链接后,可以正常对原始文件进行访问。
参数 | 符号链接 | 硬链接 |
---|---|---|
文件长度 | 与原始文件名相同 | 与原始文件相同 |
索引节点 | 新的索引节点 | 与原始文件相同 |
限制 | 无 | 硬链接要处于原始文件在同一个文件;原始文件不能是目录 |
类型 | 符号链接,用“l”表示 | 普通文件,用“-”表示 |
与原始文件相比 | 不同 | 相同 |
原始文件移动或删除 | 无法使用 | 仍然可以使用 |
硬链接与复制文件有什么不同?
在同一磁盘中复制和硬链接的原理相同,但硬链接无法跨磁盘创建,且硬链接无法操作目录。
在Linux中,链接可以与普通文件一样被操作,当编辑链接时,其实就是在编辑原始文件,而不是副本。硬链接与原始文件都是数据在磁盘上的入口。而符号链接则是指向原始文件的指针。