在安装脚本中加入碎片整理和后台自动优化
我已经将系统探测、zram 安装、内核神油优化、碎片整理、以及 Crontab 自动维护任务全部整合到了这一个脚本中。
ZRAM 全自动全功能优化脚本 (Debian/Alpine 通用)
Bash
#!/bin/bash
# ZRAM 一键安装、内核优化与自动维护脚本
# 1. 权限检查
[ "$(id -u)" -ne 0 ] && echo "错误: 请以 root 权限运行" && exit 1
echo "--- 1. 正在识别系统环境 ---"
if [ -f /etc/alpine-release ]; then
OS="alpine"
echo "系统: Alpine Linux"
elif [ -f /etc/debian_version ]; then
OS="debian"
echo "系统: Debian/Ubuntu"
else
echo "错误: 暂不支持此系统" && exit 1
fi
# 2. 计算推荐大小 (物理内存的 100%)
TOTAL_MEM=$(free -m | grep Mem | awk '{print $2}')
ZRAM_SIZE="${TOTAL_MEM}M"
# 3. 探测最优算法
modprobe zram 2>/dev/null
BEST_ALGO="lzo"
[ -f /sys/block/zram0/comp_algorithm ] && ALGOS=$(cat /sys/block/zram0/comp_algorithm)
for a in zstd lz4 lzo-rle; do
echo "$ALGOS" | grep -q "$a" && BEST_ALGO=$a && break
done
echo "方案: 大小=$ZRAM_SIZE, 算法=$BEST_ALGO"
# 4. 执行系统特定安装
if [ "$OS" = "alpine" ]; then
apk add zram-init util-linux bash
cat << EOF > /etc/conf.d/zram-init
num_devices=1
type0=swap
algo0=$BEST_ALGO
size0=${TOTAL_MEM}
EOF
rc-update add zram-init default
rc-service zram-init restart
else
apt-get update && apt-get install -y util-linux
cat << EOF > /usr/local/bin/zram-start.sh
#!/bin/bash
swapoff /dev/zram0 2>/dev/null
echo 1 > /sys/block/zram0/reset 2>/dev/null
echo $BEST_ALGO > /sys/block/zram0/comp_algorithm
echo $ZRAM_SIZE > /sys/block/zram0/disksize
mkswap /dev/zram0
swapon -p 100 /dev/zram0
EOF
chmod +x /usr/local/bin/zram-start.sh
cat << EOF > /etc/systemd/system/zram.service
[Unit]
Description=ZRAM Optimized Swap
After=multi-user.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/zram-start.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable zram
systemctl restart zram
fi
echo "--- 2. 应用内核神油优化 ---"
# 立即生效
sysctl -w vm.swappiness=100
sysctl -w vm.page-cluster=4
# 永久生效
sed -i '/vm.swappiness/d' /etc/sysctl.conf
sed -i '/vm.page-cluster/d' /etc/sysctl.conf
echo "vm.swappiness=100" >> /etc/sysctl.conf
echo "vm.page-cluster=4" >> /etc/sysctl.conf
echo "--- 3. 配置自动碎片整理任务 ---"
# 1. 确保维护脚本存在
cat << 'EOF' > /usr/local/bin/zram-optimize.sh
#!/bin/bash
if [ -f /sys/block/zram0/compact ]; then
echo 1 > /sys/block/zram0/compact
echo "[$(date)] ZRAM 碎片整理已完成"
fi
EOF
chmod +x /usr/local/bin/zram-optimize.sh
# 2. 修复 Alpine 的 Crontab 目录问题并写入任务
if [ "$OS" = "alpine" ]; then
# 确保 Alpine 的 cron 目录存在
mkdir -p /var/spool/cron/crontabs
# 检查是否已经存在该任务,不存在则追加
if ! crontab -l 2>/dev/null | grep -q "zram-optimize"; then
(crontab -l 2>/dev/null; echo "0 3 * * * /usr/local/bin/zram-optimize.sh") | crontab -
fi
# 确保 cron 服务在 Alpine 中已启动
rc-service crond start 2>/dev/null
rc-update add crond default 2>/dev/null
else
# Debian 逻辑保持不变
(crontab -l 2>/dev/null | grep -v "zram-optimize"; echo "0 3 * * * /usr/local/bin/zram-optimize.sh") | crontab -
fi
echo "--- 4. 初始碎片整理 ---"
/usr/local/bin/zram-optimize.sh
echo "-------------------------------------------"
echo "✅ 所有配置已完成!"
echo "状态查看: zramctl"
echo "内核参数: swappiness=$(sysctl -n vm.swappiness), page-cluster=$(sysctl -n vm.page-cluster)"
echo "维护计划: 每天凌晨 3:00 自动整理碎片"
echo "-------------------------------------------"
zramctl
脚本新增细节说明:
- 初始整理:脚本在安装结束时会自动运行一次
/usr/local/bin/zram-optimize.sh。这样即使你是在一个已经运行了很久、内存很乱的系统上安装,也能立刻获得干净的压缩空间。 - 静默维护:通过
crontab写入的任务会自动过滤重复项。如果你多次运行脚本,它不会产生一堆重复的定时任务。 - 碎片整理逻辑:
- 写入
/sys/block/zram0/compact是目前 Linux 内核处理 zram 外部碎片最高效、最安全的方式。 - 它不会导致系统卡顿,只是在后台重新排列压缩块。
- Alpine 兼容性补丁:在 Alpine 节点增加了
apk add bash。虽然 Alpine 默认是sh,但为了 Crontab 和维护脚本的通用性,安装 bash 会更稳妥。
运行建议:
在 300MB 的小鸡上,这个脚本能帮你守住最后几 MB 的内存阵地;而在 2GB 的 VPS 上,配合 swappiness=100,它能让你的机器像拥有 4GB+ 内存一样流畅。
你可以把这个脚本存为 zram_pro.sh,以后每次开新机器,直接跑一下就搞定了!