Cob*_*ast 3 linux startup fedora init-script
我想创建一个/在安装根文件系统之前运行的启动脚本,因为我想用dm-cache它来缓存它。该脚本应该包含缓存设置命令。
我需要把这样的脚本放在哪里,它需要什么格式?
我无法通过谷歌搜索找到任何有用的文档。
运行 Fedora 17,内核 3.9.10。
小智 7
按照 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 以应用更改,您应该已设置。如果出现问题,请确保您还有一个较旧的内核可以启动。
有关如何使用 initramfs-tools 的一般说明,请阅读“man initramfs-tools”
使用 dracut:
dracut 使用模块化系统来管理其启动过程。与 initramfs-tools 类似,它拥有一个名为 pre-mount 的钩子,您将需要使用它。要安装脚本,您需要定义一个使用此钩子的模块:
mkdir /usr/lib/dracut/modules.d/40dm-cache
Run Code Online (Sandbox Code Playgroud)
现在编辑文件 /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
}
Run Code Online (Sandbox Code Playgroud)
和 /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***
Run Code Online (Sandbox Code Playgroud)
如果让 check() 返回 255 而不是 0,则仅当在 dracut 的配置文件中指定时才会加载模块(通过返回 0,它将无条件加载)
现在更新initrd:
dracut --force
Run Code Online (Sandbox Code Playgroud)
dracut 参考指南:https : //www.kernel.org/pub/linux/utils/boot/dracut/dracut.html