inode table  索引节点表

要理解inode,要从文件存储说起,文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个"扇区“ sector组成一个 block。


 文件数据都储存在"块"中,那么显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。



在linux系统里,每个分区里inode可以重复,但跨分区不行。每个分区的inode是相互独立的。一个节点可以对应多个文件。


  用 ls -i 选项即可查看文件节点号。

[root@localhost testdir]# ls -i

24 a1  22 a1link  19 a2  25 a3  21 a4  20 file1  23 file2  17 lhj  16 lll1

   //前面的数字为inode节点号


这里值得重复一遍,Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。


2.inode的大小

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。


  可以使用`df -i`查看各分区inode节点使用量和剩余量

[root@localhost testdir]# df -i

    文件系统                        节点号总量    已经使用  未使用  已使用百分比   挂载点

    Filesystem                        Inodes        IUsed       IFree         IUse%        Mounted on

    /dev/mapper/vg0-root   1310720      7069        1303651    1%              /

    tmpfs                               125517         1             125516      1%              /dev/shm

    /dev/sda1                        51200          38            51162        1%              /boot

    /dev/mapper/vg0-usr     655360        79377      575983      13%            /usr

    /dev/mapper/vg0-var    1310720        2744      1307976     1%              /var

    




3.硬链接

硬链接指的是一个节点上有多少个文件在使用,一个节点可以多个文件使用,但多个节点不能对应一个文件,因此我们删除文件的时候实则是删除了节点的一个名称而已,需一直删除到硬链接为0,并且原有的节点号被其他文件所调用,然后覆盖了原有的数据,才能彻底的说是删除了整个文件。

1)、用ls -l 即可查看文件的硬链接数。

[root@localhost testdir]# ls -l

 此列数字为硬链接

-rw-r--r--     1   root root   30 Jul 26 01:18 a1

lrwxrwxrwx 1 root root   11 Jul 26 01:17 a1link -> /testdir/a1

-rw-r--r--     1 root root    0 Jul 26 01:16 a2

-rw-r--r--     2 root root  115 Jul 26 02:48 a3

-rw-r--r--     1 root root   44 Jul 26 02:44 a4

-rw-r--r--   2 root root  115 Jul 26 02:48 aa3

-rw-r--r--     1 root root   21 Jul 26 05:56 file1

-rw-r--r--     1 root root   33 Jul 26 05:58 file2

-rw-r--r--     2 root root    0 Jul 25 21:14 lhj

drwxr-xr-x   2 root root 4096 Jul 26 00:29 lll1

硬链接不能跨分区创建,不能对目录进行创建。

链接数 = 一个节点上的文件数量

注意,目录里的'.' 和 ‘..’以及目录下的文件或目录里的 ‘ ..  ’也属于当前目录的硬链接数。



2)/用 ln  file1 file2即可创建文件硬链接,创建之后看似是两个独立的文件,其实是一个相同的文件。只是一个节点的两个名字而已

[root@localhost testdir]# ln a3 aa3

    [root@localhost testdir]# ll -i

    total 28

    24 -rw-r--r-- 1 root root   30 Jul 26 01:18 a1

    22 lrwxrwxrwx 1 root root   11 Jul 26 01:17 a1link -> /testdir/a1

    19 -rw-r--r-- 1 root root    0 Jul 26 01:16 a2

    25 -rw-r--r-- 2 root root  115 Jul 26 02:48 a3      //节点号为25

    21 -rw-r--r-- 1 root root   44 Jul 26 02:44 a4

    25 -rw-r--r-- 2 root root  115 Jul 26 02:48 aa3      /节点号为25     所以两个文件实则是一个文件

    20 -rw-r--r-- 1 root root   21 Jul 26 05:56 file1

    23 -rw-r--r-- 1 root root   33 Jul 26 05:58 file2

    17 -rw-r--r-- 2 root root    0 Jul 25 21:14 lhj

    16 drwxr-xr-x 2 root root 4096 Jul 26 00:29 lll1

    [root@localhost testdir]# 


