硬盘的最小存储单位:“扇区”(Sector),每个扇区储存512字节(相当于0.5KB)。
块:连续八个 sector组成一个 block,最常见的是4KB;
操作系统读取硬盘的时候,一次性读取一个"块"(block)。
inode:记录文件元信息,“索引节点”。比如文件的创建者、文件的创建日期、文件的大小等等。
inode包含文件的元信息
stat example.txt
* 字节数
* User ID
* Group ID
* 读、写、执行权限
* 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
* 链接数,即有多少文件名指向这个inode
* 文件数据block的位置
硬盘格式化的时候,自动将硬盘分成两个区域。
一个是数据区,存放文件数据;
一个是inode区,存放inode所包含的信息。
inode 与数据块的关系:
inode 和数据块是文件系统中两个独立的资源。
即使所有数据块都被占用,inode 仍然可以分配,但它们无法用来存储实际的数据。虽然可以创建新的文件或目录,但它们将无法存储任何内容。
inode 的大小通常是 128 字节或 256 字节
inode如何记录大文件
假设每个数据块大小为 4KB,直接指针有 12 个,间接指针块可以存储 1024 个指针:
- 直接指针可以引用 12 * 4KB = 48KB 的数据。
- 一级间接指针可以引用 1024 * 4KB = 4MB 的数据。
- 二级间接指针可以引用 1024 * 1024 * 4KB = 4GB 的数据。
- 三级间接指针可以引用 1024 * 1024 * 1024 * 4KB = 4TB 的数据。
每个数据块并不对应一个inode
对于小文件,是直接指针。对于大文件,是间接指针。
创建磁盘或格式化文件系统时,如何确定 inode 数量
这个默认值通常是每 16KB 或 32KB 的文件系统空间分配一个 inode。例如,如果格式化一个 1GB 的分区,默认的 inode 数量可能是:
1GB / 16KB = 65536 inodes (大约)
文件读取过程
- 确定文件大小:首先,文件系统通过查询文件的 inode 来确定文件的实际大小。
- 定位数据块:文件系统使用 inode 中指向数据块的指针来确定文件数据存储在哪些块中。
- 读取数据:
- 完整块读取:如果文件的大小正好是块大小的整数倍,那么文件系统会按块读取,直到读取完所有块。
- 部分块读取:如果文件的大小不是块大小的整数倍,那么文件系统会读取包含文件末尾部分的最后一个块,但只会读取该块中属于文件的那部分数据。
如何读取剩余部分
- 计算偏移量:文件系统会计算文件末尾在最后一个块中的偏移量。这是通过文件大小对块大小的取模运算来完成的。
- 读取剩余数据:文件系统只读取从块的起始位置到文件末尾的数据,忽略块中剩余的部分。
相关指令
stat example.txt #元信息
df -i #查看每个硬盘分区的inode总数和已经使用的数量,
sudo dumpe2fs -h /dev/hda | grep "Inode size" #查看每个inode节点的大小
ls -i example.txt #文件名对应的inode号码
ls -i /etc #目录也是一个文件,即文件名和inode号码
ln 源文件 目标文件 #硬连接,多个名对应一个inode
目录中
".",是当前目录的inode号码,等同于当前目录的"硬链接";
"..",是当前目录的父目录的inode号码,等同于父目录的"硬链接"。
软连接
文件A和文件B的inode号码不一样,但是文件A的内容是文件B的路径。
文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错
B的inode"链接数"不会因此发生变化
ln -s 源文文件或目录 目标文件或目录