如何让 Ubuntu 具备“防断电”功能?

如何让 Ubuntu 具备“防断电”功能?

我喜欢运行一个无人值守的系统以供每天的“信息亭”使用。

但是,系统可能随时关闭,而无需事先进行正确的关机。默认情况下,Ubuntu 不会因断电而关闭。断电后重新启动后,可能会运行 fsck 来检查文件系统,并且 fsck 可能会在完成后告诉系统重新启动。因此,即使没有配置数据损坏,机器在断电后也可能无法正常启动。所以我测试了一些解决方法:

  1. 将 root 挂载 fsck 优先级更改为0fstabroot 条目中的最后一个字段),以防止fsck每次断电后运行。但是,系统可能会在 root 以只读方式挂载的情况下启动,这是许多服务所不希望的,并导致控制台登录提示而不是图形登录。

  2. 替换errrors=remount-roerrors=continue。这给人一种不好的感觉,即不一致的文件系统可能会导致进一步的数据丢失。但是,fsck再次启用后,它应该会增加断电后系统的启动可能性。所以我放弃了 1)。

  3. 重新配置 grub2 以在启动失败后使用正常的默认选项超时。为此,我已添加GRUB_RECORDFAIL_TIMEOUT=0/etc/default/grub

但是,很难知道这些黑客是否能让系统防断电。有什么想法吗?还有什么可以做的吗?

答案1

对于自助服务终端应用程序,使用只读根分区可以解决该问题。此外,用户所做的或保存的任何更改都会在下次重新启动时被撤消。

为了满足大多数应用程序的可写根需求,可以使用 overlayfs 将只读分区与可写 ram tempfs 覆盖。

有一个脚本可以帮助在底部创建这样的设置https://help.ubuntu.com/community/aufsRootFileSystemOnUsbFlash。脚本包含设置该功能的说明:

  • 将文件放入 /etc/initramfs-tools/scripts/init-bottom/root-ro
  • sudo chmod 0755 root-ro
  • sudo update-initramfs -u

我建议也添加GRUB_RECORDFAIL_TIMEOUT=0/etc/default/grub运行sudo update-grub,否则启动菜单可能会在没有超时的情况下出现。

之后,重新启动。然后机器以只读模式启动,可以通过 检查 mount。任何更改都将在下次重新启动时消失。要进行任何更改、安装软件和更新等,您只需进入 GRUB 菜单,按e更改启动命令行,然后附加disable-root-ro=true到以 kernel 开头的行。按 F10 继续启动。然后您可以使用mount确认 root 已像往常一样可写安装。进行更改并重新启动,系统再次变为只读。

答案2

有时候,在进行不正常重启(例如断电或按下重置按钮,甚至内核崩溃)后,系统将无法启动,并要求您按“y”进行 fsck 来修复分区。

如果您想避免这种情况,请编辑 /etc/default/rcS 并更改:

FSCKFIX=no

到:

FSCKFIX=yes

这将确保此修复自动运行而无需提示您。

缺点可能是您可能会丢失数据,如果硬盘上有任何未备份的重要数据,您可能需要先取出硬盘并克隆它。

例如,如果您的硬盘控制器出现故障,并且 fsck 错误地将该分区识别为损坏并尝试修复它,则可能导致原本可以避免的数据丢失。我自己从未遇到过这种情况,在过去 7 年左右的时间里处理过近一千台服务器 - 但这仍然是需要牢记的事情。

答案3

从今天起,对于自助服务终端只读解决方案,也可以overlayroot通过以下方式安装该包

sudo apt-get install overlayroot

这将很容易提供一个完整的解决方案,就像批准的答案一样。它还允许有益的命令

sudo overlay-chroot

这将登录到将以前的只读基础磁盘安装在 上的 shell /。然后可以对受保护的系统进行任何更改,例如使用 将apt-get软件包安装到以前的只读磁盘。但是,退出 shell 后强烈建议重新启动,因为 RAM 上临时覆盖的文件可能会掩盖新安装的文件。

相关内容