Linux- inode vnode

什么是inode

inode 是 UNIX 和 UNIX-like 操作系统中的一个关键概念。它代表了文件系统中文件或目录的元数据。每个文件和目录在文件系统中都有一个与之关联的 inode。这个数据结构存储了关于文件的所有信息,除了其名称和实际数据之外。

以下是 inode 中通常包含的信息:

  1. 文件类型: 如常规文件、目录、字符设备、块设备、软链接等。
  2. 权限: 表示为一个八进制数或位掩码,描述了文件的所有者、群组和其他用户的访问权限。
  3. 链接数: 表示此 inode 的硬链接数目。
  4. 所有者和群组 ID: 文件的所有者和所属群组的用户 ID。
  5. 大小: 文件的大小(字节为单位)。
  6. 时间戳: 如文件的创建时间、最后访问时间、内容的最后修改时间等。
  7. 数据块指针: 指向存储文件数据的物理或逻辑块的指针。
  8. 文件系统特定的属性: 如扩展属性、ACLs (访问控制列表) 等。

这是一个简化的 inode 数据结构的概述:

struct inode {mode_t      i_mode;          /* 文件类型和权限 */uid_t       i_uid;           /* 所有者用户ID */gid_t       i_gid;           /* 群组ID */off_t       i_size;          /* 文件大小 */time_t      i_atime;         /* 最后访问时间 */time_t      i_mtime;         /* 内容的最后修改时间 */time_t      i_ctime;         /* inode 本身的最后修改时间 */nlink_t     i_links_count;   /* 硬链接数目 */uint32_t    i_blocks;        /* 数据块数目 */uint32_t    *i_block;        /* 指向数据块的指针 */...                         /* 其他属性和文件系统特定的字段 */
};

当我们在 UNIX-like 系统中使用 ls -l 命令时,所看到的大部分文件属性(如权限、所有者、大小和时间戳)都是直接从 inode 中取得的。

请注意,实际的 inode 结构可能会根据具体的文件系统和操作系统版本有所不同。上述仅是一个高级概念性的表示。

什么是vnode

vnode 是 UNIX 和 UNIX-like 系统(如 Linux、BSD 等)中用于表示文件的抽象接口。vnode 结构提供了一种文件系统无关的方式来引用文件和目录。这意味着不同的文件系统(如 ext4、NFS、FAT 等)可以通过相同的接口(即 vnode)被内核访问。这种设计使得用户和应用程序无需知道文件的实际存储方式。

虽然不同的操作系统可能会有略微不同的 vnode 结构定义,但以下是一个典型的、简化的 vnode 数据结构的概述:

struct vnode {enum vtype      v_type;      /* 文件类型:文件、目录、块设备、字符设备等 */struct mount    *v_mount;    /* 该 vnode 所在的挂载点信息 */struct vnodeops *v_op;       /* vnode 操作函数集,例如 read、write 等 */int             v_count;     /* 对此 vnode 的引用计数 */void            *v_data;     /* 文件系统特定的私有数据,例如对 inode 的引用 */...                         /* 可能还有其他的字段 */
};
  • v_type: 表示文件的类型。可能的类型包括常规文件、目录、字符设备、块设备等。
  • v_mount: 指向代表文件系统挂载点的结构的指针。
  • v_op: 包含一个指向操作函数集的指针,这些操作定义了如何在该 vnode 上执行各种操作。
  • v_count: 表示当前对此 vnode 的引用次数。当 vnode 不再被任何进程引用时,它可能会被回收。
  • v_data: 指向文件系统特定数据的指针。例如,在 ext4 文件系统上,这可能是一个指向 inode 的指针。

注意:实际的 vnode 结构可能会根据具体的操作系统和版本有所不同。上述只是一个高级概念性的表示。要获取特定系统上的确切定义,应该查看相应的系统头文件或文档。

让我们通过一个简化的示例来理解 vnode 的概念和其如何工作。

