天天看點

使用樹莓派搭建屬于自己的對象存儲

本文适用

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

繼續閱讀