カテゴリー : samba 3

NFS でマウントした Samba のシャドウコピーが見えない

Sambaのシャドウコピーを別のサーバで作成し、NFSでマウントしたが、シャドウコピークライアントから
アクセスすると、沈黙→タイムアウト→何も表示されず、といった結果になった。

smb.conf ( [global] )へ以下の設定を追記することで見えるようになった。

    kernel oplocks = no

他にも、シンボリックリンク先のシャドウコピーを見せようとした時も失敗した。これは、以下の設定を追記する
ことで見えるようになった。samba からシンボリックリンク先を見せるには必要な設定とのこと。

    follow symlinks = yes

環境:
CentOS 5.7 (x86_64)
Samba 3.5.4-0.83

Samba のシャドウコピーを日付でソートする方法

Sambaのシャドウコピーが日付ごとに並ばず、find コマンドの検索結果と同じ順でならんでしまった。
これを日付でソートする、ありがたいパッチが存在した。

Samba shadow_copy2 Enhancements

パッチをあてると、以下の設定できれいに並ぶようになった。

    vfs objects = shadow_copy2
    shadow: snapdir = /var/samba/.snapshot/public
    shadow: basedir = /var/samba/public
    shadow: sort = desc

環境:
CentOS 5.7 (x86_64)
Samba 3.5.4-0.83

Samba でシャドウコピーを有効にする方法

Sambaでシャドウコピーを有効にする方法は以下の通り。

1. 共有フォルダ設定へ以下を追記。今回は [public] へ追記した。

    vfs objects = shadow_copy2
    shadow: snapdir = /var/samba/.snapshot/public
    shadow: basedir = /var/samba/public

2. シャドウコピー用のディレクトリを作成。

# VSS_DIR='@GMT-'`TZ=GMT date +%Y.%m.%d-%H.%M.%S`
# mkdir -p /var/samba/.snapshot/public/${VSS_DIR}

4. データをコピー。

# rsync -avA /var/samba/public/ /var/samba/.snapshot/public/${VSS_DIR}
# unset VSS_DIR

2回目以降は –link-dest オプションをつけると、差分コピーになる。

# rsync -avA --link-dest=<最新シャドウコピーディレクトリ> <共有フォルダ> <新規シャドウコピーディレクトリ>

最新のシャドウコピーと、共有フォルダの内容を比較して、変化のないファイルはハードリンクとして
新規シャドウコピーディレクトリに作成される。変化のあるファイルはコピーされる。ext3でそのまま
rsyncするよりLVMスナップショットを使用して、整合性のある状態でrsyncした方が安心できた。
LVMスナップショットを使用しないrsyncでのコピーでも作成は可能だった。

シェルスクリプトで1日に1~2回実行すれば、とても便利になる、かもしれない。

環境:
CentOS 5.7 (x86_64)
Samba 3.5.4-0.83

参考:

Sambaのシャドウコピーが日付ごとに並ばない。
NFSマウント領域のSambaのシャドウコピーが見えない。

Samba の動的な WINS エントリを複製する方法

SambaのWINSエントリを複製する方法は以下の通り。

Samba のための簡易 WINS 複製機能 – wins-push

コマンドラインから動的に登録できます。

追加

# wins-push add DUMMY01 20 0 192.168.1.200
/usr/local/sbin/wins-push: INFO: push to 192.168.1.103: op=add, name=DUMMY01#01, ttl=0, ip=192.168.1.200

リフレッシュ

# wins-push refresh DUMMY01 20 0 192.168.1.200
/usr/local/sbin/wins-push: INFO: push to 192.168.1.103: op=refresh, name=DUMMY01#20, ttl=0, ip=192.168.1.200

削除

# wins-push delete DUMMY01 20 0 192.168.1.200
/usr/local/sbin/wins-push: INFO: push to 192.168.1.103: op=delete, name=DUMMY01#20, ttl=0, ip=192.168.1.200

Samba の WINS 機能に静的エントリを追加する方法

SambaのWINS機能に静的エントリを追加する方法は以下の通り。

1. nmbd を停止。

# /etc/init.d/nmb stop

2. /var/lib/samba/wins.dat へ追記。

