1、链接的概念

在Linux系统中链接分为硬链接和软连接两种,一种为硬链接,另一种为软连接或符号链接(symbolic Link)。ln命令就是创建链接文件的,在默认不带参数的情况下,执行ln命令创建的链接就是硬链接。

2、硬链接

硬链接是指通过索引节点(inode)来进行链接。在Linux(ext2,ext3)文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点(inode)。如果多个文件名指向同一个inode是正常且允许的。这种情况的文件就称为硬链接。硬链接的作用之一就是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要的文件。以防止误删除源数据(很多硬件存储,如netapp存储 中的快照功能就应用了这个原理,增加一个快照就多了一个硬链接)。为什么一个文件建立了硬链接就会防止数据误删呢?

因为文件系统(ext2)的原理是,只要文件的索引节点还有一个以上的链接。只删除其中一个链接(即仅仅删除了该文件的链接指向)并不影响索引节点本身和其他的链接(即文件数据实体并未被删除),只有当文件的最后一个链接被删除后,此时如果有新数据要存储到硬盘上时或者系统通过fsck做磁盘检查的时候,被删除文件的数据块及目录的链接才会被释放,空间被新数据占用并覆盖。此时,数据就再也无法找回了。也就是说,Linux系统中删除静态(未被使用的文件)文件(目录也是文件)的条件是与之相关的所有硬链接文件均被删除(暂时这样理解即可,后文会讲和进程的占用有关)。

硬链接就相当于文件的另外一个入口,如下图所示。文件的权限放在Inode节点当中,但是文件的名称(文件名)并未保存在inode节点当中,所以每个inode可以对应多个不同文件名的相同数据块的文件。

注:文件名保存在文件目录的block数据块中

3、硬链接的创建

直接执行命令ln 源文件 硬链接文件 即可创建硬链接

硬链接的类型为(-)普通文件类型

第一组数字表示文件的inode节点,权限后边的数字2表示文件的硬链接数量。

小结:

  • 硬链接文件是具有相同inode节点号的不同文件;
  • 删除硬链接文件或者删除源文件之一,文件实体依然存在并未被消除;
  • 只有删除了源文件及所有对应的所有硬链接文件,文件实体才会被删除;
  • 当所有的硬链接文件及源文件被删除后,再存放新的数据会占用文件(包括inode和block)的空间,或者磁盘做fsck检查时数据也会被回收。
  • 硬链接文件是文件的又一个入口
  • 欲删除通过ln(不带参数)创建的硬链接文件,使用rm -f删除硬链接文件即可。
  • 可以通过给文件设置硬链接文件,来防止重要文件被误删除。

3、软连接

