linux下的inode是一种数据结构,他主要存储了以下元数据信息。
inode在文件系统(fs)中以数组array的形式存在,占用特定大小的磁盘空间。每个inode大小也是固定的(毕竟是数组),常见大小是128/256byte。
最后一个属性block位置,其实是个复杂的存储结构,前12个块是直接存储,剩下的都是间接存储(毕竟固定大小,块太多了,没法固定inode的大小)。
除了inode数组之外,还需要存一个映射表,文件名和inode标号(数组下标)的映射。
根据文件名从映射表找到inode标号,再从数组中找到inode,再根据权限信息看是否能读取,如果能,则根据block位置信息最终读取到文件的内容。
sector是扇区,是硬件上的最小存储单元,在磁盘生产的时候就决定了扇区的大小,早期常见的是512byte,比较新的硬盘都是4K大小了。
block是块,上面也提到过,文件在fs中是存放到块中的,块是fs对磁盘的一种抽象,块有标号,由1个或多个(2/4/8/16...)扇区组成。
块太大,会导致一个小文件也要占一整块这样的空间浪费,块太小又会使得inode数据结构变大,进而导致inode占用空间过大。所以是个权衡的值。
inode是个数组,用df -i
查看inode数量,用ls -i
查看文件的inode下标。
如果巨量的小文件是会导致数组用完的,这就是早期docker的overlay文件系统的问题,后来换了overlay2解决了这个问题。