前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux文件系统与inode、Block笔记

Linux文件系统与inode、Block笔记

作者头像
w4ngzhen
发布于 2023-10-18 09:59:28
发布于 2023-10-18 09:59:28
45600
代码可运行
举报
文章被收录于专栏:编译思想编译思想
运行总次数:0
代码可运行

Linux下一切都是文件,无论是设备还是接口,亦或是网卡等均被抽象成了文件,并且有相关的内核代码进行调度。然而,在一切都是文件的前提下,最需要进行探讨的则是文件存储的根源:文件系统。文件系统的好坏能够更加完美的解决在一个操作系统中对于文件的管理。

Linux下的文件系统是按照inode + block模式来进行了的。通俗一点讲,类似于指针一样的形式存在。即inode作为“指针”记录并指向了真正的”数据块“block。

环境

为了方便后面的实际操作,我们按照如下进行环境的搭建

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 首先在test目录下创建一个名为temp的文件夹与一个普通的文件test.txt
$ pwd
/root/test
$ mkdir temp && touch test.txt
# 文件结构如下
test
├── temp
└── test.txt
1 directory, 1 file
# 向test.txt写入一句话
$ echo "Its's a test.txt" >> test.txt

inode

在Linux中,每一份文件都对应了独一无二的inode编号,通过使用命令ls加参数-i,则可以在显示的文件前显示inode编号。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ ls -i
33933113 temp 17414066 test.txt
# 前面的数字就是inode且独一无二

除此之外,inode中还存储更加关键的文件元信息:权限、属性等。例如当我们使用ls -l显示文件的相关属性时,这里面的信息就存储在inode:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ ls -l
total 4
drwxr-xr-x. 2 root root  6 Apr  8 13:05 temp
-rw-r--r--. 1 root root 16 Apr  8 13:08 test.txt
# 文件夹、文件名前面的诸如读、写、执行权限,修改时间等均存储在inode中

当然,对于inode来说,既然它本身能够记录这些信息,所以自身是有大小的,每个inode 大小均固定为128 bytes,虽然不大,但是记录元信息完全足够了。同时,它本身还记录此文件数据所在的block数据块的编号。inode记录一个block编号需要花掉4bytes

block

既然inode是记录文件的元信息的,那么一般文件本身的数据记录在何处呢?答案则是block数据块。在Linux中,block文件快大小通常选择4KB,当然我们还可以选择1KB、2KB等。这是不定的,但是如果选择的太小,那么inode需要记录block编号就要增多,如果太大,容易造成存储碎片。如何理解?其实我们可以把block看作是文件的基本单位,例如,我们现在有一个22KB大小的文件,一个简单的计算,倘若我们使用4KB的block需要6块才能完全装下,不过会有2KB是浪费了的。如果我们采用2KB的block则刚好11块可以装下。这里虽然是选择2KB是最合适的,但是在一般Linux系统中是4KB,为什么?请自行查阅相关的资料,不再赘述。

综合inode与block进行探讨

上面的inode与block只是大致介绍了相关的,下面才是更加实在的内容。

inode具体包含了哪些东西?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1、文件的字节数
2、文件拥有者的User ID
3、文件的Group ID
4、文件的读、写、执行权限
5、文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
6、链接数,即有多少文件名指向这个inode
7、文件数据block的位置

1-5点不难理解,第6点在后面的软硬连接再叙,第七点这里要提一下。上面说过inode本身128 Bytes,还是能记录很多信息的,这里1-6点不至于花光128 Bytes,而对于第7点,inode本身能够记录12个block,如果采用4KB block显然,我们只能存储12 * 4KB大小的文件,这显然是不现实的。为了解决这个问题,inode中在第12个记录block编号之后,还能动态的增加二级、甚至三级间接指向,这里我们使用如下的图更为形象的说明:

在上图的情况下,我们可以知道假设我们使用4KB大小的block,并且刚好使用满二次间接,能够存储的数据大小为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
12*4KB + 1024*4KB + 1024*1024*4KB
= 48KB + 4MB + 4GB
≈ 4GB

关于文件夹的inode、block

上面讨论inode与block我们都是以一个普通文件的角度来看待的。然而,文件夹inode与block与普通文件是有一定的差别的。对于一个文件夹来说,inode与普通文件类似,包含了关于文件夹的属性、读写执行权限、时间戳等。然而,文件夹inode中的直接block通常不会超过12个直接的。为什么呢?因为文件夹所指向的block只会存储这个文件夹拥有的文件的inode编号,并不会存储实际的文件内容。

例如,当我们拥有一个文件夹dir,这个文件夹下面只有一份文件大小为4GB的inode为1234的文件,那么实际上,文件夹inode中存储的block中只会存储类似inode=1234这样的信息。下图能够更加形象的展示:

