本文的任务是实现模块化编译ext4文件系统,主要是展示模块化编译文件系统的过程。
电脑上安装的是Windows 10+Ubuntu 17.10,Linux内核版本可以在终端输入uname -a或cat /proc/version查看自己的版本,最初的内核版本为4.13.0。以下为操作步骤:(建议都在root权限下执行命令,不然每一次输入命令都需要密码,比较麻烦,在终端下输入sudo su即可获取root权限)
(1)重新编译内核
首先需要下载Linux内核源码,一般来说下载自己当前正在使用的对应版本的Linux内核源码,可以避免一些不兼容的错误,我这里下载了版本为4.14.12的源码,推荐两种可靠的方式下载源代码,
一种是在Ubuntu上终端下输入apt-get install linux-source-4.13.0(后接版本号),下载的源码会放在/usr/src目录下;另一种是在网站上www.kernel.org上下载对应版本的Linux源代码。然后依照压缩文件后缀名解压文件即可。解压后的源代码我放在了usr/src/linux-4.14.12目录下,这个位置随意就行,如下
在linux-4.14.12目录下,输入make menuconfig。正常情况下会稍后弹出一个配置窗口,如果提示缺乏某些东西,使用apt-get install命令即,如下找到file system项,进入找到ext4,将前缀用空格键修改为M就行了,保存并退出。
在该目录下(usr/src/linux-4.14.12)执行make命令,可以使用-jn参数并行编译提高编译速度(n为并行数,推荐为CPU核心数的两倍)编译会花一些时间,取决于CPU性能,笔记本CPU为i7-6820HK,花了半个多小时。然后make modules编译模块,再make modules_install安装模块,再make install安装内核。
在终端下输入reboot重启系统。在grub界面选择Ubuntu高级选项,可以看到安装的新内核,选择新内核启动系统。
(2)文件系统重命名,做出修改
拷贝ext4文件系统的源码,放在其他位置,个人放置在/home下。修改Makefile文件,主要是针对ext4名称的修改,然后在末尾添加两项,如下:
所有ykext4的地方均是修改过的,这里随意命名。还需要指明编译的内核源码的路径,最后添加default和clean项,具体的可以学习Makefile文件的写法。
接下来修改super.c文件搜索找到ext4_fs_type,修改两处,原为ext4,改为ykext4,如下:
最后修改sysfs.c文件,搜索找到ext4_init_sysfs,修改一处,如下:
还修改了file.c,加上了printk函数用于测试新的文件系统。
(3)加载新的文件系统
在/home/ext4/目录下,即拷贝的路径,执行make clean,如Makefile文件中写到的,清除上一次编译产生的文件。最后执行make命令,运行结束时会生成ykext4.ko文件。在该目录下输入insmod ykext4.ko加载文件系统入内核,如果提示错误,可以使用dmesg- c查看错误信息。再输入lsmod可以查看,如下:
(4)挂载新的文件系统
在/dev目录下新建块设备文件YK,转到该目录下输入mknod -m 640 YK b 1 0,意思可以查阅一下mknod命令的使用。然后输入mkfs.ext4 YK格式化块设备文件。再在/mnt 目录下新建挂载点,这里个人建立了一个YK的文件夹,然后输入mount /dev/YK -t ykext4 /mnt/YK。挂载上之后,使用df -T -h可以查看挂载信息。
(5)测试
在/mnt/YK下新建YK.txt,向文件中写入任意内容后,保存退出。再输入dmesg -c命令可以查看打印信息,这里我加上了匹配hello,如下:
运行无误,如果使用dmesg -c,这里会打印出许多信息。要卸载文件系统,先使用umount命令,然后使用rmmod命令即可。
关于期间遇见的问题:
1.编译内核出现错误,原因有很多,可能是gcc版本问题,也可能是内部错误,这就不太好解决。另外,注意安装内核开发工具包。
2.编译后重启系统黑屏,过低的内核版本可能会出现这种情况,nvidia专有显卡驱动也可能导致黑屏,可以先卸载显卡驱动。
3.加载文件系统失败,愿因也很多,错误信息不同处理方式也不一样,可能是缺乏依赖项,比如mbcache,jbd2,可能是未动态加载文件系统,或者显示file exists,提示文件已在,表明新的文件系统与现在正在使用的ext4文件系统命名冲突,需要再次检查修改过的文件,重新编译。