硬链接及软连接引出的inode

news2025/7/13 20:31:23

inode定义

inode是linux系统中用作数据索引的标识符。简单来说,inode指示了一个文件的基本信息,如inode编号、修改时间、文件的位置等。

如同一本书的目录,会直接告诉你想看的章节是在第几页。不同的是,书是以页为单位的,而Linux文件存取是以“块”为单位的。

<!--more-->

找寻文件

操作系统在读取硬盘的时候,会一次性读取一个“块”(一个“块”的大小往往是4KB,包含了连续8个扇区,每个扇区存储512个字节)。而inode就告诉了文件位于哪个“块”,于是系统就会从这个“块”开始读取内容,我们就可以看到文件的内容。

每个文件都有对应的inode,存储着这个文件的基本信息。Linux系统不使用文件名,而使用inode号来识别文件。对于使用者,我们是通过文件名寻找、打开文件;对于系统,是通过以下三步找到的:

  1. 系统找到这个文件名对应的inode号
  2. 通过inode号,获取inode信息
  3. 根据inode信息,找到文件数据所在的block,读取内容

inode内容

inode 包含了文件的以下基本信息:

  • 文件的字节数
  • node 编号
  • 文件拥有者的 Uid
  • 文件所属group的 Gid
  • 文件的读、写、执行权限
  • 文件的时间戳,共有三个:
    • change:inode 上一次变动的时间
    • modify:文件内容上一次变动的时间
    • access:文件上一次打开的时间
  • 链接数,即有多少文件名指向这个inode
  • 文件数据 block 的位置

我们可以使用 stat 命令查看文件的inode信息,如:

$ stat v0.1.0.zip 
  File: ‘v0.1.0.zip’
  Size: 94267       Blocks: 192        IO Block: 4096   regular file
Device: 811h/2065d  Inode: 5659765     Links: 1
Access: (0640/-rw-r-----)  Uid: ( 3457/mart_bda)   Gid: ( 3457/mart_bda)
Access: 2018-06-12 14:22:18.434027485 +0800
Modify: 2018-06-12 14:18:00.840994081 +0800
Change: 2018-06-12 14:18:00.840994081 +0800
 Birth: -

也可以在 ls 后加上 -i 直接获取inode编号:

$ ls -i v0.1.0.zip 
5659765 v0.1.0.zip

inode大小

inode存储了文件的基本信息,虽然信息很少,但是也会占用空间。
硬盘格式化的时候,操作系统自动将硬盘分为两个区域:

  • 数据区:存放文件内容
  • inode 区:存放 inode 包含的信息,也叫作 inode table

每个 inode 节点的大小,一般是 128 字节或 256 字节。inode节点的总数,在硬盘格式化时就固定了。一般,数据区每1KB或2KB,inode区就会增加一个 inode。

假如在一块 1GB 的硬盘中,每个 inode 节点的大小为 128 字节,那么 inode 表的大小就会达到 128 MB,占整块硬盘的 12.8%。既然 inode 节点总数是有限的,那么分区的节点数就有用完的时候,一旦 inode 用完,即使磁盘空间还有剩余,也不能再存放任何数据,因为需要保证每个文件必须有一个 inode。

查看每个硬盘分区的 inode 或者磁盘容量的使用情况,可以使用 df 命令加上参数 -i 或者 -h,如:

文件-h, --human-readable 使用人类可读的格式(预设值是不加这个选项的...)

文件-H, --si 很像 -h, 但是用 1000 为单位而不是用 1024

文件-i, --inodes 列出 inode 资讯,不列出已使用 block

