Так, це дуже правдоподібний спосіб зробити це за допомогою картографічного пристрою.
Картограф пристрою може рекомбінувати блокові пристрої в нове відображення / порядок на ваш вибір. 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 та перейміть це!