Linux- inode vnode
什么是inode
inode
是 UNIX 和 UNIX-like 操作系统中的一个关键概念。它代表了文件系统中文件或目录的元数据。每个文件和目录在文件系统中都有一个与之关联的 inode
。这个数据结构存储了关于文件的所有信息,除了其名称和实际数据之外。
以下是 inode
中通常包含的信息:
- 文件类型: 如常规文件、目录、字符设备、块设备、软链接等。
- 权限: 表示为一个八进制数或位掩码,描述了文件的所有者、群组和其他用户的访问权限。
- 链接数: 表示此
inode
的硬链接数目。 - 所有者和群组 ID: 文件的所有者和所属群组的用户 ID。
- 大小: 文件的大小(字节为单位)。
- 时间戳: 如文件的创建时间、最后访问时间、内容的最后修改时间等。
- 数据块指针: 指向存储文件数据的物理或逻辑块的指针。
- 文件系统特定的属性: 如扩展属性、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。这两种文件系统在处理文件时有自己的方式和操作。但操作系统希望为所有文件提供统一的接口。
步骤:
-
应用程序请求:当一个应用程序请求打开一个文件(例如使用
open()
系统调用),它只提供一个路径,例如/data/file1.txt
。 -
内核查找 vnode:内核首先检查该文件的 vnode 是否已经在缓存中。如果不在,它会为该文件创建一个新的 vnode。
-
填充 vnode:一旦确定了 vnode,内核需要填充它的数据结构。这里,它会查看
/data/file1.txt
实际位于哪个文件系统上。如果它位于 ext4 上,内核会使用 ext4 的文件系统驱动来填充 vnode。如果它位于 NFS 上,内核会使用 NFS 的驱动。 -
操作文件:现在,当应用程序想要读取或写入该文件时,内核可以使用 vnode 的信息(特别是其中的函数指针)来进行相应的操作。这意味着,对于应用程序来说,无论文件实际上位于哪个文件系统上,文件的操作方式都是相同的。
图示:
应用程序|| open("/data/file1.txt")|v
内核------------------------| |
ext4驱动 NFS驱动| |v v
ext4 文件系统 NFS 文件系统
在此示例中,vnode 的存在为应用程序提供了一个统一的方法来处理 /data/file1.txt
,而无需关心其实际上位于哪个文件系统上。内核负责管理 vnode 和与实际的文件系统驱动(如 ext4 或 NFS)的交互。
二者的区别
inode
和 vnode
都是代表文件的数据结构,但它们存在于不同的上下文和层次,并有一些关键的区别。
inode
- 定义:
inode
是 UNIX 和 UNIX-like 文件系统中的一个核心概念,代表了一个文件或目录的元数据。 - 存在位置:
inode
是文件系统层面的结构,存在于具体的文件系统中。 - 内容:
inode
包含关于文件的元数据,例如文件的大小、权限、时间戳、数据块的位置等,但不包括文件名。 - 唯一性: 在给定的文件系统中,每个
inode
都有一个唯一的inode
号。 - 文件名: 文件名与目录项(
dentry
)存储在目录中,它们指向相应的inode
。 - 限制: 由于
inode
是文件系统特定的,它通常只对具体的文件系统(例如 ext4、xfs 等)有意义。
vnode
- 定义:
vnode
(或称为虚拟节点)是 UNIX-like 操作系统中的抽象层,用于代表所有文件系统中的文件或目录。 - 存在位置:
vnode
是内核中的结构,是对各种文件系统的一个统一抽象。 - 内容: 与
inode
类似,vnode
也包含了文件或目录的元数据。但是,vnode
还包含指向具体文件系统操作的指针,这使得内核可以统一地处理各种文件系统。 - 唯一性: 在内核中,每个打开的文件或目录都有一个与之关联的
vnode
。 - 文件名: 和
inode
一样,vnode
本身不存储文件名。 - 目的:
vnode
的主要目的是为不同类型的文件系统(例如 ext4、NFS、FAT32 等)提供一个统一的接口。
总结
inode
是文件系统级别的,具有文件系统特定的信息。vnode
是操作系统级别的,为所有文件系统提供了一个统一的接口。- 在某些 UNIX-like 系统中,
vnode
可能直接指向一个文件系统的inode
,这样vnode
就可以通过inode
访问文件的实际数据和属性。
这种分层设计允许操作系统支持多种文件系统,同时为应用程序提供了一个统一和一致的文件和目录操作接口。
实例
让我们用一个简化的实际例子来揭示inode
和vnode
之间的关系。
假设我们有一个计算机上安装了两个不同的文件系统:一个是本地的ext4
文件系统,另一个是网络上的NFS
文件系统。
-
本地文件: 当用户请求打开本地
ext4
文件系统上的一个文件,例如/local/data.txt
,操作系统首先会在ext4
文件系统中查找该文件的inode
。这个inode
包含了文件的所有元数据,如文件大小、所有者、权限等。同时,操作系统在内存中也会为这个文件创建一个vnode
结构。这个vnode
不仅包含了文件的元数据,还包含了一组函数指针,这些函数指针指向ext4
文件系统的操作,如读、写、删除等。 -
远程文件: 用户还可能想要打开网络上的
NFS
文件系统中的一个文件,例如/remote/data.txt
。在这种情况下,操作系统会查找该文件在NFS
服务器上的相关信息,并在内存中为它创建一个vnode
。这个vnode
的结构与本地文件的vnode
非常相似,但其函数指针会指向NFS
的操作,因为文件的实际数据位于远程服务器上。
这两个例子的关键点在于:不同的文件系统可能有不同的实现和操作,但通过vnode
的抽象,操作系统可以为所有文件提供统一的接口。这意味着应用程序不需要知道文件实际存在于哪个文件系统中,它只需通过统一的接口进行读写操作。这种设计简化了应用程序的开发,并使操作系统能够更容易地支持多种文件系统。
相关文章:
Linux- inode vnode
什么是inode inode 是 UNIX 和 UNIX-like 操作系统中的一个关键概念。它代表了文件系统中文件或目录的元数据。每个文件和目录在文件系统中都有一个与之关联的 inode。这个数据结构存储了关于文件的所有信息,除了其名称和实际数据之外。 以下是 inode 中通常包含的…...
不来看看?通过Python实现贪吃蛇小游戏
🏅我是默,一个在CSDN分享笔记的博主。📚📚 🌟在这里,我要推荐给大家我的专栏《Python》。🎯🎯 🚀无论你是编程小白,还是有一定基础的程序员,这个专…...