假设我们有一个简单的文件系统结构,其中包含两种文件系统:ext4 和 NFS。这两种文件系统在处理文件时有自己的方式和操作。但操作系统希望为所有文件提供统一的接口。

步骤:

  1. 应用程序请求:当一个应用程序请求打开一个文件(例如使用 open() 系统调用),它只提供一个路径,例如 /data/file1.txt

  2. 内核查找 vnode:内核首先检查该文件的 vnode 是否已经在缓存中。如果不在,它会为该文件创建一个新的 vnode。

  3. 填充 vnode:一旦确定了 vnode,内核需要填充它的数据结构。这里,它会查看 /data/file1.txt 实际位于哪个文件系统上。如果它位于 ext4 上,内核会使用 ext4 的文件系统驱动来填充 vnode。如果它位于 NFS 上,内核会使用 NFS 的驱动。

  4. 操作文件:现在,当应用程序想要读取或写入该文件时,内核可以使用 vnode 的信息(特别是其中的函数指针)来进行相应的操作。这意味着,对于应用程序来说,无论文件实际上位于哪个文件系统上,文件的操作方式都是相同的。

图示

应用程序|| open("/data/file1.txt")|v
内核------------------------|                       |
ext4驱动                  NFS驱动|                       |v                       v
ext4 文件系统           NFS 文件系统

在此示例中,vnode 的存在为应用程序提供了一个统一的方法来处理 /data/file1.txt,而无需关心其实际上位于哪个文件系统上。内核负责管理 vnode 和与实际的文件系统驱动(如 ext4 或 NFS)的交互。

二者的区别

inodevnode 都是代表文件的数据结构,但它们存在于不同的上下文和层次,并有一些关键的区别。

inode

  1. 定义: inode 是 UNIX 和 UNIX-like 文件系统中的一个核心概念,代表了一个文件或目录的元数据。
  2. 存在位置: inode 是文件系统层面的结构,存在于具体的文件系统中。
  3. 内容: inode 包含关于文件的元数据,例如文件的大小、权限、时间戳、数据块的位置等,但不包括文件名。
  4. 唯一性: 在给定的文件系统中,每个 inode 都有一个唯一的 inode 号。
  5. 文件名: 文件名与目录项(dentry)存储在目录中,它们指向相应的 inode
  6. 限制: 由于 inode 是文件系统特定的,它通常只对具体的文件系统(例如 ext4、xfs 等)有意义。

vnode

  1. 定义: vnode(或称为虚拟节点)是 UNIX-like 操作系统中的抽象层,用于代表所有文件系统中的文件或目录。
  2. 存在位置: vnode 是内核中的结构,是对各种文件系统的一个统一抽象。
  3. 内容: 与 inode 类似,vnode 也包含了文件或目录的元数据。但是,vnode 还包含指向具体文件系统操作的指针,这使得内核可以统一地处理各种文件系统。
  4. 唯一性: 在内核中,每个打开的文件或目录都有一个与之关联的 vnode
  5. 文件名: 和 inode 一样,vnode 本身不存储文件名。
  6. 目的: vnode 的主要目的是为不同类型的文件系统(例如 ext4、NFS、FAT32 等)提供一个统一的接口。

总结

  • inode 是文件系统级别的,具有文件系统特定的信息。
  • vnode 是操作系统级别的,为所有文件系统提供了一个统一的接口。
  • 在某些 UNIX-like 系统中,vnode 可能直接指向一个文件系统的 inode,这样 vnode 就可以通过 inode 访问文件的实际数据和属性。

这种分层设计允许操作系统支持多种文件系统,同时为应用程序提供了一个统一和一致的文件和目录操作接口。

实例

让我们用一个简化的实际例子来揭示inodevnode之间的关系。

