Linux inode 学习.docx

上传人:b****6 文档编号:8560031 上传时间:2023-01-31 格式:DOCX 页数:14 大小:218.09KB
下载 相关 举报
Linux inode 学习.docx_第1页
第1页 / 共14页
Linux inode 学习.docx_第2页
第2页 / 共14页
Linux inode 学习.docx_第3页
第3页 / 共14页
Linux inode 学习.docx_第4页
第4页 / 共14页
Linux inode 学习.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

Linux inode 学习.docx

《Linux inode 学习.docx》由会员分享,可在线阅读,更多相关《Linux inode 学习.docx(14页珍藏版)》请在冰豆网上搜索。

Linux inode 学习.docx

Linuxinode学习

Linuxinode学习

收藏人:

gzxx2007sddx

2014-03-17 | 阅:

1  转:

17

  |  分享 

    微信朋友圈

    腾讯空间

    新浪微博

    腾讯微博

    人人网

    开心网

    搜狐微博

    推荐给朋友

    举报

  |    来源

  

在Linux文件系统中,很多人对Inode都不太明白,今天我就和大家一起来分享一下我对Inode的认识,如果有理解错误的地方,请大家多多批评指点。

 

先看看Inode的结构图

 

 

 

 

 

 

再来了解一下文件系统如何存取文件的

1、根据文件名,通过Directory里的对应关系,找到文件对应的Inodenumber

2、再根据Inodenumber读取到文件的Inodetable

3、再根据Inodetable中的Pointer读取到相应的Blocks

这里有一个重要的内容,就是Directory,他不是我们通常说的目录,而是一个列表,记录了一个文件/目录名称对应的Inodenumber。

如下图

 

 

 

 

 

Directory:

Adirectoryisamappingbetweenthehumannameforthefileandthecomputer'sinodenumber.

所以说,这个Directory不是文件,我们可以看作是文件系统中的一个属性,只是用来关键文件名与Inodenumber。

这个一定要理解好,否则后面关于硬链接的内容,就不容易理解了。

我在一天一点学习Linux之文件与目录权限的基本概念中讲到

第二栏表示的是有多少文件连接到inode

如果是一个文件,此时这一字段表示这个文件所具有的硬链接数,

如果是一个目录,则此字段表示该目录所含子目录的个数。

现在是不是容易理解了?

如果你还不是很明白,那么下面我们就再通过实例让大家明白。

我们以RHEL6系统为例

在根目录下创建一个test目录,我们进入此目录,进行操作。

[root@yufeitest]#pwd

/test

[root@yufeitest]#touchtestfile

[root@yufeitest]#mkdirtestdir

创建实验文件和目录

[root@yufeitest]#ls-li

total4

977drwxr-xr-x.2rootroot4096Apr 516:

48testdir

976-rw-r--r--.1rootroot   0Apr 516:

47testfile

查看到文件与目录的Inode和inodecount分别为

977<----->2<----->testdir

976<----->1<----->testfile

现在目录的链接数为2,文件的链接数为1。

为什么会这样呢?

其实很好理解。

对于目录而言,每个目录里面肯定会有两个特殊目录,那就是.和..这两个目录,我们前面的课程中也讲到,.表示当前的目录,而..则是表示上层目录。

我们也知道,在Linux系统中,是从根来开始查找的,要想找到某个目录,必需要先找到他的上层目录,所以说,空目录(严格的来说,不能叫空目录)是有两个链接到相应的Inodenumber的。

作为文件很明显,他只有一个链接到相应的Inodenumber。

也不用多说,

下面我们就来看看这个链接数是如何改变的。

继续上面的操作

[root@yufeitest]#lntestfiletestfile.hard

[root@yufeitest]#ln-stestfiletestfile.soft

对testfile建立一个硬链接和一个软链接

[root@yufeitest]#ls-il

total4

977drwxr-xr-x.2rootroot4096Apr 516:

48testdir

976-rw-r--r--.2rootroot   0Apr 516:

47testfile

976-rw-r--r--.2rootroot   0Apr 516:

47testfile.hard

978lrwxrwxrwx.1rootroot   8Apr 517:

03testfile.soft->testfile

再查看文件和目录的属性,我们就发现:

创建一个硬链接后,testfile的inodecount增加了一个。

而且testfile和testfile.hard这两个的Inodenumber是一样的。

这个硬链接就是重新创建了一个文件名对应到原文件的Inode。

实质就是在Directory中增加了一个新的对应关系。

通过这个例子,你是不是更清楚了,这个Inodecount的含义了。

他就是指,一个Inode对应了多少个文件名。

下面我们再来看看硬链接的其他特点

[root@yufei~]#watch-n1"df-i;df"

Every1.0s:

df-i;df                           TueApr 521:

52:

532011

Filesystem           Inodes  IUsed  IFreeIUse%Mountedon

