跳到主要内容

MinIO 运维日常:mc 命令实战笔记

阅读需 5 分钟

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,自带的帮助写得相当清楚。