Как эмулировать поврежденные блоки раздела диска в тестовом файле?

Как эмулировать поврежденные блоки раздела диска в тестовом файле?

Я хотел бы протестировать некоторые методы восстановления диска, прежде чем применять их в реальной жизни, в частности, способность ddrescue восстанавливать поврежденные блоки из нескольких копий диска, предполагая, что ни один поврежденный блок не является поврежденным в каждой копии.

Поскольку устройства представлены файлами в Linux, я думаю, что можно было бы помечать плохие блоки в файле. Допустим, я создал файл-образец и две копии, как здесь:

dd if=/dev/random of=/tmp/file bs=1024 count=32768
cp /tmp/file /tmp/file1
cp /tmp/file /tmp/file2

Как эмулировать плохие блоки в file1 и file2, как если бы они были файлами устройства?

Решенияздесь,здесьКамиль Мациоровски издесьявляются хорошим путем к решению, но не предоставляют полный метод для моего варианта использования

решение1

Благодаря предложениям Камила Мациоровски и его ответам в других источниках я смог разработать следующий процесс и протестировать его:

1) создать тестовый файл и вычислить его хэш для проверки будущего восстановления

dd if=/dev/urandom of=/tmp/file bs=512 count=32768 status=progress
sha256sum /tmp/file
f90c19308f9f216bf7dece09dd849eb40e97cdef86c6c37f28fbaf9a7bd07503  /tmp/file

2) Создайте с его помощью устройство

loopdev=\`losetup -f --show /tmp/file\`
echo $loopdev
/dev/loop1

3) Создание поврежденных устройств с плохими блоками с помощью devicemapper

dmsetup create file1 << EOF
    0  2048 linear $loopdev 0
 2048  4096 error
 6144  26624 linear $loopdev 6144
EOF

dmsetup create file2 << EOF
    0  30720 linear $loopdev 0
 30720  2048 error
EOF

ls -l /dev/mapper/
lrwxrwxrwx 1 root root       7 mai   30 09:27 file1 -> ../dm-2
lrwxrwxrwx 1 root root       7 mai   30 09:27 file2 -> ../dm-3

Обратите внимание, что в каждой строке первое число — это позиция, а второе — размер, поэтому в последней строке сумма — это размер файла: 6144 + 26624 = 32768 и 30720 + 2048 = 32768.

Строка 6144 26624 linear $loopdev 6144означает: копирование устройства $loopdev со смещения 6144 (в байтах) в file1 по смещению 6144 (в байтах) и размером 26624 байта.

4) Проверьте ошибки ввода-вывода в ожидаемых местах

dd if=/dev/mapper/file1 of=/dev/null count=2048
ok
dd if=/dev/mapper/file1 of=/dev/null count=2049
dd: error reading '/dev/mapper/file1': Input/output error
dd if=/dev/mapper/file2 of=/dev/null count=30720
ok
dd if=/dev/mapper/file2 of=/dev/null count=30721
dd: error reading '/dev/mapper/file2': Input/output error

На этом этапе дан ответ на вопрос ОП. Давайте пойдем дальше, чтобы закончить тест:

5) тест ddrescue: только хорошие блоки

ddrescue -B -v -n /dev/mapper/file1 /tmp/file1 /tmp/log
percent rescued:  87.50%
sha256sum /tmp/file1
0d344253f69688e23dd4558c2ffdabb0325f85848f7e65788ea5c9441e7a700c  /tmp/file1

6) Успешное восстановление поврежденных блоков с помощью второй копии

ddrescue -B -v -c 16 -r 2 /dev/mapper/file2 /tmp/file1 /tmp/log
percent rescued: 100.00%
sha256sum /tmp/file1
f90c19308f9f216bf7dece09dd849eb40e97cdef86c6c37f28fbaf9a7bd07503  /tmp/file1

7) При необходимости (не 100%) попробуйте восстановить плохие блоки с помощью 1-й копии.

ddrescue -B -v -c 16 -r 2 /dev/mapper/file1 /tmp/file1 /tmp/log

8) Уборка

dmsetup remove file1
dmsetup remove file2
unset loopdev
rm /tmp/file* /tmp/log

Связанный контент