Linux

关于Linux的软链接和硬链接的一些概念

  • 建立软链接和硬链接的语法

软链接:ln -s 源文件 目标文件

硬链接:ln 源文件 目标文件

源文件:即你要对谁建立链接

  • 什么是软链接和硬链接

1 软链接可以理解成快捷方式。它和windows下的快捷方式的作用是一样的。

2 硬链接等于cp -p 加 同步更新。

为了方便说明,我在根分区(/)下建立test文件夹,然后新建了一个jys文件

建立软链接和硬链接:

区别: 软链接文件的大小和创建时间和源文件不同。软链接文件只是维持了从软链接到源文件的指向关系(从jys.soft->jys可以看出),不是源文件的内容,大小不一样容易理解。

硬链接文件和源文件的大小和创建时间一样。硬链接文件的内容和源文件的内容一模一样,相当于copy了一份。

但是简单的copy的文件创建文件的时间应该是复制文件时的时间,肯定不会像硬链接那样和创建源文件的时间相同。你想的没错。

但是只要加一个选项-p,时间就一样了

那么cp -p的文件是不是就相当于硬链接了呢?其实不然,对于源文件的内容有修改,硬链接文件会同步更新修改,始终保持和源文件的内容相同,而复制的文件则不可能做到这一点。

所以,硬链接等于cp -p加同步更新。
软链接像快捷方式,方便我们打开源文件,这一点在windows中深有体会,那硬链接有哪些应用呢?
在多用户的操作系统里,你写一个脚本,程序等,没有完成,保存后等下次有时间继续写,但是其他用户有可能将你未写完的东西当成垃圾清理掉,这时,你对你的程序,脚本等做一个硬链接,利用硬链接的同步更新,就可以方式,别人误删你的源文件了。

  • 删除源文件多软链接和硬链接的影响

查看软链接文件,查看的文件不存在。和windows一样,删除源文件,快捷方式也用不了。但是删除源文件,为什么硬链接文件还可以查看呢?
这里要简单说下i节点了。i节点是文件和目录的唯一标识,每个文件和目录必有i节点,不然操作系统就无法识别该文件或系统,就像没有上户口的黑户。linux操作系统是不识别些字母的,像这些jys ,jys.hard操作系统根本不知道是什么玩意。

可以看出硬链接文件和源文件i节点号相同,并且一个i节点可以对应多个文件名。

如图,删除了jys,只是删除了从920586到jys的映射关系,不影响它和jys.hard的映射关系。此图也解释了硬链接的同步更新,对源文件修改,操作系统只认i节点,于是操作系统就将修改内容写进所有i节点相同名字不同的文件。

软链接:
        1.软链接,以路径的形式存在,类似于Windows操作系统中的快捷方式
        2.软链接可以跨文件系统
        3.软链接可以对一个不存在的文件名进行链接
        4.软链接可以对目录进行链接
        5.软链接原文件/链接文件拥有不同的inode号,表明他们是两个不同的文件
        6.当源文件目录改变后,软连接访问不到


   硬链接:
        1.硬链接,以文件副本的形式存在,但不占用实际空间
        2.不允许给目录创建硬链接(可以通过参数添加但仅限root用户)
        3.硬链接只有在同一个文件系统中才能创建
        4.不能对不存在的文件创建硬链接
        5.硬链接原文件/链接文件公用一个inode号,说明他们是同一个文件
        6.当源文件目录改变后,硬连接可以访问
  • 使用场景
软链接一般被用来设置可执行文件的快捷方式的路径。
一般比较重要的文件我们担心文件被误删除且传统复制备份方式占用double数量的空间会造成浪费,可以使用硬链做备份来解决;

附录:

如果要想说清楚 ln 命令,则必须先解释下 ext 文件系统(Linux 文件系统)是如何工作的。我们在前面讲解了分区的格式化就是写入文件系统,而我们的 Linux 目前使用的是 ext4 文件系统。如果用一张示意图来描述 ext4 文件系统,则可以参考图 1。

ext4 文件系统会把分区主要分为两大部分(暂时不提超级块):小部分用于保存文件的 inode (i 节点)信息;剩余的大部分用于保存 block 信息。

inode 的默认大小为 128 Byte,用来记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件的数据真正保存的 block 编号。每个文件需要占用一个 inode。大家如果仔细查看,就会发现 inode 中是不记录文件名的,那是因为文件名记录在文件所在目录的 block 中。

由此,我们可以知道以下 2 个重要的信息:

  1. 每个文件都独自占用一个 inode,文件内容由 inode 的记录来指向;
  2. 如果想要读取文件内容,就必须借助目录中记录的文件名找到该文件的 inode,才能成功找到文件内容所在的 block 块;