第 8 章 虚拟文件系统(5)

news2024/11/15 12:31:24

目录

8.4 处理VFS对象

8.4.1 文件系统操作


本专栏文章将有70篇左右,欢迎+关注,查看后续文章。

8.4 处理VFS对象

8.4.1 文件系统操作

文件系统可以编译为模块。

使用文件系统前需先注册。

1. 注册文件系统

int    register_filesystem( struct file_system_type *fs )

        注册文件系统,将加入全局文件系统链表。

通过遍历全局链表,查找文件系统名称字符串,可确定是否已注册。

struct    file_system_type   {

        const char         *name;           //如"ext3","nfs","ubifs"。

        int                      fs_flags;         //是否只读、禁止setuid、禁止setgid。

        struct module    *owner;          //当文件系统编译为模块时有效。

        struct dentry   *(*mount) (struct file_system_type *,   int,  const char *,  void *);

                //挂载文件系统时调用。

        void         (*kill_sb) (struct super_block *);

                //卸载文件系统时调用。

        struct hlist_head        fs_supers;

                //不同目录可装载了相同文件系统。

                //所有相同文件系统连接到fs_supers为表头的链表。

        struct file_system_type      *next; //连接其他文件系统

};

成员介绍:

fs_supers:

        不同目录可装载了相同文件系统。

        所有相同文件系统连接同一链表,fs_supers就是表头。

        使用举例:

                hlist_add_head( &s->s_instances,   &type->fs_supers );

                hlist_for_each_entry( old,   &type->fs_supers,   s_instances ) {

                }

2. 装载卸载

mount命令:查看系统装载的文件系统。

vfsmount 结构

每一个装载的文件系统都有一个 vfsmount 实例。

struct    vfsmount {

        struct dentry                 *mnt_root;         //文件系统装载的根目录的dentry。

        struct super_block         *mnt_sb;         //对应超级块。

        int                                  mnt_flags;

};

setuid:执行程序时,可将进程有效用户ID设置为文件所有者ID,但有安全隐患。

mnt_flags 有:

        #define MNT_NOSUID 0x01         // 禁止setuid执行。

        #define MNT_NODEV 0x02           // 虚拟文件系统。

        #define MNT_NOEXEC 0x04         // 禁止执行程序文件。

        #define MNT_READONLY 0x40     // 挂载为只读文件系统。

超级块管理

装载一个文件系统时,还将初始化一个 struct super_block 实例。

        其中包含文件系统信息,装载点信息。

struct    super_block   {

        struct list_head         s_list;          // 连接系统所有超级块。

        dev_t                        s_dev;         // 文件系统所在块设备标识符。

        struct block_device    *s_bdev;                // 文件系统所在块设备。

        unsigned char            s_blocksize_bits;   // 文件系统块大小,单位:bit。

        unsigned long            s_blocksize;          // 文件系统块大小,单位:字节。

        loff_t                           s_maxbytes;         // 文件系统中文件最大长度。

        struct file_system_type    *s_type;

        struct super_operations    *s_op;

        struct dentry                      *s_root;         // 根目录的dentry,用于检查文件系统是否装载。

        struct hlist_node                s_instances;  // 连接到file_system_type中fs_supers链表。

        void                                   *s_fs_info;      // 私有信息。

        u32                                    s_time_gran; // 支持的时间戳最大粒度,单位:ns。

        struct list_head                  s_inodes;       // 文件系统中所有inode。

        struct list_head                  s_files;           // 文件系统中所有打开的文件。

        struct list_head                  s_inodes_wb;    // 文件系统中正在回写的inode。

        unsigned char                    s_dirt;            // 文件系统是否脏。

};

struct    super_operations   { //管理 inode

        struct inode    *(*alloc_inode)(struct super_block    *sb);

                //分配一个 inode 结构体。

        void    (*destroy_inode)(struct inode   *);

                // 释放 inode 结构体。

        void    (*free_inode)(struct inode    *);

        void    (*dirty_inode) (struct inode    *,    int    flags);

                // 将一个 inode 标记为脏。

        int    (*write_inode) (struct inode    *,    struct writeback_control    *wbc);

                //将 inode 结构体写回磁盘。

        int    (*drop_inode) (struct inode    *);

                //引用计数为 0 时释放 inode 结构体。

        void    (*put_super) (struct super_block    *);

                //释放超级块占用的资源。

        int    (*sync_fs)(struct super_block    *sb,    int    wait);

