实验七、文件系统

2023-11-18

1、为 Ext4 文件系统添加扩展属性

扩展属性分为以下四种:

(1)扩展的安全属性-- security

安全属性名称空间被内核用于安全模块,例如SELinux。对安全属性的读和写权限依赖于策略的设定。这策略是由安全模块载入的。如果没有载入安全模块,所有的进程都对安全属性有读权限,写权限只有那些有CAP_SYS_ADMIN(允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等)的进程才有。

(2)扩展的系统属性-- system

扩展的系统属性被内核用来存储系统对象,比如说ACL。对系统属性的读和写权限依赖于策略的设定。

(3)受信任的扩展属性-- trusted

受信任的扩展属性只对那些有CAP_SYS_ADMIN的进程可见和可获得。这个类中的属性被用来在用户空间中保存一些普通进程无法得到的信息。

(4)扩展的用户属性-- user

扩展的用户属性被分配给文件和目录用来存储任意的附加信息,比如mime type、字符集或是文件的编码。用户属性的权限由文件权限位来定义。对于普通文件和目录,文件权限位定义文件内容的访问,对于设备文件来说,它们定义对设备的访问。扩展的用户属性只被用于普通的文件和目录,对用户属性的访问被限定于属主和那些对目录有sticky位设置的用户。

使用setfattr设置EA:

  • 设置user.name为xattr_test

  • 设置user.city为Beijing

包含转义字符的情况,需使用双引号:

  • 无双引号时为文本

  • 有双引号为转移后的值(八进制base64形式存储)

设置属性值为十六进制数时,所设置的数的位数必须为偶数,即0x 或 0X后的数字必须为偶数位,否则出错。 若设置成功,最终以十六进制数的base64编码存储:

使用在线编码器对欲设置的属性值编码:

使用编码后的值进行属性设置:

使用getfattr命令获取属性并进行text编码设置:

hex编码设置:

查看base64编码存储形式:

使用在线编码器验证:

发现user.name, user.city, user.base64都正确转化为base64格式。

2、注册一个自定义的文件系统类型

register_newfs.c:

#include <linux/module.h>
#include <linux/fs.h>
​
MODULE_LICENSE("GPL");
​
static struct file_system_type myfs_type = {
    .name   = "myfs",
    .owner  = THIS_MODULE,
};
MODULE_ALIAS_FS("myfs");
​
static int __init register_newfs_init(void)
{
    printk("Start register_newfs module...");
    return register_filesystem(&myfs_type);
}
​
static void __exit register_newfs_exit(void)
{
    printk("Exit register_newfs module...");
    unregister_filesystem(&myfs_type);
}
​
module_init(register_newfs_init);
module_exit(register_newfs_exit);

编译运行:

总结:加载模块之前系统中没有myfs文件系统;加载模块时,系统中出现myfs文件系统;卸载模块后myfs文件系统也消失。查看日志,对该模块重复加载、卸载过了三次。

3、在/proc下创建目录

  • /proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。

内核模块编程:

proc_mkdir.c:

#include <linux/module.h>
#include <linux/proc_fs.h>
​
MODULE_LICENSE("GPL");
​
static struct proc_dir_entry *myproc_dir; 
​
static int __init myproc_init(void)
{
    int ret = 0;
    printk("Start proc_mkdir module...");
    myproc_dir = proc_mkdir("myproc",NULL);
    if(myproc_dir == NULL)
        return -ENOMEM;
    return ret;
}
​
static void __exit myproc_exit(void)
{
    printk("Exit proc_mkdir module...");
    proc_remove(myproc_dir);
}
​
module_init(myproc_init); 
module_exit(myproc_exit);

编译运行:

总结:在加载proc_mkdir模块之前,/proc/目录中没有myproc目录;加载proc_mkdir后/proc/中出现了myproc目录;卸载该模块后myproc目录随之消失。

4、使用sysfs文件系统传递内核模块参数

sysfs_exam.c:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/stat.h>
 
MODULE_LICENSE("GPL");
​
static int a = 0;
static int b = 0;
static char * c = "Hello, World";
 
