При тестировании дистрибутивов на отказоустойчивость одним из наиболее подходящих вариантов является эмуляция сбоев для наблюдения за поведением системы.
- chaosblade - платформа для хаос-инжиниринга. Позволяет эмулировать сбои для тестирования отказоустойчивости системы. Для создания сетевых сбоев позволяет осуществлять такие действия:
- Создавать задержки;
- Проводить различные манипуляции с сетевыми пакетами, в т.ч. вызывать потерю пакетов, дублировать их, повреждать, блокировать;
- Делать порт недоступным;
- Вносить изменения в работу DNS.
- tc - утилита для управления трафиком. Для эмуляции сетевых сбоев используется
tc netem. Как иchaosbladeпозволяет создавать задержки, потери, дубликации, неправильный порядок пакетов. Пример: добавление задержки 100 мс:sudo tc qdisc add dev eth0 root netem delay 100ms
- xfstests - это набор регрессионных тестов файловой системы, который изначально был разработан для файловой системы XFS, однако сейчас поддерживает работу с большинством популярных файловых систем. Тесты xfstests используют для своей работы одно или два блочных устройства, на которых проводятся тесты. Тесты могут быть разделены на несколько групп, таких как “auto”, “quick”, “aio”, “prealloc”, “ioctl” и “dangerous”. Принадлежность к группе указывает на характер теста.
-
KEDR - это платформа для динамического анализа модулей ядра Linux, включая драйверы устройств, модули файловой системы и т.д. Инструменты, предоставляемые платформой, работают с выбранным пользователем модулем ядра. Они перехватывают вызовы функций, выполняемые модулем, и могут записывать информацию об этих вызовах в файл, имитировать нехватку ресурсов, обнаруживать утечки памяти.
KEDRпозволяет некоторым функциям, вызываемым целевым модулем, возвращать ошибки. Это позволяет проверить, правильно ли целевой модуль обрабатывает такие условия. На самом деле,KEDRпросто имитирует сбой, вообще не вызывая соответствующую функцию. Сценарии (что и при каких условиях должно привести к сбою) могут быть настроены пользователем. В настоящий моментKEDRне разрабатывается, поэтому на новых версиях ядра его сборка завершится с ошибкой. -
krf - Kernelspace Randomized Faulter - это набор утилит для симулирования ошибок при выполнении системных вызовов.
krfдобавляет "обертки" для системных вызовов, которые завершаются с ошибками в соответствии с выбором пользователя.krfсостоит из четырех частей:- модуль ядра
krfx - утилита для выполнения программ
krfexec - утилита для управления конфигурацией
krfctl - утилита для просмотра логов
krfmesg
Примеры использования:
# krfctl -F 'read,write'- для указания системных вызовов, в которых должны происходить ошибки# krfctl -T personality=28- завершать с ошибкой все программы, запускаемые черезkrfexec# krfctl -p 100- установить вероятность ошибки равной 1%# krfctl -P io- для указания группы системных вызовов, которые должны завершаться с ошибкой (в данном случае, все, связанные с вводом/выводом)$ krfexec <command> [args]- для запуска программы черезkrfexec
- модуль ядра
-
epbfault - утилита для внедрения ошибок в системные вызовы, работающая на основе eBPF. Удобна в использовании, так как позволяет задать в конфигурационном файле системные вызовы, в которых будет симулироваться ошибка, вощвращаемое значение и вероятность возврата этого значения. Пример конфигурационного файла:
{ "fault_injectors": [ { "syscall_name": "fchmodat", "error_list": [ { "exit_code": "-ENOENT", "probability": 50 }, { "exit_code": -100, "probability": 30 } ] }, { "syscall_name": "openat", "error_list": [ { "exit_code": "-ENOENT", "probability": 50 } ] } ] }Использование:
ebpfault --config /path/to/config.json --exec /path/to/program arg1 arg2 -
Аналогично
ebpfaultможно писать свои тесты с использованиемkprobesиbpf. Для этого подходит функцияbpf_override_return(), позволяющая перезаписывать код возврата функций.
Кроме того, некоторые рассмотренные инструменты, можно использовать и для других целей. Так, chaosblade можно также использовать для эмуляции сбоев файловой подсистемы, процессора, дисков.
Также был найден фреймворк FAIL, который позволяет эмулировать различные сбои, в том числе создавать собственные программы с использованием FAIL* API.