Samba設定

samba の設定
ユーザー名のマッピング
samba パスワードの設定
samba サーバーの操作
smb.conf のエラーチェック
Linux から samba サーバーへのログイン
inetd経由での起動設定
参考リンク

INDEXに戻る



samba のインストール

rpmからインストールする場合は以下のモジュールが必要。
samba-client-????
samba-common-????
samba-libsmbclient-????
samba-????
samba-swat-????   < Web上からの設定ツール。 おこのみで
apt-get で自動的にインストールしたい場合は 以下のコマンド。
apt-get install samba
コンパイルする場合は日本 Sambaユーザ会からソースをGETして以下のように設定 。
 # tar zxfv samba-????.tar.gz
 # cd samba-????/source
 # ./configure \
 --prefix=/usr \
 --exec-prefix=/usr \
 --bindir=/usr/bin \
 --sbindir=/usr/sbin \
 --sysconfdir=/etc \
 --includedir=/usr/include \
 --libdir=/etc/samba \
 --localstatedir=/var \
 --with-fhs \
 --with-privatedir=/etc/samba \
 --with-lockdir=/var/lock/samba \
 --with-piddir=/var/run \
 --with-swatdir=/usr/share/swat \
 --with-codepagedir=/usr/share/samba/codepages \
 --with-automount \
 --with-smbmount \
 --with-syslog \
 --with-pam \
 --with-pam_smbpass \
 --with-quotas \
 --without-smbwrapper \
 --with-msdfs \
 --with-utmp \
 --with-i18n-swat
# make
# make install

自動起動スクリプトの用意

サービスとして起動する場合などに便利な自動起動スクリプト。
通常は /etc/rc.d/init.d/smb 等がある。
もしなければ、解凍したsamba-????/packaging/RedHat ディレクトリ配下などに、smb.init というサンプル自動起動スクリプトがあるので、 /etc/rc.d/init.d/smb にコピーして、chkconfigしておけば、ランレベル3、4、5で自動的に起動、停止が可能となる。

(inetd 経由で随時起動する場合はこの操作は不要)
# cp samba-????/packaging/RedHat/smb.init /etc/rc.d/init.d/smb
# chmod 755 /etc/rc.d/init.d/smb
# chkconfig --add smb
     (または)
# chkconfig --level 345 smb on
# chkconfig --list smb
smb    0:オフ 1:オフ 2:オフ 3:オン 4:オン 5:オン 6:オフ
参考までに起動スクリプトの内容はこちら。 表示 非表示
#!/bin/sh
#
# chkconfig: - 91 35
# description: Starts and stops the Samba smbd and nmbd daemons \
#              used to provide SMB network services.
#
# pidfile: /var/run/smbd.pid
# pidfile: /var/run/nmbd.pid
# config:  /etc/samba/smb.conf


# Source function library.
if [ -f /etc/init.d/functions ] ; then
  . /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
  . /etc/rc.d/init.d/functions
else
  exit 0
fi

# Avoid using root's TMPDIR
unset TMPDIR

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

if [ -f /etc/sysconfig/samba ]; then
   . /etc/sysconfig/samba
fi

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

# Check that smb.conf exists.
[ -f /etc/samba/smb.conf ] || exit 0

RETVAL=0


start() {
        KIND="SMB"
        echo -n $"Starting $KIND services: "
        daemon smbd $SMBDOPTIONS
        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
}       

stop() {
        KIND="SMB"
        echo -n $"Shutting down $KIND services: "
        killproc smbd
        RETVAL=$?
        echo
        KIND="NMB"
        echo -n $"Shutting down $KIND services: "
        killproc nmbd
        RETVAL2=$?
        [ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && rm -f /var/lock/subsys/smb
        echo ""
        return $RETVAL
}       

restart() {
        stop
        start
}       

reload() {
        echo -n $"Reloading smb.conf file: "
        killproc smbd -HUP
        RETVAL=$?
        echo
        return $RETVAL
}       

rhstatus() {
        status smbd
        status nmbd
}       


# Allow status as non-root.
if [ "$1" = status ]; then
       rhstatus
       exit $?
fi

# Check that we can write to it... so non-root users stop here
[ -w /etc/samba/smb.conf ] || exit 0



case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  reload)
        reload
        ;;
  status)
        rhstatus
        ;;
  condrestart)
        [ -f /var/lock/subsys/smb ] && restart || :
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|reload|status|condrestart}"
        exit 1
