本文由 AI 根据我在服务器上的实际操作记录和三份自动化脚本整理生成,主要用于之后再次部署时参考。
请务必在使用前自行检查命令、版本号和配置是否符合当前环境,避免因系统更新或个人环境差异导致问题。

一、整体目标与脚本概览

在一台 Ubuntu 24.04.3 LTS 服务器上,我为自己常用的几个场景写了三份自动化脚本,用来快速完成以下工作:

  • GPU 环境:
    • 禁用 nouveau
    • 安装并锁定 Nvidia 驱动
    • 安装 CUDA / nvidia-cuda-toolkit
    • 安装并配置 nvidia-container-toolkit,让 Docker 能使用 GPU
  • AI 服务:
    • 使用 Docker 运行 GPU 版 Ollama,可选自动拉取 Qwen3 系列模型
  • 博客环境:
    • 安装 nvm 和 Node LTS
    • 安装 Hexo
    • 初始化和部署 Hexo 博客

对应的三个脚本分别是:

  1. install_nvidia_cuda_container.sh
    禁用 nouveau、锁定当前内核、自动安装推荐的 Nvidia 驱动、安装 CUDA 工具链和 nvidia-container-toolkit,并完成基础测试。

  2. run_ollama.sh
    使用 Docker 运行 GPU 版 Ollama 容器,并提供交互式选项,一键拉取常用的 Qwen3 系列模型。

  3. setup_hexo_blog.sh
    安装 nvm + Node LTS + hexo-cli,创建或重建 Hexo 博客目录,安装依赖并配置 Git 部署。

下面分别介绍这三个脚本的设计思路、关键步骤和使用方式。


二、GPU 环境脚本:install_nvidia_cuda_container.sh

2.1 设计目标

这份脚本的目标是将「从零准备 GPU 环境」的一整套操作自动化,主要包括:

  • 禁用开源驱动 nouveau,避免与官方 Nvidia 驱动冲突;
  • 不再强制安装新内核,而是:
    • 识别当前正在使用的内核版本;
    • 尝试锁定与该版本相关的内核包,降低未来升级导致驱动失配的概率;
  • 使用 ubuntu-drivers 自动检测并安装「推荐」的 Nvidia 驱动,而不是写死某个版本(比如 nvidia-driver-535);
  • 安装 nvidia-cuda-toolkit,提供基础 CUDA 工具链(含 nvcc);
  • 安装并配置 nvidia-container-toolkit,让 Docker 容器可以访问 GPU;
  • 最后进行三项测试:
    • 宿主机上的 nvidia-smi
    • 宿主机上的 nvcc --version
    • Docker 容器内的 nvidia-smi

这些步骤对应了我在手动操作时的主要流程,但用更通用、更安全的方式实现(比如用 ubuntu-drivers devices 自动选驱动)。


2.2 关键步骤拆解

脚本的主要逻辑如下。

  1. 禁用 nouveau 并更新 initramfs
  • 创建或覆盖 /etc/modprobe.d/blacklist-nouveau.conf

  • 写入:

    1
    2
    blacklist nouveau
    options nouveau modeset=0
  • 执行 sudo update-initramfs -u,让配置在下次启动时生效。

这样可以避免系统加载开源的 nouveau 模块,给后续官方驱动提供干净的环境。

  1. 安装基础编译工具
  • 执行 sudo apt-get update
  • 安装 build-essential(包含 gcc / g++ 等),为部分驱动或编译场景做准备。
  1. 确认并锁定当前内核版本(不安装新内核)
  • 使用 uname -r 读取当前正在运行的内核版本,例如 6.8.0-87-generic
  • 对以下可能存在的包进行检测并加 hold(如果存在就 apt-mark hold):
    • linux-image-<当前内核版本>
    • linux-headers-<当前内核版本>
    • linux-modules-extra-<当前内核版本>