C# linq初探 使用linq查询数组中元素
使用linq进行数组查询 输出数组中全部的偶数并升序输出结果 写法1: int[] numbers { 5, 10, 8, 3, 6, 12 }; //查询的数组var numqurey from num in numberswhere num % 2 0 //按照条件过滤orderby numselect num;foreach (var num in numqurey){Console.Writ…...
使用线程池进行任务处理
线程池 线程池:一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分…...

ES6之Map和Set有什么不同?
一、Map 1.定义 Map是ES6提供的一种新的数据结构,它是键值对的集合,类似于对象,但是键的范围不限于字符串,各种类型的值都可以当做键。 Object结构是“字符串-值”的对应,Map结构则是“值-值”的对应 2.代码示例 M…...
Java中的集合
Java中的集合分为单列集合和双列集合,单列集合顶级接口为Collection,双列集合顶级接口为Map。 Collection 的子接口有两个:List和Set。 List 接口的特点:元素可重复,有序(存取顺序)。 List 接…...

9.4.2servlet基础2
一.SmartTomcat 1.第一次使用需要进行配置. 二.异常处理 1.404:浏览器访问的资源,在服务器上不存在. a.检查请求的路径和服务器配置的是否一致(大小写,空格,标点符号). b. 确认webapp是否被正确加载(检查web.xml没有/目录错误/内容错误/名字拼写错误)(多多关注日志信息). 2…...

