Как удалить все снимки в VirtualBox?

Вопрос или проблема

До настоящего момента я всегда сохранял и загружал машину из снимка, но теперь мой SSD-диск заполнен, и я ничего не могу сделать. Папка с снимками использует 70 ГБ, и сейчас я хочу удалить все снимки и каждый раз выключать машину, а затем включать без снимков. Есть ли способ загрузить последнее состояние снимка в машину и удалить все снимки?

Возможность удалить все снимки запрашивалась в трекере улучшений и ошибок Oracle, а также на форуме Virtualbox. К сожалению, насколько я знаю, это все еще нельзя сделать «из коробки».

Тем не менее, есть решение!

В виде некоторого исходного кода на Python и XAML: Графический интерфейс для удаления снимков VirtualBox.

Вам нужно будет скомпилировать это в файл .exe, чтобы запустить его. Информация о том, как это сделать, доступна на Stack Overflow: Компиляция проекта IronPython WPF в exe.

Автор инструмента считает, что он также будет совместим с хостами OS X и Linux.

Этот ответ работает, но он немного грубее, чем альтернатива с графическим интерфейсом (которая, спустя 5 лет, все еще не была портирована для работы на чем-либо, кроме Windows). Это будет работать на BSD, Linux, Mac, но не на Windows (без Cygwin). **Запускайте на свой страх и риск **

DEBUG=true; PROMPT=true

vbox_delete_all_snapshots() { 
  vboxmanage snapshot "$1" list | 
    tac |perl -lane 'print $1 if /UUID: ([a-z0-9-]+)/' |
    xargs ${PROMPT:+-p} -n1 ${DEBUG:+echo} vboxmanage snapshot "$1" delete
  if $DEBUG && [ $? = 0 ] ; then
    echo "Вышеуказанные команды НЕ были выполнены. Установите DEBUG (и PROMPT, если вы чувствуете себя везучим), чтобы сделать это."
  fi
}
read -p"Введите имя виртуальной машины (или ее ID): " vmname; vbox_delete_all_snapshots "$vmname"

Ограничения

  • Linux будет жаловаться, если нет снимков. Если вы используете Linux/GNU, вы можете добавить опцию -r к команде xargs.
  • Чтобы фактически выполнить команды, выполните unset DEBUG.
    Чтобы выполнить команды без запроса для каждой, выполните unset PROMPT.
  • Это должно обрабатывать стандартное “дерево” снимков, но я тестировал это только в случае, когда каждый снимок имел ровно 0 или 1 потомка.

Пример вывода

Удаление снимка 'B5' (a02cb9e8-c5be-425d-9bcd-806d72e5a083)
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Удаление снимка 'B4' (422b29b8-cf79-4c92-a415-a08c1d3dd5a0)
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Удаление снимка 'B3' (c1ed469f-ffc3-4cb8-81fe-bbf6581e5858)
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Удаление снимка 'b2' (c0fa9d90-6293-46e5-bcd7-25f2b36f95c4)
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Удаление снимка 'B1' (894147cb-2cc0-48e3-86c7-bec156da762a)
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Удаление снимка 'test' (44a69565-1354-4b98-a2cf-64fd7caa6c56)
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

На FreeBSD я получаю tac: Не найдено, вы можете использовать tails вместо этого

vbox_delete_all_snapshots() {
  vboxmanage snapshot "$1" list |
    tail -r |perl -lane 'print $1 if /UUID: ([a-z0-9-]+)/' |
    xargs ${PROMPT:+-p} -n1 ${DEBUG:+echo} vboxmanage snapshot "$1" delete
  if $DEBUG && [ $? = 0 ] ; then
    echo "Вышеуказанные команды НЕ были выполнены. Установите DEBUG (и PROMPT, если вы чувствуете себя везучим), чтобы сделать это."
  fi
}
vmname=Wayward_$USER
vbox_delete_all_snapshots "$vmname"

На FreeBSD это вообще не сработало, на моей системе я создал пользователя и с этим пользователем создал Virtualbox с VBoxManage внутри этого пользователя, чтобы я мог видеть, какой Virtualbox использует много процессора или памяти и т. д….

Сказав это, я называю все свои VirtualBoxes: Wayward_$USER, мой скрипт также это отразит. Это также безопаснее, вы не можете удалить все снимки всех VirtualBoxes сразу.

