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 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 迁移前检查

  1. 确认两端别名都可用

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

    bat 复制代码
    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 迁移

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

阶段三:停写切换

  1. 业务停止向 MinIO 写入

  2. 最后执行一次增量同步:

    bat 复制代码
    mc mirror --preserve --overwrite minio/mybucket seaweed/mybucket
  3. 执行一致性校验(见 6.5)

  4. 将业务配置中的 S3 Endpoint 和 AK/SK 切换为 SeaweedFS

  5. 观察业务运行一段时间,确认无误后再规划 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 的全流程运维:

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

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

相关推荐
刚入门的大一新生1 小时前
Linux-信号
linux·运维·服务器
车软学堂1 小时前
CANoe自动化:跑起第一个测试用例
运维·车载系统·自动化·汽车·测试用例
L0208243 小时前
Kubernetes Ingress|CNI 网络模型|Calico 网络策略|Pod 调度器完整实战教程
运维·网络·云原生·容器·kubernetes
考拉讲支付5 小时前
延迟分账 / 核销分账的技术实现方案:服务完成后再分钱,到底怎么设计?
大数据·运维·人工智能·微信小程序·小程序·系统架构
ADAI_Bowen5 小时前
写文章 - 知乎
大数据·运维·人工智能
keren25 小时前
SceneDock:Windows 场景化工作台——一键启动工作链,还能被 AI Agent 调用(CLI / MCP)
windows·开发工具·效率工具·mcp
云宏信息6 小时前
超融合和存算分离怎么选?从性能、可靠性、扩展、成本四个维度讲述如何精准匹配架构选型 | 附企业降本轻量云方案
运维·服务器·架构·云计算
咸鱼梦想家π7 小时前
Linux开发工具(下)
linux·运维·服务器