这样做的目的是:尽量保持「当前内核 + 当前驱动」这一组合的稳定,不追求自动升级;未来如果需要升级内核,再手动解除 hold 并重新规划。

  1. 自动检测并安装推荐的 Nvidia 驱动
  • 如果系统已有 ubuntu-drivers
    • 执行 ubuntu-drivers devices,打印可用驱动;
    • awk 从输出中解析带 recommended 标记的驱动包名(例如 nvidia-driver-535);
    • 如果解析成功,则自动执行 sudo apt-get install -y <推荐驱动包>
  • 如果系统没有安装 ubuntu-drivers
    • 先安装 ubuntu-drivers-common
    • 再重复上述检测逻辑。
  • 如果始终解析不到推荐驱动:
    • 脚本只会给出提示,让你之后手动执行 ubuntu-drivers devices 并根据输出自行选择驱动安装。

通过这种方式,脚本不写死驱动版本,而是配合 Ubuntu 官方的推荐策略,使脚本更适合未来系统的升级。

  1. 安装 CUDA 工具链(nvidia-cuda-toolkit)
  • 直接通过 apt 安装:

    1
    sudo apt-get install -y nvidia-cuda-toolkit
  • 然后尝试对常见的 CUDA 工具包名执行 apt-mark hold

    • cuda-toolkit-12-0
    • cuda-toolkit-12.0

即便当前系统中不一定存在这些包名,脚本也会使用 || true 避免因此中断。

  1. 安装并配置 NVIDIA Container Toolkit
  • 安装 curlgnupg2
  • 从 NVIDIA 官方源下载并导入 GPG key,写入 /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
  • 添加 libnvidia-container 的 apt 软件源,并绑定刚才的 keyring;
  • 执行 sudo apt-get install -y nvidia-container-toolkit
  • 使用 sudo nvidia-ctk runtime configure --runtime=docker 配置 Docker Runtime;
  • 重启 Docker 服务。

完成这一步后,Docker 就具备了 --gpus all 访问 GPU 的能力。

  1. 测试与验证
  • 宿主机上测试 nvidia-smi,确认驱动加载正常;
  • 宿主机上测试 nvcc --version,确认 CUDA 编译器安装成功;
  • 如果系统已安装 Docker:
    • nvidia/cuda:12.6.0-base-ubuntu24.04 镜像在容器内运行 nvidia-smi,检查容器内能否看到 GPU。

脚本最后会提示「建议重启系统」。


2.3 脚本完整内容与使用方式

脚本内容(可以保存为 install_nvidia_cuda_container.sh):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!/usr/bin/env bash
set -e

echo "===> 1. 禁用 nouveau 驱动"

# 创建 / 修正 blacklist 配置文件
sudo mkdir -p /etc/modprobe.d

if [ -f /etc/modprobe.d/blacklist-nouveau.conf ]; then
echo "已存在 /etc/modprobe.d/blacklist-nouveau.conf,覆盖更新配置..."
else
echo "创建 /etc/modprobe.d/blacklist-nouveau.conf ..."
sudo touch /etc/modprobe.d/blacklist-nouveau.conf
fi

sudo bash -c 'cat >/etc/modprobe.d/blacklist-nouveau.conf <<EOF
blacklist nouveau
options nouveau modeset=0
EOF'

echo "更新 initramfs..."
sudo update-initramfs -u

echo "===> 2. 更新 apt 源并安装编译工具"
sudo apt-get update
sudo apt-get install -y build-essential

echo "===> 3. 确认并锁定当前内核版本"
CURRENT_KVER="$(uname -r)"
echo "当前正在使用的内核版本为: ${CURRENT_KVER}"

# 尝试锁定当前内核相关包,避免自动升级导致驱动失配
if dpkg -l | grep -q "linux-image-${CURRENT_KVER}"; then
echo "锁定 linux-image-${CURRENT_KVER}"
sudo apt-mark hold "linux-image-${CURRENT_KVER}" || true
fi

