cd-rr - cd-R eRRoR coRRectoR

Фильмам, программам и базам данных, безвременно погибшим из-за ошибок на компакт-дисках, посвящается.


Предлагаю вниманию публики пакет программ для защиты информации на компакт-дисках (и не только): cd-rr (сокращение от cd-r error corrector).

Способ защиты основан на старой доброй идее избыточности данных (redundancy; конкретно использованы коды Рида-Соломона aka RS-коды), и программ подобного рода - уже великое множество: тут и знаменитый RAR с его recovery-record'ами и recovery-volume'ами, и славный среди фидошников parchive, и почтенная бабушка Альфа-Лоза... Но ни одна из них не годилась для защиты данных на дисках формата XCD, а именно это мне было позарез нужно в далёком 2003 году, так что пришлось написать свою примочку. А потом она обросла дополнительными возможностями типа защиты обычных ISO CD-R и даже флоппи-дисков, созрела и в 2005 году впервые вышла в свет - тогда ещё не опен-сорсная, а просто фриварная. В начале 2007-го, после выхода версии 1.29, я её забросил, хотя изредка извлекал архив с исходниками и задумывался - а что бы ещё такого доулучшить. :-)
Но не так давно произошёл перелом: мой друг-пингвиновод :-) перевёл пакет на Linux и допинал меня до идеи выложить вместе с исходными текстами.
Всех, кому хватило терпения скачать пакет и продраться через мой псевдоанглийский язык встроенного в программы help'а, прошу высказываться здесь. Отвечу на все вопросы, поделюсь особенностями внутренностей и применения, с удовольствием рассмотрю идеи по улучшению.


Подробное описание всего пакета - см. в следующем посте. Описание большое, поэтому выкладка может растянуться на несколько дней.
Ещё один отдельный пост отвожу под выдержки из уже накопившихся обсуждений, вопросов, ответов, предложений и т.д.
02/11/2012
Последняя на данный момент версия пакета: cd-rr-1.30 - исходные тексты, программы под win32 и под Linux на x86.

Комментарии

Этот пост будет неоднократно правиться - тут будет документация на весь пакет cd-rr и её будет много. Поэтому прошу пост ответами не подпирать!


Глава 1: Начальные сведения.

Что и как оно делает
Работают обе программы до смешного просто. :-)

  • Пользователь готовит каталог с файлами, затем командой DIR /S /B /A-D /OEN > список-файлов создаёт список, после чего этот список редактирует, убирая из каждой строчки начало (общую часть полного пути) и вставляя перед оставшимся относительным путём ключик с желаемым типом файла и защиты (см. файлы example\protect.lst и doc\manual.enu либо doc\manual.rus в поставке; чуть позже я распишу этот процесс подробнее).
  • rrenc (кодер, или защищалка) считывает исходный список файлов, формирует .rrt-файл (управляющий файл для rrdec) и ещё некоторые списковые и управляющие файлы (если таковые заказывались). Затем читается массив защищаемых файлов, по ходу из считанного вычисляются избыточные данные (см. дальше в этой главе описание командной строки кодера, параметр "размер") и в конце концов записываются в выходной .rrd-файл.
  • Входящая в пакет программа m2cdm - это слегка модифицированный mode2cdmaker от авторов формата XCD. Она получает от rrenc'а файл описания структуры XCD-диска (см. далее ключ --output-base) и создаёт образ, пригодный для записи на болванку.
  • rrdec (декодер, или восстанавливалка) считывает .rrt-файл, затем читает массив из защищённых файлов и .rrd-файла и, если заказано, создаёт копии файлов. По ходу опять же ведутся расчёты и фиксируется номер каждого нечитаемого сектора (а для XCD - ещё и номер каждого сектора с несовпадающей EDC). В конце подсчёта, если битых секторов было не больше, чем секторов с избыточными данными, битые секторы вычисляются и рассовываются по местам. (Кроме того, выполняются ещё кое-какие проверки правильности, но об этом позже.) Всё! Либо ваши данные восстановлены полностью, либо... битых секторов было слишком много - пробуйте на другом приводе, вдруг удастся прочитать больше... :-(

Как его запускать

Обе программы - rrenc и rrdec - построены на стандартном юниксовом консольном интерфейсе командной строки. Кто работал с DOS'ом или UNIX'ом - знают. Кто не в курсе - спрашивайте (у меня или у тех, кто знает ;-) ). Кто знает ссылку на толковое описание на русском - делитесь.

Итак, программы отзываются на стандартный ключ -h (или --help) и выдают список параметров.

Формат командной строки кодера:

