学习的记录

一、内核安装

1.安装内核编译工具
install gcc gcc-c++ ncurses ncurses-devel cmake elfutils-libelf-devel openssl-devel 

将内核源码linux-4.14.160.tar拷贝到/usr/src/kernels目录下

cp -r linux-4.20.2.tar.xz /usr/src/kernels
2.进入内核源码所在的文件夹:
cd /usr/src/kernels
3.在该文件夹中解压缩下载的内核源码:
tar -xvf linux-4.20.2.tar.xz
4.进入源码文件夹:
cd linux-4.20.2
5.编辑内核配置文件
make menuconfig

make menuconfig 是一个用于配置 Linux 内核的命令。它是 Linux 内核源代码树中的一个配置工具,通过一个文本界面提供了一种交互式的方式来配置内核编译选项。

具体而言,make menuconfig 允许用户在编译 Linux 内核时选择不同的配置选项,以定制适合其特定硬件和需求的内核。这些选项可以包括支持的硬件设备、文件系统支持、网络协议、调试选项等。通过这个菜单式的配置工具,用户可以方便地浏览和修改各种配置选项,而无需直接编辑配置文件。

选择“General setup”->”Local version”,输入自定义的本地内核版本号用以区分,以“-xiyangyang”为例。然后返回主页面,选择“File systems”,确保选项The Extended 4(ext4)filesystem前面是M,即ext4文件系统为模块化加载,若不是选中按“M”键。最后选择“save”保存.config配置文件即可。

6.开始编译

编译文件(使用4个核心)

make -j4

 make -j4 是一个 make 命令的一种形式,其中的 -j4 参数表示同时并行运行 4 个任务。这个参数允许 make 在编译过程中同时处理多个文件,以提高编译速度。

在大型项目中,可能有很多文件需要编译,而这些文件之间可能存在依赖关系。通过并行运行多个任务,可以更有效地利用多核处理器的性能,加快整个构建过程。-j 参数后面可以跟一个数字,表示同时运行的任务数。在 make -j4 中,数字是 4,表示最多同时运行 4 个任务。如果你的计算机有更多的核心,你可以根据需要调整这个数字,以更好地利用计算资源。

7.安装模块:
make modules_install

make modules_install 是 Linux 内核源代码编译过程中的一个步骤,用于安装编译得到的内核模块。

在编译 Linux 内核时,内核模块通常是以动态链接共享库的形式存在的,而不是直接编译到内核中。这允许用户在运行时加载或卸载这些模块,以便根据需要扩展或减小内核的功能。

具体而言,make modules_install 会将编译好的内核模块复制到指定的目录,并可能更新相关的系统文件,以便系统能够正确地加载和使用这些模块。

8.安装内核:
make install 

 

make install 是在编译完 Linux 内核后,将编译好的内核及其相关文件安装到系统中的命令。这个命令的执行通常是在完成内核编译后,用于将编译得到的内核镜像文件(比如 vmlinuz)和相关的系统文件复制到适当的位置,以便系统能够启动并正确地加载新的内核。

9.重启并选择新内核:
reboot

 reboot 是一个用于重新启动计算机系统的命令。执行 reboot 将导致系统重新启动,关闭当前的会话,重新加载操作系统,并启动系统服务。

二、 新文件系统模块化

1.拷贝内核源码

拷贝内核源码文件夹下fs/ext4文件夹里的所有内容,放到其他位置。

( 1 ) 进入文件夹:

cd /usr/src/kernels/linux-4.20.2/fs

( 2 ) 复制该文件夹到/usr/src/kernels:

cp -r ext4 /usr/src/kernels/ext4edit 

3.代码修改

( 1 ) 打开ext4edit文件系统根目录下的Makefile文件,修改为:

obj-$(CONFIG_EXT4_FS) += ext4edit.o
ext4edit-y	:= balloc.o bitmap.o block_validity.o dir.o ext4_jbd2.o extents.o \extents_status.o file.o fsmap.o fsync.o hash.o ialloc.o \indirect.o inline.o inode.o ioctl.o mballoc.o migrate.o \mmp.o move_extent.o namei.o page-io.o readpage.o resize.o \super.o symlink.o sysfs.o xattr.o xattr_trusted.o xattr_user.o
KERNELDIR:=/usr/src/linux-4.14.160
PWD:=$(shell pwd)
ext4edit-$(CONFIG_EXT4_FS_POSIX_ACL)	+= acl.o
ext4edit-$(CONFIG_EXT4_FS_SECURITY)		+= xattr_security.o
default:make -C $(KERNELDIR) M=$(PWD) modules
clean:rm -rf *.o *.mod.c *.ko *.symvers

其中KERNELDIR变量为内核源代码位置,PWD变量为当前工作目录的绝对路径,也就是Ext4edit文件系统源码所在路径。在Makefile文件的最后再加上两行编译命令,用以编译模块和清除编译产生的文件。

