VFS四大对象之二 struct inode
继上一篇文章:http://www.cnblogs.com/linhaostudy/p/7427027.html
二、inode结构体:(转自http://blog.csdn.net/shanshanpt/article/details/38943731)
inode结构体在(include/linux/fs.h中):
保存的其实是实际的数据的一些信息,这些信息称为“元数据”(也就是对文件属性的描述)。例如:文件大小,设备标识符,用户标识符,用户组标识符,文件模式,扩展属性,文件读取或修改的时间戳,链接数量,指向存储该内容的磁盘区块的指针,文件分类等等。
( 注意数据分成:元数据+数据本身 )
同时注意:inode有两种,一种是VFS的inode,一种是具体文件系统的inode。前者在内存中,后者在磁盘中。所以每次其实是将磁盘中的inode调进填充内存中的inode,这样才是算使用了磁盘文件inode。
注意inode怎样生成的:每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定(现代OS可以动态变化),一般每2KB就设置一个inode。一般文件系统中很少有文件小于2KB的,所以预定按照2KB分,一般inode是用不完的。所以inode在文件系统安装的时候会有一个默认数量,后期会根据实际的需要发生变化。
注意inode号:inode号是唯一的,表示不同的文件。其实在Linux内部的时候,访问文件都是通过inode号来进行的,所谓文件名仅仅是给用户容易使用的。当我们打开一个文件的时候,首先,系统找到这个文件名对应的inode号;然后,通过inode号,得到inode信息,最后,由inode找到文件数据所在的block,现在可以处理文件数据了。
inode和文件的关系:当创建一个文件的时候,就给文件分配了一个inode。一个inode只对应一个实际文件,一个文件也会只有一个inode。inodes最大数量就是文件的最大数量。
 struct inode {
     umode_t            i_mode;
     unsigned short        i_opflags;
     uid_t            i_uid;
     gid_t            i_gid;
     unsigned int        i_flags;
 #ifdef CONFIG_FS_POSIX_ACL
     struct posix_acl    *i_acl;
     struct posix_acl    *i_default_acl;
 #endif
     const struct inode_operations    *i_op;
     struct super_block    *i_sb;
     struct address_space    *i_mapping;
 #ifdef CONFIG_SECURITY
     void            *i_security;
 #endif
     /* Stat data, not accessed from path walking */
     unsigned long        i_ino;
     /*
      * Filesystems may only read i_nlink directly.  They shall use the
      * following functions for modification:
      *
      *    (set|clear|inc|drop)_nlink
      *    inode_(inc|dec)_link_count
      */
     union {
         const unsigned int i_nlink;
         unsigned int __i_nlink;
     };
     dev_t            i_rdev;
     struct timespec        i_atime;
     struct timespec        i_mtime;
     struct timespec        i_ctime;
     spinlock_t        i_lock;    /* i_blocks, i_bytes, maybe i_size */
     unsigned short          i_bytes;
     blkcnt_t        i_blocks;
     loff_t            i_size;
 #ifdef __NEED_I_SIZE_ORDERED
     seqcount_t        i_size_seqcount;
 #endif
     /* Misc */
     unsigned long        i_state;
     struct mutex        i_mutex;
     unsigned long        dirtied_when;    /* jiffies of first dirtying */
     struct hlist_node    i_hash;
     struct list_head    i_wb_list;    /* backing dev IO list */
     struct list_head    i_lru;        /* inode LRU list */
     struct list_head    i_sb_list;
     union {
         struct list_head    i_dentry;
         struct rcu_head        i_rcu;
     };
     atomic_t        i_count;
     unsigned int        i_blkbits;
     u64            i_version;
     atomic_t        i_dio_count;
     atomic_t        i_writecount;
     const struct file_operations    *i_fop;    /* former ->i_op->default_file_ops */
     struct file_lock    *i_flock;
     struct address_space    i_data;
 #ifdef CONFIG_QUOTA
     struct dquot        *i_dquot[MAXQUOTAS];
 #endif
     struct list_head    i_devices;
     union {
         struct pipe_inode_info    *i_pipe;
         struct block_device    *i_bdev;
         struct cdev        *i_cdev;
     };
     __u32            i_generation;
 #ifdef CONFIG_FSNOTIFY
     __u32            i_fsnotify_mask; /* all events this inode cares about */
     struct hlist_head    i_fsnotify_marks;
 #endif
 #ifdef CONFIG_IMA
     atomic_t        i_readcount; /* struct files open RO */
 #endif
     void            *i_private; /* fs or device private pointer */
 };
i_hash:指向hash链表指针,用于inode的hash表,下面会说
i_list:指向索引节点链表指针,用于inode之间的连接,下面会说
i_dentry:指向目录项链表指针,注意一个inodes可以对应多个dentry,因为一个实际的文件可能被链接到其他的文件,那么就会有另一个dentry,这个链表就是将所有的与本inode有关的dentry都连在一起。
i_dirty_buffers和i_dirty_data_buffers:脏数据缓冲区
i_ino:索引节点号,每个inode都是唯一的
i_count:引用计数
i_dev:如果inode代表设备,那么就是设备号
i_mode:文件的类型和访问权限
i_nlink:与该节点建立链接的文件数(硬链接数)
i_uid:文件拥有者标号
i_gid:文件所在组标号
i_rdev:实际的设备标识
注意i_dev和i_rdev之间区别:如果是普通的文件,例如磁盘文件,存储在某块磁盘上,那么i_dev代表的就是保存这个文件的磁盘号,但是如果此处是特殊文件例如就是磁盘本身(因为所有的设备也看做文件处理),那么i_rdev就代表这个磁盘实际的磁盘号。
i_size:inode所代表的的文件的大小,以字节为单位
i_atime:文件最后一次访问时间
i_mtime:文件最后一次修改时间
i_ctime:inode最后一次修改时间
i_blkbits:块大小,字节单位
i_blksize:块大小,bit单位
i_blocks:文件所占块数
i_version:版本号
i_bytes:文件中最后一个块的字节数
i_sem:指向用于同步操作的信号量结构
i_alloc_sem:保护inode上的IO操作不被另一个打断
i_zombie:僵尸inode信号量
i_op:索引节点操作
i_fop:文件操作
i_sb:inode所属文件系统的超级块指针
i_wait:指向索引节点等待队列指针
i_flock:文件锁链表
注意下面:address_space不是代表某个地址空间,而是用于描述页高速缓存中的页面的。一个文件对应一个address_space,一个address_space和一个偏移量可以确定一个页高速缓存中的页面。
i_mapping:表示向谁请求页面
i_data:表示被inode读写的页面
i_dquot:inode的磁盘限额
关于磁盘限额:在多任务环境下,对于每个用户的磁盘使用限制是必须的,起到一个公平性作用。
磁盘限额分为两种:block限额和inode限额,而且对于一个特文件系统来说,使用的限额机制都是一样的,所以限额的操作函数
放在super_block中就OK!
i_devices:设备链表。共用同一个驱动程序的设备形成的链表。
i_pipe:指向管道文件(如果文件是管道文件时使用)
i_bdev:指向块设备文件指针(如果文件是块设备文件时使用)
i_cdev:指向字符设备文件指针(如果文件是字符设备时使用)
i_dnotify_mask:目录通知事件掩码
i_dnotify:用于目录通知
i_state:索引节点的状态标识:I_NEW,I_LOCK,I_FREEING
i_flags:索引节点的安装标识
i_sock:如果是套接字文件则为True
i_write_count:记录多少进程以刻写模式打开此文件
i_attr_flags:文件创建标识
i_generation:保留
u:具体的inode信息
注意管理inode的四个链表:
inode_unused:将目前还没有使用的inode链接起来(通过i_list域链接)
inode_in_use:目前正在使用的inode链接起来(通过i_list域链接)
super_block中的s_dirty:将所有修改过的inode链接起来,这个字段在super_block中(通过i_list域链接起来)
inode_hashtable:注意为了加快inode的查找效率,将正在使用的inode和脏inode也会放在inode_hashtable这样一个hash结构中,
但是,不同的inode的hash值可能相等,所以将hash值相等的这些inode通过这个i_hash字段连接起来。
VFS四大对象之二 struct inode的更多相关文章
- VFS四大对象之一   struct super_block
		linux虚拟文件系统四大对象: 1)超级块(super block) 2)索引节点(inode) 3)目录项(dentry) 4)文件对象(file) 现在先介绍第一个 一.super_block的 ... 
