在linux下,一个目录下放了很多文件,还有其他的子目录,但是目录的大小却总是只有4096字节。这是怎么回事呢?来听听北理工林思佳同学的分享。
先来看看这个目录: /usr
上图中的 include/ 目录下有上千个文件,但 include 的大小却只有 4096个字节,很明显这个大小并非目录下文件大小之和。
所以,linux的目录并没有存放文件本身。这是linux跟windows不同之处。
Linux的目录只是代表一个路径,存放的只是目录项。目录项由文件名和i-node number组成。4096即4KB,操作系统读取硬盘的时候,是按“块”读取,是文件存取的最小单位。“块”的大小,最常见的是4KB,即一个block。而文件名显然只是一个字符串,而i-node 一般大小是128字节或256字节,所以4KB足矣。
但是目录里面只有这两种东西那是怎么读取到文件的呢?
关键就在i-node number 节点编号,它inode索引结点的成员之一。可以使用 stat 命令来查看文件/目录的元信息:
inode包含文件的元信息,具体来说有以下内容:
* 文件的字节数 * 文件拥有者的User ID * 文件的Group ID * 文件的读、写、执行权限 * 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。 * 链接数,即有多少文件名指向这个inode * 文件数据block的位置
当我们访问一个文件的时候,直观的就是找它的文件名,而文件名与i-node number联系,从而找到索引节点 inode,其中block的位置是由存储在inode的一些指针来索引的。由此可以推出,inode和文件数据并不是在同一片地方的,这和linux的文件系统有关系。linux是先有路径,再有分区的,这个路径就像是一棵倒挂的树,由 / 根目录开始。
所以典型的linux分区如下:
也就可以推出在同一个分区内使用mv命令移动文件的时候,不管文件有多大,基本都是瞬间完成,因为只是目录项的改变而已,对于文件数据的位置并没有变化。