文件 = 文件内容 + 文件属性。
它保存在磁盘上。
磁盘的使用单位为扇区,一个扇区的大小为512字节。通过其所在盘面,所在扇区,所在磁道,就可以定位文件。
这是Linux ext2文件系统的典型磁盘文件系统图。分区划分的block大小在格式化的时候确定,并且不可修改。
文件的属性存放在inodeTable中。
文件的内容存放在Data Blocks中
Boot Block
:启动块
Super Block
:超级块, 存放文件系统本身的结构信息。记录的主要信息有block、inode的总量,未使用的block和inode的数量,一个block和inode的大小……等。如果超级块的信息被破坏,则意味着整个文件系统结构就被破坏了。
Group Descriptor Table
:块组描述符,描述块组属性信息。
Block Bitmap
:块位图,用位图的方式记录着Data Blocks中block的使用情况(哪些处于空闲,哪些已被占用)
inode Bitmap
:inode位图,用位图的方式记录着inode Table中哪些inode使用情况。
inode Table
:i节点表,存放文件的属性。
Data Blocks
:数据块,存放文件内容。
inode Table中一个条目就是一个inode,inode应该是结构体,结构体里面保存着文件的属性、inode编号等。
Linux中文件名在系统层面是没有意义的,它是方便给用户使用的,真正标识文件的是inode编号,一个文件对应一个inode。通过inode,不仅可以得到文件属性,还可以通过它的映射关系找到存放其文件内容的数据块。
目录也是文件,它对应的数据块中存放着映射关系,文件名:inode编号
。
现在从系统层面上看一下,创建文件、查看文件、删除文件,文件系统的操作。
1、内核在inode Bitmap中,查询哪一个inode是空闲的。然后去inode Table中找到这个inode,并将文件属性等信息记录进去。
2、内核在Block Bitmap中,查询哪些Data Block是空闲的,选用合适的空闲Block, 将信息存储进Data Block中。
3、在inode的磁盘分布区记录上述的Block。
4、建立文件名和inode之间的映射。将文件名和文件的内容及属性连接起来。
1、查看文件所在目录的inode,进而查看其数据块,它的数据块里存放着目录下文件的文件名和inode的映射关系。
2、通过目录中数据块存放的映射关系,找到文件对应的inode。
3、通过inode,找到对应的Data Block.
其实只需要它的数据块和inode是空闲的,则可以认为它被删除了。
使Block Bitmap和Inode Bitmap中的相关记录修改为空闲态。
在Linux中,查看文件inode编号的选项-i
[YDY@VM-0-2-centos day18]$ ls -i
658415 node.c
[YDY@VM-0-2-centos day18]$ ls -ali
total 8
658403 drwxrwxr-x 2 YDY YDY 4096 Jul 23 22:53 .
655386 drwx------ 29 YDY YDY 4096 Jul 23 22:53 ..
658415 -rw-rw-r-- 1 YDY YDY 0 Jul 23 22:53 node.c
[YDY@VM-0-2-centos day18]$ ^C
在Linux上,多个文件名可以对应同一个inode。
就像李逵指的是他,黑旋风指的也是他,铁牛也指的是他。
这就是硬链接,而有多少个文件名对应这个inode,则文件名数量就称这个inode的硬链接数。
Linux上创建硬链接的命令:ln 已存在文件名 增加的文件名
创建硬链接的本质,实际上是在特定的目录下,增加一对文件名和Inode的映射关系。
而软链接,这种方式好比创建了一个快捷键。
创建软链接的命令:ln -s 已存在文件路径和文件名 增加文件名
[YDY@VM-0-2-centos day18]$ ls -ali
total 12
658403 drwxrwxr-x 2 YDY YDY 4096 Jul 23 23:30 .
655386 drwx------ 30 YDY YDY 4096 Jul 23 23:19 ..
[YDY@VM-0-2-centos day18]$ ln -s ~/test_inode/test_inode.c myinode
[YDY@VM-0-2-centos day18]$ ls -ali
total 12
658403 drwxrwxr-x 2 YDY YDY 4096 Jul 23 23:34 .
655386 drwx------ 30 YDY YDY 4096 Jul 23 23:19 ..
658418 lrwxrwxrwx 1 YDY YDY 33 Jul 23 23:34 myinode -> /home/YDY/test_inode/test_inode.c
查看myinode,发现这个内容实际上是/home/YDY/test_inode/test_inode.c中的文件内容。
test_inode.c文件的inode编号为658417,而创建的软链接myinode的inode编号为658417。这也是软链接和硬链接的本质区别。
软链接出的文件是另一个独立文件,有自己的inode和Data Block
硬链接出的文件是同一个文件,增加的只是文件名和inode的映射关系,指向的是同一个inode。