MinIO 新版本 Docker 部署指南：告别 Web 控制台，拥抱 CLI 管理
一、背景安全事件：MinIO 安全漏洞（CVE-2025-62506）， 漏洞说明： https://avd.aliyun.com/detail?id=AVD-2025-62506建议升级到 RELEASE.2025-10-15T17-29-55Z 或更高版本。二、新版本变动Web 控制台功能阉割：开源社区版本，内置 Web 管理界面不再提供除了创建bucket以外的功能。👆上面的图是不是很干净😄开源社区版本分发调整：官方不再提供Docker镜像与预编译二进制，需要自行从源码编译并封装镜像。推荐部署路径：源码构建 + 自制 Docker 镜像 + Docker Compose 编排。issues: https://github.com/minio/minio/issues/21647三、自己动手封装镜像实现方式：多阶段构建，第一阶段拉源并编译成二进制文件，第二阶段生成最小运行镜像。参考官方提供的 Dockerfile： https://github.com/minio/minio/blob/master/Dockerfile# 阶段1：依赖下载层 FROM golang:1.24.11-alpine3.23 AS builder # 定义MINIO版本 ARG MINIO_VERSION=RELEASE.2025-10-15T17-29-55Z WORKDIR /app # 下载minio并构建二进制文件 RUN wget https://github.com/minio/minio/archive/refs/tags/${MINIO_VERSION}.tar.gz \ && tar -zxvf ${MINIO_VERSION}.tar.gz \ && rm -rf ${MINIO_VERSION}.tar.gz \ && export GOPROXY=https://mirrors.cloud.tencent.com/go/ \ && cd minio-${MINIO_VERSION} \ && go mod tidy \ && go build # 阶段2：生成最终镜像 #官方的 minio 镜像自带了 mc 命令 FROM minio/minio:latest # 定义MINIO版本 ARG MINIO_VERSION=RELEASE.2025-10-15T17-29-55Z COPY --from=builder /app/minio-${MINIO_VERSION}/minio /usr/bin/minio COPY --from=builder /app/minio-${MINIO_VERSION}/dockerscripts/docker-entrypoint.sh /usr/bin/docker-entrypoint.sh RUN chmod -R 777 /usr/bin && chmod +x /usr/bin/docker-entrypoint.sh ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"] VOLUME ["/data"] CMD ["minio"]构建命令：MINIO_VERSION=RELEASE.2025-10-15T17-29-55Z docker build -t minio:${MINIO_VERSION} --build-arg MINIO_VERSION=${MINIO_VERSION} .四、使用 Docker Compose 快速运行MinIO目标：配置环境变量、数据卷与健康检查，快速启动单实例。初始化： 运行了一个 minio-init 容器，用于 minio 的初始化，创建桶等一些操作。⚠️注意：需要先创建一个 srebro 的docker 网桥；凭证使用 MINIO_ROOT_USER/MINIO_ROOT_PASSWORD。#创建docker 自定义网桥 docker network create -d bridge --subnet "10.22.33.0/24" --gateway "10.22.33.1" srebroversion: "3.8" services: minio: image: docker.cnb.cool/srebro/docker-images/minio:RELEASE.2025-10-15T17-29-55Z #CNB镜像托管了一个 # 如果本地构建镜像，用 build 指令替代 image： # build: # context: . # dockerfile: Dockerfile container_name: minio networks: - srebro ports: - 9000:9000 - 9001:9001 volumes: - /home/application/Middleware/minio/data:/data #挂载 minio 数据盘 - /home/application/Middleware/minio/mc-config:/tmp/.mc:rw #持久化 mc 配置文件 - /etc/localtime:/etc/localtime:ro - /usr/share/zoneinfo:/usr/share/zoneinfo:ro environment: MINIO_ROOT_USER: srebro MINIO_ROOT_PASSWORD: 'password' TZ: Asia/Shanghai command: server /data --console-address :9001 healthcheck: # 健康检查确保初始化服务在MinIO就绪后运行 test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 10s timeout: 5s retries: 10 restart: unless-stopped minio-init: image: docker.cnb.cool/srebro/docker-images/minio:RELEASE.2025-10-15T17-29-55Z container_name: minio-init depends_on: minio: condition: service_healthy # 依赖MinIO健康状态 networks: - srebro volumes: - /home/application/Middleware/minio/mc-config:/tmp/.mc:rw entrypoint: > /bin/sh -c " /usr/bin/mc alias set minio http://minio:9000 srebro 'password'; /usr/bin/mc mb minio/srebro; /usr/bin/mc ls minio; exit 0; " networks: srebro: external: true启动与查看：docker compose up -d docker compose ps docker compose logs -f minio五、Web 控制台阉割功能的替代：使用 mc 命令上面的容器都内置了 mc命令，使用一个 JSON 格式的配置文件来存储 某些类型的信息，比如为每个配置的 S3 兼容服务 设置的 别名。 mc 的配置文件也都持久化了，可直接使用，管理 minio登陆容器，运行 mc 命令docker exec -it minio bash mc --version mc version RELEASE.2025-08-13T08-35-41Z (commit-id=7394ce0dd2a80935aded936b09fa12cbb3cb8096) Runtime: go1.24.6 linux/amd64 Copyright (c) 2015-2025 MinIO, Inc. License GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>查看mc 配置mc alias ls gcs URL : https://storage.googleapis.com AccessKey : YOUR-ACCESS-KEY-HERE SecretKey : YOUR-SECRET-KEY-HERE API : S3v2 Path : dns Src : /tmp/.mc/config.json local URL : http://localhost:9000 AccessKey : SecretKey : API : Path : auto Src : /tmp/.mc/config.json minio URL : http://minio:9000 AccessKey : srebro SecretKey : password API : s3v4 Path : auto Src : /tmp/.mc/config.json s3 URL : https://s3.amazonaws.com AccessKey : YOUR-ACCESS-KEY-HERE SecretKey : YOUR-SECRET-KEY-HERE API : S3v4 Path : dns Src : /tmp/.mc/config.jsonbucket 管理：# mc mb minio/srebro # 创建bucket # mc ls minio # 列出bucket # mc rb minio/srebro-test --force # 强制删除bucket，即使含有文件object 文件管理：# echo "This is my test file!" > srebro.txt # mc cp srebro.txt minio/srebro/srebro.txt # 上传测试文件 # mkdir testdir # 创建测试目录 # echo "This is my test02 file!" > testdir/test02.txt # mc cp testdir minio/srebro --recursive # 上传测试目录，且递归上传该目录下的所有文件 # mc ls minio/srebro # 查看minio存储 # mkdir download # mc cp minio/srebro/test01.txt download/ # 下载文件 # mc cp minio/srebro/testdir download/ --recursive # 下载目录，且递归下载 # mc rm minio/srebro/test01.txt # 删除文件 # mc rm minio/srebro/testdir --recursive --force # 删除目录，即使包含文件 # mc ls minio/srebro # 查看minio存储桶匿名策略（公开/私有）：mc anonymous set public minio/srebro mc anonymous set private minio/srebro创建 ACCESS_KEY 和 SECRET_KEY：#创建 ACCESS_KEY 和 SECRET_KEY mc admin user add minio 11fz7gXVnNjvjEDq2qez jj6r9Hu2gtueIQFSV35FzKcvGtK1G61d9ieNmKDg #修改用户权限 mc admin policy attach minio readwrite --user 11fz7gXVnNjvjEDq2qez六、MinIO 对象生命周期管理（ILM）配置说明概念：MinIO 的对象生命周期管理（Object Lifecycle Management, ILM）是一项自动化策略引擎，用于根据用户定义的规则自动管理对象的存储状态，包括过期删除、存储类转换（降本）、版本清理等。其核心目标是简化数据全生命周期的成本控制和合规性管理，尤其适用于海量数据存储场景。规则按桶与前缀匹配，控制对象过期与非当前版本（启用版本化后）的清理。基础规则示例：将 logs/ 前缀下对象在 30 天后过期mc ilm rule add minio/srebro \ --prefix "logs/" \ --expiry-days 30将 logs/ 前缀下对象在 30 天后过期，非当前版本 7 天清理：mc ilm rule add minio/srebro \ --prefix "logs/" \ --expiry-days 30 \ --noncurrent-expire-days 7查看与删除规则：mc ilm rule ls minio/srebro mc ilm rule rm minio/srebro --id <rule-id>按 JSON 导入（便于审计与版本管理）：cat > ilm.json <<'EOF' { "Rules": [ { "ID": "expire-logs-30d", "Status": "Enabled", "Filter": { "Prefix": "logs/" }, "Expiration": { "Days": 30 }, "NoncurrentVersionExpiration": { "NoncurrentDays": 7 } } ] } EOF mc ilm import minio/srebro ilm.json mc ilm export minio/srebro七、总结新版本不再提供 Docker 镜像和预编译好的二进制文件，需要大家自行编译与封装镜像。Web 控制台功能阉割后，可用 mc 命令完成用户、策略、桶、版本化、ILM 等管理操作。因 CVE-2025-62506，应尽快升级到 RELEASE.2025-10-15T17-29-55Z 或更高版本；通过 Dockerfile 多阶段构建与 Docker Compose 可快速落地与运维。本文所涉及的文件，都可以在 https://cnb.cool/srebro/docker-images/-/tree/main/Middleware/minio 上面浏览到，方便大家查阅。八、参考https://www.cnblogs.com/karl-python/p/19455192https://github.com/minio/minio/issues/21647https://docs.min.io/enterprise/aistor-object-store/
一、Prometheus监控配置与MinIO指标采集​1.1 先决条件:一个现有的 Prometheus 部署，并支持告警一个现有的 MinIO 部署，并具有对 Prometheus 部署的网络访问权限本地主机上安装了 mc，并已配置可访问 MinIO1.2 使用mc命令生成抓取配置使用 mc admin prometheus generate 命令生成抓取配置，供 Prometheus 用于发出抓取请求1.2.1 抓取 MinIO 集群的指标以下命令抓取 MinIO 集群的指标。将 ALIAS 替换为 MinIO 部署的 别名。mc admin prometheus generate ALIAS该命令返回类似于以下内容的输出：global: scrape_interval: 60s scrape_configs: - job_name: minio-job bearer_token: TOKEN metrics_path: /minio/v2/metrics/cluster scheme: https static_configs: - targets: [minio.example.net]1.2.2 抓取 MinIO 服务器上某个节点的指标以下命令抓取 MinIO 服务器上某个节点的指标。将 ALIAS 替换为 MinIO 部署的 别名。mc admin prometheus generate ALIAS node该命令返回类似于以下内容的输出：global: scrape_interval: 60s scrape_configs: - job_name: minio-job-node bearer_token: TOKEN metrics_path: /minio/v2/metrics/node scheme: https static_configs: - targets: [minio-1.example.net, minio-2.example.net, minio-N.example.net]1.2.3 抓取 MinIO 服务器上存储桶的指标以下命令抓取 MinIO 服务器上存储桶的指标。将 ALIAS 替换为 MinIO 部署的 别名。mc admin prometheus generate ALIAS bucket该命令返回类似于以下内容的输出：global: scrape_interval: 60s scrape_configs: - job_name: minio-job-bucket bearer_token: TOKEN metrics_path: /minio/v2/metrics/bucket scheme: https static_configs: - targets: [minio.example.net]1.2.4 抓取 MinIO 服务器上资源的指标。以下命令抓取 MinIO 服务器上资源的指标。将 ALIAS 替换为 MinIO 部署的 别名。⚠️：版本 RELEASE.2023-10-07T15-07-38Z 中的新增功能。mc admin prometheus generate ALIAS resource该命令返回类似于以下内容的输出：global: scrape_interval: 60s scrape_configs: - job_name: minio-job-resource bearer_token: TOKEN metrics_path: /minio/v2/metrics/resource scheme: https static_configs: - targets: [minio.example.net]1.2.5 配置抓取注意事项设置适当的 scrape_interval 值以确保每个抓取操作在下一个操作开始之前完成。建议的值为 60 秒。由于要抓取的指标数量，某些部署需要更长的抓取间隔。为了减少 MinIO 和 Prometheus 服务器的负载，请选择满足监控要求的最长间隔。将 job_name 设置为与 MinIO 部署关联的值。使用唯一值以确保部署指标与该 Prometheus 服务收集的任何其他指标隔离。如果 MINIO_PROMETHEUS_AUTH_TYPE 设置为 "public"，则可以省略 bearer_token 字段。对于不使用 TLS 的 MinIO 部署，请将 scheme 设置为 http。使用解析到 MinIO 部署的主机名设置 targets 数组。这可以是任何单个节点，或处理到 MinIO 节点连接的负载均衡器/代理。对于与 MinIO 租户位于同一集群中的 Prometheus 部署，您可以为 minio 服务指定服务 DNS 名称。对于集群外部的 Prometheus 部署，必须指定一个配置为路由 MinIO 租户之间连接的入口或负载均衡器端点。1.3 使用更新的配置重新启动 Prometheus1.3.1 将上一步生成的所需 scrape_configs 作业附加到配置文件中我这里提供一个聚合好的配置文件：global: scrape_interval: 25s scrape_configs: - job_name: 'srebro-prod-minio' scrape_interval: 60s # 每 60秒采集一次 bearer_token: xxxxxx metrics_path: /minio/v2/metrics/cluster scheme: http static_configs: - targets: ['127.0.0.1:9000'] labels: tsingyun_project_name: "srebro-prod" nodename: "运维小弟-生产-minio-单节点-192.168.3.110" type: "minio-job" - job_name: 'srebro-prod-minio-node' scrape_interval: 60s # 每 60秒采集一次 bearer_token: xxxxxx metrics_path: /minio/v2/metrics/node scheme: http static_configs: - targets: ['127.0.0.1:9000'] labels: tsingyun_project_name: "srebro-prod" nodename: "运维小弟-生产-minio-单节点-192.168.3.110" type: "minio-node" - job_name: 'srebro-prod-minio-bucket' scrape_interval: 60s # 每 60秒采集一次 bearer_token: xxxxxx metrics_path: /minio/v2/metrics/bucket scheme: http static_configs: - targets: ['127.0.0.1:9000'] labels: tsingyun_project_name: "srebro-prod" nodename: "运维小弟-生产-minio-单节点-192.168.3.110" type: "minio-bucket" - job_name: 'srebro-prod-minio-resource' scrape_interval: 60s # 每 60秒采集一次 bearer_token: xxxxxx metrics_path: /minio/v2/metrics/resource scheme: http static_configs: - targets: ['127.0.0.1:9000'] labels: tsingyun_project_name: "srebro-prod" nodename: "运维小弟-生产-minio-单节点-192.168.3.110" type: "minio-resource"1.3.2 检查配置文件是否正确./promtool check config prometheus.yml Checking prometheus.yml SUCCESS: prometheus.yml is valid prometheus config file syntax1.3.3 重新加载 prometheus 服务curl -X POST http://127.0.0.1:9090/-/reload1.3.4 观察 prometheus 中的 Targets 情况1.3.5 查看收集的指标以下查询示例返回 Prometheus 每五分钟为名为 srebro-prod-minio-node 的抓取作业收集的指标minio_node_drive_free_bytes{job="srebro-prod-minio-node"}[5m] minio_node_drive_free_inodes{job="srebro-prod-minio-node"}[5m] minio_node_drive_latency_us{job="srebro-prod-minio-node"}[5m] minio_node_drive_offline_total{job="srebro-prod-minio-node"}[5m] minio_node_drive_online_total{job="srebro-prod-minio-node"}[5m] minio_node_drive_total{job="srebro-prod-minio-node"}[5m] minio_node_drive_total_bytes{job="srebro-prod-minio-node"}[5m] minio_node_drive_used_bytes{job="srebro-prod-minio-node"}[5m] minio_node_drive_errors_timeout{job="srebro-prod-minio-node"}[5m] minio_node_drive_errors_availability{job="srebro-prod-minio-node"}[5m] minio_node_drive_io_waiting{job="srebro-prod-minio-node"}[5m]1.3.6 MinIO 推荐的指标作为基本监控集。指标描述minio_node_drive_free_bytes驱动器上可用的总存储空间。minio_node_drive_free_inodes空闲 inode 总数。minio_node_drive_latency_us驱动器 API 存储操作的平均最近一分钟延迟（以微秒为单位）。minio_node_drive_offline_total此节点中脱机的驱动器总数。minio_node_drive_online_total此节点中联机的驱动器总数。minio_node_drive_total此节点中的驱动器总数。minio_node_drive_total_bytes驱动器上的总存储空间。minio_node_drive_used_bytes驱动器上使用的总存储空间。minio_node_drive_errors_timeout自服务器启动以来驱动器超时错误的总数。minio_node_drive_errors_availability自服务器启动以来驱动器 I/O 错误、权限被拒绝和超时的总数。minio_node_drive_io_waiting等待驱动器 I/O 操作的总数。1.4 使用 MinIO 指标配置警报规则检测过去5分钟内是否存在离线状态的MinIO节点，若存在则触发告警avg_over_time(minio_cluster_nodes_offline_total{job="srebro-prod-minio-node"}[5m]) > 0检测过去5分钟内MinIO集群中存在离线磁盘，若存在则触发告警avg_over_time(minio_cluster_drive_offline_total{job="srebro-prod-minio-node"}[5m]) > 01.5 MinIO 健康检查 APIMinIO 公开了未经身份验证的端点，用于探测节点正常运行时间和集群高可用性，以进行简单的健康检查。这些端点返回一个 HTTP 状态代码，指示基础资源是否健康或是否满足读取/写入仲裁。MinIO 不会通过这些端点公开任何其他数据。仅靠健康检查探测无法确定 MinIO 服务器是否脱机，只能确定当前主机是否可以访问服务器。可搭配👆上面提到的 minio_cluster_nodes_offline_total 指标配置 Prometheus 警报，以检测一个或多个 MinIO 节点是否脱机。1.5.1 节点存活性使用以下端点测试 MinIO 服务器是否在线curl -I https://minio.example.net:9000/minio/health/live将 https://minio.example.net:9000 替换为要检查的 MinIO 服务器的 DNS 主机名。响应代码 200 OK 表示 MinIO 服务器在线且功能正常。任何其他 HTTP 代码都表示在访问服务器时出现问题，例如瞬态网络问题或潜在的停机时间。1.5.2 使用 Node Exporter textfile 自定义指标收集器前提： 需要先部署好 node-exporter 监控组件。通过获取这个接口的状态，将自定义的指标数据 写入文本文件。定义脚本，获取每次接口的健康状态。[root@localhost logs]# cat /home/application/prometheus/minio-health-check.sh ENDPOINT="http://192.168.3.110:9000/minio/health/live" STATUS_FILE="/home/application/prometheus/textfile_collector/minio_health.prom" # 检查健康状态 if curl -f -s -o /dev/null --max-time 5 "$ENDPOINT"; then echo "minio_health_check{endpoint=\"$ENDPOINT\"} 1" > "$STATUS_FILE" else echo "minio_health_check{endpoint=\"$ENDPOINT\"} 0" > "$STATUS_FILE" fi提前创建好minio_health.prom 文件。touch /home/application/prometheus/textfile_collector/minio_health.prom配置定时任务; 每 30秒执行一次。crontab -e #minio-health-check * * * * * /home/application/prometheus/minio-health-check.sh * * * * * sleep 30; /home/application/prometheus/minio-health-check.sh查看minio_health.prom 文件文件数据minio_health_check{endpoint="http://192.168.3.110:9000/minio/health/live"} 1配置 node-exporter 采集器，指定 textfile 目录[root@localhost logs]# cat /etc/systemd/system/node_exporter.service [Unit] Description=node_exporter Documentation=https://prometheus.io/ After=network.target [Service] Type=simple ExecStart=/home/application/node_exporter/node_exporter --collector.systemd --collector.textfile --collector.textfile.directory=/home/application/prometheus/textfile_collector Restart=on-failure [Install] WantedBy=multi-user.target重新加载，并重启systemctl daemon-reload systemctl restart node_exporter配置 Prometheus 抓取数据 (新增 textfile 收集器)scrape_configs: - job_name: 'srebro-prod-linux' params: collect[]: - textfile #新增 textfile 收集器 - cpu - meminfo - diskstats - netdev - netstat - filefd - filesystem - xfs - systemd - uname - time - os - stat - loadavg - sockstat - netclass重载 prometheus 服务curl -X POST http://127.0.0.1:9090/-/reload查看收集的指标minio_health_check配置告警规则，检测过去5分钟内是否存在健康检查失败的状态，若存在则触发告警avg_over_time(minio_health_check[5m]) == 0二、使用 Grafana 绘制 MinIO 监控大屏2.1 先决条件:现有的 Prometheus 部署，并支持 警报管理器现有的 MinIO 部署，可以与 Prometheus 部署建立网络连接已安装的 Grafana2.2 Grafana 模板MinIO 提供了多个官方 Grafana 仪表板，可以从 Grafana 仪表板门户网站下载。直接导入模板 id，json 文件；然后微调变量即可。MinIO 服务器指标仪表板，模板 id：13502MinIO 存储桶指标仪表板，模板 id：19237MinIO 节点指标仪表板，json 文件https://raw.githubusercontent.com/minio/minio/master/docs/metrics/prometheus/grafana/node/minio-node.json三、参考https://min-io.cn/docs/minio/kubernetes/upstream/operations/monitoring.htmlhttps://grafana.com/grafana/dashboards/13502-minio-dashboard/https://grafana.com/grafana/dashboards/19237-minio-bucket-dashboard/
问题现象：中午接到开发反馈，生产上无法上传附件。接口显示 minio 问题，超时，无法访问minio 控制台 也登录不上查看 minio 服务报错：journalctl -u minio.service --since today发现大批量报错：API: PutObject Time: 03:01:53 UTC 12/15/2025 DeploymentID: 944869e6-7044-4c56-a3bf-64d00fa843cc RequestID: 188144605A9808E1 RemoteHost: 192.168.3.111 UserAgent: MinIO (Linux; amd64) minio-java/8.5.7 Error: drive:/home/application/Middleware/minio/data, srcVolume: .minio.sys/tmp, srcPath: c6ce506f-87c0-453f-a9e2-b6245c05171e, dstVolume: srebro:, dstPath: 53ba5209-8843-4df1-b41d-b5b798cd6080 - error drive path full (*errors.errorString) Backtrace: 0: internal/logger/logonce.go:118:logger.(*logOnceType).logOnceIf() 1: internal/logger/logonce.go:149:logger.LogOnceIf() 2: cmd/logging.go:142:cmd.storageLogOnceIf() 3: cmd/xl-storage.go:2469:cmd.(*xlStorage).RenameData.func1() 4: cmd/xl-storage.go:2768:cmd.(*xlStorage).RenameData() 5: cmd/xl-storage-disk-id-check.go:484:cmd.(*xlStorageDiskIDCheck).RenameData.func2() 6: internal/ioutil/ioutil.go:116:ioutil.WithDeadline[...].func1()翻阅资料，查看到官方的代码仓库上有一个 issue 相识：https://github.com/minio/minio/issues/17055有人反馈说是，ext4 文件系统，目录的索引（HTree）已达到默认的最大层级；继续查看系统级别日志，发现果然 文件系统一直在报错：Dec 15 03:22:22 localhost kernel: [20102682.954029] EXT4-fs warning (device dm-2): ext4_dx_add_entry:2451: Large directory feature is not enabled on this filesystem Dec 15 03:22:24 localhost kernel: [20102682.954029] EXT4-fs warning (device dm-2): ext4_dx_add_entry:2451: Large directory feature is not enabled on this filesystem Dec 15 03:22:26 localhost kernel: [20102682.954029] EXT4-fs warning (device dm-2): ext4_dx_add_entry:2451: Large directory feature is not enabled on this filesystem Dec 15 03:22:28 localhost kernel: [20102682.954029] EXT4-fs warning (device dm-2): ext4_dx_add_entry:2451: Large directory feature is not enabled on this filesystem问题分析：这是内核的 EXT4 警告，表示某个目录的索引（HTree）已达到默认的最大层级，继续插入新目录项需要启用 EXT4 的“大目录”特性（ large_dir ），但当前文件系统未启用该特性。典型触发场景是“单个目录下存在超大量文件/子目录”（千万级以上），插入新文件时会出现“Directory index full”和“Large directory feature is not enabled”这两条警告连续出现。处理方式:停用 minio 服务systemctl stop minio启用大目录特性tune2fs -O large_dir /dev/dm-2启用 large_dir 可以解决“目录索引达到最大层级（htree level 2）”导致的警告和后续插入失败/变慢问题；启用后目录支持更高层级索引，能继续容纳超大数量的目录项。启动 minio 服务systemctl start minio观察日志是否还有报错journalctl -k --since '-10 min' | grep -E 'ext4_dx_add_entry|Large directory'思考:出现这个问题，本质是 minio 数据目录下，单个目录下存在超大量文件/子目录”（千万级以上），业务上没有做分桶，分区的处理；数据文件没有设置生命周期归档处理；导致数据量一直在增长，数据量达到了 3.7T，文件 13395087个。运维侧，在初始化项目的时候，没有考虑到 xfs 系统 和 ext4 系统在 目录索引这块的差别；XFS ：目录使用 B+tree，天然支持多层索引，默认就能高效处理超大目录。ext4 ：目录使用 HTree 索引，默认是“两层 HTree”（特性为 dir_index ），单目录通常能容纳约 10–12 百万个条目；达到两层上限后会出现 “Directory index full / Large directory feature is not enabled” 警告。完善 minio 监控这块的不足，发现问题能及时通知响应处理。官方文档(https://min-io.cn/docs/minio/kubernetes/upstream/operations/monitoring.html)