假设我们有一个计算机上安装了两个不同的文件系统:一个是本地的ext4文件系统,另一个是网络上的NFS文件系统。

  1. 本地文件: 当用户请求打开本地ext4文件系统上的一个文件,例如/local/data.txt,操作系统首先会在ext4文件系统中查找该文件的inode。这个inode包含了文件的所有元数据,如文件大小、所有者、权限等。同时,操作系统在内存中也会为这个文件创建一个vnode结构。这个vnode不仅包含了文件的元数据,还包含了一组函数指针,这些函数指针指向ext4文件系统的操作,如读、写、删除等。

  2. 远程文件: 用户还可能想要打开网络上的NFS文件系统中的一个文件,例如/remote/data.txt。在这种情况下,操作系统会查找该文件在NFS服务器上的相关信息,并在内存中为它创建一个vnode。这个vnode的结构与本地文件的vnode非常相似,但其函数指针会指向NFS的操作,因为文件的实际数据位于远程服务器上。

这两个例子的关键点在于:不同的文件系统可能有不同的实现和操作,但通过vnode的抽象,操作系统可以为所有文件提供统一的接口。这意味着应用程序不需要知道文件实际存在于哪个文件系统中,它只需通过统一的接口进行读写操作。这种设计简化了应用程序的开发,并使操作系统能够更容易地支持多种文件系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI写作工具,智能ai写作工具

在信息化时代,内容创作已经成为了许多行业的核心。从营销广告到新闻报道,从博客文章到学术论文,人们需要不断地产生高质量的文字内容。创作是一项耗时耗力的工作,需要丰富的知识和创造性思维。 AI写作工具,是一类基于人…

基于Spring Boot的医院预约挂号系统设计与实现

前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…

SAP ABAP基础知识 访问外部数据库-开发篇

前言 本文主要介绍通过ABAP语言访问外部数据库的几种方式 一、外部数据库配置 本文示例中的代码访问了两个外部数据库 MTD : 外部oracle数据库,其中示例表 ZTTEMP 字段( ZZTNO,WERKS) S4Q : 外部HANA数据库(开发系统访问测试系统的数据库), 使用表USR02,ZTTEMP 二、ABAP访问…

Flink Table 数据类型 及Stream转Table实战 和 Flink假(模拟、mock)数据生成工具

列举的flink Table API的数据类型。并生成与这些类型匹配的数据。 同时比较了DataType或LoglicalType默认conversionClass与Flink Table API中规定的内部类型的conversionClass的异同。 一、添加maven pom依赖 用于生成假数据。 <dependency><groupId>net.datafa…

IDEA(2023)解决运行乱码问题

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;专栏系列&#xff1a;无 &#x1f33c…

【计算机组成原理】读书笔记第三期:内存和磁盘的关系

目录 写在开头 内存与磁盘的关系 基本关系 磁盘缓存 虚拟内存 节约内存的编程方法 通过DLL文件实现函数共有 通过调用_stdcall来降低文件程序的大小 磁盘的物理结构 结尾 写在开头 本文继续阅读总结《程序是怎样跑起来的》这本书&#xff08;作者&#xff1a;矢泽…

操作系统(5-7分)

内容概述 进程管理 进程的状态 前驱图 同步和互斥 PV操作&#xff08;难点&#xff09; PV操作由P操作原语和V操作原语组成&#xff08;原语是不可中断的过程&#xff09;&#xff0c;对信号量进行操作&#xff0c;具体定义如下&#xff1a; P&#xff08;S&#xff09;&#…

【Java】安装多个jdk版本

需求描述 win10系统上已经安装过jdk8&#xff0c;但因为要做某些实验&#xff0c;需要安装个jdk7 解决方法 安装过程 下载地址 https://www.oracle.com/java/technologies/downloads/archive/ 安装步骤 .exe文件安装步骤安装即可 遇到问题 问题1&#xff1a;配置环境变…

【计算机网络】——传输层

//图片取自王道&#xff0c;仅做交流学习 一、传输层提供的服务 物理层、数据链路层、网络层是通信子网。 传输层&#xff1a;它属于面向通信部分的最高层&#xff0c;同时也是用户功能的最低层 为应用层提供通信服务使用网络层的服务 网络层提供主机之间的逻辑通信。 1、传输…

SpringMVC之JSR303与拦截器

