我刚刚做了一个小实验:我配置了一个几天前安装的 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
选项足以使访问时间每次都更新;所以我认为解释一下会很好。