MinIO 本身部署很简单,但日常运维——传文件、同步目录、清旧数据、查容量——都要靠它的官方客户端 mc。mc 兼容 S3 协议,MinIO、AWS S3、阿里云 OSS 都能管。这篇是我的实战笔记,参考了这份 mc 使用指南补充完善,按使用频率从高到低组织。
安装与配置
mc 是单二进制,下下来就能跑:
# Linux
curl -o /usr/local/bin/mc https://dl.min.io/client/mc/release/linux-amd64/mc && chmod +x /usr/local/bin/mc
# macOS
brew install minio/stable/mc
# 或者容器里临时用一次(不落地配置)
docker run --rm -it --entrypoint=/bin/sh minio/mc
mc --version # 验证
第一步永远是注册集群别名(alias),后面的命令都用别名指代集群:
mc alias set local http://127.0.0.1:9000 minioadmin minioadmin
# ^别名 ^服务地址 ^AccessKey ^SecretKey
mc alias ls # 看已配置的别名
mc alias remove local # 删除别名
mc admin info local # 验证连通性,顺便看集群概况
连接非 MinIO 的 S3 服务或个别老环境时,可能需要显式指定签名版本:mc alias set ... --api S3v4(S3v4 是常见默认)。
别把 AccessKey / SecretKey 写进公开仓库。生产环境走环境变量或 CI 密钥注入,并按需收缩账号权限。
日常操作速查
| 操作 | 命令 |
|---|---|
| 建桶 / 删空桶 | mc mb local/photos / mc rb local/photos |
| 看桶列表 / 递归列对象 | mc ls local / mc ls --recursive local/photos |
| 上传 / 下载 | mc cp app.tar.gz local/backup/ / mc cp local/backup/app.tar.gz ./ |
| 递归上传目录 | mc cp --recursive ./dist local/static/ |
| 远端桶间复制 | mc cp local/backup/app.log local/archive/app.log |
| 查看对象元数据 | mc stat local/backup/app.log |
| 直接看内容 / 看开头 | mc cat local/config/app.yaml / mc head local/backup/big.log |
| 比对两端差异 | mc diff ./data local/backup/data/ |
| 删除对象 | mc rm local/photos/old.png |
| 递归删整个前缀 | mc rm --recursive --force local/photos/2023/ |
| 看占用 | mc du local / mc du --depth 2 local |
| 按名字查找 | mc find local/photos --name "*.png" |
几乎所有子命令都支持 --json 输出,配 jq 做脚本解析很方便:
mc stat --json local/backup/app.log | jq '.size'
桶管理的几个实用参数
# 幂等创建:桶已存在也不报错,写进部署脚本里很合适
mc mb local/backup --ignore-existing
# 创建时指定区域
mc mb local/backup --region us-east-1
删桶有个高危操作单独强调:
# 强制删除桶及桶内全部内容,不可恢复,生产慎用
mc rb --force --dangerous local/backup
传输的细节参数
mc cp / mc mv 有几个容易忽略但很实用的参数:
--attr key=value:上传时附加自定义元数据(如缓存策略、内容类型)--continue:大文件传断了后续传,不用从头再来--newer-than 7d/--older-than 30d:按修改时间过滤,只传某时间窗的对象
同步(mirror)与比对(diff)
备份迁移的核心命令组合:
# 增量同步本地目录进桶(默认只增不删)
mc mirror --overwrite ./备份目录 local/backup/
# 同步前先看两端差异,心里有数再动手
mc diff ./备份目录 local/backup/
# 排除临时文件
mc mirror --overwrite --exclude "*.tmp" ./data local/backup/data/
# 加 --watch 持续监听,文件一变就同步(准实时热备)
mc mirror --watch ./logs local/log-backup/
# 严格镜像:目标端多出来的文件也删掉(慎用)
mc mirror --overwrite --remove ./data local/backup/data/
我的经验是:mirror 之前先 diff。diff 只读不写,把「将会发生什么」先看清楚,尤其是打算加 --remove 的时候。
清理旧数据
按时间过滤删除是定期清理任务的标配:
# 清理 30 天前的临时文件
mc rm --recursive --force --older-than 30d local/backup/tmp/
# 开了版本控制的桶,要删干净得加 --versions
mc rm --recursive --force --versions local/photos/2023/
预签名分享链接
不给人开账号,发文件/收文件都靠预签名 URL:
# 临时下载链接,24 小时有效
mc share download --expire 24h local/backup/report.pdf
# 临时上传链接,让对方往指定位置传文件
mc share upload --expire 7d local/incoming/
注意 --expire 最长 7 天,写更长会被截断。
匿名访问权限
按桶/前缀控制,四档策略:
| 策略 | 说明 |
|---|---|
download | 匿名可读可下载(静态资源桶常用) |
upload | 匿名可上传(一般不推荐) |
public | 匿名可读可写(极度危险,仅测试) |
none | 禁止匿名访问(默认,最安全) |
mc anonymous set download local/public-assets # 公开只读
mc anonymous set none local/private # 关闭匿名
mc anonymous list local # 查看各桶现状
find 进阶与 mc admin
mc find 不只是按名字找,还能按时间、大小过滤,甚至对结果执行命令:
mc find local/backup --name "*.log" --older-than 7d # 7 天前的日志
mc find local/backup --larger 100MB # 排查异常大文件
mc find local/logs --name "*.gz" --exec "mc rm {}" # 找到即处理
mc admin 是集群管理入口(需要管理员凭据的 alias):
mc admin info local # 集群状态、容量、在线节点
mc admin user add local reader pass123456 # 加用户
mc admin policy attach local readwrite --user reader # 授权
mc admin service restart local # 滚动重启
mc admin heal --recursive local # 触发修复(换盘之后)
常见问题
- Access Denied:先查 AccessKey/SecretKey,再查该账号对目标桶的 IAM/Policy 权限;还有一个隐蔽原因——服务器时间偏差太大会导致签名失败,确认 NTP 正常
- 路径写成
s3://bucket/...报错:mc 用的是ALIAS/BUCKET/OBJECT形式,不是 AWS CLI 的s3://写法 - HTTPS 自签名证书报错:测试环境可临时跳过校验,生产正确做法是把 CA 证书装进系统信任链
- 大文件上传中断:用
mc cp --continue续传,或改mirror增量同步;先mc du确认磁盘和桶配额充足
几个坑
- mirror 默认不删多余文件:源端删了的目标端还在,想完全一致必须显式加
--remove;加了--remove就有破坏性,先拿测试桶练手 - mc 和服务端版本要般配:太老的 mc 连新服务端会在 admin 子命令上报怪错,升级 mc 就好
mc rm --recursive --force没有回收站:删了就是删了,删之前先mc ls --recursive确认范围,或先 mirror 一份备份--force与--dangerous成对出现的地方都要当心:比如删非空桶,二次确认被跳过
小结
mc 的设计很「Unix」:ls、cp、rm、cat、du、find 一套照搬,学习成本约等于零。日常运维记住 alias set 起手、diff 先行、mirror 做同步、share 发链接、admin info 看集群,就覆盖了九成场景。剩下的翻翻 mc <命令> --help,自带的帮助写得相当清楚。