本文适用
如果你手上有一块闲置的树莓派,或者其它类似设备(矿渣,稍有算力的路由器等),当前还在闲置,或者在做一些软路由/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 export GOPROXY=https://goproxy.cn,direct export GOPATH=/root/go export GOBIN=$GOPATH/bin export PATH=$PATH:/usr/local/go/bin:$GOBIN
上述的 /root/go
是日常的开发环境,我们创建好这个文件夹。
GOPROXY
是设置中国代理地址,速度更快。
GOBIN
是编译好的二进制程序,加到系统Path方便日后访问。
使用 source /etc/bash.bashrc
则立即生效新的环境变量。
启动文件bash.bashrc的位置随使用的Linux发行版不同而有所区别
我们可以测试下Golang是否正确安装
root@raspberrypi:~/go# go version go 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 src root@raspberrypi:~/go# cd src root@raspberrypi:~/go/src# git clone git@github.com:minio/minio.git root@raspberrypi:~/go/src# cd minio root@raspberrypi:~/go/src/minio# go install -v
启动minio server
miniio默认密码是 minioadmin/minioadmin
。 如果直接使用默认密码组可能会涉及到安全问题及提示。可以修改minio的访问授权信息,在树莓派中输入以下命令:
export MINIO_ACCESS_KEY=minio123 export MINIO_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,立即登录
如上,右下角可以创建bucket,并上传一个本地文件试试
基于SDK使用minio
minio支持Java, Golang, python, JS, .net等几种语言的SDK。文档可以参见http://docs.minio.org.cn/docs/master/golang-client-quickstart-guide。
下面我们以Golang为例,实现windows上一个简单的上传本地文件到对象存储服务中的demo。代码如下:
package main import ( "log" "os" "path/filepath" "github.com/minio/minio-go" ) func main() { if len(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 client minioClient, err := minio.New(endpoint, accessKeyID, secretAccessKey, useSSL) if err != nil { log.Fatalln(err) } bucketName := "demo" location := "us-east-1" err = minioClient.MakeBucket(bucketName, location) if err != nil { exists, err := minioClient.BucketExists(bucketName) if err == 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) if nil == err { contentType := "application/text" n, errPut := minioClient.FPutObject(bucketName, objectName, filePath, minio.PutObjectOptions{ContentType:contentType}) if errPut != 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上执行)
PS D:\go\src\file> go mod init go: creating new go.mod: module file go: to add module requirements and sums: go mod tidy PS D:\go\src\file> go mod tidy go: finding module for package github.com/minio/minio-go ...
PS D:\go\src\file> go build .\FileUploader.go PS D:\go\src\file> ls Directory: D:\go\src\file Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2021/3/21 10:16 7460864 FileUploader.exe -a--- 2021/3/21 10:13 1332 FileUploader.go -a--- 2021/3/21 10:15 401 go.mod -a--- 2021/3/21 10:15 3266 go.sum
执行命令
PS D:\go\src\file> .\FileUploader.exe D:\test.txt demo 2021/03/21 14:15:29 Input File Name D:\test.txt 2021/03/21 14:15:29 We already own demo 2021/03/21 14:15:29 Successfully created demo 2021/03/21 14:15:29 Successfully uploaded demo of size 2
通过web管控界面查看:
成功将一个文件上传成功!
小结
上述我们介绍minio均是从本地局域网作为endpoint进行访问。如果树莓派已经具备外网访问,则可以将minio打造成一个真正的私人对象存储服务。