什么是inode?

    理解inode,要从文件储存提及。文件储存在硬盘上,硬盘的最小存储单位叫扇区(Sector)。每一个扇区储存512字节(至关于0.5KB)。操做系统读取硬盘的时候,不会一个个扇区地读取,这样效率过低,而是一次性连续读取多个扇区,即一次性读取一个块(block)。这种由多个扇区组成的块是文件存取的最小单位,块的大小,最多见的是4KB,即连续八个sector组成一个block,文件数据都储存在块中,那么很明显,咱们还必须找到一个地方储存文件的元信息,好比文件的建立者、文件的创年日期、文件的大小等等。这种储存元信息的区域叫作inode,中文译名为”索引节点”。inode (index node) 表中包含文件系统的全部文件列表。

 

 

inode包含文件的信息(元数据)

        Inode编号

        用来识别文件类型,以及用于stat C函数的模式信息

        文件权限

        文件的拥有者的UID

        文件所属组的GID

        连接数(指向这个文件名路径名称个数)

        文件的大小

        文件的间戳(ctime指inode上一次变更的时间,mtime是指文件内容上一次变更的时间,atime指文件上一次打开的时间)

        指向磁盘文件的数据块指针

        有关文件的其它数据

        注意:要想查看文件的inode信息可使用stat命令查看

inode表结构

    inode表结构.png

        直接块指针:

            前12个直接指针,直接指向存储数据的区域。如Blocks大小为4*1024KB,前12个直接指针就能够保存48KB的文件

        间接块指针:

            设每一个指针占用4个字节,则以及指针指向的Blocks能够保存(4*1024)/4KB,可指向1024个Blocks,一级指针可存储文件数据大小为1024*(4*1024)KB=4MB

        双重间接块指针:

            一样Blocks大小为4*1024,则二级指针可保存Blocks指针数量为((4*1024)/4)*((4*1024)/4),则二级指针保存文件数据大小为(1024*1024)*(4*1024)=4GB

        三重间接块指针:

            以次类推三级指针能够储存文件数据大小为(1024*4*1024*1024)*(4*1024)=4TB

inode的大小:

        每一个inode都有一个编号,操做系统用inode号来识别不一样文件。Unix/Linux系统不使用文件名,而使用inode号来识别文件,对于系统来讲,文件名只是inode号码便于识别的别称或绰号。表面上,经过文件名打开文件;实际上,系统内部这个过程分红三步:首先,系统找到这个文件名对应的inode号;其次,经过inode号,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

        注意:inode号并非无限的,若是一个分区的节点数被使用完了,那么即便磁盘空间还有剩余也不能再存听任何数据。可使用df -i命令查看节点使用状况

    df-i.png     

        注:1节点总数、2使用过节点数、3剩余节点数、4节点使用率

目录文件:

    Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件目录文件的结果很是简单,就是一系列目录项(direct)的列表。每一个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号。

    ls命令只列出目录文件中的全部文件名:

        ls-1.png

    ls -i命令列出整个目录文件,即文件名和inode号(箭头标的即为inode号):

        ls-i.png

    若是要查看文件的详细信息,就必须根据inode号,访问inode节点,读取信息。ls -i -l 目录文件 列出整个目录文件,即文件名和inode号(箭头标注的列即为inode号)

        ls-i-l.png

    理解了上面的知识,就能理解目录的权限,文件的读权限(r)和写权限(w),都是针对目录文件自己。因为目录文件内只有文件名和inode号,因此只有读权,只能获取文件名,没法获取其余信息,由于其余信息都储存在inode节点中,而读取inode节点内的信息须要目录文件的执行权限(x)。

Linux中cp、rm、mv 、ln对inode的影响:

    cp命令

  •         分配一个未被使用的inode号,在inode表中添加一个新项目,(注意:若是是cp到讴歌已经存在的文件,则inode号采用被覆盖以前的目标文件的inode号,若是对运行中的apache共享模块so文件进行cp操做,就会出现Segmentation fault<段错误>)

  •         在目录中新建一个目录项,并指向步骤1中的inode

  •         把数据复制到block中

    rm命令

  •         减小连接数量,若是连接数为0,释放inode(inode号也已被从新使用);

  •         若是inode被释放,则数据块放到可用空间列表中;

  •         删除目录中的目录项

    mv命令

        1.若是mv命令的目标文件和源文件所在额文件系统相同:

        使用新文件名创建目录项;

        删除带有原来文件名的目录项;

        注意:该操做对inode表没有影响(除时间戳),对数据的位置也没有影响,不移动任何数据。(即便是mv到一个已经存在的目标文件,新目录项指源文件inode,会先删除目标文件的目录项,因此若是对运行中的apache的共享模块so文件进行这种操做的话不会有问题,新的so文件inode号变了)

        2.若是目标和源文件所在的问价系统不相同,就是cp和rm;

    ln命令

        符号(软)连接:

        符号连接的内容是它引用文件的名称,能够是任意文件或目录,也能够连接不一样问价系统的文件,甚至能够连接不存在的文件,这就产生通常称为断裂的问题,还能够不断的循环连接源文,可是其大小为指向的路径字符串的长度;不增长或减小目标文件inode 的引用计数。

        使用ln -s source_file softlink_file (注意:源文件(source_file)的路径是相对路径(也能够是绝对路径,一般使用的是相对路径),必定是相对于软连接文件的路径,而非相对于当前工做目录的路径)建立符号连接,在对符号连接进行读写操做的时候,系统会自动把该操做转换为对源文件的操做,可是删除链接文件时,系统仅仅删除符号连接文件,而不是删除源文件自己。

    硬连接:

        不容许给目录建立硬连接,建立硬连接会正价额外的记录项以引用文(不能跨驱动或分区建立硬连接),硬连接件对应于同一文件系统上的一个物理文件,硬连接节点编号是相同的,建立硬连接连接数递增,删除文件时:rm命令递减计数的连接,文件若是存在,至少有一个连接数,当连接数为0时,该文件被删除。

        使用ln existfile newfile 命令建立硬连接

        硬连接于软链接的区别:

        一、本质不一样:硬连接是指向同一个文件,软连接指向的不是同一个文件

        二、删除时:硬连接不受影响,软连接失效

        三、建立连接时:建立硬连接连接数加1,建立软连接链接数不变

        四、是否能够跨分区:硬连接不能够跨分区,软连接能够跨分区

        五、目录是否能够建立连接:硬连接不能够对目录建立,软连接能够对目录建立

        六、硬连接的inode号相同,软连接inode号不一样