From 7541c815c24d60542e958c8ddb3b652284b718c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=A5=E6=B5=A9?= Date: Mon, 23 Mar 2026 10:21:35 +0800 Subject: [PATCH] =?UTF-8?q?feat(zram):=20=E6=B7=BB=E5=8A=A0=20zram=20?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E9=85=8D=E7=BD=AE=E5=8A=9F=E8=83=BD=E5=8F=8A?= =?UTF-8?q?=20root=20=E8=BF=90=E8=A1=8C=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.sh | 74 +++++++++++++++++++++++++++++++++++++++++++++ show_zram_status.sh | 34 +++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 show_zram_status.sh diff --git a/1.sh b/1.sh index 170b11d..95ca3ee 100644 --- a/1.sh +++ b/1.sh @@ -13,6 +13,11 @@ print_red() { echo -e "\033[31m\033[01m$1$2\033[0m"; } print_green() { echo -e "\033[32m\033[01m$1$2\033[0m"; } print_yellow() { echo -e "\033[33m\033[01m$1$2\033[0m"; } +if [ "$EUID" -ne 0 ]; then + print_red "请使用 sudo 运行此脚本" + exit 1 +fi + # 设置 bash 为默认 shell print_green "###################" print_green "##### shell ######" @@ -253,10 +258,79 @@ start_watchtower() { containrrr/watchtower "${WATCHTOWER_ARGS[@]}" $WATCHTOWER_NAME } +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 + + local total_mem algo percent + total_mem=$(free -m | awk '/^Mem:/{print $2}') + echo "检测到总内存: ${total_mem}MB" + + if [ "$total_mem" -le 2500 ]; then + percent="100" + + if [ -r /sys/block/zram0/comp_algorithm ] && grep -qw zstd /sys/block/zram0/comp_algorithm; then + algo="zstd" + echo "策略:内存 <= 2G,使用 zstd 算法 (100% 占比)" + else + algo="lz4" + echo "策略:内存 <= 2G,但内核未报告 zstd 支持,回退到 lz4 (100% 占比)" + fi + else + algo="lz4" + percent="60" + echo "策略:内存 > 2G,使用 lz4 算法 (60% 占比)" + fi + + cat </etc/default/zramswap +# 自动生成的 zram 配置 +ALGO=$algo +PERCENT=$percent +PRIORITY=100 +EOF + + systemctl restart zramswap + + echo "---------------------------------------" + echo "zram 部署完成!当前状态:" + zramctl || true + echo "---------------------------------------" +} + modify_authorized_keys bash_aliases install_docker start_watchtower +install_zram sysctl_config # source <(curl -fsSL scripts.oo1.dev/nezha-v1.sh) diff --git a/show_zram_status.sh b/show_zram_status.sh new file mode 100644 index 0000000..d771cb3 --- /dev/null +++ b/show_zram_status.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +# +# ... +# +# 使用方法: +# URL="https://git.1-h.cc/Scripts/Linux/raw/branch/2026/show_zram_status.sh"; curl -fsSL "$URL" | bash + +show_zram_status() { + echo "========== zram 运行战报 ==========" + # 获取 zram 信息并进行格式化处理 + local stats=$(zramctl --raw --noheadings --output DATA,COMPR,TOTAL) + + if [ -z "$stats" ]; then + echo "未发现活跃的 zram 设备。" + return + fi + + # 提取数据 (单位通常是字节) + local data_size=$(echo "$stats" | awk '{print $1}') # 存入的原始数据 + local compr_size=$(echo "$stats" | awk '{print $2}') # 压缩后的大小 + local total_mem=$(echo "$stats" | awk '{print $3}') # 实际占用的物理内存(含元数据) + + # 计算压缩率和节省空间 (转为 MB) + local saved_mb=$(( (data_size - total_mem) / 1024 / 1024 )) + local ratio=$(awk "BEGIN {printf \"%.2f\", $data_size / $total_mem}") + + echo "1. 原始数据量: $((data_size / 1024 / 1024)) MB" + echo "2. 实际占用内存: $((total_mem / 1024 / 1024)) MB" + echo "3. 压缩倍率: ${ratio}x" + echo "4. 为系统节省了: **${saved_mb} MB** 物理内存" + echo "===================================" +} + +show_zram_status