smbfsとSharity-Light(Rumba)を使ったファイル共有

Author:たかはしもとのぶ <monyo@home.monyo.com>
 WindowsからUNIX上のファイルシステムを共有するソフトウェアとしてはSambaが有名ですが、逆にUNIXからWindowsのファイルシステムを共有しようというソフトウェアも存在します。
 ここではフリーで使えるものとして、Linuxカーネルに実装されているsmbfsとsmbfsを元に作成された「Sharity-Light(Rumba)」について、その入手方法からインストール、さらには簡単な活用例について紹介します。

目 次

1.smbfs 
1.1.smbfsとは 
1.2.smbfsのインストール 
1.2.1.Samba付属のツールを使う
1.3.smbfsの使い方 
1.3.1.smbfsの実力
1.3.2.smbmountを一般ユーザで使う
1.4.smbfsの総括 
2.Sharity-Light 
2.1.Sharity-Lightとは 
2.1.1.SharityとSharity-Light
2.1.2.Sharity-Lightとsmbfs
2.2.Sharity-Lightの入手とインストール 
2.3.Sharity-Lightの実行 
2.4.Sharity-Lightの総括 
2.5.Sharity-Lightの今後 
3.参考情報 
4.注記・補足 

smbfs 

smbfsとは 

 smbfsは、UNIXからWindowsマシンの提供する共有フォルダをマウントしてファイルシステムとして使用できるようにするLinuxカーネルの機能ですが、smbfsの機能を使うためのユーティリティもsmbfsという名称で配布されていますので、それらの総称として使われることもあります。
 ちょっと話がそれますが、Linuxはローカルディスクに関しても、Windows 95のVFATへの対応はもちろん、最近はNTFSにも(リードオンリーですが)対応しています。その努力には本当に敬服します。

smbfsのインストール 

 最近のLinuxディストリビューションでは、smbfsの機能を有効にした状態のカーネルが提供されていると思います。この場合は、ディストリビューションからsmbfsのパッケージをインストールするだけで、smbfsが使用可能になります。
 たとえばRed Hat Linux 5.2の場合は、「smbfs-2.0.1-4.i386.rpm」をインストールすることになります。
 自力でインストールする場合は、カーネルのコンパイルとsmbfsプロダクトの入手が必要です。カーネルをコンパイルする際には、[Filesystems]‐[SMB filesystem support]が“y”か“m”になっていることを確認してコンパイルを行なってください。
 smbfsに関しては、「smbfs-2.0.2.tar.gz」という名称のsmbfsの最新版がftpサイトなどにありますので、これを入手してコンパイルすることになります。しかし、ファイルの日付を見ていただければわかりますが、最近はメンテナンスされていません。
 筆者もRed Hat Linux 5.2でコンパイルしてみましたが、あちこちでソースを修正する必要がありました。修正箇所はカーネルバージョンによっても異なると思いますし、自力でインストールしようとする方であれば、自力で修正できると思いますので、ここでは修正方法にはふれません。

Samba付属のツールを使う

 カーネルバージョン2.1.70以降では、Sambaに付属するツールを使うことが可能です。
 この場合は、Sambaのconfigure時に“--with-smbmount”オプションをつけて、コンパイルおよびインストールを行なってください。smbmntおよびsmbumountという2つのユーティリティがインストールされます。筆者の方でカーネルバージョン2.2系でも動作することは確認しました。
 以下Windows NTの共有フォルダ「\\ntws\share」に、ユーザ「smbuser」で接続して、「/smb」にマウント後、dfコマンドを実行した場合の例を図1に示します。
 現在はカーネルバージョン2.0系から2.2系への移行期のため、本当はsmbfsとあわせて両方とも解説したかったのですが、出版時点では、まだ2.0系が主流だと思われますので、誌面の関係上こちらは紹介するにとどめておきます。

図1:samba付属のツールの使用例
# smbmount "╲╲ntws╲share" -W NTWS -U smbuser -c 'mount /smb'
Added interface ip=xxx.xxx.xxx.xxx bcast=xxx.xxx.xxx.xxx nmask=xxx.xxx.xxx.xxx
Server time is Thu May 13 01:45:53 1999
Timezone is UTC+9.0
Password:  ← smbuserのパスワードを入力
Domain=[HOME] OS=[Windows NT 4.0] Server=[NT LAN Manager 4.0]
security=user
# df
Filesystem     1024-blocks Used Available Capacity Mounted on
/dev/hda3       425447 381321  22152   95%  /
//NTWS/SHARE     1052224 378624  673600   36%  /smb
#

