尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Windows上运行Linux程序指南:WSL2搭建、示例代码与性能调优
最近有个朋友跟我倒苦水他手头的小项目必须在Linux环境下编译可主力机是Windows每次都得先折腾半天环境。这个场景其实太常见了——很多开源工具链只发布了Linux版本日常脚本依赖Linux的命令行习惯或者部署目标是Linux服务器本地又不想丢掉Windows的办公生态。这篇文章就围绕一件非常具体的事展开如何在Windows上运行Linux程序并附上可以照着敲的示例代码。我会先从需求场景讲起帮你判断该选哪条路线然后把重点放在当前体验最顺、日常使用最频繁的WSL2上从环境搭建、示例代码到文件互操作和性能调优一步步说清楚。文中所有操作和代码我都按“我能直接复现”的标准来写不绕弯子。适合两类人看一类是刚接触跨平台开发、想在Windows里跑Linux工具的新手另一类是已经在用WSL但想解决文件交换、内存占用、端口互通等具体问题的开发者。1. 为什么需要“在Windows上运行Linux程序”先看清需求再选方案1.1 高频典型场景你不是少数人我见过的大多数需求可以归成四类。第一类是工具链依赖比如某个编译器、模拟器或测试框架只提供Linux版Windows下要么没有要么处于半放弃维护的状态。第二类是环境一致性本地开发环境和服务器不一致代码在Windows上好好的部署到Linux就崩你需要在本地先跑一遍Linux环境。第三类是开源程序复现很多论文或开源项目给的示例代码、构建脚本就是面向Linux的在Windows上按步骤走总差那么几步。第四类是运维习惯有些人写自动化脚本就爱用bashPowerShell虽然强大但语法习惯差异不小直接跑Linux脚本更省事。这些场景的共同点是你并不想彻底抛弃Windows只是想借用Linux的能力。想清楚这一点接下来的方案选择才有方向。1.2 程序类型直接决定方案取舍开始之前建议你先问自己需要运行的Linux程序到底是命令行工具还是服务型程序还是有图形界面或者需要直接操作内核这个问题非常关键因为它直接决定了用什么方案。我整理了一张粗略的对应表程序形态推荐方案理由命令行工具、构建脚本、编译器WSL2起步快、资源占用小、和Windows集成好Web服务、数据库、后端进程容器引擎隔离干净、环境可复用现代方案一般也要依赖WSL2做后端图形界面程序虚拟机或新版WSL的图形支持图形渲染需要完整显示栈虚拟机最稳内核模块、自定义驱动虚拟机需要完整Linux内核和设备访问权限这个表格是一个参考不是绝对标准。如果你的需求是“偶尔跑一下Linux命令”那WSL2基本就是最优解如果需求是“完整复现一套Linux服务器环境”那容器或虚拟机更合适。下面我展开对比四条主流路线。2. 四条主流路线对比虚拟机、容器、WSL2与远程开发2.1 虚拟机最完整的Linux但开销也最大虚拟机的思路是在Windows上虚拟出一台完整电脑在里面安装一个完整的Linux系统。它的好处是隔离性最强Linux内核、设备驱动、桌面环境统统都有你想做什么都行几乎和真机没区别。代价也很明显资源开销大、启动慢、平时要维护一个完整的操作系统。一台8GB内存的电脑虚拟机里分上4GB之后Windows这边就会明显紧张。虚拟机的磁盘文件也会占掉几十GB空间日常命令行工作用它有点杀鸡用牛刀的感觉。适合的场景是你需要Linux图形桌面或者需要编译/加载内核模块又或者需要一个完全独立的实验环境。2.2 容器轻量但共享内核服务型程序的好选择容器和虚拟机不一样它不虚拟整套硬件而是共享宿主机内核只做进程和文件系统层面的隔离。因为不需要跑完整操作系统容器启动速度可以做到秒级镜像复用之后部署非常方便。在Windows上跑Linux容器现代方案基本都依赖WSL2作为后端也就是说你先得把WSL2环境搭好。容器的典型使用场景是跑服务型程序比如一个Python后端、一个数据库、一套Web应用。你把依赖、配置、启动命令打包进镜像换一台机器也能得到一致的运行结果。不过容器不适合需要直接操作内核、加载内核模块的程序它的隔离机制决定了那些操作会被拦下来。2.3 WSL2命令行场景的综合最优解WSL2Windows Subsystem for Linux 2是当前Windows上运行Linux程序最实用的一条路线。它的设计思路是把一个精简的Linux内核跑在Windows自带的轻量虚拟化平台上同时保留和Windows高度互通的体验。相比虚拟机WSL2启动只需要一两秒钟内存可以动态回收不会一上来就吃掉固定的大块内存。相比传统翻译层方案WSL2因为用了真正的Linux内核兼容性更好绝大多数Linux二进制程序都能直接跑。再加上它和Windows文件系统、命令行的深度集成日常写代码、跑脚本、做测试都非常顺手。这也是后文示例代码选择WSL2作为主线的原因。2.4 远程开发与交叉编译不一定要在本地跑Linux如果你的目标只是“在Windows上编写和调试Linux程序”其实还有一个轻量思路代码放在Windows本地用一个支持远程开发的编辑器连到一台Linux机器上在远程执行所有编译和运行命令。本地只负责写代码和看输出这种感觉也近似于“在Windows上运行Linux程序”。这种方式适合你已经有一台可用的Linux服务器或开发机。另一种情况是交叉编译直接在Windows上编译出Linux可执行文件。理论上可行但Linux程序依赖动态库、链接器、系统调用交叉编译工具链很容易在依赖上卡脖子。除非是写完全静态的简单程序否则日常使用我还是更推荐WSL2或远程开发省心太多。3. 搭建WSL2环境从打开终端到第一个能跑的程序3.1 前置条件与版本确认安装WSL2之前先确认三件事。第一Windows版本够不够新建议在Windows 10的2004版本以上或者直接用Windows 11这样能享受到最新的WSL改进。第二主板BIOS里要开启虚拟化支持大部分现代电脑默认开启如果你是老机器或者自定义装机需要进BIOS确认一下。第三终端要以管理员权限打开。确认方式很简单在PowerShell里运行wsl --status如果提示找不到命令说明你的Windows版本比较旧如果能看到版本状态说明已经具备基础条件。3.2 一条命令完成安装在较新的Windows版本上安装WSL2已经收敛为一条命令在管理员终端里执行wsl --install这条命令会自动完成几件事启用运行WSL所需的Windows组件、下载并部署一个默认的Linux发行版、把默认版本设置为WSL2。执行完之后按提示重启电脑重启后系统会进入发行版的初始化流程让你创建一个Linux用户名和密码之后就进入了Linux环境。如果你想自己指定发行版可以先查看在线可用的列表wsl --list --online然后安装指定的发行版wsl --install -d 发行版名称安装完成后随时可以打开新的终端窗口输入wsl直接进入默认的Linux环境。3.3 首次配置与基础工具安装进入Linux环境后我建议先做三件事算是环境初始化的“三件套”。第一确认内核和系统信息uname -a看到一串包含WSL2字样的Linux内核信息就说明环境正常。第二更新软件源和基础软件包主流的发行版一般用sudo apt update sudo apt upgrade -y这个过程会把软件索引刷新并升级已安装的包。第三安装编译和运行示例代码要用到的工具sudo apt install -y build-essential python3 python3-pipbuild-essential带了gcc、g、make这些编译基础工具Python环境也一并装上。3.4 WSL1与WSL2两代架构的区别安装命令默认会使用WSL2架构但有些老环境可能还是WSL1。WSL1没有虚拟机的内核而是通过翻译层把Linux系统调用转成Windows调用优点是启动极快、跨文件系统访问原生一些缺点是有些程序对系统调用支持不完整会有兼容性问题。WSL2则用轻量虚拟机承载真正的Linux内核兼容性大幅提升是目前的主流。如果你的发行版还在WSL1想切换到WSL2可以执行wsl --set-version 发行版名称 2一般情况我都会建议用WSL2除非你有特别依赖WSL1文件系统语义的边缘场景。4. 附示例代码三种语言与一个网络服务的完整演示4.1 C语言程序编译工具链正确性的试金石进入WSL后随便建一个目录写一个C程序。用nano、vim或者直接在Windows侧用编辑器写完放到WSL里都行。创建hello.c#include stdio.h int main(void) { printf(Hello from Linux, running on Windows!\n); return 0; }用gcc编译gcc hello.c -o hello ./hello输出会是Hello from Linux, running on Windows!为什么这里要写./hello而不是直接写hello因为Linux默认不把当前目录加入可执行文件的搜索路径直接输入hello会让shell去PATH目录里找通常找不到。养成用./的习惯后续执行脚本和程序都会少很多困惑。4.2 Python脚本Windows兼容性问题的一个典型Python本身是跨平台的但很多科学计算、数据处理相关的库在Windows上的二进制分发并不完整或者行为有细微差异。在WSL里跑Linux版Python会更接近生产环境。创建一个fib.pydef fib(n): a, b 0, 1 for _ in range(n): a, b b, a b return a for i in range(10): print(ffib({i}) {fib(i)})执行python3 fib.py输出Fibonacci数列的前十项。这个例子很小但它验证了Python解释器、脚本执行权限、输出编码等基础链路都没问题。后续你安装第三方库比如用pip install安装某个只提供Linux轮子的包在WSL里会顺利很多。4.3 Shell脚本处理批量重命名和文本操作Shell脚本是Linux环境下的高频需求。下面这个脚本把当前目录下所有.txt文件重命名为.bak后缀#!/bin/bash for file in *.txt; do [ -e $file ] || continue mv $file ${file%.txt}.bak done先把内容保存为rename.sh然后赋予执行权限chmod x rename.sh ./rename.sh其中chmod x是给脚本添加可执行权限。如果你是从Windows侧拷贝这个文件到WSL里可能会遇到换行符问题导致脚本报\r: command not found。这个问题我在下一章详细讲。4.4 网络服务在Windows浏览器中访问WSL里的程序WSL2有一个很实用的特性WSL里监听的端口Windows通常可以直接通过localhost访问。我经常用这个方式快速启动一个本地服务来验证代码。在WSL里启动一个简单的HTTP服务cd /home/你的用户名 python3 -m http.server 8000然后打开Windows浏览器访问http://localhost:8000你就能看到那个目录的文件列表。这说明Linux程序在WSL里跑起来之后网络链路和Windows是通的。如果访问不到一般是WSL版本较旧或者端口转发被关闭可以先用ip addr查看WSL的IP然后用http://WSL-IP:8000尝试不过新版默认情况下localhost转发已经很好用了。5. 文件系统互操作与文本编码最常见的小麻烦5.1 两套文件系统两条访问路径WSL2里其实存在两套文件系统。一套是Linux自己的ext4文件系统固定在WSL的虚拟磁盘里性能好是存放代码和工作文件的首选位置。另一套是Windows文件系统的挂载点所有Windows盘符都在Linux环境下以/mnt/盘符的形式出现比如C盘就是/mnt/c。在Linux里访问Windows文件cd /mnt/c/Users/你的用户名/Desktop ls -l在Windows里访问WSL文件可以在资源管理器的地址栏输入\\wsl$或者\\wsl$\发行版名称\home\你的用户名这样Windows侧的程序也能直接读写WSL里的文件两边互通很方便。5.2 使用wslpath转换路径路径格式不同常常让人头晕好在WSL提供了一个专门的转换命令wslpath。在WSL里执行wslpath C:\Users\你的用户名\Desktop\file.txt会输出对应的Linux路径/mnt/c/Users/你的用户名/Desktop/file.txt反向转换用-w参数wslpath -w /home/你的用户名/file.txt这个命令在写脚本时特别有用可以把Windows路径作为参数传给Linux程序。5.3 CRLF、LF与可执行权限Windows上的文本文件默认用回车换行CRLFLinux则只用换行LF。当你把一个Windows编辑器保存的脚本拷贝进WSL直接执行经常会出现一个诡异报错bash: script.sh: /bin/bash^M: bad interpreter。处理办法很简单把回车符去掉sed -i s/\r$// script.sh执行完再试脚本就能正常运行了。如果这个项目用了Git建议在Windows侧配置一下core.autocrlf让Git在检出时自动转换换行符能从源头减少这类问题。另外从Windows复制到WSL里的文件默认可能没有Linux可执行权限所以chmod x script.sh这步不要省略。中文内容方面大部分现代发行版默认UTF-8编码和Windows下的新编辑器一致如果你要处理旧版GBK编码的文件可以用iconv先做转码。6. 踩坑记录与性能调优让程序稳定运行磁盘和内存不失控6.1 端口互通的两个小坑虽然WSL2的localhost转发很方便但偶尔也会遇到失效的情况。常见原因有两个一是WSL版本太旧内核没有启用对应的转发机制二是服务启动时监听在某个特定IP上而不是0.0.0.0。比如Python的http.server默认监听所有接口一般没问题但某些服务默认只监听127.0.0.1Windows侧访问时可能就切换不到。排查思路是先在WSL里确认监听地址ss -tlnp | grep 8000如果看到的是127.0.0.1:8000就要到服务的配置里改成0.0.0.0。Windows防火墙第一次拦截WSL进程的入站连接时会弹窗询问记得允许否则外部程序访问WSL端口也会不通。6.2 用.wslconfig限制内存与CPUWSL2默认的内存管理是动态增长但它有个特点最多可能占用Windows一半的物理内存。如果电脑内存不大跑几个Linux程序之后Windows会明显变卡。这里可以用.wslconfig文件做限制。在Windows侧创建或编辑C:\Users\你的用户名\.wslconfig[wsl2] memory4GB processors4 swap2GB保存之后在PowerShell里执行wsl --shutdown再重新打开WSL配置就会生效。注意这个文件是Windows侧的不是Linux侧。很多人在Linux里到处找这个文件找不到就是这个原因。6.3 虚拟磁盘只增不减WSL2的Linux文件系统存放在一个虚拟磁盘文件里这个文件会随着使用不断增大但删除文件之后它不一定会自动还给宿主机导致Windows侧看到磁盘占用一直涨。解决办法是压缩虚拟磁盘。流程大致是先备份重要数据然后在PowerShell里执行wsl --shutdown再用Windows自带的磁盘管理工具找到WSL的虚拟磁盘文件进行压缩。具体工具名称不同版本略有差异操作前务必确认备份完整。这属于低频维护操作我一般两三个月做一次做完能让磁盘占用明显回落。6.4 启用systemd以支持后台服务新版WSL2已经支持systemd这对跑后台服务很重要。默认情况下有些发行版没有开启systemd你执行systemctl start xxx会报错说没有连上systemd。开启方式很简单编辑WSL里的/etc/wsl.conf[boot] systemdtrue保存后回到Windows侧执行wsl --shutdown再重新进入WSL执行systemctl status确认systemd已经运行。之后就能用systemctl管理Linux服务了比如开机自启某些程序或者运行数据库服务。6.5 双向调用Windows命令与Linux命令互相使用WSL一个很实用的点是双向互操作。在Windows的PowerShell或CMD里可以直接调用Linux命令wsl bash -c ls -l /etc/passwd在WSL里也可以调用Windows程序。比如想用Windows记事本打开WSL里的一个文本文件/mnt/c/Windows/System32/notepad.exe log.txt这会直接唤起Windows记事本并在里面打开Linux侧的文件。对于那些“Windows有现成工具、Linux侧没有”的场景这个能力非常方便。建议你把WSL的路径挂在终端里随时双向跳转。结尾我的日常使用习惯最后分享一点个人经验。我现在的习惯是所有和开发相关的文件一律放在WSL的Linux文件系统里Windows侧编辑器通过\\wsl$路径去访问只有在需要把产物交给Windows工具链时才复制到/mnt/c下面。这样做的好处是避开了跨文件系统IO性能损耗Git关联文件也不会被奇怪的换行符问题反复纠缠。每次新建一个WSL环境我总会先做三件事更新软件索引、安装build-essential、把所有脚本文件统一转成LF换行。这套流程走下来基本没有遇到过环境导致的诡异问题。如果你打算长期在Windows上运行Linux程序我建议你也把这套流程固化下来省下的时间远比研究各种临时方案多得多。
RELATED

