Есть ли возможность "дефрагментировать" разреженный пакетный образ и вернуть (большую часть) свободного пространства?
Вот предыстория: я использую разреженные пакеты, и время от времени я хочу освободить от них пространство, поэтому я запускаю:
hdiutil compact image.sparsebundle
Однако, как объяснено на странице руководства, он восстанавливает только полностью неиспользуемые файлы группы, поэтому в моем случае он говорит:
Reclaimed 0 bytes out of 90.4 GB possible.
Конечно, есть возможность скопировать содержимое этого изображения в новый разреженный комплект, который затем используется вместо этого, но это громоздко и требует достаточно свободного места для этой операции.
Тем временем я обнаружил, что вывод команды compact несколько вводит в заблуждение (в настоящее время я использую OS X 10.5.7), поскольку в нем иногда указывается максимально возможный размер, который больше, чем размер, занятый в настоящее время. по пачке изображений на жестком диске. Я не посмотрел поближе, но вывод кажется либо максимальным размером, либо "максимальным размером" - "использованным размером".
Интересно!
Из того, что я слышал, разреженный пакет делит данные на 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
Я считаю, что группа "дефрагментирует".)
Я думаю, что возможные 90,4 ГБ - это просто неправильно. Когда я побежал:
hdiutil compact *.sparsebundle
... это освободило 16 ГБ пространства, что примерно так, как я ожидал. Как ни странно, он сказал примерно "800 ГБ возможно", что намного больше, чем емкость моего HD. Поэтому я полагаю, что вторая цифра - это просто (ошибочное) теоретическое число.
@ Оскар указал нам правильное направление. Но вам не нужно конвертировать в 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 ГБ, дефрагментирован, и группы изменились!
Я не знаю свободного способа сделать это, но я верю, что Prosoft Drive Genius сделает то, что вам нужно здесь:
http://www.prosofteng.com/products/drive_genius.php
Вы монтируете sparsebundle, дефрагментируете его с помощью Drive Genius, а затем
hdiutil compact
команда должна работать.
У меня был проблемный разреженный пакет, который утверждал, что 950 GiB занято из 1024 GiB (мой SSD всего 320 GiB) = по размеру, чтобы этого не случилось). hdi compact
не помогло.
Я запустил "First Aid" из Дисковой утилиты как для пакета, так и для раздела, и это помогло - счетчик свободного пространства начал показывать реальные 20 GiB как и должно быть, а затем hdi compact
бежал без проблем.
Возможно восстановление 0 байтов из 90,4 ГБ.
Бьюсь об заклад, диск, который содержит разреженный комплект, имеет около 90 ГБ свободного места? Поскольку разреженные пакеты часто могут увеличиваться до заполнения диска, об этом пространстве просто сообщается как о доступном свободном пространстве ... Вы увидите те же цифры в Дисковой утилите. Очень обманчиво.
Следующее может дать вам некоторое представление:
hdiutil imageinfo image.sparsebundle