还在傻傻分不清软链接和硬链接吗?

188 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

硬链接和软链接的概念经常傻傻分不清,实践出真知,一文搞懂软链接和硬链接。所有的文件,其真实的数据都是保存在磁盘上的,我们肉眼可见的那些文件,其实都是一个个链接文件。

Let us go …

一、索引节点

索引节点是unix系统中的一种数据结构,其本质是结构体,包含了与文件系统中各个文件相关的一些重要信息,在Unix创建文件系统的同时会创建大量的inode,通常,文件系统磁盘空间中大约1%的空间分配给了inode表。我们平时所说的索引编号其实是inode的标识标号,索引编号只是文件相关信息中一项重要的内容。

inode表包含一份清单,其中列出了对应文件系统的所有 inode 编号。当用户搜索或者访问一个文件时,UNIX 系统通过 inode 表查找正确的 inode 编号。在找到 inode 编号之后,相关的命令才可以访问该 inode ,并对其进行适当的更改。

例如,使用 vi 来编辑一个文件。当您键入 vi 时,在 inode 表中找到 inode 编号之后,才允许您打开该 inode 。在 vi 的编辑会话期间,更改了该 inode 中的某些属性,当您完成操作并键入:wq 时,将关闭并释放该 inode 。通过这种方式,如果两个用户试图对同一个文件进行编辑,inode 已经在第一个编辑会话期间分配给了另一个用户 ID (UID),因此第二个编辑任务就必须等待,直到该 inode 释放为止。 (来自百度百科)

如何查看索引编号呢?使用命令ls -li

二、硬链接和软链接

  • 硬链接(Hard Link)指通过索引节点inode来进行链接,在linux系统中多个文件名可以指向同一个索引节点,这种链接就称为硬链接。硬链接允许磁盘上的一个文件有多条访问路径,也就是多个文件名,用户可以建立多个硬链接防止误删,只有当所有的硬链接被删除后,磁盘文件数据块及其索引节点才会被清除释放。
  • 软链接(Symbolic Link)也称为符号链接,类似于windows的快捷方式,它实际上是一个特殊的文件,该文件中包含了另一个文件的位置信息

image-20221217114028612

# 新建a.js文件,数据保存到节点45842921中,并建立a.js到节点的硬链接
touch a.js
# 建立新的硬链接,指向同样的数据节点45842921
ln a.js a_hard.js
# 新建软链接,会新建一个文件(节点45843058),该文件内存有a.js的位置信息,指向a.js
ln -s a.js a_soft.js
# 复制a.js,会将磁盘文件也拷贝一份,这是一份全新的磁盘数据,有新的节点45858534和新的硬链接
cp a.js a_copy.js

查看文件信息如下:

➜ ls -li
total 24
45842921 -rw-r--r--  2 lijing  staff  44 12 17 09:23 a.js
45858534 -rw-r--r--  1 lijing  staff  44 12 17 10:56 a_copy.js
45842921 -rw-r--r--  2 lijing  staff  44 12 17 09:23 a_hard.js
45843058 lrwxr-xr-x  1 lijing  staff   4 12 17 09:23 a_soft.js -> a.js

最前面的数字就是索引编号