内存中inode与磁盘中inode

深大操作系统实验四:磁盘 Inode 读取,盘块读取,软硬链接,磁盘挂载 1. 创建目录 2. 创建文件,查找 inode 号,读取 inode 内容,读入第一个盘块的数据 3. 创建软硬链接 4. 验证内存的磁盘 cache 的加速效果 5. 挂载磁盘,将光驱数据挂载到磁盘目录以访问 6. fopen 与 open 7. 文件指针与游标的思考 阅读详情

作者:不详

来源:http://www.i170.com/user/grip2/Article_8613

在容易引起混淆的地方我将把把内存中的inode结构称为VFS inode,而文件
系统以EXT2为代表,把Ext2 inode作为磁盘上的inode代表。
首先需要分别对内存中的inode与磁盘上的inode做一下简单的描述:
<内存中的inode结构:>
   VFS inode包含文件访问权限、属主、组、大小、生成时间、访问时间、
最后修改时间等信息。它是linux管理文件系统的最基本单位,也是文件系
统连接任何子目录、文件的桥梁。inode结构中的静态信息取自物理设备上
的文件系统,由文件系统指定的函数填写,它只存在于内存中,可以通过
inode缓存访问。虽然每个文件都有相应的inode结点,但是只有在需要的时
候系统才会在内存中为其建立相应的inode数据结构,建立的inode结构将形
成一个链表,我们可以通过遍历这个链表去得到我们需要的文件结点,VFS也
为已分配的inode构造缓存和hash table,以提高系统性能。inode结构中的
struct inode_operations *iop为我们提供了一个inode操作列表,通过这个
列表提供的函数我们可以对VFS inode结点进行各种操作。每个inode结构都
有一个i结点号i_ino,在同一个文件系统中每个i结点号是唯一的。

<磁盘上的inode:>
   EXT2通过使用inode来定义文件系统的结构以及描述系统中每个文件的
管理信息,每个文件都有一个inode且只有一个,即使文件中没有数据,其
索引结点也是存在的。每个文件用一个单独的Ext2 inode结构来描述,而且
每一个inode都有唯一的标志号。Ext2 inode为内存中的inode结构提供了文
件的基本信息,随着内存中inode结构的变化,系统也将更新Ext2 inode中
相应的内容。Ext2 inode对应的是Ext2_inode结构。

从上面的描述,我们可以对内存中inode与磁盘中inode做出比较:
位置:VFS inode结构位于内存中,而Ext2_inode位于磁盘。
生存期:VFS inode在需要时才会被建立,如果系统断电,此结构也随之消失。
       而Ext2_inode的存在与系统是否上电无关,而且无论文件是否包含
       数据,Ext2_inode都是存在的。
唯一性:两者在自己的作用域中都是唯一的。
关系:VFS inode是Ext2 inode的抽象、映射与扩充,而后者是前者的静态
     信息部分,也是对前者的具体化、实例化和持久化。
操作:对VFS inode的操作具有通用性,对文件系统inode的操作则是文件系
     统相关的,依赖于特定的实现。
组织管理:系统通过VFS inode链表来对其进行组织,并且为了提高访问效率
         相应地构造了inode构造缓存和hash table。
         Ext2 inode的信息位于EXT2文件系统的划分的块组中,在每个块组
         中包含相应的inode位图、inode表指定具体的inode信息,每个
         inode对应Ext2_inode结构。