目录 一.JSR303 1.什么是JSR303 2.为什么使用JSR303 3.JSR303常用注解 4.快速入门 4.1导入Maven依赖 4.2 配置校验规则 4.3 对服务端数据添加进行校验 4.4 结果测试 二.拦截器 1.什么是拦截器 2.拦截器与过滤器 3.应用场景 4.基本拦截器配置 5 案例演示&#xff0…

区块链实验室(23) - FISCO中PBFT耗时与流量特征

前面的实验(区块链实验室(11) - PBFT耗时与流量特征)用仿真的PBFT观察耗时。现在用真实的Fisco网络再次观察其特征。同样地&#xff0c;用相同的网络&#xff0c;即100个节点构成的无标度网络。在每个节点上发起10次交易&#xff0c;记录每次交易的耗时。结果见下图所示。 前半…

Android12.0 系统限制上网系列之iptables用IOemNetd实现app上网黑名单的实现

1.前言 在12.0的系统rom定制化开发中,对于系统限制网络的使用,在system中netd网络这块的产品需要中,会要求设置屏蔽某个app上网的功能, liunx中iptables命令也是比较重要的,接下来就来在IOemNetd这块实现app上网黑名单的的相关功能,就是在 系统中只能不允许某个app上网,…

UVA-1343 旋转游戏 题解答案代码 算法竞赛入门经典第二版

GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 题目其实不难&#xff0c;但是耗费了我较多时间。 这种题关键就是在于找到约束条件&#xff0c;我在DFS的基础上&#xff0c;试了很多种策略&#xff1a; 1. 对3种数字&#xff0c;每种数字…

VSCode『SSH』连接服务器『GUI界面』传输

前言 最近需要使用实验室的服务器训练带有 GUI 画面的 AI 算法模型&#xff08;pygame&#xff09;&#xff0c;但是我是使用 SSH 连接的&#xff0c;不能很好的显示模型训练的效果画面&#xff0c;所以下面将会讲解如何实现 SSH 连接传输 Linux GUI 画面的 注&#xff1a;我们…

Postman —— HTTP请求基础组成部分

一般来说&#xff0c;所有的HTTP Request都有最基础的4个部分组成&#xff1a;URL、 Method、 Headers和body。 &#xff08;1&#xff09;Method 要选择Request的Method是很简单的&#xff0c;Postman支持所有的请求方式。 &#xff08;2&#xff09;URL 要组装一条Request…

华为HCIA(五)

Vlan id 在802.1Q中 高级ACL不能匹配用户名和源MAC 2.4G频段被分为14个交叠的&#xff0c;错列的20MHz信道&#xff0c;信道编码从1到14&#xff0c;邻近的信道之间存在一定的重叠范围 STA通过Probe获取SSID信息 Snmp报文 网络管理设备异常发生时会发送trap报文 D类地址是…

基于Java网络书店商城设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

亚马逊云科技 Amazon Lightsail :一种在云服务器上运行容器的简单方法

当向开发人员介绍亚马逊云科技云服务时&#xff0c;通常会花一点时间来介绍并演示 Amazon Lightsail 。它是迄今为止开始使用亚马逊云科技的最简单方法。使用它&#xff0c;您在几分钟内即可在自己的虚拟服务器上运行您的应用程序。而后增加了在 Amazon Lightsail 上部署基于容…

C语言字符函数和字符串函数(1)

大家好&#xff0c;我们又见面了&#xff0c;让大家久等了&#xff0c;我们今天就来学习字符函数和字符串函数。 在开启今天的学习之前呢&#xff0c;我来解决一下一些小伙伴平时找不到库函数使用的烦恼&#xff0c;因为我们cplusplus.com最新版本不能够查询函数&#xff0c;我…

【面试题精讲】Mysql如何实现乐观锁

❝ 有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top ❞ 首发博客地址 文章更新计划 系列文章地址 在 MySQL 中&#xff0c;可以通过使用乐观锁来实现并发控制&#xff0c;以避免数据冲突和并发更新问…