if dpkg -l | grep -q "linux-headers-${CURRENT_KVER}"; then
echo "锁定 linux-headers-${CURRENT_KVER}"
sudo apt-mark hold "linux-headers-${CURRENT_KVER}" || true
fi

if dpkg -l | grep -q "linux-modules-extra-${CURRENT_KVER}"; then
echo "锁定 linux-modules-extra-${CURRENT_KVER}"
sudo apt-mark hold "linux-modules-extra-${CURRENT_KVER}" || true
fi

echo "当前内核信息:"
uname -a || true

echo "===> 4. 查询并安装推荐的 Nvidia 驱动"

sudo apt-get update

# 尝试列出可用驱动
if command -v ubuntu-drivers >/dev/null 2>&1; then
echo "检测可用的 Nvidia 驱动 (ubuntu-drivers devices)..."
ubuntu-drivers devices || true

# 自动解析带 recommended 标记的驱动包名
RECOMMENDED_DRIVER="$(ubuntu-drivers devices 2>/dev/null | awk '/recommended/ {print $3; exit}')"

if [ -n "$RECOMMENDED_DRIVER" ]; then
echo "检测到推荐的 Nvidia 驱动为: ${RECOMMENDED_DRIVER}"
echo "开始安装 ${RECOMMENDED_DRIVER} ..."
sudo apt-get install -y "$RECOMMENDED_DRIVER"
else
echo "未能从 ubuntu-drivers devices 输出中解析到 recommended 驱动。"
echo "你可以稍后手动运行 'ubuntu-drivers devices' 查看并选择合适的驱动安装。"
fi
else
echo "未找到 ubuntu-drivers 命令(可能未安装 ubuntu-drivers-common 包),尝试安装..."
sudo apt-get install -y ubuntu-drivers-common || true

if command -v ubuntu-drivers >/dev/null 2>&1; then
echo "再次检测可用的 Nvidia 驱动..."
ubuntu-drivers devices || true
RECOMMENDED_DRIVER="$(ubuntu-drivers devices 2>/dev/null | awk '/recommended/ {print $3; exit}')"
if [ -n "$RECOMMENDED_DRIVER" ]; then
echo "检测到推荐的 Nvidia 驱动为: ${RECOMMENDED_DRIVER}"
echo "开始安装 ${RECOMMENDED_DRIVER} ..."
sudo apt-get install -y "$RECOMMENDED_DRIVER"
else
echo "仍未解析到 recommended 驱动,请手动选择并安装合适的 Nvidia 驱动。"
fi
else
echo "仍然无法使用 ubuntu-drivers 工具,请手动安装合适的 Nvidia 驱动(例如 sudo apt-get install nvidia-driver-XXX)。"
fi
fi

echo "驱动安装完成后建议重启以加载驱动。"

echo "===> 5. 安装 CUDA 工具链(nvidia-cuda-toolkit)"
sudo apt-get install -y nvidia-cuda-toolkit

echo "尝试固定 CUDA 工具链版本(如果存在对应包名)"
sudo apt-mark hold cuda-toolkit-12-0 || true
sudo apt-mark hold cuda-toolkit-12.0 || true

echo "===> 6. 安装 NVIDIA Container Toolkit (nvidia-container-toolkit)"
# 自动化写 key 和源
sudo apt-get install -y curl gnupg2

echo "添加 NVIDIA Container Toolkit GPG key..."
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

echo "添加 NVIDIA Container Toolkit apt 源..."
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list > /dev/null

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

echo "配置 Docker 使用 nvidia-container-toolkit 作为 runtime..."
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

echo "===> 7. 测试 nvidia-smi(宿主机)"
if command -v nvidia-smi >/dev/null 2>&1; then
nvidia-smi || echo "nvidia-smi 执行失败,请检查驱动是否正确加载(可能需要重启后再试)"
else
echo "未找到 nvidia-smi 命令,请确认 Nvidia 驱动是否安装成功。"
fi

