有没有一种方法可以等待根文件系统被挂载?

3
我有一个在内核中静态链接的代码(不是模块),它应该在根文件系统挂载后启动内核线程。问题是我不知道如何在不修改prepare_namespace()内核函数的情况下实现这一点。我认为可以通过initcalls来实现,但是它们在内核处理rootfs之前执行。是否有人知道最好的方法?
更新[1]:@BenVoigit在评论中提出了以下解决方案:似乎应该打开/proc/mounts并在其上进行poll_wait。查看“mounts_poll”的源代码 更新[2]:我查看了RSBAC补丁,RSBAC修改prepare_namespace()函数以执行一些在文件系统挂载后的操作。这似乎是最简单的方法。

什么平台和引导程序? - Paulo Scardine
也许你可以不要考虑“等待”的概念,而是在启动时执行一些操作,在文件系统被(重新)挂载时执行更多的操作。 - Ben Voigt
@BenVoigt 好的,无论如何我需要以某种方式获取“事件”(或通知),表明文件系统已经挂载。这样我的线程就有能力从中读取一些数据了。 - Dan Kruchinin
1
@Dan:看起来你应该打开/proc/mounts并在其上使用poll_wait。请查看[`mounts_poll'](http://lxr.linux.no/linux+v2.6.37/+code=mounts_poll)的源代码。 - Ben Voigt
@BenVoigt 谢谢!这似乎是一个可接受的解决方案。我希望可以通过通知器或类似的方式更轻松地实现它,但并非我们所有的希望都能实现 :( - Dan Kruchinin
@Dan:好的一面是,如果你的数据实际上不在根文件系统中,这仍然可以工作。 - Ben Voigt
1个回答

0

目前的Linux映像太大了,无法适应PC引导扇区。现代的引导加载程序(如grub)会在真正的文件系统之前挂载一个小型的RAM文件系统。

为了了解底层发生了什么,您可以打开位于/boot下的磁盘映像。例如,在Ubuntu中:

mkdir test
cd test
zcat /boot/initrd.img-2.6.35-24-generic > image.cpio
cpio -i < image.cpio
vim init

最终,这只是一堆shell脚本 - 其简单几乎是诗意的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接