4.符号链接、软链接

软连接相当于windows中的快捷方式,只是创建一个没有实质数据的文件然后链接到实际文件。删除机制与硬链接不同,软链接删除实际文件之后软链接就失效了。软链接可以跨分区创建。


1)、创建软链接用`ln -s `命令

格式:

ln -s      f2原始文件的绝对路径或相对路径(相对于软链接文件的路径)  f2link(链接名)

[root@localhost testdir]# ln -s /testdir/a4   /tmp/a4link   

                   //在/tmp/下创建一个名为a4link的软链接,然后使用绝对地址指定链接的实际文件   

[root@localhost testdir]# ls -l /tmp/a4link     

                    //用ls -l 查看链接文件,所指向的地址是/testdir/a4

lrwxrwxrwx 1 root root 11 Jul 26 11:21 /tmp/a4link -> /testdir/a4



5、软连接和硬链接的区别。

硬链接:

    1.硬链接指定是一个节点所指定的文件数量,因此,多个文件可以使用一个节点,但不能使用多个节点。

    2.硬链接在删除的时候必须删除硬链接为0、并且原有的节点号被其他文件占有并覆盖之后才能算彻底删除文件。

软链接:

    1.软链接可以拥有多个节点来指向一个文件,

    2.软链接在删除的时候不用关心硬链接数是否为0 ,只要软链接所指向的实际文件不存在,当前的软链接即失效。






        例题:一台服务器上,内存硬盘都比较大,但磁盘中各个独立的小文件比较多,然后在创建文件的时候提示磁盘空间不足了,此时并不是因为磁盘容量不够了,而是inode节点被使用完了,所以删除一些inode节点之后就又可以继续使用了。

      


实用小李子:

    1.查看每个inode节点的大小,可以用如下命令:

    #sudo dumpe2fs -h /dev/hda | grep "Inode size"

       2.我们在弄inode的时候想把inode节点用完做一下磁盘实验,但是磁盘分区节点太多了,手动创建岂不是要到手抽了还得创,与其这样还不如利用linux强大的功能,循环创建文件,知道inod节点被用完为止。

       #for id in {1..194569} do touch /boot/f$id;echo f$id is created;done

        注意:1..194560 看自己的分区节点使用量来定,用df -i  即可查看inode节点总量及使用量,我这里就定制那么多,可以更改的,

          echo后面的内容为把创建过程显示到屏幕上。

      done为for语句结束

    




6.file:查看文件文本类型

file filename  //直接显示文件文本类型

          -b:不显示文件名

   //可以参照看一下,使用-b选项之后标准输出的内容没有文件名,只有文件内文本的类型

  [root@localhost testdir]# file a4

            a4: ASCII text

            [root@localhost testdir]# file -b a4

            ASCII text 


-f:(批量处理)读取文件中的文件路径

      //创建一个文件,里面放一些文件的路径,然后使用-f选项来对文件内的文件路径逐一进行查看文本类型

         [root@localhost testdir]# echo  "/etc/passwd\n/testdir/a4 \n/etc/fstab" > a5     

//用echo覆盖输出文件路径到a5中


            [root@localhost testdir]# cat a5      //查看文件文件内容,正是我们指定的文件路径内容

            /etc/passwd

            /testdir/a4 

            /etc/fstab

        [root@localhost testdir]# file -f a5      //用-f 查看a5 文件内的文件进行一一查看文件文本类型

        /etc/passwd:  ASCII text

        /testdir/a4 : ASCII text

        /etc/fstab:  ASCII text


  -F :指定分隔符

[root@localhost testdir]# file a3    //查看原有的分割符

a3: ASCII text

[root@localhost testdir]# file -F ' filetype is' a3

                //用-F 并重新指定分割符之后输出的结果,-F指的是将原来的分隔符换成用户指定的分隔符。

a3 filetype is ASCII text