echo "===> 8. 测试 nvcc(CUDA 编译器)"
if command -v nvcc >/dev/null 2>&1; then
nvcc --version || true
else
echo "未找到 nvcc(可能需要重启或检查 nvidia-cuda-toolkit 是否正常安装)"
fi

echo "===> 9. 使用带 GPU 的 Docker 容器测试 nvidia-smi"
if command -v docker >/dev/null 2>&1; then
echo "拉取并运行 nvidia/cuda:12.6.0-base-ubuntu24.04 镜像测试 GPU..."
sudo docker run --rm --gpus all nvidia/cuda:12.6.0-base-ubuntu24.04 nvidia-smi || \
echo "容器内 nvidia-smi 执行失败,请检查 nvidia-container-toolkit / Docker 配置。"
else
echo "未安装 Docker,本脚本只完成 nvidia-container-toolkit 安装,Docker 测试略过。"
fi

echo "全部步骤执行完成。建议重启系统:sudo reboot"

使用方式:

1
2
3
chmod +x install_nvidia_cuda_container.sh
./install_nvidia_cuda_container.sh
sudo reboot

重启后建议手动执行一次:

1
2
nvidia-smi
nvcc --version

确认驱动和 CUDA 工具链工作正常。


三、Ollama 部署脚本:run_ollama.sh

3.1 设计目标

这份脚本用来自动化如下操作:

  • 确认 Docker 已安装;
  • 拉取最新的 GPU 版 Ollama 镜像;
  • 停止并删除已有的 ollama 容器(如果存在),避免命名冲突;
  • 启动一个新的 Ollama 容器:
    • 开启 GPU 支持;
    • 使用 Docker 卷 ollama 挂载到容器内 /root/.ollama,用于持久化模型数据;
    • 映射 11434 端口;
  • 提供交互选项,一键拉取常用的 Qwen3 系列模型(qwen3-vl:8b / qwen3-vl:30b / qwen3-coder:30b)。

这样,在已经配置好 GPU + Docker 环境的前提下,只需运行脚本,就可以快速得到一个可用的 Ollama 服务。


3.2 脚本逻辑说明

核心步骤如下:

  1. 检查 Docker 是否安装
  • 通过 command -v docker 检查 Docker 命令是否存在;
  • 如果不存在,则提示先安装 Docker 并退出脚本(避免后续错误)。
  1. 拉取 Ollama 镜像
  • 执行:

    1
    sudo docker pull ollama/ollama:latest
  • 始终确保使用的是最新版镜像。

  1. 清理已有 ollama 容器(如果存在)
  • 通过 sudo docker ps -a --format '{{.Names}}' | grep -w ollama 检查;
  • 如果找到同名容器,先 docker stop,再 docker rm,错误不导致脚本中断。
  1. 启动新的 Ollama 容器
  • 使用命令:

    1
    2
    3
    4
    5
    6
    sudo docker run -d \
    --gpus=all \
    -v ollama:/root/.ollama \
    -p 11434:11434 \
    --name ollama \
    ollama/ollama:latest
  • 参数说明:

    • --gpus=all:启用 GPU;
    • -v ollama:/root/.ollama:使用名为 ollama 的 Docker 卷保存模型和配置;
    • -p 11434:11434:暴露 Ollama 默认 API 端口;
    • --name ollama:固定容器名。
  1. 可选:拉取 Qwen3 系列模型
  • 提示是否自动拉取模型;
  • 如果用户选择 y
    • 依次执行:
      • ollama pull qwen3-vl:8b
      • ollama pull qwen3-vl:30b
      • ollama pull qwen3-coder:30b
  • 如果选择 n 或直接回车,则仅提示后续可以手动执行这些命令。

3.3 脚本完整内容与使用方式