上面是从原理上对内存中inode与磁盘中inode进行比较,实际上在代码上也体
现出它们的不同。在下面我把在内核中两者对应的结构代码贴出来,虽然长了
一些,但是对进一步的比较还是很有好处。
struct inode {
struct list_headi_hash;
struct list_headi_list;
struct list_headi_dentry;

struct list_headi_dirty_buffers;

unsigned longi_ino;
atomic_ti_count;
kdev_ti_dev;
umode_ti_mode;
nlink_ti_nlink;
uid_ti_uid;
gid_ti_gid;
kdev_ti_rdev;
loff_ti_size;
time_ti_atime;
time_ti_mtime;
time_ti_ctime;
unsigned longi_blksize;
unsigned longi_blocks;
unsigned longi_version;
unsigned shorti_bytes;
struct semaphorei_sem;
struct rw_semaphorei_truncate_sem;
struct semaphorei_zombie;
struct inode_operations*i_op;
struct file_operations*i_fop;/* former ->i_op->default_file_ops */
struct super_block*i_sb;
wait_queue_head_ti_wait;
struct file_lock*i_flock;
struct address_space*i_mapping;
struct address_spacei_data;
struct dquot*i_dquot[MAXQUOTAS];
/* These three should probably be a union */
struct pipe_inode_info*i_pipe;
struct block_device*i_bdev;
struct char_device*i_cdev;

unsigned longi_dnotify_mask; /* Directory notify events */
struct dnotify_struct*i_dnotify; /* for directory notifications */

unsigned longi_state;

unsigned inti_flags;
unsigned chari_sock;

atomic_ti_writecount;
unsigned inti_attr_flags;
__u32i_generation;
union {
struct minix_inode_infominix_i;
struct ext2_inode_infoext2_i;
struct ext3_inode_infoext3_i;
struct hpfs_inode_infohpfs_i;
struct ntfs_inode_infontfs_i;
struct msdos_inode_infomsdos_i;
struct umsdos_inode_infoumsdos_i;
struct iso_inode_infoisofs_i;
struct sysv_inode_infosysv_i;
struct affs_inode_infoaffs_i;
struct ufs_inode_infoufs_i;
struct efs_inode_infoefs_i;
struct romfs_inode_inforomfs_i;
struct shmem_inode_infoshmem_i;
struct coda_inode_infocoda_i;
struct smb_inode_infosmbfs_i;
struct hfs_inode_infohfs_i;
struct adfs_inode_infoadfs_i;
struct qnx4_inode_infoqnx4_i;
struct reiserfs_inode_inforeiserfs_i;
struct bfs_inode_infobfs_i;
struct udf_inode_infoudf_i;
struct ncp_inode_infoncpfs_i;
struct proc_inode_infoproc_i;
struct socketsocket_i;
struct usbdev_inode_info        usbdev_i;
struct jffs2_inode_infojffs2_i;
void*generic_ip;
} u;
};


struct ext2_inode {
__u16i_mode;/* File mode */
__u16i_uid;/* Low 16 bits of Owner Uid */
__u32i_size;/* Size in bytes */
__u32i_atime;/* Access time */
__u32i_ctime;/* Creation time */
__u32i_mtime;/* Modification time */
__u32i_dtime;/* Deletion Time */
__u16i_gid;/* Low 16 bits of Group Id */
__u16i_links_count;/* Links count */
__u32i_blocks;/* Blocks count */
__u32i_flags;/* File flags */
union {
struct {
__u32  l_i_reserved1;
} linux1;
struct {
__u32  h_i_translator;
} hurd1;
struct {
__u32  m_i_reserved1;
} masix1;
} osd1;/* OS dependent 1 */
__u32i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
__u32i_generation;/* File version (for NFS) */
__u32i_file_acl;/* File ACL */
__u32i_dir_acl;/* Directory ACL */
__u32i_faddr;/* Fragment address */
union {
struct {
__u8l_i_frag;/* Fragment number */
__u8l_i_fsize;/* Fragment size */
__u16i_pad1;
__u16l_i_uid_high;/* these 2 fields    */
__u16l_i_gid_high;/* were reserved2[0] */
__u32l_i_reserved2;
} linux2;
struct {
__u8h_i_frag;/* Fragment number */
__u8h_i_fsize;/* Fragment size */
__u16h_i_mode_high;
__u16h_i_uid_high;
__u16h_i_gid_high;
__u32h_i_author;
} hurd2;
struct {
__u8m_i_frag;/* Fragment number */
__u8m_i_fsize;/* Fragment size */
__u16m_pad1;
__u32m_i_reserved2[2];
} masix2;
} osd2;/* OS dependent 2 */
};

从结构的定义中可以看出来inode(VFS inode)与ext2_inode的差别是很大的,怎么说呢,
除了相同的都是不同。它们都包含动态信息和静态信息,通过union指定的内容那一定
是动态的了。inode结构中的union u实际上反映了VFS支持的文件系统。
可以看出inode结构与ext2_inode结构有些内容是相似的,如inode定义的
       unsigned longi_ino;
umode_ti_mode;
nlink_ti_nlink;
uid_ti_uid;
gid_ti_gid;
loff_ti_size;
time_ti_atime;
time_ti_mtime;
time_ti_ctime;
unsigned longi_blksize;
unsigned longi_blocks;
和ext2_inode定义的定义部分
       __u16i_mode;/* File mode */
