需求
MinIO里面的文件是其它服务通过接口上传的,现在想通过命令的方式,把文件上传到其它服务器上
前置操作
# 下载 mc(Linux 示例)
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
# 配置 MinIO 服务别名
mc alias set myminio http://minio.example.com:9000 ACCESS_KEY SECRET_KEY
方案
方法一
使用 mc cat + ssh 直接传输(适用于小文件)
# 从 MinIO 下载文件并通过 SSH 上传到目标服务器
mc cat myminio/mybucket/path/to/file.txt | ssh user@remote-server "cat > /remote/path/file.txt"
此方法是通过管道的方式,直接上传,不需要本地存储文件,但也可能因管道问题,导致失败
方法二
先下载到本地,再用SCP上传
# 1. 从 MinIO 下载文件到本地
mc cp myminio/mybucket/path/to/file.txt ./local_file.txt
# 2. 使用 scp 上传到远程服务器
scp ./local_file.txt user@remote-server:/remote/path/
此方法分成两步,任意一步失败,都可重新执行
扩展知识
mc alias set <NAME> <URL> <ACCESS_KEY> <SECRET_KEY> # 添加/更新别名
mc alias remove <NAME> 或 mc alias rm <NAME> # 删除别名
mc alias list # 列出所有别名
最牛逼方案
直接访问物理文件,前提:
MinIO 的磁盘格式是内部结构(尤其在纠删码模式下),不能直接按文件名找!
仅适用于 FS(单机文件系统)后端。如果你用的是分布式 MinIO(4+ 节点)或纠删码(Erasure Coding),文件被分片存储,无法直接拼出原始文件!
可通过 minio 的启动进程查看是否为 FS 模式如果启动 MinIO 时命令是 minio server /data(单路径),则是 FS 模式,可直接读。
如果是 minio server /disk1 /disk2 ...(多路径)或集群,则不能直接读磁盘!
也可以能完命令: ps aux | grep minio 查看启动命令
查看集群信息-需要有权限
mc admin info myminio
集群信息分析
[root@ydiuap-dev-mid01 ~]# mc admin info myminio
● 10.0.0.3:34991
Uptime: 1 year
Version: 2024-06-29T01:20:47Z
Network: 1/1 OK
Drives: 1/1 OK
Pool: 1
Pools:
1st, Erasure sets: 1, Drives per erasure set: 1
159 GiB Used, 11 Buckets, 70,533 Objects
1 drive online, 0 drives offline
结论:这是一个 单节点、单磁盘的 MinIO 实例,不是分布式集群。
虽然它显示 Erasure(纠删码)后端,但由于 只有 1 个磁盘,MinIO 自动降级为 类似单机文件系统(FS)的行为,但底层仍使用 Erasure 编码逻辑(只是 N=1, K=1)。
10.0.0.3:34991 当前唯一的 MinIO 节点
Drives: 1/1 OK 只挂载了 1 块磁盘,且状态正常
Erasure sets: 1, Drives per erasure set: 1 纠删码组只有 1 组,每组 1 块盘 → 等效于单机模式
1 drive online 没有冗余,任何磁盘故障 = 数据全丢
159 GiB Used 已用存储空间
知识点
MinIO 的 单磁盘 Erasure 模式(1 drive) 下,对象(Object)在磁盘上确实是以目录形式存储的,而不是直接一个文件。
这是 MinIO 从 v2020+ 开始采用的新存储格式(称为 "xl.meta + part.1" 结构),即使只有一个磁盘,也会使用类似分布式系统的内部格式来保证元数据一致性。
<bucket>/<object-key>/
├── xl.meta # 元数据(包含版本、大小、校验和、分片信息等)
└── part.1 # 实际数据内容(二进制文件)
<bucket>/<object-key>/
├── xl.meta ← 对象元数据(包含所有版本信息)
└── <version-uuid>/ ← 每个版本一个子目录
└── part.1 ← 该版本的实际数据文件
*导出所有 part.1* 文件
#!/bin/bash
find /data/def-bucket/.../20251206-1 -name "part.1" | while read f; do
# 获取 object key(从 bucket 后的路径)
rel_path="${f#/data/yms-def-bucket/}"
dest="/backup/${rel_path%/part.1}" # 去掉 part.1,保留原 key 作为文件名
mkdir -p "$(dirname "$dest")"
cp "$f" "$dest"
echo "Exported: $dest"
done
查 bucket 的后端类型,不需要权限
mc stat myminio/mybucket
通过HTTP的方式下载,也可以做并发或分块
# 并发下载(默认 mc 已优化,但可显式控制)
mc cp --parallel=8 myminio/mybucket/largefile ./largefile
# rclone(支持分块并发)
rclone copy minio:mybucket/path ./local --transfers=16