将新文件系统编译到Linux内核中



我正在Debian上构建一个新的文件系统作为原型,因为现有的文件系统不能满足我的某些要求。它是用来评估我们的某些需求的原型。

为了做到这一点,我首先想到了以GitHub的testfs等文件系统为例来尝试编译它。我正在阅读我的文章中的步骤(e),但我不确定如何编译Linux。


到目前为止遵循的步骤:

我正试图使用为项目提供的MakeFile,但这是我得到的错误。

make -C /home/username/Workspace/testfs M=`pwd` modules
make[1]: Entering directory `/home/username/Workspace/testfs'
make[1]: *** No rule to make target `modules'. Stop.
make[1]: Leaving directory `/home/username/Workspace/testfs'
make: *** [testfs] Error 2

据我所知,它需要内核源代码(在我的/usr/src中)。

debian:testfs karun$l /usr/src/
total 74M
drwxr-xr-x  4 root root 4.0K Jan  8 18:34 linux-headers-3.2.0-4-686-pae
drwxr-xr-x  4 root root 4.0K Jan  8 18:34 linux-headers-3.2.0-4-common
lrwxrwxrwx  1 root root   23 Jun 24  2012 linux-kbuild-3.2 -> ../lib/linux-kbuild-3.2
-rw-r--r--  1 root root 122K Sep 18 20:20 linux-patch-3.2-rt.patch.bz2
lrwxrwxrwx  1 root root   25 Jan 10 20:21 linux-source -> /usr/src/linux-source-3.2
drwxr-xr-x 22 root root 4.0K Sep 18 20:20 linux-source-3.2
-rw-r--r--  1 root root  74M Sep 18 20:22 linux-source-3.2.tar.bz2
lrwxrwxrwx  1 root root   49 Jan  8 14:29 vboxguest-4.3.6 -> /opt/VBoxGuestAdditions-4.3.6/src/vboxguest-4.3.6

另一种尝试是尝试用FS代码编译内核,然后"安装"它

  • 我按照Debian页面上的说明编译了一个新的内核,从而获得了内核源代码
  • 我运行make menuconfig并进入"文件系统-->"部分

问题:如何使我的模块在menuconfig上可见,以确保它与源代码一起编译并部署?

我的最终目标是能够将驱动器(HDD卷或闪存驱动器)格式化为我的自定义文件系统(我们称之为CustFS,如NTFS或HFS:),用于存储数据,而不必在其上运行Linux操作系统。我已经尽了最大努力想出了实现这一点的步骤,但找不到合适的帮助。

据我所知,我需要做以下

  • 编写FS代码
  • 使用内核源代码进行编译
  • 部署新内核

FUSE,我相信,不会让我实现我想要的。我想在拇指驱动器上创建一个FS(作为测试),然后在HDD上创建,以便能够将其扩展到超过目前每个文件夹的文件限制(少数几个文件夹中的一个)。


环境详细信息:

  • 运行VirtualBox的Debian 7.3(喘息)
  • Linux内核版本3.2.0-4-686-pae(从uname -r转储)

如果您有任何其他问题或需要澄清,请告诉我。给我指一些我需要经历的教程/步骤真的会很有帮助。谢谢

附带说明,我是一名程序员,大部分时间都在Java上工作。我(相信)我在C/C++方面有相当的工作知识,并且可以根据需要在上面培养技能。这是我第一次尝试编译内核,我不知道如何向其中添加模块。

通常,首先要在FUSE中实现一个文件系统。这使您可以方便地在更容易使用的userland中进行开发。

几乎可以肯定,您可以在FUSE中做任何事情,不使用FUSE的主要原因是担心性能。ZFS和NTFS都是(或曾经)在FUSE中实现的。

如果你走内核路线,你会发现你的文件系统更难调试,开发过程也更复杂。如果您不知道userland和内核空间之间的真正区别是什么,请避免不惜一切代价制作内核模块。


更新:待清除;作为一个基于内核的文件系统,您可以在FUSE中做任何事情。使用内核模块,您永远不会直接从硬盘读取,而是从块设备读取,然后文件系统会对其进行解释并在其上提供文件接口。在FUSE中,您可以做完全相同的事情,唯一的区别是您的程序不是在内核空间中,而是在Userland中。

完全没有理由从内核模块开始开发新的文件系统,FUSE足够快,更容易,并且为测试和验证提供了更好的框架。

最新更新