Уменьшаем размер диска в vmware
Рассмотрим на примере самого простого случая - у нас один диск, один раздел.
Преамбула: в рамках подготовки к киберполигону я скачал у одного вендора подготовленный образ виртуальной машины в формате ova. Загрузил в вцентр и сделал из этого шаблона виртуалку. А дальше оказалось что у этой вм выделен диск несколько больше чем мы рассчитывали. И что если мы растиражируем этот образ на множество команд, попадем в копеечку по оплате хранилища. ведь нам надо гарантировать что ресурсы выданные виртуальной машине обеспечиваются железом.
Дано: виртуальная машина с 1 диском в 100gb, внутри 1 корневой раздел без lvm. Хотим получить диск 50Gb
Акт 1: уменьшение раздела.
один из простых вариантов - выключить виртуалку, через веб интерфейс добавить этот диск к любой другой виртуалке и там уже проводить действия. Пускай присоединенный диск будет sdb, а раздел sdb1.
1. проверим целостность раздела который хотим уменьшить
e2fsck -f /dev/sdb1
2. уменьшим размер файловой системы до 50Gb
resize2fs /dev/sdb1 50G
3. Изменяем размер раздела.
fdisk /dev/sdb
вывод текущей схемы будет таким:
Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors
Device Bootс End Sectors Size Id Type
/dev/sdb1 * 2048 209713151 209711104 100G 83 Linux
удаляем раздел и создаем его заново:
- d (delete)
- n (new)
- p (primary)
- 1 (Partition number)
- 2048 (берем это число из колонки Start в выводе сверху - это начало нашего раздела и его нужно сохранить)
- 104857599 (про это число подробнее ниже). Ни в коем случае не пишем здесь +50G. т.к. размер нашего раздела на самом деле меньше.
- если нас спросят про то хотим ли мы удалить метку ext4, отвечаем отрицательно.
итак, а что это за волшебное число 104857599 и как его получить. Это номер последнего сектора на котором заканчивается наш раздел. Тут вот самый взрыв мозга у юного поколения. По задаче нам нужно получить диск размером 50Gb. Это значит в это число нужно уложить раздел и еще загрузчик (ну и может быть еще другие разделы). Под загрузчик отводится 0-2048 блоков. а блок занимает (в моем случае) 512 байт. вот и выходит что последний блок это не просто +50гб от какого-то там 2048. т.о. рождается формула подсчета последнего блока:
(X*1024*1024*1024)/Y-1
где х - число гигабайт, Y - размер блока
(50*1024*1024*1024)/512-1 = 104857599
это - наш конец диска. -1 здесь нужно потому что счет границ включительно. это как с подсчетом отпуска - со 2 по 9 это не неделя, а 8 дней на самом деле. А надо 7. поэтому вычитаем единичку.
посмотрим что получилось с помощью команды
p:
Disk /dev/sdb: 100 GiB, 107374182400 bytes, 209715200 sectors
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 104857599 104855552 50G 83 Linux
Теперь мы видим что наш раздел 50Gb, диск по-прежнему 100gb, но тут мы уже повлиять не можем, править размер диска нужно в другом месте. Соглашаемся все записать с помощью команды
w и выходим из fdisk.
4. Восстанавливаем размер фс и проверяем на целостность того что получилось.
resize2fs /dev/sdb1
e2fsck -f /dev/sdb1