`
cocos
  • 浏览: 400487 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

linux文件系统—inode及相关概念(转载)

阅读更多




 当一个文件系统被格式化成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用户才能创建目录的硬连接。


(UNIX中运用inode来代表一个文件,inode在文件系统创建之初就被分配到硬盘的特定位置(大约占1%的空间),inode结构描述了一个文件的各种属性,最重要的是定位到了硬盘的某个块,实现了从软件到硬件的对应。inode的结构对不同的文件系统可能不一样,为了提高扩展性,保证一致的接口,UNIX运用了vnode,vnode指向具体的文件系统的inode。(Linux下有vnode吗,似乎有类似的实现,是否叫vnode,得看看代码)。总之,UNIX系统中对某个文件的访问经历了:由文件路径获取vnode,由vnode确定inode,由inode确定块的过程。)

 

 

 

 

 

 

 

 

1.索引节点对象struct inode<linux/fs.h>
    索引节点对象包含了内核在操作文件或目录时需要的全部元信息(meta data),注意,文件名不包含在inode中。对于Unix/Linux系统来说,这些信息可以从磁盘索引节点直接读入,而对于没有磁盘索引节点的文件系统,如FAT, NTFS;那么在内存中也必须现场组建索引节点对象。


2.目录项对象struct dentry<linux/dcache.h>
    路径中的每个组成部分都由一个索引节点对象表示,例如:/home/user/.vimrc,上面这个路径包含了4个目录项对象:/, home, user, .vimrc;需要注意的是:文件也是目录项对象。为了方便查找操作,VFS引入了目录项概念。每个dentry代表路径中的一个特定部分。目录项也可以包括安装点,VFS在执行目录操作时——如果需要的话——会现场创建目录项对象。
    不同于超级块和inode,目录项对象没有对应的磁盘数据结构,VFS根据字符串形式的路径名现场创建它;所以也不需要回写目录项对象。对于目录项的理解,有一点曾经迷惑过我。如下:

view plaincopy to clipboardprint?
/* linux/fs.h */ 
struct inode {  
    ...  
    struct list_head i_dentry;  
    ...  
};  
/* linux/dcache.h */ 
struct dentry {  
    ...  
    struct inode *d_inode;  
    ...  
}; 
/* linux/fs.h */
struct inode {
    ...
    struct list_head i_dentry;
    ...
};
/* linux/dcache.h */
struct dentry {
    ...
    struct inode *d_inode;
    ...
};

结论:

    在inode结构中有一个双向链表struct list_head i_dentry结构,这个链表链接“被使用的”目录项,当然,这些目录项的d_inode指针都指向同一个inode结构。这代表什么呢?表示一个索引节点可以对应多个目录项对象。

分析:

    显然,要让一个索引节点表示多个目录项对象,肯定会使用文件链接,文件链接有两种类型,硬链接和符号链接(软链接)。使用ls -i可以查看文件的inode。执行一些简单操作如下:

$mkdir test_dir

然后执行

$ln $PWD/test_dir $PWD/test_dir_hardlink

显然,上面的命令会失败,因为硬链接不能指向目录,否则在文件系统中会形成环,另外,硬链接还不能跨文件系统,为什么呢?看了下面的命令就知道。

$touch test_file                                                                    建立一个文件

$ln $PWD/test_file $PWD/test_file_hardlink                 建立文件的硬链接

$ln -s $PWD/test_file $PWD/test_file_symlink              建立文件的符号链接

$ls -i $PWD                                                                         查看当前目录下文件的inode

从最后一条命令可以看出,符号链接有不同的inode号,而硬链接文件test_file_hardlink和文件test_file的inode号一样,表示它们执行同一个inode结构。由于inode是对于文件系统来说的,所以硬链接不能跨越文件系统,不同文件系统中的相同inode并不是同一个inode。而符号链接没有硬链接的如上两个限制。

    inode结构中的i_dentry链表结构,把属于同一个inode的被使用的(dentry结构中的d_count大于0)目录项连接起来。显然,这里的目录项肯定是使用硬链接的方式来表示的,但是硬链接不能指向目录!这里是最容迷惑的地方:其实,不仅是目录才是目录项,文件也是目录项,看看前面对目录项的定义中的举例就知道了。

    另外,在inode结构中嵌入的双向链表成员struct list_head i_dentry,并不是用来链接inode结构的,而是链接dentry结构的,所以这里需要理解Linux kernel中的struct list_head结构,它是一种嵌入式的链表结构,和数据无关,只有嵌入了struct list_head的结构都可以链接在一起,内核中定义了操作这种链表的宏及函数。详见深入理解Linux内核中的链表。

   在结构dentry中也嵌入了struct list_head d_lru成员,所以就可以通过它来链接了。



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/leisure512/archive/2010/03/28/5424233.aspx
 

  • 大小: 46 KB
分享到:
评论

相关推荐

    linux文件系统—inode及相关概念.pdf

    Linux 文件系统—inode 及相关概念 在 Linux 文件系统中,inode 和相关概念是非常重要的 notions。inode 是文件系统中的索引表,记录文件的属性和分布在哪些数据块上。下面我们将详细介绍 inode 和相关概念。 ...

    linux文件系统概念解释

    ### Linux文件系统概念详解 #### 文件的逻辑结构与类型 在深入探讨Linux文件系统之前,首先需要理解文件的逻辑结构。文件的逻辑结构是用户在操作系统层面所能看到和操作的结构,它可以从用户的角度被分为两大类:*...

    linux文件系统,inode,datablock,superblock,Filesystem Description等详解

    本文将深入探讨Linux文件系统的基础概念,包括inode、datablock、superblock以及它们在文件系统中的作用。 首先,让我们了解文件系统的基本结构。文件系统(File System)定义了数据在硬盘等存储设备上的组织方式,...

    linux 实验报告 文件系统与文件管理.pdf

    Linux 文件系统与文件管理实验报告 Linux 操作系统是一种广泛使用的操作系统,它提供了强大的文件系统管理功能。本实验报告将对 Linux 文件系统和文件管理进行详细的介绍。 一、实验项目:用户与组管理 Linux ...

    iNodeClient_Linux64_7.3 (E0524).tar.gz

    “linux inode”标签则提示我们,iNode是Linux文件系统中的一个重要概念。在Linux中,每个文件和目录都有一个与之关联的iNode(索引节点),它存储了关于文件的重要元数据,如文件所有者、权限、大小、创建和修改...

    Linux文件系统.pdf

    这篇学习资料详细介绍了Linux文件系统的一些关键概念和技术。 1. 文件系统类型 Linux支持多种文件系统类型,如EXT2、EXT3、EXT4、XFS、Btrfs、FAT、NTFS等。EXT4是目前最常用的一种,它在EXT2的基础上进行了优化,...

    iNode for linux以及运行所需要的库

    iNode for Linux是一款专为Linux操作系统设计的软件,它在文件系统管理中扮演着重要的角色。在深入讨论iNode之前,我们先理解一下Linux中的iNode是什么。在Linux文件系统中,每个文件都有一个唯一的标识符,即iNode...

    linux文件系统结构分析

    在Linux操作系统中,文件系统是组织和存储数据的基础架构,它负责管理磁盘上的文件和目录,使得用户和进程能够高效地访问、读写和管理数据。本篇将深入探讨Linux文件系统的结构,并阐述进程如何操作文件。 首先,...

    linux 文件系统 关系图

    根据提供的文件标题、描述、标签以及部分内容,我们可以深入探讨Linux文件系统的几个核心概念,并通过这些概念之间的关系构建出一个较为全面的理解框架。 ### Linux 文件系统关键概念及其关系 #### 超级块(Super ...

    Linux系统文件系统的工作原理

    通过对超级块、inode、block以及目录等关键概念的理解,我们可以更深入地了解Linux文件系统的内部运作机制。此外,通过对比其他文件系统,我们可以更好地认识到Linux文件系统的优势所在。对于Linux用户和开发者而言...

    iNodeClient for Linux 64 bits

    在Linux系统中,iNode是文件系统中用于存储文件元数据的一种数据结构,它记录了文件的大小、创建时间、修改时间、访问权限等信息。iNode是文件系统的核心组成部分,它为每个文件或目录分配一个唯一的标识符,即iNode...

    iNodeClient_Linux.tar.gz

    每个文件或目录在Linux系统中都有一个对应的iNode,存储着关于文件的基本信息,如文件大小、创建时间、权限等。然而,在这里,"iNode"可能是指一个服务或者平台的名称,而"iNodeClient"是这个平台的Linux客户端。 ...

    iNodeClient_Linux

    在Linux系统中,inode是一个重要的概念。每个文件和目录在Linux文件系统中都有一个对应的inode,它存储了关于文件的元数据,如文件的所有者、权限、大小、创建和修改时间等。当我们在谈论"iNodeClient_Linux"时,...

    模拟linux文件系统

    本篇文章将深入探讨“模拟Linux文件系统”的相关知识,主要涉及Linux文件系统的结构、工作原理以及如何通过编程来模拟这一系统。 首先,我们了解Linux文件系统的层次结构。在Linux中,一切皆为文件,包括硬件设备、...

    iNode客户端安装指导(Linux)1

    Linux iNode客户端是一款专为Linux系统设计的智能接入软件,它能够与网络设备如以太网交换机和路由器配合,通过802.1X协议实现用户的身份验证和网络安全检查。该客户端尤其适用于企业网络环境,配合iMC UAM/EAD服务...

    Linux_iNodeClient.tar

    在处理Linux系统和文件系统时,了解iNode的概念及其在系统中的作用是非常基础且重要的。iNode客户端工具则提供了一个更直观的接口,帮助用户和管理员更好地理解和管理文件系统的内部运作。对于开发人员和系统管理员...

    Linux下一个简单的文件系统实现

    在Linux操作系统中,文件系统是核心的重要组成部分,它负责组织和管理存储设备上的数据,使得用户和应用程序可以方便地存取文件。本项目名为“Linux下一个简单的文件系统实现”,其核心是一个名为XORFS(意为“或许...

    Linux文件系统概念解释

    本篇文章将深入探讨Linux文件系统的基本概念以及与其密切相关的`mount`命令。 首先,让我们理解Linux文件系统的层次结构。Linux采用单一的根目录`/`来组织所有的文件和目录,这与Windows的C盘、D盘等多驱动器系统...

Global site tag (gtag.js) - Google Analytics