Files
dock/系统优化
2025-10-31 20:30:22 +08:00

517 lines
16 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# Ubuntu/Debian/CentOS/RHEL系统优化与Docker准备脚本
# 精简版 - 不备份文件适合小存储空间VPS
# 颜色定义
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_FILE="/tmp/system_optimization.log"
# 错误处理函数
handle_error() {
echo -e "${RED}❌ 错误: $1${NC}"
echo "详细日志请查看: $LOG_FILE"
exit 1
}
# 日志记录函数
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
# 检查命令是否存在
check_command() {
if ! command -v "$1" &> /dev/null; then
return 1
fi
return 0
}
# 检测系统类型
detect_os() {
echo -e "${BLUE}🔍 检测操作系统...${NC}"
if [ -f /etc/os-release ]; then
. /etc/os-release
OS_NAME=$ID
OS_VERSION=$VERSION_ID
OS_PRETTY_NAME=$PRETTY_NAME
echo -e "${GREEN}✅ 操作系统: $OS_PRETTY_NAME${NC}"
echo -e "${GREEN}✅ 版本: $OS_VERSION${NC}"
case $OS_NAME in
ubuntu|debian)
OS_TYPE="debian"
PM="apt-get"
UPDATE_CMD="apt-get update"
UPGRADE_CMD="apt-get upgrade -y"
INSTALL_CMD="apt-get install -y"
AUTOREMOVE_CMD="apt-get autoremove -y"
AUTOCLEAN_CMD="apt-get autoclean -y"
;;
centos|rhel|fedora|rocky|almalinux)
OS_TYPE="rhel"
if check_command dnf; then
PM="dnf"
UPDATE_CMD="dnf update -y"
INSTALL_CMD="dnf install -y"
else
PM="yum"
UPDATE_CMD="yum update -y"
INSTALL_CMD="yum install -y"
fi
AUTOREMOVE_CMD="$PM autoremove -y"
AUTOCLEAN_CMD="$PM clean all"
;;
*)
handle_error "不支持的操作系统: $OS_NAME"
;;
esac
else
handle_error "无法检测操作系统"
fi
}
# 检查系统架构
check_architecture() {
echo -e "${BLUE}🔍 检查系统架构...${NC}"
ARCH=$(uname -m)
case $ARCH in
x86_64)
echo -e "${GREEN}✅ 系统架构: AMD64${NC}"
;;
aarch64)
echo -e "${GREEN}✅ 系统架构: ARM64${NC}"
;;
*)
echo -e "${YELLOW}⚠️ 检测到非常见架构: $ARCH${NC}"
;;
esac
}
# 清理系统缓存和旧包
clean_system() {
echo -e "${BLUE}🧹 清理系统缓存和旧包...${NC}"
if [ "$OS_TYPE" = "debian" ]; then
# 清理apt缓存
apt-get clean >> "$LOG_FILE" 2>&1 || echo -e "${YELLOW}⚠️ apt清理缓存失败${NC}"
apt-get autoremove -y >> "$LOG_FILE" 2>&1 || echo -e "${YELLOW}⚠️ apt自动移除失败${NC}"
# 清理旧内核仅保留最新1个以节省空间
if check_command dpkg; then
OLD_KERNELS=$(dpkg -l | grep -E "linux-image-[0-9]" | grep -v $(uname -r | sed 's/-generic//') | awk '{print $2}')
if [ -n "$OLD_KERNELS" ]; then
echo -e "${BLUE}移除旧内核: $OLD_KERNELS${NC}"
apt-get remove -y $OLD_KERNELS >> "$LOG_FILE" 2>&1 || true
fi
fi
elif [ "$OS_TYPE" = "rhel" ]; then
# 清理yum/dnf缓存
$PM clean all >> "$LOG_FILE" 2>&1 || echo -e "${YELLOW}⚠️ $PM清理缓存失败${NC}"
# 清理旧内核仅保留最新1个
if [ "$PM" = "yum" ]; then
package-cleanup --oldkernels --count=1 -y >> "$LOG_FILE" 2>&1 || true
elif [ "$PM" = "dnf" ]; then
dnf remove --oldinstallonly --setopt installonly_limit=1 -y >> "$LOG_FILE" 2>&1 || true
fi
fi
# 清理临时文件(不清理太多避免影响运行)
rm -rf /tmp/*.deb /tmp/*.rpm /var/tmp/*.deb /var/tmp/*.rpm >> "$LOG_FILE" 2>&1 || true
# 清理日志文件保留最近7天
find /var/log -name "*.log" -type f -mtime +7 -delete 2>/dev/null || true
find /var/log -name "*.gz" -type f -delete 2>/dev/null || true
echo -e "${GREEN}✅ 系统清理完成${NC}"
}
# 更新系统包管理器
update_package_manager() {
echo -e "${BLUE}🔄 更新包管理器...${NC}"
if [ "$OS_TYPE" = "debian" ]; then
# 更新apt源
if ! $UPDATE_CMD >> "$LOG_FILE" 2>&1; then
echo -e "${YELLOW}⚠️ 包管理器更新失败,尝试修复...${NC}"
# 修复可能的损坏
dpkg --configure -a >> "$LOG_FILE" 2>&1 || true
apt-get install -f -y >> "$LOG_FILE" 2>&1 || true
fi
elif [ "$OS_TYPE" = "rhel" ]; then
if ! $UPDATE_CMD >> "$LOG_FILE" 2>&1; then
echo -e "${YELLOW}⚠️ 包管理器更新失败,尝试修复...${NC}"
# 修复可能的损坏
rpm --rebuilddb >> "$LOG_FILE" 2>&1 || true
$PM clean all >> "$LOG_FILE" 2>&1 || true
fi
fi
echo -e "${GREEN}✅ 包管理器更新完成${NC}"
}
# 安装基础依赖(精简版)
install_basic_dependencies() {
echo -e "${BLUE}📦 安装基础依赖包...${NC}"
local base_packages=()
if [ "$OS_TYPE" = "debian" ]; then
base_packages=(
"curl" "wget" "gnupg" "lsb-release" "apt-transport-https"
"ca-certificates" "software-properties-common"
"net-tools" "dnsutils" "iputils-ping" "sudo" "bc"
)
elif [ "$OS_TYPE" = "rhel" ]; then
base_packages=(
"curl" "wget" "gnupg" "redhat-lsb-core" "yum-utils" "epel-release"
"ca-certificates" "device-mapper-persistent-data" "lvm2"
"net-tools" "bind-utils" "iputils" "sudo" "bc"
)
fi
for package in "${base_packages[@]}"; do
echo -e "${BLUE}安装 $package...${NC}"
if ! $INSTALL_CMD "$package" >> "$LOG_FILE" 2>&1; then
echo -e "${YELLOW}⚠️ $package 安装失败,跳过...${NC}"
fi
done
echo -e "${GREEN}✅ 基础依赖安装完成${NC}"
}
# 配置系统优化参数
configure_system_optimization() {
echo -e "${BLUE}⚙️ 配置系统优化参数...${NC}"
# 优化内核参数 - 直接修改,不备份
if ! grep -q "系统优化配置" /etc/sysctl.conf; then
cat >> /etc/sysctl.conf << EOF
# 系统优化配置 - 添加于 $(date)
# 网络优化
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 16384 16777216
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_tw_reuse = 1
# 内存优化
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
# 文件系统优化
fs.file-max = 65536
EOF
fi
# 应用配置
sysctl -p >> "$LOG_FILE" 2>&1 || echo -e "${YELLOW}⚠️ sysctl配置应用失败${NC}"
# 配置文件描述符限制
if ! grep -q "文件描述符限制" /etc/security/limits.conf; then
cat >> /etc/security/limits.conf << EOF
# 文件描述符限制 - 添加于 $(date)
* soft nofile 65536
* hard nofile 65536
root soft nofile 65536
root hard nofile 65536
EOF
fi
echo -e "${GREEN}✅ 系统优化配置完成${NC}"
}
# 配置DNS优化
configure_dns() {
echo -e "${BLUE}🌐 配置DNS优化...${NC}"
# 直接配置,不备份
cat > /etc/resolv.conf << EOF
# DNS配置 - 优化于 $(date)
nameserver 223.5.5.5
nameserver 119.29.29.29
nameserver 8.8.8.8
nameserver 1.1.1.1
options timeout:2 attempts:3 rotate
EOF
# 防止NetworkManager覆盖配置
if [ -f /etc/NetworkManager/NetworkManager.conf ]; then
sed -i 's/^dns=.*/dns=none/' /etc/NetworkManager/NetworkManager.conf 2>/dev/null || true
fi
echo -e "${GREEN}✅ DNS优化配置完成${NC}"
}
# 配置Docker安装环境
configure_docker_environment() {
echo -e "${BLUE}🐳 配置Docker安装环境...${NC}"
if [ "$OS_TYPE" = "debian" ]; then
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/$OS_NAME/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg >> "$LOG_FILE" 2>&1 || {
echo -e "${YELLOW}⚠️ Docker GPG密钥添加失败使用备用方案${NC}"
curl -fsSL https://download.docker.com/linux/$OS_NAME/gpg | apt-key add - >> "$LOG_FILE" 2>&1 || true
}
# 添加Docker仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/$OS_NAME $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# 更新包列表
$UPDATE_CMD >> "$LOG_FILE" 2>&1 || echo -e "${YELLOW}⚠️ 更新包列表失败${NC}"
elif [ "$OS_TYPE" = "rhel" ]; then
# 添加Docker仓库
$INSTALL_CMD yum-utils >> "$LOG_FILE" 2>&1 || true
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo >> "$LOG_FILE" 2>&1 || {
echo -e "${YELLOW}⚠️ Docker仓库添加失败使用官方仓库${NC}"
}
# 更新包列表
$UPDATE_CMD >> "$LOG_FILE" 2>&1 || true
fi
echo -e "${GREEN}✅ Docker环境配置完成${NC}"
}
# 安装Docker
install_docker() {
echo -e "${BLUE}🐳 安装Docker...${NC}"
# 检查是否已安装Docker
if check_command docker; then
echo -e "${YELLOW}⚠️ Docker已安装跳过安装${NC}"
return 0
fi
if [ "$OS_TYPE" = "debian" ]; then
$INSTALL_CMD docker-ce docker-ce-cli containerd.io docker-compose-plugin >> "$LOG_FILE" 2>&1 || {
echo -e "${YELLOW}⚠️ Docker安装失败尝试替代方案${NC}"
# 尝试安装docker.io
$INSTALL_CMD docker.io containerd runc >> "$LOG_FILE" 2>&1 || {
echo -e "${RED}❌ Docker安装完全失败${NC}"
return 1
}
}
elif [ "$OS_TYPE" = "rhel" ]; then
$INSTALL_CMD docker-ce docker-ce-cli containerd.io docker-compose-plugin >> "$LOG_FILE" 2>&1 || {
echo -e "${YELLOW}⚠️ Docker安装失败尝试替代方案${NC}"
$INSTALL_CMD docker >> "$LOG_FILE" 2>&1 || {
echo -e "${RED}❌ Docker安装完全失败${NC}"
return 1
}
}
fi
# 启动Docker服务
systemctl enable docker >> "$LOG_FILE" 2>&1 || true
systemctl start docker >> "$LOG_FILE" 2>&1 || true
# 验证安装
if docker --version >> "$LOG_FILE" 2>&1; then
echo -e "${GREEN}✅ Docker安装成功: $(docker --version)${NC}"
# 配置用户组
usermod -aG docker $USER 2>/dev/null || true
echo -e "${GREEN}✅ 已将当前用户添加到docker组${NC}"
else
echo -e "${RED}❌ Docker安装验证失败${NC}"
return 1
fi
}
# 安装Docker Compose
install_docker_compose() {
echo -e "${BLUE}🐳 安装Docker Compose...${NC}"
# 检查是否已安装
if check_command docker-compose; then
echo -e "${YELLOW}⚠️ Docker Compose已安装跳过${NC}"
return 0
fi
# 安装最新版本
COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
if [ -z "$COMPOSE_VERSION" ]; then
COMPOSE_VERSION="v2.24.0" # 备用版本
fi
curl -L "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
chmod +x /usr/local/bin/docker-compose
ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose 2>/dev/null || true
echo -e "${GREEN}✅ Docker Compose安装成功: ${COMPOSE_VERSION}${NC}"
else
echo -e "${YELLOW}⚠️ Docker Compose安装失败跳过${NC}"
fi
}
# 验证安装结果
verify_installation() {
echo -e "${BLUE}🔍 验证安装结果...${NC}"
echo -e "${CYAN}系统信息:${NC}"
echo -e " OS: $OS_PRETTY_NAME"
echo -e " 内核: $(uname -r)"
echo -e " 架构: $(uname -m)"
echo -e "${CYAN}服务状态:${NC}"
if systemctl is-active docker >/dev/null 2>&1; then
echo -e " Docker: ${GREEN}运行中${NC}"
else
echo -e " Docker: ${RED}未运行${NC}"
fi
echo -e "${CYAN}版本信息:${NC}"
if check_command docker; then
echo -e " Docker: $(docker --version 2>/dev/null | cut -d' ' -f3 | tr -d ',')"
else
echo -e " Docker: ${RED}未安装${NC}"
fi
if check_command docker-compose; then
echo -e " Docker Compose: $(docker-compose --version 2>/dev/null | cut -d' ' -f3 | tr -d ',')"
else
echo -e " Docker Compose: ${YELLOW}未安装${NC}"
fi
# 显示磁盘空间
echo -e "${CYAN}磁盘空间:${NC}"
df -h / | tail -1 | awk '{print " 根分区: " $4 " 可用 / " $2 " 总大小"}'
echo -e "${GREEN}✅ 验证完成${NC}"
}
# 显示使用说明
show_usage() {
echo -e "${GREEN}系统优化与Docker准备脚本 (精简版)${NC}"
echo -e "专为小存储空间VPS设计 - 不备份文件${NC}"
echo -e ""
echo -e "使用方法: $0 [选项]"
echo -e ""
echo -e "选项:"
echo -e " -h, --help 显示此帮助信息"
echo -e " -c, --clean 只执行清理操作"
echo -e " -o, --optimize 只执行系统优化"
echo -e " -d, --docker 只安装Docker"
echo -e " -a, --all 执行所有操作(默认)"
echo -e ""
echo -e "功能:"
echo -e " ✅ 系统检测"
echo -e " ✅ 深度清理(节省空间)"
echo -e " ✅ 依赖包安装"
echo -e " ✅ 系统优化配置"
echo -e " ✅ DNS优化"
echo -e " ✅ Docker环境准备"
echo -e " ✅ Docker安装与配置"
echo -e ""
echo -e "示例:"
echo -e " $0 # 执行所有操作"
echo -e " $0 --clean # 只执行清理"
echo -e " $0 --docker # 只安装Docker"
}
# 主函数
main() {
# 创建日志文件
> "$LOG_FILE"
# 显示标题
echo -e "${PURPLE}"
echo "=================================================="
echo " 🚀 系统优化与Docker准备脚本 (精简版)"
echo " 专为小存储空间VPS设计"
echo "=================================================="
echo -e "${NC}"
# 检查root权限
if [ "$EUID" -ne 0 ]; then
echo -e "${RED}❌ 请使用root权限运行此脚本${NC}"
echo -e "使用: sudo $0"
exit 1
fi
# 解析命令行参数
case "${1:-}" in
-h|--help)
show_usage
exit 0
;;
-c|--clean)
echo -e "${BLUE}执行清理操作...${NC}"
detect_os
clean_system
exit 0
;;
-o|--optimize)
echo -e "${BLUE}执行系统优化...${NC}"
detect_os
configure_system_optimization
configure_dns
exit 0
;;
-d|--docker)
echo -e "${BLUE}安装Docker...${NC}"
detect_os
configure_docker_environment
install_docker
install_docker_compose
verify_installation
exit 0
;;
-a|--all|*)
# 执行所有操作
;;
esac
# 执行完整流程
echo -e "${BLUE}开始系统优化与Docker准备...${NC}"
detect_os
check_architecture
clean_system
update_package_manager
install_basic_dependencies
configure_system_optimization
configure_dns
configure_docker_environment
install_docker
install_docker_compose
echo -e "${GREEN}🎉 所有操作完成!${NC}"
echo ""
verify_installation
echo ""
echo -e "${YELLOW}💡 重要提示:${NC}"
echo -e " 1. 建议重启系统以使所有配置生效"
echo -e " 2. 当前用户已添加到docker组重新登录后生效"
echo -e " 3. 详细日志请查看: $LOG_FILE"
echo -e " 4. 脚本已尽可能节省磁盘空间"
}
# 设置陷阱,确保脚本退出时重置颜色
trap 'echo -e "${NC}"' EXIT
# 运行主函数
main "$@"