# cat wins.dat
VERSION 1 0
"SAMBA01#00" 1317384093 192.168.1.101 66R
"EXAMPLE#1b" 1317384093 192.168.1.101 64R
"EXAMPLE#00" 1317384093 0.0.0.0 e4R
"EXAMPLE#1c" 1317384093 192.168.1.101 e4R
"SAMBA01#03" 1317384093 192.168.1.101 66R
"EXAMPLE#1e" 1317384093 0.0.0.0 e4R
"SAMBA01#20" 1317384093 192.168.1.101 66R

1317384093 の部分を 0 にすると無期限に登録される。
#00, #1b (NetBIOS サフィックス) が持つ意味

【例】

"SAMBA02#00" 0 192.168.1.102 64R

3. nmbd を起動。

# /etc/init.d/nmb start

環境:
CentOS 5.7 (x86_64)
Samba 3.5.4-0.83

sambaGroupType

SID_NAME_USE_NONE = 0,/* NOTUSED */
SID_NAME_USER     = 1, /* user */
SID_NAME_DOM_GRP  = 2, /* domain group */
SID_NAME_DOMAIN   = 3, /* domain: don't know what this is */
SID_NAME_ALIAS    = 4, /* local group */
SID_NAME_WKN_GRP  = 5, /* well-known group */
SID_NAME_DELETED  = 6, /* deleted account: needed for c2 rating */
SID_NAME_INVALID  = 7, /* invalid account */
SID_NAME_UNKNOWN  = 8, /* oops. */
SID_NAME_COMPUTER = 9  /* machine */

LDAP 連携した Samba でグループの新規作成が失敗する

CentOS 5.7 (x86_64)のSamba(Samba 3.5.4)でLDAP連携していたが、Sambaを再構築してから
しばらくすると、グループの新規作成ができなくなっていた。
グループを作成していないのにもかかわらず、 ou=Idmpa の gidNumber が /etc/samba/smb.confで
設定した上限値に達していた。

idmap gid = 10000-99999
# ldapsearch -x -h ldap01 ou=Idmap gidNumber
dn: ou=Idmap,dc=example,dc=com
gidNumber: 99999

messagesやlog.smbdには以下のメッセージが出力されていた。

groupdb/mapping.c:803(pdb_create_builtin_alias)
 pdb_create_builtin_alias: Could not add group mapping entry for alias 544 (NT_STATUS_GROUP_EXISTS)
groupdb/mapping.c:803(pdb_create_builtin_alias)
 pdb_create_builtin_alias: Could not add group mapping entry for alias 545 (NT_STATUS_GROUP_EXISTS)
groupdb/mapping.c:803(pdb_create_builtin_alias)
 pdb_create_builtin_alias: Could not add group mapping entry for alias 546 (NT_STATUS_GROUP_EXISTS)
winbindd[2065]:   ldap_set_mapping_internals:
Failed to add S-1-5-32-546 to 10011 mapping [gidNumber]
winbindd[2065]:   ldap_set_mapping_internals:
Failed to add S-1-5-32-546 to 10012 mapping [gidNumber]
winbindd[2213]:   ldap_set_mapping_internals:
Failed to add S-1-5-32-544 to 10013 mapping [gidNumber]
winbindd[2213]:   ldap_set_mapping_internals:
Failed to add S-1-5-32-545 to 10014 mapping [gidNumber]
S-1-5-32-544 (administrators)
S-1-5-32-545 (users)
S-1-5-32-546 (guests)

以下の方法で、この事象の復旧を試みた。

1. ou=Idmap 以下のsambaSID=S-1-5-32-544~sambaSID=S-1-5-32-546を削除する。
2. LDAPエントリを変更する。
3. /var/lib/samba/gencache_notrans.tdb へレコードを登録する。
4. idmap.c, idmap_util.c にパッチをあてる。

1. ou=Idmap 以下のsambaSID=S-1-5-32-544~sambaSID=S-1-5-32-546を削除する。
sambaSID=S-1-5-32-544~sambaSID=S-1-5-32-546を削除することで、再登録できるようになる。
再登録後、guiNumber が不必要に増えなくなった。削除するコマンドは以下の通り。

for sid in S-1-5-32-544 S-1-5-32-545 S-1-5-32-546
do
    ldapdelete -x -h ldap01 -D cn=Manager,dc=example,dc=com sambaSID=${sid},ou=Idmap,dc=example,dc=com -w password
done

2. LDAPエントリを変更する。
LDAPエントリ変更後、guiNumber が不必要に増えなくなった。削除するコマンドは以下の通り。

for sid in S-1-5-32-544 S-1-5-32-545 S-1-5-32-546
do
    echo "dn: sambaSID=${sid},ou=Idmap,dc=example,dc=com" > ${sid}.ldif
    echo "changetype: modify" >> ${sid}.ldif
    echo "objectClass: sambaIdmapEntry" >> ${sid}.ldif
    echo "objectClass: sambaSidEntry" >> ${sid}.ldif
    echo "objectClass: sambaGroupMapping" >> ${sid}.ldif
    echo "sambaGroupType: 4" >> ${sid}.ldif
    ldapmodify -x -h ldap01 -D cn=Manager,dc=example,dc=com -f ${sid}.ldif -w password
    rm -f ${sid}.ldif
done

3. /var/lib/samba/gencache_notrans.tdb へレコードを登録する。

gencache_notrans.tdb へ登録された情報が、gencache.tdb へ移動していることがわかったので
tdbtoolコマンドで情報を登録した。tdb-toolsをインストールする方法は以下の通り。

# yum -y install tdb-tools

tdb-toolsの使い方は以下の通り。

# tdbtool /var/lib/samba/gencache.tdb

tdb> keys
key 27 bytes: IDMAP/SID2GID/S-1-5-32-544
key 27 bytes: IDMAP/SID2GID/S-1-5-32-545
key 27 bytes: IDMAP/SID2GID/S-1-5-32-546

tdb> show IDMAP/SID2GID/S-1-5-32-544�0
key 27 bytes
IDMAP/SID2GID/S-1-5-32-544
data 15 bytes
[000] 20 20 31 33 31 37 37 32  38 31 31 31 2F 2D 31       131772 8111/-1

tdb> quit

値が -1 になっていた。これを正しいguiNumberで、gencache_notrans.tdbへ
UNIX時間/guiNumberの形式で登録した。

UNIX時間を表示する方法

# tdbbackup /var/lib/samba/gencache_notrans.tdb
# tdbtool /var/lib/samba/gencache_notrans.tdb

tdb> store IDMAP/SID2GID/S-1-5-32-544�0   1317125905/10003
tdb> quit

しばらくすると、gencache.tdbへ転送されるが、指定したUNIX時間が過ぎると消えてしまった。
定期的にcronで次のスクリプトを実行するようにした。

#!/bin/sh

UNIX_TIME=`date --date '10 minute' +%s`
#UNIX_TIME=`date +%s`
TARGET_DB=/var/lib/samba/gencache_notrans.tdb

SID_544=S-1-5-32-544
SID_545=S-1-5-32-545
SID_546=S-1-5-32-546

if [ "${SID_544}" == "" ] ;then
 echo "SID_544が指定されていません。終了します。"
 exit 1
elif [ "${SID_545}" == "" ];then
 echo "SID_545が指定されていません。終了します。"
 exit 1
elif [ "${SID_546}" == "" ];then
 echo "SID_546が指定されていません。終了します。"
 exit 1
fi

GID_544=`ldapsearch -x sambaSID=${SID_544} gidNumber | grep ^gidNumber | awk '{ print $2 }'`
GID_545=`ldapsearch -x sambaSID=${SID_545} gidNumber | grep ^gidNumber | awk '{ print $2 }'`
GID_546=`ldapsearch -x sambaSID=${SID_546} gidNumber | grep ^gidNumber | awk '{ print $2 }'`

if [ "${GID_544}" == "" ] ;then
 echo "GID_544が見つかりません。終了します。"
 exit 1
elif [ "${GID_545}" == "" ];then
 echo "GID_545が見つかりません。終了します。"
 exit 1
elif [ "${GID_546}" == "" ];then
 echo "GID_546が見つかりません。終了します。"
 exit 1