脚本内容(保存为 run_ollama.sh):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env bash
set -e

echo "===> 1. 检查 docker 是否安装"
if ! command -v docker >/dev/null 2>&1; then
echo "未检测到 docker,请先运行 install_docker.sh 安装 Docker。"
exit 1
fi

echo "===> 2. 拉取 Ollama 镜像(GPU 版)"
sudo docker pull ollama/ollama:latest

echo "===> 3. 停止并删除已有的 ollama 容器(若存在)"
if sudo docker ps -a --format '{{.Names}}' | grep -w ollama >/dev/null 2>&1; then
sudo docker stop ollama || true
sudo docker rm ollama || true
fi

echo "===> 4. 运行 Ollama 容器,挂载数据卷 'ollama' 到 /root/.ollama"
sudo docker run -d \
--gpus=all \
-v ollama:/root/.ollama \
-p 11434:11434 \
--name ollama \
ollama/ollama:latest

echo "Ollama 容器已启动。检查状态:"
sudo docker ps | grep ollama || echo "注意:未看到 ollama 容器,请检查日志。"

echo "===> 5. 可选:自动拉取常用模型(Qwen3 系列)"
read -p "是否自动拉取 qwen3-vl:8b / qwen3-vl:30b / qwen3-coder:30b 模型?(y/N) " yn
case "$yn" in
[Yy]* )
echo "开始拉取模型(时间较长,取决于网络):"
sudo docker exec -it ollama ollama pull qwen3-vl:8b || true
sudo docker exec -it ollama ollama pull qwen3-vl:30b || true
sudo docker exec -it ollama ollama pull qwen3-coder:30b || true
echo "模型拉取流程结束(如拉取失败可查看 docker logs ollama)。"
;;
* )
echo "跳过自动拉取模型。你可以稍后手工执行:"
echo " sudo docker exec -it ollama ollama pull qwen3-vl:8b"
echo " sudo docker exec -it ollama ollama pull qwen3-vl:30b"
echo " sudo docker exec -it ollama ollama pull qwen3-coder:30b"
;;
esac

echo "===> 完成。你可以通过 http://<服务器IP>:11434 访问 Ollama API。"

使用示例:

1
2
chmod +x run_ollama.sh
./run_ollama.sh

完成后可以:

  • 通过 sudo docker logs ollama 查看运行日志;
  • 通过 http://<服务器IP>:11434 调用 Ollama API。

四、Hexo 博客脚本:setup_hexo_blog.sh

4.1 设计目标

这份脚本把「搭建 Hexo 博客」过程中重复的步骤自动化,主要包括:

  • 安装 nvm(如果未安装);
  • 通过 nvm 安装 Node LTS 并设为默认版本;
  • 全局安装 hexo-cli
  • 创建或重建博客目录(默认 $HOME/hexo);
  • 初始化 Hexo(如需要),安装项目依赖;
  • 安装 hexo-deployer-git 插件;
  • 配置 Git 全局用户名和邮箱(若尚未配置);
  • 提示并辅助修改 _config.yml 中的 deploy 配置;
  • 自动执行 hexo cleanhexo generate,并提供选项是否立即执行 hexo deploy

