Skip to content

Latest commit

 

History

History
74 lines (59 loc) · 7.83 KB

File metadata and controls

74 lines (59 loc) · 7.83 KB

Эмуляция сбоев для тестирования дистрибутивов на отказоустойчивость

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

Существующие инструменты для эмуляции сбоев

Сеть

  • 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.