2023年6月5日月曜日

azcopyをRaspberry Pi OS 32bitで動かす


背景

azureのファイルコピーコマンドazcopyを32bitのRaspberry Pi OSで動かそうとしたら戸惑ったので、実行までの手順を記事に残します。

arm 32bit向けの実行ファイルは配布されていないものの、ソースコードをビルドしたら動かせる

記事を書いている時点では、azcopyの説明ページでarm 32bit向けの実行ファイルは配布されていません。
しかしながら、ソースコードは公開されています。

Azure/azure-storage-azcopy

このコードはgoで書かれているため、arm 32bit OS向けにビルドしたらRaspberry Pi OS 32bitで動く実行ファイルを作れます。

Raspberry Pi OS 32bitでビルドして実行

go lang 1.6以上が必要

azure-storage-copyが扱うライブラリは1.16から追加された機能を含んでいるため1.15.15では「package embed is not in GOROOT」というエラーが出てしまいます。
参考: Install fails ('package embed is not in GOROOT')

自分が試したRaspberry Pi OS Liteのaptでインストールできるgoは1.15.15でした。
apt-cacheコマンドでaptでインストール可能なプログラムのバージョンを確認できます。
apt-cache show golang
Package: golang
Source: golang-defaults
Version: 2:1.15~1
Architecture: armhf

apt版が使えたら楽だったのですが対応していないので、goのダウンロードサイトから1.16以上のgoをダウンロードしてインストールします。

既にapt installしている場合は削除が厄介

aptでインストールしたgolangはapt purgeしてもなぜかプログラムが残ります。
which go
/usr/bin/go
ls -la `which go`
lrwxrwxrwx 1 root root 21 Sep 16  2020 /usr/bin/go -> ../lib/go-1.15/bin/go

パスの扱いが面倒なので、この記事ではaptに頼らずインストールしたgoをフルパスで呼び出して使います。

go langをaptに頼らずインストール

記事を書いている時点のgoの最新版は1.20.4だったので下記の流れでインストールしました。
下記のコマンドではエラーが出たりバージョンが古かったりして不十分な場合は公式のインストールページ最新版一覧を参考にしてください。
mkdir -p ~/Downloads
cd ~/Downloads
wget https://go.dev/dl/go1.20.4.linux-armv6l.tar.gz
rm -rf /usr/local/go # 過去にgoをインストールしてなければ削除対象が無くてエラーになります
tar -C /usr/local -xzf go1.20.4.linux-armv6l.tar.gz

上記のコマンドでインストールしたらgoを下記のように呼べます。
/usr/local/go/bin/go version
go version go1.20.4 linux/arm

ソースコードをcloneしてビルドして実行

raspberry pi os上でのビルドとazure-storage-copy(azcopy)のhelpの実行例の例です。
この例ではgitprojectsというフォルダをホームフォルダ作り、その中にリポジトリをcloneして、aptに頼らずインストールしたgoを絶対パスで読んでビルドしています。
sudo apt install -y git
mkdir -p gitprojects
cd ~/gitprojects
git clone https://github.com/Azure/azure-storage-azcopy.git
cd azure-storage-azcopy
/usr/local/go/bin/go build
./azure-storage-azcopy --help

azcopyをazure-storage-copyとして実行できました。
~/gitprojects/azure-storage-azcopy/azure-storage-azcopy -v
azcopy version 10.19.0

arm 32bit向けにクロスビルド

goはビルドしている環境とは異るOS向けのクロスビルドが可能なので、下記のようにarm32bit linux環境を指定してビルドしたファイルをRaspberry Pi OS 32bitに送って使うのも一手です。

Linuxやmacの場合
cd [azure-storeage-copyのリポジトリのフォルダ]
GOOS=linux GOARCH=arm go build

Windowsの場合
cd [azure-storeage-copyのリポジトリのフォルダ]
set GOOS=linux
set GOARCH=arm
go build

上記のコマンドでビルドしたazure-storeage-copyをRaspberry Pi OS 32bitに送れば実行できます。

おわり

azcopyのarm 32bit版が配布されていなくて戸惑いましたが、環境を整えてビルドすればRaspberry Pi OS 32bit版で動くazure-storage-copyを得られました。

参考

azcopyの説明ページ
Azure/azure-storage-azcopy
go公式のインストール解説ページ

0 件のコメント :