Ubuntu与Windows开发环境选型:WSL2、Docker、Python

发布时间:2026/10/1 5:41:34
Ubuntu与Windows开发环境选型:WSL2、Docker、Python 我见过太多人在论坛里把 Ubuntu 敲成 Ubantu包括我自己第一次装系统那会儿。这个拼写错误本身不影响搜索反而成了不少中文技术圈的默认叫法但真要查官方文档的时候你按 Ubantu 搜出来的东西往往全是二手转述。这篇内容就是围绕 Ubuntu 和 Windows 这两个系统把它们的定位差异、安装方式、日常操作习惯、开发环境落地路径掰开揉碎讲一遍。如果你正在纠结要不要换系统、虚拟机怎么装、Docker 和 Python 环境该放哪边跑、跨系统文件怎么倒腾那接下来的内容基本能覆盖你 90% 的疑问。我会尽量说人话不堆术语重点讲清楚每一步为什么这么做。1. 两个系统根本不是同一类产品1.1 一个面向大众成品交付一个面向折腾者持续迭代Windows 是一套商业闭源的成品操作系统微软把硬件驱动、办公套件、图形界面、兼容性层全部打包好你买回来或者预装好开机就能用。它的核心目标是让尽可能多的人在尽可能少的思考下完成任务所以图形界面是唯一入口控制面板、设置、右键菜单构成了绝大多数人的全部认知。这种设计带来的好处是学习成本极低代价是系统里有大量你不需要但删不掉的组件后台服务、遥测、更新机制都由厂商说了算。Ubuntu 是基于 Linux 内核的开源发行版由 Canonical 公司维护每半年发布一个版本4 月和 10 月每两年发布一个长期支持版本LTS比如 24.04 LTS 这种。它的设计哲学完全相反终端是第一公民图形界面只是可选外壳你可以用 GNOME也可以换成 KDE、XFCE甚至可以只装命令行。软件来源统一走包管理器系统里几乎所有东西都能查到来源、能替换、能卸载。这种设计带来的好处是可控性极强、服务器端生态成熟代价是你遇到问题的时候得知道去哪儿找答案而不是点两下下一步。我常跟刚入门的朋友打一个比方Windows 像一套精装修的房子拎包入住墙里的管线你看不见也懒得管Ubuntu 更像毛坯房加一套标准化的建材市场你要自己接水电但接完之后每一根管子在哪你都清清楚楚。这个差异会渗透到后面所有的操作细节里。1.2 别问哪个更好先问任务要什么新手最容易掉进的坑是把系统选择当成一个价值判断问题非要争出高下。实际上这是个任务匹配问题。你要打游戏、跑某些只出 Windows 版的行业软件、做视频剪辑用 Adobe 全家桶那 Windows 就是唯一解别硬撑。你要跑服务器、做容器化部署、搞机器人开发、做深度学习训练、维护一批长期运行的脚本任务那 Linux 系的效率优势会非常明显。真正需要判断的是中间地带日常办公、写代码、跑 Python 脚本、远程连服务器调试。这部分两块系统都能干差异体现在细节里。比如 Windows 上写 Python你得先解决编码问题、路径分隔符问题、虚拟环境激活脚本不一样的问题Ubuntu 上这些是原生一致的但你得先学会用命令行装包。所以我的建议是先列出你最近三个月实际要做的事逐条判断哪个系统更省事而不是看别人的推荐帖。还有一个现实因素现在的界限已经没十年前那么清晰了。Windows 上可以跑 WSL2Ubuntu 上可以跑 Wine 兼容层跑部分 Windows 程序两边都能通过虚拟机互相嵌套。所以很多时候你不需要二选一而是主用谁、辅用谁。2. 装系统这件事一边是一路下一步一边是每步都在做选择题2.1 三种入场方式各有各的适用场景想把 Ubuntu 用起来不一定非要重装硬盘。主流有三种方式我按上手难度从低到高排一下。第一种是 WSLWindows Subsystem for Linux在 Windows 里直接装一个 Ubuntu 子系统。优点是几分钟就能装好不用分区不用重启Windows 和 Linux 之间文件互通/mnt/c就是你的 C 盘反过来在资源管理器地址栏输入\\wsl$也能进 Linux 文件系统。缺点是它毕竟跑在 Windows 内核的兼容层上虽然 WSL2 已经是真虚拟机方案了但涉及内核模块、特定驱动、硬件直通的时候还是会受限。适合写代码、跑脚本、学命令行的场景。第二种是虚拟机用 VMware Workstation 或者 VirtualBox 装一个完整的 Ubuntu。优点是隔离彻底随便折腾快照一键回滚装坏了删掉重来。缺点是性能有损耗图形界面会有点卡占内存和硬盘。适合学习、测试、试毒。第三种是双系统把 Ubuntu 装到独立分区开机时选择进哪个。性能是原生的硬件全部可用适合把 Linux 当主力开发环境的场景。代价是分区有风险装完可能遇到引导问题Windows 的快速启动还会干扰 Linux 写 NTFS 分区。选择建议很明确先 WSL 试水觉得不够用再上虚拟机确认要长期用再考虑双系统。别一上来就双系统分区失误一次数据就没了。2.2 虚拟机装 Ubuntu 的实操路径与踩坑点以 VMware 为例装之前先把 Ubuntu 的 ISO 镜像下好。官网下载速度慢的话国内几个高校和云厂商的镜像站都有同步找 24.04 的 desktop 版本就行。下完一定要做一次校验sha256sum比对一下官网公布的哈希值镜像损坏是后面各种诡异报错的头号嫌疑。新建虚拟机的时候配置有几个关键点。内存给 4GB 起步8GB 更舒服因为 GNOME 桌面本身就吃掉不少。CPU 给 2 核以上勾上虚拟化引擎。硬盘选 40GB 以上注意立即分配所有磁盘空间这个选项勾上性能好但立刻占满 40GB不勾就是动态增长用多少占多少但涨上去之后不会自动缩回来。网络模式有三种要搞清楚。NAT 模式下虚拟机借宿主机上网外面访问不进来适合纯上网桥接模式让虚拟机拿到和宿主机同网段的独立 IP适合要在局域网里被访问、要跑服务的场景仅主机模式只能和宿主机通信适合做隔离实验。我一般默认 NAT等确实需要局域网访问再改桥接。装系统的过程中会问你怎么分区。新手直接选清除整个磁盘并安装就行因为这是虚拟磁盘清的是虚拟的那块不会碰你的物理硬盘。要手动分区的话标准方案是EFI 分区 512MBswap 分区给内存的 1 到 2 倍内存 16GB 以上给 8GB 也够或者干脆不建分区用 swapfile剩下全给根分区/。如果要长期用建议再分一个/home这样以后重装系统时用户数据能保留。装完之后第一件事是装 VMware Tools 或者 open-vm-tools不然分辨率怪怪的、剪贴板不能共享、拖拽文件也别想。Ubuntu 上直接sudo apt install open-vm-tools-desktop就行比手动挂载 ISO 装官方版省事。2.3 双系统的分区风险与引导坑双系统的核心风险在分区这一步。Windows 装完之后硬盘上通常已经有 EFI 分区、恢复分区、MSR 分区和一个巨大的 C 盘你要做的是从 C 盘里压缩出未分配空间给 Ubuntu。压缩之前先在 Windows 磁盘管理里做不要用第三方工具乱动。压缩出来的空间保持未分配状态不要格式化直接让 Ubuntu 安装程序用它。Ubuntu 安装程序里选与 Windows 一起安装最省心它会自动处理引导。手动分区的话记住一点EFI 分区要挂载到现有的那个 EFI 分区不要新建第二个两块 EFI 分区会让固件不知道听谁的。装完之后常见三个坑。第一个是开机直接进 Windows看不到引导菜单这通常是 Windows 的快速启动和固件启动顺序问题进 BIOS 把 Ubuntu 的引导项调到前面同时在 Windows 里关掉快速启动。第二个是进去之后硬盘分区显示只读写不了文件这就是快速启动没关Windows 休眠状态下锁住了 NTFS 分区ntfsfix能临时救一下但根治还是关快速启动。第三个是两系统时间差 8 小时因为 Windows 把硬件时钟当本地时间Linux 默认当 UTCtimedatectl set-local-rtc 1可以让 Linux 迁就 Windows反过来也可以在 Windows 里改注册表让硬件时钟走 UTC。3. 桌面和终端两套完全不同的操作直觉3.1 盘符和挂载点这是最大的认知断层Windows 里一切都是盘符打头C:\Windows\System32\drivers\etc\hosts这个路径很多人背得滚瓜烂熟因为改 hosts 是常规操作。Ubuntu 里没有盘符所有东西都挂在根目录/下面的一棵树上。/etc/hosts就是那个 hosts 文件对应关系非常直接/etc放系统配置/var放变化的数据比如日志/home放用户文件/usr放系统程序和库/opt放第三方独立软件/tmp放临时文件。外接硬盘和 U 盘在 Ubuntu 里会挂到/media/用户名/卷标下面Windows 分区如果被识别会在/mnt或者/media下出现。你可以在文件管理器里点着用也可以mount手动挂。这里有个新手常犯的错想给某个程序配置路径的时候直接跟着 Windows 教程写C:\xxx在 Linux 下必然找不到。转换思路的窍门是记住 Linux 只有一个根剩下的都是它下面的子目录。还有一个容易忽略的差异Linux 文件名大小写敏感。Readme.md和readme.md是两个不同文件。从 Windows 拷过来的项目如果存在大小写冲突的文件解压时会直接覆盖或者报错这在代码仓库迁移时特别常见。3.2 权限模型和 root为什么会遇到改不了Windows 用的是用户账户控制管理员账号平时也是普通权限需要的时候弹个框问你一下。Ubuntu 的模型更直白每个文件有属主、属组和三类权限位读 r、写 w、执行 x。Ubuntu 默认把 root 账户锁着不设密码你要做管理员操作就用sudo前缀输入一次自己的密码短期内有缓存。sudo -i或者sudo -s能拿到一个 root shellsu -需要先给 root 设密码sudo passwd root但我不建议这么干因为开了 root 密码就等于多了一个可以被爆破的入口。日常用sudo就够了只有在要连续做一堆管理员操作的时候开个 root shell 更省事。权限问题最典型的场景是改配置文件。/etc下面几乎所有文件都归 root 所有你直接编辑保存会失败。正确做法是用sudo vim /etc/xxx或者sudo nano /etc/xxx。很多人图省事直接chmod 777这个习惯非常糟糕777 意味着任何用户都能改这个文件系统配置文件被任意篡改是安全事故的开端。正确的做法是搞清楚你到底需要什么权限是改内容就sudo是改归属就chown是改执行权限就chmod x。还有一个经验不要在/usr下面手动塞东西。这个目录被包管理器管着你手放的软件和 apt 装的软件混在一起以后排查冲突会非常痛苦。第三方软件放/opt自己编译的放/usr/local这是约定俗成的规矩。3.3 图形界面能做的事终端几乎都能做反过来不成立Windows 的绝大多数操作必须通过图形界面完成虽然 PowerShell 越来越强但很多设置项还是得点。Ubuntu 正好相反终端能干所有事图形界面只是个壳。这意味着两件事一是你学会命令行之后效率会有质变二是你迟早会遇到图形界面卡死了但终端还能用的情况这时候能救命的技能就是命令行。举个实际例子系统更新。Windows 上你可能要打开设置、点检查更新、等下载、等重启。Ubuntu 上两行sudo apt update sudo apt upgrade -y再需要的话sudo apt autoremove清理旧包。整个过程可见、可控输出信息也详细得多。再比如查日志。Windows 上你打开事件查看器按类别筛选图形界面翻。Ubuntu 上journalctl -u 服务名 -f实时跟一个服务的日志tail -f /var/log/syslog跟系统日志管道加grep过滤关键词几秒钟定位问题。这个效率差距在排障的时候感受特别强烈。4. 软件怎么装两套来源逻辑4.1 包管理器与安装包本质是信任来源的区别Windows 装软件就是下载 exe 或者 msi双击下一步下一步装完之后程序在注册表里留一堆东西卸载经常卸不干净。来源五花八门官网、各种下载站、群里传的安装包你得自己判断安不安全。Ubuntu 的软件绝大部分来自发行版维护好的软件仓库apt install 包名一句就装好卸载apt remove加autoremove基本能清干净。仓库里的包经过签名验证来源可信。代价是仓库里的版本通常偏旧因为它优先保证稳定性。要装新版本得自己加第三方源PPA或者下载 deb 包。除了 aptUbuntu 还有 snap 和 flatpak 两套沙箱化的包格式特点是自带依赖、版本新缺点是体积大、启动慢、和系统集成度低。日常我优先用 apt仓库里没有的再看 snap实在不行才手动下载 deb。deb 包这东西要注意dpkg -i装的时候不会自动处理依赖经常报一堆缺少依赖。解决办法是装完接着跑sudo apt -f install让 apt 去把缺的依赖补齐。或者干脆用sudo apt install ./包名.deb新版 apt 会自动处理本地包的依赖。4.2 换源、离线安装和内网环境国内用 Ubuntu 第一件事应该就是换源。官方的源在国外速度感人。把软件源换成国内镜像站下载速度能从几十 KB 飙到几 MB 甚至几十 MB。24.04 之后源的配置文件格式变了从/etc/apt/sources.list变成了/etc/apt/sources.list.d/ubuntu.sources用的是新的 DEB822 格式改的时候注意别照抄老教程。改完记得sudo apt update刷新索引如果报签名或者格式错误说明文件写坏了恢复备份重来。Windows 上现在也有包管理器了winget、scoop、chocolatey 都能用winget install一句话装软件确实方便很多。但生态成熟度还是比不上 apt很多小众软件没有收录而且装完之后文件的落点比 Linux 更分散。离线安装是内网环境绕不开的坎。Windows 上离线装 Docker 是个典型难题因为 Docker Desktop 依赖 WSL2 内核更新包和一堆运行时组件你得提前把 WSL2 内核更新包、Docker Desktop 安装包、可能还有特定版本的运行时都备好按顺序装中间缺一个就卡住。Ubuntu 上离线安装的思路是在一台能联网的同版本机器上用apt download把 deb 包和相关依赖都拉下来拷到目标机器上dpkg -i *.deb批量装。更规范的做法是用apt-get install --download-only加上dpkg-scanpackages搭一个本地仓库把 deb 包丢进去生成索引目标机器把本地目录加成源就能正常apt install了依赖关系交给 apt 自己算。5. 开发环境怎么落容器、Python、机器人框架5.1 Docker 在两个系统上的实现路径完全不同Windows 上跑 Docker主流是 Docker Desktop它背后依赖 WSL2 或者 Hyper-V 提供 Linux 内核。这意味着你得先在 BIOS 里开虚拟化装上 WSL2再装 Docker Desktop。家庭版 Windows 没有 Hyper-V但走 WSL2 后端是可行的。这一套下来资源占用不小而且 WSL2 的内存回收不积极跑久了会看到内存被吃掉一大块不还得手动重启 WSL 释放。Ubuntu 上 Docker 是原生的apt install docker.io或者用官方脚本装 docker-ce 都行。装完第一件事是把当前用户加进 docker 组sudo usermod -aG docker $USER然后重新登录这样以后跑 docker 命令不用每次都加 sudo。这里有个安全提醒docker 组的成员实际上等价于 root 权限因为它能挂载宿主机任意目录进容器所以生产环境的权限要控制好。容器镜像构建的体验差异也很明显。Linux 上构建镜像没有额外性能损耗网络走宿主机。Windows 上通过 WSL2 构建文件挂载跨系统的时候 I/O 性能会掉一截尤其是你的代码放在 Windows 磁盘而 Docker 跑在 WSL 里的时候。解决办法是把项目代码也放到 WSL 的文件系统里而不是/mnt/c下面这个改动对构建速度的提升非常明显。5.2 Python 环境Miniconda 在两边都用但细节不同Miniconda 是目前最省心的 Python 环境管理方案Windows 和 Linux 都有安装包。Windows 上是图形化安装向导勾选添加到 PATH的时候要想清楚因为可能和你已有的 Python 冲突。Linux 上是bash Miniconda3-latest-Linux-x86_64.sh一路回车装完conda init一下让 shell 认识 conda 命令。创建环境的命令两边一样conda create -n 环境名 python3.11。差别在激活方式Windows 上conda activate在 cmd 和 PowerShell 里都能用但 PowerShell 可能要先跑一次conda init powershell。Linux 上直接conda activate就行。另外 Linux 上 pip 建议配置国内源在~/.pip/pip.conf里写源地址Windows 上对应的文件在用户目录下的pip\pip.ini。搞深度学习的话PyTorch 安装是另一个分水岭。Windows 上显卡驱动随 NVIDIA 官方驱动一起装好装 PyTorch 选好 CUDA 版本就行命令里带上--index-url指定版本。Ubuntu 上 NVIDIA 驱动要单独处理可以用ubuntu-drivers devices看推荐版本然后sudo apt install nvidia-driver-XXX或者用.run文件手动装不推荐内核升级后容易挂。装完驱动nvidia-smi能看到显卡信息才算成功。CUDA Toolkit 和 PyTorch 自带的 CUDA 运行时不冲突但版本要对得上这个坑我踩过不止一次。5.3 ROS2 Jazzy 这类框架基本绑定 LinuxROS2 Jazzy 是 2024 年发布的版本官方明确对应 Ubuntu 24.04。Windows 上虽然有社区维护的安装方式但需要特定版本的 Visual Studio依赖关系复杂实际用起来问题不少。所以只要沾上机器人开发Ubuntu 基本是默认选项。装 ROS2 的常规路径是配置源、装 ros-jazzy-desktop、然后source /opt/ros/jazzy/setup.bash。建议把 source 命令写进~/.bashrc省得每次都敲。涉及真实硬件的时候还有权限问题。串口设备在 Linux 下是/dev/ttyUSB0或者/dev/ttyACM0普通用户默认没权限访问得把自己加进 dialout 组sudo usermod -aG dialout $USER重新登录生效。这个操作在 LeRobot 这类需要直连机械臂或者电机的项目里是必做步骤很多人装完库跑 demo 报权限错误就是因为漏了这一步。5.4 跨系统倒腾文件几种方案的实际体验从 Windows 往 Linux 拷文件最原始的是 U 盘但文件系统格式要注意。NTFS 和 exFAT 两边都能读但 Linux 下 NTFS 的写入在快速启动没关的时候会有问题。exFAT 兼容性最好适合当交换盘。虚拟机的话共享文件夹是最方便的VMware 里设置好之后在/mnt/hgfs下面能看到。但有个坑要提醒别把 Git 仓库放在共享目录里操作。因为共享文件系统的权限位是虚拟的Git 会认为所有文件都被改了git status一片红改成git config core.fileMode false能缓解但最好的做法还是把仓库放在 Linux 原生文件系统里只把共享目录当作文件交换区。网络传输的话SFTP 是最通用的方案。Linux 上装个 openssh-serverWindows 上用 Xftp 或者 WinSCP 这类客户端连过去图形界面拖拽就行。命令行玩家用scp或者rsync后者支持断点续传和增量同步大目录迁移的时候优势明显。WSL 场景下最简单/mnt/c直接就是 C 盘反向在资源管理器里输\\wsl$也能进去。6. 日志、脚本与自动化运维视角下的差异6.1 日志在哪儿看决定了排障速度Windows 的日志主要在事件查看器里分应用程序、安全性、系统三大类。安全日志记录登录、权限变更这类事件文件格式是 evtx要用专门的工具读。应用日志散落在各自安装目录下没有统一位置所以排查 Windows 上的问题时经常得先猜日志在哪。Ubuntu 的日志集中得多。传统的文本日志在/var/log下面syslog或者messages是系统日志auth.log是认证相关dpkg.log是包安装记录。新的 systemd 体系用journalctl统一管理journalctl -u nginx看某个服务的日志journalctl --since 1 hour ago按时间过滤journalctl -p err只看错误级别。加-f就是实时跟随等价于tail -f。这个集中化的好处在出问题时特别明显。服务起不来journalctl -u 服务名 -n 50 --no-pager一眼能看到最近的报错不用满硬盘找日志文件。Windows 上对应的操作要去事件查看器里筛选或者用 PowerShell 的Get-EventLog命令步骤多一层。6.2 脚本和计划任务换行符是个隐藏杀手Windows 上写脚本主流是 bat 和 PowerShellUbuntu 上是 shell 脚本。语法差异大但更隐蔽的坑是换行符。Windows 用 CRLFLinux 用 LF。你在 Windows 上用编辑器写好一个.sh文件拷到 Linux执行时报bad interpreter: /bin/bash^M或者$\r: command not found就是换行符的问题。解决办法是sed -i s/\r$// 脚本.sh或者用dos2unix工具转一下。VS Code 右下角可以切换换行符写跨平台脚本的时候记得设成 LF。计划任务方面Windows 用任务计划程序图形界面配置触发器和操作也能用schtasks命令行创建。Ubuntu 用 croncrontab -e编辑当前用户的任务表格式是五个时间字段加命令。要注意 cron 的环境变量和你登录 shell 的环境不一样脚本里用到的命令最好写绝对路径不然会出现手动跑没问题cron 跑就失败的经典问题。systemd timer 是更现代的替代方案配置稍微复杂但日志更清晰systemctl list-timers能看到所有定时任务的状态。6.3 想后台静默跑个东西两边思路不一样Windows 上想让脚本静默运行不弹黑窗口常见做法是用 VBScript 包一层或者用任务计划程序勾选不管用户是否登录都要运行。PowerShell 脚本的话可以设成隐藏窗口启动。这些方案都能用但总感觉是在绕。Ubuntu 上就直白得多nohup 命令 让进程脱离终端输出重定向到文件。setsid能开一个新的会话组彻底脱离。更规范的做法是写成 systemd servicesystemctl enable --now 服务名之后开机自启、崩溃自动重启、日志走 journalctl全都管好了。长期跑的服务我基本都做成 systemd unit比 nohup 靠谱。7. 场景对照与我的实际取舍7.1 一张表看清该选谁使用场景更合适的系统关键原因大型游戏、图形设计软件Windows商业软件生态和显卡驱动优化成熟日常办公、文档处理两者皆可办公套件两边都有格式兼容基本没问题服务器部署、容器编排Ubuntu包管理统一、资源占用低、远程管理方便Python 脚本与数据处理Ubuntu 略优环境隔离干净、命令行工具链完整深度学习训练Ubuntu驱动与 CUDA 生态更标准多卡管理方便机器人开发、ROS2Ubuntu官方支持绑定硬件权限模型清晰老旧机器复活Ubuntu 轻量桌面版资源占用可以压到很低需要同时用 Windows 独占软件和 Linux 工具Windows 加 WSL2一套硬件两个环境文件互通学习命令行与系统原理Ubuntu所有机制都暴露可见适合打基础7.2 我自己的组合方式讲完这些说说我实际怎么用的。主力机是 Windows因为日常沟通、文档、偶尔的游戏都在上面。开发相关的东西全部放进 WSL2包括代码仓库、Python 环境、Docker。这样做的好处是我不用来回切系统VS Code 装个 Remote 插件直接连进 WSL写代码的体验和原生 Linux 几乎一样。需要跑机器人相关的东西时我用一台装了 Ubuntu 24.04 的独立机器因为串口、USB 设备直通在 WSL 里还是麻烦。虚拟机上我保留了一个干净的 Ubuntu 快照用来测试各种安装流程试坏了直接回滚不心疼。这套组合用下来最大的感受是不要把系统选择当成信仰问题工具是拿来用的哪个顺手用哪个混着用也没人扣分。真正值得花时间的是把包管理、权限、日志这几个基础概念搞清楚搞清楚了之后你在哪个系统上都能快速上手。