if [ $1 = "deletesnapshots" ] ; then
  ## Да Удалить все снимки! Это не учение!
  #
  echo "Удалить все снимки этой машины: Wayward_$USER"
  string=$(VBoxManage snapshot "Wayward_$USER" list)

  # Установите позиционные параметры в слова в строке
  set -- $string

  # Итерируйте по позиционным параметрам с помощью цикла
  remember="Leeg"
  for word in $@; do
    if [ $remember = "Name:" ] ; then
      echo "Удалить снимок: $word"
      VBoxManage snapshot Wayward_$USER delete $word
    fi
    remember=$word
  done
else
  ## Просто показываю, что будет удалено без параметра:
  ## deletesnapshots
  ##
  ## Это просто ТЕСТ!
  #
  echo "Сохранить все снимки, следующие строки предназначены для отладки снимков для: Wayward_$USER"
fi

Ответ или решение

Удаление всех снапшотов в VirtualBox: Полное руководство

Если ваш жесткий диск, особенно SSD, достиг предела заполненности из-за хранения снапшотов виртуальных машин в VirtualBox, вы можете столкнуться с ситуацией, когда не сможете загрузить вашу машину. Снапшоты являются важной частью управления виртуальными машинами, но их накопление может занять значительное место на диске. В этом руководстве мы расскажем, как удалить все снапшоты и сохранить последнее состояние вашей виртуальной машины.

Подготовка

Прежде всего, убедитесь, что у вас установлен VirtualBox и его интерфейс командной строки VBoxManage. Чтобы использовать команды из этого руководства, вам потребуется доступ к терминалу (на Linux и MacOS) или командной строке (на Windows).

Шаг 1: Определите, нужно ли возвращаться к последнему состоянию

Если вы хотите удалить все снапшоты и продолжать работу с последним состоянием виртуальной машины, вы можете сделать следующее:

  1. Запустите вашу виртуальную машину и убедитесь, что она работает.

  2. Загрузите последнее состояние виртуальной машины, если это требуется (т.е. вернуться к последнему актуальному состоянию перед удалением снапшотов). Для этого просто сохраните текущую работу.

Шаг 2: Удаление всех снапшотов с помощью VBoxManage

К сожалению, VirtualBox не предлагает прямую команду для удаления всех снапшотов. Вместо этого предлагается использовать термины командной строки. Ниже приведены команды, которые помогут вам удалить все снапшоты для заданной виртуальной машины.

Для Linux/Unix систем (включая MacOS)

Создайте функцию скрипта:

vbox_delete_all_snapshots() { 
  VBoxManage snapshot "$1" list | 
    tac | perl -lane 'print $1 if /UUID: ([a-z0-9-]+)/' |
    xargs -n1 VBoxManage snapshot "$1" delete
}
vmname="ваше_имя_машины" # здесь укажите имя вашей виртуальной машины
vbox_delete_all_snapshots "$vmname"

Для Windows (через Command Prompt или PowerShell)

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

VBoxManage snapshot "ваше_имя_машины" list | 
Select-String -Pattern 'UUID: ' | 
ForEach-Object { $_.ToString().Split()[1] } |
ForEach-Object { VBoxManage snapshot "ваше_имя_машины" delete $_ }

Шаг 3: Проверка результатов

После выполнения команд проверьте, что все снапшоты были успешно удалены. Вы можете использовать команду VBoxManage snapshot "ваше_имя_машины" list, чтобы убедиться, что все записи о снапшотах исчезли.

Важные Заметки

  1. Резервные Копии: Перед удалением снимков рекомендуется сделать резервную копию вашей виртуальной машины, чтобы предотвратить нежелательные потери данных.

  2. Производительность: Удалив все снапшоты, вы освободите пространство на диске, что повысит производительность вашей виртуальной машины.

  3. Использование GUI: Если вы предпочитаете графический интерфейс, рассмотрите возможность использования сторонних инструментов, таких как VirtualBox Snapshot Deletion GUI, который позволит вам удалять снапшоты более удобно.

Заключение

Удаление всех снапшотов в VirtualBox требует выполнения нескольких шагов, но это не так сложно, как кажется. Следуя приведенному выше руководству, вы сможете освободить место на диске и продолжать работу с вашей виртуальной машиной без необходимости в дополнительных снимках. Если у вас возникнут дополнительные вопросы, мы всегда готовы помочь!

Поделитесь этой информацией с другими пользователями VirtualBox, чтобы помочь им справиться с заполненным диском!

Оцените материал
Добавить комментарий

Капча загружается...