Tips and Technique for Solaris

【コマンド】

* システム関連の情報を表示するコマンド

prtconf メモリサイズ、ハードウエアの構成、システム設定を表示
sysdef swapの場所やサイズ、カーネル変数、カーネルの設定を表示
psrinfo MPシステムでアクティブなプロセッサ数を表示
prtdiag システムの diagnostic information の表示
snoop IP packetを調べる
sar システムの活動状況を表示
prstat 実行中のプロセスの状態を表示(topコマンド)
vmstat 仮想メモリの状態を表示
iostat I/O の状態を表示

* 現在の最大プロセス数や System V IPC関連の情報を確認する

sysdef コマンドで確認できるが情報が大量に表示されます。

○ 最大プロセスの情報は以下の部分

# sysdef
...
*
* Tunable Parameters
*
41406464        maximum memory allowed in buffer cache (bufhwm)
   16346        maximum number of processes (v.v_proc)
      99        maximum global priority in sys class (MAXCLSYSPRI)
   16341        maximum processes per user id (v.v_maxup)
      30        auto update time limit in seconds (NAUTOUP)
      25        page stealing low water mark (GPGSLO)
       1        fsflush run rate (FSFLUSHR)
      25        minimum resident memory for avoiding deadlock (MINARMEM)
      25        minimum swapable memory for avoiding deadlock (MINASMEM)
    ...

○ 共有メモリやセマフォーの情報を調べる(以下は Solaris 9以前、Solaris 10 の場合 prctl コマンドを利用する)

# sysdef | egrep "SHM|SEM"
512 semaphore identifiers (SEMMNI)
512 semaphores in system (SEMMNS)
30 undo structures in system (SEMMNU)
32 max semaphores per id (SEMMSL)
10 max operations per semop call (SEMOPM)
10 max undo entries per process (SEMUME)
32767 semaphore maximum value (SEMVMX)
16384 adjust on exit max value (SEMAEM)
33554432 max shared memory segment size (SHMMAX)
256 shared memory identifiers (SHMMNI)

 

【/etc/system ファイルを編集する】

* /etc/system の設定をおかしくしてしまい、ブートできなくなった時の対処方法

以降で /etc/system ファイルを変更するにあたり、まず、これを覚えておくことは重要。
boot -as でブートして下さい。 カーネルはシステム・ファイルの名前を含むいろいろな種類の質問をしてきます。 どのシステムファイルを使用するか訪ねられた際に、以前の /etc/system ファイル(バックアップを取ってある場合)を使用するか、/dev/null を指定してください。

* プロセスごとのファイル・ディスクリプタ数を設定する方法

    * set hard limit on file descriptors (デフォルトは 1024)
    set rlim_fd_max = 4096
    * set soft limit on file descriptors (デフォルトは 64)
    set rlim_fd_cur = 1024

上記の設定を /etc/system ファイルに記述することで、ディスクプリタの数を設定することができます。でも、Solaris 2.4 以降です。それ以前のバージョンはカーネルをいじる必要がある。

注意しなくてはならないのは、ソフト・リミットを 256 より大きく設定した場合、BCP(Binary Compatibility) なアプリケーションの動作保証がない。 リミットを 1024 より大きく設定した場合、 select() を使用しているアプリケーションの動作保証がされないということです。 Solaris7(64bit)では、最大65536まで拡張されました。

* イーサネットアダプタを全2重に設定する方法

Sun の hme ファースト・イ-サネット・アダプタを使用している場合、 全2重イ-サネットを設定することができます。 出荷時の初期設定は、デフォルトでは有効になっていません。

デフォルトの設定を変更し、全2重モードにするには何通りかの方法があります(スイッチの設定も同様に変更する必要があります)。

/etc/system で設定する場合:

    set hme:hme_adv_autoneg_cap=0
    set hme:hme_adv_100hdx_cap=0
    set hme:hme_adv_100fdx_cap=1

ndd で設定する場合:

ndd -set /dev/hme adv_autoneg_cap 0
ndd -set /dev/hme adv_100hdx_cap 0
ndd -set /dev/hme adv_100fdx_cap 1

* System V IPC を OS ブート時にロードする方法

OS ブート時にいつも ipcs が「組み込まれていない」というような以下のようなメッセージを出力します。

 IPC status from <running system> as of <date>
 Message Queue facility not in system.
 Shared Memory facility not in system.
 Semaphore facility not in system. 

これは、Message Queue/Shared Memory または、Semaphore をまだ使用 していないことを意味します。 それらは、最初に使用された時に初めてロードされます。これを、ブート時にロードしたい場合は /etc/system に以下を追加します。

    forceload: sys/msgsys
    forceload: sys/semsys
    forceload: sys/shmsys 

* System V IPC のパラメータを変更する方法

○ Solaris 9 以前の場合

次のパラメータを使用することで、セマフォの数、共有メモリの量、 IPC メッセージの数を変更することができます。 これらは、/etc/system ファイルで設定します。 IPC設定のデフォルト値を sysdef コマンドを利用することで確認できます。Solaris のバージョンによって利用できるパラメータが異なります。

    set semsys:seminfo_semusz = <value>
    set semsys:seminfo_semopm = <value>
    set semsys:seminfo_semume = <value>
    set semsys:seminfo_semaem = <value>
    set semsys:seminfo_semmap = <value>
    set semsys:seminfo_semvmx = <value>
    set semsys:seminfo_semmsl = <value>
    set semsys:seminfo_semmni = <value>
    set semsys:seminfo_semmns = <value>
    set semsys:seminfo_semmnu = <value>
 
    set shmsys:shminfo_shmmax = <value>
    set shmsys:shminfo_shmmin = <value>
    set shmsys:shminfo_shmmni = <value>
    set shmsys:shminfo_shmseg = <value>
 
    set msgsys:msginfo_msgseg = <value>
    set msgsys:msginfo_msgssz = <value>
    set msgsys:msginfo_msgtql = <value>
    set msgsys:msginfo_msgmap = <value>
    set msgsys:msginfo_msgmax = <value>
    set msgsys:msginfo_msgmnb = <value>
    set msgsys:msginfo_msgmni = <value>