相关推荐

iOS 高效绘图:从 Core Graphics 到 Metal 的实践指南

iOS 高效绘图:从 Core Graphics 到 Metal 的实践指南

1. 引言 在 iOS 开发中,绘图是一个绕不开的话题。无论是自定义控件、图表展示、还是游戏渲染,高效的绘图能力直接影响应用的流畅度和用户体验。本文将从 iOS 绘图的技术栈出发,系统梳理 Core Graphics、UIKit 绘图、Core Animation 以及 Meta…

📅 2026/10/14 17:14:50
【无人机检测】三维山地地形能源意识型遗传算法优化多无人机任务分配与基站部署风电场检测路径规划Matlab实现

【无人机检测】三维山地地形能源意识型遗传算法优化多无人机任务分配与基站部署风电场检测路径规划Matlab实现

✅作者简介:热爱科研的Matlab仿真开发者,擅长数学建模、模型改进、算法创新、程序设计科研仿真。🍎 往期回顾关注个人主页:完整代码获取 定制创新 论文复现私信🍊个人信条:做科研,博学之、审问之…

📅 2026/10/14 17:14:50
LimeSDR实现高保真WBFM广播的工程实践

LimeSDR实现高保真WBFM广播的工程实践

1. 为什么用LimeSDR做WBFM广播不是“炫技”,而是真能落地的工程选择最近在某高校通信实验室带学生做短距无线音频传输项目时,有位A同学直接把手机蓝牙音箱拆了,想用SDR搭个“可编程FM收发一体机”。他第一反应是找RTL-SDR——毕竟便宜、资料多…

