Linux 文件系统把硬盘分为三个部分: 超级块, inode 列表, 数据区
inode 指示: 该文件的数据存放在数据区的哪些块内. 因为这个 "映射" 关系不能变更, 因此, inode 相当于代表着文件本身.(值得注意的是, 文件名与文件本身不是直接映射起来的, 中间隔着 inode)
内核为每一个新创建的文件分配一个 Inode(索引结点), 每个文件都有一个唯一的 inode 号. 文件属性保存在索引结点里, 在访问文件时, 索引结点被复制到内存, 从而实现文件的快速访问.
链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法.
Linux 中包括两种链接: 硬链接 (Hard Link) 和软链接(Soft Link), 软链接又称为符号链接(Symbolic link).
硬链接
硬链接相当于是一个指针, 指向文件索引节点, 系统并不为它重新分配 inode. 用 ln 命令来建立硬链接.
当我们创建了一个文件的硬链接时, 硬链接会使用和文件相同的 inode 号, 此时我们发现, 原来的文件的 inode 连接数由最初的 1 变为了 2, 实际上硬链接和文件使用了相同的 inode, 只不过是 inode 连接数增加了, 删除文件不会影响硬链接, 硬链接的 inode 数会从 2 变为 1
- # 不管是硬链接还是软连接, 源文件必须先存在
- [[email protected] thy]# touch codefile.txt
- [[email protected] thy]# vi codefile.txt
- # 索引数量为 1
- [[email protected] thy]# ls -il
总用量 8
922461 -rw-r--r-- 1 root root 6 12 月 18 11:04 codefile.txt
- # 默认不加任何参数是创建硬链接, 且参数二必须是要创建的链接文件
- [[email protected] thy]# ln codefile.txt h_codefile.txt
- # 查看硬链接, 会发现它们的 inode 索引号是相同的, 但索引的数量会加 1
- [[email protected] thy]# ls -il
总用量 12
922461 -rw-r--r-- 2 root root 6 12 月 18 11:04 codefile.txt
922461 -rw-r--r-- 2 root root 6 12 月 18 11:04 h_codefile.txt
- # 删除源文件并不会影响硬链接(只有将所有指向文件内容的指针, 也即链接数减为 0 时, 内核才会把文件内容从磁盘上删除.)
- [[email protected] thy]# rm -rf codefile.txt
- [[email protected] thy]# ls -li
总用量 8
922461 -rw-r--r-- 1 root root 6 12 月 18 11:04 h_codefile.txt
PS: 硬链接, 只能应用于文件, 而不能应用于目录, 而且不能跨文件系统(即分区). 不可以在不同文件系统的文件间建立链接.
软连接(符号链接)
符号链接是对一个文件的间接指针. 硬链接直接指向文件的 i 节点.
软链接克服了硬链接的不足, 没有任何文件系统的限制, 任何用户可以创建指向目录的符号链接. 甚至可以跨越不同机器, 不同网络对文件进行链接. 建立软链接只要在 ln 后面加上选项 -s.
在创建文件的软链接时, 软链接会使用一个新的 inode, 所以软链接的 inode 号和文件的 inode 号不同, 软链接的 inode 里存放着指向文件的路径, 删除文件, 软链接也无法使用了, 因为文件的路径不存在了; 当我们再次创建这个文件时(文件名与之前的相同), 软链接又会重新指向这个文件(inode 号与之前的不同了), 而硬链接不会受其影响
- # 先创建源文件
- [[email protected] thy]# touch srcfile.txt
- [[email protected] thy]# ls -l
总用量 4
-rw-r--r-- 1 root root 38 12 月 18 11:01 srcfile.txt
- # 创建软连接(参数二必须是软连接文件名)
- [[email protected] thy]# ls -l
总用量 4
-rw-r--r-- 1 root root 38 12 月 18 11:01 srcfile.txt
- # 查看(软连接的索引是不相同的, 且索引数量都为 1, 并且软连接文件名后边会指向链接的源文件)
- [[email protected] thy]# ls -il
总用量 8
922457 lrwxrwxrwx 1 root root 11 12 月 18 11:02 desfile.txt -> srcfile.txt
922460 -rw-r--r-- 1 root root 64 12 月 18 11:03 srcfile.txt
- # 删除源文件, 软连接就会失效(因为索引指向的源文件路径已经不存在了)
- [[email protected] thy]# rm -r srcfile.txt
rm: 是否删除普通文件 "srcfile.txt"?y
[root@tanbaobao thy]# ls -il
总用量 4
922457 lrwxrwxrwx 1 root root 11 12 月 18 11:02 desfile.txt -> srcfile.txt
查看软连接文件会显示没有该文件:
重新创建之后又会恢复, 因为路径指向的文件存在:
- [[email protected] thy]# touch srcfile.txt
- [[email protected] thy]# ll -i
总用量 4
922457 lrwxrwxrwx 1 root root 11 12 月 18 11:02 desfile.txt -> srcfile.txt
922458 -rw-r--r-- 1 root root 0 12 月 18 11:43 srcfile.txt
说明: 可以创建多个链接文件, 但是不能在软连接文件上创建链接文件, 这样会导致断裂, 形成混乱的链接链
区别:
挂载点
只能在同种存储媒体上的文件之间创建硬链接(Hard Link), 不能在不同挂载点下的文件间创建硬链接, 对于后一种情况, 可以使用软链接;(区分不同挂载点与同一挂载点不同目录)
目录
软连接就相当于 win 中的快捷方式即如果软链接一个目录只是一个目录的快捷方式到指定位置, 操作系统找这个快捷方式会直接找到真实目录下的文件. 但是硬链接的话, 相当于镜像的方式, 创建一个目录的硬链接之后, 操作系统需要把这个目录下所有的文件都要做一次硬链接(复制一份过去), 这样操作系统在访问这个链接的时候要不断去遍历, 大大增加复杂度, 而且很容易进入死循环.
硬链接不能对目录创建受限于文件系统的设计. Linux 文件系统中的目录均隐藏了两个特殊的目录, 当前目录和父目录. 其实是两个硬链接, 若系统运行对目录创建硬链接, 则会产生目录环.
总结:
1)硬链接原文件&链接文件共用一个 inode 号, 说明他们是同一个文件; 而软链接原文件&链接文件拥有不同的 inode 号, 表明他们是两个不同的文件;
2)在文件属性上软链接明确写出了是链接文件, 而硬链接没有写出来, 因为在本质上硬链接文件和原文件是完全平等关系, 就像文件被复制了一份一样;
3)链接数目是不一样的, 软链接的链接数目不会增加, 硬链接会相应的加一;
4)文件大小是不一样的, 硬链接文件显示的大小是跟原文件是一样的, 而这里软链接显示的大小与原文件就不同了.
[Linux 命令] 软连接和硬链接的区别(ln 命令)
来源: http://www.bubuko.com/infodetail-3337552.html