软连接也成为符号链接(symbolic link)。Linux 软连接文件就类似于windows系统中的快捷方式。它实际上是一个特殊的文件。在软连接中,软连接文件实际上就是一个文本文件,这个文件中包含有软连接指向另外一个文件的位置信息内容(通过readlink命令,(readlink 软连接文件名称)可以查看软连接记录的位置信息内容,因此通过访问这个快捷方式就可以迅速定位到软连接所指向的源文件的实体。下图为软连接文件的示意图:

执行软连接命令 ln -s 源文件或目录 软连接文件名称

小结:

  • 软连接文件类似windows的快捷方式,软连接存放的是源文件的路径并且指向源文件;
  • 当源文件被删除时,软连接文件依然存在但无法访问指向的源文件(软连接失效);
  • 软连接文件和源文件的Inode不同,即软链接和源文件是不同的文件,文件类型也不同,源文件可能是d,-,b,但软连接文件是l文件;
  • 软连接文件用rm -f删除(不能使用-r),因为软连接不是目录文件,使用-r将删除上层的目录文件。请谨慎使用。

4、示例:

  • 普通文件示例

  • 目录文件示例

  • 基础知识普及(为什么目录文件的硬链接数初始就为2)?

补充:当一个目录为空时,其“.”的硬链接数初始为2,如果此时在当前目录下创建一个子目录,则“."的硬链接数将加1,如果再创建一个文件硬链接数再加1,…….,因为创建一个目录时会在每个目录产生一个"..”指向上层目录的硬链接,该机制直接造成上层目录的硬链接数增加。如果创建子目录的子目录,则爷目录的硬链接不会增加。如果在当前目录创建文件,则关于当前目录"."的硬链接将不会增加。

关于文件链接的总结:

  • 对于删除软链接文件对源文件及硬链接文件无影响;
  • 删除硬链接文件对源文件及软链接文件无影响;
  • 删除源文件对硬链接文件无影响,但是会导致软链接文件失效,白字红底闪烁;
  • 同时删除源文件硬链接文件,整个文件会真正的被删除;
  • 很多硬件设备的快照功能,都是利用了硬链接的原理;
  • 源文件和硬链接文件具有相同的索引节点号,可以认为是同一个文件或一个文件的多个入口;

源文件和软链接文件索引点号不同,是不同的文件,软链接文件相当于源文件的快捷方式,含有源文件的目录指向信息;

关于目录链接的总结

  • 对于目录不可以创建硬链接,但可以创建软连接;
  • 对于目录的软链接是生产场景运维中常用的技巧(例题中有关apache 2.2.17目录指向的简化)
  • 目录的硬链接不能跨越文件系统(从原理可以理解,因为每个文件系统具有独立的Inode编号,每个文件系统的Inode编号可能重合,如何跨文件系统创建硬链接,很有可能造成Inode冲突)
  • 每个目录下面都有一个硬链接“.”号,和上级目录的硬链接“..”

Linux系统中硬链接和软链接的区别

  • 默认不带参数情况下,ln命令创建的是硬链接,带-s参数创建的是软连接
  • 硬链接文件与源文件的Inode节点号相同,而软链接文件的inode节点号与源文件不同
  • ln命令不能对目录创建硬链接,但可以创建软链接,对目录的软链接会经常被用到;
  • 删除软链接文件,对源文件及硬链接文件无任何影响;
  • 删除文件的硬链接文件,对源文件及软链接文件无任何影响;
  • 删除链接文件的源文件,对硬链接文件无影响,会导致其软链接失效(红底白字闪烁);
  • 同时删除源文件机器硬链接文件,导致文件才会被真正删除;
  • 很多硬件设备的快照功能,使用的就类似硬链接的原理;
  • 软链接可以跨文件系统,硬链接不可以跨文件系统。

链接知识拓展

1、Linux系统文件的删除原理

通过上图可以得知以下几点信息:

  • 文件的删除与软链接无任何关系;
  • 文件是否有进程占用,有一个进程占用文件,则i_count加1,如果进程释放文件,则i_count减1.当i_count为0时,文件被删除了。i_count默认为0;
  • 文件的释放受文件进程控制,当有进程使用这个文件时,删除文件时文件占用的空间无法释放。
  • 文件的硬链接数有一个硬链接i_link加1,减少一个硬链接i_link减1,当i_link为0时,文件就被删除了;
  • 当i_link和i_count都为0时,此时才可以真正删除文件数据,回收空间。

Linux系统硬链接和软链接介绍的更多相关文章

  1. 【Linux】Linux系统硬链接和软链接

    在linux系统中有种文件是链接文件,可以为解决文件的共享使用.链接的方式可以分为两种,一种是硬链接(Hard Link),另一种是软链接或者也称为符号链接(Symbolic Link). 查看lin ...

  2. Linux系统——硬链接与软链接

    文件属性软硬连接: 链接有两种,一种为硬链接(Hard Link),另一种为软链接或符号链接(Symbolic Link或Soft Link). 建立硬链接时,链接文件和被链接文件必须位于同一个文件系 ...

  3. Linux系统硬链接和软链接说明 - 运维笔记

    在linux系统中有种文件是链接文件,可以用来解决文件的共享使用.链接的方式可以分为两种,一种是硬链接(Hard Link),另一种是软链接或者也称为符号链接(Symbolic Link).先来查看下 ...

  4. 二、Linux系统硬链接和软链接详细介绍与实践

    链接的概念 在linux系统中,链接可分为两种:一种被称为硬链接(Hard LinK),另一种被称为软链接或符号链接(Symbolic Link).在默认不带参数的情况下,执行ln命令创建的链接是硬链 ...

  5. linux系统 硬链接和软链接

    背景: 当几个用户同在一个项目里工作时.经常须要共享文件. 假设一个共享文件同一时候出如今属于不同用户的不同文件夹下.工作起来就非常方便. 比如B和C文件夹下有一文件D是两者都能够訪问和改动的共享文件 ...

  6. 理解 Linux 的硬链接与软链接(待研究)

    从 inode 了解 Linux 文件系统 硬链接与软链接是 Linux 文件系统中的一个重要概念,其涉及文件系统中的索引节点 (index node 又称 inode),而索引节点对象是 Linux ...

  7. Linux 的硬链接与软链接

    Linux 的硬链接与软链接    http://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/    若一个 inode 号对 ...

  8. 理解Linux的硬链接与软链接-转载

    理解Linux的硬链接与软链接 来自:https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/index.html

  9. 转:理解 Linux 的硬链接与软链接

    Linux 的文件与目录 现代操作系统为解决信息能独立于进程之外被长期存储引入了文件,文件作为进程 创建信息的逻辑单元可被多个进程并发使用.在 UNIX 系统中,操作系统为磁盘上的文本与图像.鼠标与键 ...

随机推荐

  1. java环境变量配置

    1.打开我的电脑--属性--高级--环境变量 2.新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.7.0 ...

  2. JS--轻松设置获取表单数据

    接触过Angularjs的都知道,ng支持双向绑定,我们可以轻轻松松的通过ngModel将我们的值绑定到界面,当修改了值提交表单的时候不需要再重新通过ID去重新抓取输入框信息了.那对于我们开发前台网站 ...

  3. 用java String类的getBytes(String charsetName)和String(byte[] bytes, String charsetName)解决乱码问题

    Java中String的数据是如何存储的,查看源代码就可以知道,String的数据是存储在char[] value这样一个成员变量中的,char类型的大小在java中是2个字节 我们还知道,现在普遍使 ...

  4. 安装Windows更新程序遇到错误:0x80070422

    看看服务那里 windows update服务是不是被禁用了? 还有一个问题可能是由于Windows Modules Installer被禁用了.

  5. 【repost】JavaScript Scoping and Hoisting

    JavaScript Scoping and Hoisting Do you know what value will be alerted if the following is executed ...

  6. [LeetCode] Contains Duplicate II 包含重复值之二

    Given an array of integers and an integer k, return true if and only if there are two distinct indic ...

  7. [LeetCode] Delete Duplicate Emails 删除重复邮箱

    Write a SQL query to delete all duplicate email entries in a table named Person, keeping only unique ...

  8. [LeetCode] Minimum Path Sum 最小路径和

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  9. python获取父类的子类(遍历,递归),并循环执行所有子类的某一方法

    前言 换了新工作,踏足于python语言的开发,也把自己的学习过程记录下来. 一,递归获取某一父类的所有子类 all_subclasses = {'0': '0'} def get_all_class ...

  10. 函数:MySQL中字符串匹配函数LOCATE和POSITION使用方法

    1. 用法一 LOCATE(substr,str) POSITION(substr IN str) 函数返回子串substr在字符串str中第一次出现的位置.如果子串substr在str中不存在,返回 ...