/dev/sda1            960992 105415 855577  11%/

tmpfs                 63946      1  63945   1%/dev/shm

Filesystem          1K-blocks     UsedAvailableUse%Mountedon

/dev/sda1            15118728  2747612 11603116 20%/

tmpfs                  255784        0   255784  0%/dev/shm

用上面的命令可以实时查看系统中所剩的block和inode的变化数量。

建议大家不要用deumpe2fs和tune2fs这两个命令,如果使用他们来查看的话,将会很郁闷——你会发现,你无论怎么创建文件或对文件写入内容,Inode和block的值都不会变,除非你每操作一次,重新启动一次系统,而用了上面的命令,就是第秒钟监视他们的变化情况。

关于df的命令使用,大家可以自行查看帮助进行学习。

当然还有du这个命令,他们都和文件系统有关。

我们再来创建一个硬链接

[root@yufeitest]#ls-li

total4

977drwxr-xr-x.2rootroot4096Apr 516:

48testdir

976-rw-r--r--.2rootroot   0Apr 516:

47testfile

976-rw-r--r--.2rootroot   0Apr 516:

47testfile.hard

978lrwxrwxrwx.1rootroot   8Apr 517:

03testfile.soft->testfile

[root@yufeitest]#lntestfiletestfile.hard1

[root@yufeitest]#ls-li

total4

977drwxr-xr-x.2rootroot4096Apr 516:

48testdir

976-rw-r--r--.3rootroot   0Apr 516:

47testfile

976-rw-r--r--.3rootroot   0Apr 516:

47testfile.hard

976-rw-r--r--.3rootroot   0Apr 516:

47testfile.hard1

978lrwxrwxrwx.1rootroot   8Apr 517:

03testfile.soft->testfile

可以再观察一下Inodecount和Inodenumber的对应关系。

下面再看看inodes和blocks的变化

[root@yufei~]#watch-n1"df-i;df"

Every1.0s:

df-i;df                           TueApr 521:

53:

382011

Filesystem           Inodes  IUsed  IFreeIUse%Mountedon

/dev/sda1            960992 105415 855577  11%/

tmpfs                 63946      1  63945   1%/dev/shm

Filesystem          1K-blocks     UsedAvailableUse%Mountedon

/dev/sda1            15118728  2747612 11603116 20%/

tmpfs                  255784        0   255784  0%/dev/shm

我们发现,inodes和blocks是没有减少的,所以说,硬链接是不会占用磁盘的空间的。

如果说删除硬链接的话,就会改变Inodecount的数量。

硬链接还有其他的两个特性:

不能跨Filesystem也不能link目录。

下面再来看看这个软链接

[root@yufeitest]#ls-iltestfile.softtestfile

976-rw-r--r--.3rootroot0Apr 521:

50testfile

978lrwxrwxrwx.1rootroot8Apr 521:

52testfile.soft->testfile

他的Inodenumber和原文件不一样。

而且大小也发生了变化。

可见,这个软链接是重新建立了一个文件,而文件是指向到原文件,而不是指向原Inode。

当然他会占用掉inode与block。

当我们删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,但我们却不能查看软链接文件的内容了。

但软链接是可以跨文件系统,而且是可以链接目录。

他就相当于windows系统下的快捷方式一样。

通过这个特性,我们可以通过软链接解决某个分区inodeconut不足的问题(软链接到另一个inodecount足够多的分区)。

接下来,我们再来分析一下复制文件、移动文件和删除文件对inode的影响

[root@yufei~]#watch-n1"df-i;df"

Every1.0s:

df-i;df                           TueApr 521:

57:

382011

Filesystem           Inodes  IUsed  IFreeIUse%Mountedon

/dev/sda1            960992 105415 855577  11%/

tmpfs                 63946      1  63945   1%/dev/shm

Filesystem          1K-blocks     UsedAvailableUse%Mountedon

/dev/sda1            15118728  2747612 11603116 20%/

tmpfs                  255784        0   255784  0%/dev/shm

[root@yufeitest]#ls-li

total4

977drwxr-xr-x.2rootroot4096Apr 516:

48testdir

976-rw-r--r--.3rootroot   0Apr 518:

54testfile

976-rw-r--r--.3rootroot   0Apr 518:

54testfile.hard

976-rw-r--r--.3rootroot   0Apr 518:

54testfile.hard1

978lrwxrwxrwx.1rootroot   8Apr 517:

03testfile.soft->testfile

我们先记录以上的信息

先看复制文件的情况

[root@yufeitest]#cptestfiletestfile.cp

[root@yufeitest]#ls-li

976-rw-r--r--.3rootroot   0Apr 521:

50testfile

979-rw-r--r--.1rootroot   0Apr 521:

58testfile.cp