fi

tdbtool ${TARGET_DB} store "IDMAP/SID2GID/${SID_544}�0" "  ${UNIX_TIME}/${GID_544}"
tdbtool ${TARGET_DB} store "IDMAP/GID2SID/${GID_544}�0" "  ${UNIX_TIME}/${SID_544}"

tdbtool ${TARGET_DB} store "IDMAP/SID2GID/${SID_545}�0" "  ${UNIX_TIME}/${GID_545}"
tdbtool ${TARGET_DB} store "IDMAP/GID2SID/${GID_545}�0" "  ${UNIX_TIME}/${SID_545}"

tdbtool ${TARGET_DB} store "IDMAP/SID2GID/${SID_546}�0" "  ${UNIX_TIME}/${GID_546}"
tdbtool ${TARGET_DB} store "IDMAP/GID2SID/${GID_546}�0" "  ${UNIX_TIME}/${SID_546}"

これで、guiNumber が不必要に増えなくなった。しかし、しばらくしてsmbdを再起動すると、パニックを
おこしてしまったので、この方法はあきらめた。追加したレコードを削除するか、もしくは
上のスクリプトを UNIX_TIME=`date +%s` に変更して実行すればsmbdを起動できた。

===============================================================
lib/util.c:1465(smb_panic)
smbd[24887]:   PANIC (pid 24887): internal error
lib/util.c:1569(log_stack_trace)
smbd[24887]:   BACKTRACE: 19 stack frames:
smbd[24887]:    #0 smbd(log_stack_trace+0x1c)
[0x2adaf8f8acbc]
smbd[24887]:    #1 smbd(smb_panic+0x2b)
[0x2adaf8f8ad8b]
smbd[24887]:    #2 smbd [0x2adaf8f7aa7e]
smbd[24887]:    #3 /lib64/libc.so.6 [0x2adafc3e22d0]
smbd[24887]:    #4
/lib64/libc.so.6(gsignal+0x35) [0x2adafc3e2265]
smbd[24887]:    #5 /lib64/libc.so.6(abort+0x110)
[0x2adafc3e3d10]
smbd[24887]:    #6 /lib64/libc.so.6 [0x2adafc41c99b]
smbd[24887]:    #7 /lib64/libc.so.6 [0x2adafc42445f]
smbd[24887]:    #8 /lib64/libc.so.6(cfree+0x4b)
[0x2adafc4248bb]
smbd[24887]:    #9 smbd(gencache_get+0x5b)
[0x2adaf8f9987b]
smbd[24887]:    #10
smbd(idmap_cache_find_sid2gid+0x7a) [0x2adaf8fb0aba]
smbd[24887]:    #11 smbd(sid_to_gid+0xe1)
[0x2adaf8f31201]
smbd[24887]:    #12
smbd(create_local_nt_token+0x149) [0x2adaf8fdedc9]
smbd[24887]:    #13 smbd(get_root_nt_token+0xe1)
[0x2adaf8fdf331]
smbd[24887]:    #14 smbd(svcctl_init_keys+0x25)
[0x2adaf8e9c755]
smbd[24887]:    #15
smbd(registry_init_full+0x63) [0x2adaf924c8f3]
smbd[24887]:    #16 smbd(main+0x64a)
[0x2adaf92771aa]
smbd[24887]:    #17
/lib64/libc.so.6(__libc_start_main+0xf4) [0x2adafc3cf994]
smbd[24887]:    #18 smbd [0x2adaf8d0f4b9]
lib/fault.c:326(dump_core)
smbd[24887]:   dumping core in
/var/log/samba/cores/smbd

4. idmap.c, idmap_util.c にパッチをあてる。
求めているパッチと思われたので以下のパッチを当てた。

https://bugzilla.samba.org/show_bug.cgi?id=7777

samba3x-3.5.4-0.83.el5.src.rpm を展開。

# wget http://vault.centos.org/5.7/os/SRPMS/samba3x-3.5.4-0.83.el5.src.rpm
# rpm -i samba3x-3.5.4-0.83.el5.src.rpm

