Насколько я понимаю, на жестких дисках и твердотельных накопителях реализовано базовое исправление ошибок внутри накопителя, и большинство конфигураций RAID, например, mdadm, будут зависеть от этого, чтобы решить, когда накопителю не удалось исправить ошибку и его необходимо отключить. Однако это зависит от точности хранения на 100% в диагностике ошибок. Это не так, и обычная конфигурация, такая как зеркало RAID-1 для двух дисков, будет уязвимой: предположим, что некоторые биты на одном диске незаметно повреждены, и диск не сообщает об ошибке чтения. Таким образом, файловые системы, такие как btrfs и ZFS, реализуют свои собственные контрольные суммы, чтобы не доверять ошибочным прошивкам дисков, сбойным кабелям SATA и так далее.
Точно так же, у RAM также могут быть проблемы с надежностью, и поэтому у нас есть ECC RAM, чтобы решить эту проблему.
Мой вопрос заключается в следующем : каков канонический способ защиты файла подкачки Linux от тихого повреждения / гниения, не обнаруживаемого микропрограммой диска в конфигурации с двумя дисками (то есть с использованием драйверов ядра mainline)? Мне кажется, что конфигурация, в которой отсутствует сквозная защита (например, предоставляемая btrfs), несколько отрицает душевное спокойствие, обеспечиваемое ECC RAM. И все же я не могу придумать хороший способ:
- btrfs вообще не поддерживает файлы подкачки. Вы можете настроить петлевое устройство из файла btrfs и произвести обмен на него. Но это имеет проблемы:
- Случайные записи не работают хорошо: https://btrfs.wiki.kernel.org/index.php/Gotchas#Fragmentation
- Предложение там отключить копирование при записи также отключит контрольную сумму - таким образом победив весь смысл этого упражнения. Они предполагают, что файл данных имеет свои внутренние средства защиты.
- ZFS в Linux позволяет использовать ZVOL в качестве подкачки, что, я думаю, могло бы сработать: http://zfsonlinux.org/faq.html#CanIUseaZVOLforSwap - однако, исходя из моего чтения, ZFS обычно требует памяти и заставляет его работать в режиме подкачки. -только приложение звучит как какая-то работа, выясняя это. Я думаю, что это не мой первый выбор. Почему вы должны использовать какой-то модуль ядра, не имеющий отношения к дереву, просто чтобы надежный обмен не был мне понятен - наверняка есть способ сделать это с большинством современных дистрибутивов / ядер Linux в наше время?
- На самом деле в списке рассылки ядра Linux была ветка с патчами для включения контрольных сумм в самом менеджере памяти, по причинам, которые я обсуждаю в этом вопросе: http://thread.gmane.org/gmane.linux.kernel/989246 - к сожалению, насколько я могу судить, патч умер и не вышел в апстрим по неизвестным мне причинам. Жаль, это звучало как приятная особенность. С другой стороны, если вы установите своп на RAID-1 - если повреждение не поддается восстановлению контрольной суммы, вы бы хотели, чтобы диспетчер памяти попытался прочитать данные с другого диска до паники или чего-то еще, что вероятно, выходит за рамки того, что должен делать менеджер памяти.
В итоге:
- RAM имеет ECC для исправления ошибок
- Файлы на постоянном хранилище имеют btrfs для исправления ошибок
- Своп имеет ??? <--- это мой вопрос