Chapter 43. 移植性

Jelmer R. Vernooij

The Samba Team

John H. Terpstra

Samba Team

Table of Contents

HPUX
SCO UNIX
DNIX
Red Hat Linux
AIX: シーケンシャル先読み
Solaris
ロックの改善
Solaris9上の Winbind

Samba は広い範囲のプラットフォームで機能する。しかし、すべてのプラットフォー ムの提供するインタフェースが常に互換性があるとは限らない。 この章は Samba のコンパイルと利用についてプラットフォームに特化した情報を含む。

HPUX

(歴史的な理由により)HPでは、補助グループの実装が非標準である。 グループファイルには/etc/group/etc/logingroupの2つがある。 システムは、UIDから番号(訳注:GIDのことか)を前者のファイルを使用して割り当てるが、 initgroups()は後者を参照する。 コツを知っている大抵のシステム管理者は、シンボリックリンク /etc/group/etc/logingroup へ張る (ここに記述することができない愚鈍な理由でハードリンクでは機能しない)。 initgroups()は、/etc/logingroupの中で所属しているグループ に不正なIDがあればエラーを出す。 ここで言う不正なIDとは [0..UID_MAX]の範囲を超えた場合 であり、HP-UX のUID_MAXは現在のところ60000である (訳注:HPのページで見る限り、現在は2147483647)。 この範囲は、-2 と 65534 を除外している。これは通常 nobodyの GIDである。

もしこの問題に遭遇した場合、initgroups()に失敗するプログラムを実行している ユーザーが、許可された範囲外の GID のグループユーザーでないことを確認すること。

このことは、HPのマニュアルページ setgroup(2)とpasswd(4)に記述されている。

HP-UXでは、gccまたはHP ANSIコンパイラを利用しなければならない。 HP-UXに付属する無償のコンパイラは ANSI に準拠していないためSambaをコンパイ ルできない。

SCO UNIX

もし古いバージョンのSCO UNIXを稼働させているのなら、Sambaを正常に 機能させるためには、TCP/IPの重要なパッチを入手する必要があるだろう。 そのパッチがないと、Sambaを利用している際に転送データが破損する。

必要とするパッチは UOD385 Connection Drivers SLSである。 SCOftp.sco.com から ディレクトリSLSの中にある、ファイル uod385a.Z と uod385a.ltr.Z が当該のものである。

ここで提供される情報は、SCO UNIXの古いバージョンを参照している。 もしより新しいSCO UNIX のバイナリが必要ならば、インストール可能なパッケージを 入手するためSCOに連絡すること。 インストールするバイナリのためプラットフォームが最新であることも、SCOで確認 しなければならない。 これは、インストール作業にてデータ破損を避けるために重要なことである。 SCO UNIX製品用にSambaをビルドする場合、 Samba のソースに大幅なパッチが 必要となるかもしれない。 SCO から直接バイナリパッケージを入手する方がとても容易である。

DNIX

DNIX は seteuid() と setegid() に問題がある。これらのルーチンはSambaが正しく 機能するために必要である。しかし、それらはいくつかの理由によりDNIX の Cライブラリ から抜け落ちている。

この理由により、Sambaはincludes.hのDNIXセクションにて、既定値でNO_EIDマクロを 定義している。この問題について、限られた方法ではなんとか機能する。しかし理想からは 程遠く、いくつかの事柄はまだ正しく機能しないだろう。

この問題を正しく解決するため、以下の2つの関数をアセンブルする必要がある。 そしてそれらをCライブラリに加えるか、Sambaにリンクすること。 以下のコードを setegid.s の中に記述する。

        .globl  _setegid
_setegid:
        moveq   #47,d0
        movl    #100,a0
        moveq   #1,d1
        movl    4(sp),a1
        trap    #9
        bccs    1$
        jmp     cerror
1$:
        clrl    d0
        rts

以下を seteuid.s の中に記述すること。

        .globl  _seteuid
_seteuid:
        moveq   #47,d0
        movl    #100,a0
        moveq   #0,d1
        movl    4(sp),a1
        trap    #9
        bccs    1$
        jmp     cerror
1$:
        clrl    d0
        rts

ファイル作成後、これを以下のようにアセンブルする。

$ as seteuid.s
$ as setegid.s

その結果、seteuid.o と setegid.o が作成される。

次に、SambaのMakefileにて、DNIXセクションの中のLIBSM行にそれらを加える。 LIBSM行は、以下のものに多少似た形になるだろう。

LIBSM = setegid.o seteuid.o -ln

次に、includes.h の DNIX セクションから

#define NO_EID

の行を削除する。

Red Hat Linux

Red Hat Linuxのいくつかのバージョンでは、既定値を指定してインストールする間に、 以下のようなエントリを /etc/hosts に追加する。

127.0.0.1 loopback "hostname"."domainname"

これは Samba にループバックインタフェースへループバックすることを引き起こす。 結果として、 Samba は他の PC と正常に通信することに失敗する。 ひいてはマスターブラウズリストの保有者とマスターブラウザー が誰なのか正常にネゴシエートすることも失敗するだろう。

修正措置: 127.0.0.1 で始まる行の中で "loopback" という語の後のエントリを削除する。

AIX: シーケンシャル先読み

シーケンシャル先読みを無効にすると、相対的に高度なマルチプログラミング (多数の smbd プロセスや他の負荷との混合)、充分でない物理メモリ、またはより遅い ディスク技術がある場合に、Sambaの効率を著しく改善できる。 これらは AIX に高いウエイト値の原因となる。 シーケンシャル先読みを無効にすることは、またシステム上の他の負荷に対して反作用 を及ぼすことがあるため、他のアプリケーションへのインパクトを評価する必要がある。

IBMによって提供される既定値の利用が推奨される。しかし多数のウエイトタイム を経験した場合、以下のコマンドで先読みを無効にすることを試すこと。

AIX 5.1 とそれ以前: vmtune -r 0

AIX 5.2 とそれ以降の jfs ファイルシステム: ioo -o minpgahead=0

AIX 5.2 とそれ以降の jfs2 ファイルシステム: ioo -o j2_minPageReadAhead=0

もし、jfsとjfs2ファイルシステムが同一ホスト上に混合する場合、単純に 双方のiooコマンドを利用する。

Solaris

ロックの改善

Solaris上でSambaを稼働させて、F_SETLKW64/fcntlにまつわる問題を経験 している人たちがいる。 ビルトインのファイルロック機構はスケーラブルではなかった。 プロセスがファイルのロックを試行するループへ入り込むまで、効率が低下するだろう。 それは、ロックを試行し、失敗し、そして再び試行する。 ロックする試みは、許可が与えられる前に失敗する。 目に見える兆候は CPU を一握りのプロセスが占有することであり、もしもそれらが 信頼されるのであれば、F_SETLKW64 のループから抜け出せなくなるだろう。

このバグを修正するために必要な最新のパッチを Sun のサポートに確認すること。 Solaris 2.6 向けのパッチリビジョンは 105181-34 、 Solaris 8 向けは 108528-19 、 Solaris 9 向けは 112233-04 である。 パッチをインストールした後、 Samba を再び構成しリビルドすることを推奨する。

この件について報告した Joe Meslovich に感謝する。

Solaris9上の Winbind

Solaris 9 のnsswitchは、Winbind NSS モジュールの利用を拒絶する。 この振る舞いは、 112960-14 というSUNによるパッチにて修正されている。