ストレージに関する彼是はPCライフが始まってからというもの、ずっと付いて回る永遠に収束しない課題のようなものです。

かれこれもう30年以上も続いている私のPCライフですが、時代の需要と供給バランスにうまく噛み合ってしまった事も有り、楽しい人生の肥やしになっていることは確かです。

振り返れば30年前頃(1992年頃)に、私はまだ学生でフロッピーディスクなんてものを使っていたのを思い出します。その容量は、今考えると非常に少なく 512Kbyte/1枚も無い程度だったかなぁ。2022年、凄い時代になったものだと感じます。

さて、昨今はCloud環境が急速に整ってきているわけですが、お仕事柄携わることも多くかつ自分自身の興味の範疇でもあるため、一般の方があまりやらない様な事に目を向けています。

2022年、数々のStorageサービスが存在する時代になったわけですが、おなじみの Dropbox、Amazon Web Service(通称AWS)など Cloud Storageサービスは徐々に認知度を上げてきています。
そのような時代の中、私はどうしてかGoogleに着目することが多く、長らくお世話になっている Gmail、GCPの利用をはじめとして様々なGoogleサービスを利用しています。

今回は、ニコン社のカメラの中でもフラッグシップ機である Nikon Z 9Google Cloud Storage サービスに関連する記事となります。

gcsfuse と macFUSE のススメ

最近、私が使ったソフトウェアの中に CloudMounter が有ります。
とても使いやすく導入も簡単です。Cloud Storage を多種多様に使っている人にはとても便利なソフトウェアかなと思います。

この様なソフトウェアを使わずしても Cloud Storege を利用できる方法がいくつか有るわけですが、上記の CloudMounterでは現時点でGoogle Cloud Storageの利用はできず他の方法を探ってみました。
(Amazon S3 でも済みそうなわけですが、ここは Google推しの私としては深堀りしないわけにはいきません)

もちろん、ブラウザでアクセスすればこれらのサービスには簡単にアクセスできるのですが、ネイティブに利用したいということが一つの希望となります。
これらを実現するためのソフトウェアは随分前からあります。

名前からも想像が付く通り、これらはLinux, macOSでのみ検証されています。
FUSE : file system in user space
Windowsについては残念ながら圏外となります。

gcsfuse has been tested successfully with the following operating systems:

Linux (minimum kernel version 3.10)
OS X (minimum version 10.10.2)
macFUSE
macFUSE allows you to extend macOS via third party file systems.

全てを端折って書いてしまえば、これらのソフトウェアを導入することで Google Cloud Storageのネイティブ利用が出来るようになるわけですが、そこはオープンソース。ご自身の責任でやって下さいという流れになります。
よって一筋縄ではいかない、というのが一つの答えにはなります。

また、これらの優秀なオープンソースは世界中の有志のエンジニアによって成り立っている事も忘れてはいけません。

まずやりたいことを整理します。

  1. Nikon Z 9 で撮影した画像ファイルをSFTP経由で Google Cloud Storage へアップロード
  2. アップロードされた画像ファイルをiMac上のFinderで閲覧

単純にはこんな感じですが、コレをするには現時点では様々な課題があり事前準備が必要です。
といっても、最終的な段階で、ほぼネットワーク速度の課題にはなりそうな予感がしていますが…
今は課題の壁をあまり考えないことにします。

その前に、これを実現する事によってどの様な需要があるのかを考えてみます。

  • 撮影した画像を遠隔でリアルタイムで取得したい
  • メモリカード以外へのバックアップをしたい

個人利用ではまず考えにくいと思われるニッチ需要ですが、使い方によっては多々考えられる需要になりそうです。

また、バックアップ的な観点からも有用かと思います。

フラッグシップ機である Nikon Z 9 では機能的には SFTPが単体で出来るようになっているわけですが、カメラとPCの融合はスマホのみならずこういったところでも感じられるようになってきています。

私自身がこの需要に迫られている訳ではないのですが、興味の範疇でこれらを実現してみたいと思います。


事前準備編(その1)

iMac側の設定

gcsfuse, macFUSE を設定するには下記の要点が有ります。

2022/03/18 現在、これらソフトウェアは macOS Monterey(12.3) にはすんなりとはインストール出来ません。

  • gcsfuse は go のインストールと各種設定が必要です

$ brew install --cask osxfuse

installing.md のOS X 項目に解説されている、上記のコマンド通りのインストール方法では、下記の様なエラーとなってしまいます。

installer: Error - The FUSE for macOS installation package is not compatible with this version of macOS.

このバージョンの macOS とは互換性がありませんというエラーですが、ソースコードからビルドすることでコレを回避します。

そこで、go をインストールする流れになるわけですが、installing.md の Building from source項目の内容を実施してもすんなりとは行きません。

$ brew install go

