精华内容
下载资源
问答
  • 在官方flume-taildir-source的基础上修改和优化,适用于以rsync、scp等同步日志导致同一文件iNode会变化的场景 主要修改以下几点: 修改使用文件全路径替换inode作为TailFiles的key,避免同一文件inode变化导致数据...
  • inode号一、相关概念1.1 扇区、块1.2 inode二、Linux 文件存储2.1 inode的数量限制2.2 inode 的内容2.3 Linux系统文件三个主要的时间属性三、inode的特殊作用四、inode 节点耗尽故障处理(模拟实验) 一、相关概念 ...

    一、相关概念

    1.1 扇区、块

    • 我们都知道Linux系统的文件是存储在硬盘上的,而硬盘的最小存储单位叫做“扇区”(sector) ,每个扇区存储512字节(1K=1024字节,即一个扇区存储0.5K的信息)。
    • 操作系统在读取硬盘的时候,不是一个扇区一个扇区地读取的(这样效率太低),而是一次性连续读取多个扇区,一次性读取一个块,一个块一个块这样来读取的。
    • 一般连续八个扇区组成一个“块”(block),一个块是4K大小(即一次读取八个扇区),“块”(block)是文件的最小存储单位。

    1.2 inode

    • inode ,中文译名“索引节点”,也叫“i节点”
    • Linux系统中文件的文件名和文件数据是分开存储的,而文件数据又分为实际数据元信息
    • 元信息类似于文件属性,包括文件的创建者、创建日期、文件大小、文件权限等信息,实际信息存储在块中,而存储文件元信息的区域就叫做inode,因此一个文件必须占用一个 inode, 并且至少占用一个block。
    • inode不包含文件名,文件名是存放在目录当中的。Linux系统中一切皆文件,因此目录也是一种文件。
    • 每个inode都有一个号码(即 inode号),操作系统用 inode号码来识别不同的文件。
      ————Linux内部使用 inode号来识别文件,而非文件名,对于系统来说,文件名是 inode号的别称,是便于用户识别文件的,文件名和 inode号是一一对应的关系,每个 inode号对应一个文件名。

    硬盘分区后的结构:
    在这里插入图片描述

    • 当用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找它对应的inode号码;通过inode号码,获取inode信息;根据inode信息,看该用户是否具有访问这个文件的权限;如果有,就指向相对应的数据block,并读取数据;如果没有就会返回。

    访问文件的简单流程:
    在这里插入图片描述

    二、Linux 文件存储

    2.1 inode的数量限制

    • inode也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域:一个是数据区,存放文件数据;另一个是 inode区,存放 inode 所包含的信息。每个inode 的大小,一般是128 字节或256字节。
    • 通常情况下不需要关注单个inode的大小,而是需要重点关注inode总数,inode的总数在格式化时就已经定好了
      ——为什么需要重点关注inode总数,因为当inode用完时,即便磁盘还有空间也无法创建新文件了,因为在创建文件时需要一个inode号与之对应,而没有inode时自然无法创建新文件。
      执行“ df-i ”命令即可查看每个硬盘分区对应的的inode总数和已经使用的inode数量。
      在这里插入图片描述

    2.2 inode 的内容

    inode包含文件的元信息,具体有以下的内容:

    • 文件的字节数
    • 文件的拥有者 user ID
    • 文件的group ID
    • 文件的读、写、执行权限
    • 链接数,即有多少文件指向这个inode
    • 文件的时间戳
    • 两种方式查看某个文件的 inode信息
      方法一:stat [文件名]

    示例:stat aa.txt
    在这里插入图片描述

    优点:可以查看文件inode 的详细信息

    方法二:ls -i [文件名]

    在这里插入图片描述
    只能显示 inode号

    2.3 Linux系统文件三个主要的时间属性

    Linux系统文件三个主要的时间属性(即inode 里的时间戳)

    • ctime(change time)
      指的是最后一次改变文件或目录(属性)的时间
    • atime(access time)
      指的是最后一次访问文件或目录的时间
    • mtime(modify time)
      指的是最后一次修改文件或者目录(内容)的时间

    三、inode的特殊作用

    由于inode号码与文件名分离,导致一些Unix/Linux系统具有以下的现象:

    • 当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件
    • 移动或重命名文件时,只改变文件名,不影响inode号码
    • 打开一个文件后,系统通过inode号码来识别该文件,不再考虑文件名
    • 文件数据被修改保存后,会生成一个新的 inode 号码(原先的 inode 号会被释放)

    如何通过删除inode号删除文件:
    方法一(删除前需确认信息):find ./ -inum [inode号] -exec rm -i {} \ ;

    在这里插入图片描述
    方法二(直接删除):find ./ -inum [inode号] -delete
    在这里插入图片描述

    四、inode 节点耗尽故障处理(模拟实验)

    • 首先第一步新建一个磁盘
      在这里插入图片描述

    • 磁盘分区(因为是做实验,磁盘分区设为30M)
      在这里插入图片描述

    • 格式化
      输入:mkfs.ext4 /dev/sdb1
      在这里插入图片描述

    • 创建一个目录用来测试

    • 挂载
      在这里插入图片描述

    • “ df -i ”查看每个硬盘分区对应的的inode总数和已经使用的inode数量

    • 可以看到inode总数只有7680个且已经用了7669个了
      在这里插入图片描述

    • 进/test 目录下,只发现了一个空目录
      在这里插入图片描述

    • 使用for循环创建多个文件:for ((i=1; i<=7680; i++));do touch /test/file$i;done

    • 可以看到从7670后就无法创建文件了

    • 嫌麻烦也可以使用 touch {1…7680}.txt在这里插入图片描述

    • 可以“ ls -a ”看一下
      在这里插入图片描述

    • 再使用“ df -i ”查看一下,发现可以 inode号已经为零了
      在这里插入图片描述

    • “ df -Th ”查看磁盘空间使用情况,发现新建的磁盘虽然还有空间,但因为 inode号耗尽无法创建文件了

    在这里插入图片描述
    在这里插入图片描述

    • 解决方法也很简单,删除空白文件就行:
      rm -rf file*
      在这里插入图片描述
    • 使用“ df -i ”查看一下,发现 inode资源重新释放出来了
      在这里插入图片描述
    • 可以正常创建文件了
      在这里插入图片描述
    展开全文
  • linux 文件inode 详解

    万次阅读 多人点赞 2017-12-02 22:54:42
    以下内容转载自: ... 文件名 -> inode -> device block    转自: http://www.ruanyifeng.com/blog/2011/12/inode.html http://blog.s135.com/post/

    以下内容转载自: https://www.cnblogs.com/itech/archive/2012/05/15/2502284.html


    文件名 -> inode -> device block 

     

    转自:
    http://www.ruanyifeng.com/blog/2011/12/inode.html
    http://blog.s135.com/post/295/ 
    http://hi.baidu.com/leejun_2005/blog/item/d9aa13a53b3af6e99152ee7e.html 

     

    一、inode是什么?

    理解inode,要从文件储存说起。
    文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。

     

    操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。

     

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

     

    二、inode的内容
    inode包含文件的元信息,具体来说有以下内容:
      * 文件的字节数
      * 文件拥有者的User ID
      * 文件的Group ID
      * 文件的读、写、执行权限
      * 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
      * 链接数,即有多少文件名指向这个inode
      * 文件数据block的位置

     

    可以用stat命令,查看某个文件的inode信息:
    stat example.txt


    总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,下文会有详细解释。

     

    三、inode的大小
    inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
    每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

     

    查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。
    df -i
    查看每个inode节点的大小,可以用如下命令:
    sudo dumpe2fs -h /dev/hda | grep "Inode size"
    由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。

     

    四、inode号码
    每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

     

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

    使用ls -i命令,可以看到文件名对应的inode号码:

    ls -i example.txt

     

    五、目录文件
    Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。

     

    目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。

     

    ls命令只列出目录文件中的所有文件名:
    ls /etc
    ls -i命令列出整个目录文件,即文件名和inode号码:
    ls -i /etc
    如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的详细信息。
    ls -l /etc

     

    六、硬链接
    一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。
     

    ln命令可以创建硬链接:

    ln 源文件 目标文件
    运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

     

    这里顺便说一下目录文件的"链接数"。创建目录时,默认会生成两个目录项:"."和".."。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2是父目录对其的“硬链接”和当前目录下的".硬链接“。

     

    七、软链接
    除了硬链接以外,还有一种特殊情况。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。

     

    这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory"。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。

     

    ln -s命令可以创建软链接。
    ln -s 源文文件或目录 目标文件或目录

     

    八、inode的特殊作用
    由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。
      1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
      2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。
      3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
          第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。

     

    九 实际问题

    在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题。   后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。  

     

     

    查找原因:

      /data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。 

     

    解决方案:
      1、删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。
      2、用软连接将空闲分区/opt中的newcache目录连接到/data/cache,使用/opt分区的inode来缓解/data分区inode不足的问题:
       ln -s /opt/newcache /data/cache  

     


    展开全文
  • 文件系统

    文件系统

    使用命令 ls -l 的时候看到了7列数据,除了文件名,还看到了文件元数据,分别表示什么呢?
    分别表示 : 模式、硬链接数、文件所有者、组、大小、最后修改时间、文件名
    在这里插入图片描述
    ls -l 读取存储在磁盘上的文件信息,然后显示出来
    在这里插入图片描述
    该信息还可用 stat 命令看到更多信息
    在这里插入图片描述
    上面的执行结果有一些信息需要详细解释,请看下面内容:

    inode

    为了能解释清楚 inode 我们先简单了解一下文件系统
    在这里插入图片描述

    • Linux 文件系统, 上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的 block
    • 一个 block 的大小是由格式化的时候确定的,并且不可以更改。
      例如 mke2fs 的 -b 选项可以设定 block 大小为 1024、2048 或 4096 字节
    • 启动块(Boot Block)的大小是确定的
    磁盘文件系统图名词详解 :

    Block Group: ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子
    超级块(Super Block): 存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
    GDT,Group Descriptor Table: 块组描述符,描述块组属性信息,有兴趣的同学可以在了解一下
    块位图(Block Bitmap): Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用
    inode位图(inode Bitmap): 每个bit表示一个inode是否空闲可用。
    i节点表: 存放文件属性 如 文件大小,所有者,最近修改时间等
    数据区: 存放文件内容

    将属性和数据分开存放的想法看起来很简单,但实际上是如何工作的呢?我们通过touch一个新文件来看看如何工作??

    在这里插入图片描述下面是一个简化的文件系统图,清晰的说明了创建一个文件 inode号 、inode、数据块 之间的关系
    在这里插入图片描述

    创建一个新文件主要有以下4个操作:

    1. 存储属性
    内核先找到一个空闲的 i 节点(这里是131074 )
    内核把文件信息记录到其中
    2. 存储数据
    该文件需要存储在三个磁盘块,内核找到了三个空闲块:300、500、800
    将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推
    3. 记录分配情况
    文件内容按顺序 300、500、800存放,内核在 inode 上的磁盘分布区记录了上述块列表
    4. 添加文件名到目录
    新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口( 131074,abc)添加到目录文件,文件名和 inode 之间的对应关系将文件名和文件的内容及属性连接起来

    展开全文
  • 文件系统之inode

    2021-03-26 11:33:38
    2 inode 2.1 inode主要成员变量 2.2 添加inode到cache 2.3 从cache中删除inode(回收inode cache) 3 dentry 3.1 dentry主要成员变量 3.2 添加dentry到cache 3.3 从cache中删除dentry(回收dentrycache) 4 file 4.1 ...

    注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.2

    1 inode

    内存中,每个文件都有一个inode,一切皆文件,其实应该是说一切皆inode。inode保存了文件系统中一个文件的属性描述,比如文件类型,文件权限,属主,文件创建、读取或修改的时间等等。除了内存中的inode,磁盘中也有对应的inode结构,比如ext4文件系统中,内存中的inode是struct ext4_inode_info,而磁盘中的inode是struct ext4_inode_info,今天我们主要分析下内存中的inode结构。

    2 inode主要成员变量

    struct inode {
    	umode_t			i_mode;  //文件类型和访问权限
    	unsigned short		i_opflags;
    	kuid_t			i_uid; //inode所属文件的所有者id
    	kgid_t			i_gid; //inode所属文件所在组id
    	unsigned int		i_flags;
    	...
    	const struct inode_operations	*i_op; //该inode操作函数集合
    	struct super_block	*i_sb;  //指向所属超级块对象
    	struct address_space	*i_mapping; //指向inode在内存中的pagecache
    	...
    	unsigned long		i_ino;  //inode节点号 ls -i 可以查看文件inode号
    	...
    	struct timespec64	i_atime; //文件最后访问时间
    	struct timespec64	i_mtime; //文件最后修改时间
    	struct timespec64	i_ctime; //文件创建时间
    	spinlock_t		i_lock;	/* i_blocks, i_bytes, maybe i_size */
    	unsigned short          i_bytes; //文件在最后一块中的字节数
    	unsigned int		i_blkbits; //block size(字节位数),一般为9
    	enum rw_hint		i_write_hint;
    	blkcnt_t		i_blocks; //文件的总块数,这里一个block为512 byte,也就是扇区大小
    	...
    	unsigned long		dirtied_when;	//inode变脏的时间
    	unsigned long		dirtied_time_when;
    	//通过该变量链接到全局inode哈希表inode_hashtable,用于inode的快速查找
    	//哈希值通过超级块和inode number计算
    	struct hlist_node	i_hash; 
    	//通过该变量挂载到bdi_writeback的b_io链表,等待BDI回写,也就是这是脏inode
    	struct list_head	i_io_list;	/* backing dev IO list */
    	//该inode所在设备对应的bdi_writeback结构,用于inode的回写
    	struct bdi_writeback	*i_wb;	
    	...
    	struct list_head	i_lru;	//通过该变量链接到超级块的s_inode_lru链表
    	struct list_head	i_sb_list; //通过该变量链接到超级块的s_inodes上
    	struct list_head	i_wb_list;	//通过该变量链接到超级块的s_inodes_wb上,回写统计
    	union {
    		//所有引用该inode的目录项将形成一个链表
    		//比如文件被链接到其他的文件,就会有多个dentry
    		struct hlist_head	i_dentry; 
    		struct rcu_head		i_rcu;
    	};
    	...
    	const struct file_operations	*i_fop;	//该inode对应的文件的操作函数集合
    	struct file_lock_context	*i_flctx;
    	struct address_space	i_data; //内嵌在inode的pagecache对象
    	...
    	void			*i_private; /* fs or device private pointer */
    	RH_KABI_RESERVE(1)
    	RH_KABI_RESERVE(2)
    };
    

    3 创建一个inode

    我们以ext4的创建目录——mkdir为例,看下inode的创建过程,

    const struct inode_operations ext4_dir_inode_operations = {
    	.create		= ext4_create,
    	...
    	.mkdir		= ext4_mkdir,
    	...
    };
    
    const struct file_operations ext4_dir_operations = {
    	.llseek		= ext4_dir_llseek,
    	.read		= generic_read_dir,
    	...
    	.open		= ext4_dir_open,
    	.release	= ext4_release_dir,
    };
    
    static int ext4_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
    {
    	...
    	//调用ext4文件系统的alloc_inode函数,创建新的inode
    	inode = ext4_new_inode_start_handle(dir, S_IFDIR | mode,
    					    &dentry->d_name,
    					    0, NULL, EXT4_HT_DIR, credits);
    	...
    	//对于目录文件,i_op和i_fop指向的也是对应的目录操作函数
    	//如果是普通文件,i_op和i_fop指向的会是file操作函数
    	inode->i_op = &ext4_dir_inode_operations;
    	inode->i_fop = &ext4_dir_operations;
    	...
    }
    

    ext4_new_inode_start_handle通过以下调用路径,

    ext4_new_inode_start_handle ->
    	__ext4_new_inode ->
    		new_inode 
    

    最终在new_inode中将分配成功的inode挂到对应超级块的s_inodes链表上,这个链表就是这超级块所有的inode对象。

    struct inode *new_inode(struct super_block *sb)
    {
    	struct inode *inode;
    
    	spin_lock_prefetch(&sb->s_inode_list_lock);
    	//调用对应文件系统的alloc_inode方法创建一个inode
    	inode = new_inode_pseudo(sb);
    	if (inode)
    		//将该inode挂载到对应超级块的s_inodes链表上
    		inode_sb_list_add(inode);
    	return inode;
    }
    

    4 添加inode到inode cache链表

    超级块上除了s_inodes链表,还有一个LRU链表s_inode_lru,这放的是未使用,或者干净的inode,比如回写完毕的inode就会挂载到这个链表上,这个链表也称为inode cache,在系统需要回收内存时,就会对这个链表下手,回收最近最少使用的inode。

    添加到s_inode_lru链表的路径主要有两个:

    • 回写完毕的inode,也就是干净的inode
    • inode没有其他进程引用

    不过最终都是通过inode_lru_list_add将inode挂载到s_inode_lru链表,

    static void inode_lru_list_add(struct inode *inode)
    {
    	//将inode挂载到超级块的s_inode_lru链表
    	if (list_lru_add(&inode->i_sb->s_inode_lru, &inode->i_lru))
    		this_cpu_inc(nr_unused);
    	else
    		inode->i_state |= I_REFERENCED;
    }
    

    先看回写完毕的inode,

    inode_sync_complete ->
    	inode_add_lru ->
    		inode_lru_list_add
    

    然后是无其他进程引用时,

    iput ->
    	iput_final ->
    		inode_add_lru ->
    			inode_lru_list_add
    

    5 从inode cache中删除inode(回收inode cache)

    上面我们提到系统回收内存时,会对操作s_inode_lru链表,我们也大概看下,

    long prune_icache_sb(struct super_block *sb, struct shrink_control *sc)
    {
    	LIST_HEAD(freeable);
    	long freed;
    	//遍历超级块的s_inode_lru链表,按照回收控制结构sc指定的回收数量,
    	//将可回收的inode隔离到freeable链表中集中回收
    	freed = list_lru_shrink_walk(&sb->s_inode_lru, sc,
    				     inode_lru_isolate, &freeable);
    	//将隔离出来的inode进行回收,这样隔离后可以避免锁竞争
    	dispose_list(&freeable);
    	return freed;
    }
    

    回收inode主要是要从几个链表中抽离,和脏数据回写

    • 超级块的s_inode_lru链表
    • bdi_writeback的b_io链表
    • 超级块的s_inodes链表
    • 回写pagecache
    • 全局inode哈希表
    static void dispose_list(struct list_head *head)
    {
    	while (!list_empty(head)) {
    		struct inode *inode;
    		
    		inode = list_first_entry(head, struct inode, i_lru);
    		//将inode从超级块的s_inode_lru链表摘除
    		list_del_init(&inode->i_lru);
    		//回收inode
    		evict(inode);
    		cond_resched();
    	}
    }
    
    static void evict(struct inode *inode)
    {
    	const struct super_operations *op = inode->i_sb->s_op;
    
    	BUG_ON(!(inode->i_state & I_FREEING));
    	BUG_ON(!list_empty(&inode->i_lru));
    	//从bdi_writeback的b_io链表摘除
    	if (!list_empty(&inode->i_io_list))
    		inode_io_list_del(inode);
    	//将inode从超级块的s_inodes链表摘除
    	inode_sb_list_del(inode);
    
    	//等待该inode回写完毕
    	inode_wait_for_writeback(inode);
    	//调用对应文件系统的evict_inode方法,回写pagecache
    	if (op->evict_inode) {
    		op->evict_inode(inode);
    	} else {
    		truncate_inode_pages_final(&inode->i_data);
    		clear_inode(inode);
    	}
    	//如果是块设备inode
    	if (S_ISBLK(inode->i_mode) && inode->i_bdev)
    		bd_forget(inode);
    	//如果是字符型设备
    	if (S_ISCHR(inode->i_mode) && inode->i_cdev)
    		cd_forget(inode);
    	//从全局inode哈希表中摘除
    	remove_inode_hash(inode);
    	...
    	//回收inode
    	destroy_inode(inode);
    }
    

    处理完这些引用后,就可以调用destroy_inode回收到slab缓存,对于ext4,调用的是ext4_destroy_inode,

    static void destroy_inode(struct inode *inode)
    {
    	BUG_ON(!list_empty(&inode->i_lru));
    	__destroy_inode(inode);
    	//调用对应文件系统的destroy_inode方法,将inode回收到slab缓存
    	//对于ext4,调用的是ext4_destroy_inode
    	if (inode->i_sb->s_op->destroy_inode)
    		inode->i_sb->s_op->destroy_inode(inode);
    	else
    		call_rcu(&inode->i_rcu, i_callback);
    }
    
    static void ext4_destroy_inode(struct inode *inode)
    {	
    	if (!list_empty(&(EXT4_I(inode)->i_orphan))) {
    		...
    	}
    	//调用ext4_i_callback将inode释放会slab缓存
    	call_rcu(&inode->i_rcu, ext4_i_callback);
    }
    
    static void ext4_i_callback(struct rcu_head *head)
    {
    	struct inode *inode = container_of(head, struct inode, i_rcu);
    	//释放回slab缓存
    	kmem_cache_free(ext4_inode_cachep, EXT4_I(inode));
    }
    

    6 结构关系

    • 一块磁盘,三个分区,sda1和sda2是ext4文件系统,sda3是xfs文件系统
    • 全局超级块链表super_blocks将三个超级块串联在一起
    • sda1上的ext4_inode_info结构中内嵌inode结构,其中i_sb指向对应的超级块
    • A、B、C三个inode挂载到超级块s_nodes链表,A,B两个未使用的inode还会挂载到s_inode_lru链表
    • sda2上的ext4文件系统同sda1一样
    • 而sda3上的xfs除了对应的xfs_inode结构不同,大体结构也是一样的,这其实就是VFS的作用,对所有文件系统抽象了一层
      在这里插入图片描述
    展开全文
  • linux文件系统之inode

    2021-05-15 21:26:06
    inode是什么理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性...
  • 线上的一个系统时根据文件inode和最后修改时间判断文件是否发生变化的,之前自己对于这块也有点模糊,干脆整理下。新建文件:ds@app-68:/tmp/xzm$ touch 33ds@app-68:/tmp/xzm$ stat 33文件:”33″大小:0 块:0 ...
  • 删除文件inode便可以删除对应的文件 首先回忆find用法: find [查找范围] [查找条件表达式]采用递归方式,根据目标的名称、类型、大小等不同属性进行精细查找 -name根据目标文件的名称进行查找,允许使用“*“及“?...
  • 熟悉Linux操作系统的同学应该知道Linux文件系统采用了inode - block的结构来表示和存储文件inode包含了文件的元数据信息,block存储实际的文件内容。Linux把一熟悉Linux操作系统的同学应该知道Linux文件系统采用了...
  • inode是Unix体系下用来描述文件对象(文件或目录)的一种数据结构,理解inode有助于提高我们对Unix类操作系统的操作水平。理解inode,要从文件存储说起文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个...
  • 理解Linux文件系统之 inode

    千次阅读 2018-06-26 22:47:52
    理解inode,要从文件储存说起。 文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性...
  • Linux 文件系统 inode

    2021-05-16 00:12:44
    inode 存储的数据:文件的访问模式(r/w/x)文件所有者和组(owner/group)文件大小文件创建或状态改变的时间(ctime)最近一次的读取时间(atime)最近修改的时间(mtime)定义文件特性的标志(flag)文...
  • inode,Unix,Linux,Mac文件结构分析

    千次阅读 2014-12-23 22:20:47
    inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础。 我觉得,理解inode,不仅有助于提高系统操作水平,还有助于体会Unix设计哲学,即如何把底层的复杂性抽象成一个简单概念,从而大大简化用户接口...
  • 关于vi编辑文件后,文件inode节点会发生变化的原因在老师提到inode的那一节,说当把一个文件删除后,再创建一个新的文件。系统就会优先分配这些节点给要创建的文件或者目录。然后我就做了如下测试:(基于centos6.4...
  • 使用df -i命令可以查看系统中各个文件系统最大的Inodes数量以及当前已经使用的数量某个分区df以及df -i的输出Filesystem 1K-blocks Used Available Use% Mounted on/dev/diskA2 975372712 15957716 910617240 2% /...
  • 目录一、文件系统1、扇区(sector)2、块(block)3、文件数据4、inode(索引节点或i节点)5、相关概念总结二、inode号1、三个主要时间属性2、inode的大小3、inode号的查询4、inode的特殊作用5、通过inode号删除文件...
  • inode号,恢复EXT文件

    2021-02-14 17:24:07
    这里写目录标题inode和block概述inode号查看文件的inode信息模拟inode节点耗尽实验 inode和block概述 1、文件、扇区 ●文件是存储在硬盘上的,硬盘的最小存储单位叫做“扇区”(sector),每个扇区存储512字节。 2、...
  • 文件inode数据

    2017-08-25 19:48:00
    理解inode,要从文件储存说起。 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次...
  • 系统中inode号也会占据磁盘空间,而且个数是在格式化的时候就已经固定了 每个inode的大小一般为128字节或256字节 使用df -i可以查看分区中inode总数和已用数 block 连续的八个扇区组成一个block(4K) 是文件存取的...
  • 理解inode,要从文件储存说起。 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性...
  • (1) 理解inode,要从文件储存说起。 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性...
  • Inode的结构图一、inode的内容inode包含文件的元信息,具体来说有以下内容:文件的字节数文件拥有者的User ID文件的Group ID文件的读、写、执行权限文件的时间戳access time(atime): 访问时间,当文件被读取时才更新...
  • inode结构体记录了很多关于文件的信息,比如文件长度,文件所在的设备,文件的物理位置,创建、修改和更新时间等等 ,特别的,它 不包含文件名 !目录下的所有文件名和目录名都存储在目录的数据块中,即如下图的目录...
  • 什么是iNode在Unix/Linux系统中,表面上,用户通过文件名,打开文件,实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,...
  • 操作系统--文件Inode

    千次阅读 2018-01-01 15:59:40
    inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础。 我觉得,理解inode,不仅有助于提高系统操作水平,还有助于体会Unix设计哲学,即如何把底层
  • Linux文件系统中的inode节点详细介绍

    千次阅读 2019-06-04 16:30:27
    理解inode,要从文件储存说起。 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续...
  • Linux文件类型代表符号含义-常规文件,即fileddirectory,目录文件bblock device,块设备文件,支持以"block"为单位进行随机访问ccharacter device,字符设备文件,支持以"character"为单位进行线性访问lsymbolic ...
  • Linux ext4文件系统inode信息修改

    千次阅读 2018-08-31 19:06:28
    1.当我们输入cat testfile时,cat命令接收到testfile参数,进而根据当前工作目录计算出这个文件的绝对路径为/home/niugen/testfile 2.解析这个路径,首先是/即根目录,根目录这个文件对应的ino...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,584
精华内容 28,233
关键字:

修改文件的inode号