文件系统小册(FusePosixK8s csi)【2 Posix标准】

文件系统小册(Fuse&Posix&K8s csi)【2 Posix】

往期文章:文件系统小册(Fuse&Posix&K8s csi)【1 Fuse】

POSIX:可移植操作系统接口(标准)

1 概念

POSIX:Portable Operating System Interface of UNIX,POSIX标准定义了操作系统应该为应用程序提供的接口标准,是在各种UNIX操作系统上运行的软件的一系列API标准的总称。是由IEEE指定的一个标准。

  • 为一个POSIX兼容的操作系统编写的程序,应该可以在任何其它的POSIX操作系统(即使是来自另一个厂商)上编译执行。

  • POSIX 并不局限于 UNIX。许多其它的操作系统也支持POSIX,例如Windows NT就提供了与POSIX兼容的库。

  • 应用程序通过应用编程接口(API)而不是直接通过系统调用来编程。因此程序员不关心系统调用,他们只需要使用好API,而操作系统只需要处理好系统调用。不同的操作系统内核实现同样的功能的方法不同,为了实现可移植性,不同操作系统需要遵循同一套标准。

  • POSIX 涵盖了以下内容:系统接口、命令和实用程序、网络文件访问等

  • 相关文档:https://www.gnu.org/software/libc/manual/html_node/POSIX.html

拓展:GNU、Linux、Unix关系