rrenc <обязательные-ключи> [ необязательные-ключи ] <размер> <RR-список> [ RR-данные ]

  • Строго говоря, обязательный ключ только один: --input-list; возможно, в будущем появятся ещё. Набор необязательных ключей (опций) куда более обширен и может изменяться с выходом новых версий.
  • Размер - это, собственно, количество секторов избыточных данных; размер сектора зависит от формата - для ISO-дисков это 2048 байт, для XCD - 2324 байта. Количество секторов на компакт-диске, само собой, не зависит от типа диска (ISO или XCD) - только от его номинальной ёмкости; на обычный 80-минутный ("700-мегабайтный") CD-R / CD-RW помещается около 360000 секторов; соответственно, предельный суммарный размер данных и избыточности выбран близко к этому значению и составляет 393 204 сектора, или почти 768 мегабайт для ISO- / чуть больше 871 мегабайта для XCD-диска - этого с головой хватит на любой overburn. :-) Какой именно размер избыточности заказывать - вопрос интересный. :-) Я обычно задаю от полпроцента до двух процентов объёма диска, т.е. 1800...7200 секторов - это требует от 20 минут до полутора часов работы программы. (При первых испытаниях технологии, чтобы получить три с половиной тысячи сбойных секторов - всего 1% ёмкости компакт-диска, - мне пришлось исцарапать гвоздём добрую четверть его поверхности!)
  • RR-список, или .rrt-файл (от слова "RR-lisT") - это описатель набора защищённых файлов, он генерируется в самом начале расчёта защитных данных и является обычным текстовым файлом (правда, в формате UNIX-текста, т.е. редактировать его встроенным редактором FAR Manager'а удобно, а штатным форточным "Блокнотом" - не очень. :-) Впрочем, если кому-то это покажется неудобным - no problemo, переделаю. :-) )
  • RR-данные, или .rrd-файл, - это файл, в который будут записаны собственно избыточные данные (от "RR-Data"). Параметр необязательный, хотя зачем ему быть необязательным - честно говоря, не помню :-) и в ближайших версиях эту неувязку устраню. В момент начала расчёта создаётся пустой файл, по завершении расчёта - заполняется реальными данными.
  • Пути к .rrt- и .rrd-файлам задаются относительно --target-dir, поэтому задавать абсолютный путь нельзя!

Формат командной строки декодера:

rrdec <обязательные-ключи> [ необязательные-ключи ]

  • Обязательный ключ также только один: --input-list, а список опций - куда обширнее. (Предлагаю не рассматривать поддерживаемый декодером режим совместимости с версиями пакета до 1.0 - уважаемой публике он не нужен, а мне... а мне как раз пока ещё нужен - под сотню дисков я записал как раз пакетом версии 0.96.)

Глава 2: Первое знакомство.

Как им управлять