go は brew によってインストール自体はすんなり出来ますが、gcsfuse をビルドする際に必要な環境変数に依存している部分の調整が必要でした。

私は .bash_profile に下記を追記しました。
インストールした go のバージョンに依存しますので、brew list go などで確認が必要です。

export GOPATH=$HOME/go
export GOROOT=/usr/local/Cellar/go/1.17.8/libexec
export GOTOOLDIR=/usr/local/Cellar/go/1.17.8/libexec/pkg/tool/darwin_amd64
export PATH=$PATH:$GOPATH/bin

また、カレントディレクトリに goディレクトリを作成して環境を作成する必要が有ります。

この後に、source ~/.bash_profile で環境変数を適用。
下記を実行して gcsfuseをビルドします。

GO111MODULE=auto go get -u github.com/googlecloudplatform/gcsfuse
~/go/bin/gcsfuse が生成されます

この様な手順により最新版の gcsfuse をビルドします。

macFUSE に関しては、https://osxfuse.github.io/ こちらから、最新版 4.2.4 のdmgバイナリが取得出来るので、インストールはクリックだけで簡単に行えるでしょう。
ただし、「セキュリティとプライバシー」の設定にて開発者の”Benjamin Fleischer” アプリケーションの実行許可をする必要があります。

これら同類な様子は、Panic社のTransmitアプリケーションのサイト解説 にもあります。

gcsfuseコマンドの利用

言ってみればこの世界はGUIベースで利用するものではなく、CLIベース(コマンドライン)です。

GUIが無い!と騒ぐ方々へは、この解説の難易度は高くなります。
※下記の解説は Google Cloud CLI 、 gsutil の初期設定などを含めた複合的な知識が必要となります。

ターミナルから下記のコマンドを実行して gcsfuse が生きているかを確認します。

$ gcsfuse -v
gcsfuse version unknown (Go version go1.17.8)

私の場合は、上記の状態で unknown と出力されました。(もしかすると環境依存かもしれません)

Google Cloud Storage の事前準備が出来ていることが前提ですが、下記のコマンドを実行します。
この場合、カレントディレクトリに saito というディレクトリが作成されていること、Google Cloud Storage 側に saito というバケットが作成されていること、その他 Google 認証(gcloud auth login)に関する設定が済んでいることが前提です。

$ gcsfuse saito ~/saito

実行すると下記の様に出力され、Google Cloud Storage へのマウントが成功したことが分かります。

$ gcsfuse saito ~/saito
2022/03/18 22:08:52.718648 Start gcsfuse/unknown (Go version go1.17.8) for app "" using mount point: /Users/(user)/saito
2022/03/18 22:08:52.733290 Opening GCS connection...
2022/03/18 22:08:53.378681 Mounting file system "saito"...
2022/03/18 22:08:53.397099 File system has been successfully mounted.
gcsfuse によって接続された状態を Finder で確認

空き容量を見ると「1.13 PB」と出ています。

PB=ペタバイト、見たことが無い空き容量です。テラの上です。
単純に 1,000テラバイト(1,000兆バイト)以上。
フロッピーディスクだと何枚でしょう。(笑)

Google Cloud Storageの料金

ここでは利用料金などには細かく触れません。
Google Cloud Storageは 一般的な Cloud Storageの料金よりは安く見える場合もありますが、ストレージクラス、保存容量、オペレーションによって料金が決まってきます。利用の仕方次第では高額な料金になる可能性があるため注意が必要です。

ここで一つ問題に当たりました。

「ファイルが表示されていない」

ディレクトリしか表示されず、ファイルもすんなりコピー出来ない。コレを追跡するのに少々時間を費やしました。

Finder でドラッグアンドドロップをするとこんなエラーが出ます
予期しないエラーが起きたため、操作を完了できません(エラーコード100096)。

ファイルを保存してもエラーとなり、cpコマンドでコピーしても権限無いよと。

$ cp DSC_0542.jpg ~/saito/
cp: DSC_0542.jpg: could not copy extended attributes to /Users/(user)/saito/DSC_0542.jpg: Operation not permitted

Google Cloud Storage側 をブラウザで確認すると、0B でファイル名だけが保持されていました。明らかにうまく動作していないのですが、どうしてかな。

まぁ、複合的にソフトウェアを用いるときには陥りやすい罠なので、数日寝かせることにしました。(私の思考を含め)

macFUSE のオプションをアレコレ見ていると、色々有るわけですがそもそもこの macFUSE側のオプションってどうやって設定するんだ?という事になります。

英語文献を漁っていると分かってくるわけですが、gcsfuse からは -o というオプションで指定して引き渡すようです。 gcsfuse の help には下記のように書かれています。

-o value Additional system-specific mount options. Be careful!

Be careful! ということなのですが、近年のOSはセキュリティ的な観点からファイルシステムへのフルアクセスを容易に許していません。ということでオプション設定には気をつける必要が有るようです。

