我正在尝试为具有专用硬件的笔记本电脑创建一个小型救援分区(在所有其他系统和存储分区之后约 800MB 的备用空间),该硬件需要特殊的内核和内核模块,因此 Clonezilla Live 和 GParted Live 等常规救援工具无法很好地工作。该分区太小,无法包含我想要构建所需的模块和软件,因此系统的大部分需要在运行时压缩并加载到 RAM 中。此外,我更喜欢完全提取系统而不是依赖于squashfs
,并且我希望能够在分区允许的范围内保存对系统所做的更改。使用 Ubuntu 20.04 作为基础系统,我为此设计了以下方案:
- 在 中构建初始系统后
chroot
,创建一个空文件夹/ram
作为 的挂载点,用于在tmpfs
运行时存放解压后的系统和用户文件,将所有系统和用户文件夹(home
、usr
、var
、opt
、etc
ETC。) 并将/ram
其替换为指向 的符号链接/ram/$dir
。将其压缩/ram
为/ram.tar.gz
并将特殊挂载点(dev
、sys
、run
、tmp
和proc
)以及boot
单独保留在 上rootfs
。删除/ram/*
并将其写入rootfs
分区。 - 在启动时,在内核和
initrd
加载后,预挂载rootfs
,挂载tmpfs
在/ram
,然后将内容提取/ram.tar.gz
到/ram
。这必须在以 root 身份rootfs
替换之前完成initramfs
,否则rootfs
无法访问挂载/ram
和提取压缩档案所需的实用程序。 - 安装
rootfs
并继续启动。 - 关机时,备份
/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