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

# Samba を使って gfarm ファイルシステムにアクセスする -- システムコールフックを用いる方法

English | 日本語

## 1. 概要

この文書では，Gfarm システムコールフックライブラリをプリロードした うえで Samba を起動して Windows から Gfarm ファイルにアクセスする ための設定方法を説明しています．

別の方法: GfarmFS-FUSE + Samba
別の方法として，FUSE を使って Samba を利用する方法もあります． しかし，フックライブラリを用いる方が，より設定／利用手順が簡単ですので， こちらの方法をお勧めします．

## 2. 利用環境の前提条件

- Samba サーバホスト
  - Samba のバージョン 3 以降を利用すること．(必須)
  - Gfarm クライアントが利用できること．(必須)
  - libgfs_hook が利用できること．(必須)
    具体的な手順については INSTALL.RPM.ja の 「● クライアントノードの設定」を参照してください．
  - smbd を実行するホストが Gfarm ファイルシステムノードではないこと(推奨)
    smbd を実行するホストがファイルシステムノードだと， 新規作成するファイルは，すべてそのホストに作成されてしまいます．
  - 認証方法としては sharedsecret を使い，全ての filesystem node と smbd を実行するホストの間で，各ユーザがホームディレクトリを NFS などの手段で共有していること(推奨)
    認証方法として sharedsecret ではなく GSI 認証を使う場合， smbd を実行するホストで，各ユーザが あらかじめ grid-proxy-init を実行しておく必要があります．また，GSI 鍵の有効期限が切れるたび に grid-proxy-init を再実行する必要があります．
    ホームディレクトリを共有していない場合は，sharedsecret よりも GSI 認証を使う方がむしろ簡単です． ホームディレクトリを共有していない環境で sharedsecret を使う場合は， 各ユーザが smbd を実行するホストで「gfkey -c」を実行し， ~/.gfarm_shared_key を，全てのファイルシステムノードの ホームディレクトリにコピーする必要があります． また、sharedsecret 鍵の有効期限が切れるたびに，この作業を 繰り返す必要があります．

関連ソフトウェア

- Gfarm: http://oss-tsukuba.org/software/gfarm
- Samba: http://www.samba.gr.jp/

## 3. LDAP サーバの設定

### 3.1 日本語ファイル名のための設定

/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行を変更します．

## 4. Samba サーバの設定

### 4.1 smb.conf の変更

#### 4.1.1 [global] セクションへの追加項目

##### 4.1.1.1 日本語ファイル名のための設定

Linux 側ではファイル名の文字コードとして UTF-8 を使うようにし， それを Windows から見えるように設定します．

Samba 3 系のための設定

    dos charset = CP932
    unix charset = UTF-8
    display charset = UTF-8

##### 4.1.1.2 kernel change notify を無効にする (Samba 3 系の場合)

Gfarm のシステムコールフックライブラリが現在サポートしていない，fcntl(2) システムコールの F_NOTIFY 機能を，samba が利用しないようにします．

    kernel change notify = no

この設定をしないと，Windows クライアントと Samba との接続が切れることがあります(Samba 3.0.10 と 3.0.20 で確認)． この設定にすると，更新されたファイルの状態の表示がすぐに更新されなくなります．
Samba 2 系では，この設定を使うことができないので，この問題を回避できません．

#### 4.1.2 Gfarm ファイルの共有を定義するセクションを追加

Gfarm ファイルシステムにアクセスするためのセクションを追加します．

##### 4.1.2.1 Gfarm ファイルシステム用パラメータ

セクション内で以下のパラメータを指定してください．

デフォルトの設定で Windows クライアントから Gfarm ファイルシステム にファイルを新規作成あるいはコピーすると，そのファイルの 実体が置かれるファイルシステムノードと同じアーキテクチャを もつ，実行ファイル(プログラム)として登録されてしまいます． ほとんどの場合，これは期待される動作と異なりますので， 実行不可能なファイルとして登録するために以下のパラメータを 指定します．

    create mask = 0644

デフォルトの設定で，Windows クライアントから Gfarm ファイルシステム 上のファイルを読み書きすると，Gfarm がシステムコールフック 機能をサポートしていないシステムコールを Samba が呼び出します． これを防ぐために以下のパラメータを指定します．

    oplocks = no
    level2 oplocks = no

##### 4.1.2.2 例