smbfsの使い方 

 それではsmbfsを使ってみましょう。
 Windows側の共有フォルダをマウントするコマンドはsmbmountになります。
 UNIXマシン「unix1」からWindows NTの共有フォルダ「\\ntws\share」に、ユーザ「smbuser」として接続して、「/smb」にマウントする場合の例を図2に示します。

図2:smbmountの使い方
# smbmount //ntws/share /smb -U smbuser -c unix1
Password:  ← ユーザ「smbuser」のパスワードを入力

 接続後、dfコマンドで接続を確認してみると図3のようになっています。また図4は“ls -l”コマンドの出力結果です。なお、アンマウントは普通のumountコマンドで行なえます。

図3:dfコマンドの出力結果
# df
Filesystem     1024-blocks Used Available Capacity Mounted on
/dev/hda1       1527189 1260257  188006   87%  /
/dev/scd0       499012 499012    0  100%  /cdrom
//ntws/share     1052224 378624  673600   36%  /smb
#
図4:ls -lコマンドの出力結果
$ ls -l
total 4
drwxr-xr-x  1 root  root     512 Apr 26 05:11 ForYou
drwxr-xr-x  1 root  root     512 Apr 20 05:30 SYM18.tmp
drwxr-xr-x  1 root  root     512 Apr 19 11:36 _ISTMP0.DIR
drwxr-xr-x  1 root  root     512 Apr 19 11:34 work
$

smbfsの実力

 接続できたあとは、いろいろ使ってみたくなるところですが、smbfsにはかなり制限事項があります。
 一番の問題は、『アクセス権』です。
 smbfs経由でWindowsの共有フォルダに接続した場合Windows上ではsmbmountのオプションで指定したユーザ名でファイルアクセスが行なわれます。図2の例では、「smbuser」になります。つまりUNIX側からどのユーザアカウントでアクセスしても、「smbuser」でファイルアクセスが行なわれてしまうわけです。
 また、図4ではファイルの所有者がrootになっています。ファイルの所有者には、接続時に“-u”オプションを使うことで、任意のuid(ユーザID)を指定することができますが、結局共有フォルダ内のすべてのファイルは、UNIX側から見るとある特定のアカウントが所有しているように見えてしまいます。アクセス権も同様に接続時に一律(デフォルトは755)に設定することしかできません。
 したがって、読み込み専用として使用するならよいのですが、書き込みを許可させたい場合、アクセスの制御は、smbmount実行時に指定するファイルのuidgid(グループID)およびアクセス権の設定でしかできませんので、ファイルの一時受渡し領域として誰でも書き込み可能にするような用途に限られると思います。
 またNTFSでサポートしているハードリンクを張ろうとしても図5のように怒られます。当然シンボリックリンクもできません。
 日本語のファイルはシフトJISのまま表示されますので、UNIX側はシフトJISで表示を行なわないと日本語が表示されません。

図5:ハードリンク及びシンボリックリンクを張ろうとしたときの結果
# ln tako2 tako1
ln: cannot create hard link `tako1' to `tako2': Operation not permitted
# ln -s tako2 tako1
ln: cannot create symbolic link `tako1' to `tako2': Operation not permitted
#

smbmountを一般ユーザで使う

 smbmountおよびsmbumount図6のようにsetuidすることで、一般ユーザでもWindowsの共有フォルダをマウントすることが可能になります。図7は一般ユーザでWindows 95の共有フォルダのマウントを行なった所です。

図6:setuidの方法
# chmod u+s /usr/sbin/smbmount
# chmod u+s /usr/sbin/smbumount
図7:一般ユーザでマウントを行なう
% /usr/sbin/smbmount //akari/temp /home/monyo/smb -c mosel
Password:
% df
Filesystem     1024-blocks Used Available Capacity Mounted on
/dev/hda1       1527189 1260670  187593   87%  /
//akari/temp     1705248 863328  841920   51%  /home/monyo/smb
%

 smbmountでは“-f”オプションを使うことでマウント先のファイルのアクセス権を自由に設定できるのですが、試した限り、「setuid」「setgid」「sticky」などのビットは落してくれるようです。しかし念のために、もし一般ユーザでの使用を許可する場合は、これらのビットが設定されないことを確認してから使ってください。