( 2 ) 接着,找到文件夹里super.c,这是文件系统挂载是所要用到的文件。找到其中的结构体类型为file_system_type的变量 ext4_fs_type,修改其中的name字段和函数MODULE_ALIAS_FS()的参数为“ext4edit”。后者作用是设置模块别名。具体代码如下。

static struct file_system_type ext4_fs_type = {.owner		= THIS_MODULE,.name		= "ext4edit",.mount		= ext4_mount,.kill_sb	= kill_block_super,.fs_flags	= FS_REQUIRES_DEV,
};
MODULE_ALIAS_FS("ext4edit");

( 3 ) 然后找到sysfs.c文件,这是与顶层虚拟文件系统相关的文件。找到初始化函数ext4_init_sysfs(),修改里面第二行kobject_set_name()里的字段为“ext4edit”。具体代码如下。

int __init ext4_init_sysfs(void)
{int ret;kobject_set_name(&ext4_kset.kobj, "ext4edit");ext4_kset.kobj.parent = fs_kobj;ret = kset_register(&ext4_kset);if (ret)return ret;ret = kobject_init_and_add(&ext4_feat, &ext4_feat_ktype,NULL, "features");if (ret)kset_unregister(&ext4_kset);elseext4_proc_root = proc_mkdir(proc_dirname, NULL);return ret;
}

至此,基于Ext4的新文件系统Ext4edit改写完成。
( 4 ) 我们可以修改该文件系统的代码,实现自定义的功能。例如,在该文件系统中添加写缓存提示功能。这个功能需要用到file.c文件。找到该文件后在该文件里ext4_file_write_iter()函数,添加一条printk()语句,打印提示信息。该函数用于写文件时延迟分配磁盘空间时,将数据按字节写入页缓存。添加的语句如下。

printk("Method ext4_file_write_iter() in file.c."); 

三、模块编译及动态静态加载 

1. 编译模块

重新打开命令行,并输入su命令和root密码获取超级权限。将文件系统的源码拷贝到/usr/src/目录下。
( 1 ) 进入模块文件夹:

cd /usr/src/kernels/ext4edit

( 2 ) 编译模块:

make

2.加载文件系统

insmod ext4edit.ko

如出现“Unknown symbol“错误,使用modinfo ext4edit.ko命令,查看模块信息,信息中有depends一项表示依赖的模块,使用modprobe先加载依赖的模块即可。Ext4edit文件系统依赖于mbcache和jbd2两个模块。

3.挂载文件系统

( 1 ) 进入/dev目录:

cd /dev

( 2 ) 创建块设备文件:

mknod -m 640 xiyangyang b 1 0

( 3 ) 格式化块设备文件

mkfs.ext4 xiyangyang

( 4 ) 进入/mnt目录:

cd /mnt

( 5 ) 创建xiyangyang文件夹:

mkdir xiyangyang

( 6 ) 挂载文件系统:

mount /dev/xiyangyang -t ext4edit /mnt/xiyangyang

( 7 ) 查看挂载信息:

df -T -h

执行结果的最后一条显示文件系统类型为ext4edit的文件系统已挂载在/mnt/yoching目录下,说明挂载完成。

进入/mnt/yoching目录下,使用“vim hello.txt”创建并打开名为hello.txt的文本文件,切换为INSERT模式写入“hello”,并按ESC,键入“:wq”保存并退出。输入“dmesg -c”查看后台信息,查看结果如下图所示。

4.卸载文件系统

( 1 ) 卸载文件系统:

umount  /mnt/xiyangyang

( 2 ) 移除模块:

rmmod ext4edit

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

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

相关文章

结构体与函数简单总结(依靠洛谷结构体题与函数题单)

函数结构体简单总结 依靠洛谷函数与字符串题单 文章目录 函数结构体简单总结前言一、函数1、有返回值的函数2、无返回值函数3、递归函数 二、结构体总结 前言 之前总结了字符串的简单应用,随着函数与结构体的题单完成,入门题单也就刷完了,现…

你可能不知道的5款好用封面设计工具,快来一探究竟吧!

我相信每个作者和出版商都希望在一部作品完成后有一个醒目的封面,这样潜在的读者就会有足够的好奇心拿起这本书,你的书的销量就会上升。这就是封面设计软件的使用,专业的封面设计软件可以增加前沿效果,呈现最适合书籍内容的创意布…

Tailscale:随时随地远程和使用服务器

Tailscale是什么? 网上有时候提到tailscale,总是介绍好多,比如以下介绍,但是太官方了 Tailscale 是一种基于 WireGuard 的虚拟组网工具,和 Netmaker 类似,最大的区别在于 Tailscale 是在用户态实现了 Wire…

NSSCTF 1zjs

开启环境: 搞就完事了,别玩魔法! 源码打开 点击访问:./dist/index.umd.js" 搜索php,找到23条相关的,注意到有一个特别的信息: PERFORMANCE OF THIS SOFTWARE.Your gift just take it : /fk3f1ag.php 访问: node4.anna.nssctf.cn:28325/fk3f1ag.php 得到这样: ([![]…

