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

Проблема сжатия файлов 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; если драйвер NTFS в OS X настолько плох, он может повредить MFT при попытке записи на том Windows.

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

  1. Создайте кучу сжатых файлов в Windows. Самое сложное, что они должны соответствовать размерам плохих файлов. Если вы хотите спасти файл размером 30913 байт, вам понадобится вашсжатыйФайл NTFS должен быть такого размера после сжатия. Честно говоря, я не уверен, как это сделать. Как минимум, сделайте файлы восстановленияпо меньшей мереразмер (на диске) как у файлов, которые нужно спасти. Лучше всего сделать так, чтобы размер совпадал с 4k, так как это размер кластера NTFS по умолчанию (фрагменты распределения, используемые для данных файлов).
  2. Используйте fsutilутилиту в Windows, чтобы получитьэкстентыфайлов восстановления. Экстенты — это фактические смещения на томе, где данные файла хранятся в разделе.
    • Команда выглядит fsutil file queryextents <filename>так: в зависимости от местоположения вам может потребоваться запустить ее от имени администратора.
    • Вывод команды выглядит примерно так: VCN: 0x0 Clusters: 0x2 LCN: 0x48000Это говорит о том, что файл занимает два кластера,логический номер кластера0x48000 (что является смещением 4096*0x48000=1207959552) до смещения тома 0x48001, что составляет 8k (2 x 4k/кластер) общего пространства. На практике конец этого обычно является неиспользуемым пространством.
    • Может быть несколько строк вывода (это происходит, когда файл фрагментирован; это вряд ли произойдет на свежеотформатированном томе, если вы изменяете размер каждого файла перед созданием следующего). Первое значение (виртуальный номер кластера) в последующих строках не будет равен нулю, это будет смещение (в кластерах) внутри файла, где начинается этот экстент (например, если это 0x3, это означает, что экстент начинается с 12 КБ в файле).
  3. Отключите диск и подключитесь к OS X. Делайтенетна этот раз смонтируйте том. Вместо этого найдите правильный идентификатор тома. В Linux это будет что-то вроде /dev/sdb1. (Второй диск -> sdб1, первый раздел -> sdb1).
  4. Используя dd, скопируйте напрямую в необработанный том из плохо сжатых файлов.
    • Например, предположим, что ваш файл имеет два экстента:
      • VCN: 0x0 Clusters: 0x15 LCN: 0x13c
      • VCN: 0x15 Clusters: 0x3f6 LCN: 0xab20
    • Вы можете использовать следующие команды для dd, с именами файлов, скорректированными по мере необходимости. Смотритестраница руководства ddдля получения дополнительной информации, но сейчас обратите внимание, что все параметры для ddудобства кратны размеру блока ( bsparam), но шестнадцатеричные значения были преобразованы в десятичные (не уверен, что они ddмогут правильно обрабатывать шестнадцатеричные значения; некоторые программы, подобные 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. После того, как вы скопировали данные файла в раздел raw, вы сможете подключить диск к Windows и прочитать сжатые (спасенные) файлы. Если размеры файлов не совпали в точности, вы можете обнаружить немного мусора в конце файлов, но, надеюсь, это не будет проблемой.

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

Связанный контент