我有一个 Ubuntu 系统,主要用作无头设备,并且需要从突然断电中正常恢复并开始正常运行。
我知道 overlayfs 是可行的方法,但我仍然需要记录和存储数据,包括崩溃和日志等系统日志。
如果我理解正确的话,我不能简单地在根目录下设置一个目录并使其可读/写 - 我需要一个带有单独文件系统的单独分区来进行日志记录和数据收集,这样如果它确实损坏了,我仍然可以启动到根目录,检测情况,并对数据分区进行 fsck。
- 我的理解正确吗?我还应该考虑其他选择吗?
- Ubuntu 已经安装并运行(预建系统),如何在不完全重新安装的情况下实现此目的?
- 查找日志和崩溃日志是否足够,或者在这些类型的情况下是否还有其他系统日志记录过程通常也会保留?
- 有这方面的指南吗?我见过的指南一般都介绍了 overlayfs,或者具体介绍了没有日志记录的 overlayfs 的实现,但我还没有见过详细讲述日志记录的 overlayfs 的指南或脚本,只能单独搜索每个部分。
这些系统使用桌面 ubuntu,偶尔会使用图形界面,但我希望最终能够实现配置和安装的自动化,因此虽然图形工具可以,但命令行配置更受欢迎。
答案1
使用 Ubuntu LiveUSB,运行 gparted 来缩小现有的 ext4 分区并创建一个新分区,这里的名称和标签都称为“data-rw”。
重启。
该分区将在启动时自动挂载,可能位于/media/user/data_rw
。现在我们有了第二个驱动器,让我们将日志文件移到它。几乎所有的日志记录都已完成/var/log
,因此让我们在第二个驱动器上创建一个新目录并将其绑定在那里。
在新分区上创建日志目录,将现有文件与用户和权限同步,并在 fstab 中绑定,以便它在启动时自动执行:
sudo mkdir /media/user/data_rw/log
sudo rsync -a --include '*/' --exclude '*' /var/log/ /media/user/data_rw/log/
sudo nano /etc/fstab
将这些行添加到末尾(根据需要更改设备名称):
/dev/sda3 /media/user/data_rw ext4 rw,nosuid,nodev,relatime,data=ordered 0 2
/media/user/data_rw/log /var/log none rw,bind 0 0
我们想强制对可写分区进行磁盘检查,并自动纠正错误。理论上,这应该可行,但不清楚在我的情况下是否可行,所以考虑进一步研究。编辑
/etc/default/grub
并找到带有 的行GRUB_CMDLINE_LINUX_DEFAULT
,然后添加fsck.mode=force fsck.repair=yes
到该行。执行sudo update-grub
以将更改写入引导加载程序安装 overlayfs,
sudo apt-get install overlayroot
并编辑/etc/overlayroot.conf
将 overlayroot 选项更改为overlayroot="tmpfs:swap=1,recurse=0"
这将导致 overlayroot 仅覆盖根驱动器,而不覆盖其他任何驱动器,从而使我们的 data_rw 驱动器保持不变。
现在重新启动,您应该发现添加文件到~/
将在下次启动时消失,但添加文件到/media/user/data_rw
或/var/log
将在启动后持续存在。
使用时journalctl
您会发现日志在启动时仍然存在,并且如果您的系统崩溃,您/var/log
甚至在重新启动后也会发现崩溃日志。
如果您需要更改受保护的文件系统,请重新启动,当 grub 启动时按下e
编辑 grub 启动脚本。在 linux 行上添加overlayroot=disabled
到末尾。这将一直有效,直到重新启动。如果经常需要,您可以添加新的 grub 引导加载程序选项。
由于永远不会对只读根分区进行写入,因此它永远不会显示错误,并且在突然断电后应该可以正常重新启动。但是,data_rw 分区可能有未完成的写入。fsck 应该可以修复该问题,但在最坏的情况下,驱动器不会在启动时安装,绑定不会发生,并且日志将写入覆盖层,而不会被保留。但是,系统仍将继续运行,如果这是迫切需要,您可以使用脚本或软件检测这种情况并采取行动。
您可以直接写入 /media/user/data_rw,也可以使用 systemd 日志服务来捕获日志。
这一问题的答案很大程度上可以归功于以下资源:
https://spin.atomicobject.com/2015/03/10/protecting-ubuntu-root-filesystem/