我们使用
ls -l
的时候看到的除了看到文件名,还看到了文件元数据
[root@localhost linux]# ls -l总用量 12-rwxr-xr-x. 1 root root 7438 "9 月 13 14:56" a.out-rw-r--r--. 1 root root 654 "9 月 13 14:56" test.c
每行包含7列:
权限 硬连接数 文件所有者 组 大小 最后修改时间 文件名
ls -l
读取存储在磁盘上的文件信息,然后显示出来

其实这个信息除了通过这种方式来读取,还有一个
stat
命令能够看到更多信息
[root@localhost linux]# stat test.cFile: "test.c"Size: 654 Blocks: 8 IO Block: 4096 普通文件Device: 802h/2050d Inode: 263715 Links: 1Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2017-09-13 14:56:57.059012947 +0800Modify: 2017-09-13 14:56:40.067012944 +0800Change: 2017-09-13 14:56:40.069012948 +0800
上面的执行结果有几个信息需要解释清楚
inode
为了能解释清楚
inode
我们先简单了解一下文件系统

Linux ext2
文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的
block
。一个
block
的大小是由格式化的时候确定的,并且不可以更改。例如
mke2fs
的
-b
选项可以设
定
block
大小为
1024
、
2048
或
4096
字节。而上图中启动块(
Boot Block
)的大小是确定的
● 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 是否空闲可用。● i node节点表 : 存放文件属性 如 文件大小,所有者,最近修改时间等。● 数据区:存放文件内容。
将属性和数据分开存放的想法看起来很简单,但实际上是如何工作的呢?我们通过
touch
一个新文件来看看如何工
作。
[root@localhost linux]# touch abc[root@localhost linux]# ls -i abc263466 abc
为了说明问题,我们将上图简化:

创建一个新文件主要有一下
4
个操作:
1. 存储属性内核先找到一个空闲的i 节点(这里是 263466 )。内核把文件信息记录到其中。2. 存储数据该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500 , 800 。将内核缓冲区的第一块数据 复制到 300 ,下一块复制到 500 ,以此类推。3. 记录分配情况文件内容按顺序300,500,800 存放。内核在 inode 上的磁盘分布区记录了上述块列表。4. 添加文件名到目录新的文件名 abc 。 linux 如何在当前的目录中记录这个文件?内核将入口( 263466 , abc )添加到目录文件(目录文件中所存的就是内容就是文件名和inode的映射关系)。文件名和 inode 之间的对应关系将文件名和文件的内容及属性连接起来。