Подтвердить что ты не робот

Как я могу имитировать неисправный диск во время тестирования?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Вышеприведенный пример более сложного примера того, что описано в вопросе Имитировать неисправное блочное устройство с ошибками чтения (см. fooobar.com/questions/212968/... для простого примера Device Mapper).

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

Ответ 3

Простой способ удалить SCSI-диск с ядром 2.6:

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

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

Ответ 4

Ядро 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

Ответ 5

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

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

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

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

Ответ 6

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

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

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

[[email protected] ~]$ sudo modprobe scsi_debug opts=2 every_nth=1
[[email protected] ~]$ 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
[[email protected] ~]$ 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