517 lines
16 KiB
Bash
517 lines
16 KiB
Bash
#!/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 "$@"
|