Как освободить все / самое свободное место от разреженного на OS X

30

Есть ли возможность «дефрагментировать» разреженный пакетный образ и освободить (большую часть) свободного пространства?

Вот предыстория: я использую разреженные пакеты, и время от времени я хочу освободить от них пространство, поэтому я запускаю:

hdiutil compact image.sparsebundle

Однако, как объяснено на странице руководства, он восстанавливает только полностью неиспользуемые файлы группы, поэтому в моем случае он говорит:

Reclaimed 0 bytes out of 90.4 GB possible.

Конечно, есть возможность скопировать содержимое этого изображения в новый разреженный комплект, который затем используется вместо этого, но это громоздко и требует достаточно свободного места для этой операции.

Тем временем я обнаружил, что вывод команды compact несколько вводит в заблуждение (в настоящее время я использую OS X 10.5.7), поскольку в нем иногда указывается максимально возможный размер, превышающий размер, который в настоящее время занимает пакет изображений на жестком диске. привод. Я не посмотрел поближе, но вывод кажется либо максимальным размером, либо «максимальным размером» - «использованным размером».

user4854
источник
1
У меня была проблема с этим, но потом я понял, что это потому, что моя sparsebundle fs была EXFAT. Прочитав man-страницу , я понял, что компактный глагол работает только на «образах дисков, содержащих файловую систему HFS».
jsejcksn
@jsejcksn Это хороший момент, чтобы иметь в виду. Страница man теперь говорит, что APFS и HFS + поддерживаются.
GDP2
Соответствующий вопрос на AskDifferent: apple.stackexchange.com/questions/54607/…
GDP2

Ответы:

20

Интересный!

Из того, что я слышал, разреженный пакет делит данные на 8-мегабайтные полосы. Изменение размера группы может помочь, если вам повезет. Я имею в виду, вы никогда не получите 100% мелиорированного пространства, но, может быть, лучше, чем сейчас. (В зависимости от данных на изображении и т. Д.)

Я провел грязный простой тест с двумя разреженными пакетами по 500 МБ, один с размером полосы 8 МБ (по умолчанию), а другой с 1 МБ (наименьший допустимый размер из того, что я могу сказать). Я скопировал более 400 МБ mp3-файлов, затем удалил все остальные файлы и запустил hdiutil compactих задницы.

Size after compact
8Mb bands: 271Mb
1Mb bands: 215Mb

Команда для преобразования вашего разреженного пакета

hdiutil convert src.sparsebundle -format UDSB -tgtimagekey sparse-band-size=2048 -o dst.sparsebundle

Размер полосы в блоке 512 байт. Таким образом, приведенный выше пример устанавливает размер полосы 512 * 2048 = 1 МБ. Просто будьте осторожны, если вы имеете дело с образами TimeMachine или образами домашней папки пользователя и т. Д. Вы отклоняетесь от пути Apple :) Сохраняйте резервную копию!

Что касается дефрагментации: у меня странное чувство, что это так же быстро (или быстрее!) Просто использовать hdiutil для преобразования sparsefile в новый разреженный файл с тем же форматом. Я думаю, что он пытается быть умным об этом. Но я не знаю

(Обратите внимание, что дефрагментация разреженного комплекта просто дефрагментирует данные на диске, а не разреженные диапазоны, если только это не дефрагментатор с разреженным комплектом. hdiutil convertЯ считаю, что «дефрагментация» полосы делает).

0scar
источник
Аргументы вашей командной строки находятся в неправильном порядке: -oдолжны быть непосредственно перед dst.sparsebundle, а не src.sparsebundle( -oобозначает «выходные данные»).
Ник Фордж
Также обратите внимание, что этот метод не сохраняет шифрование. Вероятно, есть флаг, чтобы включить его, но в этот момент мне стало проще просто создать себе новую sparsebundle в Disk Utility и скопировать в нее мои файлы.
Джастин Сирлс
2
Для шифрования просто добавьте -encryptionпереключатель в команду.
Фидели
Большое спасибо. Уменьшение размера разреженной полосы очень полезно для разреженных связок, размещаемых на Dropbox
Max Ried
Хорошо, это не имеет смысла ... когда я конвертирую для дефрагментации изображения, результирующий разреженный пакет на 16% больше, чем оригинал.
Майкл
7

