
在 Windows 机器上想跑一个 S3 兼容存储最常见的建议是装个 WSL里面跑 Linux 版。WSL 能解决问题但多了一层虚拟化、多了一套网络转发磁盘 I/O 也要跨层。RustFS 官方给了 Windows 原生的部署方式不用 WSL 就能跑但官方文档里有一句话划了明确的能力边界这些步骤是把 RustFS 作为桌面进程运行不是 Windows 服务。这句话决定了 Windows 原生方案适合什么场景、不适合什么场景。这篇把两条原生路径、各自的配置方式、以及想要开机自启怎么办都说清。两条路径图形 Launcher 与独立二进制RustFS 官方 Windows 安装页docs.rustfs.com/en/installation/windows给出的两条路路径一RustFS Launcher图形界面。从 GitHub 的 launcher releases 页下载rustfs-launcher-windows-x86_64-version-setup.exe约 50 MB双击安装。安装位置是%LOCALAPPDATA%\RustFS Launcher只装给当前用户不需要管理员权限。Launcher 启动后要填的核心配置配置项默认值说明Data Path无默认值唯一必填项对象和元数据都放这里API Port9000S3 端口Host127.0.0.1改成0.0.0.0让局域网访问Console Port9001Web 控制台Access/Secret Keyrustfsadmin/rustfsadmin启动前必须改数据目录旁会自动建一个logs目录放服务日志数据目录下还有一个隐藏的.rustfs.sys文件夹放元数据。这些位置在 Launcher 的文档里写得很清楚出问题排查时知道往哪看。两种形态共用同一组默认端口同时启动会直接抢 9000装了 Launcher 又想跑独立二进制时记得先关掉另一个或者给后者换一组端口。两条路径选哪条看用途只是想跑起来看看 Launcher 最快图形界面省掉环境变量和命令行参数的记忆成本要写进脚本、放进 CI 或者需要精确控制启动参数的独立二进制是唯一选择Launcher 不提供命令行接口。路径二独立二进制PowerShell。从 rustfs releases 页下载rustfs-windows-x86_64-version.zip1.0.1-preview.11 的 zip 约 100 MB解压出rustfs.exe后直接跑New-Item-ItemType Directory-Force-Path C:\rustfs\binNew-Item-ItemType Directory-Force-Path D:\rustfs\dataExpand-Archive-Path$HOME\Downloads\rustfs-windows-x86_64-version.zip-DestinationPath C:\rustfs\bin-ForceSet-LocationC:\rustfs\bin$env:RUSTFS_ACCESS_KEY your-access-key$env:RUSTFS_SECRET_KEY your-secret-key.\rustfs.exe server --address127.0.0.1:9000--console-enable true --console-address127.0.0.1:9001D:\rustfs\data官方文档在最后加了一句Keep the PowerShell window open while RustFS is running关掉窗口服务就停。这是桌面进程形态的直接后果。端口、凭据与默认值的坑三个默认值要单独说因为它们直接影响安全Host 默认127.0.0.1意味着只有本机能访问这是个安全的默认。想给局域网用要显式改成0.0.0.0改完记得 Windows 防火墙放行 9000/9001 两个端口不然局域网照样连不上。Access/Secret Key 默认rustfsadmin/rustfsadmin。Launcher 的文档里也承认这是默认值并且强调要在启动前改掉。这条跟 Linux 侧的纪律一致rc 起服务必须显式设置 ACCESS/SECRET_KEY用默认凭据的实例暴露在网络上等于开着门。凭据的写法也有个 Windows 特有的坑PowerShell 里$env:RUSTFS_ACCESS_KEY只在当前会话有效窗口关掉就没了。要长期用得用setx或[Environment]::SetEnvironmentVariable写进用户/系统环境变量写完之后新开的窗口才会带上。这里有个长度陷阱值得单独说setx写入的值有 1024 字符上限超出的部分会被直接裁掉命令照常返回成功、不报错。密钥本身够不到这个长度但把一长串配置塞进同一个变量时就容易踩中故障表现是认证莫名其妙失败、凭据看起来又确实写进去了。要长期保留又不想踩这个坑更稳的做法是把启动脚本放在本地、每次拉起时用$env:注入脚本里不落明文也就没有共享出去的风险。RustFS 仓库里的配置模块声明支持 TOML、YAML、JSON、ENV 多种格式但 Windows 官方安装页给出的示例全部是命令行参数加环境变量配文件这条路官方没在 Windows 上演示过照官方示例跑通之后再考虑扩展。数据路径默认空。Launcher 的 Data Path 是唯一必填项这个设计防止了数据写到用户目录里找不到的情况。选数据目录时注意别选到系统盘的用户目录下面大容量存储会很快吃满 C 盘。还有一条官方说明的硬件边界Launcher 当前只捆绑了 Windows x86-64 的 RustFS 二进制ARM 版 Windows 能通过 x86 模拟跑 x86_64 构建但没有原生 ARM 包。这层兼容性在 Intel Mac 转 Windows ARM 之类的机器上会碰到。性能上模拟层会有损耗重度使用的话建议确认一下模拟开销能不能接受或者等官方出原生 ARM 构建。数据目录的选盘也有讲究。对象存储是顺序写加随机读混合负载机械盘和 SSD 都能跑但数据目录和系统盘通常是 C分开是基本纪律一是容量可控二是系统重装时数据目录不动。如果用 Windows 的动态磁盘或存储空间做冗余注意.rustfs.sys元数据目录跟数据目录在同一卷里卷损坏时元数据和数据一起丢做备份策略时要按这个粒度规划。还有一层容易搞混的地方Windows 存储空间是操作系统层面的软 RAID镜像或奇偶校验都在同一台机器的卷内部完成操作系统一旦挂掉整个卷一起没。它和 RustFS 自身的纠删码是两回事后者按对象切片计算冗余、跨节点分布前者的冗余封闭在同一台机器的卷内。想拿双盘镜像去补单机不可靠等于把整台机器的命运压在一块主板上。数据目录上的两个隐性开销NTFS 文件锁与 Defender 扫描数据目录落在 NTFS 上有两件事在 Linux 上不会出现跑久了就会碰到。一是文件锁。RustFS 是桌面进程形态进程被强杀任务管理器结束进程、蓝屏、直接关掉控制台窗口之后它当时占着的文件和目录句柄不会立刻释放Windows 上的常见表现是这些文件删不掉、改不了名、移不走要重启才能清干净。崩溃之后卷还可能被标脏下次开机要多过一遍 chkdsk。测试时反复启停尤其明显停完之后确认端口已经释放再起下一个实例能少掉一半起不来的假故障。二是 Windows Defender 的实时扫描。实时保护要对每个被访问的文件过一遍数据目录里小对象越多、写入越频繁MsMpEng.exe 的开销越显眼读写延迟里会出现平时看不到、压测时又被误判成磁盘性能差的毛刺。微软自己在 Defender 的扫描最佳实践里也把排除某些位置列为缩短扫描时间的手段。做压测或批量写入之前先按 PowerShell 命令把数据目录加进排除列表能省掉一大截噪声Add-MpPreference-ExclusionPathD:\rustfs\dataGet-MpPreference|Select-ObjectExclusionPath排除目录等于放弃这一目录的实时检测只加自己完全可控的数据目录不要图省事把整个盘加进去。为什么官方不做 Windows 服务RustFS 官方文档明确写了这条边界These procedures run RustFS as a desktop process, not as a Windows service. For a production or distributed deployment, use the Linux installation guides。这句生产或分布式部署请走 Linux把能力范围划得很清楚背后的原因不难推分布式对象存储对进程管理的要求自动重启、健康检查、节点发现、优雅退出在 Windows 服务模型里要么实现复杂要么需要额外的编排层。官方选择把精力集中在 Linux 侧Windows 侧定位为开发、测试和单机使用。这个定位对使用者意味着三件事开发场景完全够用本地起一个 S3 兼容存储跑集成测试、开发时存测试数据Launcher 一键搞定单机个人用途可行个人数据备份、家庭照片存储这种单机场景Launcher 加开机启动脚本就能满足生产别用多节点、高可用、数据可靠性要求高的场景官方已经明说了走 Linux还有一层差异是运维知识的迁移成本。Linux 侧那一套换盘流程、XFS 格式化参数、纠删集调优经验在 Windows 上要么不适用没有 XFS要么得换成 NTFS 的对应做法官方文档也没覆盖这一层。也就是说 Windows 原生路径不只是进程形态不同连同配套的运维手册都要重新写一份。规模小的时候这不算什么规模上去之后这层成本会显现出来。补一个和 WSL 方案的对比角度帮助决定要不要留在原生路径。WSL 里跑的 Linux 版 RustFS 可以用 systemd、可以做分布式多节点多个 WSL 实例互联这些是原生路径做不到的但 WSL 的网络是 NAT从局域网访问 WSL 里的服务要做端口转发Windows 重启后 WSL 的 IP 可能变端口转发规则要跟着改。单机场景下原生路径省掉的就是这层网络转发访问127.0.0.1:9000就是真实的 Windows 端口没有中间层。真要走 WSL先确认装的是 WSL 2。WSL 1 用的是系统调用翻译层而不是独立内核Linux 二进制在它下面跑要多走一层转换微软自己的版本对比文档把文件 IO 性能提升列为 WSL 2 的主要收益并建议默认用 WSL 2。例外只有一种数据必须放在 Windows 文件系统上时WSL 1 访问挂载盘更快。跑对象存储时数据目录在 Linux 侧这条例外用不上。装完用wsl -l -v确认当前版本号旧环境停在 WSL 1 的情况并不少见。想要开机自启怎么办官方没提供 Windows 服务注册的方式但桌面进程形态有几种变通做法各有代价方案一启动文件夹放快捷方式。把rustfs.exe的快捷方式带上启动参数放到shell:startup文件夹用户登录后自动启动。缺点是要用户登录才触发服务器场景不适用。方案二任务计划程序。用schtasks或图形界面建一个启动时触发的任务勾不管用户是否登录都要运行。这条更接近服务行为但 RustFS 进程跑在哪个会话、环境变量怎么传都要自己处理。方案三用第三方工具封装成 Windows 服务NSSM、WinSW 之类。这类工具会把一个控制台程序包装成 Windows 服务自动重启、日志重定向都带上。这里要分清包装和支持两件事官方只说了桌面进程形态没有提过对服务控制协议的适配而包装层替你做的事里最后一步最值得看。以 NSSM 为例收到停止命令后它依次尝试给控制台发 Control-C、给窗口发 WM_CLOSE、给线程发 WM_QUIT每一档默认只等 1500 毫秒都不奏效就调 TerminateProcess 强杀而这一步进程没有任何机会做收尾。RustFS 有没有注册控制台事件处理官方文档没有写也就不能假定它能在 1.5 秒内干净退出。代价是多一层工具依赖升级 RustFS 时封装层要重新确认包装成服务也不改变官方给的能力边界多节点高可用照样不在 Windows 原生方案里。开机自启还有一个时序问题容易被忽略如果数据目录在另一块盘上比如 D 盘是可移动盘或加密盘启动任务可能跑在盘就绪之前RustFS 起来发现目录不存在就退出了。任务计划里加延迟启动或者在启动脚本里先探测目录存在再拉起进程能避开这类偶发失败。三种方案都属于官方没做但社区有办法配的时候要接受一个事实遇到问题时这些方案不在官方支持范围内。生产环境还是那句话走 Linux。顺带一提如果只是想要 CLI 工具rc命令而不是服务端RustFS 有官方的 scoop bucketscoop bucket add rustfs https://github.com/rustfs/scoop-bucket scoop install rustfs/rc这条路是官方维护的装 CLI 不涉及服务形态问题。拿到两条路径之后真正影响选择的是这几个维度什么场景该选 Windows 原生按场景对号入座本机开发、跑集成测试Launcher 最省事图形界面点几下就有 S3 端点单机个人存储、家庭备份独立二进制加启动文件夹方案一台机器管自己CI/Windows Runner独立二进制加任务计划跑完测试必须显式终止rustfs.exe。上一轮的进程会一直占着 9000下一轮流水线启动时端口冲突直接失败。Windows Runner 上把停止动作写进 job 的收尾步骤比指望进程自己退出可靠Get-Processrustfs-ErrorAction SilentlyContinue|Stop-Process-Force生产、分布式、高可用不在 Windows 原生方案的能力范围走 Linux 部署单机场景也别忘了备份。Windows 这台机器上的数据目录是单点盘坏了就没了用mc mirror定期把图床或测试数据同步到另一台 Linux 上的 RustFS 实例成本不高但能把单机这个定位的风险补掉一大半。RustFS 在 Apache 2.0 许可下开源Windows 安装文档在 docs.rustfs.com/en/installation/windowsLauncher 仓库在 github.com/rustfs/launcher。Windows 原生路径的存在让不想装 WSL这件事有了官方支持的选择虽然定位是开发与单机但把这条路走通很多开发场景的摩擦确实少了一层。