Рассмотрим основные ключи, общие для обеих программ:

  • -h, --help
    • ну, это понятно. Правда, подсказка будет выведена на корявом английском (так уж оно исторически сложилось...), но зато она всегда самая свежая. :-)
  • -@ <файл>.rrt, --input-list=<файл>.rrt
    • список обрабатываемых файлов (.rrt-файл). Параметр обязательный, значения по умолчанию не имеет. Путь к списковому файлу никак не соотносится ни с --source-dir, ни с --target-dir. Описание форматов списковых файлов будет в следующей главе.
  • -s <путь>, --source-dir=<путь>
    • базовый путь к дереву подкаталогов, в которых лежат защищаемые файлы. Относительно него строятся пути к файлам, перечисленным во входных списках; он же, как правило, отображается на корневой каталог компакт-диска при его создании. Пути к файлам и каталогам, задаваемые в других параметрах, никак с этим путём не соотносятся. Значение по умолчанию: текущий каталог.
  • -t <путь>, --target-dir=<путь>
    • для rrenc: базовый путь к формируемым файлам - он нужен, к примеру, чтобы рассчитать защитные данные для файлов на компакте (или на сетевом диске, доступном только на чтение). Значение по умолчанию: копия --source-dir (текущий каталог, если --source-dir тоже не задан);
    • для rrdec: базовый путь к дереву подкаталогов, куда будут восстанавливаться файлы. Значения по умолчанию не имеет. Если не задан - восстановление не производится, а выполняется только проверка на пригодность к восстановлению.
  • -o <база>, --output-base=<база>
    • базовый путь (вернее, имя с путём, но без расширения) для файлов программы m2cdm. Значения по умолчанию не имеет. Если задан - во время защиты или восстановления создаётся файл параметров для m2cdm с именем <база>.um2. Если потом запустить m2cdm с параметром -paramfile <база>.um2 - будет сгенерирован образ диска (файлы <база>.cue, <база>.bin, <база>.toc), из которого можно нарезать болванку большинством программ для записи компакт-дисков или смонтировать образ большинством программ-эмуляторов.
  • -e <расширение>, --form2-ext=<расширение>
    • расширение имени, которое будет присвоено XCD-файлам. Значение по умолчанию: "xcd". (Вообще-то всюду, в том числе и в m2cdm, принято расширение по умолчанию "dat", но это расширение имеют и файлы реестра в Windows 95/98, и базы данных Clarion'а, и ещё какие-то системные данные... В конце концов, "xcd" - вполне достойное расширение для файлов на компакт-дисках в формате XCD. :-) )
  • -l <метка>, --volume-label=<метка>
    • метка диска. На процесс защиты эта запись не влияет. В файл параметров для m2cdm (см. ключ --output-base) добавляется команда о присвоении образу метки.
  • -w, --overwrite
    • разрешает перезаписывать выходные файлы. В противном случае программы прекращают работу, если хотя бы один из выходных файлов уже существует - чтобы случайно не затереть (а вдруг там что-то ценное? :-) ).
  • -c, --no-check-hdr
    • разрешает проверять защищаемые файлы на XCD-формат только по расширению имени(это существенно уменьшает время начального типирования файлов). Иначе проверяется начало каждого защищаемого файла на предмет наличия в нём заголовка, типичного для .xcd-файла, - это долго, но, возможно, надёжнее.
  • -v, --verbose
    • задаёт повышенный уровень "болтливости" программы. Полезно для выяснения причин, почему программа работает не так, как надо. Болтовня идёт на английском языке, поэтому в нормальных условиях раздражает. :-)
  • -q, --quiet
    • наоборот, "молчаливый" режим - полезен, если списковый файл проверен, батники отлажены и можно давать записанный диск чужим людям. :-) Выводятся только сообщения о серьёзных ошибках (типа переполнения диска или нехватки памяти).
Формат входного списка для каждой программы свой. Рассмотрим сначала более простой формат - список для кодера. Поддерживаются записи следующих типов:
  • #<любой текст> или пустая строка
    • комментарий. Копируется в создаваемый кодером .rrt-файл без изменений.
  • -l <метка>
    • метка диска (запись аналогична ключу --volume-label, но приоритет у неё пониже).
  • -c <параметр>
    • дополнительный параметр для m2cdm. Строка <параметр> без всяких изменений добавляется в файл параметров для m2cdm (см. ключ --output-base; если этот ключ не задан - параметр попросту игнорируется).
  • -d <каталог> (работает с версии 1.21)
    • запись о каталоге. Означает, что все следующие за этой строкой файлы должны собираться в указанный каталог, если включена опция --process-dir, иначе запись игнорируется и каталог формируется из путевой части имени файла (для простоты создания списка вручную :-) ).
  • -<тип> <файл>
    • запись о файле.
      • Тип может принимать значения:
        • f - обычный (ISO 9660) файл без никакой защиты;
        • i - защищённый обычный файл;
        • x - защищённый мультимедиа- (.xcd-) файл;
        • m - .xcd-файл без защиты (трудно сказать, зачем такие файлы нужны, но тоже поддерживаются :-) );
        • I или X - то же, что и i или x, но с выравниванием по границе кластера (были нужны в старых версиях, сейчас используются только для внутренних нужд или при отладке).
      • <файл> обязательно должен быть относительным путём (относительно --source-dir, само собой); однако, начиная с версии 1.25, можно задавать и абсолютный путь - при заданном ключе --process-dir и пустом --source-dir (это может оказаться полезным для запуска rrenc из-под другой программы, из-под GUI, например).
  • -@
    • запись об .rrt-файле. Эквивалентно -f <.rrt-файл> - имя берётся из командной строки, тип файла - ISO, без защиты (странно, конечно, что самый важный файл в системе защиты записывается без защиты, но в этом направлении я тоже копаю; а пока я просто при записи каждого диска копирую на него .rrt-файлы с предыдущих дисков).
  • -r
    • запись об .rrd-файле. Аналогично предыдущему случаю: имя - из командной строки, защищённый, выравненный. Тип файла - .xcd, если среди защищаемых был хотя бы один .xcd-файл, в противном случае - обычный файл. В списке запись должна стоять после всех защищаемых файлов, иначе будет выдано сообщение об ошибке.
  • Если файл, описанный в списке как защищаемый, не существует - выводится сообщение об ошибке и программа завершает работу. Если же отсутствует незащищённый файл - не страшно, он всё равно включается в список и его можно включить позже, но при восстановлении его длина и дата/время проверяться не будут (подробности см. в описании формата .rrt-файла).

    Для версий до 1.19 включительно - в именах файлов и каталогов не допускались русские буквы. Кроме того, если среди имён файлов и/или каталогов были длинные имена и/или имена, содержащие что-либо кроме букв, цифр и знака подчёркивания и заказывался управляющий файл для m2cdm, - надо было его править вручную, заменив строку -isolevel1 на более высокий уровень (см. встроенную справку по m2cdm). Начиная с версии 1.20, уже работает поддержка русских букв (см. --ansi-charset для rrenc) и автоопределение уровня ISO (правильная установка ключа -isolevel при формировании файла параметров для m2cdm).

    (Cоветую также принять меры, чтобы (в случае, если .rrd-файл располагается на одном компакт-диске с защищаемыми файлами) он был записан после всех защищаемых файлов - внешний край диска обычно наиболее уязвим для повреждений, а защищённые файлы всё же ценнее, чем избыточность. При использовании m2cdm это сделать несложно - файлы на создаваемом образе сортируются по глубине вложенности каталога, т.е. вложенность .rrd-файла должна быть не меньше вложенности самого глубоко вложенного из защищаемых файлов.)