DB利用時に設定する共有メモリ
 
デフォルト
最小
最大
詳細
shmmax 1048576 1 4294967295 (4 GB) unsigned int Maximum size for a shared segment
shmmin 1 1 4294967295 (4 GB) unsigned int Minimum size for a shared segment
shmmni 100 1 2147483648 (2 GB) signed int Max number shared memory identifiers
shmseg 6 1 32767 (32 k) short Max number shared segments per process
最大値 4GBは Solaris 2.5.1 以降、それ以前の OS は 2GB。value は、以下のように 10進でも 16進でも設定できる。
    set shmsys:shminfo_shmmax=0xffffffff    /* hexidecimal */
    set shmsys:shminfo_shmmax=4294967295    /* decimal     */
ORACLE 10g Enterprise Manager Grid Controlを Solaris 8, 9 で利用する際の設定が必要と思われるカーネル・パラメータとその推奨値
パラメータ
OS
推奨値
noexec_user_stack Solaris 8, 9 1
semsys:seminfo_semmni Solaris 8 100
semsys:seminfo_semmsl Solaris 8, 9 256
shmsys:shminfo_shmmax Solaris 8, 9 4294967295
shmsys:shminfo_shmmin Solaris 8, 9 1
shmsys:shminfo_shmmni Solaris 8, 9 100
shmsys:shminfo_shmseg Solaris 8 10

○ Solaris 10 の場合

Solaris 10 では、/etc/system で shmsys:shminfo_shmmax などのパラメータが設定できるが、リソース制御というかたちで IPC関連の設定を変更します。また、そのリソースの制御もプロジェクト単位で行えます。ここでは、スーパーユーザーのデフォルト・プロジェクトのリソースを変更しています。以下で利用しているコマンドの詳細はマニュアルで確認してください。

現在の値の確認
# ps -o taskid -p $$
TASKID
65
# prctl -i task 65
task: 65
NAME    PRIVILEGE       VALUE    FLAG   ACTION                       RECIPIENT
task.max-cpu-time
        system          18.4Es    inf   none                                 -
task.max-lwps
        system          2.15G     max   deny                                 -
project.max-contracts
        privileged      10.0K       -   deny                                 -
project.max-locked-memory
        privileged       494MB      -   deny                                 -
project.max-port-ids
        privileged      8.19K       -   deny                                 -
project.max-shm-memory
        privileged       494MB      -   deny                                 -
project.max-shm-ids
        privileged        128       -   deny                                 -
project.max-msg-ids
        privileged        128       -   deny                                 -
 ...
zone.max-msg-ids
        system          16.8M     max   deny                                 -
zone.max-lwps
        system          2.15G     max   deny                                 -
zone.cpu-shares
        privileged          1       -   none                                 -
# id -p
uid=0(root) gid=0(root) projid=1(user.root)
# prctl -n project.max-shm-memory -i project user.root
NAME    PRIVILEGE       VALUE    FLAG   ACTION                       RECIPIENT
project.max-shm-memory
        privileged       494MB      -   deny                                 -
        system          16.0EB    max   deny                                 -
# prctl -n project.max-sem-ids -i project user.root
NAME    PRIVILEGE       VALUE    FLAG   ACTION                       RECIPIENT
project.max-sem-ids
        privileged        128       -   deny                                 -
        system          16.8M     max   deny                                 -
一時的に設定(調整に利用、システム再起動で消滅)
# id -p
uid=0(root) gid=0(root) projid=1(user.root)
# prctl -n project.max-shm-memory -v 512mb -r -i project user.root
# prctl -n project.max-shm-memory -i project user.root
NAME    PRIVILEGE       VALUE    FLAG   ACTION                       RECIPIENT
project.max-shm-memory
        privileged       512MB      -   deny                                 -
        system          16.0EB    max   deny                                 -
設定を登録(/etc/project へ登録、システム起動時に設定が反映)
# id -p
uid=0(root) gid=0(root) projid=1(user.root)
# projmod -K "project.max-shm-memory=(priv,512mb,deny)" user.root
# projects -l
system
        projid : 0
        comment: ""
        users  : (none)
        groups : (none)
        attribs:
user.root
        projid : 1
        comment: ""
        users  : (none)
        groups : (none)
        attribs: project.max-shm-memory=(priv,536870912,deny)
 ....
設定を追加登録(/etc/project へ追加)
# id -p
uid=0(root) gid=0(root) projid=1(user.root)
# projmod -a -K "project.max-sem_ids=(priv,100,deny)" user.root
# projects -l
system
        projid : 0
        comment: ""
        users  : (none)
        groups : (none)
        attribs:
user.root
        projid : 1
        comment: ""
        users  : (none)
        groups : (none)
        attribs: project.max-sem_ids=(priv,100,deny)
                 project.max-shm-memory=(priv,536870912,deny)
 ....
登録した設定の削除(/etc/project から削除)
# id -p
uid=0(root) gid=0(root) projid=1(user.root)
# projmod -r -K project.max-shm-memory user.root
# projmod -r -K project.max-sem_ids user.root
# projects -l
system
        projid : 0
        comment: ""
        users  : (none)
        groups : (none)
        attribs:
user.root
        projid : 1
        comment: ""
        users  : (none)
        groups : (none)
        attribs: 
 ....
ORACLE 10g Enterprise Manager Grid Controlを Solaris 10 で利用する際の設定が必要と思われるリソースとその推奨値
リソース
推奨値
project.max-sem_ids 100
project.max-sem-nsems 256
project.max-shm-memory 4294967295
project.max-shm-ids 100

* ユーザあたりのプロセス数を設定する方法

/etc/system に以下を記述します。しかし、通常 maxprc は maxusers 変数とかかわりがあります。
    set maxuprc = <num>

* maxusers 変数の意味

maxusers 変数は、はじめはシステムがサポートできるログインユーザーの数を指定するもので、この設定値に基づいて各種テーブルの大きさが決定さ れました。しかし、現在の Solaris ではシステム上のメモリー容量に基づいて 1 から 2048の範囲で設定されます。/etc/system ファイルに設定する場合は、1 から 4096。 maxusers変数は、 システムで使用できるプロセスの最大数やシステムに保持される割り当て構造体の数、ディレクトリ名検索キャッシュ (DNLC) の大きさとかかわりがあります。以下は、maxusers変数が変化することで影響のあるパラメータです。
    * デフォルトで物理メモリメモリサイズにより計算される
    set maxusers = < amount of available physical memory in MB >
 
    * 最大プロセス数
    set max_nprocs = 10 + 16 * maxusers 
 
    * ユーザーあたりの最大プロセス数 (5 はスーパーユーザーが確保) 
    set maxuprc = max_nprocs - 5
 
    * 割り当て対象となる UFS ファイルシステム用の割り当て構造体の数
    set ndquot = maxusers * NMOUNT / 4 + max_nprocs
 
    * ディレクトリ名検索キャッシュ (DNLC) のエントリ数
    set ncsize = 4 * (max_nprocs + maxusers) + 320
    set ufs_ninode = ncsize 

* 48 以上のpesudo tty を設定する方法

/etc/system に以下の行を追加してください:
    * System V pseudo terminals
    set pt_cnt = <num>
設定後、システムを halt し、boot -r でデバイスを再設定させるオプションを指定してブートします。
一応、好きな数だけ設定することができるようですが、 他の部分で制限を受けることになるようです。(何処まで設定で来るのかやっていないので限界はわかりません)

BSD スタイル の pty も同様に増やすことができるようですが面倒なのでここには書きません。マニュアルでも調べて下さい(変数は npty を使い、さらに /etc/iu.ap を編集するとか...)。

* バッファオーバーフロー攻撃を保護する方法

/etc/system に以下の行を追加してください:
    set noexec_user_stack=1
    set noexec_user_stack_log=1

「典型的なバッファオーバーフロー」は、リターンアドレスを上書きし、次に特定のコードをポイントするように作られており、 関数からからの次のリターンがクラッカーのコードにジャンプします。

noexec_user_stack を利用することで、実行されるコードはスタック上に残り、 OSはそのコードが実行されることを許可しません。

多くのスタックオーバーフローには有効だが、ヒープオーバーフローなどについては有効になりません。また、sun4u/sun4d/sun4m である SPARCシステムと AMD64 でしか利用できません。

 

【いろいろな設定ファイル】

* ホストネームを変更する方法

いろいろファイルをいじってホスト名を変更する方法がありますが、最も安全な方法は sys-unconfig コマンドを利用することです。このコマンドは、システムの多くの設定(特にネットワークの設定)を初期化します。
# /usr/sbin/sys-unconfig
このコマンドを実行後、システムがリブートしホストネームや 他のネットワークのパラメータを再設定できるようになります。

設定処理によって /etc/nsswitch.conf は上書きされてしまうので、 前もってコピーしておいた方がよいかもしれません。

sys-unconfig はディスクレスや、 データレスなワークステーションではサポートされていません。 それらの場合、手作業でファイルを編集する必要があります。 変更が必要なファイルのリストは、sys-unconfig(1M) を参照してください。

* デバイスの追加方法。 /dev/MAKEDEV は BSD系の OS のコマンド...

デバイス・ドライバは動的にリンクされているので、 新しいデバイスを追加するには単にシステムをシャットダウンし、 /devices と /dev ディレクトリを再構成するための -r オプションをつけてブートすれば良いだけです。

ok? boot -r
デフォルトのディスクでない場合、ドライブも指定する

または、/reconfigure というファイルを作成してリブートすることでデバイスを再構成します。

# touch /reconfigure
# init 6

SCSI ディスクを追加するだけの場合、リブートする必要はありません。 (root で)以下のスクリプトを走らせて下さい:

    #!/bin/sh
    #
    # add-disk
    #
    # Runs the commands to make Solaris locate a new disk that
    # has been plugged in after the system was booted.
    #
 
    /usr/sbin/drvconfig
    /usr/sbin/devlinks
    /usr/sbin/disks      # テープの場合 /usr/sbin/tapes
    /usr/ucb/ucblinks    # 互換リンク
 
    exit 0

これは、システムに少なくとも SCSI ディスクが 1 つは存在しないと機能しないので 注意して下さい。 (なぜなら、このスクリプトは単にシボリック・リンクをするだけで、 SCSI のドライバ・カーネル・モジュール等をロードするわけではないから)

* /etc/rc と /etc/rc.local しか知らない BSD系 UNIXユーザーの為に

BSD 系の UNIXで /etc/rc, /etc/rc.local で設定されていた項目は、たくさんのファイルに細かく分割されました。 また、「ラン・レベル」と呼ばれる実行レベルがあり、そのランレベルによって使用する rc スクリプトが異なります。

【ランレベル(init コマンドでランレベルが変更できます)】

    init S    シングルユーザーモード
    init 0    PROMモード(SVR4では電源切断状態)
    init 1    カーネルシングルユーザーモード(/, /usr のみマウント)
    init 2    マルチユーザーモード
    init 3    マルチユーザーモード + NFS, RFS
    init 4    予備のマルチユーザーモード
    init 5    電源切断(SVR4ではファームウェア状態)
    init 6    リブート

