使用树莓派搭建属于自己的对象存储

简介: raspberry pi, oss, minio, 对象存储, 树莓派, golang


本文适用

如果你手上有一块闲置的树莓派,或者其它类似设备(矿渣,稍有算力的路由器等),当前还在闲置,或者在做一些软路由/NAS的功能,还想发挥更大的预热,用来做对象存储,方便你的文件以对象的方式进行保存和访问。如果具备外网访问,则方便在更多地方访问。


关于树莓派

笔者当前使用的是3B版本(https://www.raspberrypi.org/products/raspberry-pi-3-model-b/),烧录的是官方Raspberry Pi OS系统(之前的Raspbian)。为了后续方便,我们启用root账户:

pi@raspberrypi:~ $ sudo passwd root
New password:
Retype new password:
passwd: password updated successfully
pi@raspberrypi:~ $ su root
Password:
root@raspberrypi:/home/pi#


关于minio

MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

访问网址 http://docs.minio.org.cn/docs/


minio具备多种硬件架构发行版(参见http://dl.minio.org.cn/server/minio/release/),为了后面二次开发方便,建议使用源码在树莓派上编译安装。如果第一次为了尝鲜,可以直接跳到安装minio中的step1(直接使用二进制文件版本)


如果希望使用源码编译安装,并且之前树莓派没有安装过Golang的IDE或者版本偏低,则需要继续下面内容。


除了在树莓派上安装Golang编译的方式外,还可以使用交叉编译的方式在普通PC中设定好目标Arch,编译出适配树莓派架构的二进制文件,下载到树莓派中直接使用。本文后面内容仅介绍直接使用树莓派编译安装minio的过程

安装golang开发环境

使用apt-get默认安装的是低版本golang,如果之前已经安装了低版本的golang,使用下面命令卸载掉

apt-get purge golang-go

go下载地址: https://golang.org/dl/#stable

这里根据手头上实际的arm架构进行下载,我下载的是go1.16.2.linux-arm64.tar.gz,下载好放在树莓派上,解压

tar zxvf go1.16.2.linux-arm64.tar.gz -C /usr/local

设置环境变量:为了方便以后使用Go开发,以及方便使用Go生成的可执行文件,我们将下述配置加到 /etc/bash.bashrc 

# Go IDE  exportGOPROXY=https://goproxy.cn,direct
exportGOPATH=/root/go
exportGOBIN=$GOPATH/bin
exportPATH=$PATH:/usr/local/go/bin:$GOBIN

上述的 /root/go 是日常的开发环境,我们创建好这个文件夹。

GOPROXY 是设置中国代理地址,速度更快。

GOBIN 是编译好的二进制程序,加到系统Path方便日后访问。


使用 source /etc/bash.bashrc 则立即生效新的环境变量。

启动文件bash.bashrc的位置随使用的Linux发行版不同而有所区别

我们可以测试下Golang是否正确安装

root@raspberrypi:~/go# go versiongo version go1.16.2 linux/arm

安装和启动minio

下面2种安装minio方式任选其一

直接安装二进制文件

root@raspberrypi:~/go/bin# wget https://dl.minio.io/server/minio/release/linux-arm/minio

编译安装

开源源码地址,https://github.com/minio/minio

下面段落 即介绍了如何从代码安装和编译:

GO111MODULE=on go get github.com/minio/minio

上面这种方式是以pkg的方式下载编译。我们可以采用另外一种方式编译安装,即在$GOPATH下面创建一个src,git clone下来代码进行编译安装

root@raspberrypi:~/go# mkdir -p srcroot@raspberrypi:~/go# cd srcroot@raspberrypi:~/go/src# git clone git@github.com:minio/minio.git  root@raspberrypi:~/go/src# cd minioroot@raspberrypi:~/go/src/minio# go install -v

启动minio server

miniio默认密码是 minioadmin/minioadmin 。 如果直接使用默认密码组可能会涉及到安全问题及提示。可以修改minio的访问授权信息,在树莓派中输入以下命令:

exportMINIO_ACCESS_KEY=minio123
exportMINIO_SECRET_KEY=minio123

假如我们希望将所有数据存在 /data 路径,执行下述命令启动程序

root@raspberrypi:~/go/bin# ./minio server /data                                                                                                                                                                        │···························································Attempting encryption of all config, IAM users and policies on MinIO backend                                                                                                                                       │···························································
Endpoint: http://192.168.1.4:9000  http://127.0.0.1:9000 
...

使用

基于Web管控界面使用

在同一局域网的PC的浏览器中输入上面提示的url,按提示输入上面的accessKey和Secret,立即登录


image.png



如上,右下角可以创建bucket,并上传一个本地文件试试

image.png


基于SDK使用minio

minio支持Java, Golang, python, JS, .net等几种语言的SDK。文档可以参见http://docs.minio.org.cn/docs/master/golang-client-quickstart-guide。

下面我们以Golang为例,实现windows上一个简单的上传本地文件到对象存储服务中的demo。代码如下:

packagemainimport (    
"log""os""path/filepath""github.com/minio/minio-go")
funcmain() {
iflen(os.Args) !=3 {
log.Printf("Run Program like FileUploader.exe demo.txt demo\n");
return;
    }
fileName :=os.Args[1]
objectName :=os.Args[2]
log.Printf("Input File Name %s\n", fileName)
endpoint :=`192.168.1.4:9000`accessKeyID :="minio123"secretAccessKey :="minio123"useSSL :=false// get a minio clientminioClient, err :=minio.New(endpoint, accessKeyID, secretAccessKey, useSSL)
iferr!=nil {
log.Fatalln(err)
    }
bucketName :="demo"location :="us-east-1"err=minioClient.MakeBucket(bucketName, location)
iferr!=nil {
exists, err :=minioClient.BucketExists(bucketName)
iferr==nil&&exists {
log.Printf("We already own %s\n", bucketName)
        } else {
log.Fatalln(err)
        }
    }
log.Printf("Successfully created %s\n", bucketName)
filePath, err:=filepath.Abs(fileName)
ifnil==err {        
contentType :="application/text"n, errPut :=minioClient.FPutObject(bucketName, objectName, filePath, minio.PutObjectOptions{ContentType:contentType})
iferrPut!=nil {
log.Fatalln(errPut)
        }       
log.Printf("Successfully uploaded %s of size %d\n", objectName, n)
    } else {
log.Printf("Can not get file %s abs path, error %s", fileName, err)
    }
}

windows下安装Golang的IDE本文就不赘述了。假定我们的$GOPATH位于D:\go, 我们在$GOPATH下的src中创建一个文件夹file,将上述go文件放在其中,编译,生成可执行二进制文件(下述操作在windows powershell上执行)

PSD:\go\src\file>gomodinitgo: creatingnewgo.mod: modulefilego: toaddmodulerequirementsandsums:
gomodtidyPSD:\go\src\file>gomodtidygo: findingmoduleforpackagegithub.com/minio/minio-go...
PSD:\go\src\file>gobuild.\FileUploader.goPSD:\go\src\file>lsDirectory: D:\go\src\fileModeLastWriteTimeLengthName----------------------------a---2021/3/2110:167460864FileUploader.exe-a---2021/3/2110:131332FileUploader.go-a---2021/3/2110:15401go.mod-a---2021/3/2110:153266go.sum

执行命令

PSD:\go\src\file>.\FileUploader.exeD:\test.txtdemo2021/03/2114:15:29InputFileNameD:\test.txt2021/03/2114:15:29Wealreadyowndemo2021/03/2114:15:29Successfullycreateddemo2021/03/2114:15:29Successfullyuploadeddemoofsize2

通过web管控界面查看:

image.png

成功将一个文件上传成功!

小结

上述我们介绍minio均是从本地局域网作为endpoint进行访问。如果树莓派已经具备外网访问,则可以将minio打造成一个真正的私人对象存储服务。

相关实践学习
对象存储OSS快速上手——如何使用ossbrowser
本实验是对象存储OSS入门级实验。通过本实验,用户可学会如何用对象OSS的插件,进行简单的数据存、查、删等操作。
目录
相关文章
|
11月前
|
机器学习/深度学习 数据采集 监控
量化交易机器人开发风控模型对比分析与落地要点
本文系统对比规则止损、统计模型、机器学习及组合式风控方案,从成本、鲁棒性、可解释性等维度评估其在合约量化场景的适用性,结合落地实操建议,为不同阶段的交易系统提供选型参考。
|
存储 分布式计算 安全
阿里云服务器ECS实例选型参考:场景适配、应用推荐
选择阿里云服务器ECS实例之前,需要结合性能、价格、工作负载等因素,做出性价比与稳定性最优的决策。对于很多新手用户来说,在初次购买阿里云服务器的时候,面对众多实例规格往往不知道如何选择,因为云服务器实例规格不同,价格也不一样,性能表现更是千差万别。因此,在购买阿里云服务器ECS实例之前,需要结合性能、价格、工作负载等因素,做出性价比与稳定性最优的决策。本文将通过一些常见的选型场景推荐,为大家详细介绍阿里云服务器实例选型的最佳实践,便于大家在选择云服务器实例规格时做个参考。
|
存储 缓存 API
信息检索重排序技术深度解析:Cross-Encoders、ColBERT与大语言模型方法的实践对比
本文将深入分析三种主流的重排序技术:Cross-Encoders(交叉编码器)、ColBERT以及基于大语言模型的重排序器,并详细阐述各方案在实际应用中的性能表现、成本考量以及适用场景。
1197 3
信息检索重排序技术深度解析:Cross-Encoders、ColBERT与大语言模型方法的实践对比
|
弹性计算 前端开发 NoSQL
2025最新阿里云服务器配置选择攻略:CPU、内存、带宽与系统盘全解析
本文详解2025年阿里云服务器ECS配置选择策略,涵盖CPU、内存、带宽与系统盘推荐,助你根据业务需求精准选型,提升性能与性价比。
|
应用服务中间件 nginx Docker
docker应用部署---nginx部署的配置
这篇文章介绍了如何使用Docker部署Nginx服务器,包括搜索和拉取Nginx镜像、创建容器并设置端口映射和目录映射,以及如何创建一个测试页面并使用外部机器访问Nginx服务器。
|
存储 算法 安全
|
存储
数据结构学习记录——什么是堆(优先队列、堆的概念、最大堆最小堆、优先队列的完全二叉树表示、堆的特性、堆的抽象数据类型描述)
数据结构学习记录——什么是堆(优先队列、堆的概念、最大堆最小堆、优先队列的完全二叉树表示、堆的特性、堆的抽象数据类型描述)
701 2
|
存储 JavaScript 前端开发
Node 中的 AsyncLocalStorage 的前世今生和未来(一)
作者系统详实的介绍了什么是AsyncLocalStorage、如何使用、Node 是如何实现的 AsyncHook等。不论你是0基础还是对此API有些了解的读者都比较适合阅读此文。(文末有活动)

热门文章

最新文章