it-swarm-ru.tech

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

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

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

hdiutil compact image.sparsebundle

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

Reclaimed 0 bytes out of 90.4 GB possible.

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

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

33
user4854

Интересно!

Из того, что я слышал, разреженный пакет делит данные на 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 Я считаю, что группа "дефрагментирует".)

20
0scar

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

hdiutil compact *.sparsebundle

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

8
till

@ Оскар указал нам правильное направление. Но вам не нужно конвертировать в 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.

Примечание: я использую HSFX для HFS + с учетом регистра, потому что я также синхронизирую свои образы с 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 ГБ, дефрагментирован, и группы изменились!

2
Eric Duncan

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

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

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

hdiutil compact

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

0
palmer

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

Я запустил "First Aid" из Дисковой утилиты как для пакета, так и для раздела, и это помогло - счетчик свободного пространства начал показывать реальные 20 GiB как и должно быть, а затем hdi compact бежал без проблем.

0
toriningen

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

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

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

hdiutil imageinfo image.sparsebundle
0
Arjan