3

Я работаю на встроенном устройстве Linux с жестким диском USB. На этом диске есть файл подкачки. Жесткий диск может быть выключен в любой момент, прежде чем снова включится через несколько секунд. Это приводит к различным сообщениям об ошибках, таким как:

Write-error on swap-device
Kernel panic - not syncing: Attempted to kill init!

или исключения в различных приложениях, что понятно, поскольку некоторые запросы ввода / вывода страницы не выполнялись. (Обратите внимание, что эта паника ядра также воспроизводима на обычном настольном Linux).

Моя цель - как-то предотвратить это и восстановить систему без перезагрузки ОС.

Я могу отложить сбой, вызвав scsi_block_requests , но я не могу держать их заблокированными навсегда.

Я пытался убить некоторые задачи пользовательского режима (используя send_sig_info) в ответ на уведомление USB_DEVICE_REMOVE , но все равно продолжаю получать исключения.

Я также думаю о том, возможно ли предотвратить разрушение устройства SCSI при извлечении устройства USB, но оставьте его и затем каким-либо образом подключите его к новому устройству USB, которое будет создано через несколько секунд после повторного включения устройства USB. Поскольку это один и тот же диск, возможно, я смогу возобновить все ожидающие запросы без повторной установки диска.

Каково твое мнение? Можно ли что-то подобное сделать? Или невозможно просто восстановить ОС после удаления жесткого диска?

2 ответа2

3

Простое уничтожение приложения, которое использует больше оперативной памяти, чем у вас, не гарантирует, что файл подкачки станет неиспользованным. Если бы это приложение было запущено, его требования к памяти могли бы привести к тому, что любой другой процесс перенес часть своих страниц на устройство подкачки. Уничтожение голодного процесса не вернет эти страницы, пока они не будут перезагружены.

Одной из возможностей было бы избавиться от устройства подкачки на уровне ядра и переписать проблемный процесс так, чтобы вместо malloc большего объема памяти, чем система имеет доступ к ядру для обработки подкачки, и полагаться на него, просто mmap устройство USB (или файл на устройстве, если устройство также используется для других целей) и вручную обрабатывает ваши потребности в памяти в пространстве пользователя, которые выходят за пределы доступной памяти (эффективно реализуйте дополнительную кучу, которая живет на вашем устройстве USB). Затем, когда устройство должно уйти, достаточно просто убить или приостановить этот процесс, чтобы система не пыталась получить доступ к устройству.

1

Одним из вариантов, который следует рассмотреть, является compcache, который сжимает страницы памяти, используя вашу оперативную память более эффективно, поэтому вам не нужен файл подкачки. Кроме того, единственный способ, которым вы сможете решить свою проблему - это какой-то хардкорный взлом кода подкачки в ядре.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .