このエントリーをはてなブックマークに追加
スポンサーリンク

sambaのインストール

sambaとは

大勢が参加するプロジェクトで、1つの巨大システムを作る場合、バージョンの管理が非常に大変です。もし、それぞれが、それぞれのパソコンに、開発中のソフトを入れて、それぞれが別々にプログラムを作っていると、時として誰かが修正したプログラムを、また別の人が修正してしまい、最初の修正が元に戻ってしまう事があります。

同様に、せっかく誰かがバージョンアップしたのに、別の人が古い元をから別のバージョンを作ってしまったりします。こうなると、もう各自バージョンがバラバラで、どれが最新バージョンかわからなくなってしまいます。また、会社でも自宅でも、パソコンが複数台ある時に、同じ文書ファイルがそれぞれ全部のパソコンに入っていたのでは、容量的にも無駄になりますし、作業パソコンが変わるたびにファイルをコピーしなければなりません。

そこで、ネットワーク内にファイルサーバーを設置し、大事なファイルは必ずそこに入れる事にして、修正するにしても必ずサーバーからファイルを出して、サーバーに戻すようにしておけば、バージョンの管理も楽になります。sambaは、Linuxサーバーのディレクトリを、Windows機から読み書きできるようにするためのサーバーです。これにより、Linuxサーバーをネットワーク内のファイルサーバーとして使えるようになります。

ソースファイル一式の転送

sambaはRPMパッケージ化されており、また、CDからLinuxをインストールする際に「Windowsファイルサーバー」を指定すればインストールされます。しかし、sambaはapacheやPHPと同様にバージョンアップが頻繁なので、ここではソースからインストールしてみましょう。

まず、sambaのソースファイル一式を入手します。
日本sambaユーザー会

コンパイル&インストール

ファイルを解凍してコンパイル&インストールします。

・sambaバージョン2.0日本語版の場合
cd /usr/local/src/samba
tar xvzf samba-2.07-ja-2.0.tar.gz
cd samba-2.07-ja-2.0/source/

・sambaバージョン3.6の場合
cd /usr/local/src/samba
tar xvzf samba-3.6.0.tar.gz
cd samba-3.6.0/source3/

samba3.6のソースファイルはsourceではなくsource3です。どうもsource4にバージョン4用のソースが試験的に入ってるみたいで。バージョン3からマルチバイト言語対応になったので、バージョン2のような「日本語版」というものはありません。バージョン3からはwindowsVISTAの認証方式に対応になったので、これからインストールする場合はなるべくバージョン3以降を使いましょう。

・ここからは共通
./configure
make
make install

無事コンパイル&インストールが終わったら、設定ファイルの雛型をコピーします。smb.confというファイルが存在しないとsambaが起動しませんので、必ず前もってコピーしておきます。
cp ../exsamples/smb.conf.default /usr/local/samba/lib/smb.conf

もしこの作業を忘れた場合、/usr/local/samba/var/log.smbdに、"/usr/local/samba/lib/smb.conf not found" というエラーが記録されます。このように、もし何かしら問題があってsambaが起動しない場合は、このログファイルを確認してみてください。

また、バージョン3.6では、libtalloc.so.2や libwbclient.so.0などのシェアードオブジェクト(Windowsでいうところのダイナミックリンクファイル)を探すように指定しないといけません。

vi /etc/ld.so.conf.d/samba.conf
/usr/local/samba/lib
ldconfig
コラム /etc/ld.so.conf.d/とは
Linuxではシェアードオブジェクト(Windowsでいうところのダイナミックリンクファイル)は通常では/usr/lib、/usr/local/lib、/usr/lib64から探すのですが、PostgreSQLやMySQLみたいに標準の場所には置かずに、自前のシェアードオブジェクト置き場を設置するソフトもあります。

そういう場合は、/etc/ld.so.conf.d/以下に拡張子.conf以下のファイルを作って、そこにシェアードオブジェクト置き場の場所を記載して、ldconfigでlinuxに登録させる必要があります。

sambaの起動

sambaを起動してみましょう。