Глава 3: Копаем глубже.

Теперь пройдёмся по оставшимся опциям.
Advanced опции кодера.

  • -p <файл>, --plain-list
    • запрос на генерацию списка файлов (простой текстовый формат, аналог вывода команды DIR /S /B /A-D. Пригоден для создания на его основе .bat-файлов, входных списков для архиваторов... вообще может пригодиться. (Я из него делаю батник для расчёта md5-сумм - полезно для проверки качества восстановления.)
  • -r файл, --rrdata-header=<файл>
    • заголовок для .rrd-файла. Можно написать словами что-то вроде "Я - ФАЙЛ ИЗБЫТОЧНОСТИ, ЗАЩИТА ФИЛЬМА такого-то, НЕ ЗАПУСКАЙТЕ МЕНЯ!!!". :-) Поскольку на XCD-диске .rrd-файл получает то же расширение, что и фильм, не исключено случайное скармливание этого файла плееру (с последующим выпадением последнего в осадок). Поэтому я в качестве заголовка использую маленький (12 килобайт) фильм из одного кадра, в котором торчит надпись "ЭТО НЕ ФИЛЬМ!" (см. файл example\rrd_head.mkv в пакете поставки).
  • -a, --ansi-charset
    • задание ANSI-кодировки входного списка файлов и выходного .rrt-файла. Значение по умолчанию: кодировка OEM/DOS. Правильная установка кодировки влияет на правильность обработки файлов с русскими буквами в именах.
  • -u, --multi-track (с версии 1.25)
    • режим создания многодорожечного образа XCD. Значение по умолчанию: однодорожечный XCD. Имеет смысл только для управления параметром -single в файле параметров для m2cdm при создании XCD, больше ни на что не влияет.
  • -i, --strict-mode
    • добавление в записи .rrt-файла длины и даты/времени для всех файлов (по умолчанию длина и дата/время сохраняются только для защищаемых файлов - для проверки их на изменения и для восстановления точной длины .xcd-файлов). Эта опция связана с одним неудобством в m2cdm: при создании образа всем файлам (и .xcd-, и обычным) присваивается дата/время создания образа, и потом сложно разобраться - какая версия какого файла более свежая. (Upd от 02/11/2012: начиная с версии 1.30, m2cdm уже пишет в создаваемом образе правильную дату-время файлов.)
  • -k, --fake-output
    • никаких вычислений - только генерация .rrt-файла (и сопутствующих файлов при необходимости - см. ключи --output-base, --plain-list=<файл>), проверка защищаемых файлов на отсутствие ошибок чтения и генерация заполненного нулями фальшивого .rrd-файла требуемого размера. (Удобно для пробных прогонов - получится ли, уместится ли на болванку...)
  • -n, --no-read-files
    • то же самое, что и --fake-output, но даже без проверки на чтение. Работает очень быстро - порядка секунды.