总结一下,文件夹的block只会存储对应文件夹下面的文件的inode。所以当我们访问某一个文件的时候,譬如我问需要查看/root/test.txt的时候,流程如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
首先检查根目录下的权限“/”,符合权限
通过之后,检查根目录的block是否存储有“root/”目录以及对应inode

查找成功,找到/root/目录的inode,检查权限等信息,符合权限
通过之后,检查/root/inode下的block中是否存在test.txt以及inode

查找成功,找到/root/test.txt的inode检查权限等信息,符合
查询inode中的直接或间接block将数据读出

那么,通过以上的分析,我们也很容易的能够理解,如果我们没有对文件夹有写的权限,是不能够删除文件夹下面的文件或者是创建文件的。因为当我们删除一个文件的时候,是对文件夹inode对应的block中存储的文件信息进行删除或添加。由于root用户的特殊性,我们使用一个普通用户zhen,并在zhen用户的home目录下创建一个temp文件夹

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cd ~
$ ls -l
drwxrwxr-x. 2 zhen zhen  6 Apr  8 13:05 temp
# temp文件夹对于zhen用户有读写以及执行的权限,所以我们(zhen)可以自由的在里面添加删除文件
$ cd ./temp
$ touch test
$ ls
test
$ rm test
$ ls
# 创建删除都没有问题

接下来我们首先在temp文件夹中创建一个test2文件,再回到上一目录,将temp的写权限移除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建test2文件
$ touch test2
$ ls
test2
# 回到上一目录
$ cd ..
# 将temp对于zhen的写权限移除
$ chmod 500 ./temp
$ ls -l
total 4
dr-x------. 2 zhen zhen  6 Apr  8 14:52 temp

然后,我们再次进入temp文件夹,试图创建文件,发现失败:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cd ./temp
$ touch test3
touch: cannot touch ‘test3’: Permission denied
$ rm test2
rm: cannot rm ‘test3’: Permission denied

操作发现,无论是在该文件夹下创建还是删除文件,都是失败的。那么,我们还能不能编辑该文件夹该文件夹下面的文件呢?譬如想test2文件插入一句“Hello”?理论上来讲,是可以的,因为我们修改test2文件内容,并不会影响temp文件夹的block内容,而事实上也是如此:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ echo "Hello" > test2
$ cat test2
Hello
# 没有问题
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-04-082,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Linux系统#6】文件系统 & 软硬链接
✨ 彼时春杉少年郎,笑看风华不知愁 🌏
IsLand1314
2025/06/02
1060
【Linux系统#6】文件系统 & 软硬链接
Linux文件系统详解
  我相信只要使用过电脑的人都对磁盘这个词不陌生,我们通常在买电脑的时候也会根据磁盘的大小做选择,磁盘作为计算机的存储设备也是很重要的一个部件。