/usr/local/samba/bin/smbd -D
/usr/local/samba/bin/nmbd -D

最後の、-D オプションはsambaをデーモン起動させる(メモリに常駐させて裏で実行し続ける)ことを指示しています。うまう起動したかどうかは、ps コマンドで確認します。

例)
ps ax | grep mb
746 ? S 0:00 /usr/local/samba/bin/smbd -D
748 ? S 0:02 /usr/local/samba/bin/nmbd -D

このように、smbdとmnbdが常駐していれば成功です。もし出てこない時は前述したように、ログファイル(/usr/local/samba/var/log.smb)を確認してみてください。

sambaを自動起動させる

sambaをrpmではなくソースコンパイルでインストールした場合は、自動起動スクリプトを自作する必要があります。

例)
vi /etc/rc.d/init.d/samba
#!/bin/sh
#
# chkconfig: 345 81 35
# description: Starts and stops the Samba smbd and nmbd daemons
#              used to provide Samba network services.

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

CONFIG=/usr/local/samba/lib/smb.conf

# Check that smb.conf exists.
[ -f $CONFIG ] || exit 0

# See how we were called.
case "$1" in
  start)
         echo "Starting smbd..."
         /usr/local/samba/sbin/smbd -D
         echo "Starting nmbd..."
         /usr/local/samba/sbin/nmbd -D
        ;;

  stop)
         echo "Stopping smbd and nmbd..."
         killall smbd
         killall nmbd
         rm -f /usr/local/samba/var/locks/smbd.pid
         rm -f /usr/local/samba/var/locks/nmbd.pid
        ;;
  restart)
        echo "Restarting SMB services: "
        $0 stop
        /bin/sleep 3
        $0 start
        echo "done."
        ;;
  *)
        echo "Usage: smb {start|stop|restart}"
        exit 1
esac
chmod 755 /etc/rc.d/init.d/samba
chkconfig samba on

これで、新しくインストールしたsambaが、サーバー起動時に実行されます。またシャットダウン時には自動的にstop()部が実行され、sambaが正しく終了します。

swat機能の追加

従来のsambaは、設定ファイルをエディターで書き換えて共有資産の設定を行っていたのですが、最近では swatといって、Windowsのブラウザ上から簡単に共有資産の設定ができるようになりました。

・configureオプションの追加
./configure --with-i18n-swat
のように、configureオプションとして --with-i18n-swatを指定する事でswatを利用可能にします。

・/etc/servicesの追加
901ポートをswatというサービスに割り当てます。 cat /etc/services | grep 901 として swat 901/tcp #Samba Web Administration Tool と定義されていればそのままで良いのですが、定義されていない時は、swat 901/tcp という行を/etc/servicesに追加しておきます。

・xinetdの設定
/etc/xinetd/swat に以下の記述をします。
service swat
{
        port            = 901
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/local/samba/bin/swat
        log_on_failure += USERID
        only_from       = 192.168.0.0/24
        disable         = no
}
この場合、only_fromでローカルエリア(ここでは、192.168.0.XXX)以外のアクセスを禁止しています。 SWATをリモートで他からアクセスする必要はないでしょうから、この指定は必ず入れておきましょう。(ローカルネットのネットワークアドレスによって変更します。)

swatの起動

swatは、サーバーに繋がっている Windows機から行います。まず、Windows機で InternetExplorerを起動します。そして、

http://サーバー名:901/ と入力します。

ユーザー名とパスワードを要求されますので、ここでユーザー名にroot、パスワードにルートパスワードを入れてください。あとは、ブラウザの画面に出た指示通りに操作すれば、共有するファイルの設定を行う事ができます。

暗号化パスワードの解決

sambaにログインする場合、Windows95までの時はそのままログインできました。しかし、Windows98/2000以降では、パスワードが暗号化され、そのままではログインできません。

そこで、Windowsがプレーンテキストのパスワードを使うようにするか、sambaがWindows方式の暗号化パスワードを使えるようにします。

1.プレーンパスワードを使う

1-1.Windows95/98/Me/2000の場合
レジストリエディタで、\HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\VNETSUPの、EnablePlainTextPasswordを、01,00,00,00 にします。

しかし、これらのレジストリの場所は探すのも覚えるのも困難です。そこで、c:\windows\options\mtsutil\ptxt_on.infというファイルを右クリックして、「インストール」を選択することで、自動的にレジストリが更新されます。

Windowsプレインストール機でない場合、c:\windows\options\ というフォルダーは存在しない事がありますので、WindowsのCD-ROMから、ptxt_on.infというファイルを探してください。

1-2.WindowsXPの場合
WindowsXPでは、従来のREGEDITが使えません。そこで、かわりにgpedit.msc 使います。ローカルコンピュータポリシー\コンピュータの構成\Windowsの設定\セキュリティの設定\ローカルポリシー\セキュリティオプションの項目にある、【Microsoft ネットワーククライアント:サードパーティ製のSMBサーバーへ接続するためのパスワードを、暗号化しないで送信する】という項目をクリックし、「有効」にチェックを入れます。

2.暗号化パスワードを使う

sambaの側で、Windowsの暗号化パスワードを使って認証できるようにします。

2-1.暗号化パスワードを有効にする
/usr/local/samba/conf/smb.conf

というファイルを編集します。

[global]
security = user
encrypt passwords = yes
update encrypted = yes

ただし、swatをインストールしてあれば、手動でsmb.confを編集しなくても、globalという項目にある[パスワードを暗号化]と[暗号化パスワードに更新]をYESにする事で変更できます。
2-2.暗号化パスワードを作成する
Linuxのシャドーパスワードから、Windowsの暗号化パスワードを生成する事はできません。なぜなら、共にまったく違うアルゴリズムで暗号化されており、元に戻す事は不可能だからです。

そこで、samba用のパスワードをコマンドラインより作成します。

/usr/local/samba/bin/smbpasswd -a ユーザー名

と入力します。すると、パスワードを聞いてきますので入力します。再度入力を求められますので、入力します。

パスワードを変更する時は -a (=ADD)オプションを指定せずに、単に/usr/local/samba/bin/smbpasswd ユーザー名 と入力します。

ただし、先の設定にあった、update encrypted = yesと指定しておくと、プレーンテキストを送信するWindows機からログインした時に、自動的に暗号化パスワードが生成されます。

ただし、あくまでこれはsamba用のパスワードを作るだけで、Linuxに同名のユーザーが必要です。「smbpasswd -a ユーザー名」でパスワードを作成する前に、useraddコマンドでユーザーを追加しておきましょう。

3.WindowsVISTA の場合

WindowsVISTA以降ではファイルサーバーとの認証プロトコルが変更されました。VISTA側でXPと同じ認証方式に変更する事で、sambaサーバーに接続できるようになります。レジストリエディタで、
\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\LmCompatibilityLevel
の値を1に変更すると、XPと同じ認証方式になります。

ただし、この方法はレジストリを書き換えるためいささか危険なのと、全ての端末で同じ操作をしなければならず面倒です。sambaバージョン3以降にする事で、sambaサーバーの方でVISTAの認証方式に対応してくれるようになります。バージョン3以降でも、上の方で説明したコンパイル&インストール手順で大丈夫でした。

・動作確認

Windows機のデスクトップにある「ネットワークコンピューター」をクリックしてみてください。ここに、サーバー名が表示されていれば成功です。

表示されない時は、「ネットワークコンピューター」を右クリックした後、「コンピューターの検索」を選択し、ここにサーバー名を入れると出てくる場合があります。(たいていの場合、起動してから4〜5分経てば「ネットワークコンピューター」に表示されるようです。)

ここでネットワークコンピューターにも表示されず、検索して表示させても「権限がありません」というエラーが出る時は、以下の点を確認してください。

1.Linuxにユーザー登録されているかどうか
「Microsoft Network」にログインする場合のユーザー名が、Linuxにも登録されている必要があります。smbpasswd -a だけではいけません。もし登録されていない場合、useraddコマンドを使ってユーザーを追加してください。

2.暗号化パスワードが解決されているかどうか
Windows98/Me/2000/XPで暗号化パスワードを使うようになっている場合、samabでも暗号化パスワードを使うように設定されていなければなりません。同様に、端末がWindowsVISTA/7の場合はVISTA以降の認証方式にも対応していなければなりません。このページの上の方をもう一度よく見て確認してください。

共通設定

全共有エリア共通の設定を行います。smb.confの、[global]というエリアで行います。
   [global]
   server string =
   log file = /usr/local/samba/var/log.%m
   max log size = 50
   dns proxy = No
   encrypt passwords = yes
   update encrypted = yes
   os level = 20
サーバー名
Windows機の「マイネットワーク」を開いたときに表示される名前です。正式には、ここで設定した”サーバー名(ホスト名)”となります。

ログファイル名
ログファイルのパスとファイル名を指定します。log.%mと設定しておくと、ファイル名は実際にはlog.(接続しに来たホスト名)になります。

max log size
ログファイルの最大サイズを指定します。単位は「メガバイト」です。0は「無制限」を意味します。最大サイズを越えると自動的にローテーションしてくれます。ただし、ローテーションはシスログのlogrotate.dに任せてしまう場合には0にしておくのも良いでしょう。

dns proxy
WINSの名前解決のためのキャッシュサーバーとして使うかどうか、ですが、WINS自体ほとんど使わないので、通常はNOで問題ないでしょう。

encrypt passwords
update encrypted
先に説明した通り、暗号化パスワードを使うかどうかの設定をします。Windows2000以降の端末はデフォルトで暗号化パスワード必須ですので、YESにしておきましょう。update encryptedをYESに設定しておくと、平文でパスワード認証が成功した際に自動的に暗号化パスワードも生成してくれるので便利です。

os level
OSのレベルというと難しい話になりますが、WindowsではOSにそれぞれ「レベル」を設定しています。WindowsNTServerやWindows2003Server等の、ウィンドーズサーバーシリーズが最もレベルが高い32に設定されています。

そのネットワーク内の、最もレベルの高いOSが、マスターブラウザとなります。なので、SAMBAをマスターブラウザにしたい場合、逆にしたくない場合は、このレベルを32より大きくしたり小さくしたりする事で、マスターブラウザをある程度調整できます。
コラム:マスターブラウザーとは

Windowsパソコンで「マイネットワーク」を開いたときに、毎回ネットワーク全体を検索せずに、以前そのネットワークに存在した事のあるサーバー名が最初から表示されている事があるでしょう。

これは、そのネットワーク内にかつて存在していたサーバー名のリストを、マスターブラウザが覚えているからです。じゃあ、そのマスターブラウザーってどこにあるでしょう?

そのネットワーク内にある最もOSレベルの高いサーバーが、マスターブラウザです。通常は、"Windowsなんとかサーバー"になります。つまり、サーバーは常に電源が入れっぱなしになっているので、マスターブラウザとして最適なわけです。

ネットワーク内のWindowsなんとかサーバーがない場合、マスターブラウザはその都度変動します。なので、以前マイネットワークに見えていたサーバーが場合によって出てたり消えたりする・・・はずですが、大抵はそうはなりません。

これは、Windowsの個々の端末側でも、「ネットワークプレース」の所にショートカットとして、以前そのネットワーク内に存在していたサーバーをある程度記憶しているからです。

文字コードの設定

Windowsのファイルサーバーですので、当然日本語を含むファイル名を扱えなければなりません。そのため、Windows側、unix側それぞれの文字コードを指定する必要があります。文字コードの設定も[global]以下に記載しますが、バージョン2日本語版とバージョン3では設定方法が異なります。
バージョン2日本語版
   [global]
   client code page = 932
   coding system = SJIS 
client code page
端末側のコードページを指定します。日本語なら932で良いでしょう。

coding system
端末側の文字コードを指定します。Windows端末なら「SJIS」でしょう。ここを正しくSJISと指定することで、「ソ」「表」のような¥コードまじりのファイル名でも自動的にエスケープしてくれます。
バージョン3
   [global]
   unix charset = EUC-JP
   dos charset = SHIFT_JIS
   display charset = EUC-JP
unix charset
サーバー側の文字コードを指定します。ここではEUCを指定していますが、サーバーで通常使っている文字コードに合わせた方が良いでしょう。

dos charset
DOS側の、つまりWindows端末側の文字コードを指定します。ここではシフトJISを指定していますが、絵文字を含むファイル名を扱うなら「CP932」とします。

display charset
SWATで表示させる文字コードを指定します。

個々の共有エリアの設定

個々の共有エリアはsmb.confの、[共有名]というエリアで行います。
  [(共有名)]
  comment = 
  path = 
  valid users =
  writeable = Yes
  create mask = 0755
  guest ok = 
共有名
Windows機側で「名前」の欄に表示されます。

comment
Windows機側で「コメント」の欄に表示されます。Windows機で「コンピューターの説明」で設定するものと同じです。

path
共有エリアへのパスです

valid users
この項目を設定しておけば、接続を許可するユーザーを限定する事ができ、セキュリティーが向上します。

writeable
書き込み可能か、見るだけかを設定します。

create mask
もしWindows機からユーザーが「新しいフォルダ」を作成した時に、パーミッションがいくつになるかを設定します。同じグループなら誰でも書き込めるようにするためには、0775にしておきます。(0755だとフォルダを作った本人しか書き込みできないディレクトリになります)

guest ok
ゲストが入れるかどうか。ここをYESにすると、同じネットワーク内にいる人から丸見えになります。逆に、同じネットワーク内にいる人全員で共有したい時にはYESにしておきます。

ログの管理

・ログディレクトリを作成します
mkdir /var/log/samba
chown samba.samba /var/log/samba

・ログの出力先を変更します
vi /usr/local/samba/lib/smb.conf
log file = /var/log/samba/%m.log
・ローテーションの指定をします
vi /etc/logrotate.d/samba
/var/log/samba/*log {
        create 0644 samba samba
        missingok
        sharedscripts
        postrotate
                /bin/kill -HUP `cat /usr/local/samba/var/locks/smbd.pid 2>/dev/null` 2> /dev/null || true
                /bin/kill -HUP `cat /usr/local/samba/var/locks/nmbd.pid 2>/dev/null` 2> /dev/null || true
        endscript
}
エラーがない事を確認します
logrotate -d /etc/logrotate.conf
コラム:logrotate -dとは

logrotatの設定ファイルが正しく記述されているかどうか確かめるコマンドです。 これをやっておかないと、もしエラーがあった場合にsambaのログだけでなく、 他のローテーションも全て無効になってしまいます。

これの怖いところは、もしローテーションファイルにミスがあると、影響が出るのはapache等のログが2ギガオーバーするであろう数ヵ月後で、 しかもローテーションが行われる午前0時にapacheが止まったりします。 したがって、最悪の場合、深夜にサーバー管理者が電話で叩き起こされる事態になります。
log.nmbd log.smbdもローテーションしたい
log.nmbd log.smbdは、出力先が/usr/local/samba/var/に固定されています。これを変更したい場合は、起動する時に -l オプションを使います。なので、起動スクリプトをちょっといじります。

vi /etc/rc.d/init.d/samba
#!/bin/sh
#
# chkconfig: 345 81 35
# description: Starts and stops the Samba smbd and nmbd daemons
#              used to provide Samba network services.

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

CONFIG=/usr/local/samba/lib/smb.conf

# Check that smb.conf exists.
[ -f $CONFIG ] || exit 0

# See how we were called.
case "$1" in
  start)
         echo "Starting smbd..."
         /usr/local/samba/sbin/smbd -l /var/log/samba -D
         echo "Starting nmbd..."
         /usr/local/samba/sbin/nmbd -l /var/log/samba -D
        ;;

  stop)
         echo "Stopping smbd and nmbd..."
         killall smbd
         killall nmbd
         rm -f /usr/local/samba/var/locks/smbd.pid
         rm -f /usr/local/samba/var/locks/nmbd.pid
        ;;
  restart)
        echo "Restarting SMB services: "
        $0 stop
        /bin/sleep 3
        $0 start
        echo "done."
        ;;
  *)
        echo "Usage: smb {start|stop|restart}"
        exit 1
esac
これでlog.nmbd log.smbdの出力先が/var/log/sambになります。ただし、このままでは拡張子がlogのものしかローテーションされないので、ローテーションファイルもいじります。
vi /etc/logrotate.d/samba
/var/log/samba/*log /var/log/samba/*mbd {
        create 0644 samba samba
        missingok
        sharedscripts
        postrotate
                /bin/kill -HUP `cat /usr/local/samba/var/locks/smbd.pid 2>/dev/null` 2> /dev/null || true
                /bin/kill -HUP `cat /usr/local/samba/var/locks/nmbd.pid 2>/dev/null` 2> /dev/null || true
        endscript
}
エラーがない事を確認します
logrotate -d /etc/logrotate.conf

ログローテーションファイルをいじった時は、必ず「logrotate -d /etc/logrotate.conf」でエラーがない事を確認してください。これを怠ってもしミスがあって放置しておくと、上記のコラムにあるよううに週末の一番楽しい時に仕事で会社に呼び出される事態になります。

別セグメントにあるPCをマイネットワークに表示させる

通常は同一セグメント内のPCのみ、マイネットワークに表示されますが、マスターブラウザ同士、ブラウズリストを交換する事で別セグメントにあるPCを、マイネットワークに表示させる事が可能です。

そのためには、各セグメント毎にsambaサーバーが1台ずつ必要になります。

vi /usr/local/samba/lib/smb.conf
domain master = yes
preferred master = yes
local master = yes
remote browse sync = 相手先サーバー
remote announce = 相手先サーバー
os level = 35
remote browse syncは、定期的に端末のPCのリストを取得するサーバーを指定します。別セグメントにあるsambaサーバーのIPを指定する事で、別セグメント内のPC群のリストを定期的に取得するようになります。セグメントが複数ある場合は、空白で区切って記述します。

remote announceは、指定したサーバーにこちらのセグメント内にある端末のリストをアナウンスする事を指定します。これを指定しないと、向こうのセグメントにある端末のリストは取得できるが、向こうにはこちらの端末リストをアナウンスしない、という事になります。セグメントが複数ある場合は、空白で区切って記述します。

ただし、これだけで異なるセグメントにある端末リストが表示されるだけでログインできません。異なるセグメントにある端末名とIPアドレスを紐付けする必要があります。

別セグメントにあるsambaサーバーで、
vi /usr/local/samba/lib/smb.conf
wins support = yes
とすると、sambaサーバーがwinsサーバーになります。この後、windowsサーバーの方で、winsサーバーとして指定する事で、別セグメントにあるサーバー名とIPアドレスが紐付けられるようになります。

IPTABLESに穴をあける

ローカルネットに置いてあるサーバーは大抵はポート全開けになっているでしょう。しかし、そんなキケンな事はしないという方は、sambaに必要なポートを開けてください。tcpの139、udpの137〜138を開けてください。

例)
iptables -A INPUT -p tcp --dport 139 --src 192.168.0.0/24 -j ACCEPT
iptables -A INPUT -p udp --dport 137 --src 192.168.0.0/24 -j ACCEPT
iptables -A INPUT -p udp --dport 138 --src 192.168.0.0/24 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 139 --dst 192.168.0.0/24 -j ACCEPT
iptables -A OUTPUT -p udp --sport 137 --dst 192.168.0.0/24 -j ACCEPT
iptables -A OUTPUT -p udp --sport 138 --dst 192.168.0.0/24 -j ACCEPT

注意
これはあくまでです。実際にはお使いのローカルネットに合わせて書き換えてください。同様に、-A INPUTや -A OUTPUTの部分はお使いの設定のチェインに合わせて書き換えてください。単にコピペしてもうまくいかないと思います。
スポンサーリンク