[Перевод] Восстановление исходного кода старой игры с ленточного накопителя
Моя история
Мне досталась лента с готовой версией игры Frogger 2: Swampy’s Revenge. В детстве я очень любил эту серию игр.
Считалось, что эта лента — единственная резервная копия исходного кода готовой игры, игровых ресурсов и других данных разработки.
Как вы можете понять, эта находка в случае её восстановления оказалась бы бесценной. Но как же вообще считать/записать данные на ленту? Зачем вообще использовались ленточные накопители?
В 1999/2000 годах средний размер жёсткого диска составлял примерно 10 ГБ, к тому же они не славятся долгим сроком службы.
Очень привлекательным предложением были ленточные накопители OnStream, потому что имели картриджи по 50 ГБ (25 ГБ без сжатия) и к тому же стоили дешевле большинства жёстких дисков!
Ленты отлично подходят для резервного копирования, а при правильном хранении могут иметь долгий срок службы. К тому же можно купить ленточный накопитель, который вставлялся в компьютер как CD-привод или привод гибких дисков.
К сожалению, несмотря на долгий срок службы лент, сами ленточные накопители подобным похвастаться не могли. Компания OnStream, производившая такие ленты и накопители, прекратила свою работу в 2003 году, хотя первый накопитель выпустила всего лишь в 1999 году.
Такие накопители встречались редко, особенно модели, способные работать с лентами на 50 ГБ. Поэтому первой большой проблемой стал поиск совместимого накопителя.
Картридж с лентой
▍ 1. Поиск совместимого/рабочего ленточного накопителя
К счастью, я знал, что мне нужен накопитель «OnStream SC-50», потому что эта модель была записана на этикетке ленты.
Я нашёл единственную компанию, продававшую такие накопители онлайн, и ухватился за эту возможность. К сожалению, что бы я ни делал, после вставки ленты в накопитель она как будто считывалась, а потом автоматически извлекалась.
Я пробовал разные операционные системы, разные версии ПО, разное ПО, разные драйверы и так далее. Ничего не помогало.
Наконец, я пришёл к выводу, что накопитель сломан. Изучение его внутренностей подтвердило мою догадку: резиновый прижимной ролик расплавился.
Мои попытки починить накопитель были, скажем так, безуспешными, так что я начал искать другой накопитель. И поскольку других вариантов не было, я взял ADR-50e. Этот накопитель рекламировался как совместимый с таким типом лент. Накопитель работал с моей «тестовой лентой» (пустой лентой, которую я купил специально для тестирования), но всё равно отказывался считывать ленту с Frogger.
На этом этапе я ошибочно предположил, что проблема, должно быть, в самой ленте и она повреждена.
На самом же деле, несмотря на утверждения о совместимости ADR-50e с лентой, имелась одна тонкость. Он был совместим только с лентами, записанными на самом накопителе ADR-50e, или с лентами, записанными определённым ПО.
Тогда я даже не знал, каким ПО записывались данные, не говоря уже об этой малоизвестной особенности ленточного накопителя, ведь его рекламировали как совместимый.
Поэтому предположив, что лента неисправна, я отправил её в компанию, занимающуюся профессиональным восстановлением данных. Это было ОГРОМНОЙ ошибкой…
Расплавившийся прижимной ролик
▍ 2. Профессиональное восстановление данных — это отстой
Они ведь профессионалы, что может пойти не так? На веб-сайте этой компании было прямым текстом сказано, что она может восстанавливать данные с лент OnStream, а отзывы о ней были хорошими (и, насколько я могу судить, написаны не ботами).
Возможно, компания хорошо справлялась с распространёнными типами хранилищ данных наподобие жёстких дисков или SSD. С ними работа должна быть проще, потому что существуют совершенные инструменты восстановления этих устройств.
Однако я не думаю, что когда-нибудь ещё раз отправлю ленту в компанию, занимающуюся профессиональным восстановлением данных, даже если это будет более популярный формат цифровой ленты.
Что должна была сделать эта компания:
Ей не следовало рекламировать возможность восстановления данных с таких лент, ведь она, очевидно, на это неспособна.
Компании следовало чётко объяснять риски, ведь она даже не знала, может ли используемое ею устройство восстанавливать данные с ленты, хотя она и притворялась, что умеет это делать.
Компании не следовало говорить мне, что она может восстановить данные с этой ленты.
Что эта компания сделала:
Эта компания заявляла, что может восстанавливать данные с лент OnStream. Это полная брехня.
Очевидно, у неё даже не было ленточного накопителя OnStream SC-50, потому что, если бы он был, она могла просто использовать официальное ядро Linux, выпущенное 10–20 лет назад, в котором есть драйвер, способный дампить эти данные.
Примерно в течение месяца я получал очень редкие и расплывчатые сообщения от компании, несмотря на то, что предоставил ей крайне подробную техническую информацию и задал чёткие вопросы.
В конце концов, месяц спустя, я понял, в чём заключалась настоящая проблема,
а поскольку ситуация с восстановлением данных развивалась не очень хорошо, я попросил вернуть ленту обратно.
Мне написали, что мне отправят её «в том виде, в котором мы её получили». Абсолютная ложь. Полученная мной лента была разорвана во множестве мест и снова склеена.
Если бы это была аудиоплёнка или что-то древнее, то, возможно, ничего страшного бы не произошло, но полученная мной обратно лента имела проблемы, которых НЕ было при отправке.
Компании ни за что бы ни удалось восстановить данные:
OnStream использовала технологию, которой не было ни в одном другом ленточном накопителе. Она установила специальный чип обработки данных (ASIC), спроектированный специально для её устройств, а не использовала распространённые чипы, применяемые в других накопителях, например, Travan.
В конвейере обработки данных от ленты до цифровых данных использовалось специализированное оборудование, разработанное с нуля для ленточных накопителей OnStream, потому что это позволяло OnStream добиваться большей ёмкости, чем могла любая другая компания в то время.
Ни в одном другом типе ленточного накопителя ничего подобного не было. По сути, это означает, что единственный способ считать данные с этих лент заключался в использовании одного из оригинальных накопителей или оборудования из него.
Иными словами, любые устройства, в которые компания вставляла восстанавливаемую мной ленту, НЕ были совместимы с лентами OnStream.
Не знаю, зачем она утверждала, что может восстанавливать данные с лент OnStream, но на её сайте совершенно точно есть недобросовестная реклама.
Её действия чётко показали, что она не знает, как восстанавливать данные с лент OnStream.
▍ 3. Осознание
К сожалению, это стало очевидно уже потом.
Пока лента находилась на восстановлении данных, я получил ещё несколько лент с другой игрой, и мне с лёгкостью удалось сдампить две из них при помощи накопителя «OnStream ADR-50e». Также я определил, что для записи данных использовалось ПО ARCServe 2000. Благодаря тому, что на этикетке была написана модель ленточного накопителя, я понял, почему не мог считать ленту с Frogger 2. Причиной были не проблемы с лентой, а то, что на самом деле мне нужен был накопитель SC-50, а не ADR-50.
Но было слишком поздно. Компания уже нанесла урон ленте, и после того, как я, наконец, нашёл ещё один ленточный накопитель SC-50 (на этот раз работающий), мои наихудшие опасения подтвердились.
Склейки не просто мешали считыванию данных в склеенной области, но и настолько сильно влияли на накопитель, что после вставки в него ленты он постоянно пытался повторно считывать данные со склеенной области.
К тому моменту я нашёл документацию по командам, которые компьютер может отправлять накопителю, и по возможностям накопителя.
Но из-за того, что сразу после вставки ленты накопитель переходил в бесконечный цикл повторных попыток (ниже я буду называть этот процесс «инициализацией»), накопитель так и не мог дойти до состояния, в котором компьютер может отдавать накопителю команды.
Вероятно, на этом моя история должна была завершиться. Я должен был сдаться и опустить руки. Но мне важны были эти данные, и к тому же я кое-что понимал в компьютерах.
Пример склейки. По крайней мере, они получились у компании качественными
▍ 4. Настало время хакерства
Как это часто бывает, я понял, что если хочешь сделать что-то правильно, нужно делать это самому.
Это меня выбесило, потому что профессиональное восстановление данных — дорогостоящая услуга. Если бы я не выбрал компанию, работающую по принципу «если данные не восстановлены, плата не взымается», то заплатил бы ей тысячи долларов за то, что она испортила мне ленту.
Это безумие, и я до сих пор расстроен тем, что компания обещала, что даже сможет восстановить данные с ленты. Похоже, они не восприняли эту работу серьёзно.
Однако я использовал эту ситуацию для собственной мотивации.
Я потратил месяцы на изучение накопителя, его интерфейса управления SCSI, на реверс-инжиниринг прошивки, чтение документации, поиск патентов и так далее.
Узнав о накопителе гораздо больше, 5 апреля 2023 года я обнаружил способ, который оказался намного проще, чем все остальные проверенные методики.
Если проблема в процессе инициализации, то почему бы не выполнить его с работающей лентой? Тогда мы обманем датчики накопителя и сможем заменить ленту, а он об этом не узнает.
Благодаря этому трюку, я успешно сдампил неповреждённые части ленты.
Модифицированный накопитель
Дампинг ленты
▍ 5a. ARCServe — тоже отстой
После дампинга данных с ленты оставалась одна проблема — непригодный формат.
Считанные с ленты данные отформатированы записавшим их ПО.
К сожалению, у каждого совместимого ПО для резервного копирования может быть собственный формат, в том числе и у ARCserve.
Если бы я смог воспользоваться оригинальным ПО для обработки сырого дампа, то оно автоматически выдало бы мне данные в пригодном для использования виде. Конечно, если бы ARCserve не был настоящим мусором! Оказалось, что ARCserve поломан. Он даже не мог считывать записываемые им неповреждённые ленты OnStream.
Эта проблема не возникает у лент, записанных накопителем ADR-50, однако все протестированные мной ленты, записанные на OnStream SC-50, НЕ восстанавливались с ленты, если только запись и восстановление не происходили на одном компьютере. Это вызвано тем, что на записывающем ленту компьютере хранился каталог информации о ленте, в частности, список файлов на ленте, который ARCserve должен восстановить без этого списка, потому что он хранится только на создавшем его компьютере; в противном случае пропадает весь смысл резервного копирования.
Однако несмотря на то, что ARCserve отображает всплывающее окно с сообщением «Restoration Successful», он восстанавливает до первых 32 КБ каждого файла на ленте, но НЕ БОЛЬШЕ.
С неповреждённой ленты на много гигабайтов, считывание которой занимает у ARCserve два часа, суммарно восстановился примерно 1 МБ данных.
▍ 5b. Переводим данные в пригодный формат
Для преобразования файлов в пригодный формат (.zip) мне пришлось написать программу преобразования дампов ленты из формата ARCserve в .zip.
К счастью, формат ARCserve не очень сложен, и я довольно быстро с ним разобрался.
Однако было кое-что странное. Ненормально большое количество файлов экспортировалось неправильно.
Потратив некоторое время на анализ данных и размышления, я понял, что для чтения ленты ARCserve использовал недокументированный режим. Подробнее о нём рассказывается в этом руководстве, однако ARCServe использовал функцию, незадокументированную в официальном документе разработки драйвера OnStream.
Эта незадокументированная функция позволяла ARCServe считывать и записывать данные в полностью отличающемся от описанного в документации паттерне.
Даже изменив свою программу так, чтобы она считывала данные незадокументированным способом ARCserve, я всё равно сталкивался с неожиданными ошибками.
На этот раз я почти сразу заметил, что отсутствующие данные находились в том месте ленты, которое в документации явным образом называет местом, куда «не могут записываться пользовательские данные».
Поэтому я снова переписал свои инструменты и программу для дампинга, чтобы они могли считывать область, «в которую нельзя записывать пользовательские данные».
Наконец, спустя месяцы реверс-инжиниринга ARCServe, прошивки накопителя и другого мусора, программа заработала, и данные были спасены.
Исходный код программы извлечения находится здесь.
Восстановленные файлы
▍ 6. Завершение
В конечном счёте, восстановление увенчалось безусловным успехом. Благодарю всех, кто помогал мне с этим проектом, без вашей помощи он и восстановление данных заняли бы гораздо больше времени.
Сохранены все важные данные, например, резервная копия репозитория VSS (история исходного кода), ресурсы готовой игры, инструменты и многое другое.
Моя лента была единственной резервной копией всего этого, она завершила архивы разработки Frogger 2, которые будут опубликованы.
Это может показаться ужасным, но восстановлено примерно 12 ГБ из 15 ГБ записанных данных, хотя на самом деле всё не так плохо.
Повреждена пара тысяч файлов, но они составляют менее 5% от общего количества файлов на ленте.
Почти все повреждённые файлы или найдены на другой резервной копии на CD, или дублированы на другой части ленты.
Идеально не удалось восстановить лишь 15 файлов; особенно примечателен среди них CD-образ версии игры для PC, собранный спустя месяц после релиза.
Я восстановил 58149 из 58164 файлов с ленты и расцениваю это приключение как настоящий успех.
Вот как выглядят повреждения на ленте Frogger 2. Они существенны и дают понять, как мне повезло с восстановлением.