__u16i_uid;/* Low 16 bits of Owner Uid */
__u32i_size;/* Size in bytes */
__u32i_atime;/* Access time */
__u32i_ctime;/* Creation time */
__u32i_mtime;/* Modification time */
__u32i_dtime;/* Deletion Time */
__u16i_gid;/* Low 16 bits of Group Id */
__u16i_links_count;/* Links count */
__u32i_blocks;/* Blocks count */
__u32i_flags;/* File flags */
这些都可以对应上,当然还有一些不同的地方,如inode中定义的
kdev_ti_rdev;
kdev_ti_dev;
kdev_ti_dev;
unsigned shorti_bytes;
struct semaphorei_sem;
在ext2_inode中没有体现,不过这部分对ext2_inode是没有用途而且无法确定的。
类似的,可以推广到两个结构的其余部分,最终在代码中的区别还是与原理中分析的
区别相关的,也是原理的具体体现。

【基础IO】文件系统 {磁盘的物理结构,存储系统,CHS寻址;磁盘的逻辑结构:LBA寻址,EXT文件系统:磁盘分区结构,块组结构;inode编号;软硬链接} 阅读详情

相关推荐

Ubuntu安装有线网卡驱动

问题:插入网线后,无法识别有线连接。 原因:主板有线网卡的型号和系统中网卡的驱动不匹配 解决 前提条件: 需要连wifi通网,因为需要安装dkms,和下载驱动。 删除原驱动 1、查看网卡型号 lspci | grep net 我的网卡型号是8125 2、查看网卡驱动 lspci -k 网卡驱动是r8169 3、卸载网卡驱动 找出位置 modinfo r8169 | grep filename 然后删除 rm path/r8169.ko 卸载驱动 rmmod r8169 查看是否卸载成功 lsm

weixin_43932656的博客 1万+

EXT4文件系统学习(14)VFS之VFS inode