                //将文件系统中未写入磁盘的数据都写回磁盘。

        int    (*statfs) (struct dentry    *,    struct kstatfs    *);

                //返回统计信息。包括:使用和未使用数据块数目等。

        int    (*remount_fs) (struct super_block    *,    int    *,    char    *);

                // 重新挂载文件系统。

};

mount 系统调用

根据不同选项,do_mount调用不同函数:

        MS_REMOUNT 选项:

                do_remount ()                 //修改一个已装载的文件系统。

        MS_MOVE 选项:

                do_move_mount ()         //移动一个已装载文件系统。

        默认选项:

                do_new_mount ()           //普通装载,使用最多。

do_new_mount 流程:

共享子树

Linux 扩展的装载选项:

        1. MS_SHARED,共享装载:

                对挂载点的更改,将传播给所有共享的的其他挂载点。

        2. MS_PRIVATE,私有装载:

                私有挂载点的更改,不会传播给其他挂载点。

        3. MS_SLAVE,从属装载:

                跟随其上级挂载点的共享或私有状态。

        4. MS_UNBINDABLE,不可绑定的装载:

                不可将其绑定或移动到其他挂载点。

do_mount 中:

if (  flags    &    (MS_SHARED | MS_PRIVATE | MS_SLAVE | MS_UNBINDABLE))

        do_change_type( &path,    flags );         //改变装载类型。

umount 系统调用

卸载文件系统。

装载的自动过期

使用场景:网络文件系统会使用。

将该装载从vfsmount树中移除。

伪文件系统

一个文件系统不一定需要底层块设备,如。

        内存为后备存储器:ramfs,tmpfs。

        无后备存储器:procfs,sysfs。

伪文件系统:应用层不可见,不能卸载。主要为了组织 inode,如:

        bdev:管理块设备inode。

        pipefs:处理管道。

        sockfs:处理套接字。

cat    /proc/filesystem:

        可查看所有文件系统,包括伪文件系统。

标志 MS_NOUSER:

        表示为伪文件系统,可防止被装载, 其余操作和普通文件系统一致。

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

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

相关文章

Scrapy爬虫框架介绍、创建Scrapy项目

Scrapy官网:https://scrapy.org/ 什么是Scrapy Scrapy 是一个基于 Python 的快速的高级网页抓取和网页爬取框架,用于抓取网站并从其页面中提取结构化数据。它可用于多种用途,从数据挖掘到监控和自动化测试。 Scrapy核心组件 1. Scrapy Engin…

【Linux学习】文件系统 - 第二篇

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 文章目录 💡文件操作的系统接口🍑open系统调用⚡close系统调用🦈write系统调用🦅read系统调…

在开关电源转换器中充分利用碳化硅器件的性能优势

在过去的几十年中,半导体行业已经采取了许多措施来改善基于硅 MOSFET (parasitic parameters),以满足开关转换器(开关电源)设计人员的需求。行业效率標準以及市场对效率技术需求的双重作用,导致了对于可用于构建更高效…

Mysql中事务的读一致性问题,以及如何用MVCC解决

事务四大特性的实现: 原子性事务具有回滚的能力,InnoDB引擎使用undo log日志表来进行回滚操作。 持久性InnoDB引擎使用redo log日志表来保证数据的持久性。 事务的隔离性产生的问题: 脏读:一个事务读取到了另一个事务未提交的数…

Qt WebEngine播放DRM音视频