Advanced опции декодера.

  • -a, --all-files
    • режим восстановления c компакт-диска всех файлов, включая незащищённые. Полезен, например, при создании ещё одной копии компакт-диска. Разумеется, в случае сбоя на незащищённом файле восстанавливать его нечем - файл попросту либо не будет восстановлен, либо получит дополнительное расширение .bad, в зависимости от наличия опции --keep-broken (см. ниже). Несовместимо с --no-restore.
  • -u <путь>, --update-dir=<путь>
    • каталог обновлений, т.е. каталог, из которого при восстановлении нужно брать обновлённые версии файлов, помеченных как незащищённые (драйверы, кодеки, плееры, ... - всё то, что особой ценности не представляет, есть на каждом диске и периодически обновляется). Степень свежести файлов, естественно, не проверяется; если файл, описанный в .rrt-файле, есть в каталоге обновлений, его длина совпадает с заданной и файл открылся без ошибок - он подменяет собой соответствующий файл из исходного каталога, иначе используется исходный файл. (Особенность, полезная для отладки: если файл из каталога обновлений имеет нулевую длину - rrdec действует так, как если бы исходный файл отсутствовал.) Опция, само собой, не имеет смысла без опций --all-files или --update-protected. Никак не соотносится ни с --source-dir, ни с --target-dir; путь может быть как абсолютным, так и относительным.
  • -r, --update-protected
    • позволяет аналогичным образом обновлять также и защищённые файлы - например, в случае, если оригинальный файл на компакт-диске отсутствует или имеет слишком много повреждений (или по ошибке записан фальшивый .rrd-файл вместо правильного (см. rrenc, опцию --fake-output) - со мной такое однажды было. :-( ), а под руками есть правильная копия. Опция, естественно, не имеет смысла без опции --update-dir. Применять с осторожностью!
  • -p, --copy-only
    • только копировать файлы (и извлекать содержимое .xcd-файлов, если не задано --xcd-output); сбои не восстанавливать (заполнять битые секторы нулями; если задано --xcd-output - дополнять специально запорченным полем EDC), на пригодность к восстановлению не проверять. (Зачем оно мне понадобилось - не помню... Пусть будет - где-нибудь да пригодится. :-) ) Не имеет смысла без --target-dir. Несовместимо с --no-restore.
  • -n, --no-restore
    • не восстанавливать файлы (кроме .xcd - из них извлекать содержимое). Режим, в принципе, полезен для создания образа m2cdm'ом (см. опцию --output-base) из копии на винчестере. Не имеет смысла без --target-dir. Несовместимо с --copy-only, --all-files, --xcd-output.
  • -x, --xcd-output
    • при копировании/восстановлении не извлекать содержимое из .xcd-файлов - копировать их как есть (само собой, исправлять сбои, если не задано --copy-only). Не имеет смысла без --target-dir. Несовместимо с --no-restore, --output-base.
  • -b, --keep-broken (пока толком не работает, будет исправлено в следующей версии)
    • не удалять копии файлов, недовосстановленных из-за фатальной ошибки или не подлежащих восстановлению (т.е. при нехватке избыточных данных для восстановления, либо при повреждении незащищённых файлов); такие файлы переименовываются с дополнительным расширением .bad. :-(
  • -z, --zero-damaged
    • расценивать секторы, заполненные нулями, как битые. Со всеми вытекающими: незащищённые файлы удалять (либо переименовывать в .bad, если задано --keep-broken), защищённые - восстанавливать (если не задано --no-restore либо --copy-only). Режим полезен при попытке восстановления файлов, скопированных со сбойного компакт-диска в режиме --copy-only либо после аварийного восстановления cdcheck'ом (либо любой другой программой, которая заполняет непрочитанные секторы нулями).
  • -f <число-секторов>, --on-the-fly=<число-секторов>
    • задаёт максимальное количество битых секторов для восстановления "на лету" - при первом проходе, во время начального копирования файлов с компакт-диска на винчестер (т.е. если сбойных секторов было не более, чем заказано в параметре, то все сбои будут восстановлены в ходе копирования и повторный проход уже не нужен). Значение по умолчанию: 72 сектора, что примерно соответствует одной минуте процессорного времени для P4 2.4 ГГц. Нулевое значение полностью отключает эту возможность, т.е. все расчёты будут выполняться только на втором проходе (это полезно, если у вас медленный процессор и быстрый винчестер, но неудобно при проверке компакт-диска (если не задан --target-dir), особенно для XCD).

Глава 4: Как-со-всёй-этой-фигнёй-взлететь HOWTO

Уфф, теперь можно попробовать воспользоваться свежепрочитанным. :-)
Всё нижеследующее удобнее всего делать под FAR Manager'ом - у вас всё будет под рукой: и текстовый редактор, и командная строка - а больше, в общем-то, ничего и не надо! ;-)
Итак, по пунктам.