$ df -i
Filesystem        Inodes   IUsed     IFree IUse% Mounted on
/dev/sda5      275436544  801853 274634691    1% /
devtmpfs         8192960     524   8192436    1% /dev
tmpfs            8195307       4   8195303    1% /dev/shm
tmpfs            8195307     765   8194542    1% /run
tmpfs            8195307      13   8195294    1% /sys/fs/cgroup
/dev/sda2         204800     342    204458    1% /boot
/dev/sdb1       11443200 3329257   8113943   30% /data0
tmpfs            8195307       1   8195306    1% /run/user/0
tmpfs            8195307       1   8195306    1% /run/user/3457
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda5       263G  134G  130G  51% /
devtmpfs         32G     0   32G   0% /dev
tmpfs            32G   12K   32G   1% /dev/shm
tmpfs            32G  394M   31G   2% /run
tmpfs            32G     0   32G   0% /sys/fs/cgroup
/dev/sda2       197M  139M   58M  71% /boot
/dev/sdb1        11T  5.2T  5.2T  51% /data0
tmpfs           6.3G     0  6.3G   0% /run/user/0
tmpfs           6.3G     0  6.3G   0% /run/user/3457

关于 df -h -i 的区别,可以参考 Linux df命令。

文件操作对 inode 的影响

要理解文件的操作对 inode 的影响,先要理解目录的原理。目录对外表现是一个容器,存放着子文件和子目录,实际上在系统内部,目录本身也是一个文件,目录文件的内容即是该目录下的文件名与 inode 号的映射表(即一个个的目录项)。

因此,linux访问一个文件时,要先查询到上一级目录,根据目录内容查找到文件对应的 inode号,然后读取对应的 block。

cp 命令

系统内部会执行以下操作:

  1. 分配一个未被使用的 inode 号,在 inode 表中新添一个项目。如果是覆盖复制,则 inode号不变,沿用之前同名文件的 inode 号。

  2. 在目录中新建一个目录项,并指向步骤 1 中的 inode。

  3. 把数据复制到 block 中。

rm 命令

系统内部会执行以下操作:

  1. 减少待删除文件名所对应的 inode 的链接数量,如果链接数变为0,则释放 inode,同时数据块放到可用空间中(对外表现为数据已删除,因为随时可以覆盖。如果没有覆盖,数据还可以恢复;一旦覆盖了,那么删除的数据无法恢复。)。

  2. 删除目录中的目录项。

mv 命令

如果目标文件和源文件属于同一个文件系统:

  1. 在目标文件的目录中新建目录项
  2. 删除源文件的目录中的目录项
  3. 目标文件名会指向源文件名的 inode。因此该操作对 inode 没有影响(除了时间戳),对数据的位置也没有影响,不移动任何数据。

如果目标文件和源文件属于不同文件系统:

  1. 相当于 cp + rm。

ln 命令

硬链接

一般情况下,文件名和 inode 号是一一对应,但是也有可能多个文件名指向同一个inode号,即硬链接。

  • 硬链接可以实现用不同的文件名访问同一个文件;
  • 对文件内容修改,会影响到所有的文件名;
  • 但是,删除一个文件名,不影响其他文件名的访问。

3XH3E6.png

举个栗子

创建硬链接的命令:

ln [source file] [new file]

如:

$ ll -h -i
total 479M
5659849 -rw-r----- 1 mart_bda mart_bda 479M Jun 13 10:57 test_file
$ ln test_file test_file_hardlink
$ ll -i -h
total 957M
5659849 -rw-r----- 2 mart_bda mart_bda 479M Jun 13 10:57 test_file
5659849 -rw-r----- 2 mart_bda mart_bda 479M Jun 13 10:57 test_file_hardlink

这样,两个文件的 inode 号均为 5659849。

具体查看两个文件的 inode 内容:

$ stat test_file
  File: ‘test_file’
  Size: 501577774   Blocks: 979656     IO Block: 4096   regular file
Device: 811h/2065d  Inode: 5659849     Links: 2
Access: (0640/-rw-r-----)  Uid: ( 3457/mart_bda)   Gid: ( 3457/mart_bda)
Access: 2018-06-13 10:57:13.961409755 +0800
Modify: 2018-06-13 10:57:14.931383436 +0800
Change: 2018-06-13 10:58:11.382851699 +0800
 Birth: -
$ stat test_file_hardlink 
  File: ‘test_file_hardlink’
  Size: 501577774   Blocks: 979656     IO Block: 4096   regular file
