我想创建一个方便的解决方案,用于完整系统(root-on-ZFS)备份。这个想法是在启动时(在写入 FS 之前)或作为关机过程的最后一步创建整个系统的快照。这样,我想保证 FS逻辑上zfs send
一致,即快照代表冷 FS 的状态(没有任何未完成的进程)。稍后,如果需要,可以将此快照备份到另一个位置。
再次强调,我们的想法是,不仅要保证所有 I/O 操作都已完成且一致,还要保证所有进程都已完成,因此 FS 状态在全局和逻辑上是一致的。例如,不可能出现某个程序已写入文件并a
进入快照,但b
一微秒后才完成写入文件,因此b
快照中不存在文件,而对于程序操作,文件必须同步。
编辑:我的发行版是 Arch Linux
答案1
我满足您的要求的方法是,在任何可能写入文件系统的进程启动之前,从 initrd(又名 initramfs)启动期间创建快照。(假设这是一个使用 initrd 的“正常”Linux 安装。)不幸的是,您没有提到您正在使用哪个 Linux 发行版,因此我无法为您提供有关如何将您自己的步骤添加到 initrd 的更具体的建议,因为不同的发行版执行方式不同。例如,在 Arch Linux 和衍生产品上,您将在 /etc/initcpio/hooks 中创建一个自定义 mkinitcpio 钩子,并将其添加到 /etc/mkinitcpio.conf 文件中的“hooks”行(请参阅https://wiki.archlinux.org/title/mkinitcpio)。您的自定义钩子只需在导入 ZFS 池后创建快照,以便在 initrd 将控制权移交给常规系统启动过程之前创建快照。其他发行版有其他方法将步骤添加到 initrd。
一些建议:询问 Linux 问题时,最好提供比此处提供的更多详细信息。最重要的是,您应该提到您正在使用的 Linux 发行版。最好尽可能多地添加有关系统的一般信息,以防有人试图回答您的问题时有所帮助。对于有关文件系统的问题,磁盘分区表类型(DOS 或 GPT)、可能相关的磁盘分区、是否使用任何形式的 RAID 或镜像、是否使用任何类型的加密、是否使用 LVM 等信息可能会有所帮助。对于您的具体问题,其他信息(例如您的池中是否有多个文件系统和多个挂载点以及您是否使用 ZFS 的自动挂载或传统挂载)也会有所帮助。希望这对您有所帮助!
答案2
对于我自己的文件系统设置,我考虑了同样的问题,并决定您建议的“逻辑一致”属性并不像听起来那么重要。任何严重依赖于两个文件保持同步的程序(如您的a
/b
示例)都必然无法承受断电、内核崩溃、OOM 终止以及程序可能突然中断而没有机会恢复的任何其他原因。由于我的系统确实会不时出现断电和 OOM 终止,并且根据经验仍然有效,因此我开始假设我使用的软件通常可以轻松地在任意操作时刻的文件系统状态下启动。
因此,我建议不要采取任何特殊措施来确保文件系统快照是在任何其他进程写入文件系统之前或之后拍摄的。我从我的正常启动脚本中获取快照(我有一个 systemd 单元执行此操作),并相信可以启动到该快照,原因与我相信在启动过程中断电后可以启动到我的系统是相同的。