module_param(a, int, 0);
MODULE_PARM_DESC(a, "An invisible int under sysfs");
module_param(b, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
MODULE_PARM_DESC(b, "An visible int under sysfs");
module_param(c, charp, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
MODULE_PARM_DESC(c, "An visible string under sysfs");
 
static int __init sysfs_exam_init(void)
{
    printk("Start sysfs_exam module...");
    printk("a = %d\n", a);
    printk("b = %d\n", b);
    printk("c = '%s'\n", c);
    return 0; 
}
​
static void __exit sysfs_exam_exit(void) 
{
    printk("Exit sysfs_exam module...");
    printk("a = %d\n", a);
    printk("b = %d\n", b);
    printk("c = '%s'\n", c); 
}
 
module_init(sysfs_exam_init);
module_exit(sysfs_exam_exit);

编译、验证:

总结:加载模块之后,系统中出现了自定义模块‘sysfs_exam’;modinfo命令能查看内核模块信息,图中包含对a、b、c的描述,内容为:

  • a在/sys中不可见;

  • b在/sys中可见;

  • c在/sys中可见。

使用echo能够修改指定参数的值,图中将c的值改为”Happy Mid Autumn Day!“。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实验七、文件系统 的相关文章

  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然
  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • ansible 重新启动 2.1.1.0 失败

    我一直在尝试创建一个非常简单的 Ansible 剧本 它将重新启动服务器并等待它回来 我过去在 Ansible 1 9 上有一个可以运行的 但我最近升级到 2 1 1 0 并且失败了 我正在重新启动的主机名为 idm IP 为 192 16
  • Locale.getDefault() 始终返回 en

    unix 机器上的服务器始终使用 en 作为默认区域设置 以下是区域设置输出 LANG en US LC CTYPE C LC NUMERIC C LC TIME C LC COLLATE C LC MONETARY C LC MESSAG
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • 何时使用 pthread 条件变量?

    线程问题 看来 只有在其他线程调用 pthread cond notify 之前调用 pthread cond wait 时 条件变量才起作用 如果在等待之前发生通知 那么等待将被卡住 我的问题是 什么时候应该使用条件变量 调度程序可以抢占
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 如何检测并找出程序是否陷入死锁?

    这是一道面试题 如何检测并确定程序是否陷入死锁 是否有一些工具可用于在 Linux Unix 系统上执行此操作 我的想法 如果程序没有任何进展并且其状态为运行 则为死锁 但是 其他原因也可能导致此问题 开源工具有valgrind halgr
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • 应用程序无缘无故地被杀死。怀疑 BSS 高。如何调试呢?

    我已经在CentOs6 6中成功运行我的应用程序 最近 硬件 主板和内存 更新了 我的应用程序现在毫无理由地被杀死 root localhost PktBlaster PktBlaster Killed 文件和 ldd 输出 root lo
  • 如何禁用 GNOME 桌面屏幕锁定? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何阻止 GNOME 桌面在几分钟空闲时间后锁定屏幕 我已经尝试过官方手册了在红帽 https access redhat com doc

随机推荐

  • 数据清洗---数据整合

    数据整合可以使用Pandas库中merge 函数合并数据集 import pandas as pd 建两个数据集 df1 DataFrame lkey b b a c data1 range 4 df2 DataFrame rkey a b
  • 写selenium常用到的js代码

    selenium可以运行JavaScript代码 可以用一些JavaScript来辅助编写Selelnium代码 1 scrollIntoView 向下拉滚动条 使得某元素可见 IWebElement element driver Find
  • tensorflow NameError: name ‘layers‘ is not defined解决办法

    错误代码 import tensorflow as tf net layers Dense 10 net build 4 10 net kernel NameError name layers is not defined 错误原因 ten
  • 如何使用jquery通过id值修改指定的input的value值

    如何使用jquery通过id值修改指定的input的value值 定义和用法 示例代码 改变动态id的input值 定义和用法 val 方法返回或设置被选元素的值 元素的值是通过 value 属性设置的 该方法大多用于 input 元素 如
  • ant design pro v5 动态路由

    ant design pro v5 动态菜单 1 添加模拟数据 2 添加request请求 3 修改app tsx文件 a 第一步修改getInitialState b 第二步修改layout 4 app tsx 完整代码 5 解决icon
  • qt : day 3

    1 完成登录框的按钮操作 并在登录成功后进行界面跳转 pro QT core gui texttospeech greaterThan QT MAJOR VERSION 4 QT widgets CONFIG c 11 The follow
  • python研究生专业_用Python爬取了考研吧1000条帖子,原来他们都在讨论这些!

    写在前面 考研在即 想多了解考研er的想法 就是去找学长学姐或者去网上搜索 贴吧就是一个好地方 而借助强大的工具可以快速从网络鱼龙混杂的信息中得到有价值的信息 虽然网上有很多爬取百度贴吧的教程和例子 但是贴吧规则更新快 目的不一样 爬取的内
  • 移动Web开发入门(四) -- 移动端调试

    文章目录 移动端调试 浏览器调试 进入控制台 进入浏览器模拟器 切换测试机型 添加测试机型 改变屏幕尺寸 改变DPR 改变网络情况 改变屏幕显示大小 横 竖屏切换 真机测试 扩展 远程调试工具 vorlon js 多终端调试工具 brows
  • sql注入之报错注入

    报错注入 报错注入在没法用union联合查询时用 但前提还是不能过滤一些关键的函数 报错注入就是利用了数据库的某些机制 人为地制造错误条件 使得查询结果能够出现在错误信息中 这里主要记录一下xpath语法错误和concat rand gro
  • JVM三大子系统之类加载子系统(二)

    前置说明 由于个人能力有限 下面文章会大量整理 引用其他人的文章 我个人主要把这篇文章当成是自己的学习笔记 通过前面的文章 我们知道了 一段java代码是如何运行的 1 编译 程序员编写的java文件 编译成 class文件 2 加载 JV
  • 2027 转换字符串的最少操作次数

    题目描述 给你一个字符串 s 由 n 个字符组成 每个字符不是 X 就是 O 一次 操作 定义为从 s 中选出 三个连续字符 并将选中的每个字符都转换为 O 注意 如果字符已经是 O 只需要保持 不变 返回将 s 中所有字符均转换为 O 需
  • Angular2 http模块

    1 Http简介 互联网是构建在网络通讯协议的基础上 所有的信息 不管是音频 视频 图片 声音还是文本 都是通过网络进行传输 网站开发过程不可避免的会接触位于应用层的http https协议 这两种协议是构建与TCP IP的基础之上 RFC
  • 时序预测

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 内容介绍 时间序列流量的预测问题是近年来机器学习的一个热点问题 通过改变长短期记忆网络 LST
  • 如何查看mysql 的用户名和密码

    如何查看mysql 的用户名和密码 首先 这个是内部查看 意思就是登录了查看的 windo r 输入cmd 2 切换到 mysql bin 目录 3 登录 4 查看命令 select from mysql user
  • Ubuntu 16.04 Java8 安装

    添加ppa sudo add apt repository ppa webupd8team java sudo apt get update 安装oracle java installer sudo apt get install orac
  • Java class 中public、protected 、friendly、private的区别

    Java class 中public protected friendly private的区别 1 类 class 可见性修饰符 public 在所有类中可见 在其他包中可以用import导入 缺省 就是没有修饰符 在同一个包中的类中可见
  • CSS设置视频背景透明

    background 000 mix blend mode screen
  • git无法连接远程仓库(GitHub)

    问题描述 某一天 开开心心的写完了一篇博客 在向GitHub推送的时候突然报错了 乍一看 报错了 顿时 通过查阅资料尝试了几种方法之后解决了 在这做个记录 解决方法 首先需要检查一下SSH是否能够连接成功 输入以下命令 ssh T git
  • 已创建了一个包含学生学号、身高、性别的学生身高信息表并输出到屏幕,学生信息从records.txt文件读取。 编写一个函数 void reverse(Seqlist *lp); 功能是对已建立的学生身

    已创建了一个包含学生学号 身高 性别的学生身高信息表并输出到屏幕 学生信息从records txt文件读取 结构体数组版本 1 30 编写一个函数 void reverse Seqlist lp 功能是对已建立的学生身高信息表进行倒置 结果
  • 实验七、文件系统

    1 为 Ext4 文件系统添加扩展属性 扩展属性分为以下四种 1 扩展的安全属性 security 安全属性名称空间被内核用于安全模块 例如SELinux 对安全属性的读和写权限依赖于策略的设定 这策略是由安全模块载入的 如果没有载入安全模