Device: 811h/2065d  Inode: 5659849     Links: 2
Access: (0640/-rw-r-----)  Uid: ( 3457/mart_bda)   Gid: ( 3457/mart_bda)
Access: 2018-06-13 10:57:13.961409755 +0800
Modify: 2018-06-13 10:57:14.931383436 +0800
Change: 2018-06-13 10:58:11.382851699 +0800
 Birth: -

可以看到,两个文件的 inode 内容完全相同,且 Links 变成了 2修改任何一个文件名的内容,另一个文件名的内容也会同时改变,因为访问的就是硬盘中的同一块数据。

如果再将 test_file_hardlink 删掉,会使得 Links 变回 1。当这个值减到 0 时,说明没有文件名指向这个 inode,系统就会回收这个号码,以及所对应的 block 区域。

另外,对于目录的链接数,创建一个目录时,默认会生成两个目录项:. 和 .. 前者的 inode 号就是当前目录的 inode 号,等同于当前目录的硬链接;后者的 inode 号是父目录的 inode 号,等同于父目录的硬链接

因此,任何一个目录的硬链接总数,总是等于 2 加上它的子目录总数(含隐藏目录,且除去. 和 ..)。

软链接

软链接也可以通过不同的文件名访问同一块数据,但是与硬链接不同的是,两个文件名的 inode 是不一样的

那如何访问同一块区域呢?

比如文件 A 是文件 B 的软连接,那么文件 A 的内容存放的是文件 B 的路径名(可以通过这个找到文件 B 的目录项)。因此访问 A 时,会读取文件 B 的路径,进而读取文件 B 的内容。这样,对外表现来看,文件 A 和文件 B 的内容就相同了。类似于 windows 系统下的快捷方式

3XHG4O.png

举个栗子

建立软链接的命令:

ln -s [source file] [new file]

如:

$ ll
total 489824
-rw-r----- 1 mart_bda mart_bda 501577774 Jun 13 11:21 test_file
$ ln -s test_file test_file_soft
$ ll -h -i
total 479M
5659853 -rw-r----- 1 mart_bda mart_bda 479M Jun 13 11:21 test_file
5659854 lrwxrwxrwx 1 mart_bda mart_bda    9 Jun 13 11:22 test_file_soft -> test_file

如果是对文件夹简历软链接,则为:

ln -s /tmp/test_directory ./

会自动地在当前目录建立一个文件夹 test_directory ,并指向 /tmp/test_directory

  • 两个文件的 inode 号是不同的。
  • 既然文件 A 是依赖文件 B 存在的,那么如果删除了文件 B,打开文件 A 就会报错:No such file or directory;
  • 如果删除了文件 A,则对文件 B 的打开无影响,因为只是删除了“快捷方式”而已。
  • 软连接的建立,不会影响到文件 B 的 inode 的任何信息,包括 Links。

硬链接和软链接的不同

  1. 本质不同:硬链接是指向同一个文件,软链接指向的不是同一个文件。
  2. 删除时:硬链接不受影响,软链接失效
  3. 创建链接时:创建硬链接链接数加1,创建软链接连接数不变
  4. 是否可以跨分区:硬链接不可以跨分区,软链接可以跨分区
  5. 目录是否可以创建链接:硬链接不可以对目录创建,软链接可以对目录创建
  6. 硬链接的inode号相同,软链接inode号不同

硬链接和软链接的占用空间分析

硬链接不占用磁盘空间,软链接占用的空间只是存储路径所占用的极小空间。

ll –h 或者 ls –h这命令进行统计文件总大小的时候并不是从磁盘进行统计的,而是根据文件属性中的大小叠加得来的。而硬链接的文件属性中的大小就是就是inode号对应的数据块的大小,所以total中进行统计就把各个文件属性中的大小加起来作为总和,这种统计是不标准,也不具有代表性的,

真正的查看某个文件夹占用磁盘空间大小命令是:du –h 这个命令是从磁盘上进行统计,不会被文件的属性中大小影响,所以更准确

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/8732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软考 - 数据结构与算法

