logo NodeSeekbeta

Alpine配置zram的自动安装脚本

这个脚本会自动检测你的物理内存,计算推荐的 zram 大小(设为内存的 100%),探测内核支持的最佳算法,并自动完成安装与配置。

直接用 #3 楼的吧 适用于debian和alpine 加了定时清理碎片 (适用范围请注意,不可以用zram配合rclone挂载加密卷;不适合用于高负载的编译机;注意CPU性能)

你可以直接在 Alpine 终端复制并执行以下内容:

bash 推荐 #3 楼的新版 以下旧版设为折叠
cat << 'EOF' > setup_zram.sh
#!/bin/sh

# 1. 检查是否为 root 用户
if [ "$(id -u)" -ne 0 ]; then
    echo "请以 root 权限运行此脚本"
    exit 1
fi

echo "--- 开始配置 zram ---"

# 2. 安装必要工具
apk add zram-init util-linux

# 3. 加载模块并探测最佳算法
modprobe zram
AVAILABLE_ALGOS=$(cat /sys/block/zram0/comp_algorithm)
BEST_ALGO="lzo"

for algo in zstd lz4 lzo-rle; do
    if echo "$AVAILABLE_ALGOS" | grep -q "$algo"; then
        BEST_ALGO=$algo
        break
    fi
done
echo "探测到最佳支持算法: $BEST_ALGO"

# 4. 计算推荐大小 (物理内存的 100%)
TOTAL_MEM=$(free -m | grep Mem | awk '{print $2}')
ZRAM_SIZE=$TOTAL_MEM
echo "检测到物理内存: ${TOTAL_MEM}MB, 推荐 zram 大小: ${ZRAM_SIZE}MB"

# 5. 写入配置文件 /etc/conf.d/zram-init
cat << CONF > /etc/conf.d/zram-init
# 由自动脚本生成的配置
num_devices=1
type0=swap
flag0=
algo0=$BEST_ALGO
size0=$ZRAM_SIZE
CONF

# 6. 重置并启动服务
echo "正在应用配置..."
swapoff /dev/zram0 2>/dev/null
rc-service zram-init restart

# 7. 设置开机自启
rc-update add zram-init default

echo "--- 配置完成 ---"
swapon --show
zramctl
EOF

# 给脚本执行权限并运行
chmod +x setup_zram.sh
./setup_zram.sh

脚本说明:

  1. 自动选优:它会按 zstd > lz4 > lzo-rle > lzo 的顺序自动选择你内核支持的最强算法。
  2. 智能扩容:它抓取 free -m 的结果,将 zram 大小设为物理内存的 1 倍。对于你 300MB 的内存,它会设置约 300MB 的 zram。
  3. 服务集成:它使用 Alpine 标准的 rc-service 管理,确保重启后依然有效。
  4. 优先级控制zram-init 默认会给 zram 设置极高的优先级,确保系统先压缩内存,再读写硬盘 Swap。
  • 这份指南将帮助你在 Alpine Linux 上从零开始配置 zram。由于 Alpine 极其精简,手动确认内核支持是成功的关键。


    Alpine Linux zram 配置完全手册

    第一步:检查内核支持与压缩算法

    在配置之前,必须确认内核是否加载了模块,以及支持哪些算法。

    1. 加载内核模块:
    modprobe zram
    
    
    1. 查看支持的算法:
    cat /sys/block/zram0/comp_algorithm
    
    
    • 输出示例: lzo lzo-rle [lz4] zstd
    • 注意: 带有中括号 [] 的是当前默认值。请记录下你看到的算法(推荐顺序:zstd > lz4 > lzo)。

    第二步:安装管理工具

    安装 Alpine 官方提供的 zram 初始化脚本和基础工具包:

    apk add zram-init util-linux
    
    

    第三步:配置 zram 参数

    编辑配置文件。如果你的内存较小(如 300MB),建议设置 zram 大小为内存的 1:1 或 1.5:1。

    vi /etc/conf.d/zram-init
    
    

    建议配置内容:

    # 1. 设置设备数量(通常只需 1 个作为 Swap)
    num_devices=1
    
    # 2. 设置设备 0 的参数
    type0=swap
    flag0=
    
    # 3. 设置算法(填入第一步中查到的支持算法,如 lz4 或 zstd)
    algo0=lz4
    
    # 4. 设置大小(单位 MB,建议 300)
    size0=300
    
    

    第四步:启动与开机自启

    清理可能存在的残留手动设置,并启动服务:

    1. 重置并启动:
    swapoff /dev/zram0 2>/dev/null
    rc-service zram-init restart
    
    
    1. 设置开机自动加载:
    rc-update add zram-init default
    
    

    第五步:验证运行状态

    使用以下两个命令确认 zram 是否正在为你工作:

    1. 查看 Swap 优先级:
    swapon --show
    
    
    • 确认 /dev/zram0PRIO(优先级)高于其他的 /swapfile(数值越大优先级越高)。
    1. 查看压缩统计:
    zramctl
    
    
    • DISKSIZE: 你设定的虚拟大小(如 300M)。
    • DATA: 实际存入的数据。
    • COMPR: 压缩后占用的物理内存。

    💡 常见问题排查

    • 报错 Invalid argument 通常是 algo0 填写的算法内核不支持,请回到第一步重新确认。
    • zram1 报错: 如果你不需要把 /tmp 挂载到 zram,确保配置文件中注释掉所有以 1 结尾的变量(如 type1, size1)。
    • 内存依然不足: 可以尝试将 size0 调大到物理内存的 2 倍,lz4 算法通常能处理这种压缩比。

  • alpine和debian通用的,加入了碎片清理任务。其他和zram有关的局限请自行考虑。(cpu性能,是否有挂载加密卷等)

    #!/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
    
  • 给辛苦写教程的julao送两个鸡腿

  • 支持一下

  • 谢谢分享

  • 支持一下

  • 给我的nat机试试看

  • xhj018

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有60085位seeker

🎉欢迎新用户🎉