4.2 脚本逻辑说明

  1. 安装并加载 nvm
  • 如果 ~/.nvm 目录存在,认为已经安装过 nvm,跳过安装;
  • 否则,通过官方脚本安装 nvm;
  • 设置 NVM_DIRsource "$NVM_DIR/nvm.sh",确保后续在当前脚本环境中可以直接使用 nvm 命令。
  1. 安装 Node LTS 并设为默认
  • 执行:

    1
    2
    3
    nvm install --lts
    nvm use --lts
    nvm alias default "lts/*"
  • 打印当前 node -vnpm -v 做确认。

  1. 全局安装 hexo-cli
  • 通过 npm 全局安装:

    1
    npm install -g hexo-cli
  1. 创建或重新初始化 Hexo 博客目录
  • 使用变量 BLOG_DIR="$HOME/hexo"
  • 若目录已存在:
    • 询问是否删除并重建;
    • 如果选择删除,则 rm -rf 并重新创建;
    • 如果保留,则不再执行 hexo init,只进入该目录并继续后续步骤。
  • 若目录不存在:
    • 创建目录并执行 hexo init . 初始化项目。
  1. 安装项目依赖和 hexo-deployer-git
  • 在博客目录执行 npm install,安装 package.json 中的依赖;
  • 执行 npm install hexo-deployer-git --save,添加 Git 部署插件。
  1. 配置 Git 全局用户信息(如未设置)
  • 如果 git config --global user.email 未设置,则写入默认值 your_email@example.com
  • 如果 git config --global user.name 未设置,则写入默认值 YourName
  • 后续应手动修改为自己的邮箱和用户名。
  1. 提示编辑 _config.yml 的 deploy 部分
  • 脚本打印一个示例配置:

    1
    2
    3
    4
    deploy:
    type: git
    repo: git@your.git.repo:your/blog.git
    branch: main
  • 询问是否现在打开 _config.yml 进行编辑;

  • 如果选择 y,则用 ${EDITOR:-vim} 打开配置文件;

  • 否则提示稍后手动编辑。

  1. 构建并可选执行 hexo deploy
  • 执行 hexo cleanhexo generate
  • 询问是否现在执行 hexo deploy
    • 如果选择执行,出错时会提示检查 _config.yml 和 Git 权限;
    • 如果跳过,则提示后续可以在博客目录手动执行 hexo clean && hexo generate && hexo deploy
  1. theam

4.3 脚本完整内容与使用方式

脚本内容(保存为 setup_hexo_blog.sh):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/env bash
set -e

BLOG_DIR="$HOME/hexo"

echo "===> 1. 安装 nvm(如果尚未安装)"
if [ -d "$HOME/.nvm" ]; then
echo "检测到 ~/.nvm 已存在,跳过安装。"
else
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
fi

# 加载 nvm(脚本执行期间生效)
export NVM_DIR="$HOME/.nvm"
# shellcheck disable=SC1090
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"

echo "===> 2. 安装 Node LTS 并设为默认"
nvm install --lts
nvm use --lts
nvm alias default "lts/*"

echo "当前 Node 版本:"
node -v
npm -v

echo "===> 3. 全局安装 hexo-cli"
npm install -g hexo-cli

echo "===> 4. 创建或重新初始化 Hexo 博客目录:$BLOG_DIR"
if [ -d "$BLOG_DIR" ]; then
read -p "目录 $BLOG_DIR 已存在,是否删除并重建?(y/N) " yn
case "$yn" in
[Yy]* )
rm -rf "$BLOG_DIR"
;;
* )
echo "保留现有目录,将跳过 hexo init,如需全新初始化请先删除该目录。"
;;
esac
fi

if [ ! -d "$BLOG_DIR" ]; then
mkdir -p "$BLOG_DIR"
cd "$BLOG_DIR"
echo "初始化 Hexo 项目..."
hexo init .
else
cd "$BLOG_DIR"
fi

echo "===> 5. 安装项目依赖"
npm install

echo "===> 6. 安装 hexo-deployer-git(用 Git 部署)"
npm install hexo-deployer-git --save

echo "===> 7. 配置 Git 全局用户名和邮箱(如已有可跳过)"
if ! git config --global user.email >/dev/null 2>&1; then
git config --global user.email "your_email@example.com"
echo "已设置 git user.email 为 your_email@example.com(请按需修改)"
fi

if ! git config --global user.name >/dev/null 2>&1; then
git config --global user.name "YourName"
echo "已设置 git user.name 为 YourName(请按需修改)"
fi

