Linux 系统启动顺序有多确定?

Linux 系统启动顺序有多确定?

我刚刚做了一个小实验:我配置了一个几天前安装的 vanilla Ubuntu Linux,并atime为根​​文件系统设置了 mount 选项。然后我重启了几次,运行了一些开箱即用的应用程序,最后正常关闭了它。
然后我从某个实时映像启动了机器,并从 Ubuntu 中删除了过去几天未访问的任何文件。然后我尝试重新启动 Ubuntu。它在早期启动时无法黑屏。

我重复了几次实验,仔细检查了 fs 设置,并为保存的文件引入了一个增加的过去时间窗口。我从未设法让 Ubuntu 启动到 Unity。

哪些启动所需但从未访问过的关键文件可能丢失了?

答案1

哪些启动所需但从未访问过的关键文件可能丢失了?

我认为这与“从未访问过”无关,而是“无法存储它们的新访问时间”,因为一般来说,启动过程的某些阶段以只读方式读取文件系统。

这并不是故意绕过该atime功能。访问时间未更新只是初步只读安装的副作用(要存储新的访问时间,您需要写入它,对吗?)。我预计它尤其适用于和initrd,但根文件系统最初也是以只读方式安装的:vmlinuz/boot

因此,内核初始化设备,将引导加载程序指定的根文件系统挂载为只读,并运行 Init(/sbin/init)...

来源

然后,无论充当 Init 的角色(它systemd在 Ubuntu 中)都会在某个时候将文件系统重新挂载为读写。为了systemd

systemd-remount-fs.service是一项早期启动服务,它将列出的挂载选项fstab(5)应用于根文件系统 [...]

因此,当我读到您的这句话:“它在早期启动时无法黑屏”时,我猜您删除了一些只需要在这些早期只读启动阶段访问的文件,而此时 atime 无法更新。


另一个陷阱(最终似乎与您的情况无关,但了解一下还是有好处的):

man 8 mount[强调我的]:

atime

不要使用该 noatime 功能,因此 inode 访问时间由内核控制默认值relatime。另请参阅和mount 选项的描述strictatime

relatime

更新相对于修改或更改时间的 inode 访问时间。仅当上次访问时间早于当前修改或更改时间时,才会更新访问时间。(类似于noatime,但它不会破坏mutt或其他需要知道文件自上次修改以来是否已被读取的应用程序。)

从 Linux 2.6.30 开始,内核默认采用此选项提供的行为(除非noatime已指定),并且该strictatime选项是获取传统语义所必需的。此外,自 Linux 2.6.30 起,如果文件的最后访问时间超过 1 天,则始终会更新该文件的最后访问时间。

这种“1 天前”的条件以及“几天前安装的”操作系统,以及删除“最近几天未访问的”文件——relatime我认为,所有这些都使默认设置与您的问题无关。不过,您可能认为atime选项足以使访问时间每次都更新;所以我认为解释一下会很好。

相关内容