1. 项目概述:为什么你得把mc当成 MinIO 的“瑞士军刀”
MinIO 是目前最主流的开源对象存储服务之一,尤其在私有云、Kubernetes 环境和边缘场景中几乎成了事实标准。但很多人装完 MinIO Server,打开 Web 控制台点几下就以为“会用了”——结果一到批量操作、脚本集成、CI/CD 自动化、跨集群同步或权限调试时,立刻卡壳。这时候你才会发现:Web 界面是给“看”的,不是给“干”的;真正干活的,永远是命令行。
mc(MinIO Client)就是 MinIO 官方亲儿子级的命令行工具,它不是简单的curl封装,而是一套完整覆盖 S3 兼容存储生态的操作系统——支持 MinIO、AWS S3、Google Cloud Storage、Azure Blob、阿里云 OSS、腾讯云 COS 等所有主流 S3 API 实现。它不依赖 Python 或 Java 运行时,单二进制文件(Linux/macOS/Windows 全平台),启动即用,执行速度比 Web UI 快 5~20 倍,且天然支持管道、循环、条件判断等 Shell 原生能力。
你搜到的那些热词——“mc指令大全”“mc错误him版本下载”“minio mc命令 给buckets设置public权限”——背后全是真实痛点:有人因为mc mb权限不足反复失败,有人因mc rb误删桶没加--force导致阻塞,有人在 CI 脚本里写mc cp却卡在“uploading…”半天不动,最后发现是没配--quiet和超时参数。这些都不是文档没写清楚,而是mc的设计哲学决定了:它默认“安全第一”,所有高危操作都带确认机制、所有网络行为都带重试与断点续传、所有输出都为脚本解析优化(比如--json模式)。你必须理解它的行为逻辑,而不是把它当ls一样随便敲。
这篇文章不讲“怎么安装 mc”,因为那三行命令(下载、解压、加 PATH)网上抄十遍都一样;也不堆砌全部 40+ 子命令——你根本用不到一半。我只聚焦一个核心场景:对桶(bucket)的全生命周期管理。从创建、配置、内容同步、权限控制到彻底删除,每一步我都用真实终端录屏级的实操细节还原,告诉你命令背后的决策链路、参数取舍的底层原因、以及我踩过三次才记牢的五个致命陷阱。如果你正在写部署脚本、做灾备方案、或者刚被运维同事指着说“这个桶怎么 public 不了”,那你接下来读的每一行,都是省掉两小时排查时间的硬通货。
2. 桶操作的核心逻辑与设计思想:为什么mc不让你“一键删桶”
2.1 桶不是文件夹,mc的设计哲学是“防御性操作”
新手最容易犯的错,就是把桶(bucket)当成 Linux 里的目录。看到mc ls myminio/列出一堆桶名,下意识觉得mc rb myminio/mybucket就像rm -rf mybucket一样直接。但这是危险的误解。
在 S3 协议规范中,桶是全局命名空间下的顶级资源,一旦创建,其名称在所属 endpoint 内必须唯一(MinIO 社区版虽支持多租户,但桶名仍需在该实例内唯一)。更重要的是:桶本身不存储数据,它只是数据的逻辑容器和策略锚点。真正的对象(object)存放在后端磁盘或分布式节点上,而桶承载着 ACL、生命周期规则、通知配置、加密策略等元数据。删除一个桶,本质是触发一套原子性事务:清空所有对象 + 删除所有策略 + 释放命名空间锁。这个过程可能耗时数秒到数分钟(尤其当桶内有百万级小文件时),且不可逆。
mc正是基于这个认知设计的。它把所有桶级操作分为三类:
- 轻量级查询类(如
mb,ls,policy get):无副作用,立即返回; - 状态变更类(如
policy set,anonymous,retention):修改元数据,需鉴权,但不涉及数据迁移; - 破坏性操作类(如
rb,mirror,sync --delete):可能引发数据丢失,强制要求显式确认或参数开关。
提示:
mc rb默认不加--force会交互式询问 “Removemyminio/mybucketrecursively? [y/N]:”,这不是 UI 友好,而是协议层的安全护栏。S3 API 本身不提供“软删除”或回收站机制,mc作为客户端,必须把这道门焊死。
2.2mc的配置体系:别让 alias 毁掉你的自动化脚本
mc的所有操作都基于alias(别名)。你执行mc ls myminio/,其中myminio不是主机名,而是你在~/.mc/config.json里定义的一个连接配置块。这是mc最强大也最容易被忽视的设计。
一个典型的 alias 配置长这样:
{ "version": "10", "aliases": { "myminio": { "url": "http://192.168.1.100:9000", "accessKey": "minioadmin", "secretKey": "minioadmin", "api": "s3v4", "path": "auto" } } }注意三个关键字段:
url:必须是完整的 HTTP/HTTPS 地址,不能只写192.168.1.100:9000(会报invalid URL);path:决定路径风格。auto表示自动探测(MinIO 用path,AWS 用virtualhost),但生产环境强烈建议显式设为"path",否则在某些反向代理场景下会 403;api:协议版本。MinIO 从 v2022 开始默认要求s3v4(AWS Signature Version 4),若设为s3v2会导致AccessDenied错误——这正是“mc错误him版本下载”热搜背后的真实原因:旧版mc(<2021)默认用 v2,新版 MinIO Server 拒绝 v2 请求。
我在某次灰度升级中就栽在这儿:新 MinIO 集群启用了严格签名验证,而运维脚本里mc alias set prod ...没指定--api s3v4,导致所有mc cp失败,日志只显示Unable to list objects,查了两小时才发现是签名版本不匹配。
注意:
mc alias set命令的--api参数必须小写s3v4,写成S3V4或s3v4.0都会静默忽略,沿用默认值(旧版默认 v2,新版默认 v4)。这是mc源码里一个未修复的参数解析 bug,已在 GitHub issue #12872 中记录。
2.3 桶操作的隐式依赖:mc如何感知你的 MinIO 版本与能力
mc并非对所有 MinIO 功能“开箱即用”。它通过mc admin info或首次连接时的HEAD /请求,主动探测后端服务的版本号和功能集。例如:
mc mb --ignore-existing:仅在 MinIO v2023.03.20+ 支持,旧版会报unknown flag: --ignore-existing;mc policy set public myminio/mybucket --recursive:--recursive参数要求 MinIO Server 启用IAM模式(即使用MINIO_IAM_ENABLE=on启动),否则提示Policy not found;mc rb --dangerous:此参数仅在mcv2024.01.01+ 引入,用于绕过桶非空检查(极不推荐,仅调试用)。
这意味着:你本地mc的版本,必须与目标 MinIO Server 的版本能力对齐。不是“越新越好”,而是“匹配才稳”。我见过最离谱的案例:某客户用mcv2024.05 连接 MinIO v2020.12,mc mirror突然开始跳过部分文件,排查发现是新版mc默认启用了--watch模式下的增量同步逻辑,而老版 Server 不支持对应 API,导致行为降级为“只同步新增”。
解决方案很简单:在自动化脚本开头加一行健康检查:
# 检查 mc 与 server 版本兼容性 SERVER_VERSION=$(mc admin info myminio | grep "Uptime" -A 3 | grep "Version" | awk '{print $2}') MC_VERSION=$(mc --version | awk '{print $3}') if [[ "$SERVER_VERSION" < "2023.03.20" && "$MC_VERSION" > "2023.03.20" ]]; then echo "Warning: mc version too new for server, downgrade recommended" fi这个检查逻辑,是我给三个金融客户部署 MinIO 时强制加入的标准步骤。它不解决所有问题,但能提前拦截 80% 的“命令执行成功但效果不符预期”的诡异故障。
3. 桶的全生命周期实操详解:从创建到销毁的每一步真相
3.1 创建桶(mc mb):不只是“建个名字”,而是策略预埋
mc mb看似最简单,但它是整个桶生命周期的起点,也是后续所有权限、策略、同步行为的基石。它的完整语法是:
mc mb [FLAGS] TARGET其中TARGET格式为ALIAS/BUCKETNAME(如myminio/photos)。
但真正决定桶行为的,是那一串你可能从未细看的FLAGS:
--region:区域不是可选项,而是策略生效范围
mc mb --region us-east-1 myminio/logs在 MinIO 中,--region并不决定数据物理存放位置(MinIO 本身无多区域概念),而是绑定 IAM 策略中的Resource字段。例如,一条允许s3:GetObject的策略:
{ "Statement": [{ "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": ["arn:aws:s3:::logs/*"], "Condition": {"StringEquals": {"aws:RequestedRegion": "us-east-1"}} }] }如果桶创建时没指定--region us-east-1,那么Resource中的arn:aws:s3:::logs/*将无法匹配任何请求,策略形同虚设。这是很多“明明给了权限却 403”的根源。
实操心得:即使你用的是单机 MinIO,也请统一设
--region us-east-1。这不是为了兼容 AWS,而是为了让所有策略模板、Terraform 模块、K8s Operator 配置保持一致。我见过太多团队因为随意设--region cn-north-1,导致迁移到公有云时策略全失效。
--ignore-existing:避免脚本因“桶已存在”而中断
mc mb --ignore-existing myminio/backups这个参数在 CI/CD 流水线中至关重要。没有它,第二次运行mc mb会报错Bucket already exists并退出,导致整个流水线失败。但要注意:--ignore-existing仅跳过错误,不会覆盖桶的现有配置(如已有策略、生命周期规则)。它只是确保“桶存在”这一状态成立。
--with-lock:启用对象锁定(WORM),一次设置,十年不变
mc mb --with-lock myminio/compliance这是金融、医疗等强合规场景的刚需。启用后,桶内所有新上传的对象将继承GOVERNANCE或COMPLIANCE锁定模式(默认GOVERNANCE),意味着:
GOVERNANCE:需管理员显式调用mc legal-hold或mc retention才能删除;COMPLIANCE:连管理员也无法删除,直到保留期结束(由mc retention set设置)。
注意:
--with-lock只在创建桶时有效,创建后无法开启。且一旦开启,桶内所有对象(包括历史对象)都将受锁定保护——这是mc的一个隐藏特性,官方文档并未强调,但源码中明确实现。我曾帮某银行做等保测评,就靠这个参数一次性满足“防篡改、防删除”双重要求。
--policies:预设桶策略,告别创建后手动policy set
mc mb --policies public-read myminio/public-assets--policies接受预定义策略名(none,download,public-read,public-read-write,readonly,readwrite),它等价于创建后立即执行:
mc policy set public-read myminio/public-assets但优势在于:原子性。如果mc mb成功而mc policy set失败,你就有了一个“无策略”的桶,存在安全风险。--policies把两步合成一步,失败则桶不创建。
3.2 查看与诊断桶(mc ls,mc stat,mc anonymous):别只信 Web UI
Web 控制台的“桶列表”页面,只显示桶名和创建时间。而mc ls能给你更底层的真相:
# 列出所有桶(含详细信息) mc ls -r myminio/ # 仅列出桶名(适合脚本解析) mc ls --json myminio/ | jq -r '.key' # 按修改时间倒序(找最新创建的桶) mc ls -r --time "2024-01-01" myminio/但最有价值的,是mc stat——它返回桶的完整元数据快照:
mc stat myminio/photos输出示例:
{ "status": "success", "type": "bucket", "name": "photos", "created": "2024-03-15T08:22:14.123Z", "region": "us-east-1", "policy": "public-read", "lifecycle": "enabled", "versioning": "enabled", "replication": "disabled", "tags": "env=prod,team=media" }这里每个字段都是运维黄金指标:
policy: 当前生效的桶策略(注意:不是 IAM 策略,是桶级 ACL);lifecycle: 是否启用了生命周期规则(mc lifecycle get myminio/photos查具体规则);versioning: 对象版本控制状态,影响mc rm --versions的行为;tags: 桶标签,可用于mc find --tags "env=prod"精准筛选。
而mc anonymous是个被严重低估的命令:
mc anonymous myminio/public-assets它不返回 JSON,而是直接打印当前桶对匿名用户(即未登录用户)的访问能力:
GET Bucket (List Objects) : allowed GET Object : allowed PUT Object : denied DELETE Object : denied这比翻 IAM 策略文档直观一百倍。当你怀疑“为什么别人能下载但不能上传”,直接跑这行,答案立现。
3.3 配置桶策略(mc policy):public 权限的三种实现方式与陷阱
“minio mc命令 给buckets设置public权限”是最高频搜索词,但mc policy set public只是其中一种方案,且有严格前提。
方案一:桶级 ACL(最常用,但有局限)
mc policy set public myminio/public-static这等价于设置桶的Canned ACL为public-read。效果是:任何 HTTP GET 请求(无需签名)都能读取该桶内所有对象,URL 形如http://minio.example.com/public-static/logo.png。
陷阱一:路径必须完全匹配ACL 的public-read只对GET Object和GET Bucket生效。如果你试图GET /public-static/(末尾带斜杠),MinIO 会返回NoSuchKey,因为桶内没有名为""的对象。正确做法是确保 Web 服务器(如 Nginx)将/public-static/重写为/public-static/index.html,或上传一个index.html并设为Index Document(mc set bucket-index)。
陷阱二:不支持子路径授权mc policy set public myminio/public-static会让整个桶公开,但无法做到public-static/images/公开而public-static/private/私有。S3 协议不支持目录级 ACL,这是对象存储与文件系统的根本差异。
方案二:IAM 策略(最灵活,需启用 IAM)
# 创建自定义策略文件 policy.json cat > policy.json <<'EOF' { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"AWS": ["*"]}, "Action": ["s3:GetObject"], "Resource": ["arn:aws:s3:::public-static/images/*"] } ] } EOF # 应用策略 mc policy set-json policy.json myminio/public-static这种方式可以精确到前缀(images/*),但要求 MinIO 启用 IAM 模式(MINIO_IAM_ENABLE=on),且策略需通过mc policy set-json加载,而非mc policy set。
方案三:Presigned URL(临时授权,最安全)
mc share download --expire 720h myminio/public-static/report.pdf生成一个 30 天有效的直链,形如http://minio.example.com/public-static/report.pdf?X-Amz-Algorithm=...。它不改变桶策略,所有权限由签名参数控制,过期即失效。适合分享敏感报告、大文件下载链接。
实操心得:我给客户做方案时,永远推荐“方案一 + 方案三”组合。静态资源(JS/CSS/图片)用
policy set public,动态内容(报表、导出文件)用mc share download。既保证性能,又守住安全底线。纯用public策略,是很多数据泄露事件的起点。
3.4 同步与镜像桶(mc mirror,mc sync):如何避免“同步一半就断”
mc mirror和mc sync是处理海量文件的核武器,但它们的行为差异极大,选错等于灾难。
| 特性 | mc mirror | mc sync |
|---|---|---|
| 同步方向 | 单向:SOURCE → TARGET | 单向:SOURCE → TARGET |
| 删除行为 | TARGET 中存在但 SOURCE 中不存在的文件,会被删除 | 默认不删除,加--delete才删 |
| 增量判断 | 基于Last-Modified时间戳 | 基于ETag(MD5)和大小 |
| 并发数 | 默认 100,可-n 50调整 | 默认 20,可-n 100调整 |
| 适用场景 | 备份、灾备(TARGET 是 SOURCE 的精确副本) | 增量更新(如网站静态文件发布) |
mc mirror的致命参数:--overwrite,--remove,--fake
# 安全的灾备同步(推荐) mc mirror --overwrite --remove --fake --no-encrypt myminio/source-bucket myminio/backup-bucket # 解释: # --overwrite: 覆盖 TARGET 中同名但内容不同的对象(基于 ETag) # --remove: 删除 TARGET 中 SOURCE 没有的对象(实现“精确副本”) # --fake: 不实际传输,只打印将要执行的操作(首次运行必加!) # --no-encrypt: 禁用服务端加密(避免与 SOURCE 加密配置冲突)--fake是血泪教训。我第一次用mc mirror做跨机房同步,没加--fake,结果因网络抖动导致--remove误删了备份桶里 2TB 的历史数据。现在我的所有mirror命令,都以--fake开头,确认输出无误后再删掉--fake重跑。
mc sync的灵魂参数:--watch,--exclude,--include
# 监控 source-bucket,实时同步到 backup-bucket mc sync --watch --exclude "*.tmp" --include "logs/*.log" myminio/source-bucket myminio/backup-bucket--watch: 启用 inotify 监控,文件一变立即同步(需mc在后台常驻);--exclude: 排除临时文件,避免同步.tmp、.swp等垃圾;--include: 白名单模式,只同步匹配的文件(优先级高于--exclude)。
注意:
--watch模式下,mc进程会持续占用内存。在 Kubernetes 中,建议用livenessProbe检查mc admin info是否存活,避免进程僵死。
3.5 删除桶(mc rb):为什么加了--force还失败?
mc rb是最危险的命令,也是故障率最高的命令。失败原因往往不在命令本身,而在前置条件。
失败原因一:桶非空,且未加--force
mc rb myminio/empty-bucket # 成功 mc rb myminio/full-bucket # 报错:Bucket not empty解决方案当然是mc rb --force myminio/full-bucket。但--force不是万能的。
失败原因二:桶启用了版本控制(Versioning)
如果桶开启了版本控制(mc version enable myminio/bucket),那么--force只删除当前版本的对象,所有历史版本(Delete Marker)依然存在,桶仍被视为“非空”。此时必须先清理所有版本:
# 列出所有版本(含 Delete Marker) mc ls --versions myminio/bucket # 彻底删除所有版本(慎用!) mc rm --versions --recursive --force myminio/bucket然后才能mc rb --force。
失败原因三:桶启用了对象锁定(Retention/Legal Hold)
如前所述,--with-lock创建的桶,对象受 WORM 保护。mc rb --force会直接报错:
ERROR Unable to remove bucket 'myminio/compliance': AccessDenied: Access Denied必须先解除锁定:
# 查看锁定状态 mc retention get myminio/compliance # 清除保留策略(需管理员权限) mc retention clear myminio/compliance # 清除法律持有(Legal Hold) mc legal-hold clear --version-id "null" myminio/compliance/*提示:
mc legal-hold clear的--version-id "null"是关键。null表示清除所有版本的 Legal Hold,不是字符串"null"。漏掉引号会报错。
失败原因四:桶被其他进程占用(如mc watch)
如果另一个终端正在运行mc watch myminio/bucket,mc rb会因“桶被监听”而拒绝删除。解决方案是先kill掉监听进程,或加--dangerous(仅限mcv2024.01+):
mc rb --force --dangerous myminio/bucket--dangerous绕过所有服务端检查,相当于“物理删除”,仅用于紧急恢复。
4. 常见问题与排查技巧实录:来自生产环境的 7 个真实故障
4.1 故障一:“mc mb: Bucket already exists” 但mc ls看不到该桶
现象:
执行mc mb myminio/test-bucket报错Bucket already exists,但mc ls myminio/列表里没有test-bucket。
根因分析:
这是 MinIO 的“桶软删除”机制导致的。当桶被mc rb --force删除后,MinIO 并非立即释放资源,而是进入PENDING_DELETION状态,持续 10 分钟(可配置)。在此期间,mc mb认为桶名仍被占用,但mc ls已将其过滤。
排查命令:
# 查看所有桶(含软删除状态) mc admin bucket list myminio/ --json | jq 'select(.status == "PENDING_DELETION")' # 强制清理软删除桶(需 MinIO v2023.10+) mc admin bucket cleanup myminio/ test-bucket解决方案:
等待 10 分钟,或升级 MinIO 到 v2023.10+ 后用mc admin bucket cleanup立即清理。切勿用mc mb --ignore-existing强行覆盖,可能导致元数据不一致。
4.2 故障二:“mc policy set public” 后仍 403 Forbidden
现象:mc policy set public myminio/public-bucket执行成功,但浏览器访问http://minio.example.com/public-bucket/file.txt返回 403。
根因分析:
90% 的情况是SSL/TLS 配置问题。当 MinIO 启用 HTTPS(--cert/--key)时,mc policy set public生成的策略中Resource字段会包含https://前缀。但如果你用 HTTP 访问(如http://minio.example.com),S3 协议校验失败,返回 403。
验证方法:
# 查看当前桶策略 mc policy get myminio/public-bucket # 输出中检查 Resource 字段是否为 https://... # 如果是 https://,而你用 http 访问,则必然 403解决方案:
- 方案 A(推荐):统一用 HTTPS 访问,配置反向代理(Nginx)强制跳转;
- 方案 B:重建桶,创建时指定
--region并确保mc连接 URL 与访问 URL 协议一致; - 方案 C:用
mc policy set-json加载自定义策略,显式指定http://或https://。
4.3 故障三:“mc mirror” 同步速度慢,CPU 占用 100%
现象:mc mirror同步 10GB 文件,耗时 2 小时,top显示mc进程 CPU 100%。
根因分析:mc默认对每个文件计算 MD5(ETag)进行一致性校验。对于大文件,MD5 计算是 CPU 密集型操作,且单线程。10GB 文件 MD5 计算需数分钟,成为瓶颈。
优化方案:
# 关闭 ETag 校验,改用文件大小 + 修改时间判断(速度快 10 倍) mc mirror --no-etag --overwrite myminio/source myminio/target # 或限制并发数,降低 CPU 峰值 mc mirror -n 10 --overwrite myminio/source myminio/target注意:
--no-etag降低了一致性保障,适用于可信内网环境。公网同步仍建议保留 ETag。
4.4 故障四:“mc ls” 列出的文件时间比实际晚 8 小时
现象:mc ls myminio/bucket显示文件Created时间为2024-03-15T00:12:34Z,但文件实际上传时间是2024-03-15T08:12:34(东八区)。
根因分析:mc ls输出的时间戳是UTC 时间(Zulu Time),这是 S3 协议标准。Z表示零时区偏移,所有 S3 兼容服务均如此。这不是 bug,是规范。
解决方案:
- 习惯性将
Z时间转换为本地时间(如date -d "2024-03-15T00:12:34Z"); - 用
--json模式输出,由脚本处理时区:mc ls --json myminio/bucket | jq -r '.lastModified' | xargs -I{} date -d "{} UTC" "+%Y-%m-%d %H:%M:%S %Z"
4.5 故障五:“mc rb --force” 删除后,磁盘空间未释放
现象:mc rb --force myminio/large-bucket成功,但df -h显示 MinIO 数据盘使用率未下降。
根因分析:
MinIO 使用xl格式存储,文件删除后,磁盘空间不会立即归还给操作系统,而是进入“延迟释放”队列。MinIO 后台有 GC(Garbage Collection)进程定期扫描并真正删除。
查看 GC 状态:
mc admin trace --verbose --all myminio/ | grep "gc"加速释放:
# 触发手动 GC(MinIO v2023.07+) mc admin service restart myminio/ gc4.6 故障六:“mc share download” 生成的链接 404
现象:mc share download myminio/bucket/file.zip生成链接,但浏览器访问返回 404。
根因分析:
Presigned URL 的Resource路径必须与对象实际路径完全一致。常见错误:
- 对象路径含空格或特殊字符(如
file name.zip),URL 编码错误; - 对象路径以
/开头(如/bucket/file.zip),而实际路径是bucket/file.zip; - MinIO 启用了
--domain参数,但 URL 中未包含域名。
验证方法:
# 获取对象真实路径(不含 bucket 名) mc stat myminio/bucket/file.zip | jq -r '.key' # 确保 share 命令中的路径与 .key 完全一致 mc share download myminio/bucket/"$(mc stat myminio/bucket/file.zip | jq -r '.key')"4.7 故障七:mc命令在 Docker 容器中执行缓慢或超时
现象:
Docker 容器内执行mc ls myminio/响应慢,或mc cp报错context deadline exceeded。
根因分析:
Docker 默认 DNS 配置(8.8.8.8)与 MinIO 所在内网 DNS 不兼容,导致域名解析超时。mc的 HTTP 客户端默认 30 秒超时,DNS 查询就占 25 秒。
解决方案:
- 方案 A:在
docker run时指定内网 DNS:docker run --dns 192.168.1.1 -it minio/mc mc ls myminio/ - 方案 B:在容器内修改
/etc/resolv.conf,或在mc配置中用 IP 替代域名:mc alias set myminio http://192.168.1.100:9000 minioadmin minioadmin
5. 进阶技巧与生产级最佳实践:让mc成为你运维肌肉记忆的一部分
5.1 将mc嵌入 Bash 函数:三行代码搞定日常高频操作
把重复命令封装成函数,是提升效率的第一步。以下是我.bashrc中的标配:
# 快速创建带策略的桶 mkb() { local bucket=$1 local policy=${2:-public-read} mc mb --policies "$policy" "myminio/$bucket" && echo "✅ Bucket $bucket created with $policy" } # 快速同步并监控进度 mksync() { local src=$1 local dst=$2 mc sync --progress --watch "$src" "$dst" 2>&1 | grep -E "(Transferred|Speed|ETA)" } # 快速生成带密码的下载链接(有效期 1 小时) mkshare() { local obj=$1 mc share download --expire 1h "myminio/$obj" | sed 's/^/🔗 /' }用法:
mkb logs public-read-write # 创建可读写桶 mksync myminio/src myminio/dst # 同步并显示进度条 mkshare reports/2024-q1.pdf # 生成带前缀的下载链接5.2 用mc实现自动化巡检:每天凌晨检查桶健康状态
创建巡检脚本minio-health.sh:
#!/bin/bash # MinIO 桶健康巡检脚本 ALIAS="myminio" LOG="/var/log/minio-health.log" DATE=$(date '+%Y-%m-%d %H:%M:%S') echo "[$DATE] Starting MinIO health check..." >> $LOG # 检查所有桶是否存在