smbfsの総括 

 今まで見てきたように、smbfsは、アクセス権やシンボリックリンクなどの機能が不足しているため、定常的にマウントして使うには、ちょっとものたりないという気がしますが、読み込み専用であれば、ある程度実用になると思います。
 ともあれ、UNIX側からWindows上のファイルシステムを直接使う術を提供してくれる点では貴重なツールといえましょう。

Sharity-Light 

Sharity-Lightとは 

表1:対応しているOSの種類
NEXTSTEP 3.x、4.x(i386 & m68k)Linux
FreeBSDNetBSD
BSDISolaris 2.x
HP-UXIRIX(ただし6.4以降では動作しません)

 「Sharity-Light」は、smbfsのコードを流用することで、一般的なUNIXマシンからもWindowsマシンの提供する共有フォルダをマウントし、ファイルシステムとして使用する機能を提供するツールです(図8)。
 もともと「Rumba」と呼ばれていたプロダクトですが、「Rumba」という名称がすでに商標登録されていたため、「Sharity-Light」という名称に改名されて提供されています。個人的に「Rumba」というネーミングセンスは気に入っていたので残念です。
 ソースコードはGPLに基づいて公開されており、

●Sharity-Light - SMBFS for UNIX:
 http://www.obdev.at/products/sharity-light/

から無償で入手しての使用が可能が可能です。
 現在動作が確認されているOSは表1のようになっております。

図8:Sharity-Lightのホームページ(昔と今)
obdev_old.png obdev_new.png

SharityとSharity-Light

 「Sharity-Light」とは別に「Sharity」という同様の機能を持ったソフトウェアが以下で公開されています。

●Sharity - Access Windows Servers from and Unix:
 http://www.obdev.at/products/sharity/

 まったくのスクラッチから開発を始め、「Sharity-Light」の不具合も改善されているようですが、残念なことに商用となっておりますのでここではこれ以上紹介しません。上記のURLから試用版のソースがダウンロードできますし、学生は無償のアカデミックライセンスがあるとのことですので、興味のある方はぜひ試してみてください。

Sharity-Lightとsmbfs

 「Sharity-Light」はsmbfsの機能だけを切り出し、ユーザプロセスで動作するプログラムとして実現したものです。カーネルとはNFSのインタフェースを使って通信を行ないます。
 Linuxカーネルに実装されているsmbfsと比較して以下のような特徴があります。

Merit: メリット
●万一クラッシュしてもカーネルが落ちない。
 ユーザモードで動作しますので、当然ですね。
●「Sharity-Light」でマウントしたファイルシステムをさらにNFSでエクスポート出来る。
Demerit: デメリット
●NFSの仕様上、ファイルのオープンやロックの情報を取得できない。
 このため「Sharity-Light」は、アクセスの度にファイルをオープンし、5秒間オープンしたまま保持した後、自動的にファイルをクローズします。したがって、他のクライアントが同じファイルをオープンすると不整合が発生してしまうという問題点があります。
●smbfsより動作が遅い。
 NFS関連のオーバヘッドが入りますので、これも当然ですね。
●安定度が低い。
 実装上の問題かどうかはわかりませんが、使っていて不安定だという印象は拭えません。

Sharity-Lightの入手とインストール 

 FreeBSDの場合は、ports-currentにportsがありました。FreeBSDやLinuxなどでportsやパッケージがあれば、そこからインストールしても良いでしょう。
 以下は自力でコンパイルする方法を説明します。
 まずは,アーカイブを入手します。

●Sharity-Light - SMBFS for UNIX:
 http://www.obdev.at/products/sharity-light/

より「Sharity-Light-1.2.tar.gz」という名称で入手可能ですので、入手して展開してください。
 ただし、autoconfには対応していないので、手動でMakefileを編集する必要があります。とはいえ以下の図9のように、デフォルトで有効になっているNeXTSTEPの設定をコメントアウトして、コンパイルしたいOSの設定を有効にするだけですので、特に問題ではないでしょう。

図9:Linuxの場合のMakefile修正の例
#-----
## For NEXTSTEP/OPENSTEP:
#CFLAGS = -Wall -O2 -traditional-cpp -g  ← この5行をコメントアウト
# put your architecture here: 
#ARCH = -arch i386 
#THE_CC = cc 
# RPC_WARNFLAGS = -Wno-unused -Wno-switch -Wno-uninitialized 