用户11029129
2024/06/04
2580
Linux文件系统详解
【Linux】文件系统的基本概念
文件系统是一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接口,并通过文件权限控制访问。
半生瓜的blog
2023/05/13
6340
【Linux】文件系统的基本概念
linux文件目录管理基本命令总结
元数据:metadata   (文件的类型,权限,从属关系,大小,时间,数据区指针)
用户4877748
2020/07/21
1.1K0
【Linux】基础IO——文件系统
磁盘计算机上唯一的一个机械设备,同时它还是外设 机械磁盘很便宜,虽然效率会慢一些,所以企业一般使用机械磁盘,因为便宜 磁盘不仅仅外设,还是一个机械设备(盘片、磁头),所以磁盘一定非常慢
lovevivi
2023/05/04
5290
【Linux】基础IO——文件系统
【linux学习指南】Ext系列文件系统(二)引⼊⽂件系统“块“&&分区&&inode概念
其实硬盘是典型的“块”设备,操作系统读取硬盘数据的时候,其实是不会⼀个个扇区地读取,这样效率太低,⽽是⼀次性连续读取多个扇区,即⼀次性读取⼀个”块”(block)。
学习起来吧
2025/01/01
1540
【linux学习指南】Ext系列文件系统(二)引⼊⽂件系统“块“&&分区&&inode概念
Linux文件系统十问
我在知乎和公众号上都提到过,我 2012 在腾讯工作的时候写过一篇《Linux文件系统十问》。总有人问我这篇文章在哪里能看到,如今外网唯一的正版链接-腾讯学堂也挂了,网上能搜到的全是盗版。所以今天我干脆就正式给大家发一遍。
开发内功修炼
2022/03/24
1.3K0
Linux文件系统十问
Linux文件系统——全方位掌握
文件系统的特性 磁盘分区完毕后需要进行格式化,操作系统才能使用这个分区。 不同操作系统能够使用的文件系统是不同的,例如:Windows98以前使用FAT/FAT16文件系统,Windows2000以后使用NTFS文件系统,Linux使用Ext2文件系统。在分区完成之后,要使得操作系统能够识别文件系统,就需要进行格式化,把分区格式化成某一个操作系统能够识别的文件系统。 一般来说,一个分区中装一个文件系统,但是现在技术发展了,一个分区可以装多个文件系统,也能将多个分区合并成一个文件系统。一个文件系统可以
大闲人柴毛毛
2018/03/09
9640
linux文件系统进阶篇
在之前我写过一篇关于linux的虚拟文件系统的博客,不过那篇主要是介绍打开的文件是如何在linux系统中被管理和存储的,那么这篇进阶版文件系统就要介绍一下,当文件没有被打开的时候,它在linux系统中是如何被管理和存储的。
咬咬
2024/06/12
1300
linux文件系统进阶篇
【Linux】理解文件系统——软硬链接
我们之前讨论的都是进程和被打开文件的关系,而如果一个文件是没有被打开呢?没有被打开的文件操作系统如何管理?
平凡的人1
2023/10/15
4910
【Linux】理解文件系统——软硬链接
Linux文件系统和inode
学到linux上的软连接和硬链接,不得不了解inode,要想知道inode,不得不了解一些文件系统,至少是Linux文件系统
用户5807183
2019/07/30
5.9K0
Linux文件系统和inode
Linux文件系统的实现
Linux文件管理从用户的层面介绍了Linux管理文件的方式。Linux有一个树状结构来组织文件。树的顶端为根目录(/),节点为目录,而末端的叶子为包含数据的文件。当我们给出一个文件的完整路径时,我们从根目录出发,经过沿途各个目录,最终到达文件。 我们可以对文件进行许多操作,比如打开和读写。在Linux文件管理相关命令中,我们看到许多对文件进行操作的命令。它们大都基于对文件的打开和读写操作。比如cat可以打开文件,读取数据,最后在终端显示: $cat test.txt 对于Linux下的程序员来说,了解文件
Vamei
2018/01/18
2.8K0
Linux文件系统的实现
Linux目录及文件相关知识整理
Linux 文件管理是学习 Linux 的基础,看了鸟叔的 Linux 书籍,把 Linux 目录及文件相关的知识整理如下。
Wizey
2018/08/30
1.3K0
Linux目录及文件相关知识整理
运维Tips | Linux系统文件命令执行时inode表如何变化?
描述:文件元数据(Metadata)是文件的属性,它描述了文件的基本信息,例如文件大小、创建时间、类型、权限等。其通常是存放在inode (index node) 表中,inode 表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息。
全栈工程师修炼指南
2024/05/28
3300
运维Tips | Linux系统文件命令执行时inode表如何变化?
Linux文件系统
磁盘是一个机械机构,不同于硬盘。 现在普通人很少能见到磁盘了。 磁盘是一个机械结构+外设=访问很慢(只是相对于硬盘很慢)
有礼貌的灰绅士
2023/03/28
13.2K0
Linux文件系统
[操作系统] Ext系列文件系统
其实硬盘是典型的“块”设备,操作系统读取硬盘数据的时候,其实是不会⼀个个扇区地读取,这样效率太低,⽽是⼀次性连续读取多个扇区,即⼀次性读取⼀个块(block)。
DevKevin
2025/02/23
1040
[操作系统] Ext系列文件系统
文件管理基础命令
命令与文件补全:在Bash(sh)中命令与文件补全是非常方便与常用的功能我们只要在输入命令或文件时,按Tab键就会自动进行补全 Linux命令书写规范:一条完整的linux基本由两部分组成,命令和参数,命令和参数之间用空格隔开,并用”-“或者”–“连接
全栈工程师修炼指南
2022/09/28
1.3K0
文件管理基础命令
搞它!!!深入了解linux文件系统底层原理及日志文件介绍
entos7.0开始默认文件系统是xfs,centos6是ext4,centos5是ext3 ext4是第四代扩展文件系统(英语:Fourth EXtended filesystem,缩写为ext4)是linux系统下的日志文件系统,是ext3文件系统的后继版本 ext4的文件系统容量达到1EB,而文件容量则达到16TB,这是一个非常大的数字了。对一般的台式机和服务器而言,这可能并不重要,但对于大型磁盘阵列的用户而言,这就非常重要了。 ext3目前只支持32000个子目录,而ext4取消了这一限制,理论上支持无限数量的子目录
不吃小白菜
2020/09/03
2.5K0
搞它!!!深入了解linux文件系统底层原理及日志文件介绍
【Linux】Ext2 文件系统
而以上两个部分我们称为文件系统!我们在上一章已经学习过了在系统中一个被打开的文件,而本章我们开始学习在磁盘中没有被打开的文件。
YoungMLet
2024/03/01
2430
【Linux】Ext2 文件系统
Linux文件系统详解
Linux上的文件系统一般来说就是EXT2或EXT3,但这篇文章并不准备一上来就直接讲它们,而希望结合Linux操作系统并从文件系统建立的基础——硬盘开始,一步步认识Linux的文件系统。
狼啸风云
2019/10/24
6.6K0
相关推荐
【Linux系统#6】文件系统 & 软硬链接
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验