В Linux можно не ждать, пока диск действительно начнёт возвращать ошибки.
Kernel умеет сам подставлять ошибки для операций block layer и проверять, как на них реагируют файловая система, драйвер и сервисы.
1️⃣Включаем механизм
Нужен kernel с
CONFIG_BLK_ERROR_INJECTION и смонтированный debugfs:mount -t debugfs none /sys/kernel/debug
Для устройства появится:
/sys/kernel/debug/block/nvme0n1/error_injection
2️⃣Задаём ошибку
Например, возвращаем
BLK_STS_IOERR для одного из десяти чтений:echo 'add,op=READ,start=0,status=IOERR,chance=10' \
> /sys/kernel/debug/block/nvme0n1/error_injection
Можно ограничить правило диапазоном секторов или выбрать другую операцию:
op=READ
op=WRITE
op=DISCARD
А вместо
IOERR можно, например, имитировать BLK_STS_MEDIUM.3️⃣Что происходит дальше
Ошибка появляется не потому, что NVMe или SATA-диск физически сломался.
Запрос проходит через block layer, там срабатывает правило, и операция завершается с заданным статусом.
Дальше уже интересно смотреть, что делает верхний уровень:
dmesg -w
и параллельно проверять поведение файловой системы, device-mapper, RAID или приложения.
Правила можно удалить:
echo removeall \
> /sys/kernel/debug/block/nvme0n1/error_injection
⚡️Получается довольно мощный способ тестировать recovery: можно воспроизвести I/O error на конкретной операции и диапазоне диска, не дожидаясь реальной аппаратной неисправности.