# For Linux: (use static linking because of libc5/libc6 troubles)
CFLAGS = -Wall -O2 -g  ← この3行のコメントを外す
LDFLAGS = -static 
RPC_WARNFLAGS = -Wno-unused -Wno-switch -Wno-uninitialized 

#-----

 図9ではLinuxの場合の例を載せましたが、他のUNIXでも同様です。ちなみに筆者が動作を確認した環境は以下の通りです。

・Red Hat Linux 5.2J
・FreeBSD-2.2.7(R)
・Solaris 7 for Intel Platform(英語版)

 Makefileの修正後makeを行なうと、shlightという実行ファイルが生成されています。この他に、アンマウントを行なうためのプログラムとして“unshlight.sh”および“unshlight.c”というシェルスクリプトおよびCのソースが提供されています。
 しかし、両方とも汎用的なものではないため、ほとんどのOSではそのままインストールするのが困難です。とくになくても実用上は困らないため、ここではこれ以上触れません。

Sharity-Lightの実行 

 インストールが完了したところで、さっそく使ってみましょう。
 以下の作業はrootで行なう必要があります。なおここではWindows側で共有フォルダを作成する方法については特に解説しません。市販の書籍などを参考にしてください。
 smbfsの場合と同様に、Windows側の共有フォルダ「\\ntws\share」に、ユーザ「smbuser」で接続して、「/smb」にマウントする場合の例を図10に示します。
 smbmountに相当するコマンドはshlightになります。

図10:shlightコマンドの使用例
# shlight //ntws/SHARE /smb -U smbuser
Password:  ← smbuserのパスワードを入力
Using port 1889 for NFS.

 shlightのオプションは、smbfsと基本的には同じになっており、パッケージ中にもsmbmountのマニュアルページがそのまま入っております。一応筆者が翻訳した主なオプションの説明を表2に載せましたので参考にして下さい。
 また図11のように“-h”オプションをつけてshlightを実行することで、すべてのオプションを確認することができます。

図11:shlightコマンドのオプション表示
shlight.png

 なお、Windows 95系のOSに接続するときは注意が必要です。
 shlightコマンドでは“//”に続いて「サーバのIPアドレス」か「有効なホスト名」を記述する必要がありますが、これが接続先のコンピュータ名と異なっていると接続できません。
 この場合、“-s”オプションを使って、明示的に接続先のコンピュータ名を指定する必要があります。
 ここでdfコマンドを実行してみると図12のように表示され、確かにマウントできていることが確認できます。なお「shlight-8691」の“8691”という数字はshlightプロセスのPIDを表します。

図12:dfコマンドの出力例
# df -k
Filesystem     1024-blocks Used Available Capacity Mounted on
/dev/hda1       1527189 962004  486259   66%  /
shlight-8691     4072448 1029504 3042944   25%  /smb

 最後に使い終ったらアンマウントしておきましょう。
 普通は通常のファイルシステムと同じくumountコマンドでマウント解除できるはずです。ところがSolarisの場合は、図13のようにいわれてマウントが解除できませんでした。

図13:Solarisでアンマウントすると発生したエラー
# umount /smb
nfs umount: /smb is not hostname:path format

 このように、何らかの理由でアンマウントができなくなった場合は、shlightプロセスを“kill”することでマウントを解除する必要があります。
 なお、「Sharity-Light」はsmbfsから派生したものですので、smbfsの項で記述した注意点はそのまま当てはまりますが、smbmountと違い、マウント時に“-f”オプションを使うことでsetuidビットを指定できてしまいます。
 したがって、『家庭内で使う場合などを除き、絶対にshlightを一般ユーザで実行可能にしてはいけません』

