カテゴリー : CentOS 5

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機能に静的エントリを追加する方法は以下の通り。

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

CentOS 5 に PEAR をインストールする方法

CentOS 5にPEARをインストールする方法は以下の通り。

# yum -y install php-pear
# pear list
Installed packages, channel pear.php.net:
=========================================
Package        Version State
Archive_Tar    1.3.1   stable
Console_Getopt 1.2     stable
PEAR           1.4.9   stable
XML_RPC        1.5.0   stable

proxy環境の場合は、以下のコマンドを実行。

アドレス、ポート番号は環境にあわせて設定する。

# pear config-set http_proxy http://proxy01.example.com:3128

Net_LDAP2を追加インストール。

# pear install pear/Net_LDAP2

失敗。

WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update
pear/Net_LDAP2 requires PEAR Installer (version >= 1.5.0), installed version is 1.4.9
pear/Net_LDAP2 requires PHP extension "ldap"
No valid packages found
install failed
# yum -y install php-ldap

PEARのバージョンを1.5.0以上にする必要がある。

# pear channel-update pear.php.net
# pear upgrade --force pear/Console_Getopt
# pear upgrade --force pear/Archive_Tar
# pear upgrade pear/PEAR
# pear install pear/Net_LDAP2
# pear list
Installed packages, channel pear.php.net:
=========================================
Package          Version State
Archive_Tar      1.3.7   stable
Console_Getopt   1.3.1   stable
Net_LDAP2        2.0.11  stable
PEAR             1.9.4   stable
Structures_Graph 1.0.4   stable
XML_RPC          1.5.0   stable
XML_Util         1.2.1   stable

MDB2追加

# yum -y install php-mysql
# pear install pear/MDB2

Net_SMTP追加

# pear install --alldeps pear/Net_SMTP

アップグレード

# pear upgrade-all

削除する時は以下のように実行する。

# pear uninstall pear/MDB2

proxy 環境で yum を使用する方法

proxy環境でyumを使用する方法は以下の通り。

/etc/yum.conf  に以下の設定を追記。

proxy=http://proxy01.example.com:3128

IPアドレスでも可。

proxy=http://192.0.2.101:8080

あわせてタイムアウトも設定しておくといいかもしれない。

timeout=300

IPアドレスやポート番号、タイムアウト時間(秒)は環境にあわせて設定する。

proxy 環境で wget を使用する方法

proxy環境でwgetを使用する方法は以下の通り。

/etc/wgetrc に以下の設定を追記。

http_proxy = http://proxy01.exemple.com:3128/
ftp_proxy = http://proxy01.exapmle.com:3128/

IPアドレスでも可。

http_proxy = http://192.0.2.101:8080/
ftp_proxy = http://192.0.2.101:8080/

URLやポート番号は環境に合わせて修正する。

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

OpenLDAP の起動が失敗する

CentOS 5.7 でLDAP(OpenLDAP 2.3)が突然起動しなくなったが、以下の手順で復旧できた。

# /etc/init.d/ldap stop
# /usr/sbin/slapd_db_recover -v -h /var/lib/ldap/
# chown ldap:ldap /var/lib/ldap/__db.00*
# /etc/init.d/ldap start
TOP

INFORMATION

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