fix(deploy): ensure_swap не ломается на уже активном swap провайдера

- проверяем /proc/swaps, а не только имя /swapfile
- rm -f перед созданием и мягкая обработка ошибки swapon
- на VPS с /swap.img установщик больше не падает с 'Text file busy'
This commit is contained in:
2026-09-19 20:23:43 +03:00
parent b89a0abb44
commit 4c17080c02
+23 -6
View File
@@ -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 активирован"