【ランレベルと rcスクリプト】

    /etc/inittab - どのプログラムをいつ起動するかを定義
    /sbin/init.d ------------ スクリプトが分りやすいファイル名で保存されている
    /sbin/rcS, /etc/rcS.d/* - ランレベルS
    /sbin/rc0, /etc/rc0.d/* - ランレベル0
    /sbin/rc1, /etc/rc1.d/* - ランレベル1
    /sbin/rc2, /etc/rc2.d/* - ランレベル2
    /sbin/rc3, /etc/rc3.d/* - ランレベル3

【inittabファイル】

<id>:<rstate>:<action>:<process>

フィールド
内容
id エントリを識別するための1文字、ないしは2文字のユニークな文字列を指定 文字のユニークな文字列ap, fs, s0
rstate エントリを実行するrun levelを指定 level「S,2,3」で実行する場合、「S23」と記述
action エントリの挙動(ふるまい)を指定 下記の表を参照
process エントリで実行されるプロセスを指定 /sbin/rc3

actionで指定されているもの

オプション
処理内容
initdefault initが最初に起動された時に実行
sysinit initの起動後,特定のrun levelに移行する前に実行
respawn プロセスが実行されていなければ実行
wait 該当するrun levelに入ったらprocessを実行してその終了を待つ
powerfail initがSIGPWRシグナルを受けた時に実行

/etc/rc*.d/* のすべてのファイルは /etc/init.d(わかりやすいファイル名) に含まれるスクリプトからハードリンクされています。

/etc/rc?.d ディレクトリの中のスクリプトを実行する際、 K* スクリプトが最初に実行され、次に S* スクリプトが実行されます。この K はスクリプトに stop を引数として渡し、S はスクリプトに start を引数として渡します。つまり、K で始まるサービスを停止し、S で始まるサービスを起動します。SやKの後の数字はスクリプトを実行する順番です。スクリプトを無効にしたい場合、削除するか S,K 以外で始まる名前にしておくとよい。

基本的な起動スクリプトは以下のような構造になっています:

    #!/bin/sh
    # init.d のスクリプトの例
    # /etc/init.d/your-daemon下にスクリプトのコピーをインストールしてください。
    # /etc/rc2.d/Sxxyour-daemon(又は rc3.d)と
    # /etc/rc[01].d/Kxxyour-daemon へリンクして下さい。
    # .sh で終わるスクリプトは sh の "." コマンドで実行されます。(引数なしで実行される)
    # .sh で終わらないスクリプトは "sh script" として実行されます。
    case "$1" in
        start)
            #... commands to start daemon ....
            <デーモン起動のための処理を記述>
            ;;
        stop)
            #... commands to stop daemon ....
            <デーモン停止のための処理を記述>
            ;;
    esac 

Solaris 10 のサービス管理では、rcスクリプトを利用せず SMF(サービス管理機能)を利用します(rcスクリプトを利用することもできます)。

コマンド
機能
svcs サービスの状態を報告
svcadm サービスインスタンスの操作
svccfg サービス構成のインポート、エクスポート、および変更(ロールバック機能あり)
svcprop サービス設定プロパティーを取得
inetadm inetd管理のサービスの操作

新規サービスは、manifestファイルとmethodファイルを作成し上記コマンドで登録します。必要に応じて rc ファイルも作成します。これらは、既存のファイルを参考にすると良いでしょう。apache2 の manifestファイルは /var/svc/manifest/network/http-apache2.xml、methodファイルは /lib/svc/method/http-apache2 となります。

# svccfg import /var/svc/manifest/network/http-apache2.xml (サービスの登録)
# svcadm enable apache2     (サービスの起動)
# svcadm disable apache2    (サービスの停止)
# svcadm refresh apache2    (サービス設定のリロード)
# svccfg delete -f apache2  (サービスの削除:リポジトリからの削除で設定ファイルは削除しません)

SMTPサービスの停止
# svcs smtp
STATE           STIME    FMRI
online          16:49:26 svc:/network/smtp:sendmail
# svcadm disable svc:/network/smtp:sendmail
# svcs smtp
STATE           STIME    FMRI
disabled        16:49:30 svc:/network/smtp:sendmail

* root で rlogin/telnetを利用する方法(セキュリティーがあまくなるのでお勧めしない)

よく、root でリモートログインやテルネットしようとすると "Not on system console.....Connection closed." と表示されます。これは、セキュリティー強化の関係で、コンソール端末以外から root によるログインをできないようになっているからです。同様に、hosts.equivに '+'の記述もありません。 ネットワークからの root のログインを許可するためには、 /etc/default/login ファイルの CONSOLE= 行を変更する必要があります。

/etc/default/login ファイルの CONSOLE エントリーは以下のように使用されます。

    CONSOLE=/dev/console(デフォルト)  # root のログインは直接コンソールからのみ
    CONSOLE=/dev/ttya                   # root のログインは直接 /dev/ttya からのみ
    CONSOLE= -                          # どの端末からも直接の root のログインは許可されない
    #CONSOLE(または行の削除)          # すべての端末から root のログインが許可される

* DNS や NIS を利用する時に設定が必要な nsswitch.conf ファイル

passwd, group, hosts, services, netgroup等といったサービスを、NIS(YP)、NIS+、/etc にあるファイル、DNS("hosts" のみ)のどれから読みとるかを制御することができます。

例えば以下のような場合:

    hosts: dns [NOTFOUND=return] files

これは、まず DNS にホスト情報を問い合わせ、 もし欲しい情報が見つからなかった場合、フォールバックとしてローカルマシンのホスト・テーブル(/etc/hosts)を調べるということを意味します。

また、[NOTFOUND=return] は DNS の問い合わせに対して "Not Found" を返してきた場合 /etc 以下のファイルを見ることなく戻ることを意味しています。 (つまりホストが見つからないものとして処理する)

* インターフェイス毎に複数のアドレスを持たせる方法

ifconfig コマンドを使用して、 インターフェイス毎に1つ以上の IP アドレスを割り振ることができます。

ifconfig IF:N ip-address up

"IF" はインターフェイス(例えば、le0)で、 Solaris 2.5 までは "N" は 1 から 255の間の数字、それ以降のバージョンは ndd コマンドによって値を設定でき 8192まで増やせます。 (adb でさらに増やすことは可能です)

/usr/sbin/ndd -set /dev/ip ip_addrs_per_if 4000

割り当てた IPアドレスは、 "ifconfig IF:N 0.0.0.0 down" で無効にできます。
ホスト名の関連付け等の関係で /etc/hostname.IF:X ファイルを作成する必要があります。

* IP Forwarding を止める

デュアルホーム・ゲートウェイを Solaris で構築したいような時、IP Forwardingを止める必要がでてきます。その設定方法は、/etc/notrouter という空ファイルを作成することで実現できます。これは、/etc/init.d/inetinit を覗いてみると実際に何をしているか確認できます。

# touch /etc/notrouter

/etc/init.d/inetinit を覗くと ndd コマンドを利用して ip_forwarding の値に 0 をセットしていることが確認できます。

    /usr/sbin/ndd -set /dev/ip ip_forwarding 0
    /usr/sbin/ndd -set /dev/ip ip_forward_src_routed 0
    /usr/sbin/ndd -set /dev/ip ip_forward_directedbroadcasts 0 

ip_forwading の値

2(デフォルト) ネットワークインターフェースを二つ以上持つ場合転送を行う
1 常にデータグラムの転送を行う
0 データグラム転送を行わない

* TCP 関連のチューニングを行なう

Solaris を、Web アプリケーションサーバーとして使用する場合、幾つかチューニングを行なうことでパフォーマンスを向上させることが出来ます。

ストリームドライバのキューサイズと TCP に対するハッシュサイズを制御します。0 に設定すると無限になるので、パフォーマンスはバッファの容量不足による影響を受けなくなります。(安全値の目安は、64MのRAMなら25、128Mなら50ぐらい)/etc/system ファイルに記述します。

    set sq_max_size = 0                 (デフォルトは 2)
    set tcp:tcp_conn_hash_size = 262144   (デフォルトは 256)

TCPスタックに関するパラメータを ndd コマンドで設定します。/etc/init.d/inetinit に記述しておくことでシステム起動時に設定されます。(Solaris のバージョンによってはパッチが必要です)

    ndd -set /dev/tcp tcp_close_wait_interval       60000   (240000)
    ndd -set /dev/tcp tcp_time_wait_interval        60000   (240000)
    ndd -set /dev/tcp tcp_mss_max                   6000
    ndd -set /dev/tcp tcp_fin_wait_2_flush_interval 16000
    ndd -set /dev/ip  ip_path_mtu_discovery         0
    ndd -set /dev/tcp tcp_conn_req_max_q            1024    (128)
    ndd -set /dev/tcp tcp_conn_req_max_q0           4096    (1024)
    ndd -set /dev/tcp tcp_conn_req_min              1
    ndd -set /dev/tcp tcp_xmit_hiwat                65535   (送信バッファ:8129)
    ndd -set /dev/tcp tcp_recv_hiwat                65535   (受信バッファ:8129)
    ndd -set /dev/tcp tcp_cwnd_max                  65534
    ndd -set /dev/tcp tcp_keepalive_interval        90000   (負荷が大きい場合小さく:720000)
    ndd -set /dev/tcp tcp_ip_abort_interval         60000   (480000)
    ndd -set /dev/tcp tcp_ip_abort_cinterval        60000   (480000)
    ndd -set /dev/tcp tcp_rexmit_interval_initial   3000    (再転送率が 30-40% を超える場合大きく:3000)
    ndd -set /dev/tcp tcp_rexmit_interval_min       3000    (200)
    ndd -set /dev/tcp tcp_rexmit_interval_max       10000   (240000)
    ndd -set /dev/tcp tcp_smallest_anon_port        1024    (32768)
    ndd -set /dev/tcp tcp_conn_grace_period         500
    ndd -set /dev/ip  ip_ignore_redirect            1
    ndd -set /dev/tcp tcp_slow_start_initial        2       (Solaris 2.5, 2.6の場合)

* ネットワーク関連の設定ファイル

Solaris でのネットワーク関連の設定のファイルは以下のようになっています。

ファイル
説明
/etc/netmasks ネットワークアドレスとネットマスクを記述します。デフォルトで設定されています。
例) 192.168.0.0  255.255.255.0
/etc/nodename ホスト名を記述します。デフォルトで設定されています。
例) server1
/etc/hosts ネットワーク上のホストを記述します。デフォルトで自分自身は設定されています。(実体は /etc/inet/hosts 。 )
例)
127.0.0.1  localhost loghost
192.168.0.1 server1
192.168.0.2 host1
192.168.0.3 host2
/etc/inet/ipnodes ネットワーク上のホストを記述します(IPv6)。デフォルトで自分自身は設定されています。(OpenSolarisでは、実体は /etc/inet/hosts となっておりホスト情報を複数ファイルで管理する必要はありません)
例)
::1 localhost
127.0.0.1  localhost loghost
192.168.0.1 server1
192.168.0.2 host1
192.168.0.3 host2
/etc/hostname.### ホスト名を記述します。デフォルトで設定されています。### の部分は、ネットワークインターフェースのデバイス名が入ります。(hme0, le0 など)
例) server1
/etc/nsswitch.conf システムデータベースの情報源と、それらを閲覧する順序を指定します。それぞれのデータベースが、ローカルファイル(files)、Network Information Service (nis)、Domain Name Service (dns) のいずれかを参照するのかを指定します。特に最近の設定では、hosts欄に dns を追加する必要があります(OSインストール時に追加されていない場合)。
/etc/resolv.conf 属するドメインと、ネームサーバのIPアドレスを記述します。OS インストール時に DNS の設定を行っていない時、新たに DNSを利用開始するには新規に作成しなければなりません。
例)
domain   mydomain.co.jp
nameserver 202.23.111.40
/etc/defaultrouter ルータ(ゲートウェイ)のIPアドレスを記述します。OS インストール時に設定していない時、新たに外部ネットワークへ接続開始するなら新規に作成しなければなりません。
例) 192.168.0.254

 

【その他】

* dtlogin を有効/無効にする方法

/usr/dt/bin/dtconfig コマンドを使用して設定できます。
/usr/dt/bin/dtconfig -d         (オートスタートを無効にする)
/usr/dt/bin/dtconfig -e         (オートスタートを有効にする)
/usr/dt/bin/dtconfig -kill      (dtlogin を終了させる)
/usr/dt/bin/dtconfig -reset     (dtlogin をリスタートさせる)
/usr/dt/bin/dtconfig -p         (printer action update)
/usr/dt/bin/dtconfig -inetd     (inetd.conf /usr/dt daemons)
/usr/dt/bin/dtconfig -inetd.ow  (inetd.conf /usr/openwin daemons)

* NFS サーバーの設定

NFS 関連 daemon が動作している必要があります。通常、 Run-level 3 (rc3.d)で daemon が動作するよう設定されています。ただし、設定ファイルである /etc/dfs/dfstab 内容によっては NFSサーバー が起動されない場合があります。
共有させたいディレクトリの公開は、share コマンドを使用して行います。 share は以下のように使用し、同じ内容を /etc/dfs/dfstab ファイルに記述することで、 システムがブートする時に有効になります。

# share -F nfs -o [ro|rw|root|...] -d "comment" dir

主に良く利用されるオプションは、 ro, rw(省略値), root=host などです。hostを複数指定する場合、コロン(:)を使用して区切ります。 例えば、/usr/local を公開し、host1と host2 のスーパーユーザーがディスクをアクセスした場合、nobody としてではなく root として扱われるように設定する場合:

# share -F nfs -o root=host1:host2 -d "Free Soft" /usr/local/

shareコマンドを直接タイプせずに /etc/dfs/dfstab に記述した場合、記述後 shareall コマンドによりディレクトリーを公開できます。もし NFS サーバーが起動されていない場合、手動で NFS 関連デーモンを起動するかシステムをリーブートする必要があります。

# /etc/init.d/nfs.server start
ちなみに、公開済みディレクトリを非公開にするには unshare/unshareall を使用します。

どんなディスクが公開されているか確認するには dfshares を使用する。

# dfshares 
RESOURCE                             SERVER ACCESS    TRANSPORT
hostfs:/home                         hostfs  -         -
hostfs:/proj                         hostfs  -         -
ディスクがどこからアクセスされているか確認すには dfmounts を使用する。
# dfmounts
RESOURCE     SERVER PATHNAME                  CLIENTS
  -          hostfs /home                    host1,host2,host3,host4,host5
  -          hostfs /proj                    host1,host5

クライアント側は、mount コマンドでマウントできます。たとえば、NFS サーバー nfshost がシェアしている /proj を自分の空ディレクトリー /mnt にマウントする場合以下のようになります。

# mount -F nfs nfshost:/proj /mnt

このとき、キャッシュファイルしシステムを利用するとデータにアクセスする速度が増すため、ネットワークトラフィックの負荷が軽減されます。 100MBのキャッシュファイルしシステムを作成し、NFS マウントするには以下のように実行します。

# cfsadmin -c -o maxfilesize=100 /projcache
# mount -F cachefs -o backfstype=nfs,cachedir=/projcache nfshost:/proj /mnt

キャッシュファイルシステムの削除には、-d オプションを使用して削除します。

# umount /mnt
# cfsadmin -d /projcache 

* ディスクとデバイス名

Solarisには、/dev, /devices といったデバイスに関するディレクトリーが用意されています。/dev は今までの UNIX と同じような型式でデバイスファイルが存在します。/devices はバスの情報や場所、接続されているデバイス、デバイスのID などが、パスやファイルの名前で理解できるようになっています(そのお蔭で非常に長い)。

    ブロックデバイス        /dev/dsk/c0t3d0s0
    キャラクターデバイス    /dev/rdsk/c0t3d0s0
 c0  コントローラターゲット。コントローラが増えると c1, c2 と増える。
 t3  ターゲットで SCSI-ID と対応。 IDE(ATA) ディスクの場合、無し。
 d0  RAID ディスク等で使用する.....
 s0  スライス。パーティションと呼ばれていたもので a-h が 0-8 に 対応。
昔のなごりなのかデフォルトで s2(c) はディスク全体として使用されている。

/dev は以前の UNIX との互換のためのリンクで存在している。実体は、以下の様に /devices に存在する。

    /devices/iommu@f,e0000000/sbus@f,e0001000/espdma@f,400000/esp@f,800000/sd@3,0:a 

* スーパーブロックの修復

fsck を実行したときに BAD SUPER BLOCK... と表示されることがあります。この問題を解決するには、スーパーブロックを修復しなければなりません。その方法は以下の手順で行います。

  1. メッセージの確認
    # fsck -F ufs /dev/rdsk/c0t0d0s0
    BAD SUPER BLOCK ...
  2. 代替用のスーパーブロックを探す(newfs の -N オプションはバックアップ用スーパーブロックを表示するだけで、ファイルシステムの内容は変更しない)
    # newfs -N /dev/rdsk/c0t0d0s0
  3. ファイルシステムを修復する(代替ブロックとしてブロック番号32を利用)
    # fsck -F ufs -o b=32 /dev/rdsk/c0t0d0s0

* 今はどっち? 32/64 bit

Solaris 7 以降、64 bit 対応になりました。そこで、どのモードが利用できるのか知る方法が必要になりました。それは、以下の方法で知る事が出来ます。

  1. isainfo コマンドを利用する
    【64 bit の場合】
    # isainfo -v    実行可能なアプリケーション
    64-bit sparcv9 applications
    32-bit sparc applications
    # isainfo -b    アドレス空間のビット幅
    64
    # isainfo -n    ネイティブな命令セット
    sparcv9
     
    【32 bit の場合】
    # isainfo -v
    32-bit sparc applications
  2. OS ブート時のメッセージ
      【64 bit の場合】
       SunOS Release 5.7 Version Generic 64-bit [UNIX(R) System V Release 4.0]
        
      【32 bit の場合】
       SunOS Release 5.7 Version Generic [UNIX(R) System V Release 4.0]
  3. おまけ:32 ビット と 64 ビット のデータモデル
       ------------------------------------------
       Data Type           ILP32           LP64
       ------------------------------------------
         char                 8              8
         short               16             16
         int                 32             32
         long                32             64
         long logn           64             64
         pointers            32             64
         enum                32             32
         float               32             32
         double              64             64
         long double        128            128
       ------------------------------------------

* ダイナミックリンク

コマンドやアプリケーションが、どんなライブラリをダイナミックリンクしているのか調べるには ldd コマンドを利用します。 ダイナミックライブラリに対しても調べることが出来ます。 スタティックリンクされたアプリケーションは、シェアードライブラリーを使用していないといったメッセージが表示されます。

# ldd /bin/sh
    libc.so.1 =>     /usr/lib/libc.so.1
    libdl.so.1 =>    /usr/lib/libdl.so.1
#
# ldd /usr/lib/libsocket.so.1
    libnsl.so.1 =>   /usr/lib/libnsl.so.1
    libc.so.1 =>     /usr/lib/libc.so.1
    libdl.so.1 =>    /usr/lib/libdl.so.1
        libmp.so.2 =>    /usr/lib/libmp.so.2
#
# ldd /sbin/sh
ldd: /sbin/sh: file is not a dynamic executable or shared object

ダイナミックライブラリが見つからない場合、以下のように表示されます。

# ldd a.out
    libX11.so.6.1 => (not found)
    libc.so.1 =>     /usr/lib/libc.so.1
    libdl.so.1 =>    /usr/lib/libdl.so.1

これは、LD_LIBRARY_PATH や LD_LIBRARY_PATH_64 変数をきちんと設定(ライブラリーの含まれるパスをセットする)することで解決することが出来ます。

Solaris 8 からは、Linux の ld.conf のような機能があります。直接ファイルを編集するのではなく、crle コマンドを利用します。新規登録の場合、以下のように設定ファイル(/var/ld/ld.config)を指定して基本的なライブラリーのパスを -l オプションで指定し登録します。

# crle -c /var/ld/ld.config -l /lib:/usr/lib

ここで、/lib, /usr/lib を入れ忘れるとダイナミックライブラリを使用しているコマンド(ls, more, などほとんどすべて)が利用できなくなります。しかし、crle コマンドは利用できるので慌てずに /lib:/usr/lib を追加します。

別のパスを追加するには、-u オプションを使用します。

# crle -u -l /usr/local/lib
上記の二つの操作でそれぞれのコマンドは、/lib, /usr/lib, /usr/local/lib に含まれるダイナミックライブラリーを参照します。上記の操作を一度で行うには以下のように実行します。
# crle -c /var/ld/ld.config -l /lib:/usr/lib:/usr/local/lib

64bit の場合、-64 を指定する必要があり設定ファイルの場所も異なります。

# crle -64 -c /var/ld/64/ld.config -l /lib/64:/usr/lib/64:/usr/sfw/lib/64:/usr/local/ssl64/lib

* パッケージの追加や削除

Solaris のアプリケーションは、System V のパッケージ形式で提供されることがあります。

    pkginfo <pkg>                 - インストールされているパッケージの一覧を表示します。
    pkgadd -d /<path> <pkg ...>   - パッケージを追加します。
    pkgrm <pkg ...>               - インストールされているパッケージを削除します。
    pkgchk -q <pkg>               - パッケージが存在するかチェックします。
    pkgchk <options> [pkg]        - インストールされたパッケージの整合性をチェックします。

* ジャーナリングファイルシステムの利用

Solaris 7 からジャーナリングファイルシステムが標準装備されました。(バグがあるものがあるのでシステムのパッチはチェックしてね)
この機能は、トランザクション (ファイルの変更など) をログ領域に格納してから、非同期でファイルシステムに適用します。この機能は「ロギング」と呼ばれ、ファイルシステムの操作やシステムのブートを高速化する働きがあります。また、ファイルシステムが矛盾する可能性がなくなるため、(まったくではないが)fsckを実行する必要がなくなります。このロギングにより、システムがクラッシュしたり異常停止した場合でも、ファイルシステムの修復が簡単かつ安全に行われ、システムをリブートする時間が短縮されます。

ロギングを有効にするには、mount コマンドのオプション logging によって有効にすることができます。

コマンドラインで有効にする場合(/mnt1 パーティションで logging を有効にする場合)
    # umount /mnt1
    # mount -o logging /mnt1
 
 /etc/vfstab ファイルに記述する場合
    修正前    /dev/dsk/c0t0d0s3 /dev/rdsk/c0t0d0s3 /usr ufs 1 no -
    修正後    /dev/dsk/c0t0d0s3 /dev/rdsk/c0t0d0s3 /usr ufs 1 no logging

ついでですが、ファイルシステムの高速化といえば、通常 UFS では、ファイルにアクセスすると、そのアクセスした時間が記録されます。しかし、前回アクセスした時刻を確認する必要がなければ、大きなオーバーヘッドをかけてまでアクセス情報を維持する必要がありません。 (たとえば、アクセス時間が重要でないにもかかわらず頻繁にアクセスされる Usenet ニューススプールや Web サーバーのコンテンツ などを含むファイルシステム)
そこで、オーバーヘッドを軽減するためにファイルに対するアクセス時間更新を無視させます。これは、UFS ファイルシステムをマウントするときに、-o noatime オプションを指定することで実現できます。

ファイルのアクセス時間は、ls コマンドの -u オプションで確認できます。(# はプロンプト)

# ls -lu
total 20
-rw-r--r-- 1 moto staff 2906 Apr 8 10:55 truerand.c
-rw-rw-r-- 1 moto staff 26 Apr 8 11:49 truerand.h
-rw-r--r-- 1 moto staff 5145 Apr 8 10:52 truerand2.c
#
# more truerand.h
unsigned long truerand();
#
# ls -lu
total 20
-rw-r--r-- 1 moto staff 2906 Apr 8 10:55 truerand.c
-rw-rw-r-- 1 moto staff 26 Apr 23 16:49 truerand.h
-rw-r--r-- 1 moto staff 5145 Apr 8 10:52 truerand2.c
#

* inetd.conf の見直し!

Solaris のセキュリティーを向上させるために不要なサービスを停止します。特に inetd によって管理されているサービスを確認してみます。

プロトコル サーバー 推奨 説明
ftp in.ftpd ファイル転送サービス(利用するならOS標準のものでなくセキュアな物[wu-ftpd, ProFTPD, etc]を利用することを推奨)
telnet in.telnetd × リモート仮想端末サービス(SSHを利用したほうがよい)
name in.tnamed × すでに利用されていないネームサービス
shell in.rshd × リモートシェル(rコマンドと呼ばれるもの)
login in.rlogind × リモートログイン(rコマンドと呼ばれるもの)
exec in.rexecd × リモート実行(rコマンドと呼ばれるもの)
comsat in.comsat × biffコマンドが使用する新着メール到着通知サービス
talk in.talkd × talkによる chat サービス
finger in.fingerd × ユーザー情報を通知するサービス
tftp in.tftpd × ファイル転送サービス(Trivial File Transfer)
systat ps × リモートクライアントに対するシステム情報を提供するサービス
uucp in.uucpd × UNIX to UNIX copy サービス
time   × 時間情報を通知するサービス
echo   × クライアントから受信したデータをそのまま返すサービス
discard   × クライアントから受信したデータを破棄するサービス
daytime   × 現在の時刻をクライアントに返すサービス
100232 sadmind × 文字列をクライアントに返すサービス
chargen   × Solstice AdminSuite ツールが使用するサービス
rquotad rquotad × NFSマウントされたディスクの使用量を返すサービス
rstatd rpc.rstatd × ログインしているユーザー名を返すサービス
rusersd rpc.rusersd × rusersコマンドに答えるサービス
sprayd rpc.sprayd × ネットワークベンチマーク用サービス
walld rpc.walld × wallコマンドに答えるサービス
100083 rpc.ttdbserverd × CDE関係のサービス。CDEを利用するならサービスを停止してはいけない。
100221 kcms_server × Kodak Color Management が利用するサービス
100235 cachefsd × キャッシュファイルシステムが利用するサービス
100134 ktkt_warnd × Kerberos warning デーモンが利用するサービス
printer in.lpd × 印刷サービス(Solaris 2.6以降は lp を利用している)
100234
100146
100147
gssd
amiserv
amiserv
× シングルサインオンなどセキュリティー関連機能が使用するサービス
100150 ocfserv × スマートカードが利用するサービス
dtspc dtspcd × CDEのサブプロセスコントロールは使用するサービス。CDEを利用するならサービスを停止してはいけない。
100068 rpc.cmsd × CDEのカレンダーマネージャーが使用するサービス。CDEを利用するならサービスを停止してはいけない。

Solaris 10では、基本的にサービスの管理を SMF(Service Management Facility) を利用して行います。しかし inetdにより管理されているサービスもあり、それらは inetadm コマンドを利用して有効/無効を設定します。たとえば ftp を有効/無効にするには以下のように実行します。

# inetadm -e ftp                        # 有効
# inetadm -d ftp                        # 無効

Solaris 10 のサービスは、tcp_wrappers によりアクセス制御が行えるそれを有効にするには inetadm コマンドを利用してtcp_wrappersを有効にします。あとは /etc/hosts.allow, /etc/hosts.deny を記述する。

# inetadm -M tcp_wrappers=TRUE        # すべてのサービスに有効
# inetadm -m ftp tcp_wrappers=TRUE    # サービス個別に有効
# inetadm -m ftp tcp_wrappers=        # サービス個別に設定(デフォルトに戻す)

Solaris 10 において inetd のサービスとして登録するには、いままで inetd.conf に記述していた内容をファイルに記述しておき、inetconvコマンドで登録します。

# vi inetd_ssh.conf
ssh stream  tcp  nowait  root   /usr/lib/ssh/sshd   /usr/lib/ssh/sshd -i
# inetconv -i inetd_ssh.conf

* CDEで ATOK12 を使いたい場合は?

atok12setup コマンドを、ターミナルで実行してください。再ログイン後、ATOK が有効になっています。

ちょっと番外編

* 各OSの設定コマンド

いろいろな OS の環境等を設定するコマンドを一覧にしておきます。

OS
コマンド
説明
HP-UX sam システム管理マネージャ
set_parms ホスト名や IP Address などの変更が行える
AIX smit システム管理ツール
Linux linuxconf システム管理ツール (詳細はこちら)
FreeBSD sysctl システム管理ツール

* HP-UX で利用される.depot ってなに?

HP-UX では、よく .depot という拡張子のついたファイルがあります。これは、System V のパッケージと同じようなものでアプリケーションを提供する際に利用されます。 swinstall コマンドを利用してアプリケーションをインストールします。

# /usr/sbin/swinstall -s /<full-path>/<depot-file>.depot '*'

* IRIX で利用される.tardist ってなに?

IRIX では、よく .tardist という拡張子のついたファイルがあります。これは、System V のパッケージと同じようなものでアプリケーションを提供する際に利用されます。 inst コマンドを利用してアプリケーションをインストールします。

# inst -f ./filename.tardist
Inst> go
Inst> quit
# 

IRIX では、tar形式で提供されたパッチも inst コマンドでインストールします。

# inst -f パッチを含むディレクトリー
Inst> install patch<ID>
Inst> go
Inst> quit
# versions 'patch*'                    適用済みパッチの確認
# versions remove patch<ID>           パッチの削除
# versions removehist patch<ID>      パッチ履歴の削除