1. MinIO 故障与版本处理

1.1 现象

  • MinIO 页面出现 The specified bucket does not exist

  • 登录后左侧只有简化菜单

1.2 处理过程

  • 清理 MinIO 数据并重启:

    cd /root/minio
    docker compose down
    rm -rf /data/minio/data /data/minio/config
    mkdir -p /data/minio/data /data/minio/config
    docker compose up -d
    docker compose ps
  • 验证账号(来自 docker-compose.yml):

    • 用户名:minioadmin

    • 密码:minioadmin

  • 检查并修复 docker-compose.yml 格式问题(缩进、异常空格、healthcheck 同行错误)。

  • 补全缺失网络定义:

    networks:
      minio_net:
        driver: bridge
  • 验证配置:

    cd /root/minio
    docker compose config

1.3 MinIO 版本切换

  • 已切换到旧版:

    • quay.io/minio/minio:RELEASE.2024-07-16T23-46-41Z

  • 启动命令:

    cd /root/minio
    docker compose up -d
    docker exec minio minio --version
  • 回退时遇到数据格式不兼容:

    • 报错:decodeXLHeaders: Unknown xl meta version 3

    • 处理:清空 /root/minio/data 后重启。

2. Nginx 代理/重定向检查

2.1 关键链路

  • 80 -> 443 -> 9444 -> 9001

  • MinIO Console 最终走 9001

2.2 已确认配置

  • /etc/nginx/conf.d/minio-http-redirect.conf

    • return 301 https://$host$request_uri;

  • /etc/nginx/conf.d/minio-443.conf

    • proxy_pass https://127.0.0.1:9444;

  • /etc/nginx/conf.d/minio.conf

    • proxy_pass http://127.0.0.1:9001;

2.3 验证命令

curl -k -I -H 'Host: minio.apotos.com' http://127.0.0.1/
curl -k -I -H 'Host: minio.apotos.com' https://127.0.0.1/
curl -k -I -H 'Host: minio.apotos.com' https://127.0.0.1:9444/

2.4 输出示例与关键字

HTTP/1.1 301 Moved Permanently
Location: https://minio.apotos.com/
​
HTTP/2 200
  • 301 Moved Permanently:HTTP 到 HTTPS 的永久重定向,正常。

  • Location:重定向目标地址。

  • 200:请求成功,表示链路可达。

3. MinIO CA 证书导出

3.1 导出命令

mkdir -p /root/minio/certs
openssl s_client -showcerts -servername minio.apotos.com -connect 127.0.0.1:443 </dev/null 2>/dev/null \
| awk '/BEGIN CERTIFICATE/{flag=1;f=sprintf("/root/minio/certs/chain-%02d.crt",++i)} flag{print > f} /END CERTIFICATE/{flag=0}'
cp /root/minio/certs/chain-01.crt /root/minio/certs/minio-ca.crt
openssl x509 -in /root/minio/certs/minio-ca.crt -noout -fingerprint -sha256

3.2 输出文件

  • /root/minio/certs/minio-ca.crt

4. 磁盘空间诊断

4.1 总体结果(当时采集)

  • 根分区 /63G 总,50G 已用,9.9G 可用,84%

  • /home29G 可用(最空)

  • inode 使用率:8%(正常)

4.2 主要占用目录

  • /data36G

    • /data/harbor23G(registry 为主)

    • /data/k8s_data13G

  • /var/lib/docker7.5G

  • Docker 可回收镜像:约 5.13G

4.3 诊断命令

df -hT
df -i
du -xh --max-depth=1 / | sort -h
du -xh --max-depth=2 /data | sort -h
du -xh --max-depth=2 /var | sort -h
docker system df

4.4 输出示例与关键字

/dev/mapper/openeuler-root ext4 63G 50G 9.9G 84% /
/dev/mapper/openeuler-home ext4 31G 24K 29G 1% /home
/dev/sdb1 ext4 196G 32G 155G 17% /data2

TYPE            TOTAL   ACTIVE   SIZE    RECLAIMABLE
Images          33      12       7.07GB  5.133GB (72%)
  • 已用%:分区使用率,超过 80% 需重点关注。

  • RECLAIMABLE:可回收空间(如未使用镜像/构建缓存)。

  • Images:本地镜像体积,不等于容器实际写入数据体积。

5. 新磁盘 /dev/sdb 分区与格式化

5.1 初始状态

  • /dev/sdb:200G,未分区未挂载

5.2 操作命令(整盘单分区)

parted -s /dev/sdb mklabel gpt
parted -s /dev/sdb mkpart primary ext4 0% 100%
partprobe /dev/sdb
lsblk -f /dev/sdb

5.3 格式化、挂载、开机自动挂载

mkfs.ext4 -F /dev/sdb1
mkdir -p /data2
mount /dev/sdb1 /data2
UUID=$(blkid -s UUID -o value /dev/sdb1)
grep -q "UUID=$UUID /data2 ext4 defaults,nofail 0 2" /etc/fstab || \
echo "UUID=$UUID /data2 ext4 defaults,nofail 0 2" >> /etc/fstab
mount -a
df -h | grep /data2

5.4 结果

  • /data2 可用约 186G

5.5 输出示例与关键字

NAME   FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sdb
└─sdb1

/dev/sdb1 196G 28K 186G 1% /data2
  • FSTYPE:文件系统类型(如 ext4)。

  • UUID:分区唯一标识,写入 fstab 比设备名更稳定。

  • MOUNTPOINTS:分区当前挂载点。