/usr/src/redhat/SOURCES/ へパッチをコピーし、/usr/src/redhat/SPECS/samba3x.spec に
追加パッチの情報を追記。そしてリビルド。rpmbuild がない場合はインストール。

# yum -y install rpm-build pam-devel readline-devel ncurses-devel 
 libacl-devel krb5-devel openldap-devel cups-devel autoconf 
 gtk2-devel libcap-devel keyutils-libs-devel libtalloc-devel 
 libtdb-devel ctdb-devel openssl-devel gcc
# rpmbuild -ba /usr/src/redhat/SPECS/samba3x.spec

作成されたパッケージを上書きインストール。

# /etc/init.d/smb stop
 # /etc/init.d/nmb stop
 # /etc/init.d/winbind stop
# rm -fr /var/lib/samba/*
# cd /usr/src/redhat/RPMS/x86_64/
# rpm -Uvh --force samba3x-3.5.4-0.83.x86_64.rpm 
 samba3x-client-3.5.4-0.83.x86_64.rpm 
 samba3x-common-3.5.4-0.83.x86_64.rpm 
 samba3x-winbind-3.5.4-0.83.x86_64.rpm
# /etc/init.d/smb start
# /etc/init.d/nmb start
# /etc/init.d/winbind start

※security = domain だと winbindd が起動しなかった。

今のところ、1, 2, 4 の方法でうまくいっているように見える。この中に正解はあるのだろうか。。。

CentOS 5.7 (x86_64)
OpenLDAP 2.3.43-12
Samba 3.5.4-0.83

Samba 起動時に cups のエラーが発生する

Sambaの起動時にmessagesへ以下のログが出力されていた。

printing/print_cups.c:108(cups_connect)
Unable to connect to CUPS server localhost:631 - 接続を拒否されました

CPUSは動作していないし、smb.conf ではプリンタを無効にしたつもりだった。
以下の設定を smb.conf へ追加することで、回避できた。

printing = bsd

参考URL
[samba-jp:19507] CUPS停止中もアクセス不可のエラーが表示される件。

環境:
CentOS 5.7 (x86_64)
Samba 3.5.4-0.83

LDAP 連携した Samba でユーザ認証が失敗する

CentOS 5.7 (x86_64)のSamba(Samba 3.5.4)でLDAP連携し、大量のユーザの追加をしたところ
ユーザ認証が失敗するようになった。LDAPのエントリがデフォルトで500であるため、それを超えて
見えなくなった様子。(500に達した時点で検索をやめてしまう)

/etc/openldap/slapd.conf の設定を変更することで認証できるようになった。

sizelimit 15000

なお、 sizelimit 0 にした場合は、無制限となる。

net sam provision が失敗する

CentOS 5.7 (x86_64)のSamba(Samba 3.5.4)でLDAP連携し、複数のLDAPサーバをsmb.confで指定した
ところ net sam provision が失敗した。表示されたメッセージは以下の通り。

# net sam provision

Checking for Domain Users group.
Adding the Domain Users group.
lib/smbldap.c:757(smb_ldap_setup_conn)
 ldap_initialize: Bad parameter to an ldap routine
lib/smbldap.c:757(smb_ldap_setup_conn)
 ldap_initialize: Bad parameter to an ldap routine

/etc/samba/smb.conf の以下の設定に、ダブルクォートが入っていると事象が発生する様子。

passdb backend = ldapsam:"ldap://ldap01/ ldap://ldap02/"

上記設定を一時的に単一LDAPサーバのみ参照するように変更したところ、事象が発生しなくなった。

passdb backend = ldapsam:ldap://ldap01/
# net sam provision

Checking for Domain Users group.
Adding the Domain Users group.
Checking for Domain Admins group.
Adding the Domain Admins group.
Check for Administrator account.
Adding the Administrator user.
Checking for Guest user.
Adding the Guest user.
Checking Guest's group.
Adding the Domain Guests group.
TOP

INFORMATION

当サイトは備忘録であり、その内容を保証するものではありません。 当サイトまたはリンク先によるいかなるトラブルや損害に関しても、一切の責任を負いかねます。 当サイトの内容を無断で転用したり、転載する等の行為はおやめください。