数据结构 线性结构 线性表 存储结构 顺序存储&#xff1a;用一组地址连续的存储单元 依次存储线性表中的数据元素&#xff0c;使得逻辑上相邻的元素物理上也相邻。 链式存储&#xff1a;存储各数据元素的结点的地址并不要求是连续的&#xff0c;数据元素逻辑上相邻&#xff…

提升Mac运行速度的三大方法

任何一部电子设备在使用多年之后都会出现性能下降的问题&#xff0c;苹果的Mac计算机自然也不例外。当你发现Mac运行缓慢&#xff0c;因为有太多文件或缓存垃圾将Mac的运行速度拖了下来。 要想提高生活和工作效率&#xff0c;必须对Mac进行优化&#xff0c;提升一下Mac 的使用性…

全业务链管理平台Odoo

什么是 Odoo ? Odoo 是一款非常容易使用又完全集成的商业应用&#xff0c;是一站式全业务链管理平台。 docker cli 安装 本项目涉及到 2 个容器&#xff0c;之前我们在下面&#x1f447;这些文章中 开源的看板管理工具Wekan类Trello的看板软件Planka群晖上安装MediaWiki的简…

linux系统java环境变量的下载与安装

由于目前好多工具的安全使用需要安装java环境&#xff0c;所有今天就分享一下java环境变量的安装与配置下载地址&#xff1a; https://download.oracle.com/otn/java/jdk/8u351-b10/10e8cce67c7843478f41411b7003171c/jdk-8u351-linux-i586.tar.gz?AuthParam1668564371_517fa4…

【2022.11.16】Lammps+Python+MATLAB在绘制维诺图时遇到的问题

目录写在前面绘制g6(r)执行步骤问题1&#xff1a;数据导入问题2&#xff1a;利用Python选取想要的数据问题3&#xff1a;如何找到每个点的最近邻问题4&#xff1a;绘制维诺图写在前面 记录一下做毕设时候遇到的问题 大目标是绘制g6的图片 相关文章&#xff1a; [1] Zu M , Li…

艾美捷可电离脂质SM-102解决方案

艾美捷SM-102是一种用于脂质纳米颗粒&#xff08;LNP&#xff09;的可电离脂质。LNP组合物已被证明有效地作为生物活性物质如小分子药物、蛋白质和核酸的运输载体进入细胞和/或细胞内隔室。这是一种试剂级产品&#xff0c;仅供研究使用。 艾美捷SM-102基本参数&#xff1a; 类…

企业管理 - 波司登战略管理解析

波司登战略管理解析 领导人讲话&#xff0c;视频&#xff1a;国家的战略&#xff0c;建设有中国特色的社会主义 这是一个文化大过滤时代&#xff1a;从宏观来讲&#xff0c;大的社会环境&#xff0c;包括现象&#xff0c;反腐&#xff0c;教育改革&#xff0c;把中华民族优秀…

Go(八)函数

目录 1. 函数 1.1 函数定义 1.2 函数的调用 1.3 参数 1.3.1 类型简写 1.3.2 可变参数 1.4 返回值 1.4.1 多返回值 1.4.2 返回值命名 1.4.3 返回值补充 2. 函数进阶 2.1 变量作用域 2.1.1 全局变量 2.1.2 局部变量 2.2 函数类型与变量 2.2.1 定义函数类型 2.2.…

FL Studio21免许可证完整版数字音频工作站(DAW)

如果你一直梦想制作自己的音乐(无论是作为一名制作人还是艺术家)&#xff0c;你可能会想你出生在这个时代是你的幸运星。这个水果圈工作室和上一版之间的改进水平确实令人钦佩。这仅仅是FL Studio 21所提供的皮毛。你的音乐项目的选择真的会让你大吃一惊。你以前从未有过这样的…

K3s离线部署

下载离线镜像包 离线镜像包下载地址 因为我的环境是CentOS 7.7&#xff0c;所以下载红框里的两个 下载部署脚本 部署脚本下载地址&#xff08;https://get.k3s.io&#xff09; 将准备好的文件上传到服务器上后&#xff0c;将k3s二进制文件及镜像包放到指定目录&#xff08;每…