嵌入式学习 - 用电控制电
目录 前言: 1、继电器 2、二极管 3、三极管 3.1 特殊的三极管-mos管 3.2 npn类型三极管 3.3 pnp类型三极管 3.4 三极管的放大特性 3.5 mos管和三极管的区别 前言: 计算机的工作的核心原理:用电去控制电。 所有的电子元件都有数据手册…...
QCA组态如何科学命名?
前言 (一)文献来源 文献来源:[1]Furnari S, Crilly D, Misangyi V F, et al. Capturing causal complexity: Heuristics for configurational theorizing[J]. Academy of Management Review, 2021, 46(4): 778-799. (二ÿ…...

外贸行业中常用的邮箱推荐
随着全球贸易的不断发展,外贸行业越来越重要。在这个过程中,电子邮件作为一种重要的沟通工具,扮演着关键的角色。然而,对于许多外贸从业者来说,选择合适的邮箱服务并不容易。本文将探讨外贸邮箱和普通邮箱的区别&#…...
高性能实践
1、认识性能 从用户体验来看,性能就是响应时间短; 从开发角度来看,性能主要是执行效率高。 性能主要表现形式如下: (1)响应时间,AVG、MAX、MIN、TP95、TP99 (2)吞吐…...

说说hashCode() 和 equals() 之间的关系?
每天一道面试题,陪你突击金九银十! 上一篇关于介绍Object类下的几种方法时面试题时,提到equals()和hashCode()方法可能引出关于“hashCode() 和 equals() 之间的关系?”的面试题,本篇来解析一下这道基础面试题。 先祭一…...
算法通关村-----图的基本算法
图的实现方式 邻接矩阵 定义 邻接矩阵是一个二维数组,其中的元素表示图中节点之间的关系。通常,如果节点 i 与节点 j 之间有边(无向图)或者从节点 i 到节点 j 有边(有向图),则矩阵中的元素值…...

基于随机森林+小型智能健康推荐助手(心脏病+慢性肾病健康预测+药物推荐)——机器学习算法应用(含Python工程源码)+数据集(二)
目录 前言总体设计运行环境Python环境依赖库 模块实现1. 疾病预测2. 药物推荐1)数据预处理2)模型训练及应用3)模型应用 其它相关博客工程源代码下载其它资料下载 前言 本项目基于Kaggle上公开的数据集,旨在对心脏病和慢性肾病进行…...
stm32学习-芯片系列/选型
【03】STM32HAL库开发-初识STM32 | STM概念、芯片分类、命名规则、选型 | STM32原理图设计、看数据手册、最小系统的组成 、STM32IO分配_小浪宝宝的博客-CSDN博客 STM32:ST是意法半导体,M是MCU/MPU,32是32位。 ST累计推出了:…...
LeetCode //C - 200. Number of Islands
200. Number of Islands Given an m x n 2D binary grid grid which represents a map of *‘1’*s (land) and *‘0’*s (water), return the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically…...

使用Python构建强大的网络爬虫
介绍 网络爬虫是从网站收集数据的强大技术,而Python是这项任务中最流行的语言之一。然而,构建一个强大的网络爬虫不仅仅涉及到获取网页并解析其HTML。在本文中,我们将为您介绍创建一个网络爬虫的过程,这个爬虫不仅可以获取和保存网…...

图像处理之《基于语义对象轮廓自动生成的生成隐写术》论文精读
一、相关知识 首先我们需要了解传统隐写和生成式隐写的基本过程和区别。传统隐写需要选定一幅封面图像,然后使用某种隐写算法比如LSB、PVD、DCT等对像素进行修改将秘密嵌入到封面图像中得到含密图像,通过信道传输后再利用算法的逆过程提出秘密信息。而生…...
Java 字节流
一、输入输出流 输入输出 ------- 读写文件 输入 ------- 从文件中获取数据到自己的程序中,接收处理【读】 输出 ------- 将自己程序中处理好的数据保存到文件中【写】 流 ------- 数据移动的轨迹 二、流的分类 按照数据的移动轨迹分为:输入流 输出流…...

华硕电脑怎么录屏?分享实用录制经验!
“华硕电脑怎么录屏呀,刚买的笔记本电脑,是华硕的,自我感觉挺好用的,但是不知道怎么录屏,最近刚好要录一个教程,怎么都找不到在哪里录制,有人能教教我吗?” 随着电脑技术的不断发展…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...

ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...