每次重装Ubuntu系统后,最让人头疼的就是各种开发环境、常用软件和个性化配置的重新部署。作为一名长期使用Ubuntu的开发者,我经历过太多次重复劳动:安装基础工具链、配置开发环境、恢复工作区设置......这些操作既耗时又容易遗漏关键步骤。于是,我决定将这套标准化流程编写成自动化脚本,实现"刷机后一键恢复工作环境"的目标。
这个系统安装脚本的核心价值在于:
选择Bash作为实现语言主要基于以下考虑:
脚本采用功能模块化的架构设计:
bash复制#!/bin/bash
# 主脚本结构示例
source ./00_env_check.sh # 系统环境检测
source ./10_base_install.sh # 基础软件安装
source ./20_dev_setup.sh # 开发环境配置
source ./30_custom.sh # 个性化定制
source ./99_cleanup.sh # 清理收尾
每个模块保持独立功能:
处理软件包安装时的典型问题方案:
bash复制# 带错误处理和重试机制的安装函数
install_pkg() {
local pkg=$1
local max_retry=3
local retry_count=0
while [ $retry_count -lt $max_retry ]; do
if sudo apt-get install -y $pkg; then
echo "[OK] $pkg installed"
return 0
else
retry_count=$((retry_count+1))
echo "[Retry $retry_count] Failed to install $pkg"
sleep 5
fi
done
echo "[ERROR] Failed to install $pkg after $max_retry attempts"
return 1
}
# 使用示例
install_pkg "build-essential"
install_pkg "git"
关键改进点:
以Python环境为例的典型配置流程:
bash复制# Python多版本管理配置
setup_python() {
# 安装pyenv依赖
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
# 安装pyenv
curl https://pyenv.run | bash
# 环境变量配置
cat << 'EOF' >> ~/.bashrc
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
EOF
# 安装常用Python版本
pyenv install 3.10.6
pyenv install 3.8.12
pyenv global 3.10.6
# 安装基础工具
pip install --upgrade pip
pip install pipenv poetry black flake8 isort
}
实现配置文件的智能恢复:
bash复制restore_dotfiles() {
local backup_dir="/mnt/backup/dotfiles"
# 仅当备份存在时恢复
if [ -d "$backup_dir" ]; then
rsync -av "$backup_dir/" ~/
# 特殊处理SSH配置
if [ -d "$backup_dir/.ssh" ]; then
chmod 700 ~/.ssh
chmod 600 ~/.ssh/*
fi
else
echo "[INFO] No dotfiles backup found at $backup_dir"
fi
}
关键安全实践:
bash复制# 避免全程使用root权限
run_as_user() {
local cmd=$1
sudo -u $SUDO_USER bash -c "$cmd"
}
# 示例:安装用户级应用
run_as_user "curl -fsSL https://starship.rs/install.sh | bash -s -- --yes"
安全处理凭据等敏感数据:
bash复制# 使用环境变量文件(不纳入版本控制)
load_secrets() {
if [ -f "/etc/env/secrets" ]; then
set -o allexport
source "/etc/env/secrets"
set +o allexport
fi
}
# 调用示例(在需要认证的步骤前)
setup_github() {
load_secrets
gh auth login --with-token <<< "$GITHUB_TOKEN"
}
常用性能调优参数:
bash复制tune_system() {
# 增加文件描述符限制
echo "* soft nofile 65535" | sudo tee -a /etc/security/limits.conf
echo "* hard nofile 65535" | sudo tee -a /etc/security/limits.conf
# 调整swappiness
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
# 禁用IPv6(按需)
if [ "$DISABLE_IPV6" = "true" ]; then
echo "net.ipv6.conf.all.disable_ipv6 = 1" | sudo tee -a /etc/sysctl.conf
fi
sudo sysctl -p
}
处理NVIDIA显卡的典型流程:
bash复制setup_nvidia() {
# 检测NVIDIA硬件
if lspci | grep -i nvidia; then
echo "[INFO] NVIDIA GPU detected"
# 添加官方PPA
sudo add-apt-repository -y ppa:graphics-drivers/ppa
sudo apt-get update
# 自动安装推荐驱动
sudo ubuntu-drivers autoinstall
# 验证安装
if nvidia-smi; then
echo "[SUCCESS] NVIDIA drivers installed"
else
echo "[WARNING] NVIDIA drivers may not work properly"
fi
fi
}
推荐的项目结构:
code复制ubuntu-setup/
├── scripts/ # 各功能模块脚本
├── configs/ # 配置文件模板
├── backups/ # 备份文件存储
├── install.sh # 主入口脚本
└── README.md # 使用文档
初始化步骤:
bash复制# 克隆仓库
git clone https://github.com/yourname/ubuntu-setup.git
cd ubuntu-setup
# 授予执行权限
chmod +x install.sh
# 运行安装(建议使用screen/tmux)
./install.sh
通过环境变量覆盖默认配置:
bash复制# 示例:自定义安装路径
export MY_INSTALL_PREFIX="$HOME/.local"
./install.sh
# 示例:跳过某些模块
export SKIP_GPU=true
export SKIP_DOCKER=true
./install.sh
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| apt-get update失败 | 软件源配置错误 | sudo rm /var/lib/apt/lists/* 后重试 |
| 脚本中途退出 | 依赖未满足 | 查看日志中的缺失依赖并手动安装 |
| 权限被拒绝 | 未使用sudo | 使用sudo -E保留环境变量执行 |
| 网络连接超时 | 代理设置问题 | 检查http_proxy环境变量配置 |
增强脚本可调试性:
bash复制# 在脚本开头添加
set -euo pipefail # 严格错误检测
exec > >(tee setup.log) 2>&1 # 输出重定向到日志文件
# 关键步骤添加检查点
checkpoint() {
echo "[DEBUG] $1"
read -p "Press enter to continue or Ctrl+C to abort"
}
# 使用示例
checkpoint "Before installing Python"
setup_python
推荐使用Conventional Commits规范:
code复制feat: 添加对Kubernetes的支持
fix: 修复Python虚拟环境路径问题
chore: 更新README安装说明
docs: 添加GPU驱动安装注意事项
版本检测与适配逻辑:
bash复制# 获取Ubuntu版本
ubuntu_ver=$(lsb_release -rs)
case $ubuntu_ver in
22.04)
install_pkg "python3.10"
;;
20.04)
install_pkg "python3.8"
;;
18.04)
install_pkg "python3.6"
;;
*)
echo "Unsupported Ubuntu version: $ubuntu_ver"
exit 1
;;
esac
利用GNU parallel实现并行安装:
bash复制# 生成并行任务列表
generate_taskfile() {
for pkg in "$@"; do
echo "sudo apt-get install -y $pkg"
done > taskfile.txt
}
# 并行执行(4个并发)
parallel -j 4 < taskfile.txt
创建本地软件包缓存:
bash复制setup_local_cache() {
local cache_dir="/var/cache/apt-cacher"
sudo mkdir -p $cache_dir
echo "Dir::Cache::archives \"$cache_dir\";" | sudo tee /etc/apt/apt.conf.d/02cache
}
结合Ansible进行集群部署:
yaml复制# ansible playbook示例
- hosts: dev_servers
tasks:
- name: Copy setup scripts
copy: src=ubuntu-setup/ dest=/tmp/setup/
- name: Execute setup
command: /bin/bash /tmp/setup/install.sh
async: 3600
poll: 0
Dockerfile集成示例:
dockerfile复制FROM ubuntu:22.04
COPY ubuntu-setup /tmp/setup
RUN cd /tmp/setup && ./install.sh
这个脚本系统经过两年多的迭代,已经在我团队的20+开发机上稳定运行。最让我自豪的是,新同事入职时只需运行一个命令,就能获得与老员工完全一致的开发环境。如果你也在寻找Ubuntu系统快速恢复方案,不妨基于这个框架定制属于你的安装脚本。