Уменьшение размера тонкого диска в ESXi

Взято тут: https://habrahabr.ru/post/276377/

Когда я начал работать с ESXi, столкнулся с проблемой нехватки дискового пространства из-за сильно разросшихся тонких дисков. Вообще, лучше создавать диски меньшего размера, потому что увеличить диск в ESXi намного проще, чем уменьшить. Но что же делать, если все-таки возникла необходимость уменьшить диск? Причем, мое положение усугубляли LVM разделы на сервере, которые не распознавал Acronis, и, следовательно, не мог изменить размер раздела.

Опишу способ, которым воспользовался я:

Сперва нужно уменьшить диск внутри самой виртуальной машины, для этого существует множество универсальных программ: Acronis disc director, paragon partition manager, встроенная утилита управления дисками в windows и т.д. Мне ни одна из этих программ не помогла, поэтому пришлось использовать средства линукса и LiveCD.

  • Для начала нужно загрузиться с livecd linux, я использовал для этого centos 7. При загрузке виртуальной машины клавиша ESC для появления меню загрузки.
  • Активируем LVM разделы
    vgchange -a y
  • Проверка активированных логических томов
    lvscan
  • Проверяем файловые системы
    fsck -fy /dev/test/root fsck -fy /dev/test/home
  • Уменьшаем размер файловой системы
    resize2fs /dev/test/home 190G
  • Уменьшаем размер тома до размера файловой системы
    lvreduce -L 190G /dev/test/home

Также мы можем добавить это место к другом тому. Для этого:

Увеличиваем том root:

lvextend -L +10G /dev/test/root

Увеличиваем размер файловой системы на томе root до размера тома:

</code>
resize2fs /dev/test/root
</code>

  • Опять проверяем целостность файловой системы
fsck -fy /dev/test/root
fsck -fy /dev/test/home
  • Далее можно запустить виртуальную машину и убедиться, что все корректно работает
    df -h
  • Выключаем виртуальную машину
  • Подключаемся по SSH к физическому серверу, на котором установлен ESXi
  • Переходим в каталог, в котором хранится vmdk файл ВМ (путь можно узнать в свойствах виртуального диска в графическом клиенте vSphere). У меня это cd /vmfs/volumes/datastore1*/ Каталог имеет подобную структуру:
    /vmfs/volumes/53114b32-24d88d5a-2cbe-0025b500004f/MTS-SCPortal-TEST3 # ls -l
    total 19810320
    -rw-r--r-- 1 root root 27 Dec 20 20:46 VM_name-0b1f4705.hlog
    -rw------- 1 root root 6442450944 Feb 2 08:24 VM_name-0b1f4705.vswp
    -rw------- 1 root root 147102629888 Feb 2 08:28 VM_name-flat.vmdk
    -rw------- 1 root root 8684 Feb 2 08:25 VM_name.nvram
    -rw------- 1 root root 507 Feb 2 08:25 VM_name.vmdk
    -rw-r--r-- 1 root root 0 Dec 20 20:14 VM_name.vmsd
    -rwxr-xr-x 1 root root 3584 Feb 2 08:25 VM_name.vmx
    -rw------- 1 root root 0 Feb 2 08:24 VM_name.vmx.lck
    -rw-r--r-- 1 root root 273 Dec 20 20:14 VM_name.vmxf
    -rwxr-xr-x 1 root root 3584 Feb 2 08:25 VM_name.vmx~
    -rw------- 1 root root 3424256 Feb 2 08:24 vmmcores-1.gz
    -rw-r--r-- 1 root root 240722 Dec 20 20:46 vmware-1.log
    -rw-r--r-- 1 root root 1252287 Feb 2 08:24 vmware-2.log
    -rw-r--r-- 1 root root 43555 Feb 2 08:24 vmware-3.log
    -rw-r--r-- 1 root root 151873 Feb 2 08:25 vmware.log
    -rw------- 1 root root 122683392 Feb 2 08:24 vmx-VM_name-186599173-1.vswp
    /vmfs/volumes/53114b32-24d88d5a-2cbe-0025b500004f/VM_name #
  • Просмотрим содержимое конфигурационного файла с расширением *.vmdk с помощью команды cat или vi:
    cat VM_name.vmdk
    
    # Disk DescriptorFile
    version=1
    encoding=«UTF-8»
    CID=829544ab
    parentCID=ffffffff
    isNativeSnapshot=«no»
    createType=«vmfs»
    
    # Extent description
    RW 44000000 VMFS «VM_name-flat.vmdk»
    
    # The Disk Data Base
    #DDB
    
    ddb.adapterType = «lsilogic»
    ddb.geometry.cylinders = «17884»
    ddb.geometry.heads = «255»
    ddb.geometry.sectors = «63»
    ddb.longContentID = «c78bccbfd4724f0ee20a1ef2829544ab»
    ddb.thinProvisioned = «0»
    ddb.uuid = «60 00 C2 98 20 ac 05 4a-e5 39 e4 40 e8 a2 d8 d0»
    ddb.virtualHWVersion = «8»
  • Размер vmdk диска задается в секции #Extent description (после символов RW). Меняем это значение, например, чтобы установить размер диска в 20Гб ставим 41943040 (20 Гб*1024*1024*1024 / 512)
    vi VM_name.vmdk

Я ставлю значение немного больше, чем размер, вычисленный по методике выше (41943040 (20 Гб*1024*1024*1024 / 512)), на всякий случай.

  • Осталось склонировать или смигрировать виртуальную машину, после чего отобразится новый размер диска.

Физическое уменьшение тонкого диска без изменения provisioning

Также возможно только уменьшить размер файла виртуальной машины, путем удаления нулевых блоков.

Для этого:

  • Нужно заполнить все неиспользованное пространство, внутри виртуальной машины, нулями. Создаем файл по размерам неиспользуемой области диска, а потом удаляем его.
cat /dev/zero > /file
cd /
rm file
  • Подключаемся по SSH к консоли ESXi как описано выше и переходим в каталог с виртуальной машиной.
  • В консоли гипервизора есть специальная утилита, которая позволяет затереть нулевые блоки, тем самым уменьшив физический размер тонкого диска.Делается это с помощью ключа -K (можно также использовать ключ –punchzero) в консоли сервера ESXi
    vmkfstools -K VM_name.vmdk

Надо отметить, что утилита vmkfstools, запущенная с ключом -K, еще и может преобразовать обычный диск (zeroedthick или eagerzeroedthick) в thin disk с вычищением нулевых блоков и, соответственно, уменьшением размера vmdk.

P.S. Надеюсь данная статья будет кому-то полезной. Во всяком случае, я потратил много времени, прежде чем мне удалось корректно уменьшить размер тонкого диска.

  • software/vmware/vmware-reduce-disk.txt
  • Последнее изменение: 2017/05/09 18:34
  • 127.0.0.1