我们只对比这两个文件,发现Inodenumber不一样,我们再来看看inodes和blocks的剩余情况

Every1.0s:

df-i;df                           TueApr 522:

02:

492011

Filesystem           Inodes  IUsed  IFreeIUse%Mountedon

/dev/sda1            960992 105416 855576  11%/

tmpfs                 63946      1  63945   1%/dev/shm

Filesystem          1K-blocks     UsedAvailableUse%Mountedon

/dev/sda1            15118728  2747620 11603108 20%/

tmpfs                  255784        0   255784  0%/dev/shm

发现inodes减少了一个,而blocks也少了,这就说明,复制文件是创建文件,并占Inode和Block的。

文件创建过程是:

先查找一个空的Inode,写入新的Inodetable,创建Directory,对应文件名,向block中写入文件内容

关于移动文件和删除文件的实验,大家可以自己动手来实践吧。

我直接给出相应的说明。

移动文件,他分两种情况:

在同一个文件系统中移动文件时

创建一个新的文件名和Inode的对应关系(也就是在Directory中写入信息),然后在Directory中删除旧的信息,更新CTIME,其他的信息如Inode等等均无任何影响

在不同文件系统移动文件时

先查找一个空的Inode,写入新的Inodetable,创建Directory中的对应关系,向block中写入文件内容,同时还会更改CTIME。

删除文件

他实质上就是减少linkcount,当linkcount为0时,就表示这个Inode可以使用,并把Block标记为可以写,但并没有清除Block里面数据,除非是有新的数据需要用到这个block。

最后我们来做个总结:

1、一个Inode对应一个文件,而一个文件根据其大小,会占用多块blocks。

2、更为准确的来说,一个文件只对应一个Inode。

因为硬链接其实不是创建新文件,只是在Directory中写入了新的对应关系而已。

3、当我们删除文件的时候,只是把Inode标记为可用,文件在block中的内容是没有被清除的,只有在有新的文件需要占用block的时候,才会被覆盖。

 

 

附录:

kernel部分inode数据结构列表

               、*

*索引节点对象由inode结构体表示,定义文件在linux/fs.h中

*/

structinode{

      structhlist_node    i_hash;          /*哈希表*/

      structlist_head      i_list;          /*索引节点链表*/

      structlist_head      i_dentry;        /*目录项链表*/

      unsignedlong        i_ino;          /*节点号*/

      atomic_t          i_count;        /*引用记数*/

      umode_t            i_mode;          /*访问权限控制*/

      unsignedint        i_nlink;        /*硬链接数*/

      uid_t            i_uid;          /*使用者id*/

      gid_t            i_gid;          /*使用者id组*/

      kdev_t            i_rdev;          /*实设备标识符*/

      loff_t            i_size;          /*以字节为单位的文件大小*/

      structtimespec      i_atime;        /*最后访问时间*/

      structtimespec      i_mtime;        /*最后修改(modify)时间*/

      structtimespec      i_ctime;        /*最后改变(change)时间*/

      unsignedint        i_blkbits;        /*以位为单位的块大小*/

      unsignedlong        i_blksize;        /*以字节为单位的块大小*/

      unsignedlong        i_version;        /*版本号*/

      unsignedlong        i_blocks;        /*文件的块数*/

      unsignedshort      i_bytes;        /*使用的字节数*/

      spinlock_t          i_lock;          /*自旋锁*/

      structrw_semaphore    i_alloc_sem;      /*索引节点信号量*/

      structinode_operations*i_op;          /*索引节点操作表*/

      structfile_operations  *i_fop;          /*默认的索引节点操作*/

      structsuper_block    *i_sb;          /*相关的超级块*/

      structfile_lock      *i_flock;        /*文件锁链表*/

      structaddress_space  *i_mapping;      /*相关的地址映射*/

      structaddress_space  i_data;          /*设备地址映射*/

      structdquot        *i_dquot[MAXQUOTAS];/*节点的磁盘限额*/

      structlist_head      i_devices;        /*块设备链表*/

      structpipe_inode_info  *i_pipe;        /*管道信息*/

      structblock_device    *i_bdev;        /*块设备驱动*/

      unsignedlong        i_dnotify_mask;    /*目录通知掩码*/

      structdnotify_struct  *i_dnotify;      /*目录通知*/

      unsignedlong        i_state;        /*状态标志*/

      unsignedlong        dirtied_when;      /*首次修改时间*/

      unsignedint        i_flags;        /*文件系统标志*/

      unsignedchar        i_sock;          /*可能是个套接字吧*/

      atomic_t          i_writecount;      /*写者记数*/

      void              *i_security;      /*安全模块*/

      __u32            i_generation;      /*索引节点版本号*/

      union{

          void        *generic_ip;      /*文件特殊信息*/

      }u;

};

/*

*索引节点的操作inode_operations定义在linux/

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1