作者: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
|