0) Cоздание входного списка файлов для rrenc.

  • cd в каталог, который (и подкаталоги которого) защищаем.
  • dir /a-d /s /b /oen > список.txt - строим список файлов; порядок сортировки не важен, нужно только, чтобы в списке были только имена файлов с путями (никаких имён каталогов!) и чтобы при длинных именах файлов не было кавычек. Внимание! Русские буквы в именах файлов поддерживаются начиная с версии 1.20. Украинские буквы 'I', 'i', а также символы, которые есть только в наборах символов ANSI и Unicode (открывающие и закрывающие кавычки, символы "промилле" и "копирайт", некоторые другие), в кодировке OEM/DOS не поддерживаются и поддерживаться в ближайшем будущем не собираются - благодаря досадному ляпу нашего друга Билла Гейтса, эти символы попросту отсутствуют в кодировке.)
  • Редактируем файл список.txt любым текстовым редактором, позволяющим контекстную замену. (Если есть файлы с русскими буквами в именах - позаботьтесь, чтобы редактор корректно работал с кодировкой OEM/DOS, либо сразу ориентируйтесь на ANSI.) Нужно в каждой строке списка заменить постоянную часть полного пути (собственно, путь к каталогу) на ключик, задающий желаемый тип файла и тип защиты (см. описание формата входного списка для rrenc в главе 2 или во встроенной справке по rrenc). Можно также убрать из списка файлы, которые на компакт-диске не нужны, и добавить файлы, которых пока нет (например, файл с md5-суммами - обычно они вычисляются в последнюю очередь, когда всё остальное уже готово).
  • В списке надо предусмотреть место для .rrt-файла (ключик -@ без параметров, подробности см. опять же в описании формата входного списка). Рекомендую располагать его в начале списка (тогда он будет размещён на компакт-диске ближе к середине, в наиболее безопасном месте), а после окончания работы rrenc - делать ещё и резервную копию готового .rrt-файла.
  • Желательно также явно добавить ключик -r - место для .rrd-файла (ближе к концу списка - важно, чтобы он стоял после последнего защищаемого файла). Конечно, если его не будет - ничего страшного не произойдёт, программа сама добавит его в конец списка. Но в следующих версиях я намерен разрешить размещать .rrd-файл в любом месте списка и в любом каталоге.

1) Защита готового компакт-диска в формате ISO 9660 (т.н. "обычного") ("внешняя защита").

Примерно так:

  • выбрать, какие файлы защищать надо, а какие - нет;
  • выбрать каталог, куда будут складываться создаваемые rrenc'ом файлы, и их имена;
  • сделать список (см. выше), используя для защищаемых файлов ключик -i;
  • выбрать желаемый размер избыточности (см. формат командной строки кодера в первой главе, параметр <размер>);
  • запустить программу: rrenc -s <путь-к-компакт-диску> -t <каталог-для-результатов> -@<список> -wci -q <размер> <файл>.rrt <файл>.rrd
  • дождаться окончания расчёта (для процессора Pentium-4 2.4 ГГц - примерно по 10-12 минут на каждую тысячу секторов избыточности);
  • если расчёт не дошёл до конца из-за какой-то ошибки - повторить, задав в командной строке ключ -v (verbose) вместо -q (quiet), прочитать сообщение об ошибке, устранить причину, попробовать ещё раз; если ничего не помогает - обратиться ко мне (написать в топ или в личку), отвечу обязательно!
  • если ошибок не было и расчёт дошёл до конца - сохранить его результаты (<файл>.rrt и <файл>.rrd) в надёжном месте, потом пригодятся для восстановления.

2) Создание защищённого компакт-диска в формате ISO 9660 (назовём это форматом RR-ISO :-) ).

Почти как в предыдущем случае. Отличия:

  • если защитные данные будут храниться на самом компакт-диске - параметр -t <каталог-для-результатов> в строке запуска не задавать, но предусмотреть запас места для файла избыточности (<размер> * 2048 байт);
  • если защищаемые данные будут записываться на компакт в виде архива - нужно сначала заархивировать, а потом защищать (здравый смысл: для восстановления повреждённых файлов диска надо иметь .rrt- и .rrd-файлы, а как их извлечь из повреждённого архива? :-( );
  • для проверки, уместятся ли данные вместе с избыточностью на компакт-диск, можно добавить в строку запуска ключ --no-read-files - будет быстро (за секунды) сгенерирован фальшивый .rrd-файл; с ним можно прикинуть размер, но записывать его на компакт нельзя, надо выполнить рабочий расчёт (без --no-read-files).

3) Создание защищённого XCD-диска (формат RR-XCD).

