суббота, 15 августа 2009 г.

thin shrink

Интересный момент касательно thin дисков проясняют тут: Reclaiming unused VMDK space with storage thin provisioning.
Поясню, к чему это относится:

Когда мы создаем диск ВМ (например, в 100ГБ размером), мы выбираем тип файла-диска:
thick или thin.
В первом случае файл сразу резервирует под себя места на диске. 100 ГБ диск ВМ займет на системе хранения 100 ГБ.
Во втором случае файл создается нулевого размера, и растет по факту затребования места изнутри. Записали внутрь еще 500 мегабайт - он на них и вырос.

Это все хорошо. Плохо же то, что если мы внутри ВМ 500 МБ удалим, файл-диск не уменьшится. И если 5000 удалим, тоже не уменьшится. Сколько не удалим, не уменьшится, потому что с т.зрения схд удаления не происходила. Это гостевая ОС в своей файловой системе какие то блоки пометила как "их можно использовать". Получается, со стороны ESX(i) нельзя определить, какие из занятых блоков на самом деле свободны.

В общем, вот рецепт как отнять таки ранее востребованное, но потом освобожденное месте, т.е. как уменьшить vmdk файл в thin режиме:

  1. Скачиваем утилиту sdelete внутрь ВМ.
  2. Натравливаем ее на тот диск, где есть удаленные данные, командой
    sdelete - c E:
    это для диска E:\
  3. Теперь необходимо сделать Storage VMotion этой ВМ, и указав
    Change to Thin Provisioned Disk даже если диск еще не thin но вы хотите его таким сделать
    или можно указать
    Keep Disk Format
    если диск ВМ уже thin.
Как то так.

4 комментария:

  1. А каков глубокий смысл использования sdelete?

    Лично я эту проблему решаю следующим образом:

    1) Если надо "пожать" машину в рамках одного стораджа:

    #!/bin/sh

    E_BADARGS=85

    if [ $# -ne 1 ]
    then
    echo "usage : $0 VMname"
    echo " VMname - name of VM"
    exit $E_BADARGS
    fi

    VM=$1
    VMDK=$VM.vmdk
    FLAT=$VM-flat.vmdk
    VMDKTHIN=$VMDK-thin
    FLATTHIN=$FLAT-thin
    vmkfstools -i $VMDK -d thin $VMDKTHIN
    rm -rf $VMDK
    rm -rf $FLAT
    mv $VMDKTHIN $VMDK
    mv $FLATTHIN $FLAT
    sed -i -e "s/$FLATTHIN/$FLAT/g" $VMDK

    ОтветитьУдалить
  2. 2) Если попутно необходимо перенести VM на другой сторадж

    #!/bin/sh
    E_BADARGS=85

    if [ $# -ne 3 ]
    then
    echo "usage : $0 vmname dstoresource dstoredest"
    echo " vmname - name of VM"
    echo " dstoresource - name of source datastore"
    echo " dstoredest - name of destination datastore"
    exit $E_BADARGS
    fi

    VMNAME=$1
    DSTORESOURCE=$2
    DSTOREDEST=$3
    VMXPATH=`vmware-cmd -l | grep "/${VMNAME}.vmx"`
    SOURCE=/vmfs/volumes/$DSTORESOURCE/$VMNAME
    DESTINATION=/vmfs/volumes/$DSTOREDEST/$VMNAME

    mkdir $DESTINATION

    #unregister
    vmware-cmd -s unregister $DSTORESOURCE/${VMNAME}.vmx

    #migrate from source
    cd $SOURCE
    for file in *
    do
    if (echo $file | grep "flat.vmdk"); then
    #-- flat vmdk file, no action
    :
    elif (echo $file | grep "vmdk"); then
    #-- vmdk file : thin provisionning
    vmkfstools -i $file -d thin $DESTINATION/$file
    else
    #-- other file : copy
    cp -p $file $DESTINATION
    fi
    done
    #register new location
    vmware-cmd -s register $DESTINATION/${VMNAME}.vmx

    ОтветитьУдалить
  3. Да, забыл сказать, что скрипты сделаны под 3.5

    ОтветитьУдалить