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
cd /usr/src/kernels
tar -xvf linux-4.20.2.tar.xz
cd linux-4.20.2
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配置文件即可。
编译文件(使用4个核心):
make -j4
make -j4
是一个make
命令的一种形式,其中的-j4
参数表示同时并行运行 4 个任务。这个参数允许make
在编译过程中同时处理多个文件,以提高编译速度。在大型项目中,可能有很多文件需要编译,而这些文件之间可能存在依赖关系。通过并行运行多个任务,可以更有效地利用多核处理器的性能,加快整个构建过程。
-j
参数后面可以跟一个数字,表示同时运行的任务数。在make -j4
中,数字是 4,表示最多同时运行 4 个任务。如果你的计算机有更多的核心,你可以根据需要调整这个数字,以更好地利用计算资源。
make modules_install
make modules_install
是 Linux 内核源代码编译过程中的一个步骤,用于安装编译得到的内核模块。在编译 Linux 内核时,内核模块通常是以动态链接共享库的形式存在的,而不是直接编译到内核中。这允许用户在运行时加载或卸载这些模块,以便根据需要扩展或减小内核的功能。
具体而言,
make modules_install
会将编译好的内核模块复制到指定的目录,并可能更新相关的系统文件,以便系统能够正确地加载和使用这些模块。
make install
make install
是在编译完 Linux 内核后,将编译好的内核及其相关文件安装到系统中的命令。这个命令的执行通常是在完成内核编译后,用于将编译得到的内核镜像文件(比如 vmlinuz)和相关的系统文件复制到适当的位置,以便系统能够启动并正确地加载新的内核。
reboot
reboot
是一个用于重新启动计算机系统的命令。执行reboot
将导致系统重新启动,关闭当前的会话,重新加载操作系统,并启动系统服务。
拷贝内核源码文件夹下fs/ext4
文件夹里的所有内容,放到其他位置。
( 1 ) 进入文件夹:
cd /usr/src/kernels/linux-4.20.2/fs
( 2 ) 复制该文件夹到/usr/src/kernels:
cp -r ext4 /usr/src/kernels/ext4edit
( 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);
else
ext4_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.");
重新打开命令行,并输入su命令和root密码获取超级权限。将文件系统的源码拷贝到/usr/src/目录下。
( 1 ) 进入模块文件夹:
cd /usr/src/kernels/ext4edit
( 2 ) 编译模块:
make
insmod ext4edit.ko
如出现“Unknown symbol“错误,使用modinfo ext4edit.ko命令,查看模块信息,信息中有depends一项表示依赖的模块,使用modprobe先加载依赖的模块即可。Ext4edit文件系统依赖于mbcache和jbd2两个模块。
( 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”查看后台信息,查看结果如下图所示。
( 1 ) 卸载文件系统:
umount /mnt/xiyangyang
查看特定的文件系统是否已经卸载,可以在
mount
命令中加上文件系统的挂载点mount grep /mnt/xiyangyang
这个命令将会在所有已经挂载的文件系统中搜索"/mnt/yoching"挂载点,并输出相关信息。如果该挂载点没有被找到,说明文件系统已经成功卸载。
( 2 ) 移除模块:
rmmod ext4edit