Qt WebEngine播放DRM受保护视频,前提是Qt WebEngine开启音视频编码器,能够支持网页上普通视频的播放。开启音视频编码器需要自己编译源码,这里不做介绍。 什么是DRM音视频 DRM视频是指数字版权管理(Digital Rights Management&a…

70.加载功能菜单功能设计

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:易道云信息技术研究院 上一个内容:69.搭建分析工具界面 以 69.搭建分析工具界面 它的代码为基础进行修改 效果图&#xf…

gif压缩大小但不改变画质?为网站性能加速的必备知识

在互联网时代,GIF 动图以其生动的表现力和视觉效果,在社交媒体、网站设计、数字营销等领域被广泛应用。然而,随之而来的一个问题是,GIF 文件的体积往往较大,这可能会导致网站加载速度变慢,影响用户体验。因…

练习实践-基础设施:搭建时钟同步服务器-基于chrony软件在centos7系统上的实现

参考来源:B站视频:up主:林哥讲运维 【一分钟学会:使用 chrony 部署企业 NTP 时间服务器】 https://chrony-project.org/comparison.html --chrony组织的比较 https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/…

Milvus 向量数据库进阶系列丨构建 RAG 多租户/多用户系统 (上)

本系列文章介绍 在和社区小伙伴们交流的过程中,我们发现大家最关心的问题从来不是某个具体的功能如何使用,而是面对一个具体的实战场景时,如何选择合适的向量数据库解决方案或最优的功能组合。在 “Milvus 向量数据库进阶” 这个系列文章中&…

基于全切片图像的结直肠癌肿瘤浸润性淋巴细胞和肿瘤-基质比率自动量化技术|文献精析·24-08-05

小罗碎碎念 今天分享的这一篇文章是一篇20年发表的文章,研究的是免疫组化相关的病理AI课题,当时用的是还是支持向量机和随机森林,在展望的部分提出CNN是未来的发展趋势。但是根据时间节点来看,当时Transformer已经发表了&#xf…

Sentine 源码分析之--ParamFlowSlot

前言: 上一篇我对 Sentinel 中的 AuthoritySlot、SystemSlot、GatewayFlowSlot 的相关源码进行了分析,本篇我们开始分析 ParamFlowSlot 相关的源码。 Sentinel 系列文章传送门: Sentinel 初步认识及使用 Sentinel 核心概念和工作流程详解…

实时数仓分层架构详解

首先,我们从数据仓库说起。 数据仓库的概念可以追溯到20世纪80年代,当时IBM的研究人员提出了商业数据仓库的概念。数据仓库概念的提出,是为了解决和数据流相关的各种问题,特别是多重数据复制带来的高成本问题。 数据仓库之父Bill …

敏捷与DevOps有什么不同?

在软件开发领域,敏捷和DevOps因其对效率、协作和交付高质量产品的关注而受到欢迎。尽管它们有不同的目标,敏捷和DevOps常常被交替使用。本文旨在阐明这些方法之间的区别和共性,展示它们如何无缝协同以产生结果。 图源自Browser Stack 了解敏捷…

uniapp开发微信小程序出现【错误: xx.js 已被代码依赖分析忽略,无法被其他模块引用】解决办法

报错信息 VM5208:9 app.js错误:Error: config.js 已被代码依赖分析忽略,无法被其他模块引用。你可根据控制台中的【代码依赖分析】告警信息修改代码,或关闭【过滤无依赖文件】功能。详情请查看:https://developers.weixin.qq.com/community/…

滑台模组如何满足特定生产需求?

滑台模组是一种可以进行近乎直线运动的自动化设备,用于将物体沿着平面上的轨道滑动。由导轨、传动结构和导向结构等组成。滑台模组可以通过电机驱动、气动驱动或液压驱动等方式进行移动。滑台模组的结构紧凑、操作简便,具有高精度、高稳定性和高可靠性的…

dijkstra其实是bfs?--重新定义dijkstra

dijkstra其实是bfs?--重新定义dijkstra 1前言2最短路径问题3没有边权的最短路--bfs算法4边权的加入5优先队列与dijkstra6后记 1前言 本文将介绍dijkstra算法全新的理解方式 建议新手对dijkstra有建议了解,强烈推荐这篇文章,无比详细 2最短路径问题 最…

sql注入sqli-labs第二-四关

目录 sql注入sqli-labs第二关 1、了解表的列数 2、连表查询 3、注入管理员账号密码 sql注入sqli-labs第三关 1、逃脱单引号,括号 ​编辑 2、了解表的列数 3、连表查询 4、注入管理员账号密码 sql注入sqli-labs第四关 1、逃脱双引号,括号 2、了…

3GPP入门

官网地址 3GPP – The Mobile Broadband Standard 协议下载链接 Directory Listing /ftp/specs/archive 总纲 重点series Signalling protocols ("stage 3") - user equipment to network24 series信令Radio aspects25 series3G 基础LTE (Evolved UTRA), LTE-Adva…

RCNA | RGOS日常管理和Windows常用网络命令

RCNA | RGOS日常管理和Windows常用网络命令 一、RGOS日常管理操作1. RGOS平台平台概述2. 常用登陆方式3. CLI模式 二、Windows常用网络命令1. ICMP协议2. Ping命令3. Tracert命令4. Windows其他命令 一、RGOS日常管理操作 RGOS操作系统最主要的三大特性是模块化、安全性、开放性…

anaconda下载库的方法

首先打开anaconda prompt(桌面搜索),输入 conda activate (项目名字)然后pip install