Сжатие NTFS указывается флагом в метаданных файла, который хранится в таблице основного файла (MFT). Установить его напрямую сложно, потому что обычно при изменении этого флага драйвер файловой системы сжимает или распаковывает файл для вас. Возможно, вы могли бы добавить этот флаг вручную - это всего один бит в атрибутах файла DWORD - но прямой взлом MFT, вероятно, не лучший подход. Вместо этого попробуйте следующее:
- На томе NTFS (это может быть флэш-накопитель, если вы отформатируете его в NTFS), создайте один (или несколько) сжатых файлов (используя Windows). Ради этих инструкций мы будем называть эти файлы
rescue1
, rescue2
и т.д.
- Подключите диск NTFS к вашей системе Mac (без предварительного распаковки файлов). Смонтируйте том чтения / записи. Допустим, он смонтирован в
/mount/ntfs
(на самом деле я не использую OS X достаточно, чтобы запомнить, где монтируются внешние тома).
- С помощью инструмента, который копирует содержимое файла, такого как утилита командной строки
dd
, скопируйте содержимое ваших сжатых файлов без метаданных в содержимое сжатых файлов на томе NTFS. Команда будет выглядеть примерно так: dd if=/path/to/bad/file of=/mount/ntfs/rescue1 bs=4M
.
- Подключите диск к Windows и посмотрите, можно ли теперь правильно открыть сжатые файлы. Если они могут, вы можете безопасно распаковать их в Windows (либо на месте, либо скопировав на диск, который не поддерживает сжатие, например, флэш-накопитель FAT32).
- Если этот подход работает, вы можете использовать его для спасения всех ваших сотен файлов. Просто создайте столько сжатых файлов на диске NTFS, сколько вам нужно, назовите их любым удобным для вас способом (это могут быть оригинальные имена) и скопируйте содержимое с Mac.
Обратите внимание, что вам не нужно сжимать весь том NTFS; это просто заставляет все каталоги наследовать флаг "Сжатый", и каждый файл наследует его от каталога файла. Впрочем, это не мешало бы.
Тем не менее, я рекомендую использовать резервный или выброшенный том NTFS; если драйвер OS X NTFS настолько плох, он может повредить MFT при попытке записи на том Windows.
Более сложный альтернативный подход, если вышеперечисленное не работает:
- Создайте кучу сжатых файлов в Windows. Сложность в том, что они должны соответствовать размеру плохих файлов. Если вы хотите восстановить файл размером 30913 байт, вам понадобится сжатый файл NTFS такого размера после сжатия. Я буду честен; Я не уверен, как это устроить. Как минимум, сделайте спасательные файлы как минимум того размера (на диске), что и файлы, которые нужно восстановить. Лучше всего сделать совпадение по размеру в пределах 4 КБ, так как это размер по умолчанию для кластера NTFS (фрагменты выделения, используемые для данных файла).
- Используйте утилиту
fsutil
в Windows, чтобы получить экстенты файлов восстановления. Экстенты - это фактические смещения на томе, где данные файла хранятся в разделе.
- Это команда
fsutil file queryextents <filename>
и в зависимости от местоположения вам может потребоваться запустить ее с правами администратора.
- Вывод команды выглядит примерно так:
VCN: 0x0 Clusters: 0x2 LCN: 0x48000
. Это говорит о том, что файл занимает два кластера: логический номер кластера 0x48000 (смещение 4096 * 0x48000 = 1207959552) и смещение тома 0x48001, что составляет 8 КБ (2 x 4 КБ / кластер). На практике конец этого обычно неиспользуемого пространства.
- Может быть несколько строк вывода (это происходит, когда файл фрагментирован; это вряд ли произойдет на томе, который был недавно отформатирован, если вы размер каждого файла перед созданием следующего). Первое значение (номер виртуального кластера) в последующих строках не будет равно нулю, это будет смещение (в кластерах) в файле, с которого начинается экстент (например, если это 0x3, это означает, что экстент начинается с 12k в файл).
- Отключите привод и подключение к OS X. Не устанавливайте громкость на этот раз. Вместо этого найдите правильный идентификатор тома. В Linux это будет что-то вроде
/dev/sdb1
. (Второй диск -> сд B 1, первый раздел -> SDB 1).
- Используя
dd
, скопируйте прямо в сырой том из ваших плохо сжатых файлов.
- Например, допустим, ваш файл имеет два экстента:
VCN: 0x0 Clusters: 0x15 LCN: 0x13c
VCN: 0x15 Clusters: 0x3f6 LCN: 0xab20
- Вы должны использовать следующие команды для
dd
с именами файлов, скорректированными по мере необходимости. См. Справочную страницу dd для получения дополнительной информации, но пока обратите внимание, что все параметры для dd
удобно кратны размеру блока (параметр bs
), но что шестнадцатеричные значения были преобразованы в десятичную (не уверен, что dd
может правильно обрабатывать hex; некоторые 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
- После того, как вы скопировали данные файла в необработанный раздел, вы сможете подключить диск к Windows и прочитать сжатые (восстановленные) файлы. Если размеры файлов не совпадают точно, вы можете обнаружить, что в конце файлов есть небольшой мусор, но, надеюсь, это не будет проблемой.
Другой подход (возможно, более простой, даже намного более простой) состоит в том, чтобы найти подпрограмму в ntfs-3g
которая обрабатывает декомпрессию NTFS. Запустите эту процедуру для файлов напрямую. В качестве альтернативы посмотрите, можете ли вы найти копию утилиты ntfsdiskedit
(кажется, она больше не поддерживается) и посмотрите, можете ли вы использовать ее, чтобы вручную установить бит "Сжатый" в файле после их копирования (в виде несжатых файлов) на том NTFS. ,