本文适用
如果你手上有一塊閑置的樹莓派,或者其它類似裝置(礦渣,稍有算力的路由器等),目前還在閑置,或者在做一些軟路由/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 [email protected]: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打造成一個真正的私人對象存儲服務。