我正在使用带有 USB 硬盘的嵌入式 Linux 设备。此驱动器上有一个交换文件。硬盘可能随时断电,然后几秒钟后重新通电。这会导致各种错误消息,例如:
Write-error on swap-device
Kernel panic - not syncing: Attempted to kill init!
或各种应用程序中的异常,这是可以理解的,因为一些页面输入/输出请求失败了。(请注意,此内核恐慌在常规桌面 Linux 上也可以重现)。
我的目标是以某种方式防止这种情况发生并在不重新启动操作系统的情况下恢复系统。
我可以通过打电话来推迟崩溃scsi_block_requests
,但我无法永远阻止他们。
我尝试send_sig_info
根据USB_DEVICE_REMOVE
通知终止一些用户模式任务(使用),但仍然不断出现异常。
我也在想,是否有可能在移除 USB 设备时防止 SCSI 设备被破坏,但保留它,然后以某种方式将其重新连接到新的 USB 设备,该设备将在几秒钟后 USB 设备再次通电时创建。由于这是同一个磁盘,所以也许我可以恢复所有待处理的请求而无需重新安装磁盘。
您的看法是什么?可以做这样的事情吗?还是说硬盘移除后无法完全恢复操作系统?
答案1
仅终止使用比您现有内存更多的内存的应用程序并不能保证交换文件不再使用。如果该应用程序正在运行,其内存需求可能会导致任何其他进程将其部分页面交换到交换设备。终止内存消耗大的进程不会将这些页面恢复,直到重新加载它们。
一种可能性是取消内核级交换设备,并重写有问题的进程,这样就不需要malloc
占用比系统可以访问的更多的内存并依赖内核来处理交换,只需要mmap
USB 设备(或设备上的文件,如果该设备还用于其他用途)并手动处理超出可用内存的用户空间内存需求(有效地实现位于 USB 设备上的额外堆)。然后,当设备需要离开时,只需终止或暂停该进程就足以阻止系统尝试访问该设备。
答案2
可以考虑的一个选择是压缩缓存,它可以压缩内存页面,更有效地利用 RAM,因此您不需要交换文件。除此之外,您能够解决问题的唯一方法是通过对内核中的交换代码进行一些硬核破解。