当前位置: 首页 > article >正文

【Linux】20.基础IO(2)

文章目录

  • 2. 理解文件系统
    • 2.1 inode
    • 2.2 如何理解目录
    • 2.3 硬链接
    • 2.4 软链接
    • 2.5 硬链接和软链接的区别


2. 理解文件系统

2.1 inode

我们使用ls -l的时候看到的除了看到文件名,还看到了文件元数据。

ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ ll
total 8
drwxrwxr-x  2 ydk_108 ydk_108 4096 Jan 23 17:05 ./
drwxrwxr-x 16 ydk_108 ydk_108 4096 Jan 23 17:05 ../
ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ 

每行包含7列:

  1. 模式
  2. 硬链接数
  3. 文件所有者
  4. 大小
  5. 最后修改时间
  6. 文件名

ls -l读取存储在磁盘上的文件信息,然后显示出来

37bb1623183afb44a4b5b6fc777f1640

其实这个信息除了通过这种方式来读取,还有一个stat命令能够看到更多信息

root@iZuf68hz06p6s2809gl3i1Z:~/108_class# stat test.txt
  File: test.txt
  Size: 168894    	Blocks: 336        IO Block: 4096   regular file
Device: fc03h/64515d	Inode: 523299      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2025-01-11 14:56:30.477415933 +0800
Modify: 2025-01-11 14:55:52.332005160 +0800
Change: 2025-01-11 14:55:52.332005160 +0800
 Birth: -
root@iZuf68hz06p6s2809gl3i1Z:~/108_class# 

上面的执行结果有几个信息需要解释清楚

为了能解释清楚inode我们先简单了解一下文件系统

dae313d8cfc2ea56a1aa9380c7dd8b1e

  • Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子

  • 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolckinode的总量,未使用的blockinode的数量,一个blockinode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。

  • GDT:块组描述符,描述块组属性信息,有兴趣的可以在了解一下

  • 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用

  • inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。

  • i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等

  • 数据区:存放文件内容

Linux系统中,一个文件,一个inode。每一个inode都有自己的inode编号(inode的设置,是以分区为单位的,不能跨分区)

inode表示文件的所有属性。文件名,并不属于inode内的属性。

将属性和数据分开存放的想法看起来很简单,但实际上是如何工作的呢?我们通过touch一个新文件来看看如何工作。

[root@localhost linux]# touch abc
[root@localhost linux]# ls -i abc
263466 abc

aa6d788562c4604f30cd705b5559985a

创建一个新文件主要有一下4个操作:

  1. 存储属性
    内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。
  2. 存储数据
    该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据
    复制到300,下一块复制到500,以此类推。
  3. 记录分配情况
    文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。
  4. 添加文件名到目录

新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文件。

文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。


2.2 如何理解目录

  1. 如何理解"目录”

    目录也是文件,也有自己的inode。目录也要有自己的属性

  2. 目录要不要数据块?

    目录也有数据块。

  3. 里面放什么呢?

    该目录下,文件的文件名 和 对应文件的inode的映射关系。

目录是文件,也有ingde编号:

这些问题都与目录的本质及其权限管理密切相关,我来统一解释:

目录本质上是一个特殊的文件,其内部存储着文件名与inode号的映射关系:

  1. 为什么同名文件不能存在:

    • 目录文件内部是一张表,存储着 “文件名→inode号” 的映射

    • 文件名是这张表的主键/索引

    • 如果允许同名,就会造成一个文件名对应多个inode号,系统就无法确定要访问哪个文件

  2. 目录没有w权限:

    • w权限控制目录内容的修改权限

    • 不能创建文件是因为创建文件需要在目录的映射表中添加新的"文件名→inode"记录

    • 没有w权限就无法修改这张映射表,所以无法创建新文件

  3. 目录没有r权限:

    • r权限控制读取目录内容的权限

    • 不能查看文件是因为无法读取目录的映射表

    • 无法获取目录下文件名和inode的对应关系

  4. 目录没有x权限:

    • x权限控制目录的访问/切换权限

    • 系统需要通过目录的inode找到目录的数据块,才能访问目录内容

    • 没有x权限就无法访问目录的inode信息,自然无法进入目录

这些权限的组合形成了一个完整的访问控制体系:

  • 要完整使用一个目录,需要同时具备r、w、x三个权限
  • r权限让你能看到文件列表
  • w权限让你能修改目录内容(创建、删除、重命名文件)
  • x权限让你能访问目录本身和其中的文件
  • 这三种权限相互配合,确保了文件系统的安全性和可用性

总结来说,目录作为一个特殊的文件,其inode和权限系统共同构建了一个层级化的文件组织和访问控制机制。


2.3 硬链接

我们看到,真正找到磁盘上文件的并不是文件名,而是inode。 其实在linux中可以让多个文件名对应于同一个inode

[root@localhost linux]# touch abc 
[root@localhost linux]# ln abc def 
[root@localhost linux]# ls -1i
abc def 263466 abc 263466 def

abcdef的链接状态完全相同,他们被称为指向文件的硬链接。

内核记录了这个连接数,inode 263466 的硬连接数为2

我们在删除文件时干了两件事情:

  1. 在目录中将对应的记录删除。

  2. 将硬连接数-1,如果为0,则将对应的磁盘释放。

硬链接不是一个独立的文件!因为他没有独立的inode

