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.xdnf.cn/news/140633.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

为什么网络安全缺口很大,而招聘却很少?学网络安全真的没有前途吗?

2020年我国网络空间安全人才数量缺口超过了140万,就业人数却只有10多万,缺口高达了93%。这里就有人会问了: 1、网络安全行业为什么这么缺人? 2、明明人才那么稀缺,为什么招聘时招安全的人员却没有那么多呢&#xff1…

Kubernetes中Pod的扩缩容介绍

Kubernetes中Pod的扩缩容介绍 在实际生产系统中,我们经常会遇到某个服务需要扩容的场景,也可能会遇到由于资源紧张或者工作负载降低而需 要减少服务实例数量的场景。此时可以利用 Deployment/RC 的 Scale 机制来完成这些工作。 Kubernetes 对 Pod 的扩…

opencv形状目标检测

1.圆形检测 OpenCV图像处理中“找圆技术”的使用-图像处理-双翌视觉OpenCV图像处理中“找圆技术”的使用,图像处理,双翌视觉https://www.shuangyi-tech.com/news_224.htmlopencv 找圆心得,模板匹配比霍夫圆心好用 - 知乎1 相比较霍夫找直线算法, 霍夫找…

如何安全传输存储用户密码?(程序员必备)

前言 我们开发网站或者APP的时候,首先要解决的问题,就是「如何安全传输和存储用户的密码」。一些大公司的用户数据库泄露事件也时有发生,带来非常大的负面影响。因此,如何安全传输存储用户密码,是每位程序员必备的基础…

[NLP] LLM---<训练中文LLama2(三)>对LLama2进行中文预料预训练

预训练 预训练部分可以为两个阶段: 第一阶段:冻结transformer参数,仅训练embedding,在尽量不干扰原模型的情况下适配新增的中文词向量。第二阶段:使用 LoRA 技术,为模型添加LoRA权重(adapter&…

Apache Hive安装部署详细图文教程

目录 一、Apache Hive 元数据 1.1 Hive Metadata 1.2 Hive Metastore 二、Metastore 三种配置方式 ​2.1 内嵌模式 ​2.2 本地模式 ​2.3 远程模式 ​三、Hive 部署实战 3.1 安装前准备 3.2 Hadoop 与 Hive 整合 3.3 远程模式安装 3.3.1 安装 MySQL 3.3.2 …

Go语言入门篇

目录 一、基础数据类型 1.1 变量的定义方式 1.2 用%T输出变量的类型 二、复合数据类型 2.1 数组 2.1.2、数组的遍历 2.1.3 数组传参 2.2. 切片slice 2.2.1. 初始化切片 2.2.2. append向切片中追加元素 2.2.3. 切片的截取 2.3. map 2.3.1. map初始化 2.3.2. 添加和…

干货 | 基于深度学习的生态保护红线和生态空间管控区域内开发建设活动识别...

以下内容整理自2023年夏季学期大数据能力提升项目《大数据实践课》同学们所做的期末答辩汇报。 一、背景需求 本研究主要针对江苏省典型生态保护区域,通过计算机语义分割和变化检测的技术方法,以实现生态保护区内违法违规开发建设活动的智能监控。 项目的…

MQ - 01 消息队列发展史MQ通用架构

文章目录 导图PreMQ 发展史消息队列的发展脉络MQ选型考虑因素消息 和 流消息队列的架构和功能什么情况下会使用消息队列?架构和功能的基本概念架构层面的基本概念功能层面的基本概念4款主流消息队列的区别和建议对比图导图 Pre MQ - 闲聊MQ一二事儿

【WSN】基于蚁群算法的WSN路由协议(最短路径)消耗节点能量研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

MySQL主从复制与读写分离(附配置实例)

目录 一、主从复制1.1 什么是主从复制?1.2 MySQL支持的复制类型1.3 主从复制的工作过程1.4 主从复制的同步模式1.4.1 异步复制(Asynchronous replication)1.4.2 全同步复制(Fully synchronous replication)1.4.3 半同步…

Floyd算法基础

弗洛伊德算法(Floyd) 之前介绍了迪杰斯特拉算法(Dijkstra)。具体请看:最短路径算法——简单明了的迪杰斯特拉算法(Dijkstra)。Dijkstra适用于非负权图,并且一次只能从网络中找源点到任何一个节点的最短路径,而Floyd算法的应用更加广泛&#…

docker openjdk:8-jdk-alpine 修改时区、添加字体

新建Dockerfile文件,制作新镜像 FROM openjdk:8-jdk-alpine 1、解决字体问题 RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/* 2、解决时差问题 # 解决时差8小时问题ENV TZAsia/ShanghaiRUN ln -snf /usr/share/zoneinfo/$TZ /et…

postgresql-触发器

postgresql-触发器 触发器概述创建触发器管理触发器删除触发器事件触发器创建事件触发器修改触发器删除事件触发器 触发器概述 PostgreSQL 触发器(trigger)是一种特殊的函数,当某个数据变更事件(INSERT、UPDATE、 DELETE 或者 TR…

Java关于AbstractProcessor的使用

文章目录 Step1 项目准备Step2 开发一个自定义的AbstractProcessorStep3 Debug AbstractProcessor替换源码内容运行SpringBoot应用测试源码内容是否成功替换 背景:我们都知道,在正常情况下,我们无法去变更二方,三方包中源码的Java…

在 React 表单开发时,有时没有必要使用State 数据状态

说到在React中处理表单,最流行的方法是将输入值存储在状态变量中。遵循这种方法的原因之一是因为毕竟它是React,每个人都倾向于使用它附带的hooks。使用hooks可以解决React中的许多问题,但是在处理表单时是否必需呢?让我们来看看。…

前端框架之争:Vue.js vs. React.js vs. Angular

文章目录 Vue.js - 渐进式框架的魅力简单易用组件化开发生态系统和工具适用场景 React.js - 高性能的虚拟DOM虚拟DOM单向数据流社区和生态系统适用场景 Angular - 一站式框架完整的框架双向数据绑定类型安全适用场景 如何选择?项目规模生态系统技能和经验性能需求 结…

UOS Deepin Ubuntu Linux 开启 ssh 远程登录

UOS Deepin Ubuntu Linux 开启 ssh 远程登录 打开控制台 安装 openssh-server sudo apt -y install openssh-server修改 /etc/ssh/ssh_config 文件 sudo vim /etc/ssh/ssh_config找到 # Port 22 去掉 # 注释后 保存 重启 ssh 服务 sudo systemctl restart ssh设置 ssh 服务 开机…

【MySQL数据库事务操作、主从复制及Redis数据库读写分离、主从同步的实现机制】

文章目录 MySQL数据库事务操作、主从复制及Redis数据库读写分离、主从同步的实现机制ACID及如何实现事务隔离级别:MVCC 多版本并发控制MySQL数据库主从复制主从同步延迟怎么处理Redis 读写分离1.什么是主从复制2.读写分离的优点 Redis为什么快呢? MySQL数…

数据结构与算法基础-(2)

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…