Гибрид предыдущего случая и классической схемы создания XCD (см., например, домашнюю страничку DeXT'а, "On the way to XCD - or how to turn 700MB CDs into 800MB ones" или страничку XCD на SourceForge). (Правда, использовать cdrtfe, m2cdmgui или иной GUI-frontend, увы, не получится - пока не будет готов frontend к rrenc (я уже доделываю протокол интерфейса).))
Отличия от "обычного" компакта:

  • дополнительно нужна программа m2cdm (поставляется вместе с rrenc и rrdec). На самом деле это mode2cdmaker версии 1.5.1 от DeXT'а (http://dext.peque.org/xcd/mode2cdmaker-1.5.1-src.zip), слегка модифицированный. Дело в том, что оригинальный mode2cdmaker (по крайней мере, известные мне версии) в режимах -isolevel1 и -isolevel2 неправильно обрабатывает русские буквы в именах файлов и случаи, когда в одном каталоге есть несколько файлов с именами, которые после преобразования к соответствию стандарту ISO дают одинаковые строки. С другой стороны, нет гарантии, что диск, не соответствующий ISO Level-1, будет читаться под всеми операционными системами. Поэтому - пожалуйста, старайтесь не делать RR-XCD-диски с длинными именами файлов и русскими буквами! (Впрочем, rrenc начиная с версии 1.20 по умолчанию включает для m2cdm режим -isolevel1, но выключает его, если хотя бы один из файлов не вписывается в стандарт ISO Level-1. А в следующих версиях я что-нибудь придумаю - хотя поддержку RockRidge и MS Joliet не обещаю.)
  • во входном списке можно использовать ключики типов файлов -f, -i, -x и даже -m (см. формат входного списка для rrenc);
  • нужно выбрать каталог и имя для файлов образа диска, которые будут созданы m2cdm'ом;
  • в строку запуска надо добавить ключ --output-base=<каталог\имя-образа> (именно имя, без расширения!) - будет создаваться m2cdm'ный файл параметров по имени <каталог\имя-образа>.um2;
  • после завершения расчёта нужно выполнить собственно генерацию образа - командой m2cdm -paramfile <каталог\имя-образа>.um2

4) Восстановление засбоившего компакт-диска.

Собственно то, ради чего всё затевалось. :-) Сначала рассмотрим самый простой случай - сторонние программы не используются, управляющий файл и файл с избыточностью лежат на самом компакте (формат RR-ISO или RR-XCD):

  • выбрать каталог, куда восстанавливать файлы, и каталог, где собирать новый образ (если надо (желательно, чтобы каталоги были разными));
  • запустить программу: rrdec -s <путь-к-компакт-диску> -@ <путь\файл>.rrt -t <каталог-куда-восстанавливать> -wa -q;
  • если потом надо будет из восстановленных файлов записать новый диск (особенно в случае, если это RR-XCD-диск) - лучше сразу добавить в строку запуска параметр --output-base=<каталог-для-образа\имя-образа>, а после восстановления - запустить m2cdm -paramfile <каталог-для-образа\имя-образа>.um2.
Более сложный случай - защитные данные лежат не на компакте (например, внешняя защита - по схеме 1). Отличия от предыдущего варианта:
  • выложить .rrt- и .rrd-файлы в каталог, доступный для чтения (не в тот же самый, куда будет восстанавливаться содержимое компакта!);
  • в строку запуска добавить параметры --update-dir=<каталог-с-.rrt-и-.rrd-файлами> --update-protected;
  • при записи нового диска из восстановленных файлов весьма желательно записать на него и защитные данные (если хватит места).

Восстановление сбойного компакт-диска с помощью сторонних программ - может понадобиться при большом количестве сбоев. Программы для восстановления сбойных дисков обычно позволяют восстановить приличную часть повреждённых секторов, просто повторяя попытки считать сектор; если же после определённого числа попыток считать сектор не удалось - в восстановленный файл записывается сектор, заполненный нулями, либо прочитанная часть сектора, либо файл "схлопывается" на размер повреждённого сектора - каждая программа делает по-своему. :-(

Я использую бесплатную программу CDCheck - в режиме "Recover" она позволяет выставить число попыток чтения "битого" сектора (или тайм-аут на попытки) и при неудаче заполняет сектор нулями. Кроме того, CDCheck разбирается со сбойными секторами намного быстрее, чем стандартный файловый доступ, - пара секунд на попытку чтения (вместо полминуты).

Предлагаю к использованию следующую схему - отлично восстанавливает ISO-диски с внешней защитой и RR-ISO (к сожалению, RR-XCD берутся не столь изящно - CDCheck читает только фиксированными порциями по 2048 байт):

  • скопировать диск в каталог программой CDCheck в режиме Recover, задав небольшое количество повторов на сбойных секторах (2-5 повторов вполне хватит) и отключив режим статистической проверки;
  • запустить rrdec, взяв подходящую к случаю командную строку из предыдущих вариантов и заменив в ней -s <путь-к-компакт-диску> на -s <путь-к-копии> и добавив --zero-damaged (см. "Advanced опции декодера" в главе 3).

Возможны, само собой, ложные срабатывания - если в правильных данных были длинные (по 2 килобайта) последовательности нулей (например, такое возможно в заголовках .avi-файлов), но они увеличивают время восстановления на чуть-чуть (несколько секунд) и ими можно пренебречь. (А если таких секторов слишком много - может, в дальнейшем имеет смысл перед записью на болванку сжимать такие файлы архиваторами? :-) )



