[GFARM LOGO] 文書集 > ユーザーズマニュアル > samba/gfarmfs-fuse

GfarmFS-FUSE + Samba

English | 日本語

別の方法: Gfarm システムコールフックライブラリ + Samba の方法はこちら

1. 概要

GfarmFS-FUSE を使って Gfarm ファイルシステムをマウントし,そのマウントポイントを Samba で公開することで,Windows から Gfarm のファイルにアクセスできます.

必要な環境や設定

関連ソフトウエア一覧

2. 日本語ファイル名を扱う場合

日本語ファイル名を扱う場合は,Gfarm 用の LDAP サーバ側に対応がされている必要があります.
日本語ファイル名を扱えない場合は,たとえば,Windows から「新しいフォルダ」を作成できません.

/etc/gfarm-ldap/gfarm.schema の 'pathname' に関する部分が,以下のようになっていることを確認します.
以下のようになっていない場合は,修正して,LDAP サーバを再起動してください.
Gfarm のバージョン 1.1.1 以前を使っていた(いる)場合は,下記の設定になっていません.

attributetype ( 1.3.6.1.4.1.13122.2.1.2924.100.2.5 NAME 'pathname'
        EQUALITY caseExactMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE)
# 修正する場合は,この 3 行のうち,下 2 行が変更となります.

また,Samba も UTF-8 のファイル名を扱えるようにします. smb.conf にファイル名に関する設定をします. Linux 側ではファイル名の文字コードとして UTF-8 を使うようにし,それを Windows から見えるように設定します.

[global] の部分に記述します. Samba の設定は SWAT を使うと簡単にできます.

Samba 2系の場合
client code page =  932
coding system = utf8

Samba 3系の場合
dos charset = CP932
unix charset = UTF-8
display charset = UTF-8

3. Samba の設定

まず,公開するディレクトリを設定をします. そのために,[homes] や [セクション名] を smb.conf に設定します. GfarmFS-FUSE を使ってマウントする予定のパス,またはそれより上のディレクトリのパスを指定します. これらは SWAT を使うと簡単に設定できます.
そして GfarmFS-FUSE にアクセスするセクションには,ファイルを書き込めるようにし,ファイル新規作成時に,実行ビットが付かないようにします.

[GfarmFS-FUSE]
path = /tmp/gfarmfs/%u
create mask = 0644
read only = no
これで, /tmp/gfarmfs の下に各ユーザがユーザ名のディレクトリを作って gfarmfs でマウントしておけば,GfarmFS-FUSE という共有名でアクセスできます.

次に,GfarmFS-FUSE を実行する UNIX ユーザ名と対応する Samba でのユーザを,無ければ作成します.
たとえば,SWAT で行う場合は,「PASSWORD→ローカルマシンのパスワード管理→新規ユーザ追加」でユーザを追加できます.

その他 Samba の設定に関する詳細は,Samba のドキュメントをご覧ください.

4. FUSE の設定

Samba を経由して FUSE を使ったマウントポイントにアクセスするには, FUSE のセキュリティに関する設定が必要になります.
FUSE 2.2.1 以前では,以下の /etc/fuse.conf の設定は必要ありません.(補足もご覧ください.)

/etc/fuse.conf を作成し,以下のように編集します. FUSE のインストール直後は,このファイルがありません.

/etc/fuse.conf
user_allow_other

この設定に関しては,FUSE パッケージの README をご覧ください.
これで,マウント時に -o allow_root オプションが使えるようになります.

注意

FUSE をインストールしてある環境では, 各一般ユーザは自由に FUSE を使ってファイルシステムを作成,マウントができます.
さらに user_allow_other の設定がされている場合,各一般ユーザはマウント時に, そのマウントポイントに他人もアクセスできるようにするオプション(-o allow_root と -o allow_other) を付けてマウントすることができるようになります.
この時,誰かがアクセスしたときに,操作がロックされてしまうようなファイルシステムであった場合などで問題になります.
たとえば,あるユーザがあるファイルシステムを作ります. そのファイルシステムに,ls をすると操作が固まってしまうというファイルシステムです. 誰かがそのファイルシステムを使ってマウントし,マウントした人とは異なるユーザが ls した場合, その FUSE によるファイルシステムのプロセスを kill しない限り, ls を終了できません. しかし,自分のプロセスではないので,kill できません.

補足

FUSE 2.2.1 以前と FUSE 2.3.0 とでは,ファイルシステムにアクセスしてきたプロセスの権限 (uid, gid 関係) と,マウントしたときのユーザとの比較方法が異なっています. そのため,FUSE のバージョンと,Samba や ftpd などの各種サーバ類との組み合わせによって, user_allow_other の設定が必要であったり,必要でなかったりします. たとえば,vsftpd は user_allow_other の設定が必要ありません. smbd も完全に一般ユーザの権限(uid, gid) になって動く方法があれば user_allow_other の設定は要らないはずです.(ご存知の方いらっしゃいませんか?)

