[chromebook] Crostini環境にWindowsファイル共有(smb)をマウントする

今入っているプロジェクトが、VPNでつないでファイルサーバ(Windows)にアクセスしてね〜、というルールだったので、めんどくせーなクラウドに置けよchromebookで作業できるように準備しました

素直にはsmbをマウントできなかった

素直なLinuxならcifs-utilesでsmbをマウントできます
参考 Ubuntu から Windows の共有フォルダをマウントして利用する

chromebookでもできるだろと思っていたら、kernel moduleがないよ的なエラー(詳細は失念)でできないと判明
どうしたものかと調べたら、Dropboxのときと同様、こちらもFUSEでマウントできる方法がありました

ほぼ元記事そのままになるけど、手順メモです

FUSEを使ってマウントする方法

まずはインストール

$ sudo apt install fuse smbnetfs

fuseグループを作って、ログインユーザをグループメンバーにする
(必要ないかもしれないけど元記事がやっているので同じように実行)

$ sudo groupadd fuse
$ sudo gpasswd -a "$USER" fuse

設定ファイルを作る
ここでは~/network以下にマウントする例なので、別の場所にマウントしたければこれを書き換えます
[user][password]のところはファイルサーバの認証ID/PWをいれてください

$ mkdir ~/.smb
$ cp /etc/smbnetfs.conf ~/.smb/
$ echo "auth [user] [password]" > ~/.smb/smbnetfs.auth
$ chmod 600 ~/.smb/smbnetfs.auth
$ mkdir ~/network
$ smbnetfs ~/network

これで例えば192.168.1.2というsmbサーバ上のhogehogeという共有ポイントにアクセスするのであれば、~/network/192.168.1.2/hogehoge でアクセスできる・・・そうです
自分の場合はこれだけではアクセスできなかった(あとから考えたら単にパスワード間違えてただけかもしれないけど)ので、さらに設定を追加しました

ここまでの流れでsmbnetfsでマウント実行していたときはアンマウントしておきます

$ fusermount -u ~/network

~/.smb/smbnetfs.host というファイルを作って(アクセス権は600が良いようです)内容を以下のようにします
※ 192.168.1.2がファイルサーバのアドレス、WORKGROUPがワークグループ名、hogehogeが共有ポイント名

host 192.168.1.2 WORKGROUP visible=true
link hogehoge 192.168.1.2/hogehoge

この状態でsmbnetfsでマウントやり直し

$ smbnetfs ~/network

これで~/network/hogehoge でアクセスできるようになりました!
(linkで設定したので~/network/192.168.1.2/hogehogeに加えて~/network/hogehogeにもマウントされています)

[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がマウントされています。