Навмисно викликати помилку вводу / виводу в Linux?


42

Чи все-таки в Linux цілеспрямовано викликати блоковий пристрій, щоб повідомити про помилку вводу-виводу або, можливо, моделювати його для тестування?


Ви імітуєте збій диска? Можливо, ви змогли змонтувати каталог, а потім відключити його, поки він використовувався.
Шеф

2
Я б написав невеликий модуль ядра, який ви можете завантажити modprobe, ведучи себе як блок пристрою, а потім ще одну маленьку програму, яка надсилає ioctl()'sдрайверу, щоб він повернув потрібне вам значення.
ott--


Щоб продовжити коментар, зроблений @Gilles, про це запитали також на stackoverflow.com/questions/1361518/… (кілька різних відповідей на введення несправностей) та stackoverflow.com/questions/1870696/… (використовуйте картографічний пристрій пристрою).
Анон

Відповіді:


54

Так, це дуже правдоподібний спосіб зробити це за допомогою картографічного пристрою.

Картограф пристрою може рекомбінувати блокові пристрої в нове відображення / порядок на ваш вибір. LVM робить це. Він також підтримує інші цілі (деякі з яких досить нові), як 'flakey', щоб імітувати збій диска та 'error' для імітації невдалих областей диска.

Можна сконструювати пристрій, який навмисно має чорнові отвори IO, які повідомлятимуть про помилки IO при перетині.

По-перше, створіть якийсь віртуальний том для використання в якості цілі та зробіть його адресною як блок пристрою.

dd if=/dev/zero of=/var/lib/virtualblock.img bs=512 count=1048576
losetup /dev/loop0 /var/lib/virtualblock.img

Отже, для початку це створює файл 512M, який є основою нашого віртуального блокового пристрою, в якому ми будемо пробивати «дірку». Хоча отвір ще не існує. Якби ви були, mkfs.ext4 /dev/loop0ви отримаєте ідеально файльну систему.

Отже, давайте використовувати dmsetup, який, використовуючи цей блок пристрою - створить новий пристрій, у якому є деякі отвори. Ось перший приклад

dmsetup create errdev0
0 261144 linear /dev/loop0 0
261144 5 error
261149 787427 linear /dev/loop0 261139

Це створить пристрій під назвою 'errdev0' (зазвичай в / dev / mapper). При введенні dmsetup create errdev0він буде чекати стандартне введення і завершиться ^ D на вхід.

У наведеному вище прикладі ми зробили 5 секторного отвору (2,5 кб) в секторах 261144 петлевого пристрою. Потім ми продовжуємо через циклічний пристрій як зазвичай.

Цей сценарій спробує створити вам таблицю, яка розмістить отвори у випадкових місцях, приблизно розкинувшись приблизно на 16 Мбіт (хоча це досить випадково).

#!/bin/bash
start_sector=0
good_sector_size=0

for sector in {0..1048576}; do

    if [[ ${RANDOM} == 0 ]]; then
        echo "${start_sector} ${good_sector_size} linear /dev/loop0 ${start_sector}"
        echo "${sector} 1 error"
        start_sector=$((${sector}+1))
        good_sector_size=0
    else
        good_sector_size=$((${good_sector_size}+1))
    fi
done

echo "${start_sector} $((${good_sector_size}-1)) linear /dev/loop0 ${start_sector}"

Сценарій передбачає, що ви також створили пристрій 512 Мб і увімкнено ваш віртуальний блок пристрою /dev/loop0.

Ви можете просто виводити ці дані у текстовий файл у вигляді таблиці та передавати їх dmsetup create errdev0.

Після створення пристрою ви можете почати використовувати його як звичайний блок пристрою, спочатку відформатувавши його, а потім розмістивши на ньому файли. У якийсь момент вам доведеться зіткнутися з деякими проблемами вводу-виводу, коли ви потрапляєте на сектори, які є справді отворами IO у віртуальному пристрої.

Після завершення використання dmsetup remove errdev0для видалення пристрою.

Якщо ви хочете зробити більше шансів отримати помилку введення-виводу, ви можете додавати отвори частіше або змінювати розмір створених отворів. Зауважте, що помилки в певних розділах, ймовірно, можуть спричинити проблеми з початком руху, IE на 32 Мб в пристрій, на якому ви не можете написати суперблок, який зазвичай намагається зробити, тому формат не працює.

Для додаткової розваги - ви можете насправді лише losetupтоді mkfs.ext4 /dev/loop0і заповнити її даними. Після того, як у вас є хороша робоча файлова система, просто відключіть файлову систему та додайте кілька дірок, використовуючи dmsetup та перейміть це!


6
Я не знав, що ти можеш це зробити. Дуже здорово.

15

Для перевірки надійності програми на випадок виходу з ладу, ви можете використовувати pseudodevice /dev/full, який завжди повертає "ENOSPACE", коли записаний на.

$ dd if=/dev/zero of=/dev/full
dd: writing to `/dev/full': No space left on device
1+0 records in
0+0 records out

7

Залежить від того, що ви хочете протестувати. Використовуючи LD_PRELOADбібліотеку ed, ви можете наводити програми на роздуми над такими речами, як, наприклад, "всі записи провалюються з" ENOSPCабо EIO".


7

Ви можете зробити це так багато цікавих способів. Дивіться https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt


3
Не могли б ви виділити відповідні "цікаві" способи, характерні для запитів на диск ( fail_make_request)? Було б також чудово запобігти гниттю посилань.
Мисливець на оленів

1

Можливо, ви могли б змінити таблицю розділів і збільшити розділ таким, який він є насправді. Це, ймовірно, призведе до помилки вводу-виводу. Або якщо ваші диски з підключенням, ви можете просто витягнути їх.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.