参考

上記の設定をせずに FUSE を使ったファイルシステムを -o allow_root をつけてマウントすると,以下のエラーメッセージが出ます。

fusermount: option allow_other only allowed if 'user_allow_other' is set in /etc/fuse.conf

5. GfarmFS-FUSE で Gfarm をマウント

gfarmfs コマンドを実行して,Gfarm ファイルシステムをマウントします. 上記で設定した Samba を動かしている Linux マシン上で, かつ Gfarm の環境を使う準備ができている一般ユーザ権限で実行します.

gfhost -l などで,ファイルシステムノードにアクセスできる状態であることを確認してから, 以下のコマンドを実行してマウントします.
詳しくは Gfarm と GfarmFS-FUSE のドキュメントをご覧ください.

  $ gfarmfs [gfarmfs のオプション] マウントポイント -o allow_root [FUSE のオプション]

マウントポイントは Samba で公開しているディレクトリ自体,またはそれ以下のディレクトリにします.

注意

-o allow_other オプションを指定しないでください. -o allow_other オプションをつけると,他の一般ユーザがアクセスできてしまいます. しかも,マウントしたユーザの権限で Gfarm の環境にアクセスすることになります.

6. Windows から Samba にアクセスする

ワークグループのコンピュータを表示して探したり,アドレスバーに IP アドレスやマシン名を入力して, 上記で設定した Samba マシンに接続します. 次に,GfarmFS-FUSE でマウントしたディレクトリが含まれる共有フォルダを開きます. ここで,ネットワークドライブに割り当てることもできます. そして,gfarmfs コマンドでマウントしたディレクトリを開き,各ファイルをアクセスできます.

7. Samba の設定例,応用

Gfarm という共有名にアクセスするだけで,自動で GfarmFS-FUSE でマウントしてアクセスできるようになる例を考えてみました.
参考にして,応用してみてください.

[Gfarm]
  path = %H/samba-fuse
  create mask = 0644
  exec = /usr/local/bin/gfarmfsmount.sh %P
  preexec close = Yes
  postexec = /usr/local/bin/gfarmfsumount.sh %P
  read only = no

%H は各ユーザのホームディレクトリになります.
%P は path の内容になります.
exec は接続時に実行するコマンドです.
preexec close は exec に失敗した場合に接続できないようにします.
postexec は切断時に実行するコマンドです.
詳しくは smb.conf のマニュアルをご覧ください.

以下は,自動でマウント/アンマウントするためのスクリプトの例です. 状況により修正してお使いください.

gfarmfsmount.sh
#! /bin/sh

GFARMFS=/usr/local/bin/gfarmfs
USERNAME=`/usr/bin/whoami`
LOGFILE=/tmp/gfarmfs-$USERNAME.log

#ARCH="-a i686-FC3-linux"
ALLOWROOT="-o allow_root"

GREP=/bin/grep
DF=/bin/df
TAIL=/usr/bin/tail
DATE=/bin/date

# for fusermount
export PATH=$PATH:/usr/local/bin

#####
if [ $# -ne 1 ]; then
    echo "usage: `basename $0` MOUNTPOINT"
    exit 1
fi

if [ ! -f $LOGFILE ]; then
    touch $LOGFILE
    chmod 600 $LOGFILE
fi

DATE=`$DATE '+%Y%m%d-%H%M%S'`
MOUNTP=$1

($DF -t fuse $MOUNTP | $TAIL +2 | $GREP gfarmfs > /dev/null && \
    (echo $DATE MOUNT:ALREADY $MOUNTP) || \
    ($GFARMFS $ARCH -l -s $MOUNTP $ALLOWROOT && \
    echo $DATE MOUNT:SUCCESS $MOUNTP || ! echo $DATE MOUNT:FAIL $MOUNTP)
) >> $LOGFILE 2>&1

exit $?

gfarmfsumount.sh
#! /bin/sh

FUSERMOUNT=/usr/local/bin/fusermount

USERNAME=`/usr/bin/whoami`
LOGFILE=/tmp/gfarmfs-$USERNAME.log

DATE=/bin/date
SLEEP=/bin/sleep

#####
if [ $# -ne 1 ]; then
    echo "usage: `basename $0` MOUNTPOINT"
    exit 1
fi

if [ ! -f $LOGFILE ]; then
    touch $LOGFILE
    chmod 600 $LOGFILE
fi

DATE=`date '+%Y%m%d-%H%M%S'`
MOUNTP=$1

(cd /; $SLEEP 1;
    $FUSERMOUNT -u $MOUNTP && \
        echo $DATE UMOUNT:SUCCESS $MOUNTP || \
        echo $DATE UMOUNT:FAIL $MOUNTP
) >> $LOGFILE 2>&1 &

8. コメント

質問やコメントがありましたら, datafarm@apgrid.org まで自由にメールを送付してください.


Grid Datafarm <datafarm@apgrid.org>