4

Я рассматриваю возможность резервного копирования некоторых данных на DVD /BD. (Я знаю о DVDisaster.) Я где-то читал, что внешние секторы на DVD более подвержены износу, чем внутренние. Это говорит о том, что со временем блоки во второй половине изображения с большей вероятностью будут повреждены, чем блоки в первой половине. Итак, мой вопрос, есть ли способ записать одни и те же данные на 2 образа DVD, так что

  1. можно смонтировать любой DVD, возможно, в 2 этапа (например, смонтировать ISO-файл, хранящийся на DVD), но без предварительного копирования всего на HD и манипулирования им
  2. основные данные должны быть записаны на 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%)

1 ответ1

3

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

Это возможно, поскольку декодер RS не различает пользовательские данные и данные для исправления ошибок. По мнению декодера RS, каждый блок представляет собой последовательность из 100 байтов, из которой может быть восстановлено произвольное подмножество из 20 байтов.

Хотя некоторые части диска могут с большей вероятностью потерять данные, потеря данных все же может происходить в любом месте. В описанном двухдисковом методе вы потеряете данные, если два сбойных сектора будут перекрываться. На более высоких уровнях потери данных это будет довольно распространенным явлением. Для сравнения, коррекция ошибок Рида-Соломона позволяет восстановить без потерь 14,3% (нормальный режим) или 33,5% (высокий режим) диска.

DVDisaster предназначен именно для этого и способен удовлетворить ваши потребности здесь. Если вы чувствуете себя особенно параноиком, вы можете установить избыточность на Высокий (или пользовательский) и при этом использовать меньше места и иметь более высокую надежность, чем с двумя дисками.

Счастливые резервные копии!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .