如何编写预挂载启动脚本?

如何编写预挂载启动脚本?

我想创建一个启动脚本,在/安装根文件系统之前运行,因为我想用它dm-cache来缓存它。该脚本应该包含缓存设置命令。

我需要将这样的脚本放在哪里以及它需要具有什么格式?

我无法通过谷歌搜索找到任何有用的文档。

运行 Fedora 17,内核 3.9.10。

答案1

按照 dm-cache github 上的说明,要创建缓存,您需要加载内核模块 dm_mod 和 dm_cache(假设您已经有修补过的内核)此外,您还需要访问 dmsetup 可执行文件,并且可能您希望 /dev 成为已填充,以便您可以访问将在其上创建缓存的设备。

正如 cjm 已经提到的,要执行此操作,您需要修改 initramfs,它是在安装硬盘之前加载到内存中的文件系统。

幸运的是,dmsetup 已经安装在 initramfs 上(应该始终如此,因为卷管理需要它;但要检查,请使用“lsinitramfs /initrd.img | grep dmsetup”)

这留下了您必须添加到 initramfs 中的两件事:两个模块和用于创建缓存的脚本。对于模块,只需编辑 /usr/share/initramfs-tools/modules 或 /etc/initramfs-tools/modules

将引导脚本放置在 /usr/share/initramfs-tools/local-premount 或 /etc/initramfs-tools/local-premount 中。将其放入 local-premount 子目录将确保模块已加载且 /dev 已填充,但 / 尚未安装。该脚本可以是普通的 sh 脚本。使用 #!/bin/sh shebang 并且不要忘记使其可执行。我假设您知道如何自己编写(否则,请提供更多信息)

运行 update-initramfs -u 来应用更改,您应该已完成设置。确保您还有旧的内核可以在出现问题时启动。

阅读“man initramfs-tools”以获取有关如何使用 initramfs-tools 的一般说明

使用 dracut:

dracut 使用模块化系统来管理其启动过程。与 initramfs-tools 类似,它拥有一个名为 pre-mount 的钩子,您将需要使用它。要安装脚本,您需要定义一个使用此挂钩的模块:

mkdir /usr/lib/dracut/modules.d/40dm-cache

现在编辑文件 /usr/lib/dracut/modules.d/40dm-cache/module-setup.sh

#!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh
check() {
return 0
}

depends() {
return 0
}

install() {
inst_hook pre-mount 91 "$moddir/dm-cache.sh"
}

installkernel() {
instmods dm_mod
instmods dm_cache
}

和 /usr/lib/dracut/modules.d/40dm-cache/dm-cache.sh

#!/bin/sh
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh
modprobe dm_mod
modprobe dm_cache
***here you insert your caching code. As before, dmsetup should be available at /sbin/dmsetup***

如果让 check() 返回 255 而不是 0,则仅当 dracut 的配置文件中指定时才会加载该模块(通过返回 0,它将无条件加载)

现在更新 initrd:

dracut --force

dracut 参考指南:https://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html

相关内容