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 字节流
一、输入输出流 输入输出 ------- 读写文件 输入 ------- 从文件中获取数据到自己的程序中,接收处理【读】 输出 ------- 将自己程序中处理好的数据保存到文件中【写】 流 ------- 数据移动的轨迹 二、流的分类 按照数据的移动轨迹分为:输入流 输出流…...

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

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...

麒麟系统使用-进行.NET开发
文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的,如果需要进行.NET开发,则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET,所以要进…...

leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...