Linux 系统中有软链接和硬链接两种特殊的“文件”。
软链接可以看作是Windows中的快捷方式,可以让你快速链接到目标档案或目录。
硬链接则透过文件系统的inode来产生新档名,而不是产生新档案。

1、创建方法

软链接(符号链接) ln -s source target
硬链接 (实体链接)ln source target

2、inode

要解释清楚两者的区别和联系需要先说清楚 linux 文件系统中的 inode 这个东西。
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。
对于系统来说,文件名只是inode号码便于识别的别称或者绰号。
表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:
首先,系统找到这个文件名对应的inode号码;
其次,通过inode号码,获取inode信息;
最后,根据inode信息,找到文件数据所在的block,读出数据。
当划分磁盘分区并格式化的时候,整个分区会被划分为两个部分,即inode区和data block(实际数据放置在数据区域中)
这个inode即是(目录、档案)文件在一个文件系统中的唯一标识,需要访问这个文件的时候必须先找到并读取这个文件的 inode。

Inode 里面存储了文件的很多重要参数,其中唯一标识称作 Inumber, 其他信息还有创建时间(ctime)、修改时间(mtime) 、文件大小、属主、归属的用户组、读写权限、数据所在block号等信息。

inode本身并不记录文件名
文件名记录在目录文件的block当中,所以新增、删除、更改文件名与目录的写权限有关。
因此当我们要读某个档案时,就务必经过其目录的inode和block,然后才能够找到待读取档案的inode号,最终才会读到正确的档案block内的数据。
系统是通过索引节点(而不是文件名)来定位每一个文件。

3、硬链接解析

当前目录下有两个文件soft_sourcefile和hard_sourcefile
这里我们注意在创建链接前,hard_sourcefile显示的链接数目为1,创建链接后
1.hard_sourcefile和hard_sourcefile_hardlink的链接数目都变为2。
2.hard_sourcefile和hard_sourcefile_hardlink的inode号是一样的,都是492911。
3.hard_sourcefile和hard_sourcefile_hardlink显示的文件大小也是一样,都是16B。

可见进行了ln命令的操作结果:
1)hard_sourcefile和hard_sourcefile_hardlink是同一个文件的两个名字,
2)它们具有同样的索引节点号和文件属性,建立文件hard_sourcefile的硬链接,就是为 hard_sourcefile的文件索引节点在当前目录上建立一个新指针。
3)你可以删除其中任何一个,如rm hard_sourcefile,每次只会删除一个指针,链接数同时减一,只有将所有指向文件内容的指针,也即链接数减为0时,内核才会把文件内容从磁盘上删除。

多个文件名对应同一个inode,硬链接只是在某个目录下新增一笔文件名链接到某个inode号码的关联记录而已。
hard link 只是在某个目录下的 block 多写入一个关连数据而已,既不会增加 inode 也不会耗用 block 数量
不过,一般 hard link 所用掉的关连数据量很小,所以通常不会改变 inode与磁盘空间的大小
你可以透过xxxxxx 或yyyyyy的文件名之 inode 指定的 block 找到两个不同的档名,而不管使用哪个档名均可以指到 real 那个 inode 去读取到最终数据
如果将上图中任何一个档名删除,档案的inode与block都还存在,依然还可以通过另一个档名来读取正确的档 案数据。
此外,不论用哪一个档名来编辑,最终的结果都会写入相同的inode和block中,因此均能进行数据的修改。

尽管硬链接节省空间,也是Linux系统整合文件系统的传统方式,但是存在一些不足之处:
1)不允许给目录创建硬链接。
2)不可以在不同文件系统的文件间建立链接。因为 inode 是这个文件在当前分区中的索引值,是相对于这个分区的,当然不能跨越文件系统了。

4、软链接解析


从上面链接后的结果可以看出来软链接与硬链接,区别不仅仅是在概念上,在实现上也是完全不同的。

软连接就是建立一个独立的文件,而这个文件会让数据的读取指向它link的那个档案的文件名,由于只是作为指向的动作,所以当来源档案被删除之后,软连接的档案无法开启,因为找不到原始档名。
连结档的内容只有文件名,根据档名链接到正确的目录进一步取得目标档案的inode,最终就能够读取到正确的数据。如果目标档案的原始档名被删除了那么整个环节就进行不下去了。

5、软链接和硬链接的区别:

1)硬链接原文件/链接文件公用一个inode号,说明他们是同一个文件,而软链接原文件/链接文件拥有不同的inode号,表明他们是两个不同的文件;
2)在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系;
3)链接数目是不一样的,软链接的链接数目不会增加;
4)文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的。而这里软链接显示的大小与原文件就不同了,soft_sourcefile大小是16B,而soft_sourcefile_symbolic是15B。
5)软链接没有任何文件系统的限制,任何用户可以创建指向目录的符号链接

总之,建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现他是个链接文件,它读取链接文件找到真正要访问的文件。

当然软链接也有硬链接没有的缺点:
1)因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;
2)还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。

