ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Windows CMD 下 mc 运维指南:SeaweedFS 安装验收与 MinIO 数据迁移

Windows CMD 下 mc 运维指南:SeaweedFS 安装验收与 MinIO 数据迁移

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 KeySecret Key
源端 MinIOhttp://10.0.0.10:9000MINIO_AKMINIO_SK
目标端 SeaweedFS S3http://10.0.0.20:8333SWFS_AKSWFS_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.exe

2.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 S3v4

3.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 1

4.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无报错
创建 Bucketmc mb成功
上传 / 下载mc cp成功,fc /b比对一致
元数据mc stat显示大小、ETag、Content-Type
分片上传mc cp1GB 文件成功
删除mc rm/mc rb成功
预签名mc share downloadURL 可下载

五、日常 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-logs

Bucket 命名规则: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.json

5.3 下载

:: 下载单个对象 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 查询与删除

:: 递归列出对象,并输出总数与总大小 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 迁移前检查

  1. 确认两端别名都可用

    mc ls minio mc ls seaweed
  2. 统计源端数据量,用于评估迁移耗时与目标端容量:

    mc ls --recursive --summarize minio/mybucket mc du minio/mybucket
  3. 确认 SeaweedFS 剩余容量充足(在 SeaweedFS 侧通过 Master UI 或weed shell的volume.list查看)。

  4. 规划停写窗口:如果业务持续写入 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/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,每行一个:

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.bat

6.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

阶段三:停写切换

  1. 业务停止向 MinIO 写入
  2. 最后执行一次增量同步:
    mc mirror --preserve --overwrite minio/mybucket seaweed/mybucket
  3. 执行一致性校验(见 6.5)
  4. 将业务配置中的 S3 Endpoint 和 AK/SK 切换为 SeaweedFS
  5. 观察业务运行一段时间,确认无误后再规划 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重新设置
SignatureDoesNotMatchAK/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
列出 Bucketmc ls seaweed
创建 Bucketmc mb seaweed/bucket
删除 Bucketmc 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 的全流程运维:

  1. 安装验收:用mc ls/mb/cp/stat/rm组成的脚本,几十秒内完成 S3 接口功能验证;
  2. 日常管理:Bucket 与对象的增删查改、批量上传下载、按时间清理;
  3. 数据迁移:mc mirror支持断点续传、增量同步和实时监听,配合mc diff与哈希抽样校验,可以安全、平滑地把 MinIO 数据迁移到 SeaweedFS。

最后提醒三点:别名务必开启--path on、不要对 SeaweedFS 使用mc admin、迁移前先--dry-run,删除前先确认。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进