esac

exit $?

logrotate の設定

sambaのログをとるためには、あらかじめ /var/log/samba が必要。

コンパイルして make install などで samba をインストールした場合は、ローテーションファイルが存在しないかもしれない。

そのような場合に ログを定期的にローテーションするためには、パッケージ内の
samba-????/packaging/RedHat/samba.log
/etc/logrotate.d/samba という名前でコピーしておくと、1週間毎にログファイルがlogrotateされてべんり。
 # mkdir /var/log/samba
 # cp samba-????/packaging/RedHat/samba.log   /etc/logrotate.d/samba

samba の設定

設定ファイル

Vine linuxでの設定ファイル
/etc/samba/smb.conf 設定ファイル
/etc/samba/smbusers samba ユーザと Linux ユーザの対応を記録するファイル
/etc/samba/smbpasswd ユーザ(user)レベルのセキュリティ設定で使用するパスワードファイル
samba にログインするための ユーザー と パスワード が暗号化で記されている。
/etc/samba/smb.conf については、以下の各セクションに分かれている
[global] グローバル セクション
[homes]
[printers]
通常 セクション
[hoge]
(各共有設定)
サービス セクション
ほかのディストリビューションでは、
などにあるかもしれない。

[global]セクション内の設定

各サービスセクションの設定

[homes] セクション以降は、各共有フォルダ個別の設定が入る。

[homes] ← (10)
comment = Home Directories
browseable = no
writable = yes

[samba] ←(11)
comment = Kyoyu ← (a)
path = /home/samba ← (b)
read only = no ← (c)
guest only = yes
guest ok = yes ← (d)

[public]
comment = Public space; anyone can write any files.
path = /home/samba/public
force group = public
writeable = Yes
force create mode = 0664
force directory mode = 0775
guest ok = Yes

(10) ここから共有フォルダの設定。[homes] のままにしておくと、Linux 側で作成した
   ユーザーのホームディレクトリにアクセス可能になる。

(11)別途, 共有フォルダを作成した場合の一例。 この例では Linux 側に新規ユーザーとして
   samba を登録し、共有フォルダを /home/samba としている。手順については後述

(a) comment:Windows の「ネットワークコンピュータ」または「マイネットワーク」に表示される
  ネットワーク上の Linux サーバーの説明欄に表示される文字列の指定。
  日本語名不可。文字化けをおこす。

(b) path:共有フォルダのフルパス

(c) read only:次の guest ok = yes を指定している場合に、共有フォルダ内のファイル操作が
  guest によって行われるようにする設定。

(d) guest ok:誰でもこの共有を利用可能
  yes にするとパスワード入力が不要になる。

path = /hoge ユーザがアクセスできるディレクトリ
guest only = yes
only guest = yes
yesの場合、サービスへの接続はゲストのみ許される。
[global] セクションの service = ???? で
"guest ok" か "public" が設定されていない場合、このパラメータは効果がない。
public =yes guest ok と 同義
guest ok = yes サービスに対してこのパラメータを yesにすると、サービスに接続するときにパスワードが不要になる。
保護は guest account 扱い
browseable = yes net view コマンドの出力や
ブラウズリスト中の 有効な共有一覧 にこの共有を乗せてよいかどうか。
writeable = yes read only の反意語
このパラメータが "no" ならば、サービスに対応するユーザはサービスのディレクトリ中のファイルの作成も修正もできない
wide links = no
ディレクトリの外部へのリンクの許可の指定
no がセキュリティ上好ましい。
create mask = 0664
create mode = 0664
force create mode = 0664
ファイルが作成されたときの基本アクセス権
(force)の場合は、強制的にその属性でファイルを作成する。
directory mask = 0755
directory mode = 0755
force directory mode = 0755
ディレクトリが作成されたときの基本アクセス権
map archive = yes
map system = yes
map hidden = yes
DOSのファイル属性をUNIXで実現する
force user = hoge ファイルの作成者をhogeとみなす

変数の置換

smb.conf 設定ファイル中に設定可能な文字列の多くは、置換することができる
(例) path = /tmp/%u は、ユーザがユーザ名「john」で接続したなら path = /tmp/john として解釈される。
%S = 現在のサービス名。(あるなら)
%P = 現在のサービスのルート・ディレクトリ。(あるなら)
%u = 現在のサービスのユーザ名。(あるなら)
%g = %u の本来 (primary) のグループ名。
%U = セッションのユーザ名。 (クライアントに要求されたユーザ名であるが、必ずしもそこから取得した名前と同じものではない)
%G = %U の本来 (primary) のグループ名。
%H = %u で与えられたユーザのホーム・ディレクトリ。
%v = Samba のバージョン。
%h = Samba が動作しているホストの名前。
%m = クライアント・マシンの NetBIOS 名。(とても便利)
%L = サーバの NetBIOS 名。これを用いれば、クライアントから呼ばれた名前に応じて設定を変更することが可能となる。
   サーバは「2 つの人格」を持つことができる。
%M = クライアント・マシンのインターネット名。
%N = NIS のホーム・ディレクトリ・サーバの名前。これは NIS の auto.map エントリから取得される。
    Samba を --with-automount オプションなしでコンパイルしてあると、この値は %L と同じになる。
%p = サーバのホーム・ディレクトリのパス。 NIS の auto.map エントリから取得される。
    NIS auto.map エントリは「%N:%p」のように分解される。
%R = プロトコル交渉(negotiation)後に選択されたプロトコル・レベル。 CORE、COREPLUS、LANMAN1、LANMAN2、
    または NT1 のうち、いずれかの値を取る。
%d = 現在のサーバ・プロセスのプロセス ID。
%a = リモート・マシンのアーキテクチャ。 100% 確実ではなく、いくつかだけが認識される。
    現状では、Samba、WfWg、WinNT、Win95 のいずれかに認識される。それらでなければ「UNKNOWN」と識別される。
%I = クライアント・マシンの IP アドレス。
%T = 現在の日付と時刻。

ユーザー名のマッピング

UNIXのユーザー名と、Windowsのユーザー名を対応させるための設定ファイル。
/etc/samba/smbusers
ファイル内容は以下のとおり
# Unix_name = SMB_name1 SMB_name2 ...
root = administrator admin
nobody = guest pcguest smbguest
(例) 以下の例は hoge と geho を UNIXユーザー tester に置き換え、そのほかのユーザーはすべて guest に置き換える。
! sys = hoge geho
guest = *
「 ! 」 を利用すると、一致した行以降の処理を抑止する。

samba パスワードの設定

設定ファイル: smb.conf にて encrypt passwords = yes を指定してある場合には、以下の方法で設定できる。
リモートから samba サーバーにアクセスするときは、UNIXのパスワードではなく ここで設定したパスワードを入力しなければなならい。
  1. Samba用の別個のパスワードファイルを作成。
    既存の /etc/passwd ファイルに基づいてこのパスワードファイルを作成する。
    cat /etc/passwd | /usr/bin/mksmbpasswd.sh > /etc/samba/smbpasswd
    もしもシステムが NISを使用する場合はこちら。
    ypcat passwd | /usr/bin/mksmbpasswd.sh > /etc/samba/smbpasswd
     
  2. rootだけが読み取り/書き込みを行えるようにSambaパスワードファイルのアクセス権を変更
    chmod 600 /etc/samba/smbpasswd
     
  3. このスクリプトでは、パスワードまでは新しいファイルにコピーされない。
    各Sambaユーザーのパスワードを設定するには、 以下のように設定。
    smbpasswd -a username
    (usernameには各ユーザーのユーザー名を指定する。)

    注意: 参考: smbpasswdコマンド
    smbpasswd -a user user を新しいパスワードとともにローカルの smbpasswd ファイルに新規作成する
    smbpasswd -x user user の設定削除する
    root のみがこの命令を実行できる
    smbpasswd -d user user のアカウントを無効にする。
    samba のこのユーザーに対する認証はすべて失敗する。
    root のみがこの命令を実行できる
    smbpasswd -e user user のアカウントを有効にする。
    アカウントが無効になっていなければ何の効果もない。
    root のみがこの命令を実行できる
    smbpasswd -n user user のパスワードをなくす。(null password)
    ただし、/etc/smb.conf ファイルの[global]セクションで
    null passwords = yes    (パスワードなし を許可する設定)
    が設定されていないと、外部から事実上ログインできなる。
    root のみがこの命令を実行できる

