はちゅにっき

こっちのブログはまったり更新

gcsfuse を利用して CoreOS に Google Cloud Storage を mount する

CoreOS なんだから Container でやりなさいって言われそうですが、手っ取り早く Google Cloud Storage を Data Volume として提供したいなぁと思ったのでやってみました。 ただしパフォーマンスはお察しくださいレベルなので、Data Volume として使う場合も使い方は考えた方がいいですね。

以下手順のメモです。 バイナリの作成は docker を利用してビルドしていきます。

Google Cloud Storage のマウントには gcsfuse を利用します。 github.com

FUSE なのでこちらも必要になります。 github.com

docker で buildpack-deps を起動する

CoreOS に fusermount が欲しいので docker を利用して FUSE をビルドします。 ビルドには buildpack-deps のコンテナを利用します。

https://hub.docker.com/_/buildpack-deps/

あとでビルドした fusermount を取り出すので Container を起動する時に --rm オプションはつけないでおく。

docker run -it --name fuse buildpack-deps

ここからは Container 上での作業。

FUSE を入手

Github から fuse をダウンロードし、/tmp あたりに解凍します。 何も考えずとりあえず最新版を入手。新しいことはいいことだ。たぶん。

libfuse じゃないよ。

wget -qO - https://github.com/libfuse/libfuse/releases/download/fuse-2.9.7/fuse-2.9.7.tar.gz | tar zxf - -C /tmp --strip-components 1

FUSE をビルドする

/tmp に解凍したので、移動してビルドします。

生成された fusermount を CoreOS では最終的に /opt/bin に置く予定なので、--prefix=/opt を configure で念のため指定してみた。

cd /tmp
./configure --prefix=/opt && make

ここからは生成された fusemount CoreOS にコピーするため、CoreOS 側での作業になります。

fusermount を CoreOS にコピーする

いったん /home/core あたりにビルドした fusermount をコピーしてきます。

docker cp fuse:/tmp/util/fusermount $HOME

docker cp 便利ですね。

fusermount さえ入手できてしまえば、Container には用はないので煮るなり焼くなりします。

入手した fusermount を CoreOS の /opt/bin にコピーします。

sudo install -o root -g root -m 0755 -d /opt/bin
sudo install -o root -g root -m 4755 $HOME/fusermount /opt/bin

fusermountパーミッション 4755 (Set UID) で配置するのがミソ。 0755 だと mount しようとしたときに fusermount: mount failed: Operation not permitted になりガッカリします。

長かったけどここまでが前座。

ここからは Google Cloud Storage をマウントするための gcsfuse をビルドします。

gcsfuse をビルド

こっちは公式サイト通り go get するだけ。

docker run --name gcsfuse --env GO15VENDOREXPERIMENT=1 golang go get -u github.com/googlecloudplatform/gcsfuse

あら簡単。

gcsfuse を CoreOS にコピーする

docker cp します。

docker cp gcsfuse:/go/bin/gcsfuse $HOME

fusermount と同じく /opt/bin にコピーします。

sudo install -o root -g root -m 0755 $HOME/gcsfuse /opt/bin

最後にちょっと作業をします。

/etc/fuse.conf

/etc/fuse.conf を新規に作成して以下を記述します。

user_allow_other

最終的には cloud-config に記述しておいた方がよさそうですね。

CoreOS インストール後であれば /var/lib/coreos-install/user_data がインストール時に利用した cloud-config になるので、これを修正して再起動すれば OK。

CoreOS 上で FUSE を有効にする

たぶん必要。

sudo modprobe fuse

マウントしてみる

実際にマウントしてみます。

コマンドの詳細については公式サイトの方を見てください。

gcsfuse --key-file /path/to/key.json --foreground bucketname /path/to/mount/point

無事にマウントできたことを確認したら、CoreOS 起動時にマウントされるよう、systemd へと登録します。

今回はこんな感じで systemd へと登録しました。

[Unit]
Description=A user-space file system for interacting with Google Cloud Storage
After=systemd-networkd.service

[Service]
Type=simple
Environment=PATH=$PATH:/opt/bin
ExecStart=/opt/bin/gcsfuse --key-file /path/to/key.json -o allow_other --uid 500 --gid 500 --dir-mode 777 --file-mode 666 --foreground bucket-name /path/to/mnt/point
ExecStop=/opt/bin/fusermount -u /mnt/gcsfuse

[Install]
WantedBy=multi-user.target

これで無事に CoreOS 起動時に Google Cloud Storage がマウントされるようになりました。

やったね。