文件系统小册(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.rhkb.cn/news/340369.html

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

相关文章

【设计模式】JAVA Design Patterns——Observer(观察者模式)

🔍目的 定义一种一对多的对象依赖关系这样当一个对象改变状态时,所有依赖它的对象都将自动通知或更新。 🔍解释 真实世界例子 在遥远的土地上生活着霍比特人和兽人的种族。他们都是户外生活的人所以他们密切关注天气的变化。可以说他们不断地…

计算机专业本科就业还是考研?考研有哪些热门方向?

考研并不是一个逃避就业的避难所,也不是一个简单的提升待遇的手段。考研是提升自我的途径,特别是对于那些对特定技术领域有浓厚兴趣并愿意深入研究的人来说 一个本科生能够认真学三年,那么他们所掌握的技能和知识不应该逊色于那些通过短期培…

【面试干货】 非关系型数据库(NoSQL)与 关系型数据库(RDBMS)的比较

【面试干货】 非关系型数据库(NoSQL)与 关系型数据库(RDBMS)的比较 一、引言二、非关系型数据库(NoSQL)2.1 优势 三、关系型数据库(RDBMS)3.1 优势 四、结论 💖The Begin…

jupyter notebook anaconda环境下查看|加载|更换内核

文章目录 1 问题复现2 查看内核位置3 调整python解释器位置 1 问题复现 在conda虚拟环境中使用pip安装相应package, 但是在jupyter notebook中加载该package时报错 [ERROR]ModuleNotFoundError: No module named shap 此时,除去包安装出现问题以外&am…

BIOS主板(非UEFI)安装fedora40的方法

BIOS主板(非UEFI)安装fedora40的方法 现实困难:将Fedora-Workstation-Live-x86_64-40-1.14.iso写入U盘制作成可启动U盘启动fedora40,按照向导将fedora40安装到真机的sda7分区中得到报错如下内容: Failed to find a suitable stage1 device: E…

socket网络编程——套接字地址结构

一、通用 socket 地址结构 socket 网络编程接口中表示 socket 地址的是结构体 sockaddr&#xff0c;其定义如下&#xff1a; 1. #include <bits/socket.h> 2. 3. struct sockaddr 4. { 5. sa_family_t sa_family; 6. char sa_data[14]; 7. }; sa_family 成员是地址族类型…

【Java数据结构】详解Stack与Queue(四)

&#x1f512;文章目录&#xff1a; 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2.用队列实现栈 3.用栈实现队列 4.栈和队列存放null 5.总结 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友…

LVS精益价值管理系统 LVS.Web.ashx SQL注入漏洞复现

0x01 产品简介 LVS精益价值管理系统是杭州吉拉科技有限公司研发的一款专注于企业精益化管理和价值流优化的解决方案。该系统通过集成先进的数据分析工具、可视化的价值流映射技术和灵活的流程改善机制,帮助企业实现高效、低耗、高质量的生产和服务。 0x02 漏洞概述 LVS精益…

python下用cartopy绘制地形晕染(shading)图

python可以利用rasterio&#xff0c;cartopy&#xff0c;matplotlib等库绘制地形晕染图。 1.获取高程数据 高程数据可以从GEBCO网站下载&#xff1a;&#xff08;https://www.gebco.net/data_and_products/gridded_bathymetry_data/&#xff09;。 选择raster&#xff08;栅…

如何在自己的电脑上添加静态路由

1.任务栏搜索powershell 选择以管理员身份运行 2.输入 route add -p (永久) 目的网络地址例如192.168.10.0 mask 255.255.255.0&#xff08;子网掩码&#xff09;192.168.20.1&#xff08;下一跳地址&#xff09;。回车即可生效

性能测试学习-基本使用-元件组件介绍(二)

jmeter优点是&#xff1a;开源免费&#xff0c;小巧&#xff0c;丰富的学习资料和扩展组件 缺点是&#xff1a;1.不支持IP欺骗&#xff0c;分析和报表能力相对于LR欠缺精确度&#xff08;以分钟为单位&#xff09; 工具用户量分析报表IP欺骗费用体积扩展性Loadrunner多(万)精…

day4 数1 隐函数

基础知识 隐函数 &#xff1a;一个方程里边 使x有1个y与之对应 函数的有界性 f(X) 的值大于-M并小于M 单调性 可以用定义发判断单调性 定义法 奇函数 奇函数关于原点对称&#xff0c;偶关于x对称 定义域要关于原点对称 任何一个函数可以写成奇函数偶函数的形式 复合函数的…

【MySQL】MySQL 图形化界面 - 使用说明(MySQL Workbench)

一、安装软件 Navicat&#xff0c;SQLyog 这些软件都不错&#xff0c;不过都需要收费&#xff0c;当然也有破解版。下面用 MySQL Workbench&#xff0c;它是官方提供的工具。 二、使用操作 这个软件本质是一个客户端&#xff0c;现在要让数据库能够远程登录。不过一般不会远程…

SPME2024开幕在即,深兰科技商用清洁机器人新品推介会蓄势待发

6月5日&#xff5e;7日&#xff0c;以“跨界融合洞见未来”为主题的“2024 SPME第六届上海国际物业管理产业博览会”(以下简称“物博会”)将在上海世博展览馆举行。应主办方邀请&#xff0c;深兰科技携多款AI清洁机器人亮相本届展会&#xff0c;向来自全球各地的观展企业家、经…

C++第二十三弹---深入理解STL中list的使用

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、list的介绍 2、list的使用 2.1、构造函数 2.2、赋值操作符重载 2.3、迭代器使用 2.4、容量操作 2.5、元素访问 2.6、修改操作 2.7、其…

Docker 环境下 3D Guassian Splatting 的编译和配置

Title: Docker 环境下 3D Guassian Splatting 的编译和配置 文章目录 前言I. 宿主系统上的安装配置1. 安装 nvidia driver2. 安装 docker3. 安装 nvidia-container-toolkit II. Docker 容器安装配置1. 拉取 ubuntu 22.042. 创建容器3. 进入容器4. 容器中安装 cuda SDK5. 容器中…

详解和实现数据表格中的行数据合并功能

theme: smartblue 前言 需求场景&#xff1a; 在提供了数据查看和修改的表格视图中(如table、a-table等…)&#xff0c;允许用户自行选择多行数据&#xff0c;依据当前状态进行特定列数据的合并操作。选中的数据将统一显示为选中组的首条数据值。同时&#xff0c;页面会即时反…

FASTGPT:可视化开发、运营和使用的AI原生应用

近年来&#xff0c;随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;AI的应用逐渐渗透到各行各业。作为一种全新的开发模式&#xff0c;AI原生应用正逐步成为行业的焦点。在这方面&#xff0c;FASTGPT无疑是一款颇具代表性的产品。本文将详细介绍FASTGPT的设…

使用compile_commands.json配置includePath环境,解决vscode中引入头文件处有波浪线的问题

通过编译时生成的 compile_commands.json 文件自动完成对 vscode 中头文件路径的配置&#xff0c;实现 vscode 中的代码的自动跳转。完成头文件路径配置后&#xff0c;可以避免代码头部导入头文件部分出现波浪线&#xff0c;警告说无法正确找到头文件。 步骤 需要在 vscode 中…

k8s怎么监听资源的变更

监听k8s所有的 Deployment 资源 package mainimport ("context""fmt"v1 "k8s.io/api/apps/v1""k8s.io/apimachinery/pkg/util/json""k8s.io/client-go/informers""k8s.io/client-go/kubernetes""k8s.io/cli…