用于在 tmpfs 上挂载压缩文件夹的 Initramfs-tools 脚本

用于在 tmpfs 上挂载压缩文件夹的 Initramfs-tools 脚本

我正在尝试为具有专用硬件的笔记本电脑创建一个小型救援分区(在所有其他系统和存储分区之后约 800MB 的备用空间),该硬件需要特殊的内核和内核模块,因此 Clonezilla Live 和 GParted Live 等常规救援工具无法很好地工作。该分区太小,无法包含我想要构建所需的模块和软件,因此系统的大部分需要在运行时压缩并加载到 RAM 中。此外,我更喜欢完全提取系统而不是依赖于squashfs,并且我希望能够在分区允许的范围内保存对系统所做的更改。使用 Ubuntu 20.04 作为基础系统,我为此设计了以下方案:

  1. 在 中构建初始系统后chroot,创建一个空文件夹/ram作为 的挂载点,用于在tmpfs运行时存放解压后的系统和用户文件,将所有系统和用户文件夹(homeusrvaroptetcETC。) 并将/ram其替换为指向 的符号链接/ram/$dir。将其压缩/ram/ram.tar.gz并将特殊挂载点(devsysruntmpproc)以及boot单独保留在 上rootfs。删除/ram/*并将其写入rootfs分区。
  2. 在启动时,在内核和initrd加载后,预挂载rootfs,挂载tmpfs/ram,然后将内容提取/ram.tar.gz/ram。这必须在以 root 身份rootfs替换之前完成initramfs,否则rootfs无法访问挂载/ram和提取压缩档案所需的实用程序。
  3. 安装rootfs并继续启动。
  4. 关机时,备份/ram.tar.gz/ram.tar.gz.bak然后将修改后的压缩/ram/ram.tar.gz。这可以使用 来实现systemd

显然,第 4 步可能会出错,因此第 2 步需要包含完整性,/ram.tar.gz并在失败时加载备份,但这应该只是脚本中包含的几个附加命令initramfs-tools,超出了我的问题的范围,即:

如果不更改/usr/share/initramfs-tools/init,我该如何创建脚本来/etc/initramfs-tools/scripts完成第 2 步?命令应该很简单,

mount -t tmpfs -o $OPTIONS none /ram
tar xvzf ram.tar.gz

但是我有点不知道应该在哪个文件夹中包含脚本(init?local?top?bottom?premount?)以及如何使用PREREQ脚本本身中的标题。

答案1

事实证明这非常简单。创建:

/etc/initramfs-tools/scripts/local-bottom/ramfiles
#!/bin/sh

set -e

PREREQ=""

prereqs()
{
        echo "${PREREQ}"
}

case "${1}" in
        prereqs)
                prereqs
                exit 0
                ;;
esac

mount -t tmpfs -o size=100% none ${rootmnt}/ram
tar xvzf ${rootmnt}/ram.tar.gz -C ${rootmnt}


然后

sudo chmod +x /etc/initramfs-tools/scripts/local-bottom/ramfiles
sudo update-initramfs -u

相关内容