Я думаю, что возможные 90,4 ГБ - это просто неправильно. Когда я побежал:

hdiutil compact *.sparsebundle

... это освободило 16 ГБ пространства, что примерно соответствует моим ожиданиям. Как ни странно, он сказал примерно «800 ГБ возможно», что намного больше, чем емкость моего HD. Итак, я полагаю, что вторая цифра - это просто некое (ошибочное) теоретическое число.

до
источник
2

@ Оскар указал нам правильное направление. Но вам не нужно конвертировать в 1 МБ и компактнее, в надежде вернуть себе место.

Вместо этого просто скопируйте ваш sparsebundle в другой новый sparsebundle. Это, в свою очередь, дефрагментирует изображение для вас. И в то же время вы можете изменить файловую систему, размер и даже полосы.

Вот пример, который я недавно сделал, конвертируя 20-гигабайтное «кодовое» изображение, которое я синхронизирую между устройствами.

$ hdiutil create -size 20g -type SPARSEBUNDLE \
-imagekey sparse-band-size=2048 -fs HFSX \
-volname code -attach ~/sync/images/code.sparsebundle

Посмотреть все варианты с hdiutil create -help.

Эта команда выводит:

/dev/disk3              GUID_partition_scheme
/dev/disk3s1            EFI
/dev/disk3s2            Apple_HFS                       /Volumes/code
created: /Users/eric/sync/images/code.sparsebundle

Вы можете увидеть -attachопцию монтирования его под /Volumes/code.

Примечание: я использую HSFXHFS + с учетом регистра, потому что я синхронизирую свои образы и с Linux и монтирую их. Скорее всего, вы захотите использовать HFS+вместо этого, так как macOS обычно без учета регистра.

Теперь все, что мне нужно сделать, это скопировать все в мой новый sparsebundle:

$ cp -r /Volumes/IMG_CODE/ /Volumes/code/

А теперь для сравнения:

# old sparsebundle
$ du -h ~/sync/images/IMG_CODE.sparsebundle/
15.0G   /Users/eric/sync/images/IMG_CODE.sparsebundle/bands
15.0G   /Users/eric/sync/images/IMG_CODE.sparsebundle/

# new sparsebundle
$ du -h ~/sync/images/code.sparsebundle/
3.0G    /Users/eric/sync/images/code.sparsebundle/bands
3.0G    /Users/eric/sync/images/code.sparsebundle/

Ура. Мой sparsebundle 15 ГБ теперь 3 ГБ, дефрагментирован, и группы изменились!

Эрик Дункан
источник
Этот метод был признан в исходном вопросе ... Я не буду опускать ответ, потому что он хорошо написан и "информативен", но .. давай ..
adfaklsdjf
0

Я не знаю свободного способа сделать это, но я верю, что Prosoft Drive Genius сделает то, что вам нужно здесь:

http://www.prosofteng.com/products/drive_genius.php

Вы монтируете sparsebundle, дефрагментируете его с помощью Drive Genius, а затем

hdiutil compact

Команда должна работать.

паломник
источник
0

Возможно восстановление 0 байтов из 90,4 ГБ.

Бьюсь об заклад, диск, который содержит разреженный комплект, имеет около 90 ГБ свободного места? Поскольку разреженные пакеты часто могут увеличиваться до заполнения диска, об этом пространстве просто сообщается как о доступном свободном пространстве ... Вы увидите те же цифры в Дисковой утилите. На самом деле очень обманчиво.

Следующее может дать вам некоторое представление:

hdiutil imageinfo image.sparsebundle
Арьян
источник
0

У меня был проблемный разреженный пакет, который утверждал, что 950 ГиБ заняли из 1024 ГиБ (мой SSD имеет размер всего 320 ГиБ, поэтому этого не могло быть). hdi compactне помогло

Я запустил «Скорую помощь» из Дисковой утилиты как на пачке, так и на разделе, и это помогло - свободный космический измеритель начал показывать реальные 20 ГиБ, как и должно быть, а затем hdi compactзапустился без проблем.

toriningen
источник