また、過去のバグ などからこれらがどの様に使われてきたのかを把握してみます。

どうも、macFUSE の auto_xattr オプションを使っている形跡があるためこのオプションを指定して再度接続してみることにしました。

一度、接続を解除する

$ umount ~/saito

オプションを指定して再接続をする

$ gcsfuse --implicit-dirs -o auto_xattr saito ~/saito
2022/03/19 13:48:50.177461 Start gcsfuse/unknown (Go version go1.17.8) for app "" using mount point: /Users/(user)/saito
2022/03/19 13:48:50.194586 Opening GCS connection...
2022/03/19 13:48:50.829981 Mounting file system "saito"...
2022/03/19 13:48:50.894955 File system has been successfully mounted.
Finder にディレクトリとファイルが無事に表示されました
ターミナルからの tree表示

このようにして、iMacから Google Cloud Storage のファイル取得、およびドラッグアンドドロップによるファイルアップロードなど、シームレスにネイティブ操作が行えるようになりました。

Google Cloud Storage はブラウザでも見ることが出来ます。
しかし、ネイティブ操作の良さは Finderでプレビュー、再保存などの操作が簡単に出来るところに有ります。

Finder での画像プレビュー

さすがに、ローカルにあるファイルを扱うのとは異なり、容量の大きいファイルの取得、再保存などには時間がかかりますが…


iMac側はこれで一先ずは完成です。

ある程度は想像が出来ますが、ここから先もまた勝負どころが待ち構えていそうです。

記事の続きはこちらです。

− 動作検証環境

ソフトウェア
gcsfuse 0.40.0
macFUSE 4.2.4

Mac
macOS Monterey 12.3
iMac (Retina 5K, 27-inch, 2017) – 4.2 GHz クアッドコアIntel Core i7

Apple Silicon (M1) での gcsfuse

brew、python などの環境に依存いたしますが、Intel Core 同様に稼働を確認しました。
M1 は別のソリューションが必要かと思いましたが、Intel Core と同様に v0.40.0 でも動作していました。

gcsfuse が途中で止まっている様に見受けられる場合、 “foreground” オプションを指定して実行してみます。

$ gcsfuse --implicit-dirs -o auto_xattr --foreground saito ~/saito

これにより、詳細なログがコンソールに出力されます。

一例として、私の場合「could not find default credentials」とエラーが出ており下記のような感じでした。

2022/03/20 22:47:57.539272 Start gcsfuse/unknown (Go version go1.17.8) for app "" using mount point: /Users/(user)/saito
2022/03/20 22:47:57.539356 Opening GCS connection...
2022/03/20 22:47:57.541158 Waiting for connection: GetTokenSource: DefaultTokenSource: google: could not find default credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.
2022/03/20 22:47:58.542814 Waiting for connection: GetTokenSource: DefaultTokenSource: google: could not find default credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.
2022/03/20 22:48:00.043882 Waiting for connection: GetTokenSource: DefaultTokenSource: google: could not find default credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.
2022/03/20 22:48:02.295091 Waiting for connection: GetTokenSource: DefaultTokenSource: google: could not find default credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.

上記の場合、環境変数 GOOGLE_APPLICATION_CREDENTIALS が設定されていない事が原因だったようです。

案内のあるURL サービス アカウントとして認証する の辺りを参考に、Google 認証周りを設定することで無事に接続できました。

この例の場合、下記の様な形式で設定します。

$ export GOOGLE_APPLICATION_CREDENTIALS="/Users/(user)/.config/gcloud/legacy_credentials/(google account)/adc.json"

また、余談ですが、ガベージコレクションが10分毎に実行されるようですね。ご参考までに。

2022/03/22 10:00:24.338088 Starting a garbage collection run.
2022/03/22 10:00:24.680869 Garbage collection succeeded after deleted 0 objects in 342.719166ms.
2022/03/22 10:10:24.311668 Starting a garbage collection run.
2022/03/22 10:10:24.654136 Garbage collection succeeded after deleted 0 objects in 342.353125ms.
2022/03/22 10:20:24.285177 Starting a garbage collection run.
2022/03/22 10:20:24.692536 Garbage collection succeeded after deleted 0 objects in 407.293667ms.
2022/03/22 10:30:24.260750 Starting a garbage collection run.
2022/03/22 10:30:24.432450 Garbage collection succeeded after deleted 0 objects in 171.631166ms.
2022/03/22 10:40:24.234659 Starting a garbage collection run.
2022/03/22 10:40:24.744504 Garbage collection succeeded after deleted 0 objects in 509.745458ms.
2022/03/22 10:50:24.208562 Starting a garbage collection run.
2022/03/22 10:50:24.575516 Garbage collection succeeded after deleted 0 objects in 366.885417ms.

コメントは受け付けていません