本文共 2715 字,大约阅读时间需要 9 分钟。
inode(index node):译为“索引节点”,是理解Linux文件系统和硬盘存储的基础。
理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做“扇区”。每个扇区能储存512字节(相当于0.5KB)操作系统在读取硬盘的时候,并非逐个读取扇区,这种方式效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)。这种由多个扇区组成的“块”,是文件存取的最小单位。“块”的大小,最常见的是4kb,即连续八个sector组成一个block。文件数据都存放在block中,那么与block存放相关联的,必须有一个地方储存文件的元信息,如文件的创建者、文件的创建日期、文件的大小等。这种储存文件元信息的区域就叫inode。inode中保存了blocks指针,但是一条inode记录中能保存的指针数量是有限的,否则就会超出inode大小(128字节或256字节)。
在ext2和ext3文件系统中,一个inode中最多只能有15个指针,每个指针使用i_block[n]表示。前12个指针i_block[0]到i_block[11]是直接寻址指针,每个指针指向一个数据区的block。如下图所示。第14个指针i_block[13]是二级间接寻址指针,它指向一个仍然存储了指针的block,但是这个block中的指针还继续指向其他存储指针的block,即i_block[13] --> Pointerblock1 --> PointerBlock2 --> datablock。第15个指针i_block[14]是三级间接寻址指针,它指向一个任然存储了指针的block,这个指针block下还有两次指针指向。即i_block[13] --> Pointerblock1 --> PointerBlock2 --> PointerBlock3 --> datablock。其中由于每个指针大小为4字节,所以每个指针block能存放的指针数量为BlockSize/4byte。例如blocksize为4KB,那么一个Block可以存放4096/4=1024个指针。为什么要分间接和直接指针呢?如果一个inode中15个指针全是直接指针,假如每个block的大小为1KB,那么15个指针只能指向15个block即15KB的大小,由于每个文件对应一个inode号,所以就限制了每个文件最大为151=15KB,这显然是不合理的。如果存储大于15KB的文件而又不太大的时候,就占用一级间接指针i_block[12],这时可以存放指针数量为1024/4+12=268,所以能存放268KB的文件。如果存储大于268K 的文件而又不太大的时候,就继续占用二级指针i_block[13],这时可以存放指针数量为[1024/4]^2+1024/4+12=65804,所以能存放65804KB=64M左右的文件。如果存放的文件大于64M,那么就继续使用三级间接指针i_block[14],存放的指针数量为[1024/4]^3+[1024/4]^2+[1024/4]+12=16843020个指针,所以能存放16843020KB=16GB左右的文件。如果blocksize=4KB呢?那么最大能存放的文件大小为([4096/4]^3+[4096/4]^2+[4096/4]+12)4/1024/1024/1024=4T左右。当然这样计算出来的不一定就是最大能存放的文件大小,它还受到另一个条件的限制。这里的计算只是表明一个大文件是如何寻址和分配的。其实看到这里的计算数值,就知道ext2和ext3对超大文件的存取效率是低下的,它要核对太多的指针,特别是4KB大小的blocksize时。而ext4针对这一点就进行了优化,ext4使用extent的管理方式取代ext2和ext3的块映射,大大提高了效率也降低了碎片。
每一个inode(索引节点)是一个表项,包含有关文件的元数据信息,包括:
* 文件类型:
“-” :普通文件
“d”:目录“c”:字符设备文件“b”:块设备文件“p”:管道文件“s”:套接字文件“l” :链接文件* 权限:
读(r)
写(w)执行(x)* 文件所属:
UID
GID* 硬链接数(指向这个文件名路径名称个数)* 文件大小、inode数* 时间戳
ctime:文件的inode上一次变动的时间
mtime:文件内容上一次变动的时间atime:文件上一次打开的时间* 文件数据block的位置:指向磁盘上文件的数据块指针* 有关文件的其他数据
1. cp:分配一个空闲的inode号,在inode表中生成新条目;在目录中创建一个目录项,将名称与inode编号关联;拷贝数据生成新的文件2. mv:
如果mv命令的目标和源在相同的文件系统,作为mv 命令
用新的文件名创建对应新的目录项>删除旧目录条目对应的旧的文件名>不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
如果目标和源在一个不同的文件系统, mv相当于cp和rm
3. rm:链接数递减,释放的inode号,该inode号可以被重用;把数据块放在空闲列表中;删除目录项;数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖4. 链接* 硬链接:* * 创建硬链接会增加额外的记录项以引用文件 * 对应于同一文件系统上一个物理文件 * 每个目录引用相同的inode号 * 创建时链接数递增 * 删除文件时:rm命令递减计数的链接 * 文件存在,至少有一个链接数 * 当链接数为零时,该文件被删除 * 不能跨越驱动器或分区 * 不能作用于目录 * 语法: ln filename [linkname]* 软链接(符号链接):* * 一个符号链接指向另一个文件 * ls - l 显示链接的名称和引用的文件 * 一个符号链接的内容是它引用文件的名称 * 可作用于目录 * 可以跨分区 * 指向的是另一个文件的路径 * 符号链接大小为指向的路径字符串的长度 * 不增加或减少目标文件inode的引用计数 * 语法:ln -s filename [linkname]
转载于:https://blog.51cto.com/1456850/2362753