借助 AI 在 Win11 上搭建 Rocky Linux:用 Visual Studio 直接调试 Linux 服务

日常开发时,我主要使用 Windows 11 和 Visual Studio,但服务最终可能需要在 Linux 环境运行。如果等到部署时才检查兼容性,路径、依赖和系统接口的问题就会集中出现。

这次我借助 AI,在本机通过 WSL2 安装了 Rocky Linux,并把它接入 Visual Studio 的调试流程。配置完成后,仍然可以在 Windows 中编辑代码、设置断点,让服务进程在 Linux 中运行。

这篇文章将操作整理为一套可以复现的流程,涵盖系统安装、.NET 环境准备、Visual Studio 配置和断点验证。

本文基于本机当前环境整理。系统和软件版本来自实际检查;安装部分采用官方提供的可复现方式,不作为原始安装命令的逐条历史记录。以下安装命令供新环境参考,已经安装成功的机器可从环境检查或调试配置部分开始。

一、先明确要实现的效果

整个开发流程是:

text 复制代码
Windows 11:Visual Studio 编辑代码、构建、设置断点
                         ↓ WSL 调试目标
WSL2:Rocky Linux 启动 .NET 服务
                         ↓ HTTP 请求
Windows 浏览器:访问服务,触发断点

这里使用的是 Linux 下的 .NET 进程,因此能较早发现运行时的跨平台问题。WSL2 使用自己的 Linux 内核,适合本地开发验证;最终部署仍需在实际服务器或目标容器环境中验证。

本机环境如下:

项目 本机配置
Windows Windows 11
Linux 发行版注册名称 RockyLinux-10
Rocky Linux 版本 10.2
WSL 模式 WSL2
Linux 安装目录 C:\WSL\RockyLinux-10
开发工具 Visual Studio 2022,17.14.4
Linux .NET SDK 9.0.121
Linux ASP.NET Core 运行时 9.0.20
示例服务端口 8719

本文以 ASP.NET Core 服务为例。WPF、WinForms 等依赖 Windows 桌面的程序不能通过切换 WSL 启动项直接变成 Linux 程序;应选择解决方案中能够跨平台运行的服务或控制台项目。

二、让 AI 协助梳理安装步骤

在开始操作前,可以先把目标和约束告诉 AI。例如:

我的电脑是 Windows 11,日常使用 Visual Studio 开发 .NET 服务。请协助我检查 WSL 状态,通过 WSL2 安装 Rocky Linux 10,准备与项目匹配的 .NET 环境,并配置 Visual Studio 在 Rocky Linux 中启动和断点调试。每一步请注明命令执行位置,以及如何判断是否成功。保留现有开发环境。

这类任务中,AI 比较有用的地方,是把分散的操作串起来,并根据报错继续定位。执行时仍要分清 PowerShell 和 Linux 终端,把实际输出提供给 AI,避免把不适用于当前环境的命令直接套用。

三、在 Windows 11 中准备 WSL2

先在任务管理器的"性能 → CPU"中检查"虚拟化"是否已启用。如果未启用,需要到 BIOS/UEFI 中开启对应的 CPU 虚拟化功能。

以管理员身份打开 PowerShell。首次安装 WSL 时执行:

powershell 复制代码
wsl --install --no-distribution

根据提示重启电脑。重新打开 PowerShell,更新 WSL,并将后续安装的发行版默认设为 WSL2:

powershell 复制代码
wsl --update
wsl --set-default-version 2
wsl --status

--no-distribution 表示这一步只安装 WSL,稍后单独安装 Rocky Linux。已有 WSL 的电脑可以先检查状态,再决定是否需要更新。相关命令可查阅 Microsoft WSL 基本命令文档。

四、下载并导入 Rocky Linux

Rocky Linux 官方提供专用 WSL 镜像和容器根文件系统两种方式。这里使用根文件系统导入,方便指定发行版名称和安装目录。镜像来源与导入方法见 Rocky Linux 官方 WSL 文档。

以下示例面向 Intel/AMD 的 x86_64 电脑。ARM 电脑应选择官方对应的 aarch64 镜像。

在 PowerShell 中创建镜像目录并下载文件:

powershell 复制代码
New-Item -ItemType Directory -Force -Path C:\WSL\Images

curl.exe -fL "https://dl.rockylinux.org/pub/rocky/10/images/x86_64/Rocky-10-Container-Base.latest.x86_64.tar.xz" -o "C:\WSL\Images\Rocky-10-Container-Base.latest.x86_64.tar.xz"

下载完成后,导入 WSL2:

powershell 复制代码
wsl --import RockyLinux-10 C:\WSL\RockyLinux-10 C:\WSL\Images\Rocky-10-Container-Base.latest.x86_64.tar.xz --version 2