GNU 是一个软件运动和一系列工具,而Linux是操作系统内核,Unix 是一个商业起源的操作系统家族。(GNU+Linux内核组成了我们常说的"Linux",因此很多人认为Linux发行版应该叫做GNU/Linux

  1. GNU:
    GNU 是一个自由软件项目,始于1983年,由理查德·斯托曼(Richard Stallman)发起,目标是创建一套完全自由的类Unix操作系统。
    GNU 提供了许多Unix系统中常见的工具、库和编译器,如GCC(GNU Compiler Collection)、Glibc(GNU C Library)和GDB(GNU Debugger)等。GNU 自己并未完成操作系统内核的开发,但其软件组件被广泛用于各种操作系统中,尤其是Linux。
  2. Linux:
    Linux 是一个由林纳斯·托瓦兹(Linus Torvalds)开发的开源操作系统内核,首次发布于1991年。
    Linux 并非GNU项目的一部分,但它通常与GNU软件一起使用,形成了所谓的GNU/Linux操作系统。这种组合提供了与Unix类似的环境,但其内核是Linux,而不是GNU。
    Linux 内核是免费和开源的,可以与各种用户空间工具和库(包括许多GNU组件)结合,形成各种不同的Linux发行版,如Ubuntu、Fedora和Debian等。
  3. Unix:
    Unix 是一种最初由AT&T贝尔实验室开发的操作系统,首次发布于1969年。
    Unix 是商业产品,历史上大部分版本都是闭源的,但也有一些开源实现,如OpenBSD、FreeBSD和Solaris。
    Unix 设计理念对Linux和GNU项目有很大影响,比如它的命令行界面、文件系统结构和多任务处理机制。
    Linux 和GNU项目都遵循POSIX(可移植操作系统接口)标准,以确保与Unix兼容。

三者联系与区别:

  • 联系:
    GNU/Linux 和 Unix 都是多用户、多任务的操作系统,它们都支持网络功能和提供类似的工作环境。
    许多Unix的工具和概念在Linux和GNU项目中得到了实现和扩展,形成了强大的命令行工具链和开发环境。
    Linux 和 GNU 软件的组合使得开发者可以在不侵犯版权的情况下获得与Unix类似的功能和体验。
  • 区别:
    GNU 是一个软件运动和一系列工具,而Linux是操作系统内核。
    Unix 是一个商业起源的操作系统家族,而Linux和GNU项目是开源的。
    Linux 不是GNU项目的一部分,但GNU工具和库经常与Linux内核一起使用。
    Unix 有多个商业和开源版本,而Linux主要以开源社区驱动的发行版形式存在。

参考文章:https://www.gnu.org/gnu/linux-and-gnu.html

2 POSIX的标准文件接口(常用部分)

POSIX标准的文件接口有:close、create、open、read、sync、write、dup、dup2、flock、fcntl、fsync、lseek、mkstemp等。

open:打开文件

close:关闭文件

creat:创建文件

read:读文件内容

write:写内容到文件

lseek:改变文件指针的位置(文件定位)

fsync:将文件数据从系统缓存区写到磁盘

flock:文件锁,用于进程间同步

stat:获取文件的统计信息

truncate:截断文件

symlink:创建符号链接(如:软链,类比快捷方式)

readlink:读取符号链接的内容

opendir:打开目录

readdir:读取目录内容

mkdir:创建目录

rmdir: 删除目录

telldir:定位目录的当前位置

seekdir:定位目录

rename:重命名

chmod:动态修改文件访问权限

chown:动态修改文件所有者和组别

3 与FUSE的关系:FUSE实现了POSIX

  • FUSE设计的目标之一就是支持POSIX标准,这样基于FUSE构建的文件系统可以提供与原生内核文件系统类似的接口,使得用户能够使用标准的系统调用(如open、read、write等)来与FUSE文件系统交互。
  • 通过FUSE,我们可以实现一个符合POSIX标准的文件系统,允许应用程序(包括那些依赖于标准文件操作的程序)无缝地与FUSE文件系统一起工作。
  • FUSE(Filesystem in Userspace)并不直接实现所有的POSIX文件相关操作规范,但它提供了足够的接口来实现一个符合POSIX标准的文件系统。FUSE的核心在于它为用户空间的文件系统实现提供了一个桥梁,允许开发者通过用户空间的程序来响应内核的文件系统调用。这些调用包括了大部分POSIX标准中的文件操作,但不是所有。

fuse_operations 结构体定义了一系列的回调函数,这些函数对应于POSIX文件操作,例如:

  • getattr: 实现stat操作。
  • read: 实现read操作。
  • write: 实现write操作。
  • open: 实现open操作。
  • create: 实现creat操作。
  • unlink: 实现unlink操作。
  • rename: 实现rename操作。
  • mkdir: 实现mkdir操作。
  • symlink: 实现symlink操作。
  • readlink: 实现readlink操作。
  • chmod: 实现chmod操作。
  • chown: 实现chown操作。
  • truncate: 实现truncate操作。
    flush: 实现文件关闭前的清理操作。

源码:

  • https://github.com/libfuse/libfuse/中的fuse.h文件
/** Get file attributes.** Similar to stat().  The 'st_dev' and 'st_blksize' fields are* ignored. The 'st_ino' field is ignored except if the 'use_ino'* mount option is given. In that case it is passed to userspace,* but libfuse and the kernel will still assign a different* inode for internal use (called the "nodeid").** `fi` will always be NULL if the file is not currently open, but* may also be NULL if the file is open.*/int (*getattr) (const char *, struct stat *, struct fuse_file_info *fi);/** Read the target of a symbolic link** The buffer should be filled with a null terminated string.  The* buffer size argument includes the space for the terminating* null character.	If the linkname is too long to fit in the* buffer, it should be truncated.	The return value should be 0* for success.*/int (*readlink) (const char *, char *, size_t);/** Create a file node** This is called for creation of all non-directory, non-symlink* nodes.  If the filesystem defines a create() method, then for* regular files that will be called instead.*/int (*mknod) (const char *, mode_t, dev_t);/** Create a directory** Note that the mode argument may not have the type specification* bits set, i.e. S_ISDIR(mode) can be false.  To obtain the* correct directory type bits use  mode|S_IFDIR* */int (*mkdir) (const char *, mode_t);/** Remove a file */int (*unlink) (const char *);/** Remove a directory */int (*rmdir) (const char *);/** Create a symbolic link */int (*symlink) (const char *, const char *);/** Rename a file** *flags* may be `RENAME_EXCHANGE` or `RENAME_NOREPLACE`. If* RENAME_NOREPLACE is specified, the filesystem must not* overwrite *newname* if it exists and return an error* instead. If `RENAME_EXCHANGE` is specified, the filesystem* must atomically exchange the two files, i.e. both must* exist and neither may be deleted.*/int (*rename) (const char *, const char *, unsigned int flags);/** Create a hard link to a file */int (*link) (const char *, const char *);/** Change the permission bits of a file** `fi` will always be NULL if the file is not currently open, but* may also be NULL if the file is open.*/int (*chmod) (const char *, mode_t, struct fuse_file_info *fi);/** Change the owner and group of a file** `fi` will always be NULL if the file is not currently open, but* may also be NULL if the file is open.** Unless FUSE_CAP_HANDLE_KILLPRIV is disabled, this method is* expected to reset the setuid and setgid bits.*/int (*chown) (const char *, uid_t, gid_t, struct fuse_file_info *fi);/** Change the size of a file** `fi` will always be NULL if the file is not currently open, but* may also be NULL if the file is open.** Unless FUSE_CAP_HANDLE_KILLPRIV is disabled, this method is* expected to reset the setuid and setgid bits.*/int (*truncate) (const char *, off_t, struct fuse_file_info *fi);...

4 测试系统是否满足POSIX语义 (pjdfstest)

pjdfstest:用于测试posix语义

#git clone源码
git clone https://github.com/pjd/pjdfstest.git
cd pjdfstest# 编译源码
autoreconf -ifs   ./configure   
make pjdfstest
# 查看版本
prove --version## 进入目标目录,执行pjdfstest脚本
cd /root/test (文件系统的挂载目录)
# 测试所有用例(-v显示进度)
prove -rv /root/pjdfstest/tests(pjdfstest里的tests目录)
# 测试单个语义
prove -r /root/pjdfstest/tests/open

在这里插入图片描述

参考:https://www.gnu.org/software/libc/manual/html_node/POSIX.html

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

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

相关文章

前端Vue自定义支付密码输入框键盘与设置弹框组件的设计与实现

摘要 随着信息技术的不断发展,前端开发的复杂性日益加剧。传统的开发方式,即将整个系统构建为一个庞大的整体应用,往往会导致开发效率低下和维护成本高昂。任何微小的改动或新功能的增加都可能引发对整个应用逻辑的广泛影响,这种…

【原创】springboot+mysql医院预约挂号管理系统设计与实现

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…

【Redis】List源码剖析

大家好,我是白晨,一个不是很能熬夜,但是也想日更的人。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!💪💪&#x1f4aa…

游戏交易平台源码游戏帐号交易平台系统源码

功能介绍 1:后台可以添加删除游戏分类 2:会员中心可以出售游戏币,账号,装备 3:后台可以对会员和商品进行管理 4:多商家入驻,商家发布信息 5:手机版功能可以生成APP 6:在线支付可支持微信和支…

VQAScore开启文本到视觉生成评估新篇章

随着生成式人工智能技术的飞速发展,如何全面评估生成内容的质量和与输入提示的一致性成为了一个挑战。在图像-文本对齐领域,传统的评估方法如CLIPScore存在局限性,尤其是在处理涉及多个对象、属性和关系的复杂提示时。它们通常基于简单的词袋…

MES系统的功能、架构及应用价值

MES系统生产过程控制的主要方面涵盖了生产计划与控制、生产调度与排程、数据采集与监控、质量控制与管理、物料管理与控制以及设备管理与维护等多个方面。这些功能共同构成了MES系统的核心价值,帮助企业实现生产过程的数字化、智能化和精细化管理。 一、工厂使用MES…

Nginx 1.26.0 爆 HTTP/3 QUIC 漏洞,建议升级更新到 1.27.0

据悉,Nginx 1.25.0-1.26.0 主线版本中涉及四个与 NGINX HTTP/3 QUIC 模块相关的中级数据面 CVE 漏洞,其中三个为 DoS 攻击类型风险,一个为随机信息泄漏风险,影响皆为允许未经身份认证的用户通过构造请求实施攻击。目前已经紧急发布…

密码与网络安全(一):专栏导读

1.专栏目的 这个专栏的核心目的是提升博主自己的密码与网络安全知识,其次也想将相关的学习收获分享给感兴趣的小伙伴。博主自己的工作主要量子技术相关,身边的同事基本上也是物理专业出身,最近和单位密码领域同事聊天时他提到一个思路很好的启…

【Linux 网络】网络基础(三)(其他重要协议或技术:DNS、ICMP、NAT)

一、DNS(Domain Name System) DNS 是一整套从域名映射到 IP 的系统。 1、DNS 背景 TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序,但是 IP 地址不方便记忆。于是人们发明了一种叫主机名的东西,是一个字符串&…

学习笔记——网络参考模型——TCP/IP模型

二、TCP/IP模型 TCP/IP模型(TCP/IP协议栈):很多个互联网协议的集合,其中以TCP和IP为主,将这些协议的集合称为TCP/IP协议栈。目前使用最多的协议模型。 因为OSI协议栈比较复杂,且TCP和IP两大协议在业界被广泛使用,所以…

JavaScript 动态网页实例 —— 窗口控制

除了打开和关闭窗口之外,还有很多其他控制窗口的方法。例如,可以使用 window.focus()方法使窗口获得焦点,也可以利用与其相对的window.blur 方法使窗口失去焦点。本节介绍移动窗口、改变窗口大小、窗口滚动、窗口超时操作、常用窗口事件、常用窗口扩展等窗口控制的方法和手段。…

[每周一更]-(第99期):MySQL的索引为什么用B+树?

文章目录 B树与B树的基本概念B树(Balanced Tree)B树(B-Plus Tree)对比 为什么MySQL选择B树1. **磁盘I/O效率**2. **更稳定的查询性能**3. **更高的空间利用率**4. **并发控制** 其他树结构的比较参考 索引是一种 数据结构&#x…

LeeCode热题100(两数之和)

本文纯干货,看不懂来打我! 自己先去看一下第一题的题目两数之和:. - 力扣(LeetCode) 简单来说就是让你在一个数组里面找两个数,这两个数的和必须满足等于目标值target才行。 我认为你要是没有思路的话&a…

营造科技展厅主题氛围,多媒体应用有哪些新策略?

长久以来,展厅作为线下向公众传递信息的窗口,其设计风格与内容主题紧密相连,展现出千姿百态的面貌。然而,随着数字多媒体技术的日新月异,展厅不再仅仅是传统的信息展示平台,而是成为了引领内容展示潮流的风…

【Git】git合并分支指定内容到主分支

git合并分支指定内容到主分支 在现实开发中,往往需要合并分支内容,如下图: 我们平时在其他分支修改了部分代码,如何将分支部分代码合并到主分支上面呢? 合并步骤: 1、切换当前到主分支 git checkout m…

大型制造业集团IT信息化总体规划方案(65页PPT)

方案介绍: 本大型制造业集团IT信息化总体规划方案旨在通过构建先进、高效、稳定的IT信息化系统,支撑集团各业务领域的运营和管理需求,促进集团整体运营效率和竞争力的提升。通过实施本项目,集团将能够更好地应对市场变化和客户需…

python绘制piper三线图

piper三线图 Piper三线图是一种常用于水化学分析的图表,它能够帮助我们理解和比较水样的化学成分。该图表由三个部分组成:两个三角形和一个菱形。两个三角形分别用于显示阳离子和阴离子的相对比例,而菱形部分则综合显示了这些离子比例在水样…

十四天学会Vue——Vue 组件化编程(理论+实战)(第四天)

二、 Vue组件化编程 2.1 组件化模式与传统方式编写应用做对比: 传统方式编写应用 依赖关系混乱,不好维护:例如:比如需要引入js1,js2,js3,但是js3需要用到js1、2的方法,所以js1、2…

掌控未来,爱普生SR3225SAA用于汽车钥匙、射频电路的智慧引擎

为了响应市场需求,Epson使用独家QMEMS*2技术所生产的石英振荡器,与其精巧的半导体技术所制造的射频传输器电路,开发了SR3225SAA。不仅内建的石英震荡器之频率误差仅有2 ppm,更使其封装尺寸达仅3.2 mm x 2.5 mm,为客户大…

C#中接口的显式实现与隐式实现及其相关应用案例

C#中接口的显式实现与隐式实现 最近在学习演化一款游戏项目框架时候,框架作者巧妙使用接口中方法的显式实现来变相对接口中方法进行“密封”,增加实现接口的类访问方法的“成本”。 接口的显式实现和隐式实现: 先定义一个接口,接口…