Я рассматриваю возможность резервного копирования некоторых данных на DVD /BD. (Я знаю о DVDisaster.) Я где-то читал, что внешние секторы на DVD более подвержены износу, чем внутренние. Это говорит о том, что со временем блоки во второй половине изображения с большей вероятностью будут повреждены, чем блоки в первой половине. Итак, мой вопрос, есть ли способ записать одни и те же данные на 2 образа DVD, так что
- можно смонтировать любой DVD, возможно, в 2 этапа (например, смонтировать ISO-файл, хранящийся на DVD), но без предварительного копирования всего на HD и манипулирования им
- основные данные должны быть записаны на 2 DVD в существенно различном порядке
Если мне неясно, вот что может быть возможным решением.
Предположим, на секунду существует драйвер Linux, который может смонтировать ISO-образ в обратном направлении. Итак, я даю ему iso-файл, и когда ему нужен 1-й сектор, он читает последние 2048 байт файла назад, а не первые 2048 байт в обычном порядке. Я не знаю, существует ли такой драйвер, но если бы он существовал, это было бы одним из решений моей проблемы, потому что я мог бы сделать это: поместить мои данные в iso-образ; вычислить второе изображение как первое в обратном направлении; инкапсулировать каждое изображение в простую файловую систему UDF с одним файлом; записать две файловые системы UDF на разные DVD. Теперь, когда я подключаю любой DVD, я могу просто смонтировать один iso-файл, чтобы вернуть мои данные. Более того, данные будут записываться на 2 DVD-диска по-разному, поэтому, если оба DVD-диска потеряют последние 1/3 своих секторов, я все равно смогу восстановить их все (вручную, но это было бы возможно).
Другими возможными решениями будет общий драйвер для перестановки / поворота / переупорядочения блоков произвольного размера в устройстве произвольного блока. Или, возможно, есть способ сохранить файл в файловой системе UDF, используя определенный порядок секторов? Учитывая, что UDF является полноценной файловой системой, это определенно возможно, но есть ли инструмент для этого?
Спасибо!!
Изменить: как я объяснил в первом ответе, я не имею в виду заменить DVDisaster, но дополнить его. Рассмотрим 2 стратегии резервного копирования 4G данных. Стратегия A: используйте 2 одинаковых DVD, каждый с 15% ecc от DVDisaster. Стратегия B: использовать 2 DVD, каждый с 15% ecc, но с дополнительной перестановкой, о которой я упоминал выше (на 1 из 2 DVD). Я утверждаю, что из-за закономерностей износа DVD-дисков (в частности, из-за корреляции ошибок), через некоторое время вероятность полного восстановления от B значительно больше, чем от A (при прочих равных условиях).
Edit2: Чтобы подтвердить мое утверждение о том, что DVDisaster не является лекарством от всего, вот сценарий, демонстрирующий, как DVDisaster с 33% ECC-данными переносит потерю данных только с 1,3% повреждением. Очевидное противоречие состоит в том, что 33% относятся только к коррупции "в лучшем случае", а не к "любой" коррупции. К вашему сведению, я создаю файл, охватывающий всю файловую систему в test.1.udf
, меняя в последнем секторе только нулевой сектор в test.2.udf
, вычисляя данные ecc для обоих и сравнивая сектора, включая ecc данные. Дело в том, что если test.1.udf
- это ваши данные, и вы теряете разные и только сектора, вы не сможете восстановить test.1.udf
потому что test.2.udf
- это еще одна возможность.
n_blocks=8192
tdir=$(mktemp -d)
mkudffs -b 2048 test.1.udf $n_blocks
sudo mount test.1.udf $tdir -o bs=2048
sudo chown $USER.$USER $tdir
n=$(df -B 2K $tdir | tail -n 1 | awk '{print $4}')
let n-=1
dd if=/dev/urandom of=$tdir/file bs=2K count=$n 2>/dev/null
last=$(od <$tdir/file -Ad -t x1 | tail -n 2 | head -n 1 | cut -d ' ' -f 2-)
sudo umount $tdir
start_of_last_block=$(od <test.1.udf -Ad -t x1 | grep -A 1 "$last" | tail -n 1 | awk '{print $1}')
last_block=$(($start_of_last_block / 2048))
dd if=test.1.udf bs=2K count=$(($last_block - 1)) >test.2.udf 2>/dev/null
dd if=/dev/zero bs=2K count=1 >>test.2.udf 2>/dev/null
dd if=test.1.udf bs=2K skip=$last_block count=$(($n_blocks - $last_block)) >>test.2.udf 2>/dev/null
n_blocks_with_ecc=$(echo "$n_blocks * 133 / 100" | bc)
echo "add dvdisaster ecc data, using in total $n_blocks_with_ecc"
#run dvdisaster on the 2 files, then...
n_blocks_different=$(for i in $(seq 0 $(($n_blocks_with_ecc - 1))); do
if [ $((($i / 100) * 100)) -eq $i ]; then
echo "$i..." >&2
fi
diff -q <(dd if=test.1.udf bs=2K skip=$i count=1 2>/dev/null) \
<(dd if=test.2.udf bs=2K skip=$i count=1 2>/dev/null) >/dev/null || echo $i
done | wc -l)
echo "number of blocks different: $n_blocks_different / $n_blocks_with_ecc ($(echo "scale=6; $n_blocks_different / $n_blocks_with_ecc * 100" | bc)%)"
Выход:
number of blocks different: 145 / 10895 (1.330800%)