Windows CMD 下 mc 运维指南:SeaweedFS 安装验收与 MinIO 数据迁移
面向 Windows 运维人员,介绍如何使用 MinIO Client(
mc.exe)验收SeaweedFS 的 S3 接口、管理 Bucket、上传和下载对象,以及将 MinIO数据迁移到 SeaweedFS。
一、背景与适用范围
SeaweedFS 内置 S3 兼容网关(默认端口8333),因此任何标准 S3 客户端都可以访问它。MinIO Client(mc)是一款跨平台、单文件、无需安装的 S3 命令行工具,非常适合在 Windows 服务器或运维跳板机上完成以下工作:
- 验证 SeaweedFS S3 接口是否可用(安装验收)
- 日常 Bucket / 对象管理
- 将存量 MinIO 数据迁移到 SeaweedFS,并做一致性校验
本文所有命令均在Windows CMD(命令提示符)下执行,不依赖 PowerShell 或 WSL。
示例环境约定(请按实际情况替换):
| 角色 | 地址 | Access Key | Secret Key |
|---|---|---|---|
| 源端 MinIO | http://10.0.0.10:9000 | MINIO_AK | MINIO_SK |
| 目标端 SeaweedFS S3 | http://10.0.0.20:8333 | SWFS_AK | SWFS_SK |
⚠️ 本文中的密钥均为占位符。生产环境请勿把真实密钥写进脚本或提交到代码仓库。
二、准备工作
2.1 下载 mc.exe
在浏览器中下载官方 Windows 版本:
https://dl.min.io/client/mc/release/windows-amd64/mc.exe也可以直接用 Windows 自带的curl(Windows 10 1803 及以上自带):
mkdir C:\tools\mc cd /d C:\tools\mc curl -o mc.exe https://dl.min.io/client/mc/release/windows-amd64/mc.exe2.2 加入 PATH
仅对当前 CMD 窗口生效:
set PATH=%PATH%;C:\tools\mc永久生效(对当前用户,重新打开 CMD 后生效):
setx PATH "%PATH%;C:\tools\mc"注意:
setx会把展开后的 PATH 截断到 1024 字符。如果 PATH 很长,建议通过“系统属性 → 环境变量”图形界面添加。
2.3 验证安装
mc --version能输出版本号即表示可用。
2.4 CMD 使用小贴士
| 问题 | 处理方式 |
|---|---|
| 中文文件名乱码 | 执行chcp 65001切换为 UTF-8 代码页 |
| 命令过长换行 | 行尾使用^续行 |
批处理中的% | 在.bat文件中写成%% |
| 路径含空格 | 用双引号包裹:"D:\my data\file.txt" |
| mc 配置文件位置 | 默认在%USERPROFILE%\mc\config.json,可用--config-dir指定 |
三、配置别名(alias)
mc通过“别名”管理多个 S3 端点。
3.1 配置 SeaweedFS 别名
mc alias set seaweed http://10.0.0.20:8333 SWFS_AK SWFS_SK --api S3v4 --path on参数说明:
seaweed:自定义别名,后续命令用它指代该端点--api S3v4:使用 S3 V4 签名--path on:强制使用 Path-Style 访问(http://host/bucket/object)。SeaweedFS 通常通过 IP 访问,不配置泛域名 DNS,建议显式开启
如果 SeaweedFS 前面挂了 HTTPS 且使用自签名证书,可在命令后追加全局参数--insecure跳过证书校验(仅限测试环境)。
3.2 配置 MinIO 别名
mc alias set minio http://10.0.0.10:9000 MINIO_AK MINIO_SK --api S3v43.3 查看与删除别名
mc alias list mc alias list seaweed mc alias remove seaweed安全提示:
mc alias list会显示 SecretKey,请勿在共享屏幕或录屏时执行。避免把密钥留在 CMD 历史中,可在执行mc alias set seaweed http://10.0.0.20:8333时不带密钥,mc 会交互式提示输入。
四、SeaweedFS 安装验收
SeaweedFS 部署完成后(例如通过weed server -s3 -s3.config=s3.json或独立的weed s3进程启动 S3 网关),建议按下面的清单逐项验收。
4.1 网络连通性
curl -I http://10.0.0.20:8333能收到 HTTP 响应(即使是403/400)就说明端口可达。如果超时,请检查 Windows 防火墙、安全组以及 S3 网关是否监听在正确的网卡上。
4.2 鉴权验证
mc ls seaweed- 正常:列出 Bucket(新集群可能为空,无输出且无报错)
Access Denied/SignatureDoesNotMatch:检查 AK/SK 是否与 SeaweedFS 的s3.json或weed shell中s3.configure的配置一致connection refused:S3 网关未启动或端口错误
4.3 读写全流程验收
建议把以下步骤保存为swfs_check.bat,一键执行:
@echo off chcp 65001 >nul setlocal set ALIAS=seaweed set BUCKET=acceptance-test set TESTFILE=%TEMP%\swfs_test.txt set DOWNFILE=%TEMP%\swfs_test_down.txt echo [1/7] 创建测试 Bucket mc mb %ALIAS%/%BUCKET% || goto :fail echo [2/7] 生成测试文件 echo SeaweedFS acceptance test %DATE% %TIME% > "%TESTFILE%" echo [3/7] 上传对象 mc cp "%TESTFILE%" %ALIAS%/%BUCKET%/check/test.txt || goto :fail echo [4/7] 查看对象元数据 mc stat %ALIAS%/%BUCKET%/check/test.txt || goto :fail echo [5/7] 下载对象并比对内容 mc cp %ALIAS%/%BUCKET%/check/test.txt "%DOWNFILE%" || goto :fail fc /b "%TESTFILE%" "%DOWNFILE%" >nul || goto :fail echo [6/7] 删除对象 mc rm %ALIAS%/%BUCKET%/check/test.txt || goto :fail echo [7/7] 删除测试 Bucket mc rb %ALIAS%/%BUCKET% || goto :fail del "%TESTFILE%" "%DOWNFILE%" 2>nul echo. echo ===== 验收通过 ===== exit /b 0 :fail echo. echo ===== 验收失败,请检查上一步输出 ===== exit /b 14.4 大文件与分片上传验收
S3 客户端对大于一定大小的文件会自动使用 Multipart Upload,需要单独验证:
fsutil file createnew %TEMP%\big_1g.bin 1073741824 mc mb seaweed/acceptance-big mc cp %TEMP%\big_1g.bin seaweed/acceptance-big/ mc stat seaweed/acceptance-big/big_1g.bin mc rm seaweed/acceptance-big/big_1g.bin mc rb seaweed/acceptance-big del %TEMP%\big_1g.bin
fsutil file createnew需要管理员权限;生成的是全零文件,仅用于验证分片流程和吞吐。
4.5 预签名 URL 验收(可选)
mc share download --expire 1h seaweed/mybucket/report.pdf把输出的 URL 粘到浏览器中,能下载即说明预签名功能正常。
4.6 验收清单汇总
| 检查项 | 命令 | 通过标准 |
|---|---|---|
| 端口可达 | curl -I http://host:8333 | 有 HTTP 响应 |
| 鉴权 | mc ls seaweed | 无报错 |
| 创建 Bucket | mc mb | 成功 |
| 上传 / 下载 | mc cp | 成功,fc /b比对一致 |
| 元数据 | mc stat | 显示大小、ETag、Content-Type |
| 分片上传 | mc cp1GB 文件 | 成功 |
| 删除 | mc rm/mc rb | 成功 |
| 预签名 | mc share download | URL 可下载 |
五、日常 Bucket 与对象管理
5.1 Bucket 操作
:: 创建 mc mb seaweed/app-logs :: 已存在时不报错(适合脚本) mc mb --ignore-existing seaweed/app-logs :: 列出所有 Bucket mc ls seaweed :: 查看 Bucket 容量 mc du seaweed/app-logs :: 删除空 Bucket mc rb seaweed/app-logs :: 强制删除 Bucket 及其中所有对象(危险操作!) mc rb --force seaweed/app-logsBucket 命名规则:3~63 个字符,仅限小写字母、数字、
-和.,不能以-开头或结尾。
5.2 上传
:: 上传单个文件 mc cp D:\data\report.pdf seaweed/docs/2026/report.pdf :: 上传整个目录(递归) mc cp --recursive D:\data\images\ seaweed/media/images/ :: 上传时指定 Content-Type mc cp --attr "Content-Type=application/json" D:\data\config.json seaweed/docs/config.json5.3 下载
:: 下载单个对象 mc cp seaweed/docs/2026/report.pdf D:\download\ :: 下载整个前缀(目录) mc cp --recursive seaweed/media/images/ D:\download\images\ :: 直接在终端查看文本对象内容 mc cat seaweed/docs/config.json5.4 查询与删除
:: 递归列出对象,并输出总数与总大小 mc ls --recursive --summarize seaweed/media :: 按名称查找 mc find seaweed/media --name "*.jpg" :: 查找 7 天前的对象 mc find seaweed/app-logs --older-than 7d :: 删除单个对象 mc rm seaweed/docs/old.txt :: 删除某个前缀下的所有对象 mc rm --recursive --force seaweed/app-logs/2025/ :: 删除 30 天前的对象(先用 --dry-run 预览) mc rm --recursive --force --older-than 30d --dry-run seaweed/app-logs mc rm --recursive --force --older-than 30d seaweed/app-logs5.5 关于mc admin的说明
mc admin系列命令(用户管理、服务重启、集群信息等)调用的是MinIO 私有管理 API,对 SeaweedFS 无效。SeaweedFS 的用户与权限请通过以下方式管理:
- S3 网关启动参数
-s3.config指定的 JSON 配置文件 weed shell中的s3.configure命令
同理,mc anonymous、mc ilm、mc replicate等高级功能在 SeaweedFS 上的支持程度取决于其版本,使用前请先在测试环境验证。
六、MinIO 数据迁移到 SeaweedFS
6.1 迁移前检查
确认两端别名都可用
mc ls minio mc ls seaweed统计源端数据量,用于评估迁移耗时与目标端容量:
mc ls --recursive --summarize minio/mybucket mc du minio/mybucket确认 SeaweedFS 剩余容量充足(在 SeaweedFS 侧通过 Master UI 或
weed shell的volume.list查看)。规划停写窗口:如果业务持续写入 MinIO,建议采用“全量 + 增量 + 短暂停写切换”的方式(见 6.4)。
6.2 单个 Bucket 迁移
:: 在目标端创建同名 Bucket mc mb --ignore-existing seaweed/mybucket :: 先演练,不实际传输 mc mirror --dry-run minio/mybucket seaweed/mybucket :: 正式迁移,保留对象属性(Content-Type、自定义元数据等) mc mirror --preserve minio/mybucket seaweed/mybucketmc mirror常用参数:
| 参数 | 作用 |
|---|---|
--dry-run | 仅显示将执行的操作,不实际传输 |
--preserve/-a | 保留对象属性与元数据 |
--overwrite | 目标端已存在但内容不同时覆盖 |
--remove | 删除目标端多余的对象(使两端完全一致,慎用) |
--watch/-w | 持续监听源端变化并实时同步 |
--exclude "*.tmp" | 排除匹配的对象,可多次指定 |
--newer-than 7d/--older-than 30d | 按对象时间过滤 |
--limit-upload 50M | 限制上传带宽,避免占满网络 |
--json | 以 JSON 格式输出,便于日志解析 |
mc mirror天然支持断点续传:中断后重新执行相同命令,已同步且未变化的对象会被跳过。
6.3 批量迁移多个 Bucket
使用mc ls的文本输出解析 Bucket 名称比较脆弱(受日期格式、时区影响),推荐维护一份 Bucket 清单文件buckets.txt,每行一个:
app-logs media docs backup批量迁移脚本migrate.bat:
@echo off chcp 65001 >nul setlocal EnableDelayedExpansion set SRC=minio set DST=seaweed set LIST=buckets.txt set LOGDIR=D:\migrate_logs if not exist "%LOGDIR%" mkdir "%LOGDIR%" for /f "usebackq tokens=* eol=#" %%B in ("%LIST%") do ( echo ================================================== echo [%DATE% %TIME%] 开始迁移 Bucket: %%B mc mb --ignore-existing %DST%/%%B mc mirror --preserve --overwrite %SRC%/%%B %DST%/%%B > "%LOGDIR%\%%B.log" 2>&1 if !ERRORLEVEL! neq 0 ( echo [%DATE% %TIME%] 迁移失败: %%B,详见 %LOGDIR%\%%B.log echo %%B>> "%LOGDIR%\failed.txt" ) else ( echo [%DATE% %TIME%] 迁移完成: %%B ) ) echo. echo 全部 Bucket 处理完毕。 if exist "%LOGDIR%\failed.txt" ( echo 以下 Bucket 迁移失败,请排查后重试: type "%LOGDIR%\failed.txt" ) endlocal要点:
eol=#表示清单中以#开头的行视为注释,可用于临时跳过某个 Bucket- 循环内读取
ERRORLEVEL需要开启延迟变量扩展,并写成!ERRORLEVEL! - 失败的 Bucket 会记录到
failed.txt,可以把它作为下一轮的清单重跑
如果需要在后台长时间运行且关闭窗口不中断,可以通过“任务计划程序”执行该脚本,或使用:
start "mc-migrate" /min cmd /c migrate.bat6.4 业务不停机迁移方案
对于持续有写入的 Bucket,推荐三阶段迁移:
阶段一:全量同步(业务正常运行)
mc mirror --preserve minio/mybucket seaweed/mybucket阶段二:增量追平(业务正常运行,可多次执行)
mc mirror --preserve --overwrite minio/mybucket seaweed/mybucket或者开启实时监听,持续同步新写入的数据:
mc mirror --preserve --overwrite --watch minio/mybucket seaweed/mybucket阶段三:停写切换
- 业务停止向 MinIO 写入
- 最后执行一次增量同步:
mc mirror --preserve --overwrite minio/mybucket seaweed/mybucket - 执行一致性校验(见 6.5)
- 将业务配置中的 S3 Endpoint 和 AK/SK 切换为 SeaweedFS
- 观察业务运行一段时间,确认无误后再规划 MinIO 下线
6.5 迁移后一致性校验
方法一:对比对象数量与总大小
mc ls --recursive --summarize minio/mybucket | findstr /C:"Total" mc ls --recursive --summarize seaweed/mybucket | findstr /C:"Total"两端的Total Size与Total Objects应一致。
方法二:使用mc diff列出差异对象
mc diff minio/mybucket seaweed/mybucket > diff_mybucket.txt输出为空表示两端一致;否则文件中会列出仅存在于一端、或大小不同的对象。mc diff基于对象名称和大小比较,不比对内容。
方法三:抽样内容校验
对关键对象下载后比对二进制内容:
mc cp minio/mybucket/path/key.dat %TEMP%\src.dat mc cp seaweed/mybucket/path/key.dat %TEMP%\dst.dat fc /b %TEMP%\src.dat %TEMP%\dst.dat或计算哈希值比对:
certutil -hashfile %TEMP%\src.dat SHA256 certutil -hashfile %TEMP%\dst.dat SHA256注意:不要直接用 ETag 判断一致性。分片上传对象的 ETag 与分片大小相关,两端分片策略不同时 ETag 可能不一致,但内容是相同的。
七、常见问题排查
| 现象 | 可能原因 | 处理建议 |
|---|---|---|
The specified bucket does not exist | 使用了 Virtual-Host 风格访问 | 别名加--path on重新设置 |
SignatureDoesNotMatch | AK/SK 错误,或客户端与服务端时间偏差过大 | 核对密钥;执行w32tm /resync同步时间 |
Access Denied | 该身份缺少对应权限 | 检查 SeaweedFSs3.json中的actions配置 |
x509: certificate signed by unknown authority | 自签名证书 | 测试环境追加--insecure,生产环境导入 CA 证书 |
mc admin ...报错 | SeaweedFS 不支持 MinIO 管理 API | 改用weed shell管理 |
| 中文对象名乱码 | CMD 默认代码页为 GBK | 执行chcp 65001 |
| 迁移中断 | 网络抖动或进程退出 | 重新执行相同的mc mirror命令,自动跳过已完成对象 |
| 迁移速度慢 | 小文件过多、带宽受限 | 多个 Bucket 并行执行;检查 SeaweedFS Volume Server 磁盘 I/O |
批处理里%被吞 | .bat中%需要转义 | 写成%% |
需要查看详细请求过程时,可加--debug全局参数:
mc --debug ls seaweed
--debug会输出 HTTP 请求头(含签名信息),排查完成后请勿将输出直接分享到公开渠道。
八、命令速查表
| 用途 | 命令 |
|---|---|
| 配置别名 | mc alias set seaweed http://host:8333 AK SK --api S3v4 --path on |
| 列出 Bucket | mc ls seaweed |
| 创建 Bucket | mc mb seaweed/bucket |
| 删除 Bucket | mc rb seaweed/bucket |
| 上传文件 | mc cp file.txt seaweed/bucket/ |
| 上传目录 | mc cp --recursive D:\dir\ seaweed/bucket/dir/ |
| 下载文件 | mc cp seaweed/bucket/file.txt D:\download\ |
| 查看元数据 | mc stat seaweed/bucket/file.txt |
| 统计 | mc ls --recursive --summarize seaweed/bucket |
| 删除对象 | mc rm seaweed/bucket/file.txt |
| 预签名链接 | mc share download --expire 1h seaweed/bucket/file.txt |
| 迁移演练 | mc mirror --dry-run minio/bucket seaweed/bucket |
| 正式迁移 | mc mirror --preserve minio/bucket seaweed/bucket |
| 增量同步 | mc mirror --preserve --overwrite minio/bucket seaweed/bucket |
| 实时同步 | mc mirror --preserve --overwrite --watch minio/bucket seaweed/bucket |
| 差异校验 | mc diff minio/bucket seaweed/bucket |
九、总结
借助一个mc.exe,Windows 运维人员无需安装任何额外环境,就能完成 SeaweedFS 的全流程运维:
- 安装验收:用
mc ls/mb/cp/stat/rm组成的脚本,几十秒内完成 S3 接口功能验证; - 日常管理:Bucket 与对象的增删查改、批量上传下载、按时间清理;
- 数据迁移:
mc mirror支持断点续传、增量同步和实时监听,配合mc diff与哈希抽样校验,可以安全、平滑地把 MinIO 数据迁移到 SeaweedFS。
最后提醒三点:别名务必开启--path on、不要对 SeaweedFS 使用mc admin、迁移前先--dry-run,删除前先确认。