前阵子帮一个朋友调他新买的Windows笔记本他坚持要在本地跑大模型又不想用win原生的Ollama说在Linux下才比较“正宗”。我理解他的意思Ollama虽然提供了Windows安装包但WSL2 Ubuntu这种组合确实在生态、脚本兼容性和“网上教程通用性”上更舒服尤其是后面要接Open WebUI这类前端面板Linux容器跑起来几乎没有各种盘符路径的恶心问题。这篇就算是我把整套环境从头到尾搭一遍的手记WSL2 Ubuntu Ollama Open WebUI从最开始的Windows功能开启到Linux里装好模型服务再用Docker把Open WebUI拉起来最后把常见坑列成清单。不论你是想完全本地聊天、给内网提供API服务还是准备折腾知识库RAG这套底座都够用。先提醒一句不要看到一长串命令就慌绝大部分东西只需要复制粘贴真正需要动脑子的是架构思路和配置取舍而不是敲键盘。1. 方案设计为什么是WSL2 Ubuntu Ollama Open WebUI1.1 为什么不用Windows原生OllamaOllama官方确实有Windows安装包双击就能装很多教程也直接说“去ollama.com下载然后next”。但实际用起来有几个让人不舒服的地方第一原生版模型缓存目录在C:\Users\xxx\.ollama下面一旦下载了几个大模型C盘很容易爆掉改缓存路径不算麻烦但很多人不知道第二Windows版缺少systemd这套进程管理机制Ollama虽然在后台能跑但你想设置开机自启、查看日志、配置环境变量操作路径会绕很多第三后面接Open WebUI时如果要用DockerWindows原生Docker Desktop和WSL2的Docker引擎又是一套新问题。我并不是说Windows版完全不行我身边也有同事一直用原生的接口调用一切正常。但如果你打算长期折腾或者要参考社区里的脚本和配置教程WSL2 Ubuntu的优势非常明显绝大多数Linux教程你都能直接抄有什么奇怪依赖冲突也更容易复现。WSL2不是虚拟机它和Windows共享内核启动一个Ubuntu发行版大概只要几秒磁盘IO也经过了专门优化体验上很像一个本地目录。1.2 四个组件分别负责什么这套方案本质上是四层结构WSL2微软官方做的轻量虚拟机技术负责在Windows里跑一个完整的Linux内核性能和启动速度远好于传统虚拟机。UbuntuWSL2里的发行版我推荐Ubuntu 24.04 LTS是目前兼容性最稳的选择。Ollama和Docker都有现成的deb包或脚本依赖基本不需要额外折腾。Ollama本地大模型运行引擎类似“模型界的docker”。你只需要执行ollama run qwen2.5:7b它就会自动拉取模型并启动一个本地HTTP接口行的就是llama.cpp那一套推理底层。Open WebUI给Ollama套一层ChatGPT风格的前端界面。没有它你只能对着API接口发curl有了它就能浏览器里点来点去还能管理多用户、传文档做RAG。这四个组件是可以拆分的Ollama提供了模型能力Open WebUI只是消费它。如果你不需要图形界面完全只装Ollama就够了如果你需要多人访问就把Open WebUI挂上去。1.3 环境要求与容量评估先看机器能不能跑。以下是我个人建议的“起步配置”不是官方最低要求配置维度建议要求备注CPUx86_64架构支持虚拟化WSL2必须开启BIOS里的VT-x/AMD-V内存16GB起步8B量化模型推理大约占用5-6GB内存磁盘剩40GB以上空间模型文件容器镜像系统缓存很快会膨胀GPUNVIDIA独立显卡可选没有也能用CPU硬扛但速度会慢不少系统版本Windows 10 22H2或Windows 11老版本WSL体验差很多内存可能是最容易被低估的。一个7B或8B的量化模型加载到内存后是4-5GB运行时再留出上下文缓存加上Open WebUI容器、Docker引擎、Ubuntu本身16GB机器余量已经不多了。如果你的机器只有8GB内存建议不要碰大模型硬要跑的话挑1.5B、3B的小模型。2. WSL2与Ubuntu环境搭建2.1 打开Windows功能并安装Ubuntu先确保Windows的“适用于Linux的Windows子系统”和“虚拟机平台”两个功能启用。直接右键开始菜单用管理员身份打开PowerShell或者Windows Terminal依次执行dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完重启系统必要步骤不能省。重启后继续在管理员PowerShell里执行wsl --install -d Ubuntu-24.04这个命令会自动下载并安装Ubuntu 24.04的WSL镜像。安装完会让你设置Linux用户名和密码注意这是Linux里的普通账号密码可以忘但不要乱设后面所有sudo命令都需要它。2.2 先配置systemd再继续很多人跳过了这一步后果是Ollama的systemd服务无法启动安装完一切正常但curl localhost:11434半天不通。WSL2里的systemd并不是默认开启的你需要手动打开。如果你使用的是比较新的WSL版本执行以下命令检查cat /etc/os-release然后直接编辑WSL的全局配置sudo nano /etc/wsl.conf里面写入[boot] systemdtrue保存后在Windows PowerShell里执行wsl --shutdown重新进入WSL后执行systemctl --version如果输出一串版本号说明systemd已经可用。这一步直接决定后面Ollama和Docker能不能作为服务稳定运行不要跳过。2.3 配置.wslconfig限制资源WSL2的默认行为是它能动用你Windows一半的内存多核CPU它也能用很多。听起来还行但跑大模型时如果让它放开手脚Windows主机会卡成PPT。所以最好在Windows用户目录下创建一个.wslconfig文件也就是C:\Users\你的用户名\.wslconfig内容按需调整[wsl2] memory12GB processors6 swap2GB autoMemoryReclaimgradual sparseVhdtruememory和processors按物理机实际配置来写。比如16GB内存就分12GB给WSL32GB就分20GB不要全给Windows桌面环境至少需要留4-6GB。autoMemoryReclaimgradual让WSL在使用完内存后逐渐归还给Windows避免里面积压一堆没用的缓存。sparseVhdtrue是个重要选项能让WSL虚拟磁盘文件按需增长而不是写满就保持大体积。改完.wslconfig必须完全关掉WSL才生效wsl --shutdown再重新进入。2.4 更新软件源与基础工具Ubuntu刚装完需要更新软件包源执行一次基础升级避免后续安装Ollama时遇到旧依赖sudo apt update sudo apt upgrade -y顺手装几个后面会用到的工具sudo apt install -y curl htop net-tools githtop用来看内存和CPU占用net-tools提供ifconfig和netstat排查端口问题很实用。3. 安装Ollama与模型管理3.1 安装Ollama并确认服务状态在WSL2的Ubuntu终端里执行官方安装脚本curl -fsSL https://ollama.com/install.sh | sh这个脚本会自动下载最新的Ollama二进制并注册一个systemd服务。装完先看一眼服务状态systemctl status ollama正常情况下应该是active (running)。如果没启动手动拉起来sudo systemctl enable ollama sudo systemctl start ollama再检查接口是否响应curl http://localhost:11434看到一段类似Ollama is running的文本说明核心服务已经起来。这里我说一下为什么不推荐用后台nohup ollama serve 这种方式手动启动的进程在WSL终端退出后会变成孤儿进程下次WSL重启又要重新拉systemd能保证它在Ubuntu启动时自动跟着启动。3.2 拉取第一个模型Ollama的模型拉取和运行共用同一个命令。我以qwen2.5:7b为例你当然可以换成其他模型ollama run qwen2.5:7b执行后Ollama会先下载模型再进入一个交互式命令行直接跟模型说话。第一个模型下载量在4.7GB左右取决于网络情况需要等一段时间。首次跑完如果只是测试可以直接输入/bye退出交互模式模型会自动从内存中卸载但文件已经保留在磁盘上了。管理模型常用命令ollama list查看本地已有模型列表ollama ps查看当前加载到内存的模型和显存占用ollama pull 模型名只拉取不运行ollama rm 模型名删除模型释放磁盘空间个人建议刚开始别贪大先把一个7B级别的模型跑通全链路后面再根据实际体验换更大或更小的。3.3 模型存放目录与跨盘坑Ollama默认把模型放在/usr/share/ollama/.ollama/models这是安装脚本自动创建的位置。如果你想换到其他Linux路径可以用环境变量OLLAMA_MODELS指定。这里有一个非常重要的原则模型目录不要放到/mnt/c/下面。WSL2访问Windows的NTFS分区底层是靠9P协议转换的速度远不如访问WSL自己的ext4虚拟磁盘。大模型文件动辄几个G读取时如果放在/mnt/c加载速度会肉眼可见地变慢。正确的做法是放在WSL内部的/home/你的用户名/models或者默认路径。查看磁盘占用df -h确认/路径空间充足。如果空间不够最基本的清理方式是删掉不用的模型。3.4 修改Ollama环境变量Ollama的几个常用环境变量必须解释清楚尤其是后面接Open WebUI时那些“连不上”的问题基本都出在这里。变量作用推荐设置OLLAMA_HOST监听地址默认127.0.0.1只本机用保持默认OLLAMA_MODELS模型保存目录按需修改放在Linux磁盘OLLAMA_KEEP_ALIVE模型在内存中保留时间30m或24hOLLAMA_NUM_PARALLEL并行处理请求数默认即可显存紧张就设1因为是通过systemd运行的环境变量不要直接写在/etc/environment里那样有时候不被加载。最稳的方式是创建一个systemd override目录sudo mkdir -p /etc/systemd/system/ollama.service.d sudo nano /etc/systemd/system/ollama.service.d/override.conf写入[Service] EnvironmentOLLAMA_KEEP_ALIVE30m改完要重新加载systemd配置sudo systemctl daemon-reload sudo systemctl restart ollamaOLLAMA_KEEP_ALIVE是经常被忽略的变量。默认情况下Ollama会在处理完一次请求后5分钟内把模型从内存中卸载。如果你连续对话每次都要重新加载模型响应间隔会长很多。设置成30分钟或更长体验会明显提升代价是内存占用一直居高不下。3.5 确认GPU加速是否生效如果你有NVIDIA显卡在WSL2里不需要额外安装Linux显卡驱动直接使用Windows侧的驱动即可。执行nvidia-smi如果正确输出显卡信息说明WSL2已经继承了Windows的GPU能力。接下来跑一个模型另开终端执行ollama ps在输出结果中查看PROCESSOR列如果是GPU说明推理确实跑在显卡上如果是CPU说明Ollama没有识别到显卡。常见原因是Windows显卡驱动版本太老。去NVIDIA官网下载支持WSL的驱动更新后重启。注意WSL2里的CUDA环境不需要你自己装CUDA ToolkitOllama自带了运行时别手欠去装Linux版CUDA搞坏了反而麻烦。4. 用Docker部署Open WebUI4.1 在WSL2里安装Docker我推荐直接用Ubuntu仓库里的Docker包虽然版本不是最新但对Open WebUI跑长时间服务来说足够稳定。执行sudo apt install -y docker.io sudo systemctl enable docker sudo systemctl start docker然后把当前用户加到docker组避免每条命令都得加sudosudo usermod -aG docker $USER加完后需要重新打开WSL终端让组权限生效。验证docker info如果显示Server Version说明Docker引擎正常。4.2 拉取Open WebUI容器Open WebUI官方镜像名是ghcr.io/open-webui/open-webui。这里要特别注意Ollama和Open WebUI的通信方式Open WebUI跑在容器里它默认访问localhost:11434但容器内部的localhost并不是你WSL系统的localhost而是容器自己。所以必须通过host.docker.internal这个特殊域名来访问宿主机上的Ollama。我先启动Ollama监听所有网卡接口编辑之前的override.confsudo nano /etc/systemd/system/ollama.service.d/override.conf改成[Service] EnvironmentOLLAMA_HOST0.0.0.0:11434 EnvironmentOLLAMA_KEEP_ALIVE30m重启sudo systemctl daemon-reload sudo systemctl restart ollama然后运行Open WebUI容器docker run -d \ -p 8080:8080 \ -v open-webui:/app/backend/data \ -e OLLAMA_BASE_URLhttp://host.docker.internal:11434 \ --add-hosthost.docker.internal:host-gateway \ --name open-webui \ --restart always \ ghcr.io/open-webui/open-webui:main逐条说一下这个命令的含义-p 8080:8080把容器8080端口映射到WSL的8080端口这样Windows浏览器就能通过localhost:8080访问。-v open-webui:/app/backend/data给容器挂一个叫open-webui的持久化数据卷用户账户、聊天记录、上传的文档都存在这里。容器删了再重建数据也还在。-e OLLAMA_BASE_URLhttp://host.docker.internal:11434让Open WebUI去找宿主机上的Ollama服务。--add-hosthost.docker.internal:host-gateway这是关键让容器内能解析host.docker.internal并指向宿主机。--restart alwaysDocker引擎重启后自动拉起这个容器配合systemd开机自启非常方便。首次拉取镜像可能比较慢因为镜像主体有2GB多根据网络情况等待时间不同。容器启动后docker logs -f open-webui等日志中看到类似Uvicorn running on http://0.0.0.0:8080一般就成功了。4.3 首次配置与模型联调浏览器访问http://localhost:8080第一次打开会要求注册账号。需要注意Open WebUI把注册出来的第一个用户设为管理员之后其他人再注册就是普通用户。所以你自己注册时要认真设置邮箱和密码管理员权限包括管理模型、查看系统信息、控制用户。登录后需要确认Ollama连接已经打通。进入设置页面找到“连接”或“Ollama连接地址”确认显示的是http://host.docker.internal:11434。如果配置正确模型下拉列表里会出现你已经下载的qwen2.5:7b。选一个模型随便输入一句“你好”能正常回复说明从浏览器到容器到Ollama再到模型的整条链路完全通了。在这个环境下页面上的“新建对话”和模型选择都打开WebUI自己管理。你可以调整温度、上下文长度等参数。多说一句不要追求大模型就一定更好7B模型在代码、逻辑题上表现可能不如一些专门微调的小模型。4.4 用pip方式作为备选如果因为网络原因Docker镜像拉不下来还有一个轻量备选方案直接在WSL2里用pip安装Open WebUI。pip install open-webui然后运行open-webui serve这种方式不用Docker启动时直接连Ollama默认端口也是8080适合临时用或者机器资源紧张。但我不推荐作为长期方案原因是Python环境依赖很容易因为升级而互相冲突而Docker容器把环境隔离得干干净净出了问题重拉镜像就好。5. 开机自启、内存限制与局域网访问5.1 让整套服务开机自动运行如果你希望Windows一开机不手动开终端也能自动访问Open WebUI可以这样处理。首先确保WSL2的systemd和Docker都已经设置成开机自启sudo systemctl enable ollama sudo systemctl enable docker容器已经设置了--restart always所以只要Docker引擎启动Open WebUI容器也会跟着起来。但问题在于WSL2并不是Windows一开机就自动启动的它通常需要你手动打开终端或者有进程调用wsl.exe才会激活。所以需要借助Windows的任务计划程序。创建一个新任务触发器设为“用户登录时”操作设为程序: wsl.exe 参数: -d Ubuntu-24.04 -u root -e bash -c sleep 15 systemctl restart ollama docker加sleep 15是为了等网络和硬盘就绪。设置完成后Windows登录后会调用WSL启动两个服务然后Docker会把它自己的open-webui容器拉起来。延迟十几秒再访问localhost:8080就可以了。5.2 控制内存和显存占用整个方案里内存是最大的瓶颈。我的经验是用.wslconfig给WSL分配12GB实际Ollama加载一个7B模型会占用4-5GBOpen WebUI容器大概1GBDocker缓存和系统本身占用1-2GB剩余空间足够。如果你同时加载多个模型内存会迅速吃紧所以ollama ps这个命令一定要养成习惯。查看当前内存占用htop如果内存接近极限最简单的止损方式是把OLLAMA_KEEP_ALIVE调回2m让模型尽快从内存卸载。如果频繁使用某个模型就让它常驻牺牲内存换响应速度。GPU显存方面Open WebUI本身不占显存Ollama加载模型时会把权重放到显存。7B Q4量化大约需要6GB显存8GB显存刚好运行。显存不够时会自动溢出到内存速度下降但不会崩溃。5.3 局域网其他设备访问默认情况下Windows本机能通过localhost:8080访问WebUI但手机、另一台电脑访问Windows的IP的8080端口可能不行因为WSL2默认是NAT网络Open WebUI实际监听的是WSL内部网络的IP。如果你只是想内网简单访问有两个办法。办法一启用WSL2的镜像网络模式。在.wslconfig里加[wsl2] networkingModemirrored重启WSL后Windows和WSL共享同一张网卡WSL里监听8080端口相当于Windows监听8080手机直接访问Windows的局域网IP加8080即可。这个模式对普通用户最简单。方法二用Windows的端口转发工具把Windows的8080转发到WSL的IP。以管理员打开PowerShellnetsh interface portproxy add v4tov4 listenport8080 listenaddress0.0.0.0 connectport8080 connectaddress172.x.x.x其中172.x.x.x是WSL的IP用wsl hostname -I查看。缺点是WSL的IP重启后会变每次要重新设置比较麻烦所以我还是推荐镜像网络模式。无论用哪种方式都别忘了Windows防火墙放行端口。管理员PowerShell执行netsh advfirewall firewall add rule nameOpen WebUI dirin actionallow protocolTCP localport8080如果只是Linux访问不用设置防火墙因为WSL内部和Windows之间的localhost转发机制是软件层完成的。5.4 数据备份思路Open WebUI的所有用户数据和聊天记录都存在open-webui这个Docker数据卷里。你要备份它就一句话docker run --rm -v open-webui:/data -v /home/你的用户名/backup:/backup ubuntu tar czf /backup/open-webui-backup.tar.gz -C /data .恢复时反向解包就行。Ollama模型重下很麻烦所以模型目录也建议备份至少做一次ollama list保存模型名清单以后重装时用脚本批量拉取。6. 常见问题与排查技巧实录6.1 Open WebUI一直提示“连接Ollama失败”这个问题的出现频率最高。排查顺序我建议这样第一步在WSL终端里确认Ollama在跑curl http://localhost:11434如果没反应先看systemd服务sudo systemctl status ollama第二步确认容器内部能访问宿主机Ollamadocker exec open-webui curl http://host.docker.internal:11434失败往往是因为你启动容器时忘记加--add-hosthost.docker.internal:host-gateway或者OLLAMA_BASE_URL写成了http://localhost:11434。把容器删掉按第4.2节的完整命令重新运行一遍。第三步如果前面都正常看Open WebUI日志docker logs --tail 50 open-webui日志里通常直接写着connection refused还是timeout能快速定位方向。6.2 WSL2重启后Ollama没起来多半是systemd没有真正启用。执行systemctl is-system-running如果输出的是offline或failed说明systemd没起来。确认/etc/wsl.conf里已经写了systemdtrue然后在Windows里执行wsl --shutdown重新进入。还有一类情况是Docker服务起来了但容器没起来。执行docker ps -a看open-webui的状态。如果显示Exited手动启动一下docker start open-webui长期稳定的方案是确保容器创建时加了--restart always。6.3 模型下载到99%卡住Ollama从公共模型仓库拉模型下载大文件时偶发中断这个体验确实不好。处理方法通常是删掉不完整的残留文件重新拉ollama rm qwen2.5:7b ollama pull qwen2.5:7b如果你网络本身不稳定建议先把OLLAMA_HOST环境变量调好减少重试时额外干扰。也可以换成小一点的模型比如qwen2.5:3b或llama3.2:3b先把链路跑通体验优化后再换大模型。6.4 WSL2磁盘文件越用越大WSL的虚拟磁盘文件是一个.vhd文件默认会随写入增长但删除文件后不会自动收缩。长期跑模型、下载Docker镜像后这个文件可能膨胀到几十GB。首先尝试WSL自带的稀疏化功能管理员PowerShell执行wsl --manage Ubuntu-24.04 --set-sparse true这会把VHD转换为稀疏文件删除的数据有机会真正归还磁盘。如果你的WSL版本不支持这个命令就手动压缩先关掉WSLwsl --shutdown然后管理员PowerShell执行diskpartdiskpart在diskpart里select vdisk fileC:\Users\你的用户名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu24.04LTS_*\LocalState\ext4.vhdx attach vdisk readonly compact vdisk detach vdisk路径里的星号代表随机后缀按实际目录填。这个操作能回收文件系统里的空闲空间。6.5 显卡没被识别跑模型慢得离谱先确认nvidia-smi在WSL里能不能用。如果提示找不到命令说明你的Windows驱动不兼容WSL。去NVIDIA官网下载“Game Ready”或“Studio”驱动装完后重启Windows再试。如果nvidia-smi正常但ollama ps显示模型跑在CPU上可能是Ollama版本太老或者模型文件本身没有可用的CUDA量化版本。先把Ollama更新到最新再重新拉模型。还有一点不要尝试在WSL里用apt安装nvidia-driverWSL2的GPU支持依赖Windows宿主机驱动Linux侧不应该装任何NVIDIA驱动包。装了反而可能冲突。6.6 Windows本机同时装了Ollama如果你以前在Windows上装过Ollama现在WSL里又装了一套默认二者都监听11434端口。在NAT模式下它们其实不冲突但Open WebUI如果访问host.docker.internal:11434它到底连到哪里取决于宿主网络栈实际容易连到Windows原生版本导致你在WSL里下载的模型和Windows里的模型分不清。我建议二者只保留一个。长期用WSL方案的话Windows原生Ollama卸载掉省得脑子混乱。6.7 端口被占用启动Docker容器时提示8080端口已被占用先查占用进程netstat -tlnp | grep 8080如果是别的服务占据给Open WebUI换个宿主机端口比如-p 8090:8080之后浏览器访问localhost:8090。如果想彻底一点sudo fuser -k 8080/tcp这条命令会杀死占用8080的进程慎用。7. 从能用到好用我的一点后续建议整套环境跑通只是第一步真正玩起来以后你会发现有几个特别值得继续深入的方向。一是多用户协作。Open WebUI天然支持多个账户管理员开通之后家里人或同事直接注册就能用不需要给他们每个人装Ollama和镜像。这比每个人自己装一套环境省太多了。二是RAG知识库。Open WebUI文件上传功能背后可以接Embedding模型放几份PDF或者Markdown进去它就能基于这些文档回答问题。不过要固定Embedding模型不然每次重新拉模型很费时间。三是API集成。Ollama本身提供了OpenAI兼容的/v1/chat/completions接口所以在WSL里跑的这套东西可以直接接日常用的脚本、IDE插件或者电报机器人。本地API的好处是没有网络延迟数据也不出机器。四是模型替换和微调。当你对7B模型不满意可以尝试14B甚至更大但先看显存够不够。也可以去社区找量化精度更高的GGUF文件配合Ollama的自定义Modelfile把温度、停止符这些参数一并在启动时就固化好。最后分享一个我自己踩过几次坑后总结的习惯每次改完系统配置先只改一个变量测试变更的影响再改下一个。比如调整OLLAMA_KEEP_ALIVE、容器端口、防火墙规则这三件事不要同时做否则出了问题你根本不知道是谁的锅。这套“WSL2 Ubuntu Ollama Open WebUI”组合虽然命令多但思路非常直接Linux做底座Ollama做大脑Open WebUI做脸面。按这个逻辑拆解遇到问题就没有想象中那么可怕了。