文書集 > ユーザーズマニュアル > samba

# Windowsでマウント

English | 日本語

## 1. 概要

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

必要な環境や設定

- Samba サーバマシン側
  - Gfarm のクライアントが利用できる．利用しようと思っている Gfarm の環境にアクセスできる．
  - 認証方法は，sharedsecret 認証を使用し，Gfarm のファイルシステムノードのホームディレクトリが共有されていることを推奨する．そうでない場合は，使用する前に ~/.gfarm_shared_key を各ノードに配布するか，grid-proxy-init を実行しておかなければならない．
  - FUSE がインストールされている．(= Linux カーネル 2.4 or 2.6 環境)
  - 一般ユーザが FUSE でマウントしたマウントポイントに，他のユーザがアクセスすることを許可されている．(user_allow_other 設定)
  - gfarm2fs がインストールされていて，実行できる．
  - 一般ユーザが FUSE でマウントした(する予定の)マウントポイントに Samba 経由でアクセスできるような Samba の設定にして動かすことができる．
  - この Samba サーバのマシン上で Gfarm のファイルシステムデーモン(gfsd)を動かしていないことを推奨する．gfsd を動かしていると，Samba サーバの Gfarm スプールが一杯になるまで Samba サーバにしかファイルが作成されない．
- Windows マシン側
  - 上記 Samba のサービスにアクセスができる．

関連ソフトウエア一覧

- Gfarm and gfarm2fs: http://oss-tsukuba.org/software/gfarm
- FUSE: http://fuse.sourceforge.net/
- Samba: http://www.samba.gr.jp/

## 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 に設定します． gfarm2fs を使ってマウントする予定のパス，またはそれより上のディレクトリのパスを指定します． これらは SWAT を使うと簡単に設定できます．
そして gfarm2fs にアクセスするセクションには，ファイルを書き込めるようにし，ファイル新規作成時に，実行ビットが付かないようにします．

例

    [Gfarm]
    path = /tmp/gfarm/%u
    create mask = 0644
    read only = no

これで， /tmp/gfarm の下に各ユーザがユーザ名のディレクトリを作って gfarm2fs でマウントしておけば，Gfarm という共有名でアクセスできます．

次に，Gfarm を実行する 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) を付けてマウントすることができるようになります．

### 補足

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. gfarm2fs で Gfarm をマウント

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

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

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

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

### 注意

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

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

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

## 7. Samba の設定例，応用

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

- Gfarm という共有名で公開する．
- 誰がアクセスしても，gfarm2fs によるマウントポイントが共有フォルダの直下になるようにする．
  - 各ユーザのホームディレクトリ直下の samba-fuse というディレクトリを公開する．
  - ディレクトリを作成しておく必要がある．(mkdir ~/samba-fuse)
- 共有フォルダへ接続時に各ユーザの権限で自動で gfarm2fs を使ってマウントする．
  - しかし，共通鍵認証方式を使って，すべてのファイルシステムノードのホームディレクトリを共有しておかないと完全に自動にならない．
  - または GSI 認証を使うようにし，Samba を動かしているマシンで grid-proxy-init を実行しておく必要がある．
- マウントに失敗したら，この共有名の接続も失敗するようにする．
- 切断時には自動でアンマウントする．

    [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/gfarm2fs
    USERNAME=`/usr/bin/whoami`
    LOGFILE=/tmp/gfarm2fs-$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 gfarm2fs > /dev/null && \
        (echo $DATE MOUNT:ALREADY $MOUNTP) || \
        ($GFARMFS $ARCH $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/gfarm2fs-$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. コメント

質問やコメントがありましたら， gfarmfs at gmail.com まで自由にメールを送付してください．