Linux 链接简介
在 Linux 系统中, 链接可以分为两种, 一种为硬链接(Hard Link), 另一种为软链接或符号链接(Symbolic Link or Soft Link).
在默认不带参数的情况下, 执行 ln 命令创建的链接就是硬链接.
如果使用 ln -s 创建链接则为软链接, 前面文件类型为 l(字母 L)的就是软链接.
例子:
硬链接 :ln 源文件 目标文件;
软链接: ln -s 源文件 目标文件(目标文件不能事先存在)
硬链接简介
指索引节点 (Inode) 来进行链接, 在 Linux(ext2/ext3/ext4)文件系统中, 保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号, 这个编号被称为索引节点号编号 (index inode) 简称 inode, 即在系统中文件的编号. 在 Linux 文件系统中, 多个文件名指向同一个索引节点 (inode) 是正常且允许的, 这种情况的文件就称为硬链接. 提示: 硬链接文件就相当于文件的另一个入口, 硬链接的作用之一是允许一个文件拥有多个有效路径名(多个入口), 这样用户就可以建立硬链接到重要的文件, 以防止 "误删" 源数据(很多硬件存储, 如 netapp 存储中的快照功能就应用了这个原理, 增加一个快照就多了一个硬链接.)
为什么一个文件建立了硬链接就会防止数据误删呢?
因为文件系统 (ext2) 的原理是, 只要文件的索引节点 (inode index) 还有一个以上的硬链接; 如果只删除其中一个硬链接 (即仅仅删除了该文件的链接指向) 并不影响索引节点本身和其他链接 (即数据文件实体并未被删除), 只有当文件的最后一个链接被删除后, 此时如果有新数据要存储到硬盘上是或者系统通过类似 fsck 做磁盘检查的时候, 被删除类似的数据块及目录的链接才会被释放, 空间被新数据占用并覆盖. 此时, 数据就再也无法找回了, 也就是说, 在 Linux 系统中, 删除静态文件(没有进程调用)(目录也是文件) 的条件是与之相关的索引硬链接文件均被删除;
硬链接知识小结:
1, 具有相同 inode 节点号的多个文件互为硬链接文件.
2, 删除硬链接文件或者删除源文件任意之一, 文件实体并未被删除.
3, 只有删除了源文件及所有对应的硬链接文件, 文件实体才会被删除.
4, 当所有的硬链接文件及源文件被删除后, 再存放新的数据会占用这个文件的空间, 或者磁盘 fsck 检查的时候, 删除的数据也会被系统回收(养成删除及多套环境测试的好习惯)
5, 硬链接文件就是文件的另一个入口(相当于超市的前, 后门一样).
6, 可以通过给文件设置硬链接文件, 来防止重要文件被误删.
7, 通过执行命令 "ln 源文件 硬链接文件", 即可完成创建硬链接.
8, 硬链接文件时普通文件, 因此可以用 rm 命令删除.
9, 对于静态文件 (没有进程正在调用的文件) 来讲, 当对应硬链接数为 0(i_link), 文件就被删除, i_link 的查看方法 (ls -l) 结果的第三列就是
软链接简介
软链接 (soft link) 也称为符号链接(symbolic link).Linux 里的软链接文件就类似于 Windows 系统中的快捷方式.
Linux 里的软链接文件实际上是一个特殊的文件, 文件类型是 l. 软链接文件实际上可以理解为一个文本文件, 这个文件中包含有软链接指向另一个源文件的位置信息内容, 因此, 通过访问这个 "快捷方式" 就可以迅速定位到软链接所指向的源文件实体.
软链接的创建: 执行命令 "ln -s 源文件 软链接文件", 即可完成创建软链接;
误区: 创建软链接源文件时需要存在的, 要创建的软链接文件时不能存在的, 是要用 ln 命令创建的;
软链接知识小结:
1, 删除软链接文件对源文件及硬链接文件无任何影响.
2, 删除硬链接文件对源文件及软链接文件无任何影响.
3, 删除源文件, 对硬链接文件没有影响, 但是会导致软链接文件失效, 白字红底闪烁.
4, 同时删除源文件 oldboyfile, 硬链接文件 oldboyfile_hard_link, 整个文件会真正的被删除.
5, 很多硬件设备中的快照功能, 就是利用了硬链接的原理.
6, 源文件和硬链接文件具有相同的索引节点号, 可以认为是同一个文件或一个文件的多个入口.
7, 源文件和软链接文件索引节点号不同, 是不同的文件, 软链接相当于源文件的快捷方式, 含有源文件的位置指向.
有关目录的链接小结:
1, 对于目录, 不可以创建硬链接, 但可以创建软链接.
2, 对于目录的软链接是生产场景运维中常用的技巧(例子: 第二关第 4 题 apache 考试题)
3, 目录的硬链接不能跨越文件系统(从硬链接原理可以理解)
4, 每个目录下面都有一个硬链接 "." 号, 和对应上级目录的硬链接 "..".
5, 在父目录里创建一个子目录, 父目录的链接数增加 1(每个子目录里都有.. 来指向父目录)但是在父目录里创建文件, 父目录的链接数不会增加.
问题一
当用户执行 rm 操作删除文件后, 再执行 ls 或者其他文件管理命令, 无法找到这个文件了, 但是调用这个删除的文件的进程却在继续正常执行, 依然能够从文件正确的读取及写入内容, 这是为什么?
解答: 这是因为 rm 操作只是将文件的 i_nlink 减少了, 如果没其他的链接 i_nlink 就为 0 了, 但由于该文件依然被进程引用, 因此, 此时文件对应的 i_count 并不为 0, 所以即使执行 rm 操作, 但是系统并没有真正的删除这个文件, 当只有 i_nlink 及 i_count 都为 0 的时候, 这个文件才会被真正的删除, 也就是说, 还需要解除该进程对该文件的调用才行.
问题二
以上讲的 i_nlink 及 i_count 是文件删除的真实条件, 但是当文件没有被调用时, 执行了 rm 操作删除文件后是否还可以找回被删的文件呢?
解答: rm 操作只是将文件的 i_nlink 减少了, 或者说设置为 0 了, 实际就是讲文件名到 inode 的链接删除了, 此时, 并没有删除文件的实体即(block 数据块), 此时, 如果及时停止机器工作, 数据是可以找回的, 如果此时继续写入数据, 那么当新数据就可能会被分配到被删除的数据的 block 数据块, 此时, 文件就会被真正的回收了, 那时候神仙也没有办法了.
来源: http://www.bubuko.com/infodetail-2945057.html