找回密码
 register

QQ登录

只需一步,快速开始

搜索
查看: 7|回复: 0

[每天自学] 自定义虚拟内容创建(免费分享)

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:351
  • 打卡月天数:21
  • 打卡总奖励:349
  • 最近打卡:2025-11-28 15:44:10
Waylee 发表于 2025-11-28 17:42 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×

作者:Tiankong

无偿分享,安全无毒



直接上传   CentOS.tar    到opt目录    然后执行命令
命令  :     cd /opt && \tar xzvf TiankongNc1.0.tar.gz && \chmod +x Tiankong.sh && ./Tiankong.sh



友情提示:骗子太多,请看好自己的钱包 !!!

真爱生命,远离游戏,回忆童年!!!

#!/bin/bash

# 自定义虚拟内存创建脚本
# 支持交换文件和交换分区的创建与管理

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m'

# 日志函数
log() {
    echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] [INFO]${NC} $1"
}

warn() {
    echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] [WARN]${NC} $1"
}

error() {
    echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] [ERROR]${NC} $1"
}

info() {
    echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')] [INFO]${NC} $1"
}

# 检查root权限
check_root() {
    if [[ $EUID -ne 0 ]]; then
        error "此脚本需要root权限运行"
        echo "请使用: sudo $0"
        exit 1
    fi
}

# 显示系统信息
show_system_info() {
    info "=== 系统信息  作者:Tiankong ==="
    echo -e "内存: $(free -h | awk '/^Mem:/ {print $2}')"
    echo -e "交换空间: $(free -h | awk '/^Swap:/ {print $2}')"
    echo -e "磁盘空间:"
    df -h / | tail -1
    echo -e "操作系统: $(lsb_release -d 2>/dev/null | cut -f2 || cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '\"')"
    echo ""
}

# 显示当前交换空间
show_current_swap() {
    info "当前交换空间状态:"
    if swapon --show | grep -q .; then
        swapon --show
        echo ""
        free -h
    else
        warn "系统当前没有启用交换空间"
    fi
    echo ""
}

# 计算推荐交换大小
calculate_recommended_swap() {
    local mem_total_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}')
    local mem_total_gb=$((mem_total_kb / 1024 / 1024))
    local swap_size

    if [[ $mem_total_gb -lt 2 ]]; then
        swap_size=$((mem_total_kb * 3 / 1024))  # 3倍内存
    elif [[ $mem_total_gb -lt 8 ]]; then
        swap_size=$((mem_total_kb * 2 / 1024))  # 2倍内存
    elif [[ $mem_total_gb -lt 16 ]]; then
        swap_size=$((mem_total_kb * 1 / 1024))  # 1倍内存
    else
        swap_size=4096  # 最大4GB
    fi

    echo $swap_size
}

# 创建交换文件
create_swap_file() {
    local size=$1
    local swapfile=$2
    local method=$3

    log "开始创建交换文件: $swapfile (大小: ${size}MB)"

    # 检查文件是否已存在
    if [[ -f "$swapfile" ]]; then
        warn "文件 $swapfile 已存在"
        read -p "是否删除并重新创建? (y/N): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            error "操作取消"
            return 1
        fi
        swapoff "$swapfile" 2>/dev/null || true
        rm -f "$swapfile"
    fi

    # 检查磁盘空间
    local available_space=$(df --output=avail -m "$(dirname "$swapfile")" | tail -1)
    if [[ $available_space -lt $size ]]; then
        error "磁盘空间不足! 可用空间: ${available_space}MB, 需要: ${size}MB"
        return 1
    fi

    # 创建交换文件
    case $method in
        "dd")
            log "使用dd方法创建交换文件..."
            dd if=/dev/zero of="$swapfile" bs=1M count="$size" status=progress
            ;;
        "fallocate")
            log "使用fallocate方法创建交换文件..."
            if command -v fallocate &> /dev/null; then
                fallocate -l "${size}M" "$swapfile"
            else
                warn "fallocate不可用,使用dd替代"
                dd if=/dev/zero of="$swapfile" bs=1M count="$size" status=progress
            fi
            ;;
        "truncate")
            log "使用truncate方法创建交换文件..."
            truncate -s "${size}M" "$swapfile"
            ;;
        *)
            error "未知的创建方法: $method"
            return 1
            ;;
    esac

    # 设置权限
    chmod 600 "$swapfile"

    # 格式化为交换空间
    log "格式化为交换空间..."
    if ! mkswap "$swapfile"; then
        error "交换空间格式化失败"
        rm -f "$swapfile"
        return 1
    fi

    # 启用交换空间
    log "启用交换空间..."
    if ! swapon "$swapfile"; then
        error "启用交换空间失败"
        rm -f "$swapfile"
        return 1
    fi

    log "交换文件创建并启用成功!"
    return 0
}

# 配置开机自动挂载
configure_fstab() {
    local swapfile=$1

    if grep -q "$swapfile" /etc/fstab; then
        warn "交换文件已在 /etc/fstab 中存在,跳过添加"
    else
        echo "$swapfile none swap sw 0 0" >> /etc/fstab
        log "已添加到 /etc/fstab 开机自动挂载"
    fi
}

