linux中,inode是一个很重要的实体,与文件有着很大的关系。系统在打开一个文件之前,都是先在一个inode表中查找该文件对应的inode,再去定位到具体的文件。具体过程如下文。 我们都知道磁盘空间,上面布满了文件和目录,其实,磁盘的百分之一被inode表占据着。由名字可以看出,这个表由N多个inode组成。inode说白 了就是一种数据结构,里面包含了多种多样的属性。一种inode对应着一个文件,也就是说,我们在创建一个文件时,系统就会为此文件分配一个inode, 这个inode包含了该文件在磁盘上的位置,文件被修改的时间等信息。inode具体常用的属性如下: ● inode 编号 ●用来识别文件类型,以及用于 stat C 函数的模式信息 ●文件的链接数目 ● 属主的 UID ● 属主的组 ID (GID) ● 文件的大小 ● 文件所使用的磁盘块的实际数目 ● 最近一次修改的时间 ● 最近一次访问的时间 ● 最近一次更改的时间 当我们使用vi编辑器编辑一个文件时,对应的inode就被分配出去,因此,如果有第二个人也想编辑该文件,则屏幕会报信息,说此文件正被使用。 由于系统预先建立的inode节点有限,因此,如果创建的文件数超过了inode数,则会报警。 键入:istat /usr/bin/ksh Inode 18150 on device 10/8 File Protection: r-xr-xr-x Owner: 2(bin) Group: 2(bin) Link count: 5 Length 237804 bytes Last updated: Wed Oct 24 17:37:10 EDT 2007 Last modified: Wed Apr 18 23:58:06 EDT 2007 Last accessed: Mon Apr 28 11:25:35 EDT 2008 可以看到,以上是inode信息,/usr/bin/ksh文件对应的inode编号是18150,inode显示/usr/bin/ksh文件位于device 10/8处。 --------------------------
当一个文件系统被格式化成ext2或者ext3的时候,就会产生Inode number。大家注意到,在文件系统中每一 个inode-no对应一个文件:例如图中对应的1-F1(文件名) 2-D1等等而每一个Inode-no对应一个inode-table, 即图中下面部分的一张表首先我们看看,我们是怎么样读取和修改一个文件的1、我们首先根据文件名,找到 这个文件的Inode-no(节点数)。2、当我们找到个文件的Inode-no时,就会根据这个number数在inodetable中 找到对应的条目3、现在要我们看一看inodetable中的信息: 从左到右依次是:节点数、文件类型、文件 的权限、硬链接数、用户ID、组ID、文件的大小、时间戳记, 最后为指向硬盘上存放数据的数据块的指针。 简单说一下其中的某些项: 文件类型大有7种: - 普通的文件 d 目录 l 链接文件 b 块设备文件 c 字符设备文件 p 命名管道 s socket文件 从这里我们也可以看出,在linux文件系统中,目录也是当作文件来看的! 对于 时间戳记有三种:存取时间,修改时间,变更时间 存取时间,为最后一次打开,或者是访问这个文件的时间; 而修改时间,为最后一次修改文件的时间; 当inodetable中的某项改变时,会更新变更时间。4、系统首先 检查权限等信息,确定该用户可以访问该文件的时候,就会通过最后的指针找到实际的数据块, 对文件进行 存取;
硬链接和软链接的区别文件系统维护着一个分区的索引节点表索引节点也就是所谓的inode, 它其实就是代表这一个文件真实的数据块同样也记录着文件的其他属性如修改时间文件类型等
同样每个文件一般表示就是使用目录项(dirent), 每个目录项包含着该文件的名字,该文件指向的inode节点标号等,记住linux把目录和文件都用目录项来表示,真实的文件类型是在inode节点里面
新建一个硬连接其实也就是新建一个目录项指向目标目录项指向的inode节点,一个inode节点可以指向多个目录项, 如果一个inode节点所引用的目录项计数不为0,该文件的真实数据是不会被
释放的,当计数为零且没有进程使用时内核自动释放该文件的数据,所以如果删除了一个硬连接,
也只是删除了一个目录项,如果那个inode节点还执行其他的目录项,该文件的真实数据是不会被删除的,其实我们平时删除一个文件实际上调用的操作也就是unlink
新建一个符号连接其实也新建了一个目录项,所以一个符号连接的名字可以和源目标不同,但这个符号连接的目录项里指向的inode节点里面的文件数据指针其实是指向该符号连接所引用的文件的真实地址, 如:
ln -s /etc/profile ./ss
这里ss只是该符号连接文件在目录项里面的名字,而该目录项里面inode节点里面的文件数据指针指向的数据就是"/etc/profile"这个路径值, 且inode节点里面的文件类型是符号连接,
所以系统在使用这类文件时就知道读取符号连接文件的真实数据也就是源地址。
系统是不允许普通用户创建目录的硬连接,因为硬连接可能造成循环,这样的硬连接很难删除很容易造成文件系统的混乱,如下面的错误操作:
mkdir test
ln test test/test
只有root用户才能创建目录的硬连接
|