资讯动态

aarch64服务器MinIO部署实践:从二进制安装到systemd托管与踩坑指南

发布时间:2026/9/16 3:43:07 来源:尧图企业网站定制
说出来不怕大家笑话我第一次在aarch64服务器上装MinIO的时候以为这就是个三分钟的事——毕竟x86上装MinIO太简单了下载二进制、赋权、跑起来完事。结果在ARM机器上愣是折腾了一个多小时各种报错接踵而来cannot execute binary file、GLIBC_2.28 not found、systemd服务起不来、mc客户端又找不到对版本的包……后来我把这一整套流程重新梳理了一遍才意识到aarch64环境下的MinIO部署虽然官方确实提供了原生支持但很多细节和x86完全不一样踩坑的地方也不少。这篇文章就把我在鲲鹏、飞腾这类ARM64服务器上部署MinIO的完整过程、踩坑记录和最终能直接照抄的配置都写出来。内容覆盖环境检查、安装方式选型、systemd托管、mc客户端运维、权限控制以及单机跑通之后怎么往分布式扩展。不管你是刚接触对象存储的新手还是已经用过MinIO但第一次在ARM机器上部署的老手这篇文章应该都能帮你省下不少时间。1. 为什么aarch64上装MinIO值得单独写一篇1.1 MinIO到底是干什么的先给新朋友补个底MinIO是一个用Go语言开发的对象存储服务兼容Amazon S3协议。说白了你可以把它理解成部署在自己服务器上的私有S3。它以对象Object为单位存储数据每个对象存在一个存储桶Bucket里通过标准的RESTful API对外提供上传、下载、删除、列取等操作。这套东西解决的核心问题是你的应用需要存文件但你不想把文件堆在本地磁盘上、也不想把数据全交到公有云手里。用MinIO你可以拿任意一台Linux服务器把它跑起来然后用各种语言的S3 SDK往里读写数据前端也能通过预签名URL直接上传下载文件。对于需要存储海量小文件、图片、日志、备份数据的场景MinIO是相当主流的选择。1.2 aarch64特殊在哪为什么不是下载就能跑aarch64是ARM架构的64位指令集大家常说的鲲鹏920、飞腾FT-2000、Ampere Altra这些处理器都属于这个体系。过去ARM服务器被视为只能跑跑轻量Web服务的低功耗选手但这几年随着国产化替代和降本增效的趋势越来越多人把手里的存储、数据库、大数据组件往ARM架构上迁移。Go语言的优势在这里就体现出来了MinIO是Go写的交叉编译非常成熟官方直接发布linux-arm64的编译产物不需要你自己装Go工具链从源码构建。但官方支持不等于无脑安装。我在实际部署中遇到的问题包括下载时默认拿到x86_64的包执行直接报错部分老系统glibc版本太低新版MinIO二进制根本跑不起来mc客户端也有独立的arm64构建版本教程里给的链接经常是x86的systemd服务文件里如果写错路径或环境变量文件权限不对服务会反复重启。这些问题x86环境里基本遇不到但在aarch64上几乎是人人都会撞一遍的墙。所以这篇文章就按我实际操作的顺序一步步把整个部署链路拆开来讲。2. 安装前的环境检查架构、系统、磁盘一次摸清2.1 用uname -m确认架构别想当然不管什么机器动手之前第一件事就是确认当前系统的架构uname -m在64位ARM Linux上输出是aarch64。这里有个小细节很多人会混淆aarch64和arm64这两个名字其实它们是同一回事aarch64是ARM公司官方叫法Linux内核里统一用这个名字而arm64是Debian/Ubuntu的软件包架构命名。MinIO官网的下载路径用的是linux-arm64理解为aarch64的构建产物就行。顺带用lscpu看一眼处理器型号确认是鲲鹏还是飞腾这会影响后面某些依赖库的选型lscpu | grep -i model name2.2 系统和glibc版本检查决定你能用哪个版本的MinIOMinIO是Go编译的静态链接二进制理论上不太依赖系统动态库但实际构建时对glibc版本还是有要求的。检查方式cat /etc/os-release # 查看发行版 ldd --version | head -1 # 查看glibc版本不同系统的表现差异很大系统包管理器glibc版本情况对新版MinIO的支持CentOS 7.xyumglibc 2.17较新版本可能报GLIBC_2.28 not foundCentOS 8/Rocky/Almadnfglibc 2.28正常Ubuntu 18.04aptglibc 2.27部分新版本可能报错Ubuntu 20.04/Debian 10aptglibc 2.31正常麒麟V10 SP2yum/dnfglibc 2.28正常如果你手头是老系统比如CentOS 7.x我建议优先选择RELEASE.2024年之前的老版本MinIO二进制或者在系统层面升级glibc但这风险较高生产环境不建议轻易动。麒麟V10 SP1的glibc版本偏老SP2之后基本就没问题了。2.3 磁盘、端口和用户规划安装前把下面几件事想清楚能省掉后面很多麻烦数据盘挂载路径建议单独挂一块数据盘目录比如/data/minio不要把数据放在系统盘根目录下避免日志把根分区撑爆。端口规划MinIO的S3 API默认用9000端口Web控制台从2022年左右的版本开始默认是9001端口早期版本控制台端口是随机的。确认这两个端口没被占用ss -lntp | grep -E 9000|9001运行用户生产环境不要用root跑MinIO单独建一个系统用户最好。这个后面部署章节会详细写。3. 三种安装方式的取舍二进制、系统包还是容器3.1 二进制直接安装我最推荐的方式MinIO官方对aarch64的支持主要体现在直接提供编译好的二进制文件。下载地址固定格式是wget https://dl.min.io/server/minio/release/linux-arm64/minio这种方式的好处非常明显部署逻辑清晰、文件就一个、升级就是替换二进制文件、用systemd管理特别方便。而且你拿到的就是官方针对arm64的构建产物性能有保障。唯一的要求是glibc版本别太老这个前面已经说过。3.2 系统包安装省事但版本滞后有些Linux发行版的软件仓库里带了MinIO包比如通过yum install minio或apt install minio安装。但这里有个大坑仓库里的版本往往非常旧很多还停留在RELEASE.2020年左右的版本新版本里的Web控制台、桶版本控制、生命周期管理等特性全都没有。另外仓库里的MinIO如果不是专门为aarch64构建的也可能装到x86版本依然跑不起来。我的建议是系统包安装只适合快速体验功能不适合生产环境。3.3 Docker容器安装ARM设备上可行但容器运行时本身就是额外负担如果你的服务器上已经有Docker环境而且镜像支持arm64那用容器跑MinIO当然也可以docker run -d --name minio \ -p 9000:9000 -p 9001:9001 \ -e MINIO_ROOT_USERadmin \ -e MINIO_ROOT_PASSWORDyourpassword \ -v /data/minio:/data \ minio/minio server /data --console-address :9001但要注意在国产化服务器上很多时候你根本不希望额外装一个容器运行时。而且容器把日志、文件系统、网络都包了一层出了问题排查链路更长。对aarch64的裸金属服务器部署来说二进制方式始终是最干净、最可控的选择。4. 二进制方式部署MinIO的完整操作记录4.1 下载安装包并做基础检查在aarch64服务器上执行wget https://dl.min.io/server/minio/release/linux-arm64/minio chmod x minio file miniofile minio的输出里应该能看到类似ELF 64-bit LSB executable, ARM aarch64的字样。这一步非常重要我之前就是没看这个等到执行才报错。然后把文件放到系统路径sudo mv minio /usr/local/bin/ minio --version如果这里能正常输出版本号比如minio version RELEASE.2024-xx-xxTxx-xx-xxZ说明二进制在你这台机器上能跑环境基本没问题。4.2 创建专用于MinIO的系统用户和数据目录sudo useradd -r minio-user -s /sbin/nologin sudo mkdir -p /data/minio sudo chown -R minio-user:minio-user /data/minio这里解释一下为什么要建独立用户MinIO一旦被入侵或者出现配置错误如果是root运行攻击者直接拿到整台机器的权限用minio-user运行权限被限制在数据目录内风险小很多。-s /sbin/nologin表示这个用户不能登录Shell纯粹给服务用。4.3 首次前台启动验证功能先把MinIO以前台方式跑起来确认能正常工作再转systemd。设好两个最核心的环境变量export MINIO_ROOT_USERminioadmin export MINIO_ROOT_PASSWORD你的高强度密码 /usr/local/bin/minio server /data/minio --address :9000 --console-address :9001看到类似下面的日志就说明启动成功了API: http://192.168.x.x:9000 http://127.0.0.1:9000 Console: http://192.168.x.x:9001 http://127.0.0.1:9001用浏览器访问http://服务器IP:9001输入上面设置的用户名密码能登录控制台就说明服务正常。这里务必记住两个端口的分工9000是程序对接用的S3 API端口9001是给管理员用的Web控制台端口别搞混。4.4 参数和环境变量说明新手最容易困惑的是MinIO的配置方式。MinIO的设计哲学是配置全靠环境变量和启动参数没有传统意义上的minio.conf。常用的有这么几个参数/环境变量作用默认值MINIO_ROOT_USER管理员用户名minioadminMINIO_ROOT_PASSWORD管理员密码minioadmin--addressS3 API监听地址和端口:9000--console-addressWeb控制台监听地址和端口随机端口MINIO_BROWSER设为off可关闭Web控制台onMINIO_PROMETHEUS_AUTH_TYPEPrometheus监控鉴权类型public特别提醒--console-address在一开始就必须显式指定否则控制台会占用一个随机端口你得去日志里翻地址很不方便。生产环境里我还会用Nginx把9001端口反代到内网不让控制台直接暴露在公网。如果你要在aarch64上编译Nginx做反代记得用configure时加--with-http_ssl_module并指定正确的交叉编译参数这块内容比较多后面有机会单独写一篇。5. systemd托管MinIO从前台进程到稳定服务5.1 编写环境变量文件前台跑通之后我们要把它变成开机自启、崩溃自动拉起的系统服务。先建一个环境变量文件避免把密码直接写进service文件里sudo mkdir -p /etc/minio sudo vim /etc/minio/env内容如下MINIO_ROOT_USERminioadmin MINIO_ROOT_PASSWORD你的高强度密码文件权限必须设置好这一步是新手最容易踩的坑sudo chown root:root /etc/minio/env sudo chmod 600 /etc/minio/env如果权限太宽比如644systemd会直接拒绝加载这个EnvironmentFile并报错Bad message或者拒绝启动因为systemd不允许存在全局可读的service环境变量文件。5.2 编写systemd service单元文件创建/etc/systemd/system/minio.service[Unit] DescriptionMinIO Object Storage Documentationhttps://docs.min.io Wantsnetwork-online.target Afternetwork-online.target [Service] Userminio-user Groupminio-user EnvironmentFile/etc/minio/env ExecStart/usr/local/bin/minio server /data/minio --address :9000 --console-address :9001 Restartalways RestartSec10 LimitNOFILE65536 TimeoutStopSec20 [Install] WantedBymulti-user.target几个关键点的选择理由Restartalways搭配RestartSec10MinIO进程如果异常退出systemd会在10秒后自动拉起。对象存储这种核心组件稳定性是第一位的进程挂了必须自动恢复。LimitNOFILE65536MinIO作为存储服务高并发场景下文件描述符消耗非常大。Linux默认的1024完全不够用这里直接放大到65536。TimeoutStopSec20停止服务时给进程20秒时间做优雅退出让还没写完的数据落盘避免强制kill导致数据损坏。5.3 启动、设置开机自启并验证sudo systemctl daemon-reload sudo systemctl enable --now minio sudo systemctl status minio看到Active: active (running)就说明服务已经由systemd托管了。确认端口监听ss -lntp | grep -E 9000|9001 journalctl -u minio -f最后一条命令会实时滚动输出MinIO的日志排查问题的时候非常有用。比如连接数过多、权限报错、S3请求异常都能在这里看到。6. mc命令行客户端的安装与日常运维操作6.1 aarch64上安装mc客户端服务端起来了日常管理还得靠命令行工具。mc是MinIO官方的客户端它对aarch64同样有原生构建wget https://dl.min.io/client/mc/release/linux-arm64/mc chmod x mc sudo mv mc /usr/local/bin/ mc --version这个下载路径的linux-arm64目录同样容易被人忽略。很多人拿着x86的教程复制了https://dl.min.io/client/mc/release/linux-amd64/mc这个地址在ARM机器上下载最后执行时撞上Exec format error。检查方法一样file mc出现ARM aarch64字样就对了。6.2 配置alias并执行常用操作mc本身不保存连接信息每次操作前要先通过alias指定一个MinIO服务端mc alias set local http://127.0.0.1:9000 minioadmin 你的密码常用操作一览mc ls local # 列出所有桶 mc mb local/my-bucket # 创建桶 mc cp ./test.pdf local/my-bucket/ # 上传文件 mc ls local/my-bucket # 列出桶内对象 mc cat local/my-bucket/test.pdf | head -100 # 查看对象内容 mc cp local/my-bucket/test.pdf ./download/ # 下载文件 mc rm local/my-bucket/test.pdf # 删除对象 mc du local/my-bucket # 查看桶占用的存储空间6.3 匿名访问控制别让你的桶裸奔热词里有一条minio ?max-keys 我的意思是不想让匿名用户访问这个这其实是很多人在部署后遇到的权限问题。MinIO默认创建的桶是私有的匿名用户不能列对象、不能下载。但如果你在控制台或命令行里给桶设置了公共读取策略那任何人只要知道URL就能不带任何凭证直接访问。用mc检查桶的匿名策略mc anonymous get local/my-bucket输出access: private说明是私有的。如果返回download或其他值说明桶对外公开了立即收回mc anonymous set none local/my-bucket顺带解释一下max-keys它是S3协议中ListObjects接口的参数控制单次列取请求返回的最大对象数量默认1000。如果你在排查匿名访问问题看到?max-keys这样的查询参数说明有人正在通过API列取你的桶内容这往往是恶意扫描的特征需要结合访问日志仔细查。6.4 针对Java/SDK上传承接的提醒很多团队的Java应用对接MinIO用的就是S3 SDK。在aarch64上不需要额外的特殊配置因为SDK走的是HTTP协议跟服务端架构无关。只要在代码里把endpoint设置为http://服务器IP:9000并配置好AccessKey和SecretKey就是MINIO_ROOT_USER和MINIO_ROOT_PASSWORD更正规的做法是在控制台里为应用单独创建Access Key就能正常读写。唯一要注意的是客户端必须能访问9000端口别把客户端连接端口和控制台端口搞混。7. 部署过程中踩过的坑与完整排查链路这一部分是我最想写的。下面是实际部署中遇到过的问题我按排查链路来呈现而不是直接给结论方便你以后遇到类似问题能自己顺着思路查。7.1 坑一执行报cannot execute binary file报错长这样bash: ./minio: cannot execute binary file排查链路先执行file minio看输出的架构信息。如果显示x86-64说明下载错了架构的包。检查uname -m确认当前确实是aarch64。回到官网或官方下载路径确认拿的是linux-arm64目录下的文件。这个坑的根源在于很多教程直接给linux-amd64链接新手复制粘贴就是x86的包。永远先file确认架构再执行。7.2 坑二GLIBC_2.28 not found报错示例./minio: /lib/aarch64-linux-gnu/libc.so.6: version GLIBC_2.28 not found排查链路ldd --version确认系统glibc版本。如果是CentOS 7.xglibc是2.17新版MinIO基本跑不了。确认系统发行版能不能升级。CentOS 7已经无法平滑升级到glibc 2.28不要去手动替换libc极大概率把系统搞崩。正确的解法是下载旧版MinIO。去GitHub的minio/minio仓库Releases页面找2023年之前发布版本中支持Linux ARM64的构建。或者换个思路把系统迁移到CentOS 8/Rocky Linux/AlmaLinux/麒麟V10 SP2以上。麒麟V10的用户尤其注意这一点V10 SP1的glibc偏老部分新版MinIO会报这个错SP2基本就能直接用最新版本了。7.3 坑三systemd服务启动后又退出现象systemctl start minio之后systemctl status minio显示active (running)但过几秒再看就变成failed了。排查链路先看日志这是最重要的第一步journalctl -u minio -n 50 --no-pager如果日志里出现权限类报错检查数据目录的所有者ls -ld /data/miniominio-user必须对数据目录有读写权限我之前就是忘了chown导致服务反复启动失败。如果日志里出现Bad message或者not a valid之类的提示重点检查EnvironmentFile的权限。systemd要求/etc/minio/env权限不能是全局可读的改成600即可。如果日志里提示端口被占用用ss -lntp | grep 9000查占用进程把冲突的服务停掉或者改掉MinIO端口。7.4 坑四本机能访问其他机器访问不了现象在服务器本机curl 9001端口是通的但从办公网访问不通。排查链路确认监听地址不是127.0.0.1。看到API: http://127.0.0.1:9000说明监听在内网回环上改启动参数--address :9000监听所有网卡。检查防火墙。CentOS/麒麟系统firewall-cmd --permanent --add-port9000/tcp firewall-cmd --permanent --add-port9001/tcp firewall-cmd --reload如果是云主机或虚拟化环境还要检查安全组规则和网络ACL这个经常被忽略。最后检查SELinux。可以临时用setenforce 0测试如果关了就能访问说明是SELinux拦截需要给MinIO放行端口或二进制文件策略不要图省事长期关闭SELinux。7.5 坑五高并发下报too many open files现象测试压测或者大量并发请求时日志里不断出现accept tcp: too many open files。排查链路先看当前进程的fd限制cat /proc/$(pgrep -f minio server)/limits | grep open files如果soft limit是1024说明systemd没把LimitNOFILE生效。检查service文件里是否写了LimitNOFILE65536写完有没有执行systemctl daemon-reload。还可以顺手调一下系统全局的fs.file-maxsudo sysctl -w fs.file-max10485767.6 坑六分布式模式下节点时间不同步导致异常如果你后面准备搭分布式集群提前给你提个醒MinIO分布式模式对节点时间同步非常敏感时间偏差过大会导致服务异常或请求失败。部署前统一装好时间同步sudo yum install -y chrony sudo systemctl enable --now chronyd8. 单机跑通之后分布式扩展与MinIO/HDFS选型8.1 从单机到分布式纠删码模式单机部署只是第一步。生产环境里数据可靠性是绕不开的问题。MinIO的分布式模式不需要额外安装任何软件只需在启动参数里指定多个节点的磁盘路径/usr/local/bin/minio server --address :9000 \ http://node1/data/minio \ http://node2/data/minio \ http://node3/data/minio \ http://node4/data/minio每台节点上都要执行同样的启动命令数据会被自动打散存储。这里面的核心机制是纠删码Erasure Coding数据分片后冗余存储当部分磁盘甚至整台节点损坏时依然能通过剩余的数据片完整还原文件。4节点、每节点1块盘的配置最多允许2块盘同时损坏而不丢数据。我的建议是生产环境最少4节点、每节点配4块盘起步也就是16块盘可以容忍4块盘同时故障可靠性已经高于大多数业务的需求了。8.2 MinIO和HDFS怎么选热词里有人在对比MinIO和HDFS这俩确实容易让人纠结。我列个表直接说结论对比维度MinIOHDFS产品定位对象存储S3标准协议分布式文件系统访问接口RESTful API各语言SDK齐全Java API为主附带Shell命令文件大小适应性非常适合几十KB到几百MB的对象适合GB级大文件大量小文件有性能瓶颈小文件处理能力强无NameNode单点瓶颈弱NameNode内存压力大部署复杂度一个二进制文件即可启动需要NameNode、DataNode、ZooKeeper等组件云原生/容器适配天然适配K8s集成成熟比较复杂需要额外适配ARM/aarch64支持官方原生支持部分版本和组件可能有兼容问题典型场景Web应用文件存储、备份、日志、数据湖离线大数据计算、MapReduce/Spark作业怎么选我的经验是如果你的业务是大数据离线计算比如跑Spark、Hive做数仓那HDFS和整个生态的契合度确实更好但如果你只是需要一个文件存储服务给Java/Python应用提供上传下载接口或者要存日志和备份数据MinIO明显更合适部署成本低、维护简单、生态兼容性也好。在aarch64这种ARM架构下MinIO比HDFS省心得多这也是这两年国产化项目里S3兼容对象存储越来越流行的原因。8.3 最后分享一个实操小技巧部署完成后强烈建议立即做两件事第一把MINIO_ROOT_USER和MINIO_ROOT_PASSWORD妥善备份到密码管理器里MinIO不像MySQL有密码找回机制管理员密码丢了基本只能重置数据目录里的配置第二定期用mc做一次桶和策略的巡检列出所有桶、检查匿名权限尤其是团队里有人不小心改过桶策略的情况。我见过不止一次桶被设成公共下载导致数据裸奔在公网上最后都是靠mc anonymous get逐桶排查出来的。养成习惯这类风险就能在早期被控制住。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价