#!/usr/bin/env bash # # ... # # 使用方法: # URL="https://git.1-h.cc/Scripts/Linux/raw/branch/2026/zram/install.sh"; curl -fsSL "$URL" | bash # URL="https://git.1-h.cc/Scripts/Linux/raw/branch/2026/zram/install.sh"; wget -q -O - "$URL" | bash if ! declare -F print_red >/dev/null 2>&1; then print_red() { echo -e "\033[31m\033[01m$1$2\033[0m"; } fi if ! declare -F print_green >/dev/null 2>&1; then print_green() { echo -e "\033[32m\033[01m$1$2\033[0m"; } fi if ! declare -F print_yellow >/dev/null 2>&1; then print_yellow() { echo -e "\033[33m\033[01m$1$2\033[0m"; } fi if [ -z "${SYSTEM_TYPE:-}" ]; then if [ -f /etc/debian_version ]; then SYSTEM_TYPE="debian" elif [ -f /etc/alpine-release ]; then SYSTEM_TYPE="alpine" else SYSTEM_TYPE="unknown" fi fi install_zram() { print_green "###################" print_green "###### zram #######" print_green "###################" if [ "$SYSTEM_TYPE" != "debian" ]; then print_yellow "当前仅在 Debian 系统上配置 zram-tools,已跳过" return 0 fi if [ -f /.dockerenv ] || grep -qaE '(docker|containerd|kubepods|lxc)' /proc/1/cgroup 2>/dev/null; then print_yellow "检测到容器环境,跳过 zram 配置" return 0 fi echo "正在准备 zram-tools..." if dpkg -s zram-tools >/dev/null 2>&1; then echo "zram-tools 已安装,跳过安装步骤" else apt update && apt install zram-tools -y fi if command -v modprobe >/dev/null 2>&1; then if modprobe zram 2>/dev/null; then echo "zram 内核模块已加载" else print_yellow "内核不支持 zram 模块,跳过 zram 配置" return 0 fi else print_yellow "未找到 modprobe,继续尝试配置 zram-tools" fi if command -v udevadm >/dev/null 2>&1; then udevadm settle || true fi if [ ! -d /sys/block/zram0 ] || [ ! -b /dev/zram0 ]; then print_yellow "未检测到可用的 zram0 设备,跳过 zram 配置" return 0 fi local total_mem algo percent available_algorithms total_mem=$(awk '/MemTotal/{print int($2 / 1024)}' /proc/meminfo) if ! [[ "$total_mem" =~ ^[0-9]+$ ]] || [ "$total_mem" -le 0 ]; then print_yellow "无法准确检测总内存,跳过 zram 配置" return 0 fi available_algorithms=$(tr ' ' '\n' /dev/null | tr -d '[]' || true) echo "检测到支持的 zram 算法: ${available_algorithms:-unknown}" echo "检测到总内存: ${total_mem}MB" choose_zram_algorithm() { local candidate for candidate in "$@"; do if printf '%s\n' "$available_algorithms" | grep -qx "$candidate"; then printf '%s\n' "$candidate" return 0 fi done return 1 } if [ "$total_mem" -le 2500 ]; then percent="100" if algo=$(choose_zram_algorithm zstd lz4 lzo-rle lzo); then if [ "$algo" = "zstd" ]; then echo "策略:内存 <= 2G,使用 zstd 算法 (100% 占比)" else echo "策略:内存 <= 2G,但内核未报告 zstd 支持,回退到 $algo (100% 占比)" fi else print_yellow "未检测到受支持的 zram 压缩算法,跳过 zram 配置" return 0 fi else percent="60" if algo=$(choose_zram_algorithm lz4 zstd lzo-rle lzo); then if [ "$algo" = "lz4" ]; then echo "策略:内存 > 2G,使用 lz4 算法 (60% 占比)" else echo "策略:内存 > 2G,但内核未报告 lz4 支持,回退到 $algo (60% 占比)" fi else print_yellow "未检测到受支持的 zram 压缩算法,跳过 zram 配置" return 0 fi fi cat </etc/default/zramswap ALGO=$algo PERCENT=$percent PRIORITY=100 EOF if ! systemctl restart zramswap; then print_red "zramswap 服务重启失败" systemctl status zramswap.service --no-pager || true journalctl -u zramswap.service -n 20 --no-pager || true return 1 fi echo "---------------------------------------" echo "zram 部署完成!当前状态:" zramctl || true echo "---------------------------------------" } if [ "${BASH_SOURCE[0]:-}" = "$0" ] || [ -z "${BASH_SOURCE[0]:-}" ]; then if [ "$EUID" -ne 0 ]; then print_red "请使用 sudo 运行此脚本" exit 1 fi install_zram fi