
Linux 环境搭建这几年我大概装过不下二十次 Linux 系统从最早在老旧笔记本上折腾 Ubuntu 桌面版到后来用虚拟机搭各种开发环境再到现在主力电脑上用 WSL、公司服务器上跑 CentOS Stream算是把“装系统”这件事从入门到折腾全都经历了一遍。如果你也在准备把自己的开发环境迁到 Linux 上或者只是想先搭一个能用的 Linux 环境来写 Python、跑 Hadoop、做嵌入式开发那么环境搭建这一关是绕不过去的。这篇文章我把 Linux 环境搭建完整讲一遍包括方案选型、虚拟机安装、开发环境配置、常用命令、常见坑位排查全部是我自己实际操作过的流程和参数可以直接照着抄。先给结论Linux 环境搭建没有“唯一正确”的答案你用什么发行版、装在哪里、配哪些工具完全取决于你要用它干什么。所以我不急着给你贴命令而是先帮你想清楚“你是哪种需求”再往下走。1. 想明白再动手Linux 环境到底要搭在哪里很多人上来就问“装哪个版本好”其实这是顺序错了。先要回答的问题是这套 Linux 环境是放在物理机上、虚拟机上、WSL 里还是干脆用一台云服务器这四种方式的体验差异非常大选错了后面全是折腾。1.1 物理机、虚拟机、WSL 到底选哪个我个人的经验是用一张表就能讲清楚各自的定位方案适合场景性能损耗上手难度典型痛点物理机安装想彻底切换系统、长期深度使用无中等显卡驱动、双系统引导、误删分区虚拟机方案边用 Windows 边体验 Linux约 10%~20%低内存吃紧、共享文件夹要配置WSL 方案Windows 下的命令行开发很低最低图形界面弱、跨文件系统性能一般云服务器远程开发、部署服务无低需要公网环境本地调试依赖网络如果你是刚接触 Linux 的小白我强烈建议先用虚拟机或 WSL不要一上来就格式化硬盘装物理机。原因很简单你随时可能把环境玩坏而虚拟机里出问题快照一恢复就没事了物理机上玩坏了引导那才是噩梦。WSL 适合那种“我只需要一个 Linux 终端跑命令”的场景装 Python、Node.js、Docker 都很快而且和 Windows 文件互通。我目前的主力开发机就是 WSL2 Windows Terminal日常写脚本、跑服务、甚至编译一些 C 项目都够了。需要图形界面做仿真比如 Gazebo时我才会切到虚拟机或者物理机。1.2 发行版别乱选按使用场景来选发行版这件事被神化太久了。很多人一上来就推荐 Ubuntu确实没错但原因不是它“最好”而是它生态最全、遇到问题时搜索引擎能给出最多答案。我自己在不同场景下的选择是这样的日常开发、学习选 Ubuntu LTS 版本比如 22.04、24.04五年支持周期apt 装软件最省心。服务器环境选 Debian 或者 CentOS Stream。Debian 更稳定CentOS 生态适合以后接触企业环境。老机器跑桌面选 Linux Mint 或 Xfce 桌面的发行版资源占用低。国内团队维护的发行版Deepin 或统信 UOS 这类开箱即用的中文环境和办公软件适配做得更好适合给非技术用户用。嵌入式、机器人开发Ubuntu 的多因为 ROS、PX4 等工具链默认支持 Ubuntu。不要一上来就装 Arch 或者从源码编译一切的系统。那玩意适合折腾不适合搭建环境干活。我见过太多新手被 Arch 的滚动更新搞得心态爆炸。先老老实实用稳定版本等你真的清楚 Linux 的包管理机制、依赖关系、内核模块是怎么回事了再考虑进阶发行版。2. 虚拟机安装 Linux 全流程实操如果你决定走虚拟机路线这一节我直接给你一份可以照抄的配置清单和步骤。我用的是 VMware Workstation 和 VirtualBox 都装过下面这套参数是我实测下来稳定、流畅、不折腾的组合。2.1 虚拟机软件与核心参数怎么设虚拟机软件选 VMware Workstation Player免费版或 VirtualBox开源免费都可以。就个人体验而言VMware 对 Linux 的显卡和 USB 设备兼容性略好一点VirtualBox 则更轻、开源。两者都支持后面要讲的“快照”功能这功能是保命用的。新建虚拟机时CPU 和内存的分配原则是给虚拟机够用的量但别把宿主机挤死。我一般给 Ubuntu 桌面版分配 4 核 CPU、8GB 内存宿主机 16GB 以上时磁盘预分配 60GB 或按需扩容。如果宿主机只有 8GB 内存虚拟机就给 4GB避免打开虚拟机后宿主机卡成幻灯片。磁盘类型选 NVMe 或 SATA 都可以虚拟磁盘建议勾选“将磁盘存储为单个文件”性能比拆分成 2GB 分片更好缺点是文件大一点、不好拷贝。这一步截图操作太简单我就不贴图了重点说一个容易踩的坑安装类型里如果选“稍后安装操作系统”记得在设置里手动挂载 ISO 镜像不要等到开启虚拟机后再去找镜像那样容易出现引导识别的幺蛾子。2.2 磁盘分区与安装过程的关键选择安装 Ubuntu 时分区方案我建议手动分区别用“清除整个磁盘”的省事做法。原因不是省事不好而是你需要理解分区结构以后磁盘满了才知道怎么处理。我常用的分区方案是分区大小挂载点说明/boot1GB/boot引导分区放内核和引导文件空间给够swap等于内存大小或 2GBswap交换分区休眠时用内存够大可以小一点/剩余全部/根分区所有系统文件和用户文件都放这有人会单独分一个 /home好处是升级系统时用户数据不丢坏处是根分区空间不够时 /home 也可能不够。我现在的做法就是 /boot swap / 三个分区简单直接备份靠外部设备而不是靠分区。安装过程中有一个容易忽略的选项在“安装过程中下载更新”和“安装第三方软件”这两个勾选框建议全勾。前者让系统装完就是较新状态省得后面手动补更新后者会安装一些专有驱动和多媒体解码器比如 Wi-Fi 网卡驱动。如果不勾装完发现无线网卡连不上又要折腾半天。2.3 装完系统后的“新人三件套”系统装好后先别急着装一堆软件按这个顺序操作三件事第一创建快照。装完系统、能正常启动登录的那一刻在虚拟机管理界面里创建第一个快照。后续你装软件、改配置、折腾坏了一键恢复到干净状态省下的时间不可估量。第二换软件源。Ubuntu 默认的源在国外下载速度感人。把源切换到国内镜像站阿里云、清华 TUNA 等方法很简单修改 /etc/apt/sources.list 文件把http://archive.ubuntu.com/替换成对应镜像地址。不会手动编辑的用sudo sed -i s//.*archive.ubuntu.com//mirrors.aliyun.comg /etc/apt/sources.list这种替换命令也能搞定然后sudo apt update。第三安装常用基础工具。我每次都会先装这些sudo apt install vim curl wget git net-tools openssh-server lrzsz。vim 和 curl 属于吃饭工具net-tools 提供了 ifconfig 等命令openssh-server 让你能用 Xshell、FinalShell 等工具远程连接虚拟机。做完这三步你的 Linux 环境才算初步可用。3. 开发环境搭建Python、Java、Node.js环境装好了接下来是重头戏开发环境的搭建。这里以 Python、Java、Node.js 三个最常被搜索的环境搭建场景为例讲讲我自己的做法和踩过的坑。3.1 Python 环境别直接用系统自带的Ubuntu 自带 Python3但我不建议直接拿系统 Python 来做开发。原因有二第一系统 Python 被 apt 包管理器和很多系统工具依赖你随便升级或者往里装包可能导致系统组件出问题第二不同项目对 Python 版本和包版本的要求可能冲突一个环境装不下。我推荐用 Miniconda 或虚拟环境工具做隔离。Miniconda 安装很简单wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh装完后source ~/.bashrc激活 conda之后创建虚拟环境conda create -n py310 python3.10 -y conda activate py310实测下来Miniconda 的大小比完整 Anaconda 小很多装个 Python 环境加上常用数据科学库完全够用。对深度学习方向的 PyTorch 环境搭建我也是先建虚拟环境再pip install torch这样装坏了也不影响系统里的其他项目。不装 conda 的话Python 官方推荐的python3 -m venv虚拟环境方案也可以只是它只隔离包不隔离 Python 版本。需要多版本 Python 时还是 conda 更顺手。3.2 Java 环境搭建从 JDK 到环境变量Java 环境搭建的核心是 JDK 的安装和环境变量配置。Ubuntu 上最简单的方式是通过 apt 装 OpenJDKsudo apt update sudo apt install openjdk-17-jdk -y java -version但很多时候你会遇到这种情况项目 A 要求 JDK 8项目 B 要 JDK 17系统里只能有一个。这种场景我建议用 alternatives 管理或者直接下载 JDK 压缩包按需切换。手动配置环境变量的方式是这样的编辑/etc/profile或~/.bashrc加入export JAVA_HOME/opt/jdk-17 export PATH$JAVA_HOME/bin:$PATH然后source ~/.bashrc运行java -version验证。这里有个细节JAVA_HOME 要指向 JDK 安装目录本身不要指向里面多套一层 bin 目录很多初学者在这里栽跟头。另外 apt 安装的 OpenJDK 默认路径是/usr/lib/jvm/java-17-openjdk-amd64你可以在/usr/lib/jvm下看看有哪些版本。3.3 Node.js 环境用 nvm 做版本管理Node.js 环境搭建我强烈建议用 nvm而不是直接 apt 安装 nodejs。原因是 apt 仓库里的 Node.js 版本往往偏旧而且切换版本麻烦。nvm 的安装和用法curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source ~/.bashrc nvm install node nvm install 18.20.0 nvm use 18.20.0nvm install node会安装最新版本nvm ls可以看到本机所有 Node 版本。之后再顺手装个 pnpmnpm install -g pnpm这里特别提醒一句npm 全局安装的包默认会装到 nvm 对应版本的目录里所以你切换 Node 版本后原先的全局包不一定可用需要在对应版本下重新npm install -g。这不是 bug是 nvm 的设计逻辑理解了就不会困惑。4. 常用命令与运维基本功开发环境搭好后日常在 Linux 上干活就离不开命令了。网上能搜到各种“Linux 常用命令大全”但我不打算给你贴一份百条命令清单那没用。下面这些命令是我日常使用频率最高、真正能解决实际问题的组合。4.1 文件与权限先保住你的数据文件操作里最常用的几个命令是cd、ls、cp、mv、rm这些基础命令大家都会。我重点讲两个容易被忽视的一个是ln -s创建软链接。软链接类似 Windows 里的快捷方式但它能让程序按固定路径找到实际存在其他位置的文件。比如你的大项目数据存在/data目录但代码里写死了/home/user/project/data那就可以ln -s /data /home/user/project/data两条路径指向同一份数据省去改代码的麻烦。另一个是权限管理。Linux 新手经常遇到“Permission denied”核心就是读写权限问题。单个文件的权限用chmod修改比如chmod x script.sh给脚本加执行权限。整个目录授权我常用chmod -R加递归参数。但这里记住一个原则别图省事对系统目录用chmod -R 777这会造成安全隐患。只对你的用户目录和项目目录操作即可。4.2 进程、网络、磁盘的排查三板斧系统出问题时最常用的排查命令组合如下进程相关ps aux | grep python查 Python 进程top或htop看整体资源占用kill -9 PID杀掉异常进程。需要注意kill -9是强制终结可能会让程序来不及保存数据能先用普通kill就先用普通kill。网络相关ip addr查看网卡和 IP 配置ping测连通性netstat -tlnp或ss -tlnp查看端口监听情况。遇到服务启动却连不上的问题第一件事就是看端口有没有在监听。磁盘相关df -h看各分区空间使用率du -sh *看当前目录下各文件或文件夹占用大小。这几个命令组合起来能解决大部分日常运维问题。我的习惯是出问题先看三步CPU/内存top→ 磁盘df→ 网络ping/ss基本能定位 80% 的故障源头。4.3 日志查看的“终极武器”排查问题还有一个重要手段是看日志。系统日志在/var/log/目录下应用日志各有不同。日常最常用的是tail -f命令实时滚动查看日志文件tail -f /var/log/syslog如果日志文件特别大别直接cat全量输出会把终端刷爆用tail -n 100只看最后 100 行再用grep过滤关键字grep -i error /var/log/syslog | tail -n 50这套“日志过滤三板斧”tail 限制行数 grep 找关键字 less 分页查看是我排查问题时的标准操作建议每个人都熟练掌握。5. 进阶环境Docker、LNMP 与嵌入式开发基础环境搞定后很多人的需求会进阶到环境容器化、网站服务搭建、嵌入式开发仿真这类领域。这一节我挑三个典型场景展开讲覆盖对应热搜里高频出现的 Docker、LNMP、PX4/ESP32 环境搭建方向。5.1 Docker 环境搭建隔离一切依赖Docker 才是真正的“环境搭建神器”。以前的痛点是把 Python、数据库、缓存全装在本机依赖冲突让人崩溃有了 Docker每个服务一个容器互相隔离环境也能随镜像分发别人拿到就能跑。在 Ubuntu 上安装 Docker 官方推荐用 apt 仓库方式sudo apt update sudo apt install docker.io -y sudo systemctl enable --now docker sudo usermod -aG docker $USER最后一步把当前用户加入 docker 组之后执行 docker 命令就不用每次都加 sudo 了。注意修改组后要重新登录终端才生效这一步很多人都忘记了以为命令出问题了。Docker 环境的实用姿势是搞一个 docker-compose.yml把多个服务编排起来。比如一个常见的开发环境我通常会定义 MySQL、Redis、Nginx 三个容器一条docker compose up -d全部拉起来比逐个docker run省事得多。5.2 LNMP 环境搭建网站服务的基本盘LNMP 是 Linux Nginx MySQL PHP 的组合很多 PHP 项目、WordPress 站点都依赖这套环境。现在手动编译 LNMP 已经不是主流了直接用包管理器能快速搭好sudo apt update sudo apt install nginx mysql-server php-fpm php-mysql -y安装完成后Nginx 的站点配置文件在/etc/nginx/sites-available/目录下需要手动创建一个站点配置把 root 指向你的网站目录然后在sites-enabled/下做个软链接。这里有一个非常经典的坑PHP 文件打开变成下载而不是执行。这通常是因为 Nginx 没有配置好 PHP-FPM 的转发需要在 server 块里加上类似这样的配置location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; }每次改完 Nginx 配置记得sudo nginx -t先测试语法然后sudo systemctl reload nginx改配置的过程才算安全。不要直接重启 nginxreload 是平滑重载连接不中断。5.3 嵌入式开发环境PX4、ESP32 的串口问题做嵌入式或机器人开发时环境搭建的坑和纯软件环境很不一样。以 ESP32 的 Arduino 环境为例Ubuntu 下安装 Arduino IDE 或 VS Code 的 PlatformIO 插件后最常遇到的问题是板子连不上、串口权限不足。这时需要把当前用户加入到 dialout 组sudo usermod -aG dialout $USER重新登录后ls /dev/ttyUSB*或ls /dev/ttyACM*才能看到设备并能访问。注意如果使用虚拟机做嵌入式开发还有一个经典坑USB 设备被宿主机占用而不是传给虚拟机需要在虚拟机软件的 USB 设置里把设备连接过去。类似地PX4 开发环境搭建包含 Gazebo 仿真在 Ubuntu 上是支持较好的官方提供了一个脚本可以自动安装依赖工具链。但这类环境依赖版本和 Ubuntu 版本严格对应所以我的建议是严格按照官方文档的 Ubuntu 版本来装环境不要用新版本系统强行编译旧工具链否则会因为依赖包版本不匹配而花费大量时间。6. 常见问题排查与避坑记录最后这一部分我把自己这几年遇到的高频问题整理成速查表并附上解决思路。全文都是实操过的记录每一条背后都是踩过的坑。6.1 网络不通、DNS 解析失败怎么办虚拟机刚装完经常出现宿主机能上网、虚拟机 ping 不通外网的情况。先按顺序排查一是检查网卡状态。运行ip addr如果没有看到类似 eth0 或 ens33 的网卡有 inet 地址说明网卡没拿到 IP。对 VMware 虚拟机确认网络模式是 NAT 还是桥接我建议桌面开发用 NAT简单不出错。二是检查 DNS 配置。能 ping 通 IP比如 114.114.114.114但无法解析域名就是 DNS 的问题。修改/etc/resolv.conf加上nameserver 114.114.114.114可以临时解决但这文件可能被 systemd-resolved 覆盖。稳定的做法是修改 netplan 配置sudo vim /etc/netplan/01-network-manager-all.yaml在里面指定 DHCP 或静态 IP 并设置 nameservers然后sudo netplan apply。这里提醒不同 Ubuntu 版本 netplan 配置文件名可能不同用ls /etc/netplan/查看为准。6.2 磁盘空间不释放删了文件空间还是满的这个问题在 WSL 里尤其常见删了文件但df -h看空间没释放。原因大概率是你删的文件被某个进程还在占用。用lsof | grep deleted能查出来是哪些进程还持有已删除文件句柄重启这些进程或者整个重启系统就能释放。还有一种是 WSL 的虚拟磁盘不会自动收缩。删了文件后 vhdx 磁盘镜像还是会占用宿主机空间需要用官方工具或wsl --shutdown后执行磁盘压缩操作。如果懒得折腾尽量避免在 WSL 里存放超大文件这是最实际的建议。6.3 其他高发问题和实用速查表问题现象一句话解决文件乱码解压 Windows 传来的 zip 中文名乱码用unzip -O CP936 file.zip指定编码共享文件夹不可见VMware 共享目录配置后找不到检查是否安装了 open-vm-tools重启一次软件源更新慢apt update 卡住换国内镜像源并执行apt clean双系统时间不准Windows 时间慢 8 小时在 Windows 里设置注册表让硬件时间存 UTC外接显示器无画面Linux 接显示器黑屏多试几种显示协议可能是显卡驱动问题关于 Linux 环境搭建我个人最后还想分享一个体会环境搭好的那一刻不是结束而是开始。我见过太多人光顾着“装环境”本身装完就不知道该干什么了。所以最好的方式其实是带着一个明确任务去装环境——我要在这个环境里跑起一个 Python 脚本、部署一个网站、编译一个固件。带着任务你才知道哪些依赖该装、哪些配置不能省、哪些坑必须绕开。希望这篇经验贴能帮你少踩几个坑把时间花在真正的学习和开发上。