面向 AI 的 Linux:在远程 GPU 服务器上不求人的生存指南 本节摘要:大多数 AI 跑在 Linux 上,你得懂到「不被卡住」的程度。你在 macOS 或 Windows 上开发,可一旦 SSH 进云端 GPU 机器、租了 Lambda 实例、起了 EC2,你落地的就是 Ubuntu——终端是你唯一的界面,没有 Finder、没有资源管理器、没有 GUI。如果你不会从命令行导航文件系统、装系统包、管进程,你就会一边付着闲置 GPU 的钱一边搜「Linux 怎么解压文件」。
本节摘要:大多数 AI 跑在 Linux 上,你得懂到「不被卡住」的程度。你在 macOS 或 Windows 上开发,可一旦 SSH 进云端 GPU 机器、租了 Lambda 实例、起了 EC2,你落地的就是 Ubuntu——终端是你唯一的界面,没有 Finder、没有资源管理器、没有 GUI。如果你不会从命令行导航文件系统、装系统包、管进程,你就会一边付着闲置 GPU 的钱一边搜「Linux 怎么解压文件」。这是一份生存指南,只覆盖你在远程 Linux 机器上做 AI 工作真正需要的那些:文件系统布局、15 条覆盖 95% 场景的核心命令、用
chmod/chown解决 Permission denied、用apt装系统包并把一台全新 GPU 机器初始化好、磁盘空间管理,以及从 macOS 迁过来最容易踩的那些坑。
对应原课程:Phase 00 · Lesson 11 ·
linux-for-ai(原英文phases/00-setup-and-tooling/11-linux-for-ai/docs/en.md)。前置:第 01 节「开发环境」、第 10 节「终端与 Shell」。
阅读完本节,你应当能够:
chmod、chown 管理文件权限,解决「Permission denied」错误。apt 装系统包,把一台全新 GPU 机器初始化好。你在 macOS 或 Windows 上开发。可一旦 SSH 进云端 GPU 机器、租 Lambda 实例、起 EC2,你落地的就是 Ubuntu。终端是你唯一的界面——没有 Finder、没有资源管理器、没有 GUI。如果你不会从命令行导航文件系统、装包、管进程,你就会一边付闲置 GPU 的钱,一边搜「Linux 怎么解压文件」。
这是一份生存指南——只覆盖你在远程 Linux 机器上做 AI 工作真正需要的东西,不多不少。
Linux 把所有东西组织在单一根 / 下,没有 C:\ 也没有 /Volumes。你实际会碰到的目录:
你的家目录是 ~ 或 /home/你的用户名。你做的事几乎都在这里发生。
💡 心智模型:Linux 的
/是「一棵树」,所有目录都挂在这棵树上。对比 Windows 的多盘符(C/D/E),Linux 是单根树,外接盘挂到/mnt或/media。记住这一点,文件路径就不会迷路。
移动:
pwd # 我在哪? ls # 这有什么? ls -la # 这有什么,含隐藏文件与详情? cd /path/to/dir # 去那 cd ~ # 回家 cd .. # 上一层
文件与目录:
mkdir my-project # 建目录 mkdir -p a/b/c # 一次建嵌套目录 cp file.txt backup.txt # 拷文件 cp -r src/ src-backup/ # 拷目录(递归) mv old.txt new.txt # 改名 mv file.txt /tmp/ # 移动 rm file.txt # 删文件(无回收站,没了就没了) rm -rf my-dir/ # 删目录及里面所有东西
⚠️ 设计警示:
rm -rf是永久删除,无撤销。回车前再三确认路径。rm -rf /或rm -rf ~这类误操作能让整台机器瞬间归零——这是远程服务器上最高频的灾难。
读文件:
cat file.txt # 打印整个文件 head -20 file.txt # 前 20 行 tail -20 file.txt # 后 20 行 tail -f log.txt # 实时跟踪日志(Ctrl+C 停) less file.txt # 翻页浏览(q 退出)
搜索:
grep "error" training.log # 找含 "error" 的行 grep -r "learning_rate" . # 搜当前目录所有文件 grep -i "cuda" config.yaml # 不区分大小写 find . -name "*.py" # 找当前目录下所有 Python 文件 find . -name "*.ckpt" -size +1G # 找大于 1GB 的 checkpoint
Linux 上每个文件都有属主与权限位。脚本不能执行、目录写不进时,你都会撞上它:
ls -l train.py # -rwxr-xr-- 1 user group 2048 Mar 19 10:00 train.py # ^^^ 属主权限: 读、写、执行 # ^^^ 组权限: 读、执行 # ^^^ 其他人: 只读
常见修复:
chmod +x train.sh # 让脚本能执行 chmod 755 deploy.sh # 属主全权,其他人读+执行 chmod 644 config.yaml # 属主读+写,其他人只读 chown user:group file.txt # 改属主(需要 sudo)
凡是报「Permission denied」,几乎都是权限问题。chmod +x 或 sudo 能修大多数。
Ubuntu 用 apt 装系统级软件:
sudo apt update # 刷新包列表(永远先做这步) sudo apt install -y htop # 装包(-y 跳过确认) sudo apt install -y build-essential # C 编译器、make 等,很多 Python 包需要 sudo apt install -y tmux # 终端复用器 apt list --installed # 装了啥 sudo apt remove htop # 卸载
一台全新 GPU 机器的初始化命令:
sudo apt update && sudo apt install -y \ build-essential \ git \ curl \ wget \ tmux \ htop \ unzip \ python3-venv
你通常以普通用户登录。有些操作需要 root(管理员)权限:
whoami # 我是谁? sudo command # 以 root 跑一条命令 sudo su # 变身 root(exit 退出,慎用)
云端 GPU 实例上,你通常是唯一用户且已有 sudo 权限。别所有事都用 root 跑,需要时才用 sudo——这是 Unix 安全的基本功。
训练卡住或要查谁在跑时:
htop # 交互式进程查看器(q 退出) ps aux | grep python # 找运行中的 Python 进程 kill 12345 # 优雅停掉 PID 12345 的进程 kill -9 12345 # 强杀(优雅停不掉时用) nvidia-smi # GPU 进程与显存
systemd 管服务(后台守护进程),跑推理服务器时会用到:
sudo systemctl start nginx # 启动服务 sudo systemctl stop nginx # 停止 sudo systemctl restart nginx # 重启 sudo systemctl status nginx # 看运行状态 sudo systemctl enable nginx # 开机自启
GPU 机器磁盘往往有限,模型与数据集很快塞满:
df -h # 所有挂载盘的用量 df -h /home # /home 的用量 du -sh * # 当前目录每项的大小 du -sh ~/.cache # 缓存大小(pip、HuggingFace 模型在这) du -sh /data/checkpoints/ # 你的 checkpoint 多大 # 找最大的空间占用 du -h --max-depth=1 / 2>/dev/null | sort -hr | head -20
常见省空间手段:
pip cache purge # 清 pip 缓存 sudo apt clean # 清 apt 缓存 rm -rf checkpoints/epoch_01/ checkpoints/epoch_02/ # 删旧 checkpoint
你会从命令行下模型、传文件、调 API:
wget https://example.com/model.bin # 下文件 curl -O https://example.com/data.tar.gz # curl 同样下文件 curl -s https://api.example.com/health | python3 -m json.tool # 调 API,美化 JSON # 机器间传文件 scp model.bin user@remote:/data/ # 拷到远程 scp user@remote:/data/results.csv . # 从远程拷回 scp -r user@remote:/data/checkpoints/ ./local-dir/ # 拷目录 # 同步目录(大传输比 scp 快,断点续传) rsync -avz --progress ./data/ user@remote:/data/
💡 大传输用
rsync不用scp:rsync只传变化的字节,且断网能续传;scp每次全量重传。下几 GB 模型时差异巨大。
SSH 进远程机器后,合上笔记本就杀了你的训练。tmux 防止这件事(详见第 10 节):
tmux new -s train # 起 "train" 会话 # 起训练,然后: # Ctrl+B 再按 D # 断开(训练继续跑) tmux ls # 列会话 tmux attach -t train # 重新接上
长训练任务,永远在 tmux 里跑。永远。
Windows 用户用 WSL2 能得到真正的 Linux 环境,无需双系统:
# PowerShell(管理员) wsl --install -d Ubuntu-24.04 # 重启后从开始菜单开 Ubuntu sudo apt update && sudo apt upgrade -y
WSL2 跑真正的 Linux 内核,本节所有内容在其中都有效。Windows 文件在 WSL 里位于 /mnt/c/Users/你的名字/。GPU 透传靠 Windows 侧装的 NVIDIA 驱动(装 Windows 版,不装 Linux 版),CUDA 就能在 WSL2 里用。
从 macOS 过来会被这些细节绊住:
| macOS | Linux | 说明 |
|---|---|---|
brew install |
sudo apt install |
包名偶尔不同,如 readline 在 macOS 是 readline,Linux 是 libreadline-dev |
open file.txt |
xdg-open file.txt |
远程机器没 GUI,用 cat 或 less |
pbcopy/pbpaste |
无 | SSH 下没有剪贴板管道 |
~/.zshrc |
~/.bashrc |
macOS 默认 zsh,多数 Linux 服务器用 bash |
/opt/homebrew/ |
/usr/bin/、/usr/local/bin/ |
二进制位置不同 |
sed -i '' 's/a/b/' file |
sed -i 's/a/b/' file |
macOS 的 sed 在 -i 后要空串,Linux 不要 |
| 不区分大小写文件系统 | 区分大小写 | Model.py 与 model.py 在 Linux 上是两个文件 |
行尾 \n |
行尾 \n |
相同;但 Windows 用 \r\n 会破坏 bash 脚本,跑 dos2unix 修复 |
⚠️ 设计警示:大小写敏感是最坑 macOS 用户的点。本地能跑、push 到 Linux 服务器就
ModuleNotFoundError,九成是文件名大小写不一致——本地不区分所以「能跑」,Linux 区分就找不到。养成严格区分大小写的习惯。
本节产出一组速查(原课程无独立产物文件,内容已在本节):
touch 在里面建三个空文件,用 ls -la 列出。htop,运行它,找出最占内存的进程;再起一个 tmux 会话,在里面跑 sleep 300,断开、列会话、重新接上;最后用 df -h 看磁盘,du -sh ~/.cache/* 看缓存占了多少。scp 把一个本地文件传到远程,再用 rsync -avz --progress 传同一文件,对比体验;然后写一个一键初始化新 GPU 机器的 shell 脚本(装 build-essential/git/tmux/htop/python3-venv,配好 SSH 密钥,装 uv 与 PyTorch),让新机器开机就能跑训练。/ 下,家目录是 ~,外接盘挂 /mnt 或 /media。rm -rf 永久无撤销:回车前再三确认路径,远程服务器最高频灾难。chmod(改权限)、chown(改属主)、sudo(临时 root);Permission denied 几乎都是权限问题。apt 装系统包:sudo apt update 永远先做;新 GPU 机器有一套标准初始化命令。rsync:只传变化字节、断点续传,远胜 scp。下一节,我们将进入「调试与性能分析」——为本章收尾,把训练出错时的排查与代码提速的工程方法补齐。