- VFS四大对象之三  struct dentry
		继上一篇文章介绍了inode结构体:继续介绍目录项dentry: http://www.cnblogs.com/linhaostudy/p/7427794.html 三.dentry结构体 目录项:目 ... 
- VFS四大对象之四-struct file
		继上一篇文章: http://www.cnblogs.com/linhaostudy/p/7428971.html 四.file结构体 文件对象:注意文件对象描述的是进程已经打开的文件.因为一个文件可 ... 
- Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系
		更多嵌入式原创文章,请关注公众号:一口Linux 一:文件系统 1. 什么是文件系统? 操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统. 通常文件系统是用于存储和组织文件的一 ... 
- struct inode 和 struct file
		1.struct inode──字符设备驱动相关的重要结构介绍 内核中用inode结构表示具体的文件,而用file结构表示打开的文件描述符.Linux2.6.27内核中,inode结构体具体定义如下: ... 
- (linux)struct inode 和 struct file
		转自:http://www.cnblogs.com/QJohnson/archive/2011/06/24/2089414.html 1.struct inode──字符设备驱动相关的重要结构介绍 内 ... 
- .net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (二)
		.net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (二) .net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (一) 上一篇主 ... 
- (转)Java回收对象的标记 和 对象的二次标记过程
		Java回收对象的标记 和 对象的二次标记过程 二次标记 针对这个问题,虚拟机的做法是进行两次标记,即第一次标记不在“关系网”中的对象.第二次的话就要先判断该对象有没有实现finalize()方法了, ... 
