Проблема сжатия файлов NTFS

У меня есть несколько сотен файлов фотографий, которые случайно были перемещены со сжатого внешнего диска, отформатированного в Windows NTFS, на второй внешний диск, отформатированный в Mac OS X. Перемещение было выполнено в операционной системе Mac OS X. К сожалению, процесс перемещения файлов был завершен без того, чтобы все исходные файлы были "распакованы" файловой системой Windows.

Кто-нибудь знает о каком-либо сервисе восстановления, приложении или ручном методе преобразования, который позволит мне восстановить эти файлы фотографий, все из которых теперь рассматриваются как "поврежденные" файлы JPG и RAW? Будем весьма благодарны за любую помощь или предложения, которые вы можете предложить.

1 ответ

Решение

Сжатие NTFS обозначается флагом в метаданных файла, который хранится в таблице основного файла (MFT). Задать его напрямую сложно, потому что обычно при изменении этого флага драйвер файловой системы сжимает или распаковывает файл для вас. Возможно, вы могли бы добавить этот флаг вручную - это всего один бит в атрибутах файла DWORD - но прямой взлом MFT, вероятно, не лучший подход. Вместо этого попробуйте следующее:

  1. На томе NTFS (это может быть флэш-накопитель, если вы отформатируете его в NTFS), создайте один (или несколько) сжатых файлов (используя Windows). Ради этих инструкций мы будем называть эти файлы rescue1, rescue2, так далее.
  2. Подключите диск NTFS к вашей системе Mac (без предварительного распаковки файлов). Смонтируйте том чтения / записи. Допустим, он установлен на /mount/ntfs (Я на самом деле не использую OS X достаточно, чтобы запомнить, где он монтирует внешние тома).
  3. Использование инструмента, который копирует содержимое файла, такого как утилита командной строки dd скопируйте содержимое файлов сжатых без метаданных в содержимое сжатых файлов на томе NTFS. Команда будет что-то вроде dd if=/path/to/bad/file of=/mount/ntfs/rescue1 bs=4M,
  4. Подключите диск к Windows и посмотрите, можно ли теперь правильно открыть сжатые файлы. Если они могут, вы можете безопасно распаковать их в Windows (либо на месте, либо скопировав на диск, который не поддерживает сжатие, например, флэш-накопитель FAT32).
  5. Если этот подход работает, вы можете использовать его для спасения всех ваших сотен файлов. Просто создайте столько сжатых файлов на диске NTFS, сколько вам нужно, назовите их любым удобным для вас способом (это могут быть оригинальные имена) и скопируйте содержимое с Mac.

Обратите внимание, что вам не нужно сжимать весь том NTFS; это просто заставляет все каталоги наследовать флаг "Сжатый", и каждый файл наследует его от каталога файла. Это не мешало бы сделать это.

Тем не менее, я рекомендую использовать резервный или выброшенный том NTFS; если драйвер OS X NTFS настолько плох, он может повредить MFT при попытке записи на том Windows.

Более сложный альтернативный подход, если вышеперечисленное не работает:

  1. Создайте кучу сжатых файлов в Windows. Сложность в том, что они должны соответствовать размеру плохих файлов. Если вы хотите восстановить файл размером 30913 байт, вам понадобится сжатый файл NTFS такого размера после сжатия. Я буду честен; Я не уверен, как это устроить. Как минимум, сделайте файлы восстановления как минимум того размера (на диске), что и файлы, которые нужно восстановить. Лучше всего сделать совпадение по размеру в пределах 4 КБ, так как это размер по умолчанию для кластера NTFS (фрагменты выделения, используемые для данных файла).
  2. Использовать fsutil Утилита в Windows для получения экстентов файлов восстановления. Экстенты - это фактические смещения на томе, где данные файла хранятся в разделе.
    • Команда fsutil file queryextents <filename> и в зависимости от местоположения вам может потребоваться запустить его с правами администратора.
    • Вывод команды выглядит примерно так: VCN: 0x0 Clusters: 0x2 LCN: 0x48000, Это говорит о том, что файл занимает два кластера: логический номер кластера 0x48000 (смещение 4096*0x48000=1207959552) и смещение тома 0x48001, что составляет 8 КБ (2 x 4 КБ / кластер). На практике конец этого обычно неиспользуемого пространства.
    • Вывод может содержать несколько строк (это происходит, когда файл фрагментирован; это вряд ли произойдет на томе, который был недавно отформатирован, если вы размер каждого файла перед созданием следующего). Первое значение (номер виртуального кластера) в последующих строках не будет нулевым, это будет смещение (в кластерах) в файле, с которого начинается этот экстент (например, если это 0x3, это означает, что экстент начинается с 12k в файл).
  3. Отключите диск и подключитесь к OS X. Не монтируйте том в этот раз. Вместо этого найдите правильный идентификатор тома. В Linux это было бы что-то вроде /dev/sdb1, (Второй диск -> SDB 1, первый раздел -> SDB 1).
  4. С помощью dd скопируйте прямо в сырой том из ваших плохо сжатых файлов.
    • Например, допустим, ваш файл имеет два экстента:
      • VCN: 0x0 Clusters: 0x15 LCN: 0x13c
      • VCN: 0x15 Clusters: 0x3f6 LCN: 0xab20
    • Вы бы использовали следующие команды для dd, с именами файлов, скорректированными по мере необходимости. Для получения дополнительной информации смотрите страницу руководства dd, но пока обратите внимание, что все параметры dd удобно в кратных размеру блока (bs параметр), но шестнадцатеричные значения были преобразованы в десятичные (не уверен, если dd может правильно обрабатывать гекс; некоторые дд-подобные программы могут, но не все):
      • dd if=/path/to/bad/file of=/dev/sdb1 bs=4K count=21 seek=316
      • dd if=/bath/to/bad/file of=/dev/sdb1 bs=4k count=1014 seek=337 skip=21
  5. После того, как вы скопировали данные файла в необработанный раздел, вы сможете подключить диск к Windows и прочитать сжатые (восстановленные) файлы. Если размеры файлов не совпадают точно, вы можете обнаружить, что в конце файлов есть небольшой мусор, но, надеюсь, это не будет проблемой.

Другой подход (возможно, проще, даже намного проще) состоит в том, чтобы найти рутину в ntfs-3g это обрабатывает декомпрессию NTFS. Запустите эту процедуру для файлов напрямую. Кроме того, посмотрите, можете ли вы найти копию ntfsdiskedit утилита (кажется, была прекращена) и посмотреть, можете ли вы использовать ее, чтобы вручную установить бит "Сжатый" в файле после копирования их (как несжатых файлов) на том NTFS.

Другие вопросы по тегам