表2:shlightのオプション
コマンドオプション一覧 内  容  説  明
-s サーバ名※1 サーバのNetBIOS名を指定します。
-c クライアント名※1 クライアントのNetBIOS名を指定します。
-U ユーザ名 デフォルトでは、USERまたはLOGNAME環境変数から読み込みます。
これらが設定されていない場合や、別のユーザとしてサーバにログオンしたい場合にこのオプションを設定します。
-W ワークグループ サーバに送るドメイン/ワークグループ名です。
-u uid(数字もしくはユーザ名)※2 マウントしたファイルの所有者(UID)を設定します。
-g gid(数字もしくはグループ名)※2 マウントしたファイルの所有グループ(GID)を設定します。
-f mode(8bit表記) ファイルに設定されるUNIXパーミッションを設定します(デフォルト644)。
-d mode(8bit表記) ディレクトリに設定されるUNIXパーミッションを設定します(デフォルト755)。
-C パスワードを大文字に変換しない。
-P パスワード パスワードを指定します。
なお、ここで入力したパスワードは、psコマンドでコマンドラインを見た時には“ * ”で表示されます。
-i パスワードを標準入力から読み込む
-n パスワードを使用しない。
“-P”も“-n”も指定されていないと、パスワードプロンプトが表示されます。
-S 一回のOPENでRead/Writeを行なっても安全であるとみなします。
詳細はREADMEを参照して下さい。
明らかに安全である時以外はこのオプションは指定しないのが良いでしょう。
-w 読み込み専用でマウントします。
-e SMBコマンドのgetattrEとsetattrEを使用します。
これについての解説はREADMEを参照して下さい。通常は設定の必要はありません。
-F .※3 ルートディレクトリの“.”を偽造しません。
-F ..※3 ルートディレクトリの“..”を偽造しません。
-h ヘルプを表示します。
-v バージョン番号を表示します。
-p ポート番号 接続するポートを指定します(テスト用のオプションです)。
-m 最大転送量 最大転送量を指定します(テスト用オプションです)。
-D デバッグレベル(数字) デバッグレベルを指定します。
このオプションを指定すると、「Sharity-Light」はフォアグラウンドで起動します。
※1:
これら2つはWindows 9x系OSでホスト名とコンピュータ名が異なっている時に使用します。
※2:
これらのオプションにより、マウントしたファイルのユーザとグルプを設定します(Windows側での設定は無視されます)。
デフォルトは、「Sharity-Light」を実行したユーザの実ユーザID、およびグループIDです。
※3:
UNIXでは、各ディレクトリに“.”と“..”が必要ですが、DOSのルートディレクトリには存在しないため、偽造することが必要になります。
詳しくはREADMEを参照してください。

Sharity-Lightの総括 

 今まで見てきたように、とりあえず使うには重宝する「Sharity-Light」ですが、それ以上に使うのはちょっと無理だと感じています。
 READMEにもいくつか問題点の記述がありますが、それ以外にも、以下のような問題点があります。

Problem: 問題点
●shlightのプロセスが残ったままマウントが切断されてしまうことがある。
 このため、ひんぱんにshlightのプロセスを“kill”する必要がありました。
●Solarisから一部のファイルやフォルダにアクセスできない(図14)。
図14:Solaris からマウントしたときに発生したエラー
# ls
./setup.exe: Value too large for defined data type
./SETUP.LST: Value too large for defined data type
ForYou.CAB* Project/   tes.txt*

 とにかく不安定だと言う印象です。
 あくまでどうしても必要なときにちょっと使ってみる程度にとどめておいた方が良いと考えています。

Sharity-Lightの今後 

 「Sharity-Light」のドキュメントを見ると、今後の開発はバグフィックスとポーティングのみで、新たな機能拡充は行なわないとアナウンスされています。商用として「Sharity」を開発しているため、今後はこちらを機能強化していくようです。
 でも、「Sharity-Light」のほうも、ソースが公開されている以上、まだまだ捨てたものではないと思います。使ってみて不満があれば、自分で直すという手段が残されているわけですから。

参考情報 

●Sharity-Light - SMBFS for UNIX:
 http://www.obdev.at/products/sharity-light/

●Sharity - Access Windows Servers from and Unix:
 http://www.obdev.at/products/sharity/

注記・補足 

  1. 2004.07.06 HTMLレベルの整形、図の作成を行いました。
  2. このHTML文書作成に際し、元の草稿と雑誌の方と照らし合わせながら校正し、私(にゃお)が部分的に加筆・修正を行なっています。至らない部分がある場合はご了承ください。
  3. 本文書は、Software Design 1999 年 07 月号の『第2特集』に掲載された『SambaとNetatalkで快適ネットワーキング Part 4』の草稿をにゃお様の方で HTML 化して掲載しているものです。

Copyright (C) 1998-2009 TAKAHASHI, Motonobu
Last update: 2006-07-12 00:00:18 JST
webmaster@monyo.com