6. Harbor 全量迁移(含镜像)

6.1 目标

  • /data/harbor 全量迁到 /data2/harbor

  • 保持 Harbor 原路径不变(通过 bind mount)

6.2 实际执行

cd /root/harbor
docker compose down

mkdir -p /data2/harbor
cp -a /data/harbor/. /data2/harbor/

BAK=/data/harbor.bak_$(date +%F_%H%M%S)
mv /data/harbor "$BAK"
mkdir -p /data/harbor

mount --bind /data2/harbor /data/harbor
grep -q '^/data2/harbor /data/harbor none bind 0 0$' /etc/fstab || \
echo '/data2/harbor /data/harbor none bind 0 0' >> /etc/fstab

docker compose up -d
docker compose ps

6.3 验证

mount | grep ' /data/harbor '
df -h | grep -E '/data2|/data/harbor'
du -sh /data2/harbor /data/harbor.bak_2026-03-02_185128

6.4 结果

  • /data/harbor 已绑定到新盘(/dev/sdb1

  • /data2/harbor 与备份目录体积一致(23G

  • Harbor 容器已拉起

6.6 输出示例与关键字

/dev/sdb1 on /data/harbor type ext4 (rw,relatime)
23G  /data2/harbor
23G  /data/harbor.bak_2026-03-02_185128
  • mount --bind:把新路径“映射”为旧路径,业务配置可不改。

  • rw:读写挂载。

  • relatime:访问时间优化挂载参数。

  • 迁移校验重点:新目录与备份目录体积接近/一致。

6.5 清理备份(确认业务正常后)

rm -rf /data/harbor.bak_2026-03-02_185128

7. 备份与恢复命令(汇总)

7.1 备份

TS=$(date +%F_%H%M%S)
mkdir -p /root/backup/minio_$TS

tar -C /root -czf /root/backup/minio_$TS/minio_data.tgz minio/data
tar -C /root -czf /root/backup/minio_$TS/minio_compose.tgz minio/docker-compose.yml minio/certs

tar -czf /root/backup/minio_$TS/nginx_minio_conf.tgz \
  /etc/nginx/conf.d/minio.conf \
  /etc/nginx/conf.d/minio-443.conf \
  /etc/nginx/conf.d/minio-http-redirect.conf \
  /etc/nginx/ssl/_.apotos.com.crt \
  /etc/nginx/ssl/_.apotos.com.key

ls -lh /root/backup/minio_$TS
sha256sum /root/backup/minio_$TS/*.tgz

7.2 恢复

cd /root/minio && docker compose down

tar -C / -xzf /root/backup/<备份目录>/minio_data.tgz
tar -C / -xzf /root/backup/<备份目录>/minio_compose.tgz
tar -C / -xzf /root/backup/<备份目录>/nginx_minio_conf.tgz

nginx -t && systemctl reload nginx
cd /root/minio && docker compose up -d

8. Docker 数据目录迁移到 /data2

8.1 目标

  • 将 Docker 数据根目录从 /var/lib/docker 迁移到 /data2/docker

  • 释放根分区空间

8.2 迁移前检查

docker info --format '{{.DockerRootDir}}'
docker ps --format '{{.Names}}' | wc -l
cat /etc/docker/daemon.json
df -h / /data2

8.3 执行过程

# 停止 Docker 相关服务
systemctl stop docker
systemctl stop containerd
systemctl stop docker.socket

# 复制数据到新目录
mkdir -p /data2/docker
cp -a /var/lib/docker/. /data2/docker/

# 备份并更新 daemon 配置
cp -a /etc/docker/daemon.json /etc/docker/daemon.json.bak_$(date +%F_%H%M%S)
python3 - <<'PY'
import json
p='/etc/docker/daemon.json'
with open(p,'r',encoding='utf-8') as f:
    d=json.load(f)
d['data-root']='/data2/docker'
with open(p,'w',encoding='utf-8') as f:
    json.dump(d,f,ensure_ascii=False,indent=2)
    f.write('\n')
PY

# 启动服务
systemctl daemon-reload
systemctl start containerd
systemctl start docker

8.4 清理旧目录残留挂载并释放空间

# 如果旧目录有 overlay 残留挂载,先停服务并卸载
systemctl stop docker.socket docker containerd
for m in $(mount | awk '/\/var\/lib\/docker\/overlay2\/.*\/merged/{print $3}'); do
  umount -l "$m" || true
done
​
# 清理旧目录后重启 Docker
rm -rf /var/lib/docker/*
systemctl start containerd docker

8.5 验证结果

docker info --format '{{.DockerRootDir}}'
du -sh /var/lib/docker /data2/docker
df -h / /data2
docker ps --format '{{.Names}}'

8.6 本次结果

  • Docker Root Dir:/data2/docker

  • /var/lib/docker4.0K

  • /data2/docker:约 9.4G

  • 根分区使用率:约 84% -> 73%

8.7 输出示例与关键字

$ docker info --format '{{.DockerRootDir}}'
/data2/docker
​
$ du -sh /var/lib/docker /data2/docker
4.0K  /var/lib/docker
9.4G  /data2/docker
​
$ df -h / /data2
/dev/mapper/openeuler-root 63G 43G 17G 73% /
/dev/sdb1 196G 32G 155G 17% /data2
  • DockerRootDir:Docker 实际数据根目录(镜像/层/容器写入)。

  • overlay2:Docker 默认存储驱动目录,清理旧目录前需先卸载残留挂载。

  • Device or resource busy:目录仍被挂载占用,需先 umount 再删除。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