Назад | Перейти на главную страницу

Решение / решение проблемы Ploop с OpenVZ - восстановление потерянного места

Итак, в OpenVZ Ploop есть ошибка, из-за которой, если пользователи добавляют и удаляют файлы, пространство становится невостребованным, а на диске в конечном итоге заканчивается место. Теперь есть сценарий, который это исправляет (см. Ниже). Однако, безусловно, есть лучший способ, чем запускать этот скрипт ежедневно, чтобы исправить проблему, не меняя виртуализации.

По сути, возникает вопрос: есть ли более идеальный способ вернуть потерянное пространство, чем запускать скрипт так часто? (Я предполагаю, что сценарий вызовет проблемы с загрузкой?).

Offtopic: Почему у ploop есть эта проблема, а не у других виртуализаций?

#!/bin/bash
# compact.sh by Devon of ByteOnSite for OpenVZ
# SETTINGS

# Config Directory
CFG="/tmp"

# VZ Partition
VZ=`cat $CFG/compact.vzdir 2>/dev/null`
# Run Compact Automatically Every X Runs. Default: 96 runs, if run every 15 minutes this is every 24 hours.
ONXRUNS=`cat $CFG/compact.onxruns 2>/dev/null`
# Minimum Free Space in MB.  Will attempt to compact if free space drops below this.  Default: automatically generated, 5% free space.
MINFREE=`cat $CFG/compact.minfree 2>/dev/null`
# Email Address
EMAIL=`cat $CFG/compact.email 2>/dev/null`
# Log enabled
LOG=`cat $CFG/compact.logging 2>/dev/null`

# END SETTINGS

# DEFAULT SETTINGS

# Default VZ Partition
if [ ! $VZ ]; then
    VZ="/vz"
    echo $VZ > $CFG/compact.vzdir
fi
# Default ONXRUNS
if [ ! $ONXRUNS ]; then
    ONXRUNS=96
    echo $ONXRUNS > $CFG/compact.onxruns
fi
# Default MINFREE (5% of Total Partition)
if [ ! $MINFREE ]; then
    MINFREE=$[`df -PBM $VZ | awk 'NR==2 {print $2}' | cut -f1 -dM`/20]
    echo $MINFREE > $CFG/compact.minfree
fi
if [ ! $LOG ]; then
    LOG=1
    echo $LOG > $CFG/compact.logging
fi

# END DEFAULT SETTINGS

# LOGIC

FREESPACE=`df -PBM $VZ | awk 'NR==2 {print $4}' | cut -f1 -dM`

# DEBUG
if [ "$1" = "debug" ]; then
    echo "CFG: $CFG"
    echo "VZ: $VZ"
    echo "FREESPACE: ${FREESPACE}MB"
    echo "MINFREE: ${MINFREE}MB"
    echo "ONXRUNS: $ONXRUNS"
    echo "LOG: $LOG"
    echo "EMAIL: $EMAIL"
    if [ ! -f "/bin/mail" ]; then
        echo "MAILX: NOT FOUND. EMAILS WON'T BE SENT ON WARNING"
    fi
    exit 0
fi
# END DEBUG

i=`cat $CFG/compact.count`
if [ ! "$i" ] || [ "$i" -eq $ONXRUNS ]; then
    i=1
fi
if [ $i -eq 1 ] || [ $FREESPACE -lt $MINFREE ]; then
    # Run compact for every VPS
    stdout="/dev/null"
    if [ $LOG -eq 1 ]; then
        stdout="$CFG/compact.log"
    fi
    for veid in `vzlist -H -o veid`
    do
        date=`date`
        echo "Starting compact on VEID $veid at $date.." >$stdout 2>&1
        vzctl compact $veid >$stdout 2>&1
    done
    # Check disk space again
    FREESPACE=`df -PBM $VZ | awk 'NR==2 {print $4}' | cut -f1 -dM`
    if [ $FREESPACE -lt $MINFREE ]; then
        message="Unable to compact containers enough to reduce free space below MINFREE levels. Free Space: $FREESPACE MB."
        echo $message | wall
        hostname=`hostname`
        if [ $EMAIL ]; then
            echo $message | mail -s "Compact failure on $hostname" $EMAIL
        fi
    fi
fi

# Increase count
i=$[$i+1]
echo $i > $CFG/compact.count

# END LOGIC
exit 0
#
#
# pulled from SolidShellSecurity.com Script Repository where clients submit scripts for other clients. 
#
#