Liunx 命令之链接操作的更多相关文章

  1. 50条常用liunx命令整理

    1.pwd命令 :确定自己在那个目录 使用方法:在liunx命令输入框里面输入pwd,自动就会显示出自己现在在那个目录下 操作截图: 此时正处在root目录里面 2.cd命令:切换目录的意思 使用方法 ...

  2. github之无命令可视化界面操作——GitHub DeskTop

    Git是Linuxs之父Lunus用C语言写的一个非常好用的分布式版本控制系统. GitHub可以给我们提供免费的代码仓库,并用Git可以在上面提交代码并进行版本控制.使用Git一般要安装Git ,并 ...

  3. JDK的命令具体解释操作

    JDK的命令具体解释1 rmic 功能说明: rmic 为远程对象生成 stub 和 skeleton. 语法: rmic [ options ] package-qualified-class-na ...

  4. 命令行高效操作Git,看这篇就够了

    原文地址:http://blog.jboost.cn/2019/06/16/use-git.html 对于软件开发人员来说,git几乎是每天都需要接触的工具.但对于相处如此亲密的工作伙伴,你对它的了解 ...

  5. Linux命令-文件文本操作grep

    文件文本操作 grep 在文件中查找符合正则表达式条件的文本行 cut 截取文件中的特定字段 paste 附加字段 tr 字符转换或压缩 sort 调整文本行的顺序,使其符合特定准则 uniq 找出重 ...

  6. [转]Mysql命令行常用操作

    Mysql命令行常用操作 一.从命令行登录MySQL数据库服务器 1.登录使用默认3306端口的MySQL /usr/local/mysql/bin/mysql -u root -p 2.通过TCP连 ...

  7. liunx命令之whereis、which、find的区别和联系

    liunx命令之whereis.which.find的区别和联系

  8. SLAM+语音机器人DIY系列:(一)Linux基础——3.Linux命令行基础操作

    摘要 由于机器人SLAM.自动导航.语音交互这一系列算法都在机器人操作系统ROS中有很好的支持,所以后续的章节中都会使用ROS来组织构建代码:而ROS又是安装在Linux发行版ubuntu系统之上的, ...

  9. eos开发(二)使用cleos命令行客户端操作EOS(钱包wallet基础操作)

    不知道下边这一段英文你们是不是能看懂,如果看不懂那就算了,我就是转过来随便看看的. 总之你记住nodeos.cleos和keosd这三个工程十分重要就行了,回头咱们的研究都从这三个工程杀进去. EOS ...

随机推荐

  1. CSS3总结七:变换(transform)

    2D视图模型解析 3D视图模型解析 平移 旋转 伸缩 扭曲 z轴方向平移与perspective的神秘关系 matrix()终极变幻的方法 一.2D视图 2D视图就是默认平面上的每个点都与视线垂直,图 ...

  2. 收下这波 JS 技巧,从此少加班

    各种业务开发都离不开对数据的处理,然而遇到的很多数据都是不好处理的.这个时候就需要寻求搜索引擎的帮助.这种方法效率是非常低下的,而且根据作者的个性不能保证其对自己的口味.因此这篇文字包含了一份 JS ...

  3. 1 sql server 中merge的用法

    MERGE 要更新的表名 AS target USING ( 这里是用什么数据源来跟新 ) AS source ( 这里是数据源的所有列名 ) ON 这里是要更新的表和数据源的匹配条件 WHEN MA ...

  4. centos 查看ip

    1.现象: 通过ip addr 查找Ip时,发现ens33中没有inet属性,如下图: 2.解决方法 打开网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-ens ...

  5. TCP中异常关闭的情况记录

    1.当TCP连接的对端进程已经关闭了Socket的情况下,本端进程再发送数据时,第一包可以发送成功(但会导致对端发送一个RST包过来):之后如果再继续发送数据会失败,错误码为“10053: An es ...

  6. imx6 yocto移植 环境搭建

    系统:ubuntu14.04 LTS 切换软件下载源,确保下载资源是最快. 安装必要软件工具: ~$ apt-get install vim ~$ apt-get install openssh-se ...

  7. Windows Server 2016分层式存储,使用PowerShell修改底层介质类型

    新部署的备份服务器,需要做分层式存储,按照网上最常见一个作者叫刘兵的文档,名叫<Windows Server2016分层存储技术详细拆解手册>,做到使用PowerShell修改磁盘的Med ...

  8. PAT Basic 1094 谷歌的招聘 (20 分)

    20 5 23654987725541023819 输出样例 1: 49877 输入样例 2: 10 3 2468024680 输出样例 2: 404 #include <iostream> ...

  9. [易学易懂系列|rustlang语言|零基础|快速入门|(25)|实战2:命令行工具minigrep(2)]

    [易学易懂系列|rustlang语言|零基础|快速入门|(25)|实战2:命令行工具minigrep(2)] 项目实战 实战2:命令行工具minigrep 我们继续开发我们的minigrep. 我们现 ...

  10. 洛谷P3690 Link Cut Tree (动态树)

    干脆整个LCT模板吧. 缺个链上修改和子树操作,链上修改的话join(u,v)然后把v splay到树根再打个标记就好. 至于子树操作...以后有空的话再学(咕咕咕警告) #include<bi ...