1 inode
当我们创建一个文件时,用带上 -i 选项可以查看文件的inode:
其中第一个选项就是文件的inode,除此之外另外几列表示的是:
- 模式
- 硬链接数
- 文件所有者
- 所属组
- 大小
- 最后修改时间
- 文件名
ls -l读取存储在磁盘上的文件信息,然后显示出来:
那么究竟什么是inode呢?
为了能解释清楚inode我们先简单了解一下文件系统:
Linux ext2 文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的 block 。一个 block 的大小是由格式化的时候确定的,并且不可以更改。例如 mke2fs 的 -b 选项可以设 定 block 大小为 1024 、 2048 或 4096 字节。而上图中启动块( BootBlock )的大小是确定的。
Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。
超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了 。
GDT,Group Descriptor Table:块组描述符,描述块组属性信息。
块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用 。
inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。
inode节点表:存放文件属性 如文件大小,所有者,最近修改时间等 。
数据区:存放文件内容 。
注意:
1 为什么文件系统中Super Block 在每一个文件的属性信息都有呢?
这是为了防止由于属性信息损坏使超级块被损坏而导致文件系统本身的结构信息丢失。
2 如何理解删除文件?
删除文件本质是直接在将inode Bitmap中对应文件的比特位置为0,并不需要修改数据区的内容。
3 文件名与inode的区别?
linux系统只认识inode编号,文件的inode属性中是不存在文件名的,文件名只是给用户看的。我们在一个目录上多个建立文件实质上是该目录维护了文件名与inode的关系,所以我们能够通过文件名找到该文件。
4 既然每一个数据块大小已经确定了,那么文件过大应该怎么管理呢?
实际inode会通过维护一张表来帮助我们管理文件,我们通过这张表建立索引来表示哪些数据块是属于哪一个文件,也就是一个文件可能够对应着多个数据块,这样即便是大文件我们依旧可以很好的管理起来。
5 有没有可能文件数据块没用完,但是inode没有了?或者inode还有,但是数据块没有了?
这两种情况都是有可能发生的。数据块没用完,但是inode没有了,可能是建立了很多的空文件(小文件);inode还有,但是数据块没了可能建立的文件太大了。
将属性和数据分开存放:
创建一个新文件主要有一下 4 个操作:
1. 存储属性
内核先找到一个空闲的 i 节点(这里是 263466 )内核把文件信息记录到其中。
2. 存储数据
该文件需要存储在三个磁盘块,内核找到了三个空闲块: 300,500 , 800 。将内核缓冲区的第一块数据复制到 300 ,下一块复制到 500 ,以此类推。
3. 记录分配情况
文件内容按顺序 300,500,800 存放。内核在 inode 上的磁盘分布区记录了上述块列表。
4. 添加文件名到目录
新的文件名 abc 。 linux 如何在当前的目录中记录这个文件?内核将入口( 263466 , abc )添加到目录文件。文件名和 inode 之间的对应关系将文件名和文件的内容及属性连接起来。
2 软链接
首先来看看基本命令是啥?
ln -s 源文件名字 要生成的软链接文件名字 //可以指定路径生成
不知道大家观察到了没有,通过软链接生成的文件inode编号与源文件不一样,也就是说生成的软链接文件与源文件是两个文件,那么软链接有啥作用吗?
我们换一个应用场景:
我们创建一系列的目录,在最后一个目录中创建一个文件,形成这种结构:
当我们想要在与a目录同级目录下运行可执行文件可以使用这种方式:
这种方式就是软链接,通过软链接我们就能够直接用./test-sortt的方式运行可执行文件,再也不用一个一个指定路径来查找了,这种方式类似与Windows中的桌面快捷方式。
3 硬链接
与软链接对应,硬链接的命令如下:
ln 源文件名字 要生成的硬链接文件名字
通过硬链接我们不难发现生成的硬链接文件的inode编号与源文件的一摸一样,说明此时并没有产生新的文件,只是给源文件取了一个别名,我们观察到第3列的数据也能够知道,其中上图第3列的数据表示的是硬链接数。
我们想要去掉硬链接除了可以用rm删除外还可以用unlink(软链接也可以用这个命令删除)。
我们创建一个普通文件的默认硬链接数是1,那么我们创建一个目录的默认硬链接数是多少?
我们可以来试试:
为啥是2呢?
我们观察观察下面图:
这时由于我们默认创建的目录下有两个隐藏的目录 . 和 .. 其中.代表的是当前路径,.与dir共用一个inode,而..是dir路径的上一个路径(lesson14)的inode,所以这也就很好的解释了为啥创建目录的默认硬链接数是2。
问题来了,我们能够为目录创建硬链接吗?
答案是否定的,也就是操作系统并不会让用户自己为目录创建硬链接,为什么呢?
其实也很好解释,如果操作系统允许用户创建目录的硬链接的话,那么目录的树形结构就有可能被破坏,而成了图形结构,那么查找文件或者目录时就会出现问题。
之前再讲解linux基本命令时就已经提出了文件的3个时间:
Access 最后访问时间
Modify 文件内容最后修改时间
Change 属性最后修改时间
最后两个都比较好理解,关键是第一个Access,其实在讲解makefile时我已经讲了,当我们没有修改文件的内容时,文件的最后访问时间是不会变的,也就是上次make的时间早于文件内容修改的时间,所以就不让你再make了。