我一直很好奇如果 Linux 内核运行时硬盘发生故障会发生什么。由于内核映像本身已完全加载到 RAM 中,因此我认为不会出现任何内核故障。显然,任何尝试访问磁盘的软件都会失败。
系统是否有可能无限期地继续运行?如果不是,什么会导致它恐慌(或至少变得无法操作)?
请考虑以下每种情况:
- 内核可能已启用或未启用交换文件。
- 失败后不会尝试加载内核模块。
- 如果文件系统的某些部分位于不同的磁盘上,会有什么不同吗?
答案1
硬件故障总是存在使内核崩溃的风险,因为这些代码路径通常经过的测试要少得多,但通常情况下,出现故障的硬盘驱动器不应使内核崩溃。到底发生什么取决于故障的性质。也许现在只有某些扇区不可读,导致 /home 分区的部分内容不可读,系统仍然可以运行,以便系统管理员分析问题。如果根文件系统变得不可用,那么无论内核崩溃如何,系统都几乎死了,因为即使是简单的 shell 也将不可用。如果交换分区变得不可用,则使用交换的程序在读入任何换出的数据时将出现分段错误。如果崩溃的硬盘只是额外的存储,除了一些文件系统变得不可读之外,它可能没有什么影响。
它还可能取决于硬盘驱动器抛出的错误类型。我见过一个驱动器实际上消失了,除了文件系统消失之外,一切都运行正常。我还看到硬盘驱动器在长时间超时后不断挂起系统并抛出错误,导致整个系统性能下降。如果使用像MD这样运行RAID1/4/5的层,严重错误通常只会导致内核将磁盘标记为故障,并且它将忽略它,依靠剩余的驱动器来保持系统运行。
答案2
在我的 PowerEdge 2500 上,当我第一次拿到它时,PERC(硬件 RAID)控制器的固件不是最新版本。这样做的结果是根磁盘会突然消失并且不再可访问(与可移动驱动器突然断开连接非常相似)。
我无法加载任何新程序,已加载的程序继续运行,但如果它们尝试写入磁盘,则会出现错误。仍然有bash
我登录的提示,网络继续运行。令人惊讶的是,事情并没有我想象的那么灾难性。
我认为这是一个“干净”的失败,因为无论哪个驱动程序负责读/写 PERC 似乎都会立即拒绝所有内容并出现错误(忘记确切的错误,但这是一个 SCSI 感知错误)。如果驱动器没有响应、响应缓慢或者写入看起来工作正常但实际上却不然,情况会更糟。
答案3
实际上,我在运行的系统上遇到了驱动器故障,但没有 X。由于 getty 不可用,因此无法登录。我尝试对正在运行的应用程序进行脱壳,但没有可用的外壳,因此该应用程序无法使用。就在那时,Aiieeee 消息引起了我的注意并讲述了这个故事。