Linux文件系统与inode、Block笔记

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

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

环境

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

# 首先在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编号。

$ ls -i
33933113 temp 17414066 test.txt
# 前面的数字就是inode且独一无二

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

$ 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具体包含了哪些东西?

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,并且刚好使用满二次间接,能够存储的数据大小为:

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的时候,流程如下:

首先检查根目录下的权限“/”,符合权限
通过之后,检查根目录的block是否存储有“root/”目录以及对应inode 查找成功,找到/root/目录的inode,检查权限等信息,符合权限
通过之后,检查/root/inode下的block中是否存在test.txt以及inode 查找成功,找到/root/test.txt的inode检查权限等信息,符合
查询inode中的直接或间接block将数据读出

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

$ 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的写权限移除

# 创建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文件夹,试图创建文件,发现失败:

$ cd ./temp
$ touch test3
touch: cannot touch ‘test3’: Permission denied
$ rm test2
rm: cannot rm ‘test3’: Permission denied

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

$ echo "Hello" > test2
$ cat test2
Hello
# 没有问题

Linux文件系统与inode、Block笔记的更多相关文章

  1. Linux文件系统(inode、block……)

    内容源于<鸟哥的Linux私房菜> 认识 EXT2 文件系统 文件系统的特殊观察与操作 文件系统 superblock,inode,block superblock,inode,block ...

  2. linux 文件系统(inode和block)

    linux文件系统(inode block superblock)   先说一下格式化:每种操作系统所设置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此就需要将分区格式化,以成为操作系统能 ...

  3. 理解Linux文件系统之inode

    很少转发别人的文章,但是这篇写的太好了. 理解inode   作者: 阮一峰 inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础. 我觉得,理解inode,不仅有助于提高系统 ...

  4. [转]理解Linux文件系统之inode

    很少转发别人的文章,但是这篇写的太好了. 理解inode   作者: 阮一峰 inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础. 我觉得,理解inode,不仅有助于提高系统 ...

  5. Linux 深入理解inode/block/superblock

    基础命令学习目录首页 原文链接:https://blog.csdn.net/Ohmyberry/article/details/80427492 档案系统特性 传统的磁盘与档案系统之应用中,一个分割槽 ...

  6. 理解Linux文件系统之 inode

    一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统读取硬盘的时候,不会 ...

  7. Linux文件系统之INode

    本文转载自阮一峰博客:理解inode 一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存51 ...

  8. 存储那些事儿(二): 下一代Linux文件系统BTRFS简介

    BTRFS,通常念成 Butter FS,Better FS 或B-tree FS.下一代的Linux文件系统. 它基于写时拷贝(copy-on-write),支持高效的snapshot和clone. ...

  9. Linux文件系统及管理

    Linux文件系统及管理 一.Linux系统的文件系统与目录结构   Linux系统的文件目录结构为一个单根倒置的树结构,具体表现如下图: 从CentOS7开始,以下目录与之前的版本发生变化 ◆/bi ...

随机推荐

  1. Struts2之处理请求参数

    时间:2017-1-11 11:05 --Struts2中获取请求参数(重点)1.Struts2是一个MVC框架,那么分别表示什么?    View:JSP    Model:Action    Co ...

  2. 眼见为实,看看MySQL中的隐藏列!

    在介绍mysql的多版本并发控制mvcc的过程中,我们提到过mysql中存在一些隐藏列,例如行标识.事务ID.回滚指针等,不知道大家是否和我一样好奇过,要怎样才能实际地看到这些隐藏列的值呢? 本文我们 ...

  3. ffmpeg命令 从网络摄像头录制视频

    安装 sudo apt-get install ffmpeg 录制视频为record.mp4文件 ffmpeg -y -i rtsp://cameral_ip:port -vcodec copy -a ...

  4. Caffe 快速入门笔记

    官网:http://caffe.berkeleyvision.org/ 其中包含Notebook Example方便入门学习 只是使用她的库还是比较简单,其难点在于: 安装 源码 训练好的模型,用于迁 ...

  5. 老司机带你体验SYS库多种新玩法

    导读 如何更加愉快地利用sys库做一些监控? 快来,跟上老司机,体验sys库的多种新玩法~ MySQL5.7的新特性中,非常突出的特性之一就是sys库,不仅可以通过sys库完成MySQL信息的收集,还 ...

  6. 设置 ajax 同步获取数据

    问题 在处理DataTable的render进行列表渲染的时候发现通过ajax发送请求,返回的值并不正确. {"data":"id","render& ...

  7. NOIP模拟「random·string·queen」

    T1:random   我又来白剽博客了:   详细证明请看土哥   土哥写的不是很详细,我在这里详细写一下:   首先,对于f[n]的式子:   加一是那一个对的贡献,大C是选其余的几个数,\(2^ ...

  8. Flask - 访问返回字典的接口报错:The view function did not return a valid response. The return type must be a string, tuple, Response instance, or WSGI callable, but it was a dict.

    背景 有一个 Flask 项目,然后有一个路由返回的是 dict 通过浏览器访问,结果报错 关键报错信息 TypeError: 'dict' object is not callable The vi ...

  9. wireshark 解密加密报文

    wireshark 解密IPSec加密后的报文 序言 wireshark作为一款非常优秀的抓包工具,支持了各种各样的网络协议,成为了网络开发中必不可少的工具之一.一般而言,对于普通的网络数据包,wir ...

  10. 获取docker镜像的tag列表

    已nginx为例 命令如下 wget -q https://registry.hub.docker.com/v1/repositories/nginx/tags -O - | sed -e 's/[] ...