[chromebook] Linux環境(Crostini)にDropboxをマウントする

最近自分の中で「最強の打ち合わせのお供」という評価をしているchromebook。
タブレット機らしい軽快さで、developer tool付きのデスクトップブラウザが使え、必要ならMS Office(android版)も使えて、さらにはLinuxまで載っているから各種コマンドまで使えちゃう。
なんて便利なコなんだろう!

愛機 ASUS Chromebook Flip C101PA

で、実用的に使うとなると、個人的にdropboxの使用は必須です。

chromebookでdropboxを使うにあたっては、WEBアプリを使ったり、androidアプリを使ったり、さらにはローカルストレージにように使えるFile System for Dropboxなんかを使ったりするのですが、どの方法もLinux環境(Crostini)では使用できません。
Crostiniにインストールしたエディタ(Visual Studio Codeを使っています)で編集したいときなど、dropboxにアクセスできないのは困ります。

Linux版の公式クライントを使えるのかもしれないですが、クラウド上のファイルをローカルにダウンロードされるのはストレージの少ないchromebookには非現実的。

そこでクラウドにファイルを置いたままファイルシステムにマウントできるdbxfsを使ってみました。

dbxfsのインストール

dbxfsはFUSE(Filesystem in Userspace)を使ってPythonで実装されています。そのインストールにはPythonのパッケージ管理システムのpipを使います。
ということで、それらが入っていなければインストール

$ sudo apt install fuse libfuse2 python3-pip

環境が整ったらdbxfs本体をインストール

$ pip3 install dbxfs

通常ならdbxfsは~/.local/binにインストールされるはず。
マウントポイント(この例では~/Dropbox)を作っておいてからdbxfsを起動します

$ mkdir ~/Dropbox
$ ~/.local/bin/dbxfs ~/Dropbox
We need an access token. Perform the following steps:
1. Go to https://www.dropbox.com/oauth2/authorize?response_type=code&client_id=********
2. Click "Allow" (you may have to log in first)
3. Copy the authorization code.
Enter authorization code (Ctrl-C to quit): 

こんなメッセージが帰ってくるので、表示されたURLにブラウザでアクセスして認証を済ませてコードをゲット。
そのコードを入力して次に進みます。

We're all connected. Do you want to save your credentials for future runs? [Y/n] 

認証情報を保存するかなのでここはY

Please enter password for encrypted keyring:

keyringのためのパスワードを聞かれます。ログインアカウントのパスワードを入力

Would you like to help us improve dbxfs by providing anonymous error reports? [Y/n] 
Do you want "/home/******/Dropbox" to be the default mount point? [Y/n]

改善のためにエラーレポートを送るか、なのでY(望まないならnでもいいはず)
指定したマウントポイントをデフォルトにするか、なのでY

以上で無事dropboxがマウントできました。
df -h で確認してみます

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vdb        6.8G  3.3G  3.2G  52% /
none            492K     0  492K   0% /dev
devtmpfs        1.4G     0  1.4G   0% /dev/tty
/dev/vdb        6.8G  3.3G  3.2G  52% /dev/wl0
tmpfs           100K     0  100K   0% /dev/lxd
run             1.4G   24K  1.4G   1% /dev/.host_ip
/dev/root       153M  150M  280K 100% /dev/.ssh/sshd_config
9p              1.9G  572K  1.9G   1% /mnt/chromeos
tmpfs           100K     0  100K   0% /dev/.lxd-mounts
tmpfs           1.4G     0  1.4G   0% /dev/shm
tmpfs           1.4G  8.2M  1.4G   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           1.4G     0  1.4G   0% /sys/fs/cgroup
tmpfs           273M   20K  273M   1% /run/user/1000
dbxfs           2.1T   44G  2.0T   3% /home/******/Dropbox

ちゃんと2TBのディスクとしてマウントされてる!

認証情報を保存してデフォルトのマウントポイントも決めていれば、次回以降は引数なしの dbxfs コマンドだけでマウントできます。
なおアンマウントは下記の通り

$ fusermount -u ~/Dropbox

linux環境起動時に自動でマウントしたい

上記で十分使えるようになったんですが、できればlinux環境起動時に自動でマウントしたい。
自動マウントをする上での問題はkeyringのパスワードを聞かれることなので、これをexpectで力技で回避してみました。

まずexpectが入っていなければインストール

$ sudo apt install expect

expectで自動マウント用スクリプトを書きます。dbxfsコマンドと同じ場所に置いてみました。
~/.local/bin/dbxfsmount.exp

#!/usr/bin/expect

set PASSWORD "パスワード"

spawn env LANG=C /home/******/.local/bin/dbxfs
expect {
    "keyring:" {
        send "${PASSWORD}\n"
    }
}

expect {
    "\\\$" {
        exit 0
    }
}

パスワードのところにログインパスワードを記入します。
共有サーバでもないんでスクリプトに平文で書くことをお許しを・・・
spawnの行にはdbxfsコマンドの場所を自分の環境に合わせて書いてください。
書けたら実行権限を与えておきます。

$ chmod 700 ~/.local/bin/dbxfsmount.exp

ここまで用意できたら起動時にこのスクリプトを実行するようにします。
.bash_profileを以下のようにしました(PATHの部分は環境に合わせて)

export PATH=$PATH:/home/*****/.local/bin
(dbxfsmount.exp > /dev/null 2>&1 &)

if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi

これでこれからはCrostiniを立ち上げると自動でdropboxがマウントされています。