您的位置:首页 > 其它

Ubuntu17.10上模块化编译ext4文件系统

2018-01-26 14:40 337 查看
       这是首次在CSDN上发表博客,有些地方叙述不当还请理解,由于本人也是初入Linux,对其中某些地方描述不准确还请

指正。那么接下来进入正题。

 本文的任务是实现模块化编译ext4文件系统,整篇文章中涉及到一些基本的Linux操作命令就简单带过了,主要是模块

化编译文件系统的过程。

 先说说环境,我在网上查阅了很多资料,也找了很多相关的Linux书籍,发现一个问题就是很多资料都比较老了,毕竟

现在软件更新的速度比较快,由于找的资料很多都是内核版本为2.x,3.x。对于现在正在使用新版的Ubuntu,CentOS的用

户来说,使用起来确实比较麻烦,所以我决定利用最新版的Ubuntu来进行模块化编译文件系统,为后来的伙伴们留一份参

考资料。个人电脑上安装的是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文件

系统命名冲突,需要再次检查修改过的文件,重新编译。

4.使用CentOS与使用Ubuntu来模块化编译文件系统还是略有区别。如果是Ubuntu 16的话,出现的问题还是比

17少得多,个人做过测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: