为什么linux在断电后无法重新启动,例如在Raspberry上

为什么linux在断电后无法重新启动,例如在Raspberry上

我在 Raspberry Pi 3b+ 上工作,我想工业化一个 Raspberry(不要评判我,这是我的客户)。

我使用包含两个分区(/boot 和 /)的 SD 卡。

我最担心的是断电会损坏我的 SD 卡。

为了解决这个问题,我的SD卡是只读的。

我的问题

我知道如何保护我的 SD 卡(……我希望)免受断电影响。

但是,我不明白为什么断电后SD卡会损坏。

你能给我解释一下原因吗?

答案1

需要注意的一些注意事项:

对 SD 卡进行写保护可能会导致整个系统无法启动。有些文件是临时/动态的,需要在操作系统(或操作系统中的程序)运行时写入。当然也有解决办法,比如在RAM中创建一个假的磁盘驱动器来保存这些临时文件(都是临时文件,如果断电导致RAM消失也没有问题)。现代 Linux 内核已经做到了这一点或类似的事情; /run 和 /sys 目录是在 RAM 中创建的,实际上并未写入任何物理驱动器。其他的,例如/dev中的一些文件/目录,是根据需要创建的。

至于损坏是如何以及为何发生的……请理解,与 CPU 和 RAM 的速度相比,SD 卡的读/写速度非常慢。当 CPU 每秒执行数十亿条指令,并且 RAM 以类似的方式访问内存位置时,一切都很好。但是,当您需要对 SD 卡进行读写操作时会发生什么情况呢?它每秒只能读/写几千个内存位置。

您不希望操作系统只是停止一切以等待读/写完成。想象一下,如果您加载了一个需要整整一分钟才能加载的网页。但在加载时,您必须等待它完成!你不能喝咖啡,你不能切换到另一个网页,你甚至不能告诉它停止加载,因为你不耐烦。

因此,操作系统所做的就是将某些数据缓存在 RAM 中,这样它就不必不断等待从 SD 中再次读取数据。当写入 SD 卡时,它也会执行此操作:它将数据保存到 RAM 中,而不是实际写入 SD 卡,并安排在稍后 CPU/OS 不那么忙时将其实际写入 SD 卡,然后回去做其他事情,例如回应您的愿望。

当这些数据仅存在于 RAM 中但断电时,就会发生损坏。无法保持 RAM 新鲜,因此无法将缓存数据写入 SD 卡。它消失了。所以 SD 卡上的数据现在已经过时了——我没有 RAM 中的数据。有时候你很幸运,这并不重要;丢失的数据微不足道,可以再次创建。有时,丢失的数据是关键数据,并会导致损坏。

即使很小的改变也可能导致大问题。如果文件只变大了一个字节,操作系统就必须更新磁盘数据:添加到文件中的一个字节以及磁盘上告诉操作系统文件有多大的数据。我必须更新它才能知道文件现在大了 1 个字节。不过,该信息同样会缓存在 RAM 中,并计划稍后写入 SD 卡。

如果在写入新大小之前发生电源故障,SD 卡将“认为”文件仍然是旧大小。新的再见已经完全消失了——腐败。

大多数操作系统都会采取措施尽量减少风险,但无法完全消除风险。即使对SD卡进行写保护也不是完美的; SD 卡会随着时间的推移而退化,直到无法再维护存储在其中的数据。

EMP(电磁脉冲)与之类似——它会导致电气设备短路和烧毁。因此,如果您的 SD 卡遭受了足够强的电磁脉冲,它仍然可能被擦除。等等。

答案2

这不仅限于 SD 卡。

与所有通用操作系统一样,Linux 使用文件系统缓冲区高速缓存。当进程写入文件时,修改后的文件数据和元数据将存储在缓冲区高速缓存中。将元数据写入存储介质时发生电源故障可能会导致元数据仅部分写入。导致SD卡上的文件系统结构不一致。这通常被称为“损坏的”文件系统。

相关内容