
Я хотел бы протестировать некоторые методы восстановления диска, прежде чем применять их в реальной жизни, в частности, способность 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