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 字节流
一、输入输出流 输入输出 ------- 读写文件 输入 ------- 从文件中获取数据到自己的程序中,接收处理【读】 输出 ------- 将自己程序中处理好的数据保存到文件中【写】 流 ------- 数据移动的轨迹 二、流的分类 按照数据的移动轨迹分为:输入流 输出流…...
华硕电脑怎么录屏?分享实用录制经验!
“华硕电脑怎么录屏呀,刚买的笔记本电脑,是华硕的,自我感觉挺好用的,但是不知道怎么录屏,最近刚好要录一个教程,怎么都找不到在哪里录制,有人能教教我吗?” 随着电脑技术的不断发展…...
python学习--python的异常处理机制
try…except try:n1int(input(请输入一个整数))n2int(input(请输入另一个整数))resultn1/n2print(结果为,result) except ZeroDivisionError: print(除数不能为0)try…except…else 如果try块中没有抛出异常,则执行else块,如果try中抛出异常࿰…...
nacos+Dubbo整合快速入门
官网:Nacos Spring Boot 快速开始 下载下载链接启动:进入bin目录,startup.cmd -m standalone引入依赖 <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>3.0.9…...
QT实现钟表
1、 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QPaintEvent> //绘制事件类 #include <QDebug> //信息调试类 #include <QPainter> //画家类 #include <QTimerEve…...
准备我们心爱的IDEA写Jsp
JSP学习 一、准备我们心爱的IDEA new一个项目:New Project --> Next -->Next -->Finsh 二、配置好服务器Tomcat-9.0.30 1.> 在WEB-INF下创建一个Lib包 将jsp-api.jar复制进去,并使其生效 未生效前: 生效过程: 2.>…...
将近 5 万字讲解 Python Django 框架详细知识点(更新中)
Django 框架基本概述 Django 是一个开源的 Web 应用后端框架,由 Python 编写。它采用了 MVC 的软件设计模式,即模型(Model)、视图(View)和控制器(Controller)。在 Django 框架中&am…...
Arcgis提取每个像元的多波段反射率值
Arcgis提取每个像元的多波段反射率值 数据预处理 数据预处理阶段需要对遥感图像进行编辑传感器参数、辐射定标、大气校正、正射校正,具体流程见该文章 裁剪研究区 对于ENVI处理得到的tiff影像,虽然是经过裁剪了,但是还存在黑色的背景值&a…...
JavaScript面试题整理(一)
数据类型篇 1、JavaScript有哪些数据类型,它们的区别是什么? 基本数据类型:number、string、boolean、undefined、NaN、BigInt、Symbol 引入数据类型:Object NaN是JS中的特殊值,表示非数字,NaN不是数字…...
数据结构:树和二叉树之-堆排列 (万字详解)
目录 树概念及结构 1.1树的概念 1.2树的表示 编辑2.二叉树概念及结构 2.1概念 2.2数据结构中的二叉树:编辑 2.3特殊的二叉树: 编辑 2.4 二叉树的存储结构 2.4.1 顺序存储: 2.4.2 链式存储: 二叉树的实现及大小堆…...
爬虫入门基础:深入解析HTTP协议的工作过程
目录 一、HTTP协议简介 二、HTTP协议的工作过程 三、请求方法与常见用途 四、请求头与常见字段 五、状态码与常见含义 六、进阶话题和注意事项 总结 在如今这个数字化时代,互联网已经成为我们获取信息、交流和娱乐的主要渠道。而在互联网中,HTTP协…...
k8备份与恢复-Velero
简介 Velero 是一款可以安全的备份、恢复和迁移 Kubernetes 集群资源和持久卷等资源的备份恢复软件。 Velero 实现的 kubernetes 资源备份能力,可以轻松实现 Kubernetes 集群的数据备份和恢复、复制 kubernetes 集群资源到其他kubernetes 集群或者快速复制生产环境…...
网站规划模板/南宁正规的seo费用
spring 集成 Orika Bean映射框架 前文介绍了Orika,本文介绍如何在spring框架中集成使用。 spring中注册 与spring 集成仅需定义统一的mapperFactory,然后把需要转换的bean依次注册至mapperFactory。 package com.mytutorial;import ma.glasnost.orik…...
网站怎么生成三级域名/2021近期时事新闻热点事件
生肖年份的起点●储流杰中国传统文化中运用天干(甲、乙、丙、丁、戊、己、庚、辛、壬、癸)和地支(子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥,)依次交替组合循环的方法纪年,俗称干支纪年法。组合时必须单数配单数,双数配双数࿰…...
360移动建站/今日热搜榜排行榜
Lists-列表 列表是Python中的另一种对象。它们用于存储索引的项目列表。 使用带有逗号分隔项的方括号创建列表。 列表中的某个项目可以使用方括号中的索引访问。 举个例子: words ["Hello", "world", "!"] print(words[0]) print(words[1]) …...
菜鸟建网站/店铺如何运营和推广
它可能看起来像一个隐形棒球,但360fly实际上是一个360度动作相机。它整齐地使用镜头与抛物面镜一起记录周围的一切,然后使用软件打开图像。这是一个新兴运动的一部分 - 360度视频与YouTube和Facebook兼容,这是一种生成伪VR内容的快捷方式。De…...
政府网站建设规范及标准/seo专业培训需要多久
上学时从来没把元旦当作一年的新开始,没想到工作后大家都对元旦如此看重。现在想想,从去年6月下旬毕业到现在,也接近半年了,是时候总结一下和重新调整2014年的规划的时候了。 毕业后到一家小公司上班,感觉半年的收获不…...
专业做足球体彩网站/seo信息网
这篇文章的适用范围其实不仅限于Java后端或Java Web,不过其中有些是拿这方面举例的,在其它方面,大家可以举一反三,应该也能得到些启示。 我们在面试时,会发现有些候选人技术不错,比如在Java Web后端方面&am…...