2019 年写过一篇我的 Linux 开发环境,当时还在推荐 Linux Mint + Cinnamon 桌面。七年过去,我的开发方式已经完全变了 — 不再使用桌面环境,所有开发工作都在 KVM 虚拟机里通过 SSH + tmux 完成。
操作系统
现在用的是 Debian 12 (bookworm),跑在 KVM 虚拟机里。没有桌面环境,纯命令行。
为什么不折腾桌面了?因为没必要。开发工作全部在终端里完成,日常的 IM(微信、钉钉)、文档编辑、浏览器这些事情在 Windows PC 和 MacBook 上做,Linux 虚拟机只负责跑代码和服务。Debian 稳定、包版本够用、安全更新及时,做开发环境很合适。
宿主机是一台 Intel i7-13620H 的 mini 主机,给虚拟机分配了 8 核 18GB 内存,跑起来绰绰有余。
Shell
用的是 zsh + oh-my-zsh,主题 candy。插件装了三个:
zsh-autosuggestions— 历史命令自动补全zsh-syntax-highlighting— 命令语法高亮zsh-completions— 额外的补全规则
2019 年我推荐过用 antigen 来管理 zsh 插件,现在觉得 oh-my-zsh 够用了,没必要多一层抽象。
SSH key 用 keychain 管理,登录时自动加载 id_ed25519,不用每次输密码。
终端复用
tmux 是整个开发环境的核心。日常开一个 tmux session,里面分几个 window:
- editor — Neovim
- server — 跑项目服务
- shell — 杂活
- docker — 看容器状态
tmux 配置了鼠标支持、256 色、窗口编号从 1 开始、历史记录 10000 行。还配了一个 systemd user service 做 tmux watchdog,tmux 进程挂了能自动恢复。
编辑器
Neovim 0.11,用的是 LazyVim 发行版。之前用过纯手配的 init.vim,后来切到 LazyVim — 开箱即用的 LSP、补全、文件树、git 集成,省了很多配置时间。
系统里也装了 vim,偶尔在没有 nvim 的机器上救急用。
编程语言和运行时
同时在用好几门语言,每门都有对应的版本管理工具:
| 语言 | 版本 | 版本管理 |
|---|---|---|
| Python | 3.11 | 系统自带 + uv 管理项目依赖 |
| Node.js | 22 | nvm |
| Go | 1.24 | 系统安装 |
| Rust | 1.94 | rustup(stable + nightly) |
uv 是最近 Python 生态里最大的改善,比 pip 快一个数量级,项目隔离也做得好。nvm 管 Node 版本,按项目切。Go 和 Rust 都是直接装最新稳定版。
工具链
日常开发用到的工具:
- Docker 28.4 + Docker Compose v2 — 数据库和中间件全跑在容器里,Redis、PostgreSQL、RabbitMQ 都有
- protoc + grpcurl — gRPC 开发调试
- OpenCode / MiMoCode / Kimi Code — AI 辅助编程
- autossh — 维护到远程服务器的 SSH 隧道
- keychain — SSH key 管理
Git
全局配置了一些常用 alias:
| |
没有用 GUI 客户端,全部命令行操作。diff 用 git difftool 配 vimdiff。
远程访问
通过 autossh 维护到远程服务器的持久 SSH 隧道,systemd user service 保活。SSH config 里配了多台服务器的跳板和端口转发。
systemd user services
除了 tmux watchdog,还跑着 user service:
review-server— PR review webhook 服务
用 systemd user service 而不是 cron 或 screen 来跑常驻进程,好处是日志统一管理(journald),开机自启,进程挂了能自动重启。
总结
2026 年的开发环境和 2019 年相比,最大的变化就是 去掉了桌面环境。工具链越来越成熟,终端里的体验已经足够好。不需要在桌面和终端之间切来切去,所有东西都在 tmux 里一个窗口搞定。
如果你也在犹豫要不要脱离桌面环境,我的建议是:先把日常工具全换成命令行版本,等你觉得切桌面只是为了开浏览器的时候,就可以考虑去掉它了。
旧版文章见:我的 Linux 开发环境(2019)。那篇还推荐桌面环境和 LibreOffice,现在回头看恍如隔世。