- PYTHON BS 四大对象
		BeautifulSoup是灵活又方便的网页解析库,处理搞笑,支持多种解析器利用它不用编写正则表达式即可方便地实现网页信息的提取BS的四大对象:1.TagTag就是HTML中的一个个标签,例如:< ... 
随机推荐
- solr集群的理解和配置(待更新)
			solr部署在tomcat下,solr集群依赖tomcat集群和zookeeper集群: zookeeper:1.对象注册和发放中心,实现异步调用. 2.配置中心.(solrConfig.xml,sc ... 
- 那些容易遗忘的web前端问题
			背景: 年底将至,本人这只才出门的前端菜鸟,终于有空闲的时间来整理一下最近投简历时出现的问题.有的是经常使用但是没有仔细留意造成的:有的是个人认为根本没人使用而忽略的.为了下次不出现这种错误,进行一下 ... 
- for循环语句以及输出语句
			action() { int i; //定义变量 lr_start_transaction("submit_answer"); //开始事物 for(i=0; i ... 
- rsync 指定端口拷贝
			rsync -aP -e 'ssh -p 2288' ssh-audit.dat 172.18.18.31:/opt/freesvr/audit/sshgw-audit/sbin 
- bzoj 2750: [HAOI2012]Road
			Description C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它们包含的道路序列不同.我 ... 
- 利用VSTS跟Kubernetes进行CI/CD
			准备VSTS管理环境 首先我们需要到www.visualstudio.com下申请好的VSTS账号,然后在账号下创建一个用Git作为代码管理的项目 创建好项目后我们就可以利用git clone将代码库 ... 
- Windows as a Service(4)——使用Intune管理Windows10更新
			这是这个系列的最后一篇文章,我已经花了三篇的篇幅和大家分享有关于Windows as a Serivce的相关内容,链接如下: Windows as a Service(1)-- Windows 10 ... 
- 我是如何确认线上CLOSE_WAIT产生的原因及如何解决的。
			1.阐述 内部架构:Tomcat应用程序---> nginx ---> 其他Tomcat应用程序,内部Tomcat应用通过nginx调用其他应用. HTTP插件:HttpClient 4. ... 
- 使用Linux 安装MySQL
			文章 link 在安装mysql数据库服务器前,确保你的linux系统是可以连接网络的,下面我们将通过源码方式来安装mysql首先通过putty登入进你的Linux系统,确保系统中已经安装的gcc ... 
- 在亚马逊linux环境上装mysql+添加启动项
			安装mysql sudo yum install mysql sudo yum install mysql-server sudo yum install mysql-devel 添加到系统启动项su ... 