echo "===> 8. 提示修改 _config.yml 中的部署配置"
echo "请编辑 $BLOG_DIR/_config.yml 中的 deploy 部分,例如:"
cat <<'EOF'

deploy:
type: git
repo: git@your.git.repo:your/blog.git
branch: main

EOF

read -p "现在要打开 _config.yml 进行编辑吗?(y/N) " yn
case "$yn" in
[Yy]* )
${EDITOR:-vim} "$BLOG_DIR/_config.yml"
;;
* )
echo "已跳过编辑,请稍后手动修改 _config.yml。"
;;
esac

echo "===> 9. 构建并尝试部署(如果 deploy 配置已正确)"
hexo clean
hexo generate

read -p "是否现在执行 hexo deploy?(y/N) " yn2
case "$yn2" in
[Yy]* )
hexo deploy || echo "hexo deploy 失败,请检查 _config.yml 的 deploy 配置和 Git 仓库访问权限。"
;;
* )
echo "已跳过 deploy,你之后可以在 $BLOG_DIR 目录执行:"
echo " hexo clean && hexo generate && hexo deploy"
;;
esac

echo "===> Hexo 博客环境初始化完成。"
echo "如需本地预览,可在 $BLOG_DIR 中执行:hexo server"

使用方式:

1
2
chmod +x setup_hexo_blog.sh
./setup_hexo_blog.sh

执行过程中注意:

  • 将脚本中的 your_email@example.comYourName 换成自己的 Git 配置;
  • 在编辑 _config.yml 时,把 deploy.repo 换成自己的仓库地址,branch 换成实际使用的分支。

五、推荐使用顺序(只围绕三个脚本)

如果你只关心这三份脚本,那么在一台新服务器上的典型执行顺序可以简化为:

  1. GPU 环境准备

    • 上传并执行 GPU 脚本:

      1
      2
      3
      chmod +x install_nvidia_cuda_container.sh
      ./install_nvidia_cuda_container.sh
      sudo reboot
    • 重启后验证:

      1
      2
      nvidia-smi
      nvcc --version
  2. 安装 Docker(不在本文脚本中)

    • 按 Ubuntu 官方文档或自己写的 install_docker.sh 安装 Docker;

    • 测试 GPU 容器:

      1
      sudo docker run --rm --gpus all nvidia/cuda:12.6.0-base-ubuntu24.04 nvidia-smi
  3. 启动 Ollama 服务

    • 上传并执行 run_ollama.sh

      1
      2
      chmod +x run_ollama.sh
      ./run_ollama.sh
    • 按提示选择是否自动拉取 Qwen3 系列模型;

    • 访问 http://<服务器IP>:11434 测试。

  4. 搭建 Hexo 博客

    • 上传并执行 setup_hexo_blog.sh

      1
      2
      chmod +x setup_hexo_blog.sh
      ./setup_hexo_blog.sh
    • 在脚本提示阶段完成:

      • Git 用户名 / 邮箱的确认;
      • _config.ymldeploy 仓库的设置;
    • 此后即可通过:

      1
      hexo clean && hexo generate && hexo deploy

      更新博客。


六、结语

这三份脚本浓缩的是我在搭建环境时真正「可重复」的步骤,它们分别负责:

  • GPU 驱动 + CUDA + Docker GPU Runtime 的基础环境;
  • Ollama 服务及常用模型的快速拉起;
  • Hexo 博客的 Node 环境、项目初始化与 Git 部署配置。

相比逐条翻查 bash_history,直接维护这几份脚本要省心得多。未来如果发行版、驱动或工具链有变化,可以在这几份脚本上迭代,而不必从头回忆所有命令。

最后再强调一次:
本文由 AI 结合当前脚本内容自动生成说明,细节难免会随着时间过时。在正式执行前,请务必:

  • 先阅读脚本本身;
  • 检查其中的版本号、软件源和命令是否仍然适用于当时的 Ubuntu 版本;
  • 在非关键环境中先做一次测试。