【问题标题】:Linux Kernel init fails in encrypted filesystemLinux 内核初始化在加密文件系统中失败
【发布时间】:2015-09-14 03:36:39
【问题描述】:

我正在尝试为整个操作系统(启动、内核、根目录...)制作一个带有加密文件系统的 linux 操作系统

我修改了 EXT4 文件系统的读写函数。在运行大量测试后一切读写工作正常。

编辑:

我的更改是对文件内容的简单异或。

我的测试包括读/写文本文件、tar 存档 创建/删除,声音和视频文件创建/复制/删除和 一些压力测试。

this is dmesg says when trying to run a binary:

traps: a.out[2765] trap invalid opcode ip:400e73 sp:7ffc9f3d6f10 error:0 in a.out[400000+b4000]

下一步是在这个加密的文件系统上启动一个简单的基于 linux 的操作系统,我修改了 GRUB 2 引导加载程序,以便它从加密磁盘引导内核。 然后我遇到了这个问题:

  • grub 可以加载 linux 内核和内核启动,但是当它尝试运行 init 进程时,我得到内核恐慌并显示以下消息:“init Not tained”。

我可以从之前的消息中看到文件系统是由内核加载的,它实际上正在读取 init 文件但拒绝运行 init。

我的问题是:内核是否以任何其他方式读取初始化文件,而不是使用标准读取系统调用?我在这里做错了吗?

任何帮助将不胜感激

编辑:

现在的问题是:

如何通过映射内存来解密内核使用的数据?

【问题讨论】:

  • grub 可以在 luks 上处理开箱即用的 lvm,甚至 /boot;使用 GRUB_ENABLE_CRYPTODISK;阅读wiki.archlinux.org/index.php/GRUB以获得完整的解释
  • @gengisdave 问题不在于 grub。它正在工作并加载内核。问题是内核不运行init。我的加密方法是文件内容的简单按位。我没有使用任何标准的磁盘加密方法。
  • 所以如果我的理解是正确的,您可以从加密的 FS 手动启动任何应用程序,但是当您使用加密的 root 启动内核时,它无法启动 init?
  • @AlexHoppus 是的,我在安装有修改后的 ext4 模块的加密文件系统中测试了一些二进制文件(我的系统文件系统是 btrfs)。他们正在工作
  • 你试过这个特殊的初始化二进制文件吗?而杀戮的原因是什么,你能在日志中看到这个吗?

标签: linux encryption linux-kernel filesystems boot


【解决方案1】:

内核会将init 二进制文件映射到内存(即使用mmap())来执行它。如果您只测试过read(),这很可能是您的文件系统出现故障的地方。

【讨论】:

  • 实际上,read 是在 mmap 后面的(它将通过 page_fault 调用)
  • @duskwuff 正如 Alex Hoppus 所说,我也认为 read 落后于 mmap。
  • @duskwuff 感谢您的回答,您能告诉我一些关于这个主题(mmap())的信息以及它是如何完成的吗?一些在线资源或书籍将是完美的。实际上阅读了一些我认为正如 Alex Hoppus 所说的东西,mmap 实际上会导致正常的读取系统调用(我错了吗?)但我真的对内存映射的工作原理很感兴趣。
  • @duskwuff 看来我错了。内核没有对二进制文件使用正常读取。从我的文件系统运行脚本是可以的,但是当我尝试运行二进制文件时收到非法指令。
  • @duskwuff mmap 在这种情况下只是创建虚拟映射,因此它与实际数据操作没有任何共同之处,如果我错了,请纠正我。
猜你喜欢
  • 2011-09-20
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
相关资源
最近更新 更多