Есть ли возможность «дефрагментировать» образ с разреженным пакетом и освободить (большую часть) свободного места?
Вот предыстория: я использую редкие пакеты и время от времени хочу освободить от них место, поэтому запускаю:
hdiutil compact image.sparsebundle
Однако, как объясняется на странице руководства, он восстанавливает только полностью неиспользуемые файлы групп, поэтому в моем случае он говорит:
Reclaimed 0 bytes out of 90.4 GB possible.
Конечно, есть возможность скопировать содержимое этого образа в новый разреженный пакет, который затем будет использоваться вместо него, но это и громоздко, и требует достаточно свободного места для этой операции.
Между тем, я обнаружил, что вывод компактной команды несколько вводит в заблуждение (в настоящее время я использую 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 для преобразования разреженного файла в новый разреженный файл в том же формате. Я думаю, что он пытается быть умным. Но я не знаю.
(Обратите внимание, что при дефрагментации разреженного пакета дефрагментируются только данные на диске, а не полосы разреженного пакета, если только это не дефрагментатор с поддержкой разреженного пакета. hdiutil convert
я считаю, что делает дефрагментацию бэнда.)
Я думаю, что 90,4 ГБ - это просто неправильно. Когда я бежал:
hdiutil compact *.sparsebundle
... он освободил 16 ГБ пространства, что примерно соответствует моим ожиданиям. Как ни странно, там сказано примерно «возможно 800 ГБ», что намного больше, чем емкость моего жесткого диска. Поэтому я предполагаю, что вторая цифра - это всего лишь некоторая (ошибочная) теоретическая цифра.
@Oscar указал нам правильное направление. Но не нужно конвертировать в 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
команда должна работать.
Восстановлено 0 байтов из возможных 90,4 ГБ.
Бьюсь об заклад, на диске, на котором хранится разреженный комплект, есть около 90 ГБ свободного места? Поскольку разреженные пакеты часто могут расти до тех пор, пока диск не будет заполнен, это пространство просто указывается как доступное свободное пространство ... Вы увидите те же цифры в Дисковой утилите. Действительно, очень вводит в заблуждение.
Следующее может дать вам некоторое представление:
hdiutil imageinfo image.sparsebundle
У меня был проблемный разреженный пакет, который утверждал, что занимал 950 ГиБ из 1024 ГиБ (размер моего SSD составляет всего 320 ГиБ, так что этого не могло произойти). hdi compact
не помогло.
Я запустил «Скорую помощь» из Дисковой утилиты как для пакета, так и для раздела, и это помогло - счетчик свободного места начал показывать реальные 20 ГиБ, как и должно быть, а затем hdi compact
побежал без проблем.