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 及以上自带):
bat
mkdir C:\tools\mc
cd /d C:\tools\mc
curl -o mc.exe https://dl.min.io/client/mc/release/windows-amd64/mc.exe
2.2 加入 PATH
仅对当前 CMD 窗口生效:
bat
set PATH=%PATH%;C:\tools\mc
永久生效(对当前用户,重新打开 CMD 后生效):
bat
setx PATH "%PATH%;C:\tools\mc"
注意:
setx会把展开后的 PATH 截断到 1024 字符。如果 PATH 很长,建议通过"系统属性 → 环境变量"图形界面添加。
2.3 验证安装
bat
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 别名
bat
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 别名
bat
mc alias set minio http://10.0.0.10:9000 MINIO_AK MINIO_SK --api S3v4
3.3 查看与删除别名
bat
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 网络连通性
bat
curl -I http://10.0.0.20:8333
能收到 HTTP 响应(即使是 403 / 400)就说明端口可达。如果超时,请检查 Windows 防火墙、安全组以及 S3 网关是否监听在正确的网卡上。
4.2 鉴权验证
bat
mc ls seaweed
- 正常:列出 Bucket(新集群可能为空,无输出且无报错)
Access Denied/SignatureDoesNotMatch:检查 AK/SK 是否与 SeaweedFS 的s3.json或weed shell中s3.configure的配置一致connection refused:S3 网关未启动或端口错误
4.3 读写全流程验收
建议把以下步骤保存为 swfs_check.bat,一键执行:
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 1
4.4 大文件与分片上传验收
S3 客户端对大于一定大小的文件会自动使用 Multipart Upload,需要单独验证:
bat
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 验收(可选)
bat
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 cp 1GB 文件 |
成功 |
| 删除 | mc rm / mc rb |
成功 |
| 预签名 | mc share download |
URL 可下载 |
五、日常 Bucket 与对象管理
5.1 Bucket 操作
bat
:: 创建
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-logs
Bucket 命名规则:3~63 个字符,仅限小写字母、数字、
-和.,不能以-开头或结尾。
5.2 上传
bat
:: 上传单个文件
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.json
5.3 下载
bat
:: 下载单个对象
mc cp seaweed/docs/2026/report.pdf D:\download\
:: 下载整个前缀(目录)
mc cp --recursive seaweed/media/images/ D:\download\images\
:: 直接在终端查看文本对象内容
mc cat seaweed/docs/config.json
5.4 查询与删除
bat
:: 递归列出对象,并输出总数与总大小
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-logs
5.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 迁移前检查
-
确认两端别名都可用
batmc ls minio mc ls seaweed -
统计源端数据量,用于评估迁移耗时与目标端容量:
batmc ls --recursive --summarize minio/mybucket mc du minio/mybucket -
确认 SeaweedFS 剩余容量充足 (在 SeaweedFS 侧通过 Master UI 或
weed shell的volume.list查看)。 -
规划停写窗口:如果业务持续写入 MinIO,建议采用"全量 + 增量 + 短暂停写切换"的方式(见 6.4)。
6.2 单个 Bucket 迁移
bat
:: 在目标端创建同名 Bucket
mc mb --ignore-existing seaweed/mybucket
:: 先演练,不实际传输
mc mirror --dry-run minio/mybucket seaweed/mybucket
:: 正式迁移,保留对象属性(Content-Type、自定义元数据等)
mc mirror --preserve minio/mybucket seaweed/mybucket
mc 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,每行一个:
text
app-logs
media
docs
backup
批量迁移脚本 migrate.bat:
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,可以把它作为下一轮的清单重跑
如果需要在后台长时间运行且关闭窗口不中断,可以通过"任务计划程序"执行该脚本,或使用:
bat
start "mc-migrate" /min cmd /c migrate.bat
6.4 业务不停机迁移方案
对于持续有写入的 Bucket,推荐三阶段迁移:
阶段一:全量同步(业务正常运行)
bat
mc mirror --preserve minio/mybucket seaweed/mybucket
阶段二:增量追平(业务正常运行,可多次执行)
bat
mc mirror --preserve --overwrite minio/mybucket seaweed/mybucket
或者开启实时监听,持续同步新写入的数据:
bat
mc mirror --preserve --overwrite --watch minio/mybucket seaweed/mybucket
阶段三:停写切换
-
业务停止向 MinIO 写入
-
最后执行一次增量同步:
batmc mirror --preserve --overwrite minio/mybucket seaweed/mybucket -
执行一致性校验(见 6.5)
-
将业务配置中的 S3 Endpoint 和 AK/SK 切换为 SeaweedFS
-
观察业务运行一段时间,确认无误后再规划 MinIO 下线
6.5 迁移后一致性校验
方法一:对比对象数量与总大小
bat
mc ls --recursive --summarize minio/mybucket | findstr /C:"Total"
mc ls --recursive --summarize seaweed/mybucket | findstr /C:"Total"
两端的 Total Size 与 Total Objects 应一致。
方法二:使用 mc diff 列出差异对象
bat
mc diff minio/mybucket seaweed/mybucket > diff_mybucket.txt
输出为空表示两端一致;否则文件中会列出仅存在于一端、或大小不同的对象。mc diff 基于对象名称和大小比较,不比对内容。
方法三:抽样内容校验
对关键对象下载后比对二进制内容:
bat
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
或计算哈希值比对:
bat
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 |
该身份缺少对应权限 | 检查 SeaweedFS s3.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 全局参数:
bat
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,删除前先确认。