Как я могу симулировать неисправный диск во время тестирования? - PullRequest
27 голосов
/ 01 сентября 2009

В Linux VM (рабочая станция Vmware или аналогичная), как я могу имитировать сбой на ранее работающем диске?

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

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

Ответы [ 7 ]

26 голосов
/ 01 сентября 2009

Существует несколько слоев, на которых можно смоделировать ошибку диска. Если вы тестируете одну программу пользовательского пространства, вероятно, самый простой подход - вставить соответствующие вызовы (например, write()) и заставить их иногда возвращать ошибку. Библиотека libfiu ввода ошибок может сделать это , используя инструмент fiu-run.

Другой подход заключается в использовании драйвера ядра, который может передавать данные на другое устройство или с него, но по пути вводить ошибки. Затем вы можете смонтировать устройство и использовать его из любого приложения, как если бы это был неисправный диск. Драйвер fsdisk является примером этого.

Существует также инфраструктура внедрения ошибок, которая была объединена с ядром Linux, хотя вам, вероятно, потребуется перенастроить ядро, чтобы включить его. Это задокументировано в Документация / Ввод ошибок / Ввод ошибок.txt . Это полезно для тестирования кода ядра.

Также возможно использовать SystemTap для ввода ошибок на уровне ядра. См. Тест инжекции ошибок SCSI и Инжекция ошибок ядра с использованием SystemTap .

6 голосов
/ 29 мая 2014

Чтобы добавить ответ mark4o, вы также можете использовать Device Mapper в Linux для генерации неисправных устройств.

Устройство задержки Device Mapper может использоваться для отправки операций чтения и записи одного и того же блока на разные базовые устройства (это также может задержать этот ввод / вывод, как следует из его названия). Устройство ошибок Device Mapper может использоваться для генерации постоянных ошибок при обращении к определенному блоку. Комбинируя их, вы можете создать устройство, в котором запись всегда завершается неудачно, но чтение всегда завершается успешно для данной области.

Выше приведен более сложный пример того, что описано в вопросе Имитация неисправного блочного устройства с ошибками чтения? (см. https://stackoverflow.com/a/1871029 для простого примера Device Mapper).

В специальном файле , который вызывает ошибку ввода-вывода вопрос Unix & Linux, есть список механизмов ввода сбоев дисков Linux .

4 голосов
/ 02 сентября 2009

Простой способ заставить диск SCSI исчезнуть с ядром 2.6:

echo 1 > /sys/bus/scsi/devices/H:B:T:L/delete

(H: B: T: L - хост, шина, цель, LUN). Чтобы имитировать случай только для чтения, вы должны будете использовать методы инъекции ошибок, которые упоминал mark4o.

1 голос
/ 25 октября 2017

Можно также использовать методы, предоставляемые дисками, для тестирования ошибок носителей. SCSI имеет команду WRITE LONG, которую можно использовать для повреждения блока путем записи данных с недопустимым ECC. SATA и NVMe также имеют похожие команды.

Для наиболее распространенного случая (SATA) вы можете использовать hdparm с --make-bad -ector для использования этой команды, вы можете использовать sg_write_long для SCSI, а для NVMe вы можете использовать nvme-cli с опцией write-uncor .

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

Недостатком является то, что если вы делаете это слишком много для одного и того же диска, его счетчики ошибок будут работать и SMART может пометить диск как неисправный или вы можете исчерпать его таблицы перераспределения. Поэтому используйте его для ручного тестирования, но если вы запускаете его на автоматическом тестировании, не делайте это слишком часто.

1 голос
/ 29 сентября 2017

Ядро Linux предоставляет замечательную функцию, называемую «инъекция ошибок»

echo 1 > /sys/block/vdd/vdd2/make-it-fail

Чтобы настроить некоторые параметры:

mkdir /debug
mount debugfs /debug -t debugfs
cd /debug/fail_make_request
echo 10 > interval # interval
echo 100 > probability # 100% probability
echo -1 > times # how many times: -1 means no limit

https://lxadm.com/Using_fault_injection

0 голосов
/ 20 марта 2019

Вы можете также использовать низкоуровневую утилиту SCSI (sg3-utils), чтобы остановить диск. Он по-прежнему будет отвечать на запрос, поэтому его состояние все еще будет «запущено», но чтение и запись не будут выполняться, пока он не будет запущен снова. Я протестировал удаление и восстановление RAID-диска с помощью mdadm.

sg_start --stop /dev/sdb
0 голосов
/ 22 февраля 2017

Вы можете использовать модуль ядра scsi_debug для имитации RAM-диска, и он поддерживает все ошибки SCSI с опциями opts и every_nth.

Пожалуйста, отметьте это http://sg.danny.cz/sg/sdebug26.html

Пример средней ошибки в секторе 4656:

[fge@Gris-Laptop ~]$ sudo modprobe scsi_debug opts=2 every_nth=1
[fge@Gris-Laptop ~]$ sudo dd if=/dev/sdb of=/dev/null
dd: error reading ‘/dev/sdb’: Input/output error
4656+0 records in
4656+0 records out
2383872 bytes (2.4 MB) copied, 0.021299 s, 112 MB/s
[fge@Gris-Laptop ~]$ dmesg|tail
[11201.454332] blk_update_request: critical medium error, dev sdb, sector 4656
[11201.456292] sd 5:0:0:0: [sdb] FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[11201.456299] sd 5:0:0:0: [sdb] Sense Key : Medium Error [current] 
[11201.456303] sd 5:0:0:0: [sdb] Add. Sense: Unrecovered read error
[11201.456308] sd 5:0:0:0: [sdb] CDB: Read(10) 28 00 00 00 12 30 00 00 08 00
[11201.456312] blk_update_request: critical medium error, dev sdb, sector 4656

Вы можете изменить параметры opts и every_nth во время выполнения через sysfs:

echo 2 | sudo tee /sys/bus/pseudo/drivers/scsi_debug/opts
echo 1 | sudo tee /sys/bus/pseudo/drivers/scsi_debug/opts
...