在 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 Port | 9000 | S3 端口 |
| Host | 127.0.0.1 | 改成0.0.0.0让局域网访问 |
| Console Port | 9001 | Web 控制台 |
| Access/Secret Key | rustfsadmin/rustfsadmin | 启动前必须改 |
数据目录旁会自动建一个logs目录放服务日志,数据目录下还有一个隐藏的.rustfs.sys文件夹放元数据。这些位置在 Launcher 的文档里写得很清楚,出问题排查时知道往哪看。两种形态共用同一组默认端口,同时启动会直接抢 9000,装了 Launcher 又想跑独立二进制时记得先关掉另一个,或者给后者换一组端口。
两条路径选哪条看用途:只是想跑起来看看 Launcher 最快,图形界面省掉环境变量和命令行参数的记忆成本;要写进脚本、放进 CI 或者需要精确控制启动参数的,独立二进制是唯一选择,Launcher 不提供命令行接口。
路径二,独立二进制(PowerShell)。从 rustfs releases 页下载rustfs-windows-x86_64-<version>.zip(1.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 `--address"127.0.0.1:9000"`--console-enable true `--console-address"127.0.0.1:9001"`"D:\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-ExclusionPath"D:\rustfs\data"Get-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 bucket:
scoop 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/windows,Launcher 仓库在 github.com/rustfs/launcher。Windows 原生路径的存在让"不想装 WSL"这件事有了官方支持的选择,虽然定位是开发与单机,但把这条路走通,很多开发场景的摩擦确实少了一层。