📅 2026/10/14 17:09:49
MORE NEWS

更多资讯

📰

KVM虚拟机磁盘在线扩容实战:从virsh blockresize到文件系统扩展

1. 开篇:为什么你躲不开在线扩容这一刀聊到KVM的磁盘管理,可能很多人觉得这就是qemu-img加virsh那点命令的事——创建、挂载、快照,顶多再搞个离线resize,好像没什么新鲜的。但真到了生产环境,你迟早会碰到一个让人头疼…

📰

Python爬虫实战:抓取豆瓣短评7个字段并分析

1. 为什幺要抓豆瓣短评:一次真实的数据需求做内容分析或者用户调研的时候,短评是特别有信息密度的一类数据。一个普通的短评页,单条评论里就同时藏着用户昵称、地理位置、评分、发布时间、内容、点赞数,把这些字段组合在一起&…

📰

智能体安全测试指南:从权限边界到逃逸测试的完整实践

1. 从“能对话”到“能动手”,智能体扩张的不只是能力边界1.1 传统模型输出与智能体动作之间的风险断层过去几年大家做AI安全测试,核心盯着的其实是“模型会不会输出危险内容”。你给模型一个恶意 prompt,模型要么拒绝、要么配合,…

📰

Qt自助点餐系统开发实战:从触摸界面到断网补单与打印对接

简介:QT自助点餐系统是一份面向C与Qt初学者、课程设计及桌面应用开发练习者的完整项目源码,围绕餐饮场景实现菜单浏览、选菜下单与支付等交互流程,帮助读者理解跨平台GUI程序的整体搭建思路。压缩包共23个文件,约23KB,…

📰

Scratch编程启蒙教学:从核心机制到项目实战的完整课程设计

做少儿编程教育这几年,被问得最多的一句话就是:孩子编程入门到底学什么?我的答案基本没变过——Scratch。这次借着完整梳理"橙狮Scratch编程"这套课程体系的机会,把我在一线教学、带孩子做项目过程中沉淀下来的设计思路…

📰

51单片机流水灯实战教程

继上一篇学会点灯之后,我们就可以做‘流水灯’了。 首先我们要准备一块51开发板,我的是这样的。 软件方面就按照我上一篇文章的来。https://blog.csdn.net/qq_58675272/article/details/165239903?spm1001.2014.3001.5501 然后一定要看自己的原理图&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