【每日试题】精选Java面试题八股文

题目1:什么是Java的泛型?请举例说明。 答案:Java的泛型是一种参数化类型的概念,可以在类、接口和方法中使用。使用泛型可以在编译时进行类型检查,提高程序的安全性和可读性。例如,可以定义一个泛型类List来…

ubuntu系统上安装virtualenv后报错“Command ‘virtualenv‘ not found”

前言 Ubuntu系统上,由于不同用户可能会导致依赖包安装后,无法正常加载命令,就比如, pip3 install virtualenv后,报错:Command virtualenv not found, but can be installed with 这是由于当前用户安装依赖…

【高录用-快速见刊-EI稳定检索】2024年计算机建模与信号处理国际学术会议(ICCMSP 2024)

【高录用-快速见刊-EI稳定检索】2024年计算机建模与信号处理国际学术会议(ICCMSP 2024) 2024 International Conference on Computer Modeling and Signal Processing 一、【会议简介】 尊敬的各位专家、学者和与会嘉宾: 欢迎来到2024年计算…

opencv期末练习题(3)附带解析

创建黑色画板,并支持两种画图功能 import mathimport cv2 import numpy as np """ 1. 创建一个黑色画板 2. 输入q退出 3. 输入m切换画图模式两种模式,画矩形和画圆形。用户按住鼠标左键到一个位置然后释放就可以画出对应的图像 "&qu…

Could not resolve all dependencies for configuration ‘:classpath‘

报错解析: 问题是与构建配置和依赖解析有关的,特别是在使用Maven或Gradle这样的构建工具时 报错解决: 该方法在网上经过多个参考后认为对我自己有用的方法,就是将maven镜像的http改为https

静态库与动态库

这里写目录标题 静态库与动态库简介 静态库简图制作与使用总览制作 二级目录 动态库(共享库)简图二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 静态库与动态库 简介 静态库&…

python 画图转化为html

优点:画图转化为html可以手动拖动。并且可以放大缩小 示例一 import matplotlib.pyplot as plt import mpld3# 准备数据和图表 x [1, 2, 3, 4, 5] y [2, 3, 5, 7, 11]fig, ax plt.subplots(figsize (10,10)) ax.plot(x, y, o-, labelData Points) ax.set_xlabe…

访问学者J1签证的申请流程

访问学者J1签证是许多人前往美国进行学术研究和文化交流的重要途径之一。申请J1签证需要经过一系列步骤和程序,让知识人网小编带大家来了解一下申请流程吧。 首先,申请者需要确认自己符合J1签证的资格要求。这包括被美国的赞助机构或组织接受&#xff0c…

微前端 Micro App

MicroApp 官网链接 MicroApp 链接

使用jieba库进行中文分词和去除停用词

jieba.lcut jieba.lcut()和jieba.lcut_for_search()是jieba库中的两个分词函数,它们的功能和参数略有不同。 jieba.lcut()方法接受三个参数:需要分词的字符串,是否使用全模式(默认为False)以及是否使用HMM模型&…

C++ DAY5 作业

1.全局变量,int monster 10000;定义英雄类hero,受保护的属性string name,int hp.int attck;公有的无参构造,有参构造,虚成员函数void Atk()blood-0;},法师类继承自英雄类,私有属性int ap_atk50…

CyberLink的颜色修正软件ColorDirector Ultra 2024 12.0版本在windows系统下载与安装配置

目录 前言一、ColorDirector Ultra 安装二、使用配置总结 前言 ColorDirector Ultra是由CyberLink公司开发的一款专业的颜色修正和调整工具,可以帮助用户实现对视频中颜色的全方位管理。该软件支持对各种分辨率的视频进行颜色调整,并且可以从各种设备&a…

QT系统移植教程

QT系统移植教程 QT系统移植教程 qt教程: http://www.qter.org/portal.php?modview&aid5 下载源码: http://download.qt.io/archive/qt/5.4/5.4.2/single/ 解压源码: tar -xvf qt-everywhere-opensource-src-5.4.2.tar.x…

【hive】报错累积

6.1 创建新表 错误1:FAILED: SemanticException [Error 10006]: Line 1:63 Partition not found "20210919" 场景:在创建例行表时,报错。这种情况是先创建了多级分区表(date,product)&#xff0c…

Ubuntu 20.04 上安装和使用 Docker

Ubuntu 20.04 上安装和使用 Docker 在 Ubuntu 上安装 Docker 非常直接。我们将会启用 Docker 软件源,导入 GPG key,并且安装软件包。 一、开始安装 首先,更新软件包索引,并且安装必要的依赖软件,来添加一个新的 HTTP…

Spring学习目标

Spring概述Spring IOC[重点]基于注解的IOC配置Spring AOP[重点]基于注解的AOP配置Spring整合MyBatisSpring事务控制[重点]基于注解的事务控制