简体中文
如何交叉编译 MinIO 二进制并在 Linux 环境部署

背景痛点
在日常运维或开发中,部署对象存储服务 MinIO 时,如今常常会遭遇“无包可用”的窘境,主要有以下三大痛点:
- 官方直链返回 410 Gone:早期大家习惯直接通过
wget https://dl.min.io/server/minio/release/linux-amd64/minio下载,但官方现已彻底移除该直接下载路径,请求会直接报错410 Gone。 - GitHub Releases 仅有源码:当你想去 GitHub 寻找编译好的二进制备份时,会发现官方将所有 Release 标签改为了 Source Only(仅提供源码)。正如你切换 Tag 时终端提示的:
point to source only releases。 - GLIBC 依赖冲突:即便你通过其他渠道找到了最新的官方二进制包,它也会依赖
GLIBC_2.28+,而老旧的服务器(如 CentOS 7 仅自带GLIBC_2.17)运行时会直接报错:bashminio: /lib64/libc.so.6: version `GLIBC_2.28' not found
终极解决方案:既然“无包可用”,那我们就自己造。借助 Go 语言的静态编译特性,我们直接拉取源码,在本地(或任意机器)交叉编译出一个自带所有依赖的 minio 二进制文件。这样编译出来的文件是 statically linked(静态链接),不依赖宿主机的任何系统库,完美兼容 CentOS 7、Ubuntu 18.04/20.04/22.04 等所有 Linux 发行版。
一、编译环境准备
为了编译,你需要一台安装了 Go 语言环境 的机器(可以是开发机、Mac、Windows 的 WSL,甚至是另一台 Linux 服务器)。
1. 安装 Go 环境 (以 Linux 为例)
bash
# 下载 Go 压缩包(请根据官方最新版本调整版本号)
wget https://go.dev/dl/go1.23.2.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.23.2.linux-amd64.tar.gz
# 配置环境变量
echo 'export PATH=$PATH:/usr/local/go/bin' >> /etc/profile
echo 'export GOPROXY=https://goproxy.cn,direct' >> /etc/profile # 国内建议配置代理
source /etc/profile
# 验证
go version二、拉取源码并编译
1. 克隆源码并切换到指定版本
为了保证稳定性,建议切换到一个明确的 Release 标签(Tag)。
bash
# 克隆官方仓库
git clone https://github.com/minio/minio
cd minio
# 查看可用标签并切换(这里以 2025-10-15 版本为例)
# 注意:切换后你处于 detached HEAD 状态,这是正常的
git checkout RELEASE.2025-10-15T17-29-55Z2. 交叉编译生成二进制文件
MinIO 官方仓库包含完整的依赖,我们可以直接使用 go build 命令进行编译。针对 Linux 64 位系统,执行以下命令:
bash
# 指定目标系统为 Linux,架构为 amd64
GOOS=linux GOARCH=amd64 go build -o minio main.go编译小贴士:
- 如果你需要编译 ARM 架构(例如树莓派、鲲鹏服务器),将
GOARCH=amd64改为GOARCH=arm64。- 如果你在 Mac (M芯片) 上直接编译,同样使用上述命令即可完成交叉编译。
- 如果想减小文件体积,可以在命令前加上
-ldflags="-s -w"去掉调试信息,例如:GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o minio main.go。
3. 验证二进制文件属性
编译完成后,检查生成的文件:
bash
file minio你会看到如下输出:
minio: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked...
看到 statically linked 就说明成功了。由于是静态链接,它不会受 CentOS 7 老版本 GLIBC 的任何影响。
三、在 Linux 环境中部署 (以 CentOS 7 为例)
无论你是 CentOS 7 还是 Ubuntu,接下来的部署步骤完全通用。
1. 安装二进制文件
bash
# 将编译好的 minio 拷贝到系统执行目录
cp minio /usr/local/bin/minio
chmod +x /usr/local/bin/minio
# 测试是否正常运行
minio --version2. 创建专用用户和数据目录
出于安全考虑,不要使用 root 运行 MinIO。
bash
# 创建系统用户
groupadd -r minio-user
useradd -M -r -g minio-user minio-user
# 创建数据存放目录
mkdir -p /data/minio
chown -R minio-user:minio-user /data/minio3. 配置环境变量
创建配置文件 /etc/default/minio:
bash
cat > /etc/default/minio <<'EOF'
# 管理员账号和密码(密码至少 8 位)
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=Admin@123456
# 数据存储目录
MINIO_VOLUMES="/data/minio"
# 端口配置:9000 是 S3 API 端口,9001 是 Web 控制台端口
MINIO_OPTS="--address :9000 --console-address :9001"
EOF4. 配置 Systemd 服务
创建服务文件 /etc/systemd/system/minio.service:
bash
cat > /etc/systemd/system/minio.service <<'EOF'
[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
WorkingDirectory=/usr/local
User=minio-user
Group=minio-user
EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo 'Variable MINIO_VOLUMES not set in /etc/default/minio'; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
Restart=always
LimitNOFILE=65536
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
EOF5. 启动服务
bash
# 重载 systemd
systemctl daemon-reload
# 设置开机自启
systemctl enable minio
# 启动服务
systemctl start minio
# 查看状态
systemctl status minio正常情况下应该类似如下的状态信息
● minio.service - MinIO
Loaded: loaded (/etc/systemd/system/minio.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2026-11-04 12:01:55 CST; 4s ago
Docs: https://min.io/docs/minio/linux/index.html
Process: 7231 ExecStartPre=/bin/bash -c if [ -z "${MINIO_VOLUMES}" ]; then echo 'Variable MINIO_VOLUMES not set in /etc/default/minio'; exit 1; fi (code=exited, status=0/SUCCESS)
Main PID: 7233 (minio)
Tasks: 14
Memory: 73.2M
CGroup: /system.slice/minio.service
└─7233 /usr/local/bin/minio server --address :9000 --console-address :9001 /data/minio
Nov 04 12:01:55 localhost.localdomain systemd[1]: Started MinIO.
Nov 04 12:01:56 localhost.localdomain minio[7233]: INFO: Formatting 1st pool, 1 set(s), 1 drives per set.
Nov 04 12:01:56 localhost.localdomain minio[7233]: INFO: WARNING: Host local has more than 0 drives of set. A host failure will result in data becoming unavailable.
Nov 04 12:01:56 localhost.localdomain minio[7233]: MinIO Object Storage Server
Nov 04 12:01:56 localhost.localdomain minio[7233]: Copyright: 2015-2026 MinIO, Inc.
Nov 04 12:01:56 localhost.localdomain minio[7233]: License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
Nov 04 12:01:56 localhost.localdomain minio[7233]: Version: DEVELOPMENT.GOGET (go1.27.3 linux/amd64)
Nov 04 12:01:56 localhost.localdomain minio[7233]: API: http://192.168.9.238:9000 http://172.17.0.1:9000 http://127.0.0.1:9000
Nov 04 12:01:56 localhost.localdomain minio[7233]: WebUI: http://192.168.9.238:9001 http://172.17.0.1:9001 http://127.0.0.1:9001
Nov 04 12:01:56 localhost.localdomain minio[7233]: Docs: https://docs.min.io6. 防火墙放行
bash
firewall-cmd --permanent --add-port=9000/tcp
firewall-cmd --permanent --add-port=9001/tcp
firewall-cmd --reloadbash
ufw allow 9000/tcp
ufw allow 9001/tcp
ufw reload7. 验证防火墙规则
bash
# 查看当前已放行的端口
firewall-cmd --list-ports
# 查看所有防火墙规则(更详细)
firewall-cmd --list-all
# 单独确认 9000 / 9001 是否已放行
firewall-cmd --query-port=9000/tcp
firewall-cmd --query-port=9001/tcpbash
# 查看防火墙状态及规则列表
ufw status
# 查看带编号的规则列表(便于后续删除)
ufw status numbered
# 单独确认 9000 / 9001 是否已放行
ufw status | grep -E '9000|9001'说明:
firewall-cmd --query-port会返回yes/no,直接表明端口是否已放行;ufw status会列出所有规则,配合grep可快速过滤出目标端口;- 若防火墙未启用,
ufw status会显示Status: inactive,此时规则不会生效,可先用ufw enable启用。
四、访问与验证
打开浏览器,访问 http://<你的服务器IP>:9001:

- 用户名:
admin - 密码:
Admin@123456
登录后即可看到全新的 MinIO 控制台。类似如下的界面,可以看到我已经创建了一个 nfs-share 对象桶,并通过批量上传的方式,上传了多张图片。

五、补充:安装 MinIO 客户端 (mc)
mc(MinIO Client)是一个独立的开源仓库(github.com/minio/mc),用于管理 S3 兼容的对象存储。与服务端一样,官方最新发布的 mc 二进制文件由于依赖新版 GLIBC,在 CentOS 7 上直接运行会报错。
幸运的是,MinIO 官方的 GitHub Releases 页面直接提供了多平台、多格式的预编译产物(包含 .rpm、.deb 和独立的二进制文件)。这些安装包内置了静态链接,完全兼容老旧的 Linux 系统。
你可以直接前往 minio/mc Releases 页面下载最新的 .rpm 包(例如 mcli-20250813083541.0.0-1.x86_64.rpm),然后通过 yum 直接安装:
bash
# 使用 yum 安装下载的 rpm 包
yum install -y ./mcli-20250813083541.0.0-1.x86_64.rpm安装完成后,验证是否安装成功(注意:安装包可能将命令注册为 mc 或 mcli,取决于具体的打包规范):
bash
# 尝试运行 mc 命令
mc --version如果输出类似于以下内容,说明 mc 命令可用:
txt
mc version RELEASE.2022-06-11T21-10-36Z如果提示找不到 mc 命令,请尝试使用 mcli:
bash
# 尝试运行 mcli 命令
mcli --version预期输出类似如下(包含详细的构建信息):
txt
mcli 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>(注:如果你的系统不支持 RPM 包,或者你只需要一个纯二进制文件,可以在 Releases 页面寻找 linux-amd64 的裸二进制文件,下载后直接 chmod +x 赋予执行权限即可使用。)
配置并使用 mc
安装完成后,配置 mc 别名来管理刚刚部署好的 MinIO 服务端:
bash
# 设置别名(local 是你的别名)
mc alias set local http://127.0.0.1:9000 admin Admin@123456正常情况下,你将看到类似如下的初始化日志:
txt
mc: Configuration written to `/root/.mc/config.json`. Please update your access credentials.
mc: Successfully created `/root/.mc/share`.
mc: Initialized share uploads `/root/.mc/share/uploads.json` file.
mc: Initialized share downloads `/root/.mc/share/downloads.json` file.
Added `local` successfully.配置完成后,测试连接并查看存储桶:
bash
mc ls local总结
面对官方直链 410 报错、GitHub 仅留源码,以及老旧系统(如 CentOS 7)的 GLIBC 依赖地狱,拥抱开源软件的“源码编译”是当下最彻底、最一劳永逸的解决方案。Go 语言优秀的静态编译特性,让生成的二进制文件真正做到了“一次编译,到处运行”。建议后续如果需要升级,也直接复用这套流程,用源码打出新版本的包即可。