大数据在线实习项目能收获什么呢?

大数据在线实习项目提供在线大数据项目&#xff0c;参与真实企业项目&#xff0c;可提供实习证明。 项目实习过程会根据项目背景、项目目标、项目数据来逐一展开&#xff0c;一个项目的项目周期大概为4周时间&#xff0c;同时也可以根据自身时间条件来调整。 项目涉及多方面知识…

CSC公派|高职院校教师赴澳大利亚大学访学

L老师只是高职院校护理与助产学专业教师&#xff0c;硕士学位&#xff0c;却能在众多申请者中脱颖而出&#xff0c;一举中榜。原因之一是接收学校专门设有护理与助产学院且排名靠前&#xff0c;导师的研究方向和L老师高度相符&#xff0c;在访学的必要性、可行性及应用前景上占…

线路测量通用公式的推导及编程

wyqzm网友&#xff1a; 问几个问题1、点到中线的垂距计算公式是怎么推导出来的&#xff0c;就是那个S&#xff1d;&#xff08;XA-XB&#xff09;SIN....我怎么也看不明白这是一个什么样的公式&#xff1f;别笑话哦&#xff01; 2、假如一条线路有很多的曲线组合&#xff0c;怎…

振弦采集模块UART 通讯协议

振弦采集模块UART 通讯协议 UART 接口支持标准的工业 MODBUS 通讯协议&#xff08; 03、 04、 06、 16 指令码&#xff09;和自定义的简单 AABB协议以及$字符串指令集。 前两种协议均支持基于模块地址和总线连接的一主多从应用结构&#xff0c; 在总线中&#xff0c; VMXXX 模…

记一次攻防演练之vcenter后渗透利用

1. 说明 很早之前的一次攻防演练&#xff0c;主要是从web漏洞入手&#xff0c;逐渐学习vcenter后利用技术。过程由于太长&#xff0c;很多细节都省略了&#xff0c;中间踩坑、磕磕绊绊的地方太多了。。。 由于敏感性&#xff0c;很多地方都是打码或者是没有图&#xff0c;按照…

synchronized关键字

多线程编程中&#xff0c;最让人头疼的问题莫过于线程安全&#xff0c;如果对存在线程安全问题的代码不加以处理&#xff0c;可能会带来严重的后果&#xff0c;例如用两个线程对同一个变量进行增加操作 class Counter {//这个 变量 是两个线程要去自增的变量public int count;…

进程调度算法详解

进程调度算法&#x1f3de;️1. 调度指标&#x1f301;2. 先进先出&#xff08;FIFO&#xff09;&#x1f320;3. 最短作业优先&#xff08;SJF&#xff09;&#x1f30c;4. 最短剩余时间优先&#xff08;STCF&#xff09;&#x1f33f;5. 新度量指标&#xff1a;响应时间&…

linux网络编程(四)多路I/O转接服务器

文章目录1.多路I/O转接服务器2.select 方式的多路I/O转接服务器3.poll 方式的多路I/O转接服务器4.epoll 方式的多路I/O转接服务器1.多路I/O转接服务器 多路IO转接服务器也叫做多任务IO服务器。该类服务器实现的主旨思想是&#xff0c;不再由应用程序自己监视客户端连接&#xf…

利用stream实现行政区域列表转tree树形结构

一、数据结构 CREATE TABLE t_districts (adcode bigint NOT NULL COMMENT 主键(区域编码)\r\n,pid varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 父级区域编码,name varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci D…

MySQL的Redo log 、Undo log、 Binlog

MySQL的redo log 、undo log、 binlog redo log概念 redo log翻译过来叫重做日志&#xff0c;是一种保证持久化的措施&#xff0c;innodb存储引擎的物理日志文件 redo log是固定大小的&#xff0c;是循环写的过程 有了redo log之后&#xff0c;innodb就可以保证即使数据库发…