複数ユーザで，Gfarmファイルシステム全体を共有する場合に追加する セクションの例を以下に示します．

    [gfarm-public]
       comment = Gfarm Public Stuff
       path = /gfarm
       public = yes
       writable = yes
       printable = no
       create mask = 0644
       oplocks = no
       level2 oplocks = no

## 5. Samba の起動方法

### 5.1 起動スクリプトの変更

RedHat Linux での例を用いて説明します．

smbd の起動処理において，以下の項目を追加・変更します．
RedHat Linux の場合，これはスクリプトファイル /etc/init.d/smb の関数 start() で行われています．

#### 5.1.1 ファイル記述子数制限の拡大処理の追加

smbd 機能の直前に，以下の行を追加します．

    	m=`ulimit -n`
    	n=$(( $(gfhost -M | wc -l) + 50))
    	if [ -n "$m" -a X"$m" != X"unlimited" -a "$m" -lt $n ]; then
    		ulimit -n $n
    	fi

#### 5.1.2 smbd 起動行に LD_PRELOAD 環境変数の設定を追加

smbd デーモンを起動している行の行の先頭に LD_PRELOAD 環境変数や LD_LIBRARY_PATH 環境変数の設定を追加します． 詳しい説明は，付属ドキュメントの README.hook.ja を参照してください．

RedHat Linux を例にとると，

    	daemon smbd $SMBDOPTIONS

のところを

    	gfarm_prefix=/usr
    	globus_location=/usr/grid
    	globus_flavor=gcc32
    	LD_LIBRARY_PATH="$globus_location/lib" LD_PRELOAD="$globus_location/lib/libglobus_gssapi_gsi_$globus_flavor.so.0 $globus_location/lib/libssl_$globus_flavor.so.0 $gfarm_prefix/lib/libgfs_hook.so.0 /usr/lib/gfarm/libpthread-not-hidden.so /usr/lib/gfarm/libc-not-hidden.so" daemon smbd $SMBDOPTIONS

とします．変数 gfarm_prefix，globus_location や globus_flavor の値は，実際に Gfarm や Globus をインストールしたパスや， Gfarm にリンクしている Globus の flavor 名に合わせて変更してください．

Globus 関係のパスを追加するためには，まず Globus の共有ライブラリを インストールしておく必要があるので，注意してください． ただし，バイナリ作成時に Globus をリンクしていなければ，Globus 関係のパスの追加は不要です．(RedHat Linux 向けバイナリ配布の場合は リンクしていますので，必要です．)

また，バイナリ作成時に Globus を動的リンクしていなければ， LD_LIBRARY_PATH の追加は不要です．(RedHat Linux 向けバイナリ配布の 場合は静的リンクしていますので，実際には省略できます．)

Linux 以外のOS では "*-not-hiddden.so" の指定は不要です．

### 5.2 追加後の起動スクリプト例

    #!/bin/sh

    (中略)

    start() {
    	KIND="SMB"
    	echo -n $"Starting $KIND services: "
    	m=`ulimit -n`
    	n=$(( $(gfhost -M | wc -l) + 50))
    	if [ -n "$m" -a X"$m" != X"unlimited" -a "$m" -lt $n ]; then
    		ulimit -n $n
    	fi
    	gfarm_prefix=/usr
    	globus_location=/usr/grid
    	globus_flavor=gcc32
    	LD_LIBRARY_PATH="$globus_location/lib" LD_PRELOAD="$globus_location/lib/libglobus_gssapi_gsi_$globus_flavor.so.0 $globus_location/lib/libssl_$globus_flavor.so.0 $gfarm_prefix/lib/libgfs_hook.so.0 /usr/lib/gfarm/libpthread-not-hidden.so /usr/lib/gfarm/libc-not-hidden.so" daemon smbd $SMBOPTIONS
    	RETVAL=$?
    	echo
    	KIND="NMB"
    	echo -n $"Starting $KIND services: "
    	daemon nmbd $NMBDOPTIONS
    	RETVAL2=$?
    	echo
    	[ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && touch /var/lock/subsys/smb || \
    	   RETVAL=1
    	return $RETVAL
    }

    (以下略)

### 5.3 Samba を起動または再起動

例えば RedHat Linux では以下を実行します．

    # /etc/init.d/smb [start|restart]

## 6. Windows から Sambaへのアクセス

Samba での共有に Windows クライアントのネットワークドライブを 割りあてます．例えば以下の手順で共有フォルダが表示されます．

1. マイネットワークアイコンを右クリック
2. ネットワークドライブの割り当てを左クリック
3. 表示されたダイアログでドライブ名と共有フォルダ名を指定