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 がマウントされるようになりました。
やったね。