从 initramfs 保存变量(在启动时)

从 initramfs 保存变量(在启动时)

在安装真正的文件系统之前,如何在启动时保存环境变量?

我知道/etc/environment但在 initramfs 中该文件还无法访问。我还想过编写一个文件来存储该值,但是当该文件在系统上存在时,它会在安装真实文件系统后被覆盖

Ps:我只想存储变量供以后使用,而不是在启动时读取它

回答后编辑

大约 :

  • 创建内核模块(查找帮助这里那里) 命名为mod.ko
  • 确保该模块在启动时可用(通过使用 initramfs-tools 将其包含在内核映像中或在文件系统中查找它)
  • 将以下行添加到您的脚本中

如果您尚未将该模块包含在内核映像中

insmod /path/to/mod.ko

否则直接

echo "env_var=value" > /proc/name_of_your_process

其中是模块name_of_your_process内部给出的名称(执行时)__initentry = proc_create("name_of_your_process",0777,NULL,&my_fops);

然后在脚本的启动过程中

cat /proc/name_of_your_process
>> env_var=value
rmmod mod.ko

答案1

好吧,常规环境继承(只需导出它......)在理论上是可行的,但是......问题是,无论你的初始化文件系统启动可能会故意清理环境,因为通常这样做是为了确保没有发生任何奇怪的情况。不检查环境变量可能会带来安全隐患。

我知道/etc/environment但在 initramfs 中该文件还无法访问。

有趣的部分是关于初始化文件系统就是你可以做任何你想做的事。唯一的限制是你的想象力。

您完全可以使该文件可访问。挂载、修改、卸载。或者,如果您使用的是传统文件系统 - 没有校验和 - 您甚至可以修改它没有安装任何东西(或者至少不在读写模式下)。 GRUB 对grubenv.

如果你不想弄乱文件系统或物理存储,你可以设置一个 ram 磁盘或 tmpfs 或循环设备或者...... initramfs 有无数种方法可以留下一些东西(你通常必须制作一个努力清理)。

答案2

当 initramfs 清理它运行的所有文件时交换机根目录这将删除除以下文件夹之外的所有文件:/proc、/dev、/sys 和 /run。可以在这些文件夹之一中创建一个特殊文件,但其中涉及一些技巧。

看:是否可以在/proc/sys中创建目录和文件?

当然,最简单的选择是在加载根文件系统之后但运行 init 之前添加一个脚本以将变量写入文件系统。这将进入“本地底部“文件夹。有什么理由不能这样做吗?

答案3

这很简单。看一下 fstab。然后安装根设备并将变量写入已安装的根设备上的文件中。我从 kdump 学到了这一点。

相关内容