该如何理解硬链接?

所谓的建立硬链接,本质其实就是在特定目录的数据块中新增 文件名和指向的文件的inode 编号的映射关系。

任意一个文件,无论是目录,还是普通文件,都有inode。每一个inode内部,都有一个叫做引用计数的计数器(有多少个文件名指向我)。


2.4 软链接

硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件,在shell中的做法

263563 -rw-r--r--. 2 root root 0 915 17:45 abc
261678 lrwxrwxrwx. 1 root root 3 915 17:53 abc.s -> abc
263563 -rw-r--r--. 2 root root 0 915 17:45 def

b611fd1c006686e7025cf82fdb42de12

软链接是一个独立的文件,具有独立的inode

该如何理解软链接?

软链接是一个独立的文件,有独立的inode,也有独立的数据块,他的数据块里面保存的是指向的文件的路径,相当于windows快捷方式


2.5 硬链接和软链接的区别

inode号:

  • 硬链接:与源文件拥有相同的inode
  • 软链接:有自己独立的inode

文件大小:

  • 硬链接:与源文件大小完全相同
  • 软链接:只占用存储源文件路径名的空间(通常很小)

原文件删除:

  • 硬链接:不受影响,仍然可以访问文件内容
  • 软链接:失效,无法访问(出现断链)

跨文件系统:

  • 硬链接:不能跨文件系统建立
  • 软链接:可以跨文件系统建立

支持目录:

  • 硬链接:不能对目录创建硬链接
  • 软链接:可以对目录创建软链接

常见应用场景:

硬链接适用于:

  • 需要在同一文件系统内保持文件多份副本
  • 想要节省存储空间
  • 确保文件不会因某个链接删除而丢失
  • 通常用来进行路径定位,采用硬链接,可以进行目录间切换

软链接适用于:

  • 需要跨文件系统建立链接
  • 需要链接目录
  • 创建容易理解的快捷方式
  • 经常需要修改链接指向

使用示例:

# 创建示例文件
echo "Hello" > source.txt

# 创建硬链接
ln source.txt hardlink.txt

# 创建软链接
ln -s source.txt softlink.txt

# 查看链接情况
ls -li
# 可以看到硬链接共享同一个inode号
# 软链接有独立的inode号

# 删除源文件测试
rm source.txt
# 硬链接仍然可用
# 软链接会失效

总结:

  • 硬链接更安全但使用受限
  • 软链接更灵活但可能出现断链
  • 选择哪种链接取决于具体使用场景

补充:

ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ ll
total 8
drwxrwxr-x  2 ydk_108 ydk_108 4096 Jan 23 17:05 ./
drwxrwxr-x 16 ydk_108 ydk_108 4096 Jan 23 17:05 ../
ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ ll -li
total 8
527696 drwxrwxr-x  2 ydk_108 ydk_108 4096 Jan 23 17:05 ./
523318 drwxrwxr-x 16 ydk_108 ydk_108 4096 Jan 23 17:05 ../
ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ ll -lia
total 8
527696 drwxrwxr-x  2 ydk_108 ydk_108 4096 Jan 23 17:05 ./
523318 drwxrwxr-x 16 ydk_108 ydk_108 4096 Jan 23 17:05 ../
ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ pwd
/home/ydk_108/108/lesson20
ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ ls /home/ydk_108/108/lesson20 -dil
527696 drwxrwxr-x 2 ydk_108 ydk_108 4096 Jan 23 17:05 /home/ydk_108/108/lesson20
ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ ls /home/ydk_108/108 -dil
523318 drwxrwxr-x 16 ydk_108 ydk_108 4096 Jan 23 17:05 /home/ydk_108/108
ydk_108@iZuf68hz06p6s2809gl3i1Z:~/108/lesson20$ 

在Linux中,.表示当前路径的硬链接,..表示上级路径的硬链接。

文件的三个时间:

  • Access :最后访问时间

  • Modify :文件内容最后修改时间

  • Change :属性最后修改时间


http://www.kler.cn/a/518874.html

相关文章:

  • uva 1354 Mobile Computing
  • Linux的权限和一些shell原理
  • NX100 参数配置
  • C++异步future
  • PAT甲级-1024 Palindromic Number
  • Next.js 实战 (十):中间件的魅力,打造更快更安全的应用
  • React Router v6配置路由守卫
  • Linux的udev详解、安装和使用(dev下的设备每次开机的名称不固定怎么办?)
  • 如何将手机的画面和音频全部传输到电脑显示和使用电脑外放输出
  • 九、CSS工程化方案
  • drools 规则引擎和 solon-flow 哪个好?solon-flow 简明教程
  • Orgill EDI需求分析
  • 需求分析的
  • 斯坦福:LLM混合量化方法BlockDialect
  • 性能测试JVM监控有哪些?
  • Keepalived实现HAProxy高可用搭建
  • FreeBSD里制作ubuntu22 jammy兼容环境的脚本
  • FAST-DDS and ROS2 RQT connect
  • npm启动前端项目时报错(vue) error:0308010C:digital envelope routines::unsupported
  • 代码练习2
  • 速通JS中的函数作用域与全局污染
  • 鸿蒙next 自定义日历组件
  • C++语法·食二
  • Python 字典排序:详解 sort()、reversed()、sorted()、cmp()
  • thinkphp6+swoole使用rabbitMq队列
  • GPMC介绍