ら・び・あん・ろ~ず

ちょっと古い IT やらガジェットやらのよもやまごとをつぶやきます。

Chrome OS の Linux(Beta) で Windows 共有をマウントするには

www.google.com

Chrome OS では、Windows 共有をファイルにマウントすることができます。ただ、この機能は、あくまで Chrome OS でのファイルであって、VM である Linux (Beta) の中からこれを参照することはできません。それでは、Linux アプリケーションが使えても、利用用途がかなり限られてしまいます。

Linux (Beta) のカーネルは直接 smbfs をサポートしていませんが、FUSE と smbnetfs を利用して Windows 共有をマウントできます。

この際、注意しなければならないのは Linux (Beta) は NAT ネットワークを介して、外部のネットワークと接続している、ということです。つまり、smb のブロードキャストでの名前解決ができません*1。ローカルなネットワークに他のコンピュータはいないためです。サーバは IP アドレスを指定するか、DNS を外部で設定することになります*2

設定手順

以下、とりあえずうまく行った手順を記載します。細かいことは smbnetfs のマニュアルを確認してください。

1. FUSE と smbnetfs をインストールする

apt で必要なパッケージを導入します。導入したら、現在のユーザに FUSE の利用を許可します。

$ sudo apt install -y fuse smbnetfs
$ sudo groupadd fuse
$ sudo gpasswd -a $USER fuse
2. 設定ファイルを作成する

ユーザの設定ファイルを作成します。設定ファイルには認証情報などを含むため、基本的に自分以外のユーザが読み書きできないようにしておきます。

$ mkdir ~/.smb
$ touch ~/.smb/smbnetfs.auth
$ touch ~/.smb/smbnetfs.host
$ chmod -R go-rwx ~/.smb

なお、mountpoint/domain:user:password@computer というパスにアクセスすれば、特にこれらのファイルの設定は必要ないようです。ただし、コマンドラインからアクセスするとヒストリーファイルに認証情報が残ってしまう可能性があることに注意してください。認証情報については、認証情報ファイルに設定するなど一定の考慮が必要です。

3. 認証情報を設定する

smbnetfs.auth ファイルに認証情報を設定します。
コンピュータを指定して認証を設定することも、指定せずに既定の認証を設定することもできます。

コンピュータ名は IP アドレスを指定してください。ここでは 192.168.0.1 というサーバに対しての認証情報を設定しています。コンピュータ名は省略すると既定の認証情報になります。ユーザ・パスワードはダブルクォートでくくってください。 ワークグループ構成の場合、無理にユーザ名にワークグループを付加する必要はありません。

"#" から始まるコメント行は /etc/smbnetfs.conf の抜粋です。入力しなくて構いません。

~/.smb/smbnetfs.auth

#---------------------------------------------------------------------
# Syntax:
#	auth [computer[/share]] [domain_or_workgroup/]user password
#	auth [workgroup]        [domain_or_workgroup/]user password
#
# Default:
#	auth "user_login_name" ""
#---------------------------------------------------------------------
#auth			"guest" ""

auth 192.168.0.1    "user"     "password"
4. ホスト情報を設定する

smbnetfs.host ファイルに、どのサーバに接続するのか、どうマウントするのか、ということを設定します。

~/.smb/smbnetfs.host

#---------------------------------------------------------------------
# This section describe a static host/group/link.
#
#  host   computer_name		[parent_group=group_name] [visible=true|false]
#  group  group_name
#  link   link_name		link_contents
#  link   group/link_name	[link_contents]
#---------------------------------------------------------------------

host 192.168.0.1 visible=true

group server
link server/disk      ../192.168.0.1/disk
link server/home    ../192.168.0.1/home

host 行で接続するサーバを指定します。
visible を true にすることで マウントポイント/192.168.0.1 というディレクトリが作成され、サーバにアクセスできるようになります。次の link 行を指定するなら visible は false でかまいません。

link 行はシンボリックリンクを作成します。
単純に link 行だけを記述すると、マウントポイント直下にエントリーが並んでしまい、見づらくなるので、ここでは group 行を利用してサーバ名のフォルダを作成しています*3。マウントポイント/server/disk や マウントポイント/server/home のようなディレクトリにアクセスすると、サーバにアクセスできるようになります。

5. マウントポイントを作成する

マウントする前にマウントポイントを作成します。
マウントポイントは任意の空のディレクトリで構いません。ここでは ~/windows というディレクトリを作成しています。ただし、他のユーザがあなたの認証情報を利用してサーバにアクセスできないよう設定を忘れないようにしてください。

$ mkdir ~/windows
$ chmod go-rx ~/windows
6. マウントする

smbnetfs コマンドでマウントします。
~/windows/server/disk ディレクトリや ~/windows/server/home ディレクトリにアクセスすると、Windows 共有が参照できるようになっているはずです。

$ smbnetfs ~/windows
7. アンマウントする

利用を終えたら、fusermount コマンドでアンマウントしておきましょう。

$ fusermount -u ~/windows

参考文献

www.reddit.com

*1:当初、mDNS での名前解決はできない、と書いていたのですが、 sudo apt install avahi-daemon libnss-mdns で名前解決については問題なくできることを確認しました。

*2:DNS を設定する際は、smbnetfs はサーバ名として FQDN を受け入れないためさらに注意が必要です。デフォルトドメインは /etc/resolve.conf を確認してください。未検証ですが hosts ファイルに設定するほうが簡単かもしれません。

*3:本来は、host 行の parent_group 属性と紐づけて指定するのが正しいスタイルだとは思うのですが、この設定のようにエイリアスを設定するような形ではうまく設定できませんでした。