diff --git a/deploy/install.sh b/deploy/install.sh index d42b624..3d27542 100755 --- a/deploy/install.sh +++ b/deploy/install.sh @@ -622,26 +622,43 @@ EOF } ensure_swap() { - local want_gb="$1" current_mb + local want_gb="$1" current_mb active_file + want_mb=$((want_gb * 1024)) current_mb="$(awk '/SwapTotal/ {printf "%d", $2/1024}' /proc/meminfo)" - if [ "$current_mb" -ge $((want_gb * 1024 - 256)) ]; then + + # Достаточно активного swap (в том числе созданного провайдером или + # cloud-init — файл может называться иначе, чем /swapfile). + if [ "$current_mb" -ge $((want_mb - 256)) ]; then ok "swap уже есть: ${current_mb} MB" return 0 fi + + # Файл /swapfile может уже использоваться как swap под другим именем в /proc/swaps. + active_file="$(awk 'NR > 1 {print $1}' /proc/swaps 2>/dev/null | grep -E '^/swapfile$' || true)" + if [ -n "$active_file" ]; then + ok "swap уже активен: ${active_file} (${current_mb} MB)" + return 0 + fi + if ! have fallocate && ! have dd; then warn "не удалось создать swap: нет fallocate/dd" return 0 fi info "создаём swap ${want_gb} GB" + rm -f /swapfile 2>/dev/null || true if have fallocate; then - fallocate -l "${want_gb}G" /swapfile 2>/dev/null || dd if=/dev/zero of=/swapfile bs=1M count=$((want_gb * 1024)) status=none + fallocate -l "${want_gb}G" /swapfile 2>/dev/null || + dd if=/dev/zero of=/swapfile bs=1M count="$want_mb" status=none else - dd if=/dev/zero of=/swapfile bs=1M count=$((want_gb * 1024)) status=none + dd if=/dev/zero of=/swapfile bs=1M count="$want_mb" status=none fi chmod 600 /swapfile mkswap /swapfile >/dev/null - swapon /swapfile - if ! grep -q '^/swapfile' /etc/fstab; then + swapon /swapfile || { + warn "не удалось активировать swap" + return 0 + } + if ! grep -qE '^/swapfile[[:space:]]' /etc/fstab; then printf '/swapfile none swap sw 0 0\n' >>/etc/fstab fi ok "swap ${want_gb} GB активирован"