不同的文件系统inode也不一样,对inode的操作函数也不一样,VFS inode的作用就是隐藏下面具体文件系统的inode差异,向上层提供统一的接口。 inode struct inode { umode_t i_mode; unsigned short i_opflags; kuid_t i_uid; kgid_t i_gid; unsigned int i_...

TSZ0000的博客 1133

Geant4学习一:写一个简单程序

1、 基本介绍

ccwwNUAA的博客 7697

深入理解linux内核读书笔记 -- 虚拟文件系统 -- vfs的数据结构,超级块/索引节点(inode)/文件/目录项对象介绍+字段介绍+方法表,文件/目录项对象高速缓存,如何更新缓存

深入理解linux内核读书笔记 -- 虚拟文件系统 -- vfs的数据结构,超级块/索引节点(inode)/文件/目录项对象介绍+字段介绍+方法表,文件/目录项对象高速缓存,如何更新缓存

m0_74206992的博客 1113

树莓派国内镜像源一键配置指南

本文提供树莓派国内镜像源一键配置指南,解决默认国外源访问缓慢问题。通过自动检测系统版本并支持清华、阿里云、中科大等主流镜像站选择,大幅提升软件更新与安装速度。包含详细的手动配置方法和常见问题排查,帮助用户快速完成树莓派换源优化。

tequila的博客 1376

手把手教你用scRNA-seq和scTCR-seq分析CD8⁺ T细胞在免疫治疗中的动态变化

本文详细介绍了如何整合单细胞RNA测序(scRNA-seq)与单细胞TCR测序(scTCR-seq)技术,深入解析CD8⁺ T细胞在癌症免疫治疗中的动态变化。通过从数据预处理、细胞亚群鉴定到TCR克隆追踪的完整分析流程,揭示了T细胞的功能状态转变与克隆演化规律,为理解免疫应答机制和开发精准治疗策略提供了关键方法学指导。

p8q9r0的博客 567

VFS数据结构之(inode)

1. 索引节点对象(inode object) 文件系统处理文件所需要的所有信息都放在索引节点数据结构中。文件名可以改,但索引节点对文件是唯一的。每个索引节点对象都会复制磁盘索引节点包含的一些数据,比如分配给文件的块数。 1.1 索引节点数据结构 struct inode { struct hlist_node i_hash; /* 用于散列链表的指针 */ struct list_head i_list; /* 用于描述索引节点当前状态的链表的指针 */ struct list_head i_s

指向NULL 731

数字IC后端设计实现之Innovus POD V2 Flow性能优化全解析

本文深入解析了数字IC后端设计中的Innovus POD V2 Flow性能优化方案。该流程通过整合place_opt_design与clock_opt_design命令,实现了布局与时钟树的协同优化,有效提升了时序收敛效率、改善了设计密度与拥塞,并显著减少了迭代次数,是应对先进工艺复杂设计的关键利器。

ik6789012的博客 1252

Linux 文件系统(一)---虚拟文件系统VFS----超级块、inode、dentry、file

Linux文件系统,VFS,super_block,超级块,inode... 一: 什么是文件系统,详见:http://zh.wikipedia.org/zh/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F 其实一句话就是管理这块文件的机制(组织方式,数据结构之类...) Linux系统中存在很多的文件系统,例如常见的ext2,ext3,ext4,sysfs,rootfs,proc...很多很多。。。我们知道每个文件系统是独立的,有自己的组织

shanshanpt的专栏 4万+

GStreamer中h264parse元素

h264parse是 GStreamer 中处理 H.264 视频流的关键元素,主要负责解析和准备 H.264 流以便后续处理。

深之JohnChen的专栏 1026

编程实践:寒武纪-LLM&VLM模型量化&部署

本文介绍了在MLU370-S4平台上对大模型(LLM/VLM)进行量化的两种方法:SmoothQuant和WeightOnly。以Qwen2-VL-2B模型为例,详细说明了两种量化方式的命令行参数配置,包括必须设置的per_channel选项和量化参数调整建议。量化完成后,提供了模型部署的具体命令示例,包含设备分配、端口设置、并行度等关键参数。文章强调在MLU370芯片上需要手动设置block_size,并指出两种量化方式只能二选一使用。配套资料已上传至百度网盘供参考。

微风❤水墨 507

linux inode

分类 inode分为内存中的inode和文件系统中的inode,为了避免混淆,我们称前者为VFS inode, 而后者以EXT2为代表,我们称为Ext2 inode。 VFS inode VFS inode包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息。它是linux管理文件系统的最基本单位,也是文件系统连接任何子目录、文件的桥梁。inode结构中的静态信息取自物理设备上...

weixin_41964962的博客 580

audio语音相关的基础知识-VAD,ASR,AEC,AGC,BF等

有音素之间的间隙,也有静音和语音本身的间隙,为了对数据从时间上进行相对的校准,语音端点检测技术就应运而生了,因此端点检测技术可以决定这种校准的相对精度,使得同一内容的特征更趋于相同,当然,一般情况下是不可能完全相同的。盲源分离的目的是求得源信号的最佳估计,盲辨识的目的是求得传输通道的。这个技术的主要任务是从带有噪声的语音中准确的定位出语音的开始和结束点,因为语音中含有很长的静音,也就是把静音和实际语音分离开来,因为是语音数据的原始处理,所以VAD是语音信号处理过程的关键技术之一。呈现出与会者清晰的声音。

u013250861的博客 1034

Linux空间排查实战:内存、磁盘与inode高频问题全解析

在Linux运维中,磁盘占用与内存状态是最常见的排查入口。df用于查看文件系统级别的容量使用,du从目录树累加文件大小,两者差异往往源于进程句柄、文件系统元数据或预留块。inode则决定了文件系统能创建的文件总数,耗尽时即使容量充足也会报“空间不足”。理解这些底层机制,能帮助运维和开发人员在告警出现时,快速区分容量不足、inode耗尽或文件删除后空间不释放等经典问题。无论是新装机器初始化,还是线上业务持续写入,掌握free、df、du、lsof等命令的配合思路,并理解挂载点与文件系统的关系,是高效排查的基础

weixin_29698641的博客 263

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

云服务器爆满怎么办?CPU、内存、磁盘、inode排查与应急指南

服务器性能监控是保障业务连续性的基础,CPU、内存、磁盘以及inode等系统资源的状态直接决定了云服务器的稳定上限。当资源使用率飙升、接口超时或告警轰炸时,快速定位根因并有效止血,是运维工程师的核心能力之一。在真实生产环境中,无论是突发流量造成的CPU打满、内存泄漏引发的进程被杀,还是日志堆积导致的磁盘写满、海量小文件引发的inode耗尽,都需要一套系统化的排查思路和应急处理手段。本文从资源饱和的常见类型出发,梳理从趋势分析、进程定位到日志验证的完整排查路径,并结合扩容、清理、限流等止血策略与监控告警、日志

weixin_33883104的博客 189

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Linux文件系统代码学习笔记2——Hash表&内存inode的创建与回收

Linux文件系统代码学习笔记1–磁盘格式化&block分配 igetput.cpp——内存inode的创建与回收iget——内存inode的创建1. hash表的作用hash队列用来存放内存inode。 但是为什么要弄成队列的样子呢?方便查找?inode编号是唯一的,一个hash表128个队列,假设内存有256个inode 举个栗子,假设要找第129个inode: inode编号->hash

琳小白的博客 1665

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

vfs inode和磁盘inode

在容易引起混淆的地方我将把把内存中的inode结构称为VFS inode,而文件系统以EXT2为代表,把Ext2 inode作为磁盘上的inode代表。首先需要分别对内存中的inode与磁盘上的inode做一下简单的描述:&lt;内存中的inode结构:&gt;   VFS inode包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息。它是linux管理文件系统的最基本单位,...

qwerrfxgj的博客 1007

Linux小黑板(5):磁盘与文件系统

在数据存储的领域,有着不可磨灭的作用。相较于,保持通电情况下具有保持数据的不丢失的内存,磁盘能够"永久性"地存储 数据。硬盘的盘片上具有磁性,利用磁头进行影响这些带磁的物质排列顺序。毕竟,内存的成本造价 远超于硬盘的成本,硬盘仍然能以更大的容量,成为存储的主流。早期计算机使用的磁盘是软磁盘(Floppy Disk,简称软盘),如今常用的磁盘是硬磁盘(Hard disk,简称硬盘)。磁盘是计算机主要的存储介质,可以存储大量的二进制数据,有了上面盘片寻址的基础,也就不难理解下面的图。(1)磁盘的存储结构。

RNGWGzZs的博客 704

dentry与inode

"文件":按一定的形式存储在介质上的信息,一个文件包含两方面信息,一是存储的数据本身,二是有关该文件的组织和管理的信息。 在内存中, 每个文件都有一个dentry(目录项)和inode(索引节点)结构,dentry记录着文件名,上级目录等信息,正是它形成了我们所看到的树状结构;而有关该文件的组织和管理的信息主要存放inode里面,它记录着文件在存储介质上的位置与分布。 同时dentry->d_

88zombie88的专栏 1368

linux命令实践-关于inode

  上节我们提到了inode,实际上inode是文件系统里的一个概念,所以讲inode还是要从文件系统说起。   Linux支持的文件系统差不多有十几种,为了更好的管理这些结构不同的文件系统,它采用了虚拟文件系统(VFS)。IBM网站上有一篇《linux文件系统剖析》的文章,它对linux文件系统的体系结构做了一番详细的分析,相当不错,有兴趣的话自己可以去看一下。这篇文章...

weixin_34111819的博客 132

struct super_block与磁盘

摘要:struct super_block是内核中代表已挂载文件系统的核心数据结构,与磁盘上的超级块形成镜像关系。磁盘超级块存储文件系统的持久化元数据,包括块数、inode信息等;内存中的struct super_block则在挂载时读取这些数据,并维护运行时状态。两者通过挂载/卸载过程实现数据同步,struct super_block还管理活跃inode链表和全局统计信息,作为文件系统操作的枢纽。这种设计实现了磁盘持久化与内存高效管理的结合。

tangzhangyin的专栏 680

(莱昂氏unix源代码分析导读-39)inode“资源”的获取和释放

by cszhao1980 iget()函数用于获取inode资源,它有2个参数,设备号和inode id。前面说过,通过这两个参数 会唯一确定一个inode。简单的说,该函数的作用就是将指定的磁盘inode读入内存inode数组, 并Lock该项(即会设置 ILOCK flag),它返回一个指向该inode数组项的指针。   事实上,iget()做的更多一些,它首先检查内存inod

cszhao1980的专栏 4340

linux inode基本概念

内存中的inode VFS inode包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息。它是linux管理文件系统的最基本单位,也是文件系统连接任何子目录、文件的桥梁。inode结构中的静态信息取自物理设备上的文件系统,由文件系统指定的函数填写,它只存在于内存中,可以通过inode缓存访问。虽然每个文件都有相应的i...

weixin_34395205的博客 110

linux下扇区、块、页的区别+inode与高速缓冲区在linux文件系统的作用

学习linux文件系统时整理的一些笔记。

weixin_46199479的博客 3700
上一篇: 如何编写Linux的设备驱动程序
下一篇: 打开汇编之门
lphpc
博客等级 码龄22年 32粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值