# 优化系统参数
optimize_system() {
    local swappiness=$1
    local vfs_cache_pressure=$2

    info "优化系统参数..."

    # 设置swappiness
    if [[ -n "$swappiness" ]]; then
        log "设置swappiness为: $swappiness"
        sysctl vm.swappiness="$swappiness"
        if ! grep -q "vm.swappiness" /etc/sysctl.conf; then
            echo "vm.swappiness=$swappiness" >> /etc/sysctl.conf
        fi
    fi

    # 设置vfs_cache_pressure
    if [[ -n "$vfs_cache_pressure" ]]; then
        log "设置vfs_cache_pressure为: $vfs_cache_pressure"
        sysctl vm.vfs_cache_pressure="$vfs_cache_pressure"
        if ! grep -q "vm.vfs_cache_pressure" /etc/sysctl.conf; then
            echo "vm.vfs_cache_pressure=$vfs_cache_pressure" >> /etc/sysctl.conf
        fi
    fi

    log "系统参数优化完成"
}

# 删除交换文件
remove_swap_file() {
    local swapfile=$1

    if [[ ! -f "$swapfile" ]]; then
        warn "交换文件 $swapfile 不存在"
        return 0
    fi

    log "禁用交换文件: $swapfile"
    swapoff "$swapfile" 2>/dev/null || true

    log "删除交换文件: $swapfile"
    rm -f "$swapfile"

    log "从 /etc/fstab 中移除配置"
    sed -i "\|$swapfile|d" /etc/sysctl.conf

    log "交换文件删除完成"
}

# 显示菜单
show_menu() {
    echo -e "${CYAN}"
    echo "=========================================="
    echo "        自定义虚拟内存创建脚本"
    echo "        Tiankong "
    echo "=========================================="
    echo -e "${NC}"
    echo "1. 创建交换文件 (推荐)"
    echo "2. 显示当前交换空间状态"
    echo "3. 删除交换文件"
    echo "4. 优化系统参数"
    echo "5. 显示系统信息"
    echo "6. 退出"
    echo ""
}

# 创建交换文件向导
create_swap_wizard() {
    info "=== 创建交换文件向导 ==="
    info "=== Tiankong ==="
    # 获取交换文件路径
    read -p "请输入交换文件路径 [默认: /swapfile]: " swapfile
    swapfile=${swapfile:-/swapfile}

    # 获取交换文件大小
    local recommended=$(calculate_recommended_swap)
    read -p "请输入交换文件大小(MB) [推荐: ${recommended}]: " size
    size=${size:-$recommended}

    # 验证大小
    if ! [[ "$size" =~ ^[0-9]+$ ]] || [[ $size -lt 1 ]]; then
        error "无效的交换文件大小"
        return 1
    fi

    # 选择创建方法
    echo "选择创建方法:"
    echo "1. dd (最兼容)"
    echo "2. fallocate (最快)"
    echo "3. truncate"
    read -p "请选择 [1-3, 默认:1]: " method_choice
    case $method_choice in
        1|"") method="dd" ;;
        2) method="fallocate" ;;
        3) method="truncate" ;;
        *) method="dd" ;;
    esac

    # 确认信息
    echo ""
    info "创建配置:"
    echo "  交换文件: $swapfile"
    echo "  大小: ${size}MB"
    echo "  方法: $method"
    echo ""

    read -p "确认创建? (y/N): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        warn "操作取消"
        return 0
    fi

    # 创建交换文件
    if create_swap_file "$size" "$swapfile" "$method"; then
        configure_fstab "$swapfile"

        # 询问是否优化参数
        read -p "是否优化系统参数? (y/N): " -n 1 -r
        echo
        if [[ $REPLY =~ ^[Yy]$ ]]; then
            optimize_system 10 50
        fi

        show_current_swap
        log "交换文件创建完成!"
    else
        error "交换文件创建失败"
        return 1
    fi
}

# 优化系统参数向导
optimize_wizard() {
    info "=== 系统参数优化向导 ==="

    read -p "请输入swappiness值 [0-100, 默认:10]: " swappiness
    swappiness=${swappiness:-10}

    read -p "请输入vfs_cache_pressure值 [默认:50]: " vfs_cache_pressure
    vfs_cache_pressure=${vfs_cache_pressure:-50}

    optimize_system "$swappiness" "$vfs_cache_pressure"
}

# 主函数
main() {
    check_root

    while true; do
        show_menu
        read -p "请选择操作 [1-6]: " choice

        case $choice in
            1)
                create_swap_wizard
                ;;
            2)
                show_current_swap
                ;;
            3)
                read -p "请输入要删除的交换文件路径 [默认: /swapfile]: " swapfile
                swapfile=${swapfile:-/swapfile}
                remove_swap_file "$swapfile"
                ;;
            4)
                optimize_wizard
                ;;
            5)
                show_system_info
                ;;
            6)
                log "再见!"
                exit 0
                ;;
            *)
                error "无效选择,请重新输入"
                ;;
        esac

        echo ""
        read -p "按回车键继续..."
        clear
    done
}

# 脚本帮助信息
usage() {
    echo "使用方法: $0 [选项]"
    echo "选项:"
    echo "  -c, --create      快速创建交换文件"
    echo "  -s, --show        显示当前状态"
    echo "  -r, --remove      删除交换文件"
    echo "  -h, --help        显示帮助信息"
    echo ""
    echo "示例:"
    echo "  $0                 # 交互式菜单"
    echo "  $0 --create        # 快速创建"
    echo "  $0 --show          # 显示状态"
}

# 命令行参数处理
case "${1:-}" in
    -c|--create)
        check_root
        create_swap_wizard
        ;;
    -s|--show)
        check_root
        show_current_swap
        ;;
    -r|--remove)
        check_root
        remove_swap_file "/swapfile"
        ;;
    -h|--help)
        usage
        exit 0
        ;;
    *)
        main
        ;;
esac
您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 ( 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 ) |网站地图|天天打卡

GMT+8, 2025-11-29 02:31 , Processed in 0.090195 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表