パスワードと書き込み権限

samba サーバーの操作

/etc/rc.d/init.d/smb
/etc/rc.d/init.d/smb start サーバー起動
/etc/rc.d/init.d/smb stop サーバー停止
/etc/rc.d/init.d/smb restart サーバー再起動
/etc/rc.d/init.d/smb status サーバーの状況を調べる

smb.conf のエラーチェック

testparm /etc/samba/smb.conf を読み出してエラーの存在をチェック
smbstatus 共有リソースの確認

Linux から samba サーバーへのログイン

以下のコマンドでサーバー上の一覧を見ることが出来る。
smbclient −L hostname -U username
hostname(たとえば localhost ) に username でログインして、共有一覧が見られる。
たとえば以下のような設定でもよい。
smbclient //hostname/sharename -U username
自分自身につないで、テストしてみるのも良い。
smbclient //localhost/public

 

エラーメッセージと対策

Bad password など
smb.conf で不適切な「 hosts allow 」、「 hosts deny 」、「 valid users 」 設定があるか、あるいはゲスト・アカウントが無効であるか。
一時的に「 hosts allow 」、「 hosts deny 」、「 valid users 」、 あるいは「 invalid users 」の記述行を削除またはコメントにしてテストしてみるのも良い。
connection refused
smbd が動いていないかも。
inetd (スーパーサーバ)経由で動作する設定のばあいは、 /etc/inetd.conf ファイルをチェック。
デーモン設定の場合は smbd がデーモンとして動作していることを ps コマンドで確認。
ps -auxw | grep smbd
あるいは
/etc/rc.d/init.d/smb status
でもよいかも。
session request failed
サーバーによる接続拒否
Your server software is being unfriendly
smbd を実行するときに無効なパラメータを付けているか、 smbd 起動時に致命的な問題がある場合

Windowsからアクセスするときの注意点

inetd経由の起動設定

inetdスーパーサーバ経由で起動するように設定すると、 リモートからのサービス要求に応じて samba サーバーを起動できるので、待機時の サーバーのメモリ負荷 が少ない。

  1. /etc/inetd.conf の最後の2行を以下のように修正する。
    netbios-ssn stream tcp nowait root /usr/sbin/smbd smbd
    netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd
    smbd や nmbd の位置が異なる場合は、環境に合わせて適宜変えること。
     
  2. inetd サービスの再起動を行う。
    service inet reload

    (参考)以下は古い方法。 再起動シグナル(HUP)を送り /etc/inetd.conf を再読みこみさせる。
    # ps ax | grep inetd
    70 ? S 0:00 /usr/sbin/inrtd
    6462 p0 S 0:00 grep inetd
    # kill -HUP 70
    ここでは、ps コマンドにて inetd のプロセスID ( 例では 70 ) を探して HUPシグナル を送っている。
    終了すべき プロセスID は環境により変わるので対応すること。
     
  3. もし、システム起動時に自動的にサービスを起動している場合は、inetdで起動させる意味がないので、自動起動は停止させておく。
    まず 現在の samba の起動状況を見る
    # chkconfig --list
    inet            0:off   1:off   2:off   3:on    4:on    5:on    6:off
    portmap         0:off   1:off   2:off   3:on    4:on    5:on    6:off
    atd             0:off   1:off   2:off   3:on    4:on    5:on    6:off
    gpm             0:off   1:off   2:on    3:on    4:on    5:on    6:off
                      :                           :
    smb             0:off   1:off   2:off   3:off   4:off   5:off   6:off
    すべてのランレベルで off (自動起動しない) になっているのが理想的。
    smb             0:off   1:off   2:off   3:on    4:on    5:on    6:off
    もし上記のように どこかで on になっているのなら、 (この例では ランレベル 3,4,5 で on )
    # chkconfig --level 3 smb off
    # chkconfig --level 4 smb off
    # chkconfig --level 5 smb off
    または略記すると以下の1命令でもよいかも。
    # chkconfig --level 345 smb off
    のように、各レベルの起動を停止させる。

    もういちど chkconfig --list で、すべてのランレベルで off になっていることを確認したら成功。

参考リンク

日本samba ユーザー会 http://www.samba.gr.jp/
日本samba ユーザー会:Samba ドキュメント翻訳プロジェクト http://www.samba.gr.jp/project/translation/index.html