这条命令分别指定了发行版名称、安装目录、镜像路径以及 WSL 版本。latest 指向的镜像会更新,安装后的具体小版本以系统查询结果为准。

如果当前 WSL 无法直接导入 .tar.xz,先使用支持该格式的解压工具解压为 .tar,再把导入命令的最后一个文件路径改为解压后的文件。

检查安装结果:

powershell 复制代码
wsl --list --verbose

确认列表中存在 RockyLinux-10,并且 VERSION 为 2。STATE 显示 Stopped 只表示当前未运行。

需要将它设为默认发行版时,再执行:

powershell 复制代码
wsl --set-default RockyLinux-10

五、进入 Rocky Linux,准备 .NET 环境

在 PowerShell 中进入系统:

powershell 复制代码
wsl -d RockyLinux-10

接下来切换到 Linux 命令。先检查发行版、内核和当前用户:

bash 复制代码
cat /etc/os-release
uname -r
whoami

本机检查到的发行版是 Rocky Linux 10.2,内核名称带有 microsoft-standard-WSL2。

从根文件系统导入后通常以 root 用户进入,本机也是如此。因此下面直接使用 dnf;使用普通用户的环境需要通过 sudo 执行安装命令。

安装基础工具:

bash 复制代码
dnf install -y curl git

再安装与项目匹配的 .NET SDK。本机项目使用 .NET 9,对应示例为:

bash 复制代码
dnf install -y dotnet-sdk-9.0

SDK 会带入相应的运行时。安装完成后检查:

bash 复制代码
dotnet --info
dotnet --list-sdks
dotnet --list-runtimes

ASP.NET Core 服务需要看到 Microsoft.AspNetCore.App。本机的实际检查结果为:

text 复制代码
SDK:9.0.121
Microsoft.NETCore.App:9.0.20
Microsoft.AspNetCore.App:9.0.20

这里的版本号用于记录现有环境。复现时应同时检查项目目标框架、global.json 的 SDK 约束和所选 .NET 版本的支持周期;新项目应选择仍受支持的版本,不必照搬本文版本。

如果仓库提示找不到对应 SDK 包,先检查发行版版本、仓库状态和可用包,再选择适用的安装方式。Windows 与 WSL 的 .NET 安装是两套环境,Windows 上已安装 SDK 并不代表 Linux 中也已安装。

六、给 Visual Studio 安装 WSL 调试支持

在 Visual Studio 中打开"工具 → 获取工具和功能",进入 Visual Studio Installer。

切换到"单个组件",搜索 WSL,确认安装与 .NET WSL 调试相关的组件;同时检查项目需要的".NET"或"ASP.NET 和 Web 开发"工作负载。

安装完成后重新打开 Visual Studio,再打开需要调试的解决方案。

Microsoft 的说明指出,这套调试集成主要测试和支持 Ubuntu、Debian;使用其他适用发行版时,需要自行准备 .NET 运行时和 Curl。Rocky Linux 的依赖因此在前一步手动安装。具体操作见 Visual Studio 在 WSL 中调试 .NET 应用。

七、为服务项目添加 WSL 启动项

在解决方案资源管理器中,把需要运行的 ASP.NET Core 服务项目设为启动项目。

打开该项目的 Properties/launchSettings.json,在现有的 profiles 对象中添加一个启动项。下面是可以合并使用的示例:

json 复制代码
{
  "profiles": {
    "WSL - Rocky Linux": {
      "commandName": "WSL",
      "distributionName": "RockyLinux-10",
      "launchBrowser": false,
      "launchUrl": "http://localhost:8719/swagger",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "ASPNETCORE_URLS": "http://localhost:8719"
      }
    }
  }
}

合并时保留原有启动项,不要直接用示例覆盖整个文件。这里有几个关键设置:

  • commandName 使用 WSL,这是当前 Visual Studio 使用的命令名称。
  • distributionName 与 wsl --list --verbose 中的名称一致,确保启动到目标发行版。
  • ASPNETCORE_URLS 指定服务监听地址,端口可按项目修改。
  • launchBrowser 为 false,因此调试开始后需要手动打开浏览器。

本机现有项目已经包含名为 WSL 的启动项,监听端口同样为 8719。现有配置未填写 distributionName,因此会使用 WSL 的默认发行版;本机默认发行版正是 RockyLinux-10。示例中显式指定名称,便于安装多个发行版后保持调试目标清晰。

保存文件,在 Visual Studio 顶部启动目标下拉框中选择对应的 WSL 启动项。

八、启动服务并验证 Linux 下的断点调试

在服务启动代码或某个接口处理方法中设置断点,然后按 F5。

首次启动时,Visual Studio 可能需要下载和部署调试组件。等待输出窗口显示应用启动完成,再在 Windows 浏览器中访问服务地址:

text 复制代码
http://localhost:8719

如果项目已启用 Swagger,可以访问:

text 复制代码
http://localhost:8719/swagger

没有配置 Swagger 的项目应使用实际存在的接口地址。浏览器请求命中设置断点的代码后,即可在 Visual Studio 中单步执行、查看局部变量和调用堆栈。

为了确认进程确实运行在 Linux,在断点暂停时打开"监视"或"即时窗口",求值:

csharp 复制代码
System.OperatingSystem.IsLinux()
System.Runtime.InteropServices.RuntimeInformation.OSDescription

前者应为 true,后者应显示 Linux 系统信息。也可以在另一个 PowerShell 窗口查看 Linux 中的 .NET 进程:

powershell 复制代码
wsl -d RockyLinux-10 -- pgrep -af dotnet

判断是否成功,应同时看三个结果:目标服务已启动、Linux 运行环境得到确认、请求能够命中断点。

如果服务已经通过 Linux 终端启动,也可以在 Visual Studio 中选择"调试 → 附加到进程",连接类型选择 Windows Subsystem for Linux,连接目标选择 RockyLinux-10,然后附加到对应进程。

九、遇到问题时,从这几处检查

找不到 WSL 启动目标

先检查 Visual Studio 的 WSL 调试组件,再确认当前启动项目属于支持的 .NET 服务或控制台项目。必要时检查 launchSettings.json 中是否有 commandName 为 WSL 的配置。

提示缺少 .NET 运行时

在目标发行版中运行 dotnet --list-runtimes,核对项目目标版本。Web 服务需要对应的 ASP.NET Core 运行时,仅安装基础 .NET Runtime 可能不够。

浏览器打不开服务

先查看 Visual Studio 输出窗口,确认服务没有启动失败,并核对实际监听端口。也可以在 Rocky Linux 终端检查:

bash 复制代码
curl -v http://localhost:8719/
ss -ltnp

即使根路径返回 HTTP 404,也说明该地址有 HTTP 响应,需要继续检查路由。如果 Linux 内部正常、Windows 浏览器无法访问,再检查 WSL 的 localhost 转发、代理或防火墙设置。默认网络配置下,Windows 通常可以通过 localhost 访问 WSL 中的服务。

Linux 中找不到文件,或出现 Windows 专用 API 报错

检查路径大小写、反斜杠、盘符和原生依赖。Linux 文件系统通常区分大小写,路径组合应尽量使用 Path.Combine,配置中的文件位置也需要符合当前运行环境。

如果代码依赖注册表、COM、Windows 身份验证或 Windows 专用库,需要单独处理跨平台实现。把启动目标切换为 WSL,并不会自动消除这些依赖。

断点没有命中

确认选中了正确的 WSL 启动项,使用 Debug 配置,服务成功启动且加载的是当前构建产物。对于接口断点,还要确认浏览器请求确实进入了对应路由。

十、配置完成后的日常使用

以后开发时,打开 Visual Studio,选择服务项目和 Rocky Linux 对应的 WSL 启动项,按 F5,再通过浏览器或接口工具触发请求即可。

如果需要手动进入 Linux,在 PowerShell 执行:

powershell 复制代码
wsl -d RockyLinux-10

需要停止该发行版时,先结束调试并保存工作,再执行:

powershell 复制代码
wsl --terminate RockyLinux-10

这次搭建完成后,我可以继续使用熟悉的 Windows 开发工具,同时在本机检查 Linux 下的实际运行行为。AI 帮助梳理了安装和配置过程,后续更有价值的用法,是把具体错误、启动日志和环境信息交给它,逐项定位跨平台问题。

相关推荐
牢姐与蒯2 小时前
WSL2 迁移教程:把Ubuntu+WSL2从C盘挪到别的盘
linux·运维·服务器·网络·ubuntu·1024程序员节
垆边人似月.2 小时前
RDMA 文件传输踩坑(二):为什么 `sleep()` 不能保证接收端准备好了?
linux·服务器·网络·rdma
zxanz12 小时前
证书运维自动化,守住业务 HTTPS 底线
运维·https·自动化
vipxieliang2 小时前
Service Mesh 可观测性:分布式追踪、指标与日志的统一方案
运维
DYWorker0012 小时前
第 1-10 课: 横切设施:锁、RCU、安全与观测怎么选?
linux
臻一2 小时前
rk3568---ftp无法连接
linux·ftp·3568
云飞云共享云桌面2 小时前
智能装备工厂研发部门多设计师共享一台SolidWorks服务器做设备装配建模
运维·服务器·网络·人工智能·3d·自动化·制造
Elastic 中国社区官方博客3 小时前
Elastic 在《Forrester Wave™:2026 年第四季度智能运维平台》报告中被评为强劲表现者
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索
自由彩虹3 小时前
靶场通关16--victim1
linux·服务器·网络·安全·web安全·网络安全