• 技术文章 >运维 >linux运维

    带你搞懂linux硬链接和软链接(图文详解)

    长期闲置长期闲置2022-02-21 17:50:01转载421
    本篇文章给大家带来了关于Linux中硬链接和软链接的相关知识,其中还有inode的相关问题,希望对大家有帮助。

    前言

    最近前端包管理器pnpm真的是太火了,大量的文章分析了pnpm的原理。了解之后,发现pnpm整个架构都是基于硬链接和软链接组织的,但我对这两个概念比较模糊,所以想研究一下。

    众所周知,Unix/Linux系统中一切皆文件。可见,文件在Linux系统中非常重要。我们平常比较直观的对于文件的感受肯定是文件名和文件内容。但在Linux的文件系统中,除了文件名和文件内容,还有一个很重要的概念,就是inode。

    16.png

    inode

    维基百科这样描述inode:

    The inode (index node) is a data structure in a Unix-style file system that describes a file-system object such as a file or a directory. Each inode stores the attributes and disk block locations of the object's data.File-system object attributes may include metadata (times of last change,access, modification), as well as owner and permission data.

    A directory is a list of inodes with their assigned names. The list includes an entry for itself, its parent, and each of its children.

    意思就是:inode是类Unix文件系统中用来描述文件系统对象(比如文件或文件夹)的一种数据结构。它存储着文件的各种属性(最近一次inode变动的时间、最近一次访问的时间、最近一次修改的时间等元信息,以及权限信息等)。文件夹是一组inode,包括自身的入口、父节点的入口以及所有子节点。

    其实,inode包含的内容不止上面这些,具体有:

    Linux使用的ext2/ext3文件系统中,不同类型的数据存放在不同的区域。inode组成的inode table存放在一个位置,文件数据块则存在另外一个位置。

    inode不包含文件名,文件名存放在文件夹信息的结构体里。文件名相当于inode的别名,便于我们管理和记忆。Linux系统对文件的操作都是通过inode做到的,当我们修改文件时,系统从文件夹的信息结构体里找到文件名对应的inode,再通过存储在inode中的文件数据block地址找到对应的硬盘位置进行读写操作。

    17.png

    硬链接

    一般来说,inode与文件名、文件数据是一对一的关系,但我们可以通过shell命令让多个文件名指向同一个inode,这种就是硬链接(hard link)。

    使用ln <origin> <destination>命令可以创建硬链接,如

    ln test.txt test_hard.txt

    对应nodejs的fs.link方法。

    创建硬链接前,test.txt可以这样表示:

    18.png

    创建硬链接后:

    19.png

    可以看到,test_hard.txt的inode跟源文件test.txt使用的是同一个,只是现在链接数变成2了。

    我们可以执行ls -li查看一下。

    20.png

    第一列是inode number,可以看到都是13029546,所以两个文件使用的是同一个inode。第二列是权限信息,第四列是拥有者,第六列是文件内容大小。可以看到,除了文件名不一样之外,硬链接创建的文件跟源文件的所有元信息完全一样。第三列表示链接数,可以看到,目前链接数为2。

    由于硬链接文件和源文件使用同一个inode,并指向同一块文件数据,除文件名之外的所有信息都是一样的。所以这两个文件是等价的,可以说是互为硬链接文件。修改任意一个文件,可以看到另外一个文件的内容也会同步变化。

    软链接

    准确来说叫符号链接(symbolic link),一般又叫软链接(soft link)。与硬链接共用一个inode不同,软链接会创建新的inode,并指向源文件。可以理解软链接就是windows系统中的桌面快捷方式。

    创建软链接的命令和硬链接很像,多了-s参数:ln -s <origin> <destination>:

    ln -s test.txt test_symbolic.txt

    对应的nodejs的fs.symlink方法。

    创建软链接之后:

    21.png

    源文件inode的链接数还是1,创建了新的inode,软链接指向源文件。

    执行ls -li看一下:

    22.png

    可以看到,软链接的inode number跟源文件的不一样,权限一列开头为小写L,表示软链,链接数为1,大小为8个字节。没错,软链文件也有大小,不过一般很小,毕竟只是一个快捷方式。

    对比

    文件重命名或文件移动

    文件重命名和文件移动对于Linux系统来说都是文件绝对路径的更改。对硬链接来说,文件重命名或文件移动不会改变链接指向,而对软链接来说,文件重命名或文件移动则使链接断开,这时通过软链接修改文件内容时会重新创建一个新的inode,跟原文件名和文件数据块关联。

    文件删除

    rm命令或者nodejs的unlink其实是将inode的链接数减1。对于前文的硬链接,删除test_hard.txt使得inode1的链接数变成1,当链接数变成0时,系统就会释放掉这个inode,之后再创建的新文件就可以使用该inode的inode number了。这时没有inode指向文件数据block,所以文件找不到了。但实际上文件数据还存在硬盘中,所以经常能看到网上有一些帮助恢复误删的文件的工具。软链接inode链接数为1,删除软链接则系统释放该inode。

    链接文件和文件夹

    软链接可以链接文件和文件夹,但硬链接只能链接文件。

    不同文件系统创建链接

    软链接可以跨不同的文件系统创建,但是硬链接不行,因为硬链接是共用一个inode,而不同的文件系统有不同的inode table。

    应用场景

    硬链接

    软链接

    总结

    Linux系统通过inode管理文件,inode存储着文件字节数、文件权限、链接数、数据block位置等信息。

    硬链接与源文件共用inode,除了文件名不同,其他与源文件一样。不能对文件夹创建硬链接,不能对不同的文件系统的文件创建硬链接。

    软链接类似于windows的快捷方式,有独立的inode。可以对文件夹或不同文件系统的文件创建软链接。

    硬链接和软链接修改文件内容都会同步到源文件,因为本质上它们都是指向源文件的数据block。

    相关推荐:《Linux视频教程

    以上就是带你搞懂linux硬链接和软链接(图文详解)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金,如有侵犯,请联系admin@php.cn删除
    专题推荐:linux
    上一篇:Linux中绝对用得到的四个技巧! 下一篇:Linux五大模块内核源码以及内核整体架构设计(图文详解)
    Web大前端开发直播班

    相关文章推荐

    • 总结Linux系统启动与服务管理(整理分享)• Linux安装php的方法• linux怎么增加硬盘• 深入浅析了解Linux学习笔记之系统任务设置• centos是linux还是unix

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网