Этот пост будет неоднократно правиться - тут будет документация на весь пакет cd-rr и её будет много. Поэтому прошу пост ответами не подпирать!

Спасибо за проделанную работу. Хотя дисками я и не пользуюсь. ))

Sluggard написал:
дисками я и не пользуюсь
Но какое-то долговременное хранилище у тебя ж есть? Его тоже можно прикрыть. Покажу как или вместе придумаем.

Старый винт на 80 гигов. А вообще - есть же облака и другие файлохранилища. На Яндекс вроде зашифрованные файлы заливать разрешили.
Мой идеал - перфокарты из титана. Но он недостижим. ))

Sluggard написал:
Старый винт на 80 гигов {...} облака и другие файлохранилища
А-аа. Тут увы: инетные файлохранилища скисают не посекторно, а сразу целиком, тут никакая избыточность не поможет. Винчестеры почти аналогично - может накрыться сектор, другой, третий, десятый - а потом сразу подшипник или блок головок. :-(
Sluggard написал:
Мой идеал - перфокарты из титана.
Попробуй гранитные, имени Моисея. :-))))

В этот пост буду собирать интересные выдержки про cd-rr с разбросанных по инету вопросов с ответами, обcуждений, предложений и т.д. Тоже прошу на пост не отвечать, чтобы не заблокировать его правку.

(тоскливо) И понимают же люди, о чем говорят......

laurentina1 написал:
(тоскливо)
Не бери в голову - просто технические подробности. Давно записанные файлы любишь хранить? Так их можно сохранять на носителе, который выходит из строя по частям (компакт-диск, дискета, магнитная лента, да и тот же ящик перфокарт), а можно - на носителе, на котором гибнет сразу весь файл (файлообменник в инете) или даже все файлы сразу из-за физического сдоха носителя (винчестер или малоизвестный/низкобюджетный сайт).
Так вот, в первом случае моя прога поможет, во втором - увы, таки нет. :-(((((((

Свежие новости с фронтов разработки: найден способ быстро (на полпорядка-порядок быстрее, чем сейчас) считать 32-битные коды Рида-Соломона вместо используемых сейчас 16-битных. Практически это означает возможность перекрывать массивы не по нескольку десятков тире сотен тысяч секторов, как на компакт-диске, а по несколько миллиардов, т.е. за сравнительно разумные временны́е затраты защищать дофигатерабайтный винчестер или FMD-диск третьего поколения. Про такую мелочь, как DVD и блу-рейки, я вообще молчу... :-)

Хотел спросить: "Тигра, Тигра, где ты был?"...
Проскроллил и понял.

polarman написал:
Тигра, Тигра, где ты был?
Застрял на Самиздате и на форуме oldgames.ru. И там и там можно публиковать недоделанное. :-)

Некто persicum подкинул идею насчёт раза в три ускорить умножение в cd-rr. Сижу, реализую.
Интересный тип. Чистый Nazgul. :-) На форуме ICE ECC его даже забанили пожизненно за неудобные вопросы. :-)))))))

Наиболее ценное - 16-20 Гиг храню на 2-3 разных носителях. Одновременный выход из строя 2-х разных носителей - крайне (если вообще ....) маловероятное событие. Малоценное, если что - туда и дорога...

ProstoTac написал:
на 2-3 разных носителях. Одновременный выход из строя 2-х разных носителей - крайне (если вообще ....) маловероятное событие.
Если носители из одной партии - то неплохо коррелируется. Даже если носитель типа "дохнет сразу весь" - как два винчестера из одного ящика в магазине или два инет-диска на двух разных сайтах на одном физическом сервере. :-(
Если носитель типа "дохнет посекторно" (flash'ка, CD- или DVD-R) - то неплохо коррелируются номера дохнущих в первую очередь секторов у болванок из одной партии. Имел счастье. :-(
X