Solaris

2008/10/7更新

対応バージョン: 10

FSS(Fair Share Scheduler)によってZone環境のリソース配分を行う手順を示す。

FSS有効化

まずシステムでFSSを有効にする。

現状確認

デフォルトではスケジューリングクラスは未設定である。

# dispadmin -d
dispadmin: Default scheduling class is not set
FSS有効化

スケジューリングクラスをFSSに設定する。

# dispadmin -d FSS
確認

設定したスケジューリングクラスは/etc/dispadmin.confに書き込まれOS起動時にクラス設定が行われるので、ここでいったんシステムをリブートし、FSSが有効になっていることを確認する。

# dispadmin -d
FSS     (Fair Share)

Zoneにシェア設定

FSSが有効になったらZoneにシェアを設定する。

ここではNon-Global Zoneが1つ存在し、以下の割り当てを行うものとする。

Global Zone

1 (システム全体の3分の1)

Non-Global Zone(zone1)

2 (システム全体の3分の2)

Global Zoneにはデフォルトでシェア = 1が割り当てられるので、ここではNon-Global Zoneの設定を行う。

# zonecfg -z zone1
zonecfg:zone1> add rctl
zonecfg:zone1:rctl> set name=zone.cpu-shares
zonecfg:zone1:rctl> add value (priv=privileged,limit=2,action=none)
zonecfg:zone1:rctl> end
zonecfg:zone1> verify
zonecfg:zone1> commit
zonecfg:zone1> exit

(*) 設定値のうち意味を持つのはlimitのみなので、privとactionはそれぞれ固定で「privileged」「none」を指定する。

設定が終わったらZoneを再起動する。

# zoneadm -z zone1 reboot

シェア割当状況チェック

シェアの割当状況はprstatの-Zオプションにて確認できる。

Non-Global Zone(zone1)とGlobal Zone(global)それぞれでCPU負荷の高い処理を実行すると大体割当通りの2対1になっていることが分かる。

# prstat -Z
:
ZONEID    NPROC  SWAP   RSS MEMORY      TIME  CPU ZONE
     2       37  118M  171M    31%   0:01:24  62% zone1
     0      106  321M  217M    39%   0:12:29  30% global

関連資料・記事

2008/10/2更新

対応バージョン: 10

動作中のZoneの設定を変更する手順を示す。

変更内容によってはZone内の設定ファイルを変更しなければならないものがある(IPアドレスなど)のでいったんZoneをアンインストールしてから再設定 & インストールを行ったほうがよい。

ここでは例としてZone名を「zone1」とし、ZoneのIPアドレスを変更するものとする。

Zone停止

# zoneadm -z zone1 halt

Zoneアンインストール

Zoneをアンインストールすると当然ながらZone内のファイルは削除されるので必要なファイルがあればあらかじめ退避しておく。

# zoneadm -z zone1 uninstall
ゾーン zone1 を uninstall してよろしいですか (y/[n])? ← y

Zone設定変更

# zonecfg -z zone1
zonecfg:zone1> remove net address=192.168.0.100 ← 既存のIPアドレスを削除
zonecfg:zone1> add net
zonecfg:zone1:net> set address=192.168.0.200 ← 新たなIPアドレスを追加
zonecfg:zone1:net> set physical=e1000g0
zonecfg:zone1:net> end
zonecfg:zone1> verify
zonecfg:zone1> commit
zonecfg:zone1> exit

Zoneインストール

# zoneadm -z zone1 install

Zone起動

# zoneadm -z zone1 boot

関連資料・記事

2008/9/28更新

対応バージョン: 10

既存のGlobal Zone上にNon-Global Zoneを作成する手順を示す。

初期状態確認

まず初期状態のZone設定について確認する。

何も設定していない状態ではGlobal Zoneが一つ稼働しているのみである。

# zoneadm list -vc
  ID NAME     STATUS     PATH                 BRAND    IP    
   0 global   running    /                    native   shared

Non-Global Zone作成

次にこのGlobal Zone上にNon-Global Zone(以下、Zone)を作成する。

ここでは以下のZoneを作成する。Zone情報の定義にはzonecfgコマンドを使用する。

Zone名

zone1

# zonecfg -z zone1
zone1: そのような構成済みゾーンはありません
'create' を使用して、新しいゾーンの構成を開始してください。

zonecfg:zone1> create
Zoneのrootファイルシステムの場所

/export/zones/zone1

zonecfg:zone1> set zonepath=/export/zones/zone1
共有ファイルシステム(read only)

/export/common

(*) /lib, /platform, /sbin, /usrはデフォルトで定義済

zonecfg:zone1> add inherit-pkg-dir
zonecfg:zone1:inherit-pkg-dir> set dir=/export/common
zonecfg:zone1:inherit-pkg-dir> end
共有ファイルシステム(read-write)

/usr/local (Global Zoneの/usr/localにマウント)

ファイルシステムはlofs(loopback file system)としてマウントされる。

zonecfg:zone1> add fs
zonecfg:zone1:fs> set dir=/usr/local
zonecfg:zone1:fs> set special=/usr/local
zonecfg:zone1:fs> set type=lofs
zonecfg:zone1:fs> end
Global Zone起動時の自動起動

有効

zonecfg:zone1> set autoboot=true
IPアドレス

192.168.0.100 (デバイスはe1000g0)

zonecfg:zone1> add net
zonecfg:zone1:net> set address=192.168.0.100
zonecfg:zone1:net> set physical=e1000g0
zonecfg:zone1:net> end

他にもいろいろな設定があるがここでは割愛する。

設定検証

エラーの場合はメッセージが出力される。

zonecfg:zone1> verify
設定書き込み

設定をstable storageに書き込む。

zonecfg:zone1> commit
設定終了
zonecfg:zone1> exit

設定の内容は以下の方法で確認できる。

# zonecfg -z zone1 info
zonename: zone1
zonepath: /export/zones/zone1
brand: native
autoboot: true
bootargs: 
pool: 
limitpriv: 
scheduling-class: 
ip-type: shared
inherit-pkg-dir:
	dir: /lib
inherit-pkg-dir:
	dir: /platform
inherit-pkg-dir:
	dir: /sbin
inherit-pkg-dir:
	dir: /usr
inherit-pkg-dir:
	dir: /export/common
fs:
	dir: /usr/local
	special: /usr/local
	raw が指定されていません
	type: lofs
	options: []
net:
	address: 192.168.0.100
	physical: e1000g0

この設定は/etc/zones/.xmlに格納される。中身を確認すると設定内容とともに「このファイルを直接編集せず、zonecfgを使用するように」と書いてあるのでその通りにする。

# cat /etc/zones/zone1.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE zone PUBLIC "-//Sun Microsystems Inc//DTD Zones//EN" "file:///usr/share/lib/xml/dtd/zonecfg.dtd.1">
<!--
    DO NOT EDIT THIS FILE.  Use zonecfg(1M) instead.
-->
<zone name="zone1" zonepath="/export/zones/zone1" autoboot="true">
  <inherited-pkg-dir directory="/lib"/>
  <inherited-pkg-dir directory="/platform"/>
  <inherited-pkg-dir directory="/sbin"/>
  <inherited-pkg-dir directory="/usr"/>
  <inherited-pkg-dir directory="/export/common"/>
  <filesystem special="/usr/local" directory="/usr/local" type="lofs"/>
  <network address="192.168.0.100" physical="e1000g0"/>
</zone>

ここまでで新たなZoneの定義が終わったのでZoneの一覧を見てみる。

# zoneadm list -vc
  ID NAME     STATUS     PATH                 BRAND    IP    
   0 global   running    /                    native   shared
   - zone1    configured /export/zones/zone1  native   shared

ステータスが「configured」になっている。

ここでZoneのステータスについて説明する。

定義が終わった状態ではまだZoneは使用できず、installを行ってZoneに必要なファイルをインストールした後にbootを行ってZoneを起動する。以下にステータスの遷移図を記す。

    ----------
    Configured ... Zone定義済
    ----------
       | ^
install| |uninstall
       v |
    ---------
    Installed  ... Zone固有のrootファイルシステム作成済
    ---------
     | ^ | ^
     | | | |
     | | | +---------+
     | | +---------+ |
     | |      ready| |halt
     | |           v |
     | |          -----
 boot| |halt      Ready ... Zone有効化(ユーザプロセスは起動しない)
     | |          -----
     | |           ^ |
     | |      ready| |boot
     | | +---------+ |
     | | | +---------+
     | | | |
     v | | v
    --------- 
     Running  ... Zone起動
    ---------

Zoneインストール

Zoneの定義まで終わったのでインストールを行う。Zoneの制御にはzoneadmコマンドを使用する。

この処理はマシンの性能にもよるが数十分〜数時間かかる。

# zoneadm -z zone1 install
Preparing to install zone <zone1>.
Creating list of files to copy from the global zone.
:
Copying <7441> files to the zone.
:
Initializing zone product registry.
Determining zone package initialization order.
:
Preparing to initialize <1189> packages on the zone.
:
Initialized <1189> packages on zone.                                 
Zone <zone1> is initialized.
The file </export/zones/zone1/root/var/sadm/system/logs/install_log> contains a log of the zone installation.

インストールが終わるとZoneのステータスは「installed」に変わる。

# zoneadm list -vc
  ID NAME     STATUS     PATH                 BRAND    IP    
   0 global   running    /                    native   shared
   - zone1    installed  /export/zones/zone1  native   shared

Zone起動

インストール終、Zoneを起動する。

# zoneadm -z zone1 boot

# zoneadm list -vc
  ID NAME     STATUS     PATH                 BRAND    IP    
   0 global   running    /                    native   shared
   1 zone1    running    /export/zones/zone1  native   shared

ステータスが「running」に変わり、IDが割り当てられる。

IPアドレスも有効になり、以下のようにIPエイリアスが設定される。

# ifconfig -a
:
e1000g0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
        inet 192.168.0.12 netmask ffffff00 broadcast 192.168.0.255
        ether 0:c:29:3b:bf:b5 
e1000g0:1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
        zone zone1
        inet 192.168.0.100 netmask ffffff00 broadcast 192.168.0.255

この状態からhaltにより「installed」状態に、readyにより「ready」状態に変えることができる。またrebootによりZoneが再起動し、新たなIDが割り当てられる。

Zoneをアンインストールするには「installed」状態にしてからuninstallを実行する。

Zoneログイン

Zoneが起動するとログイン可能になる。

Zoneにログインするにはzloginコマンドを使用する。

# zlogin -C zone1
[ゾーン 'zone1' コンソールに接続しました]

最初のログインでは通常のSolarisインストールと同じように各種設定メニューが表示されるので必要な設定を行う。

Select a Language

  0. English
  1. Japanese

:

設定が終わるとZoneがリブートする。

:
System identification is completed.

rebooting system due to change(s) in /etc/default/init
:
(リブート)
:
SunOS Release 5.10 Version Generic_127128-11 64-bit
Copyright 1983-2008 Sun Microsystems, Inc.  All rights reserved.
Use is subject to license terms.
Hostname: <Zoneのホスト名>

XXXXX console login:

尚、zloginには上記の-Cオプションによるコンソールモードの他に対話型/非対話型の2つのモードがあるが、ここでは説明を割愛する。

Zoneから抜ける場合はloginプロンプトから「~^D」('~' + Ctrl-D)を入力する。

関連資料・記事

2007/8/16更新

対応バージョン: 8

zipコマンドを以下のオプション付で実行する。

-A

自己解凍形式で圧縮する

-m

アーカイブを作成したら元ファイルを削除

他にもいろいろなオプションがあるのでマニュアルを参照のこと。

% zip -A -m <圧縮後ファイル名> <元ファイル>

例) *.txtファイルを一つずつ全てzip圧縮する

ls *.txt | awk '{printf("zip -A -m %s.zip %s\n",$1,$1)}' | sh

2009/1/14更新

対応バージョン: 10 x86

ZFS領域をNFSでshareするにはsharenfsプロパティをonに設定すればよく、通常のNFS shareの設定である/etc/dfs/dfstabへの記述は必要ない。

この設定はマシンをリブートしても恒久的に有効になる。

# zfs list
NAME                        USED  AVAIL  REFER  MOUNTPOINT
rz2                         142K  62.8M  19.9K  /rz2
rz2/foo                    17.9K  62.8M  17.9K  /rz2/foo

# zfs set sharenfs=on rz2

# zfs get sharenfs rz2
NAME    PROPERTY  VALUE     SOURCE
rz2     sharenfs  on        local

# share
-               /rz2/foo   rw   ""  
-               /rz2   rw   ""  

オプションを指定したい場合はsharenfsプロパティに必要なオプションを設定する。

例) 任意のホストにroでshareする

# zfs set sharenfs=ro=host1 rz2

# zfs get sharenfs rz2
NAME    PROPERTY  VALUE      SOURCE
rz2     sharenfs  ro=host1   local

# share
-               /rz2/foo   sec=sys,ro=host1   ""  
-               /rz2   sec=sys,ro=host1   ""  

オプションは通常のshareと同様にカンマで区切って複数指定できる。

share解除

shareを解除するにはsharenfsプロパティをoffに設定する。

# zfs set sharenfs=off rz2

# zfs get sharenfs rz2
NAME    PROPERTY  VALUE     SOURCE
rz2     sharenfs  off       local

# share
(何も出力されない)

2008/12/8更新

対応バージョン: 10

ZFSのスナップショットは自身と同じストレージプール内に保存されるが、send/receiveコマンドを使うことによって保存済のスナップショットを別のストレージプールや別のホストに送信することができる。

sendで書き出し、receiveで読み込みを行う。

スナップショット作成

# zfs snapshot rz2/foo@snapshot1

# zfs list -t snapshot
NAME                USED  AVAIL  REFER  MOUNTPOINT
rz2/foo@snapshot1      0      -  35.4K  -

スナップショットをファイルに保存し、そのファイルを別のストレージプールに送信する

# zfs send rz2/foo@snapshot1 > /var/tmp/foo.img

# zfs receive bkup/foo < /var/tmp/foo.img

# zfs list -t snapshot
NAME                 USED  AVAIL  REFER  MOUNTPOINT
bkup/foo@snapshot1      0      -  35.5K  -
rz2/foo@snapshot1   33.4K      -  35.4K  -

保存先のbkup/fooが既に存在している場合は保存できない。

スナップショットを同一ホストの別ストレージプールに送信する

# zfs send rz2/foo@snapshot1 | zfs receive bkup/foo

スナップショットを別ホストのストレージプールに送信する

# zfs send rz2/foo@snapshot1 | ssh host2 zfs receive bkup/foo

スナップショット間の差分データを送信する

sendの-iオプションを使ってスナップショット間の差分データを取り扱うことができる。

# zfs snapshot rz2/foo@snapshot2

# zfs send -i rz2/foo@snapshot1 rz2/foo@snapshot2 | ssh host2 zfs receive bkup/foo

関連資料・記事

2008/12/5更新

対応バージョン: 10

ZFSのスナップショットを作成/ロールバック/破棄する手順を示す。

スナップショット作成

ここではrz2/fooストレージプールが/Users/fooにマウントされているものとし、1つファイルを作る度にスナップショットを取り、同じ操作を2回やってみる。

まず任意のファイルを作成する。

# dd if=/dev/random of=/Users/foo/file bs=1024 count=10

# digest -v -a md5 /Users/foo/file
md5 (/Users/foo/file) = e3a8f135f20af45e062a3e8ff5e6267e

次にこのストレージプールのスナップショットを取る。

# zfs snapshot rz2/foo@one

先ほどと同様の手順で任意のファイルを作成する。

# dd if=/dev/random of=/Users/foo/file bs=1024 count=10

# digest -v -a md5 /Users/foo/file
md5 (/Users/foo/file) = e17036a607b01e416d8fc35b19946f79

最初のファイルとはMD5値が違っている。

さらに2つ目のスナップショットを取る。

# zfs snapshot rz2/foo@two

三たび、任意のファイルを作成する。

# dd if=/dev/random of=/Users/foo/file bs=1024 count=10

# digest -v -a md5 /Users/foo/file
md5 (/Users/foo/file) = 1802165c4a2585ec77ead86f50b6238f

今回もMD5値が違っている。

ここまででスナップショット2つ、各スナップショットに任意のファイルが存在する状態になっている。

スナップショットには各ファイルシステムの先頭から.zfs/snapshotでアクセスできるので2つのスナップショットの状態を見てみる。

# ls -l /Users/foo/.zfs/snapshot/{one,two}/file
... 10240 12月  5日  03:20 /Users/foo/.zfs/snapshot/one/file
... 10240 12月  5日  03:21 /Users/foo/.zfs/snapshot/two/file

# digest -v -a md5 /Users/foo/.zfs/snapshot/{one,two}/file
md5 (/Users/foo/.zfs/snapshot/one/file) = e3a8f135f20af45e062a3e8ff5e6267e
md5 (/Users/foo/.zfs/snapshot/two/file) = e17036a607b01e416d8fc35b19946f79

このように各スナップショットにはそれぞれ独立したファイルが保存されているので必要なファイルを簡単に復元することができる。

# cp /Users/foo/.zfs/snapshot/one/file /Users/foo/file.old
# digest -v -a md5 /Users/foo/file*
md5 (/Users/foo/file) = 1802165c4a2585ec77ead86f50b6238f
md5 (/Users/foo/file.old) = e3a8f135f20af45e062a3e8ff5e6267e

スナップショットロールバック

直近のスナップショットをロールバックするには以下のようにする。

# zfs rollback rz2/foo@two

# digest -v -a md5 /Users/foo/file
md5 (/Users/foo/file) = e17036a607b01e416d8fc35b19946f79

より古いスナップショットをロールバックするには-rオプションを付ける。

# zfs rollback -r rz2/foo@one

# digest -v -a md5 /Users/foo/file
md5 (/Users/foo/file) = e3a8f135f20af45e062a3e8ff5e6267e

スナップショット破棄

スナップショットの状態は以下のようにして参照できる。

# zfs list -t snapshot
NAME          USED  AVAIL  REFER  MOUNTPOINT
rz2/foo@one      0      -  35.4K  -
rz2/foo@two      0      -  35.4K  -

スナップショットの破棄はdestroyサブコマンドを使用する。

# zfs destroy rz2/foo@one
# zfs destroy rz2/foo@two

# zfs list -t snapshot
no datasets available

関連資料・記事

2008/8/21更新

対応バージョン: 10 x86

既存のストレージプールにホットスペアを設定する手順を示す。

ここでは各100MBの3ファイルで構成されているraidz2のストレージプールにスペアを追加する。

# zpool status rz2
  pool: rz2
 state: ONLINE
 scrub: none requested
config:

        NAME              STATE     READ WRITE CKSUM
        rz2               ONLINE       0     0     0
          raidz2          ONLINE       0     0     0
            /zfs/raidz-1  ONLINE       0     0     0
            /zfs/raidz-2  ONLINE       0     0     0
            /zfs/raidz-3  ONLINE       0     0     0

# mkfile 100m /zfs/spare-1

# zpool add rz2 spare /zfs/spare-1

# zpool status rz2
  pool: rz2
 state: ONLINE
 scrub: none requested
config:

        NAME              STATE     READ WRITE CKSUM
        rz2               ONLINE       0     0     0
          raidz2          ONLINE       0     0     0
            /zfs/raidz-1  ONLINE       0     0     0
            /zfs/raidz-2  ONLINE       0     0     0
            /zfs/raidz-3  ONLINE       0     0     0
        spares
          /zfs/spare-1    AVAIL   

スペアを削除する場合は以下のようにする。

# zpool remove rz2 /zfs/spare-1

スペアの手動切り替え

通常、現用デバイスに障害が発生すると自動的にスペアに切り替わるが、手動でこれを行うこともできる。

例えば/zfs/raidz-3をスペアに置き換える場合は以下のようにする。

# zpool replace rz2 /zfs/raidz-3 /zfs/spare-1 

# zpool status rz2
  pool: rz2
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Sun Nov 30 05:51:05 2008
config:

        NAME                STATE     READ WRITE CKSUM
        rz2                 ONLINE       0     0     0
          raidz2            ONLINE       0     0     0
            /zfs/raidz-1    ONLINE       0     0     0
            /zfs/raidz-2    ONLINE       0     0     0
            spare           ONLINE       0     0     0
              /zfs/raidz-3  ONLINE       0     0     0
              /zfs/spare-1  ONLINE       0     0     0
        spares
          /zfs/spare-1      INUSE     currently in use

ここで/zfs/raidz-3を切り離す。

# zpool detach rz2 /zfs/raidz-3

# zpool status rz2
  pool: rz2
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Sun Nov 30 06:03:06 2008
config:

        NAME              STATE     READ WRITE CKSUM
        rz2               ONLINE       0     0     0
          raidz2          ONLINE       0     0     0
            /zfs/raidz-1  ONLINE       0     0     0
            /zfs/raidz-2  ONLINE       0     0     0
            /zfs/spare-1  ONLINE       0     0     0

この状態で/zfs/raidz-3がメンテナンス可能である。

メンテナンスが終わったら/zfs/raidz-3をスペアの替わりにプールに戻す。

# zpool replace rz2 /zfs/spare-1 /zfs/raidz-3

# zpool status rz2
  pool: rz2
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Sun Nov 30 06:09:32 2008
config:

        NAME                STATE     READ WRITE CKSUM
        rz2                 ONLINE       0     0     0
          raidz2            ONLINE       0     0     0
            /zfs/raidz-1    ONLINE       0     0     0
            /zfs/raidz-2    ONLINE       0     0     0
            replacing       ONLINE       0     0     0
              /zfs/spare-1  ONLINE       0     0     0
              /zfs/raidz-3  ONLINE       0     0     0

上記のようにスペアからの置き換えが始まるのでしばらく待つと以下のようになる。

# zpool status rz2
  pool: rz2
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Sun Nov 30 06:09:32 2008
config:

        NAME              STATE     READ WRITE CKSUM
        rz2               ONLINE       0     0     0
          raidz2          ONLINE       0     0     0
            /zfs/raidz-1  ONLINE       0     0     0
            /zfs/raidz-2  ONLINE       0     0     0
            /zfs/raidz-3  ONLINE       0     0     0

この状態になったらスペアを再度設定する。

# zpool add rz2 spare /zfs/spare-1

# zpool status rz2
  pool: rz2
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Sun Nov 30 06:09:32 2008
config:

        NAME              STATE     READ WRITE CKSUM
        rz2               ONLINE       0     0     0
          raidz2          ONLINE       0     0     0
            /zfs/raidz-1  ONLINE       0     0     0
            /zfs/raidz-2  ONLINE       0     0     0
            /zfs/raidz-3  ONLINE       0     0     0
        spares
          /zfs/spare-1    AVAIL   

2008/8/21更新

対応バージョン: 10 x86

ZFSのストレージプールに未使用のディスクを追加する手順を示す。

ここでは現在のストレージプールが1つの物理ディスクで作成されているものとし、新たに1GBのUSBメモリを追加する。

USBメモリ使用準備

まずUSBメモリのデバイス名を調べる。

# rmformat
Looking for devices...
     1. Volmgt Node: /vol/dev/aliases/rmdisk0
        Logical Node: /dev/rdsk/c2t0d0p0
        Physical Node: /pci@0,0/pcie11,b8@1d,7/storage@1/disk@0,0
        Connected Device: Sony     Storage Media    0100
        Device Type: Removable

関連資料・記事

次にこのデバイスをvoldの管理下から外す。手順は以下の資料を参照のこと。

関連資料・記事

ストレージプール拡張

現在のストレージプールの状態は以下のようになっている。

# zpool status foo
  pool: foo
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        foo         ONLINE       0     0     0
          c1d0s0    ONLINE       0     0     0

ここにUSBメモリを追加する。

# zpool add foo c2t0d0p0

これによりfooストレージプールのサイズは以下のように拡張される。

拡張前
# df -h /foo
Filesystem     size   used  avail capacity  Mounted on
foo             18G    24K    18G     1%    /foo
拡張後
#  df -h /foo
Filesystem     size   used  avail capacity  Mounted on
foo             19G    24K    19G     1%    /foo

また、ストレージプールに新たなディスクが追加されているのが確認できる。

# zpool status foo
  pool: foo
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        foo         ONLINE       0     0     0
          c1d0s0    ONLINE       0     0     0
          c2t0d0p0  ONLINE       0     0     0

2008/8/21更新

対応バージョン: 10 x86

ZFSストレージプールはRAID-Z、ミラーのほか、単一のデバイスでも構成することができる。

以下、RAID-Zを中心にそれぞれの方式についてストレージプールの作成手順を示す。

プールに含めるデバイスは通常物理デバイス(例:c0t0d0)を使用するが、試験用に通常のファイルを使用することもできる。

ここでは全て通常のファイルを使用することとする。

RAID-Z

RAID-Zはシングルパリティのraidz1、ダブルパリティのraidz2のいずれかが指定できる。

両方とも手順は同じなのでraidz2について説明する。

準備

まずプールを構成するファイルを作成する。

# mkdir /zfs
# mkfile 1g /zfs/raidz-1
# mkfile 1g /zfs/raidz-2
# mkfile 1g /zfs/raidz-3

ストレージプール作成

次にストレージプールを作成する。

# zpool create rz2 raidz2 /zfs/raidz-1 /zfs/raidz-2 /zfs/raidz-3

ストレージプールの状態は以下の方法で確認できる。

# zpool list
NAME    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
rz2    2.98G    267K   2.98G     0%  ONLINE     -

# zpool status rz2
  pool: rz2
 state: ONLINE
 scrub: none requested
config:

        NAME              STATE     READ WRITE CKSUM
        rz2               ONLINE       0     0     0
          raidz2          ONLINE       0     0     0
            /zfs/raidz-1  ONLINE       0     0     0
            /zfs/raidz-2  ONLINE       0     0     0
            /zfs/raidz-3  ONLINE       0     0     0

これでストレージプールが/rz2にマウントされファイルシステムとして使用可能になる。

# df -h /rz2
Filesystem     size   used  avail capacity  Mounted on
rz2            983M    24K   983M     1%    /rz2

アンマウントする時は以下のようにする。

# zfs unmount rz2

別プール作成

作成したプールから別のプールを切り出すには以下のようにする。

# zfs create rz2/p1
# df -h -F zfs
Filesystem   size   used  avail capacity  Mounted on
rz2          983M    25K   983M     1%    /rz2
rz2/p1       983M    24K   983M     1%    /rz2/p1

こうすることで同じストレージプール内に独立したファイルシステムを生成することができる。

マウントポイント変更

マウントポイントをデフォルト以外の場所にしたい場合は以下のようにする。

# mkdir /var/p1
# zfs set mountpoint=/var/p1 rz2/p1
# df -h -F zfs
Filesystem   size   used  avail capacity  Mounted on
rz2          983M    24K   983M     1%    /rz2
rz2/p1       983M    24K   983M     1%    /var/p1

ストレージプール削除

ストレージプールを削除するには以下のようにする。

# zpool destroy rz2

マウントは自動的に解除されストレージプールが削除される。使用しなくなったファイルは別のプールに割り当てたり他のファイルシステムとして使用したりできる。

なおマウントポイントは自動では削除されないので適宜削除する。

ミラー

ミラーは2つ以上のデバイスの複製を作る構成である。サイズの違うファイルを使用することもできるが、その場合は一番小さいファイルのサイズに揃えられる。

# mkfile 1g /zfs/mirror-1
# mkfile 1g /zfs/mirror-2

# zpool create mi mirror /zfs/mirror-1 /zfs/mirror-2

# zpool list
NAME    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
mi     1016M     88K   1016M     0%  ONLINE     -

# zpool status mi
  pool: mi
 state: ONLINE
 scrub: none requested
config:

        NAME               STATE     READ WRITE CKSUM
        mi                 ONLINE       0     0     0
          mirror           ONLINE       0     0     0
            /zfs/mirror-1  ONLINE       0     0     0
            /zfs/mirror-2  ONLINE       0     0     0

# df -h /mi
Filesystem     size   used  avail capacity  Mounted on
mi             984M    24K   984M     1%    /mi

単一デバイス

単一デバイスでストレージプールを作る場合、物理デバイスにまたがる冗長性は持てないがZFSの持つ様々な特徴は生かすことができる。

# mkfile 1g /zfs/gen

# zpool create gen /zfs/gen

# zpool list
NAME    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
gen    1016M     88K   1016M     0%  ONLINE     -

# zpool status gen
  pool: gen
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        gen         ONLINE       0     0     0
          /zfs/gen  ONLINE       0     0     0

# df -h /gen
Filesystem     size   used  avail capacity  Mounted on
gen            984M    24K   984M     1%    /gen

2007/8/15更新

対応バージョン: 10

Solarisシステムが正常に稼働しているかどうかを判断するには日常的な監視が欠かせない。

ここではSolarisシステムを監視するのに必要なコマンドとその結果を分析するポイントについてまとめる。

後半ではシステム性能が悪化した場合の問題点の特定から改善までの流れについて事例を交えて紹介する。

システムの稼働状況を確認するためのコマンド

システム全体の稼働状況やシステムの性能悪化の原因を調査するためにはsarやvmstatコマンドを使用する。

その後psやprstatコマンドを使用し性能を悪化させているプロセスの特定を行う。

問題となっているプロセスが特定できればプロセスの見直し(優先度の変更や実行スケジュールの変更、ユーザプログラムの改善など)を行う。

特に原因となるプロセスが特定できない場合、プロセスの見直しが不可能である場合、性能の悪化が慢性的な場合などはハードウェアの増強を検討する必要がある。

以下はシステム稼働状況の解析に使用する主なコマンドである。

sar

システム全体の稼働状況を確認する

vmstat

システム全体の稼働状況を確認する

mpstat

CPU使用稼働状況を確認する

iostat

ハードディスク、CPUの使用状況を確認する

ps

プロセス情報を確認する

prstat

プロセス情報を確認する

priocntl

プロセスの優先度を変更する

prtconf

システム構成情報を確認する

swap

仮想記憶領域を確認する

sysdef

カーネルパラメータを確認する

各コマンドの使用方法

sar、vmstat、mpstat、iostatコマンドについてはコマンド実行時に「計測間隔」と「計測回数」を指定する。

「計測間隔」の指定についてはコマンド実行によるシステムへの影響を含ませないように、最低でも5秒以上を指定するのが望ましいとされている。

また「計測回数」の指定について以下の実行例では1回のみのデータを採取しているが実際にデータを採取する際は5回(一度に多くの資源が使用される場合)から20回程度(徐々に資源が使用される場合)のデータを採取するとよい。

以下に各コマンドの使用例と、出力結果を分析するためのポイントを紹介する。

sarコマンド

sarコマンドにはいくつかのオプションがあり、そのオプションを指定することによってシステムの稼働状況に関するさまざまな情報が確認できる。

以下のオプションが全てではないが、特に頻繁に使用されるオプションとその出力結果からシステムの稼働状況の問題であるか否か、またパフォーマンス低下の原因は何であるかを判断するための基準値について解説する。

-uオプション

CPUの使用率を確認する。

<実行例>
% sar -u 5 1

11:34:24    %usr  %sys  %wio  %idle
11:34:29      95     5     0      0
<表示結果>
%usr

ユーザ空間(プロセスの実行に費やされた時間)で使用されたCPUの時間の割合(vmstatのus、mpstatのusrと同等)

%sys

カーネル空間(システムコールなどの処理時間)で使用されたCPUの時間の割合(vmstatのsy、mpstatのsysと同等)

%wio

I/O処理によってCPU処理が待ち状態にあった時間の割合(mpstatのwtと同等)

%idle

CPUが待ち状態にあった時間の割合(vmstatのid、mpstatのidlと同等)

<監視ポイント>
%usr + %sys > 90、かつ%usr < %sysの状態が継続する場合

メモリ不足がシステム性能を悪化させている可能性がある。あるいはプロセスがシステムコールを多発してCPUに負荷がかかりシステム性能を悪化させている可能性がある。

%usr + %sys > 90、かつ%usr > %sysの状態が継続する場合

ユーザプロセスの異常動作によってCPUに負荷がかかりシステム性能を悪化させている可能性がある。

%wio > 10の状態が継続する場合

ハードディスクなどのI/O装置の性能が不足しているためI/O処理がシステム性能を悪化させている可能性がある。

-qオプション

プロセスキューの状況を確認する。

<実行例>
% sar -q 5 1

11:31:53 runq-sz %runocc swpq-sz %swpocc
11:31:58     4.0      30     0.0       0
<表示結果>
runq-sz

実行可能だが実行待ちのプロセス数(vmstatのrと同等)

%runocc

実行キューが占有されていた時間の割合

swpq-sz

実行可能だがスワップアウトされたプロセス数

%swpocc

スワップ待ち行列が占有されている時間の割合

<監視ポイント>
runq-sz / CPU数 > 2、かつ %runocc > 90 あるいは runq-sz > 10 の状態が継続する場合

CPU処理の負荷のため複数のプロセスがCPU待ちになっている可能性がある。

%runocc > 90、かつ runq-sz < 1 の状態が継続する場合

1つのプロセスがCPUを占有しCPU使用率が高くなっている可能性がある。

swpq-sz > 0 の状態が継続する場合

メモリ不足がシステム性能を悪化させている可能性がある。

-cオプション

システムコールの発行状況を確認する。

<実行例>
% sar -c 5 1

11:39:57 scall/s sread/s swrit/s fork/s exec/s rchar/s wchar/s
11:40:02    1028     203      52   0.00   0.00    9613    8033
<表示結果>
scall/s

システムコールの総数/秒

sread/s

readシステムコールの発行回数/秒

swrit/s

writeシステムコールの発行回数/秒

fork/s

fork(fork1、vfork含む)システムコールの発行回数/秒

exec/s

execシステムコールの発行回数/秒

rchar/s

readシステムコールが転送した文字数(バイト数)/秒

wchar/s

writeシステムコールが転送した文字数(バイト数)/秒

<監視ポイント>
exec/s / fork/s > 3 以上の状態が続く場合

PATH環境変数に設定されているパスの順番がふさわしくない可能性がある。

rchar/s / sread/s < 8KB以上の状態が続く場合、あるいはwchar/s / swrit/s < 8KB以上の状態が続く場合

大きいサイズのファイルを小さい単位でアクセスするアプリケーションが動作している可能性がある。

-pオプション

ページイン動作状況を確認する。

<実行例>
% sar -p 5 1

11:39:57 atch/s pgin/s ppgin/s pflt/s vflt/s slock/s
11:40:02  0.00   4.50    4.50   2.00   6.00    0.00
<表示結果>
pgin/s

ページイン要求の平均数/秒

ppgin/s

ページインされた平均ページ数/秒

vflt/s

アドレス変換ページフォルト数/秒

<監視ポイント>
vflt/s > 50(*)、かつsar -gコマンドのpgfree/s > 5の状態が続く場合

メモリ不足のため空きページを見つけるのに時間がかかっている。

(*) vflt/sが大きな値になる理由は以下の場合があるが、この場合はメモリ不足ではない。

ファイルシステムの内容が実メモリ上にキャッシュされ、ファイルシステムからのreadが多い場合(vflt/sと同時にpgin/s、ppgin/sの値も大きくなる)
プロセスの新規生成処理数が多い場合(vflt/sと同時にsar -cコマンドのfork/s、exec/sの値も大きくなる)
-gオプション

ページアウト、メモリ解放動作状況を確認する。

<実行例>
% sar -g 5 1

11:46:43 pgout/s ppgout/s pgfree/s pgscan/s %ufs_ipf
11:46:48    0.00     0.00     0.00     0.00     0.00
<表示結果>
pgfree/s

ページデーモンによって空きメモリ(sar -rのfreemem)に追加されたページ数

pgscan/s

ページデーモンによって走査されたn秒(*)あたりのページ数(vmstatのsrと同等)

%ufs_ipf

メモリの空きページからi-nodeを獲得した割合

(*) コマンド実行時に指定する計測間隔。

<監視ポイント>
pgscan/s > 0 の状態が継続していると確認された場合

メモリが不足している可能性がある。

-rオプション

空きメモリ状況を確認する。

<実行例>
% sar -r 5 1

11:46:43 freemem freeswap
11:46:48     588   830668
<表示結果>
freemem

バーチャルメモリの空きページ数(単位:ページサイズ(*))

freeswap

ページスワップに使用可能なディスクブロック数(単位:512バイト/ブロック)

(*) ページサイズはカーネルアーキテクチャによって異なる。ページサイズはpagesizeコマンドにより確認することができる。

<監視ポイント>
freememの値がlotsfree(*)の値を下回った場合

pageoutデーモンが起動されページアウトが開始される。

(*) lotsfreeはページング処理を開始するためのトリガーである(単位はページサイズ)。ページ数がlotsfreeのしきい値を下回るとpageoutデーモンがメモリスキャンを開始する。lotsfreeの値はmdbコマンドで確認できる。

# mdb -k
> lotsfree/E
lotsfree:
lotsfree:      234
> $q
-dオプション

ディスク使用状況を確認する。

<実行例>
% sar -d 5 1

11:46:48  device  %busy  avque  r+w/s  blks/s  avwait  avserv

11:46:53  nfs1        0    0.0      0       0     0.0     0.0
          sd0         0    0.0      0       0     0.0     0.0
          sd0,a       0    0.0      0       0     0.0     0.0
          sd0,b       0    0.0      0       0     0.0     0.0
          sd0,c       0    0.0      0       0     0.0     0.0
          sd3         0    0.0      0       0     0.0     0.0
<表示結果>
%busy

ディスクビジー率(転送要求サービスに費やした時間の割合) (iostatの%bと同等)

avque

実行を待っている要求の平均数

blks/s

デバイスに転送されたブロック数(単位:512バイト/ブロック)

avwait

転送要求がキュー上で待っていた平均時間/ミリ秒

avserv

転送要求がデバイスからサービスを受けた平均時間/ミリ秒

<監視ポイント>
%busy > 60の状態が続く場合

ハードディスクなどのI/O装置の性能が不足しているためI/O処理でシステム性能が悪化している可能性がある。

同一コントローラ下のディスクのblks/sの合計 = コントローラ1秒あたりの転送量の3/4〜4/5に近い値が続く場合

ディスクコントローラの実行転送能力が低下している可能性がある。

RAIDを使用している場合%busyの値が高くてもハードディスクなどのI/O装置の性能が不十分であると特定ができないので、以下の項目についても確認する必要がある。複数の項目が該当する場合はディスクが問題となっている可能性がある。

avque > 1
avwait > avserv
avwait + avserv > 30
-bオプション

システムバッファの使用状況を確認する。

<実行例>
% sar -b 5 1

19:10:28 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s
19:10:33       1      24      97      10      25      59       0       0
<表示結果>
%rcache

システムバッファから読み込むことができた読み出し動作の割合(キャッシュヒット率)

%wcache

システムバッファへ書き込むことができた書き込み動作の割合(キャッシュヒット率)

<監視ポイント>
%rcache < 90、かつ%wcache < 65の状態が続く場合

システムバッファが不足している可能性がある。

-vオプション

システムテーブルの使用状況を確認する。

<実行例>
% sar -v 5 1

19:18:58  proc-sz  ov inod-sz    ov  file-sz  ov  lock-sz
19:19:03  83/1882   0 5734/8316   0  601/601   0  0/0
<表示結果>
proc-sz

プロセステーブルの使用数/割当数

ov

プロセステーブルのオーバーフロー発生回数

inod-sz

UFSファイルシステム用のi-nodeテーブルの使用数/割当数

ov

UFSファイルシステム用のi-nodeテーブルのオーバーフロー発生回数

file-sz

ファイルテーブルの使用数/割当数

ov

ファイルテーブルのオーバーフロー発生回数

lock-sz

カーネルで使用されている共用メモリレコードテーブルの使用数/割当数

<監視ポイント>
各ov > 1の状態が続く場合

各テーブルのオーバーフローが発生している。

-aオプション

ファイルアクセスシステムルーチンの使用状況を確認する。

<実行例>
% sar -a 5 1

19:18:58 iget/s namei/s dirbk/s
19:19:03      0       0       0
<表示結果>
iget/s

i-node獲得ルーチンを呼び出した回数/秒

namei/s

ファイルシステムパス検索回数/秒

dirbk/s

UFSディレクトリブロック読み込み回数/秒

<監視ポイント>
iget/s / namei/sの値が増加傾向にある状態が続く場合

ファイルアクセス時の負荷が高い可能性がある。

namei/s > 50、かつDNLCのヒット率(*) < 90の状態が続く場合

大量のi-nodeの獲得が行われている。

(*) DNLC(Directory Name Lookup Cache:ディレクトリ名検索キャッシュ)のヒット率の確認はvmstat -sコマンドで行う。

% vmstat -s
   :
20273707 total name lookups (cache hits 93%)

vmstatコマンド

vmstatコマンドはsarコマンドと同様にシステムのパフォーマンス状況を確認する。

Solaris以外にも広く実装されているコマンドである。

<実行例>
% vmstat 5 1
procs     memory           page             disk         faults     cpu
r b w   swap free re  mf pi po fr de sr  dd f0 s0 --  in  sy  cs us sy id
0 0 0 472400 6536  5  23 38 10 12  0  4   4  0  0  0 363 751 238  5  2 93
<表示結果>
procs : r

実行待ちのプロセス数(sar -qのrunq-szと同等)

page : sr

ページデーモンによって走査されたn秒(*)あたりのページ数(sar -gのpgscan/sと同等)

(*) コマンド実行時に指定する計測間隔。

cpu : us

ユーザ空間(プロセスの実行に費やされた時間)で使用されたCPUの時間の割合(sar -uの%usr、mpstatのusrと同等)

cpu : sy

カーネル空間(システムコールなどの処理時間)で使用されたCPUの時間の割合(sar -uの%sys、mpstatのsysと同等)

cpu : id

待ち状態にあるCPUの時間の割合(sar -uの%idle、mpstatの%idleと同等)

<監視ポイント>
us + sy > 90、かつus < syの状態が継続する場合

メモリ不足がシステム性能を悪化させている可能性がある。

プロセスがシステムコールを多発してCPUに負荷がかかり、システム性能を悪化させている可能性がある。

us + sy > 90、かつus > syの状態が継続する場合

ユーザプロセスの異常動作によってCPUに負荷がかかり、システム性能を悪化させている可能性がある。

r / CPU数 > 2の状態が継続する場合

CPUが原因でシステム性能が悪化している可能性がある。

sr > 0の状態が 継続する場合

メモリ不足が問題でシステム性能が悪化している可能性がある。

mpstatコマンド

マルチプロセッサシステムの場合sarコマンドを使用すると全てのCPUの平均値が表示されるので、各CPUの使用状況を確認する場合にはmpstatを使用する。

シングルプロセッサシステムでは一つのプロセッサに関する情報を表示する。

<実行例>
% mpstat 5 1
CPU minf mjf xcal intr ithr csw icsw migr smtx  srw syscl usr sys wt idl
  1  132   3  387  232  186 425   57   33   15    0   500  16  13  9  63
  3  133   2  448  772  547 392   52   33   15    0   504  16  12  9  63
<表示結果>
CPU

プロセッサID

smtx

mutex(相互排他ロック)の取得に失敗した回数/秒

usr

ユーザ空間(プロセスの実行に費やされた時間)で使用されたCPUの時間の割合(sar -uの%usr、vmstatのvsと同等)

sys

カーネル空間(システムコールなどの処理時間)で使用されたCPUの時間の割合(sar -uの%sys、vmstatのsyと同等)

wt

I/O処理によってCPU処理が待ち状態にあった時間の割合(sar -uの%wioと同等)

idl

待ち状態にあるCPUの時間の割合(sar -uの%idle、vmstatのidと同等)

<監視ポイント>
usr + sys > 90、かつ usr < sysの状態が継続する場合

メモリ不足がシステム性能を悪化させている可能性がある。

プロセスがシステムコールを多発してCPUに負荷がかかり、システム性能を悪化させている可能性がある。

usr + sys > 90、かつ usr > sysの状態が継続する場合

ユーザプロセスの異常動作によってCPUに負荷がかかり、システム性能を悪化させている可能性がある。

wt > 10の状態が継続する場合

ハードディスクなどのI/O装置の性能が不足しているためI/O処理がシステム性能を悪化させている可能性がある。

smtx > 500、かつsys > 20の状態が継続する場合

システムコールの発行回数が多くmutex(相互排他ロック)の衝突がカーネルで発生しているためCPUが浪費されている可能性がある。

iostatコマンド

ディスクの使用状態を確認する。

<実行例>
% iostat -xtc 5 1
          extended device statistics                   tty        cpu
device r/s  w/s   kr/s   kw/s wait actv  svc_t %w %b tin tout us sy wt id
dad0   2.4  1.2   28.7   19.1  0.2  0.0   54.3  0  2   0   10  5  2  2 92
fd0    0.0  0.0    0.0    0.0  0.0  0.0    0.0  0  0
<表示結果>
r/s

1秒あたりの読み込み回数

w/s

1秒あたりの書き込み回数

%w

サービス待ちの処理が存在していた時間の割合

%b

ディスクビジー率(転送要求サービスに費した時間の割合) (sar -dの%busyと同等)

<監視ポイント>
%w > 5の状態が続く場合

SCSIバス負荷が高い可能性がある。

%b > 60の状態が続く場合

ハードディスクなどのI/O装置の性能が不足しているためI/O処理でシステム性能が悪化している可能性がある。

システムの稼働効率に影響を与えるカーネルパラメータについて

カーネルパラメータとは

カーネルパラメータはOSが動作をするにあたってカーネルが実メモリの実装などにより自動的に割り当てられる値を使用する環境(アプリケーションの起動等)にあわせて明示的に変更をさせることができる項目である。

中でもsarコマンドの結果から設定の見直しが必要だと確認できるカーネルパラメータについて紹介する。

カーネルパラメータの変更は容易に行うことができるが設定値の見積もりが正しく行われない場合は逆にシステムの性能の悪化を招く恐れがあるので十分注意した上で行うこと。

主なカーネルパラメータ

bufhwm ... システムバッファのサイズを調整する

sar -bコマンドで「%rcache < 90」かつ「%wcache < 65」の状態が継続して続くような場合はシステムバッファが不足している可能性がある。

この場合bufhwmパラメータの値を大きくし、システムの再起動をすることで性能が改善される可能性がある。

bufhwmのデフォルト値は物理メモリの2%で最大値は物理メモリの20%である。

ufs_ninode ... UFSファイルシステムのi-nodeキャッシュサイズを調整する

sar -gコマンドで「%ufs_ipf > 0」の状態が継続して続くような場合はカーネル上で管理できるinode数が足りなくなりディスクから毎回inodeを読み込む必要があることを示している。

この場合ufs_ninodeパラメータの値を大きくし、システムの再起動をすることで性能が改善される可能性がある。

ufs_ninodeのデフォルト値は「4 x (v.v_proc(*1) + maxusers(*2)) + 320」で、最大値は4G(1,024 x 1,024 x 1,024 x 4 - 1 = 4,294,967,295bytes)である。

(*1) v.v_procの値はsysdefコマンドで確認する。

# sysdef |grep v.v_proc
30000   maximum number of processes (v.v_proc)

(*2) maxusersの値の確認方法は後述する。

ncsize ... ディレクトリ読みとり用キャッシュサイズを調整する

sar -aコマンドの「namei/s > 50」かつ、vmstat -sコマンドの「DNLCヒット率 < 90」の状態が続く場合はディレクトリ名ルックアップキャッシュ(DNLC)が不足しており大量のinodeを読み込む必要があることを示している。

この場合ncsizeパラメータを大きくしシステムの再起動をすることで性能が改善される可能性がある。

ncsizeのデフォルト値は「4 x (v.v_proc + maxusers) + 320」で、最大値は4G(4,294,967,295bytes)である。

max_nprocs ... ユーザが起動できるプロセスの最大数を調整する

sar -vコマンドの「proc-sz」の項目で、システムで起動できるプロセス数と現在起動しているプロセス数を確認することができる。

起動しているプロセス数が上限に達してしまい終了できるプロセスも存在しない場合などは起動できるプロセス数の上限を増やす必要がある。

max_nprocsのデフォルト値は「10 + (16 x maxusers)」で、最大値は30000である。

尚、pidmaxパラメータを指定することにより最大値を999999まで上げることができる。

カーネルパラメータ変更方法

カーネルパラメータを変更する場合/etc/systemファイルに以下の記法で各パラメータを記述しシステムのリブートを行う。

set パラメータ = 値

デフォルト値のままの場合は/etc/systemファイルには記述されていない。

設定値の確認方法

設定値はsysdefコマンドにより確認する。

例)

# sysdef | grep bufhwm
146284544  maximum memory allowed in buffer cache (bufhwm)

その他のパラメータはmdbコマンドで確認する。

例)

# mdb -k
> ufs_ninode/D
ufs_ninode:
ufs_ninode:     128512          
> ncsize/D
ncsize:
ncsize:         128512          
> max_nprocs/D
max_nprocs:
max_nprocs:     30000           
> maxusers/D
maxusers:
maxusers:       2048            
> $q

システムで発生した性能問題の調査から解決までの流れ

ここまではシステムの稼働状況を確認するためのコマンドやカーネルパラメータについて見てきたが、ここからはこれらコマンドを使用してシステムで発生した性能問題をどのように調査し解決していくのかについて説明する。

システムのスループットの低下やレスポンスの低下が一時的な現象であったり、トラブル原因への対策がカーネルパラメータの変更やプログラム実行スケジュールの変更などで改善できるのであればハードウェアの増強は必ずしも必要ない。

しかし、メモリの追加やCPUの増強といったハードウェアの性能向上が必要な場合もある。

その際システムの稼働効率を効果的に改善するためにはどのコンポーネント(パーツ)の増強が適切かという判断が重要である。

ここではシステムで発生した性能問題の調査から解決までのおおよその流れを説明する。

まずsarコマンドを使用してシステムの負荷状況を確認する。

# sar -u 1 5

02:35:52  %usr  %sys  %wio  %idle
02:35:53    49     5     0     47
02:35:54    47     2     0     51
02:35:55    50     1     0     50
02:35:56    48     1     0     51
02:35:57    49     2     0     50

Average     49     2     0     49

CPU性能が不十分な場合

プロセスには実行状態、実行可能状態、待ち状態の3つの状態がある。

待ち状態は入出力の要求が行われ動作が完了すると実行可能状態となり、CPUの割り当てを待つ。

そしてCPU割り当てが行われると実行状態となりCPUを使用してプロセスが動作する。

このようにCPUはプロセスを動作する上で大変重要な役割を果たす。

1台のマシンでいくつものプロセスを実行した際、処理が遅いと感じることがある。

その原因としてCPUの搭載量と比べて実行プロセスの数が多すぎたり、1つのプロセスがCPUを占有して他のプロセスの実行を妨げたりしていることなどが考えられる。

sar -uの結果、「%usr + %sys > 90%」かつ「%usr > %sys」の場合はCPUの使用率が高くユーザプロセスが原因の可能性がある。 ユーザプロセスを確認するためにsar -qコマンドで原因を調査する。

# sar -q 1 5

02:34:43 runq-sz %runocc swpq-sz %swpocc
02:34:44     0.0       0     0.0       0
02:34:45     0.0       0     0.0       0
02:34:46     0.0       0     0.0       0
02:34:47     0.0       0     0.0       0
02:34:48     0.0       0     0.0       0

Average      0.0       0     0.0       0

「%runocc > 90」かつ「runq-sz / CPU数 > 2」、あるいは「runq-sz > 10」の場合は複数のプロセスが原因でCPU異常を起こしている可能性がある。

逆に「%runocc > 90」かつ「runq-sz < 1」の場合は1つのプロセスが原因でCPU異常を起こしている可能性がある。

双方ともpsコマンドにより問題となっているプロセスを特定する必要があるが、後者の場合は他のプロセスへの影響がなければそのままの状態でも問題ない。また、前者の場合はpriocntlコマンド(*)を使用してバッチ処理の優先度を変更するなどの検討を行う必要があるが、これらの対処を行っても改善が見られない場合は他の改善策としてCPUの増設を検討する。

「%usr + %sys > 90%」かつ「%usr < %sys」の場合はCPU負荷、もしくはメモリ不足の可能性がある。

vmstatコマンドでI/Oの割り込み頻度を調べる。

# vmstat 1 5
 procs     memory            page            disk          faults      cpu
 r b w   swap  free  re  mf pi po fr de sr m0 m1 m1 m1   in   sy  cs us sy id
 0 0 0 270096 75248   9  35  0  0  0  0  0  0  0  0  0  130  216 119  1  1 98
 0 0 0 218880 41216   0   6  0  0  0  0  0  0  0  0  0  128   37 112  0  0 99
 0 0 0 218880 41216   0   0  0  0  0  0  0  0  0  0  0  131  392 115  0  0 99
 0 0 0 218880 41216   0   0  0  0  0  0  0  0  0  0  0  130  354 125  0  3 97
 0 0 0 218880 41216   0   0  0  0  0  0  0  0  0  0  0  124   32 120  0  0 99

「in > 200」の場合はハードウェアの問題が発生している可能性があるためI/Oコネクタの接続状態を確認する。

「in < 200」の場合はシステムコールの発行回数が多発している可能性があるため更にsar -cコマンドでシステムコールの発行回数を確認する。

# sar -c 1 5
02:53:20 scall/s sread/s swrit/s  fork/s  exec/s rchar/s wchar/s
02:53:21     291      27      29    0.00    0.00    6201    6331
02:53:22     633      25      26    0.00    0.00    6130    6241
02:53:23     259      25      26    0.00    0.00    6069    6179
02:53:24     264      25      26    0.00    0.00    6130    6241
02:53:25     262      25      26    0.00    0.00    6130    6241

Average      342      25      26    0.00    0.00    6132    6247

また、メモリ不足が原因でpageoutデーモンのカーネル空間での頻繁な動作が起こりCPU使用率を上げてしまう可能性があるため、sar -gコマンドでメモリ不足になっていないか確認する必要もある。

# sar -g 1 5

02:54:57  pgout/s ppgout/s pgfree/s pgscan/s %ufs_ipf
02:54:58     0.00     0.00     0.00     0.00     0.00
02:54:59     0.00     0.00     0.00     0.00     0.00
02:55:00     0.00     0.00     0.00     0.00     0.00
02:55:01     0.00     0.00     0.00     0.00     0.00
02:55:02     0.00     0.00     0.00     0.00     0.00

Average      0.00     0.00     0.00     0.00     0.00

これらの確認に加え、発生したシステム異常が一時的なものであるか慢性的なものであるかについても確認する必要がある。

一時的なものであればそのままシステムの監視を続けるが、慢性的なものであればユーザプロセスの確認や実行プロセス数に合わせたCPUの追加を検討する必要がある。

一般的にはsar -qコマンドのrunq-szをCPU数で割った結果が2以下になるようにCPUを追加すればよいと言われている。

(*) priocntlコマンドは指定したプロセスのスケジューリングを行う。プロセスがどのようなスケジューリングをされて動作しているかはps -elcコマンドのCLS(クラス)とPRI(優先順位)の項目を確認する。

以下の場合はsampleプロセスはIA(インタラクティブクラス)、優先度20で動作している。

# ps -elc | grep sample
F S  UID   PID  PPID CLS PRI ADDR   SZ WCHAN TTY TIME    CMD
8 S 1679 20859 26567  IA  20    ? 3310     ? ??  4958:05 sample

これをIAよりも優先度の低いTS(タイムシェアリングクラス)に変更する方法は以下になる。

# priocntl -s -c TS -i pid 20859

メモリ容量が不十分な場合

プロセスのメモリ要求が使用できる物理メモリ量を超えるとシステムはメモリ不足の状態に陥りpageoutデーモンの動作が始まる。

pageoutデーモンの動作が始まるのはsar -rコマンドのfreememがlotsfree(*)値を下回った時である。

# sar -r 1 5

03:01:39 freemem freeswap
03:01:40  754845 26433952
03:01:41  747353 26172230
03:01:42  754803 26433952
03:01:43  754779 26433952
03:01:44  754761 26433952

Average   753296 26381188

lotsfree値を下回るとpageoutデーモンは物理メモリをスキャンして最近使用されていないページを探し出し、そのページをスワップデバイスにページアウトさせて物理メモリを解放する(ページング)。

pageoutデーモンによって行われるスキャンの速度は利用可能なページ量の減少に従い頻繁に動作するようになる。

そのためCPU使用率が上昇しシステム性能は著しく低下する。このスキャン状態はsar -gで確認する。

# sar -g 1 5

03:02:37  pgout/s ppgout/s pgfree/s pgscan/s %ufs_ipf
03:02:38     0.00     0.00     0.00     0.00     0.00
03:02:39     0.00     0.00     0.00     0.00     0.00
03:02:40     0.00     0.00     0.00     0.00     0.00
03:02:41     0.00     0.00     0.00     0.00     0.00
03:02:42     0.00     0.00     0.00     0.00     0.00

Average      0.00     0.00     0.00     0.00     0.00

「pgscan/s > 0」の場合はシステムがメモリ不足であると判断することができる。

また、システムの仮想メモリが足りなければプロセスの生成ができなくなるほか、アプリケーションがメモリを確保することができないために異常動作(異常終了)を起こす可能性がある。

psコマンドを定期的に実行し、多くのメモリを使用しているプロセスが存在していないか、またはswapファイルと他のファイルとのI/O競合が発生していないかなどを確認する。

仮想メモリの使用量についてはswap -sコマンド、sar -rコマンドで確認ができる。

# swap -s
total: 30200k bytes allocated + 17856k reserved = 48056k used, 13216920k available

# sar -r 1 5

03:04:34 freemem freeswap
03:04:35  754857 26433152
03:04:36  754857 26433152
03:04:37  754857 26433152
03:04:38  754857 26433152
03:04:39  747383 26171438

Average   753350 26380390

swap -sコマンドについてはavailableの項目が、sar -rについてはfreeswapの項目が仮想メモリの空き容量になる。

仮想メモリが足りない場合はswapデバイスを追加して容量を増やすことになるが、実際に増やさなければならない容量は実行プロセス数やプログラミングの方法などに依存するため、日々の運用の中で決定する必要がある。

swapデバイスの追加についてはパーティションを切り直すほかにswap -aコマンドで他の空いているデバイスをswapデバイスとして追加することができる。

(*) lotsfreeはページング処理を開始するためのトリガーである。ページ数がlotsfreeのしきい値を下回るとpageoutデーモンがメモリスキャンを開始する。lotsfreeの値はmdbコマンドで確認できる。

# mdb -k
> lotsfree/E
lotsfree:
lotsfree:  13775
> $q

ディスク装置の性能が不十分な場合

ディスクはCPUやメモリに比べるとアクセス性能が遅いため、レスポンスの悪化を起こしやすい資源である。

# sar -u 1 5

02:35:52    %usr    %sys    %wio   %idle
02:35:53      49       5       0      47
02:35:54      47       2       0      51
02:35:55      50       1       0      50
02:35:56      48       1       0      51
02:35:57      49       2       0      50

Average       49       2       0      49

sar -uコマンドの結果、「%wio > 10」の場合はハードディスクなどのI/O装置の性能が不足している可能性がある。

ディスク資源にはディスク装置、ディスク資源をコントロールするコントローラと2つの要素がある。

通常1つのディスクコントローラの下には複数のディスク装置やその他の入出力装置が接続されている。

接続される装置の台数が多くなると個々の装置の負荷はそれほど高くなくてもディスクコントローラのデータ転送が悪化する場合がある。

ディスク資源に問題がある場合、複数のプロセスによる同一ディスクの競合が原因となっている可能性がある。

ディスクの性能に悪影響を及ぼさない使用率はsar -dコマンドの%busyが60%以下だと言われており、60%を越えるとディスクアクセス時間は通常時の2〜3倍以上に低下してしまう。

もし複数のプロセスが同一ディスクに対してアクセスしている場合は資源の分散をするなどしてアクセス負荷についても分散させるのが良いだろう。

# sar -d 1 5

03:14:58  device   %busy  avque  r+w/s  blks/s  avwait  avserv

03:14:59  md0         95    4.9    220   46643     5.0    17.2
          md1          0    0.0      0       0     0.0     0.0
          md10        88    2.9    217   45874     0.0    13.1
          md11         0    0.0      0       0     0.0     0.0
          md20        92    3.0    220   46884     0.0    13.6
          md21         0    0.0      0       0     0.0     0.0
          nfs1         0    0.0      0       0     0.0     0.0
          sd0         93    3.4    228   45885     0.0    15.0
          sd0,a       88    2.8    217   45874     0.0    13.1
          sd0,b        0    0.0      0       0     0.0     0.0
          sd0,c        0    0.0      0       0     0.0     0.0
          sd0,h       58    0.6     11      11     0.0    52.5
          sd1         99    3.8    233   46898     0.0    16.5
          sd1,a       92    3.0    220   46886     0.0    13.6
          sd1,b        0    0.0      0       0     0.0     0.0
          sd1,c        0    0.0      0       0     0.0     0.0
          sd1,h       85    0.8     12      12     0.0    70.4
          sd30         0    0.0      0       0     0.0     0.0
:
Average   md0         98    5.3    204   44219     5.2    20.6
          md1          0    0.0      0       0     0.0     0.0
          md10        89    3.1    203   43963     0.0    15.5
          md11         0    0.0      0       0     0.0     0.0
          md20        89    3.0    205   44390     0.0    14.4
          md21         0    0.0      0       0     0.0     0.0
          nfs1         0    0.0      0       0     0.0     0.0
          sd0         97    3.9    218   43977     0.0    18.0
          sd0,a       89    3.1    204   43963     0.0    15.4
          sd0,b        0    0.0      0       0     0.0     0.0
          sd0,c        0    0.0      0       0     0.0     0.0
          sd0,h       77    0.8     14      14     0.0    55.2
          sd1         99    3.8    219   44405     0.0    17.2
          sd1,a       89    3.0    205   44391     0.0    14.4
          sd1,b        0    0.0      0       0     0.0     0.0
          sd1,c        0    0.0      0       0     0.0     0.0
          sd1,h       80    0.8     14      14     0.0    57.4
          sd30         0    0.0      0       0     0.0     0.0

blks/sが使用しているコントローラの1秒あたりの転送量(*)の3/4〜4/5に近い場合、コントローラが問題となっている可能性がある。

コントローラの増設やコントローラの再配置(コントローラが複数あると負荷が不均等になっている場合があるため)を行う。

(*) コントローラの1秒あたりの転送量はblks/s(1blks:0.5KB)の合計になる。

また、sar -bコマンドの結果「%rcache < 90」または「%wcache < 65」の場合はシステムバッファが不足しているのでカーネルパラメータであるbufhwmを拡張することによりアクセス性能の改善を行うことができる可能性がある。

# sar -b 1 5

03:19:35 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s
03:19:36       0      56     100       0      36     100       2       0
03:19:37       0      76     100       0      48     100       0       0
03:19:38       0      57     100       0      36     100       0       0
03:19:39       0      74     100       0      48     100       0       0
03:19:40       0      76     100       0      48     100       0       0

Average        0      68     100       0      43     100       0       0

具体的な解析例

では実際にシステム性能になんらかの問題が起こった場合の解析の流れをコマンドの実行結果もふまえながら具体的に紹介していく(スクリプト等はSolaris8のものを使用)。

システム性能はいつ悪化するかわからない。

そのような場合に備えてsarコマンドをcronのジョブとして定期的に実行させることで毎日の性能データが/var/adm/saディレクトリ配下に作成される。

cronで採取されたデータをsarコマンドで調査する場合、「計測間隔」と「計測回数」を指定する必要はなく、自動的に採取されたデータの値が表示される。

尚、本章での解析例は5分毎にデータが採取されていることを前提としている。

sarコマンドをcronジョブとして実行させる方法

/etc/rc2.d/S21perfファイルの該当部分のコメントを外し、システム起動時に性能情報の採取を開始するように設定する。
    20  # if [ -z "$_INIT_RUN_LEVEL" ]; then
    21  #       set -- `/usr/bin/who -r`
    22  #       _INIT_RUN_LEVEL="$7"
    23  #       _INIT_RUN_NPREV="$8"
    24  #       _INIT_PREV_LEVEL="$9"
    25  # fi
    26  #
    27  # if [ $_INIT_RUN_LEVEL -ge 2 -a $_INIT_RUN_LEVEL -le 4 -a \
    28  #     $_INIT_RUN_NPREV -eq 0 -a \( $_INIT_PREV_LEVEL = 1 -o \
    29  #     $_INIT_PREV_LEVEL = S \) ]; then
    30  #
    31  #       /usr/bin/su sys -c "/usr/lib/sa/sadc /var/adm/sa/sa`date +%d`"
    32  # fi
sysユーザのcron設定の該当部分のコメントを外し、定期的に性能データを収集するように設定する。
# crontab -e sys

0 * * * 0-6 /usr/lib/sa/sa1
20,40 8-17 * * 1-5 /usr/lib/sa/sa1
5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 1200 -A

1行目 : 1時間おきに性能データを収集

2行目 : 月〜金曜日の8:00〜17:00は20分と40分に性能データを収集

3行目 : 月〜金曜日の18:05に8:00〜18:01までのシステム状況をレポート

解析例1

解析
システムの動作状態をsar -uコマンドで確認する。
% sar -u -s 14:25 -e 14:50

14:25:00    %usr    %sys    %wio    %idle
14:30:00       2       5      71       22
14:35:00       5       6      88        0
14:40:00       2       4      91        2
14:45:00       1       4      95        0
14:50:00       3       6      91        0

→ %wioの値が高いためI/O処理の多発によりディスクに負荷がかかっている可能性がある。

sar -dコマンドでディスクアクセスの確認を行う。
% sar -d -s 14:25 -e 14:50

14:25:00  device   %busy avque r+w/s blks/s avwait avserv
14:30:00  dad0        72   0.7   113    617    0.0    6.5
          dad0,a       0   0.0     0      0    0.0    0.0
          dad0,b       0   0.0     0      3    0.0   13.4
          dad0,c       0   0.0     0      0    0.0    0.0
          dad0,d       0   0.0     1     11    0.0    3.2
          dad0,e      72   0.7   112    602    0.0    6.5
          dad0,h       0   0.0     0      0    0.0    0.0
          :

14:50:00  dad0        89   0.9   129   1121    0.0    7.2
          dad0,a       0   0.0     0      3    0.0   18.3
          dad0,b       0   0.0     0      3    0.0   14.6
          dad0,c       0   0.0     0      0    0.0    0.0
          dad0,d       0   0.0     0      0    0.0    0.0
          dad0,e      89   0.9   129   1114    0.0    7.2
          dad0,h       0   0.0     0      0    0.0    0.0

→ dad0,eの%busyが60を越えているためdad0,eデバイスの負荷が高いことが確認できる。

iostatコマンドでディスクアクセスの確認を行う。
% iostat -xtc 5 30
device   r/s w/s  kr/s kw/s wait actv svc_t %w %b tin tout us sy wt id
dad0   150.2 0.2 259.4  1.6  0.0  0.9   6.3  0 72   0  181  5  6 88  0
fd0      0.0 0.0   0.0  0.0  0.0  0.0   0.0  0  0
sd0      0.0 0.0   0.0  0.0  0.0  0.0   0.0  0  0

→ 負荷が高いdad0デバイスに注目する。ビジー率は高いが%wの値が5以下のためSCSIバスの負荷はない。

負荷がかかっているdad0,eデバイスとディスクの対応付けを行う。

(/dev/dskからdad0,eに該当するディスクを確認する)

% ls -l /dev/dsk
lrwxrwxrwx   1 root     root         38 9月 20日 2001年 c0t0d0s1
-> ../../devices/pci@1f,0/ide@d/dad@0,0:c
lrwxrwxrwx   1 root     root         29 9月 20日 2001年 c0t0d0s2
-> ../../devices/pci@1f,0/ide@d/dad@0,0:d
lrwxrwxrwx   1 root     root         38 9月 20日 2001年 c0t0d0s3
-> ../../devices/pci@1f,0/ide@d/dad@0,0:e

→ 上記からdad0,eはc0t0d0s3であることがわかる。

(c0t0d0s3をdf -kコマンドの結果から判断する)

% df -k
ファイルシステム    kbytes  使用済み  使用可能  capacity  マウント先
/dev/dsk/c0t0d0s0  1760958    350133   1357997       21%  /
/dev/dsk/c0t0d0s3  4127894   1139940   2946676       28%  /export
/proc                    0         0         0        0%  /proc

→ 上記の結果からc0t0d0s3は/exportだということがわかる。

I/Oが高いためキャッシュヒット率の確認を行う。
% sar -b -s 14:25 -e 14:50

14:25:00  bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s
14:30:00       25     171      86       1       2      50       0       0
14:35:00       23     169      80       1       2      48       0       0
14:40:00       21     180      83       1       2      60       0       0
14:45:00       21     183      85       1       2      62       0       0
14:50:00       23     165      78       1       2      48       0       0

→ %rcache < 90、かつ%wcache < 65のためシステムバッファが不足していることがわかる。

原因

%wioの値が高いのは/exportに対してのI/O処理が多発しておりディスクに負荷がかかっているためと判断できる。

またsar -bコマンドの結果から、システムバッファが不足していることがわかる。

対策

まず、高負荷の状態にあった時間/exportに対して頻繁にI/O処理を行っていたプロセスの処理を確認する。

/export以外にI/O処理が分散可能な場合はプロセスの見直しを行うことでディスクアクセスの負荷分散が可能である。

しかし/exportのみのアクセスになる場合はシステムバッファが不足しているため/etc/systemファイルに「set bufhwm = 値」を記述してシステムバッファを増やしI/O処理で使用するバッファを増やす。

結果

プロセスのI/O処理を分散させる対策をとった場合はsar -dコマンドの%busyを確認し、他のディスクにアクセスが行われディスクアクセスの負荷分散がされているか、%busyの値が60%以下になっているかを確認する。

以下はディスクアクセスの負荷分散を行った後にdad0,eの値を確認した結果である。

% sar -d -s 15:25 -e 16:00

15:25:00  device  %busy avque r+w/s blks/s avwait avserv
15:30:00  dad0       53   3.5    41   9483   61.1   24.9
          dad0,a      1   0.0     0      1    0.0   22.4
          dad0,b      1   0.0     0      5    0.0   21.2
          dad0,c      0   0.0     0      0    0.0    0.0
          dad0,d      0   0.0     0      5    0.0    2.6
          dad0,e     53   3.5    41   9472   61.1   24.9
          dad0,h      0   0.0     0      0    0.0    0.0
          :

16:00:00  dad0       55   3.6    43   9966   59.5   22.3
          dad0,a      0   0.0     0      0    0.0    0.0
          dad0,b      1   0.1     0      5    0.0   31.7
          dad0,c      0   0.0     0      0    0.0    0.0
          dad0,d      0   0.0     0      0    0.0    0.0
          dad0,e     55   3.5    43   9961   59.5   22.3
          dad0,h      0   0.0     0      0    0.0    0.0

また以下はbufhwmを設定しシステムバッファを増やした際、処理時間を比較した結果である。

bufhwmの設定前と設定後で処理時間が早くなっていることが確認できる。

(設定前)

# time sample
real     1:24.7
user        0.4
sys         4.5

(設定後)

# time sample
real       56.4
user        0.5
sys         4.3

解析例2

解析
システムの動作状態をsar -uコマンドで確認する。
% sar -u -s 15:05 -e 15:30

15:05:00    %usr    %sys   %wio   %idle
15:10:00      96       4      0       0
15:15:00      96       4      0       0
15:20:00      96       4      0       0
15:25:00      95       5      0       0
15:30:00      94       6      0       0

→ %usrがCPU使用率の大部分を占めており、ユーザプロセスが原因となっている可能性がある。

システムコールの発行状況を確認する。
% sar -q -s 15:05 -e 15:30

15:05:00 runq-sz %runocc swpq-sz %swpocc
15:10:00     0.6      91
15:15:00     0.7      96
15:20:00     0.7      97
15:25:00     0.7      96
15:30:00     0.7      96

→ runq-sz < 1、かつ %runocc > 90 の状態が続いているため1つのプロセスがCPUを占有していることがわかる。

原因となるプロセスが何かを見つける。
% prstat
PID   USERNAME   SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
20859 user2       26M   20M run     59    0  46:49.23  99% sample/1
 3359 user1     2536K 1504K cpu0    58    0   0:00.00 0.2% test-comm/1

→ sampleプロセスが99%のCPUを使用している。

原因

CPU使用率が高かったのはsampleプロセスが原因であると判断できる。

対策

プログラムの作りによる異常動作ではない場合で、あるプロセスが原因となり他のプロセスの動作に影響を与えているようであれば、プロセスの優先度を下げたり先に実行させたいプロセスの優先度を上げることで対処が可能である。

以下はsampleプロセスの優先度を下げる方法である。

% ps -elc | grep sample
F S   UID   PID  PPID  CLS PRI  ADDR    SZ  WCHAN TTY  TIME     CMD
8 S  1679 20859 26567   RT 100     ?  3310      ? ??   24958:05 sample

現在sampleプロセスの優先度はRT(リアルタイムクラス)で動作している。

これを優先度の低いTS(タイムシェアリングクラス)に変更する。

# priocntl -s -c TS -i pid 20859

% ps -elc |grep sample
F S   UID   PID  PPID  CLS PRI  ADDR    SZ  WCHAN TTY  TIME     CMD
8 S  1679 20859 26567   TS  59     ?  3310      ? ??   24958:05 sample

sampleプロセスの優先度を下げることでsampleプロセスよりも優先度が高いプロセスの実行が優先して行われるようになる。

また、sampleプロセスが99%ものCPUを使用しておりシステムパフォーマンスに影響を与えているようであればプロセスをkillすべきである。

ただし、killで対処する場合は対象プロセスがCPUの大部分を占めプログラムの動作上異常と判断した場合のみ実行するなど、実行の際は十分注意すること。

結果

対策としてプロセスの優先順位を下げた場合は先に処理させたいプロセスの実行が行われる。

またsampleプロセス自体の問題と判断しkillした場合はCPU使用率は正常値に戻る。

% sar -u -s 16:05 -e 16:30

16:05:00    %usr    %sys    %wio    %idle
16:10:00      93       2       0        5
16:15:00      18       1       0       81
16:20:00       9       2       0       89
16:25:00       0       0       0      100
16:30:00       0       0       0      100

また同時にCPU実行待ちのプロセスがなくなる。

% sar -q -s 16:05 -e 16:30

16:05:00 runq-sz %runocc swpq-sz %swpocc
16:10:00     0.7      96
16:15:00
16:20:00
16:25:00
16:30:00

CPU使用率が高くても特にCPUを圧迫しているプロセスが存在しない場合はpriocntlコマンドにより優先させて実行したいプロセスの優先順位を上げる。

解析例3

解析
システムの動作状態をsar -uコマンドで確認する。
% sar -u -s 18:20 -e 18:45

18:20:00    %usr    %sys    %wio    %idle
18:25:00      31      69       0        0
18:30:00      37      63       0        0
18:35:00      55      45       0        0
18:40:00      35      65       0        0
18:45:00      32      62       0        6

→ %sysの値が極端に高いことがわかる。CPU負荷の他にメモリ不足に陥っている可能性がある。

sar -qにてスワップアウトされたプロセス数を確認する。
% sar -q -s 18:20 -e 18:45

18:20:00 runq-sz %runocc swpq-sz %swpocc
18:25:00     1.2     100    48.0     100
18:30:00     1.0     100    48.0     100
18:35:00     1.2     100    48.0     100
18:40:00     1.0     100    48.0     100
18:45:00     1.0     100    48.0     100

→ runq-szの値からCPU待ちのプロセスがあること、swpq-szの値からスワップアウトしてしまったプロセスが多発していることがわかる。プロセスがスワップアウトする場合、仮想メモリ不足が考えられる。

(参考) ページングとスワッピング

新たにプロセスが起動する際、システムの仮想メモリに空きがなければ仮想メモリを使用している必要がないと判断されたプロセス(一度だけ実行されて後はスリープ状態にあるなど)が仮想メモリに空きを作るためにページ単位でスワップデバイスに追い出され、その部分に当該プロセス用のメモリ領域が割り当てられる。

これをページングという。

さらに、ページ単位での追い出しでも仮想メモリの空き容量が足りない場合はプロセス単位でスワップデバイスに追い出され、ページングと同様にその部分に当該プロセス用のメモリ領域が割り当てられる。

これをスワッピングという。

sar -gにてページスキャンの状態を確認する。
% sar -g -s 18:20 -e 18:45

18:20:00  pgout/s ppgout/s pgfree/s pgscan/s %ufs_ipf
18:25:00     0.00     0.00     0.00     0.00     0.00
18:30:00     0.25     0.25     0.25     0.00     0.00
18:35:00    91.11   760.74  1055.80  7568.64     0.00
18:40:00   185.95   905.58  1070.91  7647.93     0.00
18:45:00   141.53   798.40   812.88  6346.71     0.00

→ pgscan/sの結果から18:35:00から18:45:00までページスキャンが頻繁に走り、空きメモリを探している状態であり一定の時刻だけメモリ不足になっていたことがわかる。また、ページスキャンが頻繁に走る時はpageoutデーモン(*)のCPU使用率が上がっていく。

(*) pageoutデーモンはカーネル空間で動作する。メモリの内容をディスクに書き込み、開放できるメモリを探す。また、空きメモリの量が少なくなると頻繁に動作するようになるのでCPU使用率が高くなる。同時にページング、スワッピングも多発するのでディスクへの負荷も高くなる。

sar -rにて空きメモリの量を確認する。
% sar -r -s 18:20 -e 18:45

18:20:00 freemem freeswap
18:25:00    6100   874104
18:30:00    6180   875292
18:35:00      57   206538
18:40:00      59   205894
18:45:00     196   210687

→ freememの結果で18:35:00から多くのメモリが消費されていることがわかる。

どのプロセスがメモリを多く使用しているか確認する。
% prstat
PID USERNAME  SIZE   RSS STATE  PRI NICE     TIME  CPU PROCESS/NLWP
522 user1     411M   85M sleep   44    0  0:00.03 2.6% sample/1
478 user1    2424K  960K sleep   58    0  0:00.00 0.1% test.sh/1
 67 root     2328K 1320K sleep   31    0  0:00.00 0.0% picld/8

→ SIZEの結果から、sampleプロセスが仮想記憶領域を411MB使用していることが確認できる。

プロセス情報の確認方法

解析ではプロセスの確認をおこなうためにps/prstatコマンドを実行しているが、この場合は現在起動中のプロセス情報が表示されるため後でどのプロセスがメモリやCPUを消費していたのかを確認することができない。

そのため後からプロセスを特定するには事前にアカウンティングの設定が必要になる。

アカウンティングの設定を行うと、いつ、誰が、どのプロセスを起動し、そのプロセスがどれだけメモリやCPUを使用したかを確認することができる。

原因

sampleプロセスが多くのメモリを使用していた。

sar -qコマンドのswpq-szの値からスワップアウトされたプロセスも多数あり、sar -gマンドのpgscan/sの値からメモリ不足に陥っている。

このことからsar -uコマンドの%sysの値が高いのは他にCPUを多く使用しているプロセスが存在するのではなく、メモリ不足が原因でCPUが多く使われていることがわかる。

対策

メモリが一番使われている時間では他のプロセスが使用できるメモリの残りは僅かである。

この時間帯に他のプロセスを動作させる必要がある場合はswapデバイスを足して使用できるメモリを増やす。

しかし、swapデバイスを追加してもsampleプロセスが多くのメモリを消費するのでシステムの仮想メモリは不足する。

そのためpageoutデーモンによるスキャンが頻繁に行われるためpageoutデーモンのCPU使用率は変わらずシステムのCPU使用率も高いまま変わらない。

pageoutデーモンのスキャン動作を押さえる場合はメモリの増設を検討する必要がある。

結果

swapデバイスを追加した場合は使用できるメモリが増える。

sampleプロセスが多くのメモリを消費しても追加した分のメモリが残っているため他のプロセスもメモリを使用することができる。

また、システムにメモリを増設した場合はpageoutデーモンのスキャン頻度が減りシステムのCPU使用率も低くなる。

おわりに

システムの性能を向上させるためには一部のデータから判断するのではなく、システム全体のパフォーマンス状態を把握し問題となる部分を見つけだす必要がある。

sar、iostat、prstatコマンド等のコマンドを駆使し、より効率的にパフォーマンスに関する問題を解決していきたい。

2008/4/8更新

対応バージョン: 10

voldではCD-ROM、フロッピーディスク、USBストレージといったリムーバブルメディアを管理しているが、/etc/vold.confを編集することによって特定のメディアタイプをvold制御下から外すことができる。

例えばUSBストレージをvold制御下から外す場合は以下のようにする。

vold停止

# svcadm disable volfs

/etc/vold.conf修正

以下の行をコメントアウト

use rmdisk drive /dev/rdsk/c*s2 dev_rmdisk.so rmdisk%d

vold開始

# svcadm enable volfs

2008/4/8更新

対応バージョン: 10

リムーバブルメディアサービスの有効にするには以下のようにする。

# svcadm enable volfs

これによりvoldデーモンが開始する。

また、リムーバブルメディアサービスの無効にするには以下のようにする。

# svcadm disable volfs

これによりvoldデーモンが停止する。

2009/3/18更新

対応バージョン: 10

Solaris 10 5/08以降のリリースにはデフォルトでVNCサーバの機能が組み込まれているので以下の手順で設定する。

/etc/services編集

以下のエントリを追加する。

vnc-server      5900/tcp                        # VNC Server

リモートログイン有効化

# vi /etc/X11/gdm/gdm.conf
:
[xdmcp]
:
Enable=false ← trueに変更
:

# svcadm enable gdm2-login

サービス有効化

# svcadm enable xvnc-inetd

これによりTCPの5900番ポートが開き、同ポートにアクセスするとinetd経由でVNCサーバが起動する。

関連資料・記事

2007/7/29更新

対応バージョン: 8

/etc/groupの一行の長さが512バイトを越えているとuseraddは失敗するのでエディタで直接/etc/groupを編集して当該アカウントを必要なグループに追加する。

尚、グループ追加以外の処理は成功しているので、改めてuseraddを実行する必要はない。

2008/9/8更新

対応バージョン: 10

useraddで使用される各種設定のデフォルト値は/usr/sadm/defadduserに格納されている。

このファイルはOSインストール時点では存在せず、初めてuseraddを実行すると作成される。

ファイルの内容は以下のようになっているが、「useradd -D」でも参照できる。

# cat /usr/sadm/defadduser
defgroup=1
defgname=other
defparent=/home
defskel=/etc/skel
defshell=/bin/sh
definact=0
defexpire=
defauthorization=
defrole=
defprofile=
defproj=3
defprojname=default
deflimitpriv=
defdefaultpriv=
deflock_after_retries=

# useradd -D
group=other,1  project=default,3  basedir=/home  
skel=/etc/skel  shell=/bin/sh  inactive=0  
expire=  auths=  profiles=  roles=  limitpriv=  
defaultpriv=  lock_after_retries=  

それぞれのパラメータの意味(*)と、useraddやusermod実行時にデフォルトの設定を上書きする際のオプションを以下に示す。

また「useradd -D <オプション>」によりdefadduserそのものを上書きすることができる。

(*) 最後の3パラメータは不明。

defgroup=<グループID>

-g

defgname=<グループ名>

-g

defparent=<ホームディレクトリトップ>

-b

例)

# useradd -D -b /Users
group=other,1  project=default,3  basedir=/Users  
skel=/etc/skel  shell=/bin/sh  inactive=0  
expire=  auths=  profiles=  roles=  limitpriv=  
defaultpriv=  lock_after_retries=  

defskel=<スケルトンディレクトリ>

-k

シェル環境設定ファイルのスケルトン(雛形)が格納されているディレクトリ

defshell=<ログインシェル>

-s

definact=<アカウントロック対象未使用日数>

-f

ここで指定した期間アカウントが使用されないとそのアカウントがロックされる。

0でロック日数をカウントしない(無期限使用可能)。

defexpire=<アカウント失効日時>

-e

アカウントが失効する日時を指定する。フォーマットは/etc/datemskで定義されているものが利用できる。

nullで無期限使用可能。

例)

# usermod -e "12/31/2008" foo

defauthorization=<認証方式,認証方式,...>

-A

認証方式をカンマで区切って複数指定できる。

認証方式の一覧は/etc/security/auth_attrに定義されている。

設定された情報は/etc/user_attrに書き込まれる。

例)

# usermod -A solaris.smf.value.postgres foo

# cat /etc/user_attr
:
foo::::type=normal;auths=solaris.smf.value.postgres

defrole=<ロール,ロール,...>

-R

ロールをカンマで区切って複数指定できる。

ロールの一覧は/etc/user_attrの「type=role」エントリで確認できる。

# grep "type=role" /etc/user_attr
postgres::::type=role;profiles=Postgres Administration,All

設定された情報は同じく/etc/user_attrに書き込まれる。

例)

# usermod -R postgres foo

# cat /etc/user_attr
:
foo::::type=normal;roles=postgres

defprofile=<プロファイル>

-P

プロファイルをカンマで区切って複数指定できる。

プロファイルの一覧は/etc/security/prof_attrに定義されている。

設定された情報は/etc/user_attrに書き込まれる。またprofilesコマンドでも確認できる。

例)

# usermod -P "Crypto Management" foo

# cat /etc/user_attr
:
foo::::type=normal;profiles=Crypto Management

# profiles foo
Crypto Management
:

defproj=<プロジェクト番号>

-p

アカウントが所属するプロジェクトの番号を指定する。

プロジェクトは/etc/projectに定義されている。

例)

# usermod -p 2 foo

defprojname=<プロジェクト名>

上記defprojと同様。

deflimitpriv=

不明

defdefaultpriv=

不明

deflock_after_retries=

不明

関連資料・記事

2008/3/13更新

対応バージョン: 8,9,10

新規ユーザ作成の手順は、まずgroupaddコマンドによりグループを作成し、useraddコマンドを使用してユーザを作成する。

ここでは例として以下のようなユーザを作成する。他にも様々なパラメータがあるが割愛する。

アカウント (UID)

foo (100)

グループ

user (100)

ホームディレクトリ

/Users/foo

ログインシェル

/bin/bash

グループ作成

# groupadd -g 100 user

ユーザ作成

# mkdir /Users

# useradd -u 100 -g user -d /Users/foo -s /bin/bash -m foo

# passwd foo
New Password: *****
Re-enter new Password: *****
passwd: password successfully changed for foo

ホームディレクトリに/etc/skel配下のスケルトンファイルがコピーされる。

local.cshrc
local.login
local.profile

不要であれば削除してよい。

関連資料・記事

2008/2/15更新

対応バージョン: 8

Solaris付属のtarコマンドには以下の制約があり、全てを満たさないとエラーになる。

ファイル名の長さは100文字まで
(ファイル名を含む)パス全体の長さは255文字まで
パス名の接頭辞は155文字まで
ファイルサイズは8GBまで

この制約を解除するには-Eオプションを付けてtarを実行する。

% tar cvfE foo.tar big long wide

ただしこのオプションにより拡張ヘッダ付でtarファイルが作成されるので、他OS等の同オプションをサポートしないtarでは展開できない。

2008/1/16更新

対応バージョン: 8

テープデバイスを操作しようとすると/var/adm/messagesに以下のエラーが出力される。

scsi: WARNING: /pci@1f,4000/scsi@4/st@1,0 (st29):
      Error for Command: rezero/rewind     Error Level: Fatal
scsi: Requested Block: 0         Error Block: 0
scsi: Vendor: QUANTUM            Serial Number:  ;
scsi: Sense Key: Hardware Error
scsi: ASC: 0x15 (<vendor unique code 0x15>), ASCQ: 0x1, FRU: 0x0

エラーとしては、巻き戻しなどのテープ操作ができない状態になっている。

このような場合は以下の原因が考えられる。

メディアの問題

メディア不良
テープが最終位置まで到達していてこれ以上テープ送りができない

メディアの問題の場合、別のメディアに交換すれば解決する。

デバイスの問題

ドライブ不良
スロット不良(ロボットタイプの場合)
ロボットアーム不良(ロボットタイプの場合)

デバイスの問題の場合、対象となるコンポーネントあるいは筐体そのものを交換する必要がある。

2007/7/29更新

対応バージョン: 8

テープデバイスのモードには記録密度/制御方法などによって以下のような種類がある。

記録密度

l ... low density (低密度)
m ... medium density(中密度)
h ... high density (高密度)
u ... ultra density (超高密度)

制御

c ... compressed(圧縮)
n ... 巻戻しなし

互換モード

b ... BSD互換

密度指定(l,m,h,u)と圧縮指定(c)の違いは、それを使うデバイスドライバによって動作が異なる。

例えば1/2"リールテープデバイスの場合、モードによる動作の違いは以下のようになる。

l ... 800 BPI
m ... 1600 BPI
h ... 6250 BPI
c ... 圧縮

また、DAT、DLTの場合はそれぞれ以下のようになる。

DAT

l ... 標準
m,h,c ... 圧縮
u ... 使用しない

DLT

TypeIII(356m)
l ... 標準(10GB)
m ... 圧縮(20GB)
h ... 標準(10GB)
u ... 圧縮(20GB)
c ... 圧縮(20GB)
TypeIIIxt(541m)
l ... 標準(15GB)
m ... 圧縮(30GB)
h ... 標準(15GB)
u ... 圧縮(30GB)
c ... 圧縮(30GB)
TypeIV - DLT4000(541m)
l ... 標準(20GB)
m ... 圧縮(40GB)
h ... 標準(20GB)
u ... 圧縮(40GB)
c ... 圧縮(40GB)
TypeIV - DLT7000(541m)
l ... 標準(20GB)
m ... 圧縮(40GB)
h ... 標準(35GB)
u ... 圧縮(70GB)
c ... 圧縮(70GB)
TypeIV - DLT8000(541m)
l ... 標準(35GB)
m ... 圧縮(70GB)
h ... 標準(40GB)
u ... 圧縮(80GB)
c ... 圧縮(80GB)

2007/7/29更新

対応バージョン: 8

ssaadmコマンドを使用する。

例) Sun DLT8000の場合

# /usr/sbin/ssaadm inq /dev/rmt/1

/dev/rmt/1: inquiry
Removable media:            yes
Device type:                1
ISO version:                0
ECMA version:               0
ANSI version:               2
Async event notification:   no
Terminate i/o process msg:  no
Response data format:       2
Additional length:          51
Relative addressing:        no
32 bit transfers:           no
16 bit transfers:           yes
Synchronous transfers:      yes
Linked commands:            yes
Command queueing:           no
Soft reset option:          no
Vendor:                     QUANTUM
Product:                    DLT8000
Revision:                   023B

2007/7/29更新

対応バージョン: 8

syslog.confはパラメータ間をタブで区切る必要があるが、スペースで区切っているとこのようなエラーが出る。

2008/2/29更新

対応バージョン: 8

通常syslogは特別なイベントが発生しない限りログを出力しないが、-mオプション付でsyslogdを起動することによって一定期間毎にログを出力することができる。

これはsyslog.confが正常に動作しているか調べるのに役立つ。

設定はまず/etc/syslog.confに以下の設定を追加する。

mark.debug      /var/adm/messages

次に/etc/init.d/syslogを以下のように変更し、syslogdを再起動する。

(変更前)

/usr/sbin/syslogd >/dev/msglog 2>&1 &

(変更後)

/usr/sbin/syslogd -m 60 >/dev/msglog 2>&1 & ← -mオプションとログ出力間隔(分)を指定

上記の設定の場合、messagesには以下のようなメッセージが60分おきに出力される。

Feb 29 02:25:30 host1 -- MARK --

2008/3/10更新

対応バージョン: 8,9,10

Solaris8以降の/var/adm/messagesには今までのバージョンに対して[ID 142 auth.crit]といった情報が付加される。

この情報は「message ID」と呼ばれるが、これを出力させないようにするには/kernel/drv/log.confに以下の設定を追加してマシンをリブートする。

name="log" parent="pseudo" instance=0;

msgid=0; ← 追加(最後にセミコロンを忘れないこと)

2007/7/29更新

対応バージョン: 8

/tmpがいっぱいになった。

/tmpは仮想メモリ領域を使用しているため、ファイルシステムの容量ではなく同領域の容量までしかファイルを作成できない。

/tmp配下に大量のファイルを作成する必要がある場合、仮想メモリ領域を増やして対応する。

関連資料・記事

2007/7/29更新

対応バージョン: 8

メッセージ中の括弧内のコマンド(この場合はmyprog)を実行中に仮想メモリ(swap)領域を使い果たした。

メモリを不必要に大量消費するバグがあればそれを修正すればよいが、適切な量のメモリを使用している場合は以下のいずれか(あるいは両方)の対応が必要となる。

仮想メモリ領域の追加
物理メモリの追加

関連資料・記事

2007/7/29更新

対応バージョン: 8

拡張/縮小それぞれ以下の手順で作業する。

swap領域を拡張する

現状把握

例) DiskSuiteを用いてd0をファイルシステム、d1をswap領域に使用している場合

# df -k
Filesystem        kbytes     used     avail  capacity  Mounted on
/dev/md/dsk/d0  69529978  7486248  61348431       11%  /
:
swap             2589272       32   2589240        1%  /var/run
swap             2594096     4856   2589240        1%  /tmp

# swap -l
swapfile             dev  swaplo blocks   free
/dev/md/dsk/d1      85,1      16 2106416 2106416

# swap -s
total: 31592k bytes allocated + 12208k reserved = 43800k used, 2591264k available

mkfileコマンドにてswapデバイスを作成

例) 2GBのswapデバイスを作成する場合

# mkfile 2048M /var/swap1

swapデバイスを有効化

# swap -a /var/swap1

# swap -l
swapfile             dev  swaplo blocks   free
/dev/md/dsk/d1      85,1      16 2106416 2106416
/var/swap1            -       16 4194288 4194288 ← 追加された

# swap -s
total: 31488k bytes allocated + 12312k reserved = 43800k used, 4688088k available

OSブート時に有効化する場合の設定

# vi /etc/vfstab

(swapエントリの前行に以下の設定を追加する)

/var/swap1     -   -     swap   -  no   -

swap領域を縮小する

swapデバイスを切り離す

# swap -d /var/swap1
# rm /var/swap1

/etc/vfstabからswapデバイスのエントリを削除

# vi /etc/vfstab
:

2008/1/16更新

対応バージョン: 8

指定したファイル中に現在使用しているLANG以外の文字コードが含まれている。

例えばUTF-8環境においてSJISの文字コードを含むファイルをsortしようとするとこのエラーが出る。

% locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_ALL=ja_JP.UTF-8

% sort foo
sort: missing NEWLINE added at end of input file foo
sort: foo を読み取れません。: バイトシーケンスが正しくありません。

対処としては以下の2通りの方法がある。

1. LANGを対象ファイルと同じ文字コードにする

例) 対象ファイルがSJISの場合

% setenv LANG ja_JP.PCK
% setenv LC_ALL ja_JP.PCK
% locale
LANG=ja_JP.PCK
LC_CTYPE="ja_JP.PCK"
LC_NUMERIC="ja_JP.PCK"
LC_TIME="ja_JP.PCK"
LC_COLLATE="ja_JP.PCK"
LC_MONETARY="ja_JP.PCK"
LC_MESSAGES="ja_JP.PCK"
LC_ALL=ja_JP.PCK

% sort foo > bar

2. 対象ファイルをLANGと同じ文字コードにする

例) LANGがUTF-8の場合

% mv foo foo.org
% iconv -f SJIS -t UTF-8 foo.org > foo
% sort foo > bar

関連資料・記事

2009/2/28更新

対応バージョン: 10

snoopコマンドの-iオプションで入力ファイルを指定し、-pオプションで対象パケット番号を指定し、-oオプションで出力ファイルを指定する。

例えば2139パケット分が記録されているsnoopファイルを1000パケット毎に分割するには以下のようにする。

% snoop -i snoop.out -p 1,1000 -o snoop1.out
1000
% snoop -i snoop.out -p 1001,2000 -o snoop2.out
1000
% snoop -i snoop.out -p 2001,9999 -o snoop3.out
139

分割後のファイルを使って例えばUDPパケットだけ取り出すには以下のようにする。

% snoop -i snoop1.out -o snoop1.udp udp
3
% snoop -i snoop1.udp
1  0.00000 192.168.1.3 -> 192.168.1.255 NBT Datagram Service Type=17 Source=HASHIDUMEA02[20]
2 35.31072     client1 -> server1  NTP client [st=9] (2009-02-28 02:00:03.43362)
3  0.00033     server1 -> client1  NTP server [st=8] (2009-02-28 02:00:03.40429)

関連資料・記事

2007/7/29更新

対応バージョン: 9

Solaris 9標準のSNMPエージェントであるsnmpdxがサポートするSNMPのバージョンは1なので、それ以外のバージョン(2c,3)のうちバージョン2cのコマンドを受けると上記のメッセージを出力してそのリクエストが失敗する。

バージョン3のコマンドはメッセージは出力しないもののやはりリクエストは失敗する。

2010/2/12更新

対応バージョン: 10

rshでコマンドを指定した場合と省略した場合でリモートホスト側で必要なサービスが異なる。

コマンド指定

/network/shell:default

コマンド省略

/network/login:rlogin (リモートログイン)

したがって/network/login:rloginサービスを起動すればよい。

# svcadm enable -r /network/login:rlogin

(*) -rオプション付で依存関係にあるサービスも起動

関連資料・記事

2008/9/18更新

対応バージョン: 10

Solaris10ではサービス管理の機構としてSMF(Service Management Facility)が採用されている。

個々のサービスの起動/停止スクリプトは従来の/etc/rc*.d配下ではなく/lib/svc/method配下に置かれ、svc.startd(マスターリスタータデーモン)によって制御される。

サービスの型や依存関係などを記したXML形式のマニフェストは/var/svc/manifest配下のグループ別ディレクトリに置かれ、svc.configd(リポジトリデーモン)によって参照/変更される。

ログは/var/svc/log配下にサービス毎に出力される。

管理コマンド

SMFの管理コマンドにはサービス全体の管理を行うsvcsと個々のサービスの制御を行うsvcadmがある。以下、それぞれ説明する。

svcs

サービスの一覧表示
# svcs -a
STATE       STIME    FMRI
legacy_run   8月_07 lrc:/etc/rcS_d/S50sk98sol
legacy_run   8月_07 lrc:/etc/rc2_d/S10lu
:
disabled     8月_07 svc:/system/metainit:default
disabled     8月_07 svc:/network/iscsi_initiator:default
:
online       8月_07 svc:/system/svc/restarter:default
online       8月_07 svc:/network/pfil:default
:
実行されていないサービスの一覧
# svcs -x
svc:/application/print/server:default (LP print server)
  State: disabled since Fri Aug 8 00:34:11 2008
 Reason: Disabled by an administrator.
    See: http://sun.com/msg/SMF-8000-05
    See: lpsched(1M)
 Impact: 2 dependent services are not running.  (Use -v for list.)
他のサービスに依存するサービスの一覧
# svcs -l <サービス>

例) nfs.serverの依存関係

# svcs -l network/nfs/server
fmri         svc:/network/nfs/server:default
name         NFS server
有効         true (temporary)
状態         online
next_state   none
state_time   2008年11月14日 21時31分33秒
logfile      /var/svc/log/network-nfs-server:default.log
リスタータ   svc:/system/svc/restarter:default
contract_id  92 
dependency   require_any/error svc:/milestone/network (online)
dependency   require_all/error svc:/network/nfs/nlockmgr (online)
dependency   optional_all/error svc:/network/nfs/mapid (online)
dependency   require_all/restart svc:/network/rpc/bind (online)
dependency   optional_all/none svc:/network/rpc/keyserv (disabled)
dependency   optional_all/none svc:/network/rpc/gss (online)
dependency   require_all/error svc:/system/filesystem/local (online)
ランレベルに依存するサービスの一覧
# svcs -D <サービス>

例) sshdの依存関係

# svcs -D network/ssh:default
STATE       STIME    FMRI
online       8月_07 svc:/milestone/multi-user-server:default

上記の例では当該サービスはマルチユーザになっていなければならないことが分かる。

svcadm

サービス起動
# svcadm enable [-rst] <サービス>

オプションの意味は以下のとおり。

・オプションなし(デフォルト)

OSリブート後もこの設定を有効にする。

・-r

指定したサービスに依存するサービスを再帰的に有効にする。

・-s

指定したサービスを有効にし、状態がonlineかdegradedになるまで待つ。

・-t

指定したサービスを一時的に有効にするが、OSリブートにて元の設定に戻る。

サービス停止
# svcadm disable [-st] <サービス>

例)

# svcs network/smtp:sendmail
STATE          STIME    FMRI
online         17:09:19 svc:/network/smtp:sendmail

# svcadm disable -t network/smtp:sendmail

# svcs network/smtp:sendmail
STATE          STIME    FMRI
disabled       17:09:19 svc:/network/smtp:sendmail
サービス再起動
# svcadm restart <サービス>
サービス状態更新
# svcadm refresh <サービス>
サービス状態変更
# svcadm mark [-It] <状態> <サービス>

-Iオプションは即時(immediate)指定である。

<状態>は以下のどちらかを指定する。

・maintenance

サービスを停止し、メンテナンスモードにする。

・degraded

サービスを信頼性低下モードにする。

例)

# svcadm mark -It maintenance network/smtp:sendmail

# svcs network/smtp:sendmail
STATE          STIME    FMRI
maintenance    17:34:27 svc:/network/smtp:sendmail
サービス状態クリア
 
# svcadm clear <サービス>

maintenance状態のサービスに対しては、サービスが修復されたことをリスタータデーモンに通知する。

degraded状態のサービスに対しては、サービスをonlineにするようリスタータデーモンに通知する。

サービスが上記以外の状態の場合、このコマンドは無視される。

2007/11/20更新

対応バージョン: 8

以下のような原因が考えられる。

物理的な接続

端末同士がRS-232Cのストレートケーブルで接続されている。

DTE(端末)とDTEの接続には両者をリバース(クロス)ケーブルで接続する必要がある。

OS上の設定

使用するポートがポートモニタの制御から切り離されていない。
接続先端末とシリアルポートの設定(ボーレート等)が合っていない。

関連資料・記事

2008/5/29更新

対応バージョン: 10

Solarisマシン(SPARC/x86)のシリアルポートはttymonポートモニタの制御下にある。この制御を行うにはsacadmコマンドを使用する。

以下、主な使用方法について説明する。

状態表示

例)

# sacadm -l
PMTAG PMTYPE FLGS RCNT STATUS  COMMAND
zsmon ttymon -    0    ENABLED /usr/lib/saf/ttymon #TTY Ports a & b

各項目の意味は以下のとおり。

PMTAG

ポートモニタ名

PMTYPE

ポートモニタのタイプ

FLGS

d : 新しいポートモニタを有効にする

x : 新しいポートモニタを起動しない

- : フラグ未設定

RCNT

戻りカウント値

0の戻りカウントはポートモニタが失敗した場合でも再起動しないことを示す

STATUS

ポートモニタの現在の状態

COMMAND

ポートモニタを起動するコマンド

その他

#に続いて当該ポートモニタの説明文(コメント)を記述

ポートモニタ停止/起動

停止
# sacadm -k -p zsmon
# sacadm -l
PMTAG PMTYPE FLGS RCNT STATUS     COMMAND
zsmon ttymon -    0    NOTRUNNING /usr/lib/saf/ttymon #TTY Ports a & b
起動
# sacadm -s -p zsmon
# sacadm -l
PMTAG PMTYPE FLGS RCNT STATUS     COMMAND
zsmon ttymon -    0    STARTING   /usr/lib/saf/ttymon #TTY Ports a & b

(*) しばらく待っているとSTATUSがENABLEDになる。

ポートモニタ無効化/有効化

無効化
# sacadm -d -p zsmon
# sacadm -l
PMTAG PMTYPE FLGS RCNT STATUS     COMMAND
zsmon ttymon -    0    DISABLED   /usr/lib/saf/ttymon #TTY Ports a & b
有効化
# sacadm -e -p zsmon
# sacadm -l
PMTAG PMTYPE FLGS RCNT STATUS     COMMAND
zsmon ttymon -    0    ENABLED    /usr/lib/saf/ttymon #TTY Ports a & b

ポートモニタ削除/追加

削除
# sacadm -r -p zsmon
# sacadm -l
No port monitors defined
追加
# sacadm -a -p zsmon -t ttymon -c /usr/lib/saf/ttymon -v `ttyadm -V` -y "TTY Ports a & b"
# sacadm -l
PMTAG PMTYPE FLGS RCNT STATUS     COMMAND
zsmon ttymon -    0    STARTING   /usr/lib/saf/ttymon #TTY Ports a & b

(*) しばらく待っているとSTATUSがENABLEDになる。

関連資料・記事

2007/11/20更新

対応バージョン: 8

シリアルポートの制御をポートモニタから切り離す

Sunのマシンのシリアルポートは通常A/Bの2ポートがあるが、両ポートともttymonポートモニタの制御下にあるので、まずpmadmコマンドを用いて使用したいポートをこの制御から切り離す。

現状のポートモニタの状態を表示するとttya(Aポート)とttyb(Bポート)がポートモニタの制御下にある。

# pmadm -l
PMTAG PMTYPE SVCTAG FLGS ID   <PMSPECIFIC>
zsmon ttymon ttya   u    root /dev/term/a I - /usr/bin/login - 9600 ldterm,ttcompat ttya login:  - tvi925 y  #
zsmon ttymon ttyb   u    root /dev/term/b I - /usr/bin/login - 9600 ldterm,ttcompat ttyb login:  - tvi925 y  #

この状態からここではttybをポートモニタから切り離す。

# pmadm -r -p zsmon -s ttyb
# pmadm -l
PMTAG PMTYPE SVCTAG FLGS ID   <PMSPECIFIC>
zsmon ttymon ttya   u    root /dev/term/a I - /usr/bin/login - 9600 ldterm,ttcompat ttya login:  - tvi925 y  #

この作業により、/etc/saf/zsmon/_pmtabからttybのエントリが削除される。

シリアルポートの設定

次に/etc/remoteを編集して接続先端末と設定を合わせた接続用エントリを作成する。

最低限ボーレートのみ設定すればよいので、ここではBポートを9600bpsの設定にする。

# vi /etc/remote
:
cuab:dv=/dev/cua/b:br#9600
:

接続

最後に実際にシリアルポート経由で別端末に接続する。

# tip cuab
Connect ← 接続

接続を解除するには[~]+[.]を入力する。

関連資料・記事

2008/3/26更新

対応バージョン: 10

上記以外に「sendmail: My unqualified host name (xxxxx) unknown; sleeping for retry」というエラーが出る場合もある。

両者ともsendmailが自身のホスト名としてFQDNを検索したがそれが得られなかったことが原因である。

/etc/inet/hosts(*)にFQDNを記述することでエラーは出なくなるが、ホストがドメインに属しているかどうかで記述方法が異なる。

ドメインに属している場合

通常のFQDNを記述する。

例) ホスト名がhost1、ドメイン名がbar.com

192.168.0.1  host1  host1.bar.com

ドメインに属していない場合

FQDNの代わりにホスト名に「.local」を付加する。

例) ホスト名がhost1

192.168.0.1  host1  host1.local

(*) ホスト情報を記述したファイルとして/etc/inet/hostsの他に同ファイルにシンボリックリンクを張った/etc/inet/ipnodesも存在するが、OSのリビジョンによってはipnodesがhostsにシンボリックリンクされていない場合があり、その場合はipnodesも同様に修正する。

関連資料・記事

2007/7/29更新

対応バージョン: 9

標準のsed(/bin/sed)ではなく/usr/xpg4/bin/sedを使用すれば、エラーは出るものの処理は行われる。

% /usr/xpg4/bin/sed <変換パターン> <対象ファイル>
sed: <対象ファイル> ファイルの終わりに復帰改行がありません。

2007/11/27更新

対応バージョン: 8

SAFは以下の順番で動作し、対象となるポートを監視する。

1. initプロセスが/etc/inittabの記述に従ってSAFのマスタプロセスであるsac(service access controler)を起動する。

sc:234:respawn:/usr/lib/saf/sac -t 300

2. sacが/etc/saf/_sactabの記述に従ってポートモニタを起動する。

# VERSION=1

zsmon:ttymon::0:/usr/lib/saf/ttymon     # 

ポートモニタは監視するポートの種類毎に1つ起動される。

ポートにはシリアルポート(ttymonが管理)とネットワークポート(listenが管理)があるが、後者は通常inetdが管理するため上記の_sactabのように事実上ttymonのみが動作する。

# ps -ef|grep saf
root  336   1 ... /usr/lib/saf/sac -t 300
root 8771 336 ... /usr/lib/saf/ttymon

# sacadm -l
PMTAG  PMTYPE  FLGS RCNT STATUS   COMMAND
zsmon  ttymon  -    0    ENABLED  /usr/lib/saf/ttymon # 

3. ttymonが/etc/saf/<ポートモニタタグ>/_pmtabの記述に従って必要なポートを監視する。

# VERSION=1
ttya:u:root:reserved:reserved:reserved:/dev/term/a:I::/usr/bin/login::9600:ldterm,ttcompat:ttya login\: ::tvi925:y:# 
ttyb:u:root:reserved:reserved:reserved:/dev/term/b:I::/usr/bin/login::9600:ldterm,ttcompat:ttyb login\: ::tvi925:y:# 

SunのマシンにはRS-232Cポートが通常2個備わっているので以下のように2つのポートが監視対象となる。

# pmadm -l
PMTAG PMTYPE SVCTAG FLGS ID   <PMSPECIFIC>
zsmon ttymon ttya   u    root /dev/term/a I - /usr/bin/login - 9600 ldterm,ttcompat ttya login:  - tvi925 y  # 
zsmon ttymon ttyb   u    root /dev/term/b I - /usr/bin/login - 9600 ldterm,ttcompat ttyb login:  - tvi925 y  # 

4. /etc/inittabの記述に従ってinitプロセスがコンソール監視用プロセスとしてttymonを起動する。

co:234:respawn:/usr/lib/saf/ttymon -g -h -p "`uname -n` console login: " \
-T sun -d /dev/console -l console -m ldterm,ttcompat

5. 4.によりコンソールからのログインサービスが、inetdによりネットワークからのログインサービスがそれぞれ開始される。

関連資料・記事

2007/7/29更新

対応バージョン: 10

psrinfo、uptimeコマンドを使用する。

# psrinfo
0       on-line   since 05/18/2007 17:48:34
1       on-line   since 05/18/2007 17:48:34

# uptime
  6:00pm  up  7:30,  2 users,  load average: 0.02, 0.02, 0.02

2007/7/29更新

対応バージョン: 8,9

デフォルトルートは/etc/defaultrouterに設定すればよいが、スタティックルートは設定ファイルが存在しないのでinitスクリプト等でrouteコマンドを記述する必要がある。

通常は/etc/rc2.d/S69inetに記述する。

例) 172.20.61.0/24宛のゲートウェイを192.168.253.1に設定する場合

initスクリプト修正

# cd /etc/rc2.d
# cp -p S69inet _S69inet.org
# vi S69inet

再終行に以下の内容を追加

/usr/sbin/route add net 172.20.61.0/24 192.168.253.1

マシンリブート

確認

# netstat -nrv

IRE Table: IPv4
 Destination Mask          Gateway       Device Mxfrg Rtt Ref Flg Out In/Fwd
 ----------- ------------- ------------- ------ ----- --- --- --- --- ------
 :
 172.20.61.0 255.255.255.0 192.168.253.1 bge0   1500*   0   1 U   104      0
 :

関連資料・記事

2007/7/29更新

対応バージョン: 8,9,10

以下の手順で設定する。

# echo "XXX.XXX.XXX.XXX" > /etc/defaultrouter

# route add default `cat /etc/defaultrouter`
add net default: gateway XXX.XXX.XXX.XXX

# netstat -nr
Routing Table: IPv4
Destination Gateway         Flags Ref Use Interface
----------- --------------- ----- --- --- ---------
:
default     XXX.XXX.XXX.XXX    UG   1   0

関連資料・記事

2007/7/29更新

対応バージョン: 8

リモートホスト側の.bashrcや.cshrc等でsttyを実行している部分を変更する。

(変更前)

stty erase '^H'

(変更後)

tty -s && stty erase '^H'

2008/5/9更新

対応バージョン: 10

sudoはOS標準では使用できないが、RBAC(Role-Based Access Control)を用いることによって同様の制御が可能になる。

例えば一般ユーザfooにroot権限でpfilesコマンドの実行を許可する場合には以下のような手順でRBACを設定する。

権利プロファイル作成

pfilesに対して任意の名前(権利プロファイル)を付ける。

# cd /etc/security
# cp -p prof_attr prof_attr.org (必要に応じてバックアップ)
# vi prof_attr
:
Pfiles::::

権利設定

上記で作成した権利プロファイルに対して具体的な権利(pfiles実行)を設定する。

# cp -p exec_attr exec_attr.org (必要に応じてバックアップ)
# vi exec_attr
:
Pfiles:suser:cmd:::/usr/bin/pfiles:privs=All

ロールユーザ作成

上記で設定した権利を割り当てるロールユーザを作成する。ここではpuserというロールユーザを作成する。

# roleadd -d /export/home/puser -m -P "Pfiles",All puser
64 ブロック

# passwd puser
新しいパスワード: *****
新しいパスワードを再入力してください: *****
passwd: puser のパスワードが変更されました

-dオプションや-mオプションなどは通常のuseraddコマンドと同じ。

-Pオプションにより権利プロファイル名を指定する。

roleaddで作成したユーザ情報は通常の/etc/passwd,/etc/shadowの他に以下の書式で/etc/user_attrに追加される。

puser::::type=role;profiles=Pfiles,All

ロールユーザの実ユーザ割当

作成したロールユーザを実ユーザと結びつける。これにより実ユーザはそのロールユーザが持つ権利を行使できるようになる。

# usermod -R puser foo

/etc/user_attrファイルには以下の内容が追加される。

foo::::type=normal;roles=puser;defaultpriv=basic,net_rawaccess

動作確認

まず通常の使用方法では権限がないのでエラーになる。

% pfiles 493
pfiles: permission denied: 493

ここでロールユーザにスイッチして同様のコマンドを実行すると今度はエラーにならない。

% su - puser
% pfiles 493
493:    /usr/lib/ssh/sshd
 Current rlimit: 256 file descriptors
  0: S_IFCHR mode:0666 dev:274,0 ino:6815752 uid:0 gid:3 rdev:13,2
     O_RDWR|O_LARGEFILE
     /devices/pseudo/mm@0:null
  1: S_IFCHR mode:0666 dev:274,0 ino:6815752 uid:0 gid:3 rdev:13,2
     O_RDWR|O_LARGEFILE
     /devices/pseudo/mm@0:null
  2: S_IFCHR mode:0666 dev:274,0 ino:6815752 uid:0 gid:3 rdev:13,2
     O_RDWR|O_LARGEFILE
     /devices/pseudo/mm@0:null
  3: S_IFSOCK mode:0666 dev:280,0 ino:62950 uid:0 gid:0 size:0
     O_RDWR|O_NONBLOCK
       SOCK_STREAM
       SO_REUSEADDR,SO_SNDBUF(49152),SO_RCVBUF(49152),IP_NEXTHOP(0.192.0.0)
       sockname: AF_INET6 ::  port: 22
  7: S_IFREG mode:0666 dev:275,1 ino:65539 uid:0 gid:0 size:0
     O_RDWR|O_LARGEFILE
     /system/contract/process/template

2009/1/27更新

対応バージョン: 10

動作中のプロセスを一時停止/再開する場合、通常のUNIX環境では対象のプロセスにシグナルSIGSTOP/SIGCONTを送るが、Solarisの場合はそれに加えてpstop/prunコマンドを使用することもできる。

一時停止

例) PIDが123と456のプロセスを一時停止

% pstop 123 456
再開

例) PIDが123と456のプロセスを再開

% prun 123 456
終了待ち

また、pwaitコマンドを使ってプロセスの終了を待つこともできる。

例) PIDが123と456のプロセスが両方終了するまで待つ

% pwait 123 456

2008/7/5更新

対応バージョン: 8,10

Solarisマシンのシステム情報を調べる場合、必要とする情報によって方法が異なるので以下に列挙する。

CPUやメモリ容量、スロット使用状況など

prtdiagを使用する。

(SPARC機での一例)

% /usr/platform/sun4u/sbin/prtdiag -v
System Configuration: Sun Microsystems  sun4u Sun Fire V210
System clock frequency: 167 MHZ
Memory size: 7GB

========================= IO Devices =========================
    Bus  Freq
Brd Type MHz  Slot Name                         Model
--- ---- ---- ---- ---------------------------- --------------
 0  pci   66    MB pci108e,1648 (network)
 0  pci   66    MB pci108e,1648 (network)
 0  pci   33    MB isa/su (serial)
 0  pci   33    MB isa/su (serial)
 0  pci   33    MB pci10b9,5229 (ide)
 0  pci   66    MB scsi-pci1000,21 (scsi-2)
 0  pci   66    MB scsi-pci1000,21 (scsi-2)
 0  pci   66    MB pci108e,1648 (network)
 0  pci   66    MB pci108e,1648 (network)
 0  pci   33     7 isa/rmc-comm-rmc_comm (seria+

==================== Memory Configuration ====================
Segment Table:
------------------------------------------------------------
Base Address    Size   Interleave Factor  Contains
------------------------------------------------------------
0x0             1GB           1           BankIDs 0
0x200020000     2GB           2           BankIDs 1,2
0x1000000000    2GB           2           BankIDs 16,17
0x1200000000    2GB           2           BankIDs 18,19

Bank Table:
-------------------------------------------------------
       Physical Location
ID   ControllerID  GroupID  Size    Interleave Way
---------------------------------------------------
0    0             0        1GB          0
1    0             1        1GB          0,1
2    0             1        1GB
16   1             0        1GB          0,1
17   1             0        1GB
18   1             1        1GB          0,1
19   1             1        1GB

Memory Module Groups:
--------------------------------------------------
ControllerID   GroupID  Labels
--------------------------------------------------
0              0        MB/P0/B0/D0,MB/P0/B0/D1
0              1        MB/P0/B1/D0,MB/P0/B1/D1

Memory Module Groups:
--------------------------------------------------
ControllerID   GroupID  Labels
--------------------------------------------------
1              0        MB/P1/B0/D0,MB/P1/B0/D1
1              1        MB/P1/B1/D0,MB/P1/B1/D1

==================== Environmental Status ====================
Fan Speeds:
-----------------------------------------
Location       Sensor      Status   Speed
-----------------------------------------
MB/P0/F0       RS          okay     16463 rpm
MB/P0/F1       RS          okay     17307 rpm
MB/P1/F0       RS          okay     16071 rpm
MB/P1/F1       RS          okay     17307 rpm
F0             RS          okay     12980 rpm
F1             RS          okay     12980 rpm
F2             RS          okay     13500 rpm
PS0            FF_FAN      okay
F3             RS          okay     12500 rpm
--------------------------------------------------
Led State:
--------------------------------------------------
Location   Led                   State       Color
--------------------------------------------------
MB         ACT                   on          green
MB         SERVICE               off         amber
MB         LOCATE                off         white
PS0        ACT                   on          green
PS0        SERVICE               off         amber
PS0        OK2RM                 off         blue
HDD0       SERVICE               off         amber
HDD0       OK2RM                 off         blue
HDD1       SERVICE               off         amber
HDD1       OK2RM                 off         blue
--------------------------------------------------------------
Temperature sensors:
--------------------------------------------------------------
Location  Sensor     Temperature  Lo  LoWarn HiWarn  Hi Status
--------------------------------------------------------------
MB        T_ENC           25C     -3C   5C    40C   48C okay
MB/P0     T_CORE          60C     -     -     88C   93C okay
MB/P1     T_CORE          51C     -     -     88C   93C okay
PS0       FF_OT           -       -     -     -     -   okay
--------------------------------------------------------------
Voltage sensors:
--------------------------------------------------------------
Location  Sensor     Voltage  Lo   LoWarn  HiWarn  Hi  Status
--------------------------------------------------------------
MB        V_VTT       1.24V   -     1.17V   1.43V  -   okay
MB        V_GBE_+2V5  2.51V   -     2.25V   2.75V  -   okay
MB        V_GBE_CORE  1.21V   -     1.08V   1.32V  -   okay
MB        V_VCCTM     2.53V   -     2.25V   2.75V  -   okay
MB        V_+2V5      2.49V   -     2.34V   2.86V  -   okay
MB        V_+1V5      1.51V   -     1.35V   1.65V  -   okay
MB/BAT    V_BAT       2.98V   -     2.70V     -    -   okay
MB/P0     V_CORE      1.48V   -     1.26V   1.54V  -   okay
MB/P1     V_CORE      1.47V   -     1.26V   1.54V  -   okay
PS0       FF_UV         -     -       -       -    -   okay
PS0       FF_OV         -     -       -       -    -   okay
PS0       P_PWR         -     -       -       -    -   okay
--------------------------------------------------------------
Current sensors:
--------------------------------------------------------------
Location  Sensor     Current  Lo   LoWarn  HiWarn  Hi  Status
--------------------------------------------------------------
MB        FF_SCSI     -       -     -       -      -   okay
PS0       FF_OC       -       -     -       -      -   okay

======== FRU Status =========
-------------------------
Fru Operational Status:
-------------------------
Location        Status   
-------------------------
MB/SC           okay
PS0             okay
HDD0            present
HDD1            present

======================== HW Revisions ========================
ASIC Revisions:
---------------
pci: Rev 4
pci: Rev 4
pci: Rev 4
pci: Rev 4

System PROM revisions:
----------------------
OBP 4.16.2 2004/10/04 18:22 Sun Fire V210/V240,Netra 240
OBDIAG 4.16.2 2004/10/04 18:23

(Intel機での一例)

% /usr/platform/i86pc/sbin/prtdiag -v
System Configuration: Compaq Evo D310 ST
BIOS Configuration: Compaq 686O2 v2.18 09/24/2002

==== Processor Sockets ====================================

Version                          Location Tag
-------------------------------- --------------------------
Pentium(R) 4 processor 1800 MHz  XU1 PROCESSOR

==== Memory Device Sockets ================================

Type    Status Set Device Locator      Bank Locator
------- ------ --- ------------------- --------------------
SDRAM   in use 0   DIMM1               
SDRAM   in use 0   DIMM2               
FLASH   in use 0   SYSTEM ROM          

==== On-Board Devices =====================================

==== Upgradeable Slots ====================================

ID  Status    Type             Description
--- --------- ---------------- ----------------------------
0   available AGP 4X           AGP
1   available PCI              PCI Slot 1
2   available PCI              PCI Slot 2
3   available PCI              PCI Slot 3

マシンのシリアル番号

一部の機種(Sun Enterprise等)ではprtconf,eepromコマンドによりマシンのシリアル番号を調べることができる。

例)

% /usr/sbin/prtconf -vp | grep system-board-serial
      system-board-serial#:  '009M2005'

% /usr/sbin/eeprom | grep system-board-serial
system-board-serial#=009M2005

マシンに搭載されているフレームバッファ

prtconfコマンドの-Fオプションを実行すると現在使用されているデバイスドライバが確認できる。

例えば「m64」の場合は以下のようになる。

% prtconf -F
/pci@1f,0/pci@1,1/SUNW,m64B@2:m640

デバイスファイルは/dev/fbからシンボリックリンクが張られている。

% ls -l /dev/fb
lrwxrwxrwx ... /dev/fb -> /devices/pci@1f,0/pci@1,1/SUNW,m64B@2:m640

また複数のカードが搭載されているような場合は/dev/fbs配下を見ればすべてのフレームバッファの情報が確認できる。

例)

% ls -l /dev/fbs
lrwxrwxrwx ... pfb0  -> ../../devices/pci@1e,600000/SUNW,XVR-100@2:pfb0
lrwxrwxrwx ... pfb0a -> ../../devices/pci@1e,600000/SUNW,XVR-100@2:pfb0a
lrwxrwxrwx ... pfb0b -> ../../devices/pci@1e,600000/SUNW,XVR-100@2:pfb0b
lrwxrwxrwx ... pfb1  -> ../../devices/pci@1d,700000/SUNW,XVR-100@1:pfb1
lrwxrwxrwx ... pfb1a -> ../../devices/pci@1d,700000/SUNW,XVR-100@1:pfb1a
lrwxrwxrwx ... pfb1b -> ../../devices/pci@1d,700000/SUNW,XVR-100@1:pfb1b

その他、代表的なフレームバッファのデバイスドライバを示す。

kfb

XVR-2500

jfb

XVR-1200、XVR-600

gfb

XVR-1000

ifb

XVR-500、Expert3D

nfb

XVR-300

pfb

XVR-100

m64

PGX, PGX64

gfxp

PGX32

ffb

Creator、Creator3D

afb

Elite3D

cgfourteen

SX

leo

ZX

tcx

TCX

cgsix

GX、GXplus、TurboGX

ハードディスクの詳細

prtvtocコマンドを使用する。

例)

# prtvtoc /dev/dsk/c1t0d0s0
* /dev/dsk/c1t0d0s0 partition map
*
* Dimensions:
*     512 bytes/sector ← (1) 1セクタあたりのバイト数
*     424 sectors/track
*      24 tracks/cylinder
*   10176 sectors/cylinder
*   14089 cylinders
*   14087 accessible cylinders
*
* Flags:
*   1: unmountable
*  10: read-only
*
*                       First     Sector    Last
* Partition Tag Flags   Sector     Count    Sector Mount Directory
       0     2   00          0 139146624 139146623  /
       1     3   01  139146624   4202688 143349311
       2     5   00          0 143349312 143349311
                                      |
                                     (2) セクタ数

総ディスク容量(Kbyte)は以下の計算式で求めることができる。

(2)セクタ数 x (1)1セクタあたりのバイト数 / 1024(byte)

上記の例の場合、/(ルート)の容量は「139146624セクタ x 512バイト(/セクタ) / 1024 = 約69.6Gbytes」となる。

2007/12/28更新

対応バージョン: 8,9,10

オープン中のファイルを誤って削除してしまった場合、その処理を終了させていなければ復元できる。

例えばtail -fでファイルを監視していてそのファイルを削除してしまった場合、tailを終了させていなければ以下の方法で復元することができる。

tailのPIDを確認する

% ps -ef | grep tail
 foo   6572  6498  0 22:52:20 pts/1    0:00 tail -f sample

/proc//fdディレクトリに移動する

% cd /proc/6572/fd

プロセスが使用しているファイルディスクリプタの数だけ数字のファイルがあるのでfileコマンドなどでテキストファイルを探す

% ls -l  
-r--r--r--  0 foo  user       6 12月 28日  22:42 0
c---------  1 foo  tty   24,  1 12月 28日  22:52 1
c---------  1 foo  tty   24,  1 12月 28日  22:52 2

% file *
0:              ASCII テキスト
1:              文字型デバイス 特殊ファイル (24/1)
2:              文字型デバイス 特殊ファイル (24/1)

この場合は0のみがテキストファイルなので目的のファイルと断定することができる。複数ある場合はcatやmoreなどで中身を確認して判断する

当該ファイルを任意の場所にコピーする

% cp 0 /var/tmp/foo

2008/4/1更新

対応バージョン: 10

Solaris10で提供されている最小特権モデル(Least Privilege Model)という機構を用いて、通常管理者にしか実行できないsnoopコマンドを一般ユーザに実行させることができる。

まず通常の状態ではsnoopコマンドは失敗する。

% snoop
snoop: /dev/iprb0: Permission denied

これに対して以下のように一般ユーザのデフォルトの特権であるbasic(*)にnet_rawaccess(ネットワーク層への直接アクセスを許可する)を加えることによりsnoopが実行できるようになる。

# usermod -K defaultpriv=basic,net_rawaccess foo
% snoop
Using device /dev/iprb0 (promiscuous mode)
:

ユーザの特権設定は/etc/user_attrファイルに格納される。

foo::::type=normal;defaultpriv=basic,net_rawaccess

尚、すでに該当のユーザがログインしている場合は以下のメッセージが出て次回のログインから設定が有効になる。

UX: usermod: foo is currently logged in, some changes may not take effect until next login.

(*) basic特権は以下の特権の集合を表す。

file_link_any

プロセスの実効ユーザIDと異なるユーザIDによって所有されているファイルへのハードリンクを作成できるようにする。

proc_info

シグナルを送信できるプロセス以外のプロセスの状態を調査できるようにする。調査できないプロセスは/procに表示されないため存在していないように見える。

proc_session

プロセスのセッション外でシグナルを送信したりプロセスをtraceしたりできるようにする。

proc_fork

fork1(),forkall(),vfork()をコールできるようにする。

proc_exec

execve()をコールできるようにする。

全ての特権については以下のコマンドで参照できる。

% ppriv -lv

2007/12/28更新

対応バージョン: 8,9,10

pkillコマンドを使用すると同一ユーザが実行しているプロセスを一括して終了させることができる。

% pkill -u <UID>

またpkillは任意のシグナルを送信できるので、例えば同一ユーザのプロセスをいっせいに一時停止させることもできる。

% pkill -STOP -u <UID> ... 一時停止
% pkill -CONT -u <UID> ... 再開

2007/7/29更新

対応バージョン: 8

実行例)

# pkgadd -d /tmp SUNWmmgr
(sparc) 3.4,REV=2000.06.23.16.09
Copyright 1993 - 2000 VERITAS Software Corporation, All Rights Reserved
/tmp/SUNWmmgr/install/request: /tmp/SUNWmmgr/install/request: cannot open
pkgadd: ERROR: 要求スクリプトが異常終了しました。

上記のrequestスクリプトを実行すべきinstallアカウントが存在しないため代わりにnobodyアカウントでスクリプトを実行しようとして実行権がないためにエラーが出る。

以下のようなアカウントを作成して再度pkgaddを実行する。

install:x:0:1:install:/:/bin/true

参考までに、pkgaddを実行すると実際には以下の処理が実行される。

/usr/sadm/install/bin/pkginstall -N pkgadd /tmp SUNWmmgr

2007/11/27更新

対応バージョン: 8

pfilesを使用するとプロセスが使用しているファイルやソケットなどのリソースを調べることができる。

例)

# ps -ef|grep sshd
    root   320     1  0   Apr 14 ?        0:11 /usr/local/sbin/sshd

# pfiles 320
320:    /usr/local/sbin/sshd
  Current rlimit: 256 file descriptors
   0: S_IFCHR mode:0666 dev:85,0 ino:4415767 uid:0 gid:3 rdev:13,2
      O_RDWR|O_LARGEFILE
   1: S_IFCHR mode:0666 dev:85,0 ino:4415767 uid:0 gid:3 rdev:13,2
      O_RDWR|O_LARGEFILE
   2: S_IFCHR mode:0666 dev:85,0 ino:4415767 uid:0 gid:3 rdev:13,2
      O_RDWR|O_LARGEFILE
   3: S_IFDOOR mode:0444 dev:307,0 ino:63395 uid:0 gid:0 size:0
      O_RDONLY|O_LARGEFILE FD_CLOEXEC  door to nscd[202]
   4: S_IFSOCK mode:0666 dev:302,0 ino:5578 uid:0 gid:0 size:0
      O_RDWR|O_NONBLOCK
        sockname: AF_INET6 ::  port: 22
   5: S_IFSOCK mode:0666 dev:302,0 ino:5577 uid:0 gid:0 size:0
      O_RDWR|O_NONBLOCK
        sockname: AF_INET 0.0.0.0  port: 22

この例では3個のファイルをオープンし(0〜3)、2個のソケットをオープンしている(4〜5)ことが確認できる。

これを応用し、例えばすべてのプロセスがオープンしているポートを調べるには以下のようなスクリプトを実行すればよい。

for pid in `ps -aeo pid | grep -v "PID" | sort -n`
do
  pfiles ${pid} | egrep "^${pid}:|port:"
done

実行結果)

0:    sched
1:    /etc/init -
2:    pageout
3:    fsflush
59:   /usr/lib/sysevent/syseventd
65:   /usr/lib/picl/picld
116:  /usr/sbin/rpcbind
151:  /usr/sbin/inetd -s
      sockname: AF_INET6 ::  port: 21
      sockname: AF_INET6 ::  port: 23
      sockname: AF_INET 0.0.0.0  port: 42
      sockname: AF_INET 0.0.0.0  port: 514
:

2007/12/28更新

対応バージョン: 8,9,10

以下のような2ファイルがあり、これを一行ずつマージしたい。

ファイル1
a
b
c
ファイル2
1
2
3
マージ後
a       1
b       2
c       3

これを簡単に実現するにはpasteコマンドを使用すればよい。

% paste <ファイル1> <ファイル2>
a       1
b       2
c       3

結合された文字列の区切り文字はタブだが、-dオプションを付けることで任意の文字に変更可能である。

% paste -d, <ファイル1> <ファイル2>
a,1
b,2
c,3

% paste -d" " <ファイル1> <ファイル2>
a 1
b 2
c 3

2007/7/29更新

対応バージョン: 8

メッセージ例)

SUNW,UltraSPARC-II: WARNING: [AFT1] EDP event on CPU2 Data access
at TL=0, errID 0x001cff8d.afb05759
  AFSR 0x00000000.80401000<PRIV,EDP> AFAR 0x00000000.7696d560
  AFSR.PSYND 0x1000(Score 95) AFSR.ETS 0x00 Fault_PC 0x7812aeb4
  UDBH 0x0000 UDBH.ESYND 0x00 UDBL 0x0000 UDBL.ESYND 0x00
SUNW,UltraSPARC-II: [AFT2] errID 0x001cff8d.afb05759 PA=0x00000000.7696d560
  E$tag 0x00000000.1ac00ed2 E$State: Exclusive E$parity 0x0d
SUNW,UltraSPARC-II: [AFT2] E$Data (0x00): 0x00000000.00000000
SUNW,UltraSPARC-II: [AFT2] E$Data (0x10): 0x00000000.00000000 *Bad* PSYND=0x1000
SUNW,UltraSPARC-II: [AFT2] errID 0x001cff8d.afb05759 AFAR was derived from E$Tag
panic[cpu2]/thread=2a10006bd20:

EDP eventはEcache Data SRAMよりデータを読み出し中にパリティエラーが検出されたことを示している。

この動作は一つのCPUモジュール内で完結する動作であるため、EDP eventが発生しているCPUモジュールの問題である。

同イベントが発生する要因として

ソフトエラー(宇宙線などの外的要因によってbit反転が発生しEDP eventが発生する)
ハードエラー(CPUのハード障害)

の2つが考えられるが、どちらが原因なのかを判断することは難しい。

Ecacheエラーが多発している場合にはまずCPUを交換し、さらに以下の手順にてEcacheのscrub周期の変更を行なうことでソフトエラーの発生頻度を下げることができる。

root権限にてecache_scan_rateの現在設定値を確認する。

# echo 'ecache_scan_rate/D' | adb -k

表示される値が100である場合、現在ecache_scan_rateには100が設定されているのでこの値を1000に設定する。

# echo 'ecache_scan_rate/W 0t1000' | adb -kw

再度以下を実行し、設定が反映されていることを確認する。

# echo 'ecache_scan_rate/D' | adb -k

システムの再起動後もこの設定が有効になるように/etc/systemに設定を行う。/etc/systemにまだ以下のパラメータがセットされていない場合にはこれら全てを設定する。既に設定されている場合には値を変更する。

set ecache_scrub_enable=1
set ecache_scan_rate=1000
set ecache_calls_a_sec=100

2007/7/29更新

対応バージョン: 10

Solaris10はデフォルトでxntpdが起動しない設定になっているので、svcadmで起動を有効化する。

# svcadm -v enable ntp
svc:/network/ntp:default が有効になりました

関連資料・記事

2008/9/3更新

対応バージョン: 10

NTPで時刻合わせを行う方法としてStepモード(即時同期)とSlewモード(緩やかに同期)の2つがある。

xntpdはデフォルトではStepモードになっているのでSlewモードにするには/etc/inet/ntp.confに「slewalways yes」オプションを追加してxntpdを再起動する。

例)

server ntp1.bar.com prefer
server ntp2.bar.com
driftfile /var/ntp/ntp.drift
slewalways yes
# svcadm restart ntp

関連資料・記事

確認方法の詳細については以下の資料を参照のこと。

関連資料・記事

2008/7/29更新

対応バージョン: 8,10

/etc/inet/ntp.confに以下の設定を追加してxntpdを起動(すでに起動していれば再起動)する。

server 172.20.61.101 prefer ← 優先サーバ
server 172.20.61.100 ← 予備サーバ(任意)
driftfile /var/ntp/ntp.drift ← 同期微調整用ファイル

xntpd起動/再起動

Solaris8

(起動)

# /etc/rc2.d/S74xntpd start

(再起動)

# /etc/rc2.d/S74xntpd stop
# /etc/rc2.d/S74xntpd start
Solaris10

(起動)

# svcadm enable ntp

(再起動)

# svcadm restart ntp

確認方法

% ntpq -p
     remote          refid   st t when poll reach  delay  offset  disp
======================================================================
*172.20.61.101  10.65.48.12   2 u   15   64  377    3.45   1.784  0.15
+172.20.61.100  10.65.48.12   2 u   14   64  377    2.87   1.422  0.09

確認方法の詳細については以下の資料を参照のこと。

関連資料・記事

2008/8/7更新

対応バージョン: 10 x86

Intel機の場合、OSインストール時にNICが認識されない場合がある。

例えばCompaq Evo内蔵のNICを使用するには以下の手順でiprbドライバを組み込む。

ベンダID、デバイスIDの確認

# prtconf -pv
:
    model:  'Ethernet controller'
:
    vendor-id:  00008086
    device-id:  0000103b
:

ドライバの確認

# grep 8086 /boot/solaris/devicedb/master
pci8086,1039 pci8086,1039 net pci iprb.bef "Intel 82801DB Ethernet 82562ET/EZ PHY"
pci8086,103d pci8086,103d net pci iprb.bef "Intel 82801DB PRO/100 VE Ethernet"

上記より、ベンダID「8086」(Intel)はiprbドライバを使用することがわかる。

ドライバエイリアスの追加

不足しているデバイスIDを追加する。

# vi /etc/driver_aliases
:
iprb "pci8086,1039"
iprb "pci8086,103b" ← 追加
iprb "pci8086,103d"
:

デバイス再構築指示

# touch /reconfigure

リブート

これでドライバの組み込みが完了するのでifconfig等でホスト情報を設定する。

2010/7/10更新

対応バージョン: 10

これはバグ6682528で、以下のいずれかの方法で回避できる。

nfsmapidを停止(無効化)する

nfsmapidはNFSv4環境下におけるサーバ/クライアント間のユーザマッピングデーモンなので、NFSv4を使用していない環境であれば停止してもよい。

以下に設定手順を示す。

# svcadm disable svc:/network/nfs/mapid
NFSMAPID_DOMAINを有効化することでnfsmapidを停止させずにメモリリークを防ぐ

デフォルトでコメントアウトされているnfsmapidのドメイン設定を有効化する。

以下に設定手順を示す。

# vi /etc/default/nfs

(変更前)
#NFSMAPID_DOMAIN=domain

(変更後)
NFSMAPID_DOMAIN=domain

(*) ドメインを使用しないのであればドメイン名は任意のものでよい

設定ファイルを変更したらnfsmapidを再起動する。

# svcadm disable svc:/network/nfs/mapid

# svcadm enable svc:/network/nfs/mapid

# svcs -a | grep mapid
online          6:48:29 svc:/network/nfs/mapid:default

# svcs -lp svc:/network/nfs/mapid
fmri         svc:/network/nfs/mapid:default
name         NFS ID mapper
enabled      true
state        online
next_state   none
state_time   Sat Jan 17 06:48:29 2009
logfile      /var/svc/log/network-nfs-mapid:default.log
restarter    svc:/system/svc/restarter:default
contract_id  163 
dependency   require_any/error svc:/milestone/network (online)
dependency   require_all/restart svc:/network/rpc/bind (online)
dependency   require_all/refresh svc:/milestone/name-services (online)
dependency   require_all/error svc:/system/filesystem/minimal (online)
process      3430 /usr/lib/nfs/nfsmapid

2009/3/1更新

対応バージョン: 10

NFSサーバ上でNFSクライアントからのアクセス履歴を取るには以下の手順で行う。

/etc/default/nfslogdを編集し、ログ出力デーモンnfslogdの動作を設定

設定パラメータを以下に示す。

MAX_LOGS_PRESERVE=

保存するログファイルの最大数。

デフォルトは10。

MIN_PROCESSING_SIZE=

バッファファイルのデータをログファイルに書き込む際の最小サイズ(バイト)。

デフォルトは524288(byte)。

IDLE_TIME=

バッファファイル内にデータが残っているかどうかを確認するためのスリープ時間(秒)。

デフォルトは300(秒)。

CYCLE_FREQUENCY=

ログファイルの更新間隔(時間)。

デフォルトは24(時間)。

UMASK=

ログファイルのマスク値。

デフォルトは0137。

/etc/nfs/nfslog.confを編集し、ログファイルの格納ディレクトリや出力フォーマットなどを設定

ログファイルの属性は一連の設定にタグを付けて管理する。

タグに続けて設定するパラメータを以下に示す。

defaultdir=

ログファイル、及び関連ファイルの格納ディレクトリ。

デフォルトは/var/nfs。

log=

ログファイルのファイル名。

デフォルトはnfslog。

fhtable=

ファイルハンドルからファイルやディレクトリのパス名をマップするためのテーブルファイル名

デフォルトはfhtable。

buffer=

バッファファイルのファイル名。

デフォルトはnfslog_workbuffer。

logformat=

ログファイルの出力フォーマット。

basicかextendedが指定できる。

デフォルトはbasic。

例) 2つのタグを定義(最初のglobalはデフォルトタグ)

global  defaultdir=/var/nfs \
        log=nfslog fhtable=fhtable buffer=nfslog_workbuffer
test    log=test_nfslog fhtable=test_fhtable buffer=test_nfslog_workbuffer \
        logformat=extended

ここでログファイルの出力フォーマット毎の出力例を示す。

例えばNFSサーバ上の/export/home/testファイル(10Kb)をローカルにコピーした場合は以下のようになる。

・basic

Tue Mar  3 01:23:07 2009 0 jaguar 10240 /export/home/test b _ o r 60001 nfs 0 *

・extended

Tue Mar  3 01:25:42 2009 0 jaguar 10240 /export/home/test b _ read r 60001 nfs3-tcp 0 *

ログファイル中のフィールドの意味は以下のとおり。

Tue Mar  3 01:23:07 2009

アクセス時刻

0

read/writeにかかった時間(秒)

jaguar

クライアントホスト名

10240

入出力データサイズ(byte)

/export/home/test

アクセスされたファイルのパス

b

データタイプ(b:バイナリ)

_

特別なアクションが行われたかどうかを示すフラグ

o (basicの場合)
read (extendedの場合)

basicの場合、転送の方向(o:out, i:in)

extendedの場合、使用システムコール(read, write, setattr, create, remove, rename, mkdir, symlink, mknod, rmdir, link)

r

アクセスモード(NFSの場合は常にr)

60001

ユーザID

nfs (basicの場合)
nfs3-tcp (extendedの場合)

サービス名(extendedの場合はNFSのバージョンとプロトコルも出力)

0

認証メソッド(0は認証なし)

*

認証メソッドにより返されるユーザID(*は認証なし)

/etc/dfs/dfstabを編集し、ログを取得したいエントリにlogオプションを付加

logオプションの引数はnfslog.confで定義したタグを指定する。

例)

share -F nfs -o rw,log=global /export/home

NFSサーバ再起動

# svcadm restart network/nfs/server

通常のサーバ群に加え、nfslogdも起動する。

share確認

# share
-       /export/home   rw,log=global   ""

関連資料・記事

2009/1/25更新

対応バージョン: 10

Solaris10でNFSサーバを設定するには以下のようにする。

/etc/dfs/dfstabを記述

例)

# vi /etc/dfs/dfstab

share -F nfs -o rw=192.168.0.11 -d "Solaris home" /export/home

SMF管理下のnetwork/nfs/serverを有効化

# svcadm enable -r network/nfs/server

# svcs network/nfs/server
STATE          STIME    FMRI
online         11:47:23 svc:/network/nfs/server:default

関連資料・記事

share確認

# share
-       /export/home   rw=192.168.0.11  "Solaris home"

2007/11/9更新

対応バージョン: 8

/etc/init.d/nfs.serverを編集し、nfsdの起動オプションを変更する。

(変更前)

  66   /usr/lib/nfs/nfsd -a 16

(変更後)

  66   /usr/lib/nfs/nfsd -p tcp 16

2008/8/8更新

対応バージョン: 10 x86

OSインストール時に設定するリモートサービスのON/OFFはインストール後にnetservicesコマンドで切り替えることができる。

リモートサービスON

設定コマンド

# netservices open

リモートホストに対して起動するサービス

in.ftpd (*1)

(21/tcp)

sshd

(22/tcp)

in.telnetd (*1)

(23/tcp)

sendmail

(25/tcp)

(587/tcp)

in.fingerd (*1)

(79/tcp)

rpcbind

(111/tcp)

in.rlogind (*1)

(513/tcp)

in.rshd (*1)

(514/tcp)

smcboot

(898/tcp) 他

nlockmgr

(4045/tcp)

Xorg

(6000/tcp)

dtspcd (*1)

(6112/tcp)

in.stlisten (*1)

(6481/tcp)

xfs (*1)

(7100/tcp)

status (*2)

(32809/tcp)

metad (*2)

(32814/tcp)

metamedd (*2)

(32815/tcp)

metamhd (*2)

(32816/tcp)

rusersd (*2)

(32817/tcp)

dtlogin

(32820/tcp)

(*1) xinetd管理下

(*2) portmapper管理下

リモートサービスOFF

設定コマンド

# netservices limited

リモートホストに対して起動するサービス

sshd

(22/tcp)

rpcbind

(111/tcp)

2007/7/29更新

対応バージョン: 9

nddコマンドを使用する方法と/etc/systemに記述する方法がある。

nddコマンドで設定した場合は永続的な設定ではないため、OSブート時に設定したい場合は/etc/rc2.d/S99qfe等を作成してこの中でnddを実行するようにする。

また/etc/systemに記述する場合はrcスクリプトを作成しなくてもよいが、qfe0〜3それぞれのNIC毎に個別の設定をすることができないので必要に応じて使い分けるとよいだろう。

例) nddコマンドを使用してqfe1を100Mbps/全二重に固定する方法

# ndd -set /dev/qfe instance 1
# ndd -set /dev/qfe adv_100fdx_cap 1  ... 100Mbps/全二重
# ndd -set /dev/qfe adv_100hdx_cap 0  ... 100Mbps/半二重
# ndd -set /dev/qfe adv_10fdx_cap 0   ...  10Mbps/全二重
# ndd -set /dev/qfe adv_10hdx_cap 0   ...  10Mbps/半二重
# ndd -set /dev/qfe adv_autoneg_cap 0 ... オートネゴシエーションの有効/無効

例) /etc/systemを使用してqfe0〜3全てを100Mbps/全二重に固定する方法

set qfe:qfe_adv_100fdx_cap=1
set qfe:qfe_adv_100hdx_cap=0
set qfe:qfe_adv_10fdx_cap=0
set qfe:qfe_adv_10hdx_cap=0
set qfe:qfe_adv_autoneg_cap=0

例) qfe1が100Mbps/全二重になっているかどうかを確認する方法

# ndd -set /dev/qfe instance 1
# ndd -get /dev/qfe link_status
1
# ndd -get /dev/qfe link_speed
1
# ndd -get /dev/qfe link_mode
1

上記パラメータはそれぞれ以下の値を持つ。

link_status

0 : Link down

1 : Link up

link_speed

0 : 10 Mbps

1 : 100 Mbps

link_mode

0 : Half Duplex(半二重)

1 : Full Duplex(全二重)

参考までに、Sunのマシンで一般的に使われるhmeを100Mbps/全二重に固定する方法を以下に示す。

/etc/systemで設定する場合

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

nddコマンドで設定する場合

# ndd -set /dev/hme adv_100fdx_cap 1
# ndd -set /dev/hme adv_100hdx_cap 0
# ndd -set /dev/hme adv_10fdx_cap 0
# ndd -set /dev/hme adv_10hdx_cap 0
# ndd -set /dev/hme adv_autoneg_cap 0

2008/2/8更新

対応バージョン: 8

任意のサイズのファイルを新規に作成するにはmkfileを使用する。

以下の単位とともにサイズを指定する。

b(Byte)
k(KB)
m(MB)
g(GB)

例)

% mkfile 1k test

% ls -l test
-rw-------  1 foo  staff  1024  2  8 01:16 test

また従来からあるddコマンドを使用してもよい。

% dd if=/dev/random of=file bs=1024 count=1

関連資料・記事

2007/9/18更新

対応バージョン: 8

メモリモジュール「U0404」で起きているエラーである。以下の判断基準にしたがってメモリ交換の要否を判断する。

Intermittent

パリティエラーの通知を調べ、存在しなければ無視してよい。

(*) パリティエラー通知の機能がない機器の場合も無視してよい。

Persistent

同じメモリモジュール上で24時間以内に3回以上発生する場合は当該モジュールを交換する必要がある。

Sticky

最初の発生で交換する必要がある。

以下、メッセージの一例を示す。

例1) Intermittentのみのエラーなので交換不要

unix: [AFT0] Multiple Softerrors:
unix: 256 Intermittent, 0 Persistent, and 0 Sticky Softerrors accumulated
unix: from Memory Module U0404

例2) Persistentレベルのエラーが出ているので、これが複数回発生するようなら交換が必要

unix: Multiple Softerrors:
unix: Seen 5 Intermittent and 251 Corrected Softerrors
unix: from SIMM 1901
unix:  CONSIDER REPLACING THE SIMM.
unix: Softerror: Persistent ECC Memory Error
unix:  Corrected SIMM 1901
unix:  ECC Data Bit 60 was corrected
unix: WARNING: correctable error from pci4 (upa mid 6) during dvma read transaction.
unix:  AFSR=409e0000.46800000 AFAR=00000000.8379d400,
unix:  double word offset=2, SIMM 1901 id 6.
unix: syndrome bits 9e

2008/2/15更新

対応バージョン: 8

manのキーワード検索にはwindexデータベースが使用される。

同データベースは最初は作成されていないので以下のようにして作成する。

# catman -w

これにより同データベースが以下の場所に格納される。MANPATH環境変数が設定されていればそのパスに格納される。

/usr/share/man/windex
/usr/share/man/<LANG>/windex (LANG環境変数が設定されている場合のみ)

キーワード検索には以下のいずれかの方法が利用可能である。

man -k <キーワード>
man -f <ファイル名>
apropos <キーワード> (man -kと同じ)
whatis <キーワード>  (man -fと同じ)

例)

% man -k pwd
pwd      pwd (1)      - 作業中のディレクトリの出力
lckpwdf  lckpwdf (3c) - manipulate shadow password database lock file 
pwd      pwd (1)      - return working directory name
pwdx     proc (1)     - proc tools
ulckpwdf lckpwdf (3c) - manipulate shadow password database lock file 

% man -f chdir
chdir    cd (1)       - 現在の作業用ディレクトリの変更
chdir    cd (1)       - change working directory
chdir    chdir (2)    - change working directory

2007/7/29更新

対応バージョン: 8,9

アカウント毎に設定する場合は$HOME/.solregis/disableというファイルを作成する(ファイルは空でよい)。

システムワイドで設定する場合は/etc/default/solregisというファイルを作成し、ファイル中に「DISABLE=1」と記述する。

2007/7/29更新

対応バージョン: 8

セキュリティ上、通常rootによるログインはコンソール以外からはできないようになっている。

この設定を行っているのは/etc/default/login、および/etc/default/suの以下の行である。

CONSOLE=

この行の右側にルートとしてログインを許可するデバイス(端末)名を表記することで特定の端末からログイン可能になる。

例えば、

CONSOLE=/dev/ttya

とすれば、ttyaからのみルートでログインできる。

どこからでもルートとしてログインできるようにするには、このCONSOLE行を削除(またはコメントアウト)すればよい。

ただし、ルートのパスワードが盗まれてしまったらどこからでもログインできてしまうので注意が必要である。

2008/7/14更新

対応バージョン: 10

Solaris10では従来から提供されている/usr/lib/newsyslogというログローテート用スクリプトに変えてlogadmというツールを使用する。

このツールをオプションなしで実行すれば設定ファイルである/etc/logadm.confを読み込んでログのローテートを行い、オプション付で実行すれば同設定ファイルに対してローテートの設定が行われる。

まずオプションなしの場合は任意の時点で手動実行可能であり、rootのcronでは毎日3:10に実行されるように設定されている。

# crontab -l
:
10 3 * * * /usr/sbin/logadm
:

次にオプション付の場合はログローテートの細かい指定とともに実行し、設定が/etc/logadm.confに書き込まれる。

例えば/var/log/foo.logというログファイルを100KBに達する毎にローテートし、履歴を5世代分保存するには以下のようにする。ローテート後にsyslogデーモンにHUPシグナルを送らないと新しいログファイルが使用されないので注意が必要である。

# logadm -w /var/log/foo.log -s 100k -C 5 -a 'kill -HUP `cat /var/run/syslog.pid`'

履歴ファイルにはfoo.log.0, foo.log.1, ...という形で後ろに数字が付加されていく。

-rオプションとともにファイル名を指定するとそのファイルに対する設定が/etc/logadm.confから削除される。

# logadm -r /var/log/foo.log

主なオプションは以下のとおり。

-w <ファイル>

ローテート対象ファイル

-s <サイズ>

ローテート対象となるファイルサイズ(b,k,m,g等の単位で指定)

-p <期間>

ローテートするタイミング(h,d,w,m,y等の単位で指定)

例)

-p 1h (1時間毎)
-p 1d (1日毎)
-p 1w (1週間毎)
-p 1m (1ヶ月毎)
-p 1y (1年毎)
-C <保有履歴>

履歴管理する世代数

-a <処理>

ローテート後に実行する処理

例) syslogデーモンにHUPシグナルを送る

-a 'kill -HUP `cat /var/run/syslog.pid`'
-b <処理>

ローテート前に実行する処理

-R <処理>

履歴ファイルに対する処理

-E <処理>

履歴対象から外れ、削除対象となったファイルに対する処理

例) 対象ファイルを圧縮して別ディレクトリに移動する

-E 'gzip $file ; mv $file.gz /var/log/old'

(*) $fileには対象ファイル名が入る

関連資料・記事

2007/7/29更新

対応バージョン: 8

/var/adm/messagesと/var/log/syslogの2ファイルについては/usr/lib/newsyslogというローテート用スクリプトが提供されており、rootのcronで毎日3:10に実行されている。

それ以外のファイルについては上記スクリプトを参考に自作するか、syslog-ngなどのツールを導入して対応する。

関連資料・記事

2008/11/7更新

対応バージョン: 10

既存のファイルシステム上に別のファイルシステムを作成するにはlofiadmを使用して通常のファイルをブロックデバイスとして割り当てる。

ここでは256MBのファイルをUFSとして使用する手順を示す。

作成手順

まず通常のファイルを作成する。

# mkfile 256m /var/tmp/test

このファイルをブロックデバイスとして割り当てる。

# lofiadm -a /var/tmp/test
/dev/lofi/1 ← 割り当てられたデバイス             

# lofiadm
Block Device             File
/dev/lofi/1              /var/tmp/test

割り当てられたブロックデバイスに対してファイルシステムを作成する。ローデバイスを指定するのでデバイス名の先頭にはrを付ける。

# newfs /dev/rlofi/1

ファイルシステムが作成されたら通常のmountコマンドでマウントする。

# mount /dev/lofi/1 /mnt

# df -k /mnt
ファイルシステム  kbytes 使用済み 使用可能 容量  マウント先
/dev/lofi/1       245603    1041  220002     1%  /mnt

削除手順

ファイルシステムを削除するにはまずアンマウントし、lofiadmを-dオプション付で実行してブロックデバイスの割り当てを解除してからファイルを削除する。

# umount /mnt

# lofiadm -d /dev/lofi/1

# rm /var/tmp/test

関連資料・記事

2008/10/20更新

対応バージョン: 10

ISOイメージをマウントして中身を参照するにはlofiadmを使用する。

マウント手順

まずISOファイルをブロックデバイスとして割り当てる。

# lofiadm -a /tmp/foo.iso
/dev/lofi/1 ← 割り当てられたデバイス             

# lofiadm
Block Device             File
/dev/lofi/1              /tmp/foo.iso

このデバイスを通常のmountコマンドでマウントする。

# mount -F hsfs -o ro /dev/lofi/1 /mnt

# df -k /mnt
ファイルシステム  kbytes 使用済み 使用可能 容量  マウント先
/dev/lofi/1          350     350       0   100%  /mnt

アンマウント手順

マウントを解除するにはまずアンマウントし、lofiadmを-dオプション付で実行してブロックデバイスの割り当てを解除する。

# umount /mnt

# lofiadm -d /dev/lofi/1

関連資料・記事

2007/7/29更新

対応バージョン: 9

SolarisをLDAPクライアントとして使用するには以下の設定を行う。

ネームサービスの設定

/etc/nsswitch.confを編集し、LDAPクライアントとして利用したいサービスに「ldap」を追加する。

例えばユーザ認証だけにLDAPを使用したい場合は以下のようにする。

(変更前)

passwd:  files
group:   files

(変更後)

passwd:  files ldap
group:   files ldap 

PAMの設定

/etc/pam.confを編集し、LDAPクライアントとして利用したいサービスにpam_ldapモジュールを追加する。

例えばtelnetサービスに対してまず通常のUNIX認証を行い、うまくいった場合はそこで認証終了、失敗した場合はLDAPによる認証を行うという設定は以下のようにする。

(変更前)

telnet auth required   /usr/lib/security/$ISA/pam_unix.so.1

(変更後)

telnet auth sufficient /usr/lib/security/$ISA/pam_unix.so.1
telnet auth required   /usr/lib/security/$ISA/pam_ldap.so.1 use_first_pass

LDAPサーバとの仲立ちをするキャッシュサーバの設定

まず、LDAPサーバにアクセスする際のBaseDNのデフォルト定義を/etc/defaultdomainに設定する。

例えばBaseDNが「o=foo.bar.com」なら以下のように設定する。

foo.bar.com

次にキャッシュサーバの設定ファイルを/var/ldap配下に用意する。

・ldap_client_file

LDAPサーバのホスト、ポート、BaseDN、その他オプション等を指定する。

例えば以下のように設定する。

NS_LDAP_FILE_VERSION= 1.0 
NS_LDAP_SERVERS= 172.20.61.142:389
NS_LDAP_SEARCH_BASEDN= o=foo.bar.com
NS_LDAP_AUTH= NS_LDAP_AUTH_NONE
NS_LDAP_TRANSPORT_SEC= NS_LDAP_SEC_NONE
NS_LDAP_SEARCH_REF= NS_LDAP_FOLLOWREF
NS_LDAP_DOMAIN=
NS_LDAP_EXP= 1034822380
NS_LDAP_SEARCH_SCOPE= NS_LDAP_SCOPE_ONELEVEL
NS_LDAP_SEARCH_TIME= 30
NS_LDAP_BIND_TIME= 30

・ldap_client_cred

ldap_client_fileファイルのNS_LDAP_AUTHをNS_LDAP_AUTH_SIMPLEにした場合に限り必要になるファイルで、LDAPサーバにバインドするためのユーザとパスワードを指定する。

例えば以下のように設定する。

NS_LDAP_BINDDN= cn=admin,o=foo.bar.com
NS_LDAP_BINDPASSWD= {NS1}EnCrYpTeDPaSsWoRdHeRe

LDAPキャッシュサーバ起動

以下のinitスクリプトを実行してLDAPキャッシュサーバを起動する。

# /etc/rc2.d/S71ldap.client start

→ ldap_cachemgrというデーモンが起動する。

ログは/var/ldap/cachemgr.logに出力される。

2007/7/29更新

対応バージョン: 9

既存のJ2SDKパッケージを削除し、別のバージョンのJ2SDKをインストールする。

例) J2SDK-1.4.0_00をJ2SDK-1.4.2_03に置き換える場合

用意するもの

j2sdk-1_4_2_03-solaris-sparc.tar.Z (32bit) ... 必須
j2sdk-1_4_2_03-solaris-sparcv9.tar.Z (64bit) ... 任意 (OSを64bitモードで使用する場合に必要)

手順

既存のJ2SDKを削除

# java -version
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0_00-b05)
Java HotSpot(TM) Client VM (build 1.4.0_00-b05, mixed mode)

# pkginfo | grep J2SDK
system   SUNWj3dev   J2SDK 1.4 development tools
system   SUNWj3dmo   J2SDK 1.4 demo programs
system   SUNWj3jmp   J2SDK 1.4 Japanese man pages
system   SUNWj3man   J2SDK 1.4 man pages
system   SUNWj3rt    J2SDK 1.4 runtime environment

# pkgrm SUNWj3dev SUNWj3dmo SUNWj3jmp SUNWj3man SUNWj3rt

別バージョンのJ2SDKをインストール

# gtar zxvf j2sdk-1_4_2_03-solaris-sparc.tar.Z

# pkgadd -d .
次のパッケージを利用できます:
  1  SUNWj3cfg  SUNWj3rt post configuration
                (sparc) 1.4.2,REV=2003.11.18.15.36
  2  SUNWj3dev  J2SDK 1.4 development tools
                (sparc) 1.4.2,REV=2003.11.18.15.36
  3  SUNWj3dmo  J2SDK 1.4 demo programs
                (sparc) 1.4.2,REV=2003.11.18.15.36
  4  SUNWj3jmp  J2SDK 1.4 Japanese man pages
                (sparc) 1.4.2,REV=2003.11.18.15.36
  5  SUNWj3man  J2SDK 1.4 man pages
                (sparc) 1.4.2,REV=2003.11.18.15.36
  6  SUNWj3rt   J2SDK 1.4 runtime environment
                (sparc) 1.4.2,REV=2003.11.18.15.36

パッケージ (複数可) を選択してください (すべてのパッケージを
処理するには 'all' を入力してください)。 (default: all) [?,??,q]: ■ ← リターン

# gtar zxvf j2sdk-1_4_2_03-solaris-sparcv9.tar.Z

# pkgadd -d .
次のパッケージを利用できます:
1  SUNWj3dmx  J2SDK 1.4 demo programs (64-bit)
              (sparc) 1.4.2,REV=2003.11.18.14.31
2  SUNWj3dvx  J2SDK 1.4 development tools (64-bit)
              (sparc) 1.4.2,REV=2003.11.18.14.31
3  SUNWj3rtx  J2SDK 1.4 runtime environment (64-bit)
              (sparc) 1.4.2,REV=2003.11.18.14.31

パッケージ (複数可) を選択してください (すべてのパッケージを
処理するには 'all' を入力してください)。 (default: all) [?,??,q]: ■ ← リターン

確認

# java -version
java version "1.4.2_03"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_03-b02)
Java HotSpot(TM) Client VM (build 1.4.2_03-b02, mixed mode)

# pkginfo | grep J2SDK
system   SUNWj3dev   J2SDK 1.4 development tools
system   SUNWj3dmo   J2SDK 1.4 demo programs
system   SUNWj3dmx   J2SDK 1.4 demo programs (64-bit)
system   SUNWj3dvx   J2SDK 1.4 development tools (64-bit)
system   SUNWj3jmp   J2SDK 1.4 Japanese man pages
system   SUNWj3man   J2SDK 1.4 man pages
system   SUNWj3rt    J2SDK 1.4 runtime environment
system   SUNWj3rtx   J2SDK 1.4 runtime environment (64-bit)

2007/7/29更新

対応バージョン: 9

IPエイリアスの設定を行うにはifconfigでネットワークインタフェースに:1、:2、:3...を指定する。

例) qfe1にIPエイリアスを定義し、インタフェースはqfe1:1とする。

# ifconfig qfe1:1 plumb
# ifconfig qfe1:1 xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx up

IPエイリアスを削除する場合は該当のインタフェースにunplumbを指定する。

# ifconfig qfe1:1 unplumb

例) IPエイリアスの永続設定(ブート時に自動設定)

# echo "xxx.xxx.xxx.xxx <hostname>" >> /etc/hosts
# cat <hostname> > /etc/hostname.qfe1:1

関連資料・記事

2007/7/29更新

対応バージョン: 8

iconvを使用する。

% iconv -f <変換元文字コード> -t <変換後文字コード> <対象ファイル>

代表的な文字コードを以下に示す。それ以外にサポートされている文字コードは「man -s 5 iconv_ja」で確認できる。

UTF-8

UTF-8

eucJP

日本語EUC

SJIS

Shift-JIS

ISO-2022-JP

ISO-2022-JP(JIS)

例) UTF-8のデータをSJISに変換する

% iconv -f UTF-8 -t SJIS u8.txt > sj.txt

2008/6/27更新

対応バージョン: 10

RFC952で定義されRFC1123で修正されたホスト名の標準命名規則に従い、以下の文字で構成する。

英字(a〜z,A〜Z)
数字(0〜9)
ハイフン(-)
ピリオド(.)

(*) ただしドメイン名の区切りでのみ使用可

その他、以下の制約がある。

24文字以内
大文字/小文字は区別されない
最初の文字は英字または(RFC1123での修正に従い)数字のみ使用可
最後の文字はハイフン(-)/ピリオド(.)以外の必要がある
数字のみで構成されたホスト名は使用不可

2008/4/4更新

対応バージョン: 10

以下の修正を行いリブートする。

ホスト情報

ファイル中のホスト名を変更する。

/etc/inet/hosts
/etc/inet/ipnodes (*)
/etc/nodename
/etc/hostname.<interface>

(*) OSのリビジョンによってはhostsへのシンボリックリンクになっている場合があり、その場合は修正不要。

Solaris8では以下のファイルも修正対象であるが、Solaris10では修正不要(ファイル自体は存在する)。

/etc/net/ticlts/hosts
/etc/net/ticots/hosts
/etc/net/ticotsord/hosts

クラッシュダンプ保存ディレクトリ

ディレクトリ名を変更し、dumpadmコマンドで出力先の設定を変更する。

# mv /var/crash/<変更前ホスト名> /var/crash/<変更後ホスト名>

# dumpadm -s /var/crash/<変更後ホスト名>
          ダンプの内容: カーネル ページ
        ダンプデバイス: /dev/dsk/c0d0s1 (swap)
セーブコアディレクトリ: /var/crash/<変更後ホスト名>
      有効なセーブコア: はい

関連資料・記事

2008/4/4更新

対応バージョン: 8

以下の修正を行いリブートする。

ホスト情報

ファイル中のホスト名を変更する。

/etc/inet/hosts
/etc/nodename
/etc/hostname.<interface>
/etc/net/ticlts/hosts
/etc/net/ticots/hosts
/etc/net/ticotsord/hosts

クラッシュダンプ保存ディレクトリ

ディレクトリ名を変更し、dumpadmコマンドで出力先の設定を変更する。

# mv /var/crash/<変更前ホスト名> /var/crash/<変更後ホスト名>

# dumpadm -s /var/crash/<変更後ホスト名>
      Dump content: kernel pages
       Dump device: /dev/dsk/c0t0d0s1 (dedicated)
Savecore directory: /var/crash/<変更後ホスト名>
  Savecore enabled: yes

関連資料・記事

2008/4/8更新

対応バージョン: 10 x86

formatコマンドはデフォルトでは内蔵HDDしか表示しないので、-e(エキスパートモード)オプション付でformatを実行する。

例) 内蔵HDD x 2、及びUSBストレージ x 1の場合

# format -e
AVAILABLE DISK SELECTIONS:
       0. c0d0 <DEFAULT cyl 4862 alt 2 hd 255 sec 63>
          /pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0
       1. c1d0 <DEFAULT cyl 2431 alt 2 hd 255 sec 63>
          /pci@0,0/pci-ide@1f,1/ide@1/cmdk@0,0
       2. c3t0d0 <DEFAULT cyl 4862 alt 2 hd 255 sec 63>
          /pci@0,0/pcie11,b8@1d,7/storage@2/disk@0,0

2008/4/8更新

対応バージョン: 10 x86

fdiskでUSBハードディスクを設定しようとするとエラーが出る。

# fdisk /dev/rdsk/c3t0d0p0
fdisk: Cannot open device /dev/rdsk/c3t0d0p0.

この場合、当該デバイスがvold制御下にある可能性があるので以下のいずれかの方法でデバイスを設定する。

voldのデバイス名を使用する

voldのデバイス名を使用する場合、まずrmformatにてリムーバブルメディアの状態を調べる。

# rmformat
デバイスを探しています...
  1. Volmgt Node: /vol/dev/aliases/rmdisk0
     Logical Node: /dev/rdsk/c3t0d0p0
     Physical Node: /pci@0,0/pcie11,b8@1d,7/storage@2/disk@0,0
     Connected Device: ST340016 A                    
     Device Type: Removable

この中の/vol〜がvoldで使用するデバイス名なのでこれをfdiskで指定する。

# fdisk /vol/dev/aliases/rmdisk0

voldを停止する

関連資料・記事

vold制御下からUSBデバイスを外す

関連資料・記事

2007/7/29更新

対応バージョン: 8

messagesには以下のようなログが出ているが、Error LevelがRetryable(リトライして成功)であり、継続してエラーが出なければしばらく様子を見て問題ない。

Error for Command: read    Error Level: Retryable
scsi: Requested Block: 1040601   Error Block: 1040603
scsi: Vendor: FUJITSU            Serial Number: 0204X18518
scsi: Sense Key: Media Error
scsi: ASC: 0x11 (<vendor unique code 0x11>), ASCQ: 0x1, FRU: 0x0

2008/9/28更新

対応バージョン: 8

2台の内蔵HDDの片方のHDDで運用している環境において、未使用のHDDでOSを起動できるようにするには以下の作業を行う。

未使用HDDのスライスを使用中のものと同一にする

# format
:

現用HDDの内容を未使用HDDにコピーする

必要なスライス分、以下を実施する。

# mount /dev/rdsk/c0t1d0s0 /mnt ← コピー先スライスをマウント
# cd /mnt
# ufsdump af - /dev/rdsk/c0t0d0s0 | ufsrestore rf -
# umount /mnt

未使用HDDのスライス0にブートブロックをインストールする

# cd /usr/platform/sun4u/lib/fs/ufs
# installboot ./bootblk /dev/rdsk/c0t1d0s0

2008/3/15更新

対応バージョン: 10 x86

Solaris10 x86にディスクを増設するには以下の手順で行う。

デバイス認識

まずデバイスをOSから認識させるために、/にreconfigureという空ファイルを作成してリブートする。

# touch /reconfigure

これにより、次回起動時にデバイスノードが再構成される。

/reconfigureは自動的に削除される。

パーティション設定

次にfdiskコマンドにてパーティションの設定を行う。

ここでは以前FreeBSD用に使用していた20GBのディスク「c1d0」を使用するものとし、以下の内容で設定する。

パーティションは1つ(全ディスクを使用)
スライスは1つ
# fdisk /dev/rdsk/c1d0p0

             Total disk size is 2434 cylinders
             Cylinder size is 16065 (512 byte) blocks

                                               Cylinders
      Partition   Status    Type          Start   End   Length    %
      =========   ======    ============  =====   ===   ======   ===
          1       Active    BSD OS            0  2434    2435    100


SELECT ONE OF THE FOLLOWING:
   1. Create a partition
   2. Specify the active partition
   3. Delete a partition
   4. Change between Solaris and Solaris2 Partition IDs
   5. Exit (update disk configuration and exit)
   6. Cancel (exit without updating disk configuration)
Enter Selection: 3 ← まず既存のパーティションを削除

Specify the partition number to delete (or enter 0 to exit): ← 1

programs in this partition inaccessible (type "y" or "n"). ← y

:

SELECT ONE OF THE FOLLOWING:
   1. Create a partition
   2. Specify the active partition
   3. Delete a partition
   4. Change between Solaris and Solaris2 Partition IDs
   5. Exit (update disk configuration and exit)
   6. Cancel (exit without updating disk configuration)
Enter Selection: 1 ← パーティション作成

   1=SOLARIS2  2=UNIX        3=PCIXOS     4=Other
   5=DOS12     6=DOS16       7=DOSEXT     8=DOSBIG
   9=DOS16LBA  A=x86 Boot    B=Diagnostic C=FAT32
   D=FAT32LBA  E=DOSEXTLBA   F=EFI        0=Exit? 1 ← Solarisパーティション

Specify the percentage of disk to use for this partition
(or type "c" to specify the size in cylinders). 100 ← ディスク全体を使用(100%)

Should this become the active partition? If yes, it  will be activated
each time the computer is reset or turned on.
Please type "y" or "n". ← y

:

             Total disk size is 2434 cylinders
             Cylinder size is 16065 (512 byte) blocks

                                               Cylinders
      Partition   Status    Type          Start   End   Length    %
      =========   ======    ============  =====   ===   ======   ===
          1       Active    Solaris2          1  2433    2433    100


SELECT ONE OF THE FOLLOWING:
   1. Create a partition
   2. Specify the active partition
   3. Delete a partition
   4. Change between Solaris and Solaris2 Partition IDs
   5. Exit (update disk configuration and exit)
   6. Cancel (exit without updating disk configuration)
Enter Selection: 5 ← 変更を書き込んで終了

関連資料・記事

スライス設定

パーティションが作成できたらformatコマンドにてスライスを作成する。

# format

AVAILABLE DISK SELECTIONS:
       0. c0d0 <DEFAULT cyl 4862 alt 2 hd 255 sec 63>
          /pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0
       1. c1d0 <DEFAULT cyl 2431 alt 2 hd 255 sec 63>
          /pci@0,0/pci-ide@1f,1/ide@1/cmdk@0,0
Specify disk (enter its number): 1 ← 増設ディスク

FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        show       - translate a disk address
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        volname    - set 8-character volume name
        !<cmd>     - execute <cmd>, then return
        quit

format> p ← パーティションテーブル設定

PARTITION MENU:
        0      - change `0' partition
        1      - change `1' partition
        2      - change `2' partition
        3      - change `3' partition
        4      - change `4' partition
        5      - change `5' partition
        6      - change `6' partition
        7      - change `7' partition
        select - select a predefined table
        modify - modify a predefined partition table
        name   - name the current table
        print  - display the current table
        label  - write partition map and label to the disk
        !<cmd> - execute <cmd>, then return
        quit

partition> p ← 現在設定を表示

Current partition table (original):
Total disk cylinders available: 2431 + 2 (reserved cylinders)

Part      Tag    Flag  Cylinders    Size            Blocks
  0 unassigned    wm    0           0         (0/0/0)           0
  1 unassigned    wm    0           0         (0/0/0)           0
  2     backup    wu    0 - 2430   18.62GB    (2431/0/0) 39054015
  3 unassigned    wm    0           0         (0/0/0)           0
  4 unassigned    wm    0           0         (0/0/0)           0
  5 unassigned    wm    0           0         (0/0/0)           0
  6 unassigned    wm    0           0         (0/0/0)           0
  7 unassigned    wm    0           0         (0/0/0)           0
  8       boot    wu    0 -    0    7.84MB    (1/0/0)       16065
  9 alternates    wm    1 -    2   15.69MB    (2/0/0)       32130

partition> 0 ← パーティション0の設定

Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       0               0         (0/0/0)           0

Enter partition id tag[unassigned]: ← リターン(タグ不要)
Enter partition permission flags[wm]:  ← リターン(フラグはデフォルトでよい)
Enter new starting cyl[0]: 3← 開始シリンダ(0〜2はシステムで使用)
Enter partition size[0b, 0c, 3e, 0.00mb, 0.00gb]: 2428c ← 最初の3シリンダを除いたディスク全体

partition> p ← 設定結果を表示

Current partition table (unnamed):
Total disk cylinders available: 2431 + 2 (reserved cylinders)

Part      Tag    Flag  Cylinders    Size            Blocks
  0 unassigned    wm    3 - 2430   18.60GB    (2428/0/0) 39005820
  1 unassigned    wm    0           0         (0/0/0)           0
  2     backup    wu    0 - 2430   18.62GB    (2431/0/0) 39054015
  3 unassigned    wm    0           0         (0/0/0)           0
  4 unassigned    wm    0           0         (0/0/0)           0
  5 unassigned    wm    0           0         (0/0/0)           0
  6 unassigned    wm    0           0         (0/0/0)           0
  7 unassigned    wm    0           0         (0/0/0)           0
  8       boot    wu    0 -    0    7.84MB    (1/0/0)       16065
  9 alternates    wm    1 -    2   15.69MB    (2/0/0)       32130

partition> name ← ディスクに名前を付与
Enter table name (remember quotes): ext1 ← 任意の名前

partition> label ← ラベリング
Ready to label disk, continue? ← y

partition> q

format> q

ファイルシステム作成

パーティション/スライス設定が終ったらファイルシステムを作成する。

# newfs /dev/rdsk/c1d0s0
newfs: 新しいファイルシステム /dev/rdsk/c1d0s0 を作成しますか: (y/n)? ← y
:

マウント

最後に実際にマウントしてみる。

# mkdir /ext1
# mount /dev/dsk/c1d0s0 /ext1

# df -k /ext1
ファイルシステム  kbytes  使用済み 使用可能 容量  マウント先
/dev/dsk/c1d0s0  19207519    19065 18996379   1%  /ext1

ブート時にマウントされるようにするには/etc/vfstabに以下のように記述しておく。

/dev/dsk/c1d0s0  /dev/rdsk/c1d0s0  /ext1  ufs  2  yes  -

2008/2/8更新

対応バージョン: 8

2GBを越えるファイル、いわゆる「largefile」をgzipで圧縮しようとした。

Solaris8付属のgzipはバージョン1.2.4だが、gzipはバージョン1.3以降でこのlargefileに対応している。

パッチ112668-02以降を適用することでgzipのバージョンを上げることができる(2008/2/8時点の最新パッチは112668-04)。

2007/7/29更新

対応バージョン: 9

configureスクリプトによってMakefileを作成している場合、想定するコンパイラがgccではなくてSun純正のコンパイラになるのでgccでは使用できないオプションが付く。

従ってMakefileから-KPICオプションを外せばよい。

同様の理由でコンパイル時に「language depend not recognized」というエラーが出る場合はMakefileから-xO3 -xdependオプションを外せばよい。

2008/10/14更新

対応バージョン: 10

ファイルを使用しているプロセスを特定するにはfuserコマンドを使用する。

例えばcronジョブを実行すると/tmpにcroutXXXXXXXXXという一時ファイルが作成されるが、このファイルを使用しているプロセスを特定するには以下のようにする。

# ls -l /tmp/crout*
-rw-------   1 foo  user   0 10月 14日  14:39 croutPBAtqaWBa

# fuser /tmp/croutPBAtqaWBa
/tmp/croutPBAtqaWBa:    12025o   12024o

-> PID=12025,12024が使用している

# ps -ef | egrep '(12025|12024)'
  foo 12024   222   0 15:01:00 ?   0:00 sh -c /tmp/foo.sh
  foo 12025 12024   0 15:01:00 ?   0:00 /bin/sh /tmp/foo.sh

2008/7/16更新

対応バージョン: 8

一般ユーザでdos2unixを実行すると以下のようなエラーが出る。変換そのものは行われている。

% dos2unix foo > foo.out
could not open /dev/kbd to get keyboard type US keyboard assumed
could not get keyboard type US keyboard assumed

これは/dev/kbdの権限が一般ユーザに付与されていないために起こる。

% ls -l /dev/kbd
lrwxrwxrwx 1 root root  ... /dev/kbd -> ../devices/pseudo/conskbd@0:kbd

% ls -l /devices/pseudo/conskbd@0:kbd
crw------- 1 root other ... /devices/pseudo/conskbd@0:kbd

エラーは出るものの変換そのものには影響ないが、気になるようならキーボード種別を明示的に指定すればよい。

キーボード種別は-437(US)や-850(複数言語)を指定する。

% dos2unix -437 foo > foo.out
% dos2unix -850 foo > foo.out

2008/7/31更新

対応バージョン: 10

デバイスドライバの一覧は/etc/name_to_majorにデバイスファイルのメジャー番号とともに格納されている。

% more /etc/name_to_major
cn 0
rootnex 1
pseudo 2
:

/dev配下のデバイスファイルがどのドライバを使用しているかは各デバイスファイルのメジャー番号とこのname_to_majorファイルを付き合わせればよい。

例えば内臓HDDのc0d0s0のデバイスファイルはメジャー番号が102なのでcmdkドライバ(common disk driver)を使用していることが分かる。

% ls -lL /dev/dsk/c0d0s0
brw-r----- 1 root  sys  102, 0  6月 9日 20:44 /dev/dsk/c0d0s0

% grep 102 /etc/name_to_major
cmdk 102

参考)

/dev/kmem

メジャー番号13(mm) : physical or virtual memory

/dev/ptyp0

メジャー番号25(ptc) : pseudo-terminal driver

/dev/diskette0

メジャー番号36(fd) : drivers for floppy disks and floppy disk controllers

/dev/random

メジャー番号149(random) : Strong random number generator device

/dev/crypto

メジャー番号153(crypto) : kernel-level cryptographic mechanisms

/dev/dtrace

メジャー番号155(dtrace) : DTrace dynamic tracing facility

2007/7/29更新

対応バージョン: 8

cron設定は

crontab -r <ユーザ名>

で削除する必要がある。

もしこの作業をせずにcron設定ファイルを削除してしまった場合は、いったん

crontab -e <ユーザ名>

にてダミーの設定を行ってから再度「crontab -r」にて定義を削除する。

2008/5/24更新

対応バージョン: 8

psradmを使用して特定のCPU、あるいはすべてのCPUを切り離したり(offline)有効にしたり(online)することが可能である。

ただしこの設定はリブート後には無効になり、全てのCPUがonlineになる。

例) 2CPUのシステムで2番目のCPUをofflineにする場合

# psrinfo
0       on-line   since 04/14/07 14:16:18
1       on-line   since 04/14/07 14:16:16

# psradm -f 1

# psrinfo
0       on-line   since 04/14/07 14:16:18
1       off-line  since 05/24/08 00:03:27 ← offlineになる

例) 上記のCPUをonlineにする場合 (*)

# psradm -n 1

# psrinfo
0       on-line   since 04/14/07 14:16:18
1       on-line   since 05/24/08 00:04:25 ← onlineになる

(*) 「psradm -n -a」とすれば全てのCPUがonlineになるのでそれでもよい。

2008/4/14更新

対応バージョン: 10

プロセスが異常終了した時のcoreファイルはデフォルトではカレントディレクトリに「core」というファイル名で作成される。

この設定はcoreadmコマンドを引数なしで実行すると確認できる。

# coreadm
 グローバルコアのファイルパターン: 
     グローバルコアファイルの内容: default
      init コアのファイルパターン: core ← coreファイルのファイル名
          init コアファイルの内容: default
             グローバルコアダンプ: disabled
           プロセス単位コアダンプ: enabled
      グローバル setid コアダンプ: disabled
    プロセス単位 setid コアダンプ: disabled
   グローバルコアダンプのロギング: disabled

この設定ではcoreファイルが何度も作られると古いファイルが上書きされたりどのプロセスのcoreファイルが残っているのか分かりにくくなるので、以下のようにしてファイル名が一意のなるようにすることができる。

例) ファイル名を「core.<プログラム名>.」に変更する

# coreadm -i core.%f.%p
# coreadm
:
      init コアのファイルパターン: core.%f.%p
:

また、coreファイルの作成を抑止するには以下のようにする。

# coreadm -d process
# coreadm
 グローバルコアのファイルパターン: 
     グローバルコアファイルの内容: default
      init コアのファイルパターン: core
          init コアファイルの内容: default
             グローバルコアダンプ: disabled
           プロセス単位コアダンプ: disabled ← coreファイルの作成抑止
      グローバル setid コアダンプ: disabled
    プロセス単位 setid コアダンプ: disabled
   グローバルコアダンプのロギング: disabled

2007/7/29更新

対応バージョン: 8

セキュリティ向上のため標準ではrootがオーナーのスクリプトはsetuid状態で実行できない。

ただし以下のようにスクリプトの最初にオプションを付けることによってこの制限を外すことができる。

Bourneシェルの場合

#!/bin/sh -p

Cシェルの場合

#!/bin/csh -b

2007/7/29更新

対応バージョン: 8,10

/etc/default/initファイル中で設定する。

TZ=Japan
CMASK=022
LANG=ja_JP.UTF-8

LANGの値を目的のロケール(ja, ja_JP.PCK, ja_JP.UTF-8等)に変更してリブートする。

2007/7/29更新

対応バージョン: 9

automounterが動作しているのが原因。

automounterはNFSサイト用に設計されており、マウントが必要なファイルシステムのリストの保守が容易になる。

automounterはデフォルト/homeを管理し、その事実上のNFSサーバとして動作するため、automounterが動作している状態では/homeへのアクセスはできなくなる。

そのため通常のディレクトリのようには扱えない。

これは通常どのマシンでも全員のホームディレクトリが/home/という形式である場合、管理が簡単になるメリットがある。

automounterを使い続けたい場合には、/etc/auto_masterを編集して/homeで始まる行をコメントアウトし、automountdにマップをリロードさせるautomountコマンドを起動する。

スタンドアローン、あるいは小規模なネットワークであるということでこの機能をオフにするには/etc/init.d/autofsstopを起動して、automountdをストップさせることができる。

また、ファイル/etc/rc2.d/SXXautofsの名称を/etc/rc2.d/_SXXautofs等(先頭がSでない)ファイル名に変更することでブート時にautomountdがスタートしてしまうのを避けることができる。

もしまたautomounterを使いたくなった場合にはただファイル名を元に戻すだけでよい。

関連資料・記事

2007/7/29更新

対応バージョン: 9

以下の作業により利用可能になる。

/etc/auto_masterに以下の行を追加

/-          auto_direct

/etc/auto_directに各マウントポイントを設定

/foo1/bar1 <オプション> nfs://<ホスト>/foo1/bar1 ← NFS URLを使用した指定方法
/foo2/bar2 <オプション> <ホスト>:/foo2/bar2 ← 従来の指定方法

automountdを再起動

# /etc/init.d/autofs stop
# /etc/init.d/autofs start

2007/7/29更新

対応バージョン: 9

Solaris標準機能であるオートマウントを使用する。

まず/etc/auto_masterに

/home   /etc/auto_home   -rw,secure

と記述されていた場合(デフォルト)は/etc/auto_homeに以下の記述を追加してautomountdにHUPシグナルを送って設定を有効にする。

#+auto_home ← コメントアウト
*    -rw     localhost:/export/home/& ← 追加

尚、「*」と「&」はそれぞれ以下の意味である。

*

任意のディレクトリ名に置き換えられる。

&

自行の第一オクテットで指定された文字列に置き換えられる。

つまり、/export/home/fooと/export/home/barがあった場合に/etc/auto_homeにこのように記述しておけば、実際には以下のように記述したのと同じ動作をする。

foo  -rw  localhost:/export/home/foo
bar  -rw  localhost:/export/home/bar

2008/4/26更新

対応バージョン: 10

以下の手順で設定する。

必要なパッケージがインストールされていることを確認

以下のパッケージがインストールされていなければ以降の設定に先立ってインストールする。

# pkginfo
:
system  SUNWaccr         System Accounting, (Root)
system  SUNWaccu         System Accounting, (Usr)

initスクリプト配置

# ln /etc/init.d/acct /etc/rc2.d/S22acct
# ln /etc/init.d/acct /etc/rc0.d/K22acct

アカウンティング開始

# /etc/rc2.d/S22acct start
Starting process accounting

アカウンティング停止

# /etc/rc0.d/K22acct stop
Stopping process accounting

アカウンティングを停止しても以下のファイルは削除されないので必要に応じて削除する。

/var/adm/pacct

アカウンティング情報

/var/adm/acct/{fiscal,nite,sum}/*

アカウンティング情報をもとに統計情報などを納めたファイル

また、次回リブート時にアカウンティングを開始させたくなければ/etc/rc?.d配下のinitスクリプトを削除する(/etc/init.d配下のファイルは残しておく)。

# rm /etc/rc2.d/S22acct
# rm /etc/rc0.d/K22acct

アカウンティング情報管理

アカウンティングファイルは/var/adm/pacctとして作成される。

このファイルはacctcom、lastcommコマンドを使用して履歴情報として表示できる。

# acctcom
COMMAND               START    END        REAL    CPU    MEAN
NAME     USER TTYNAME TIME     TIME     (SECS) (SECS) SIZE(K)
#accton  root  pts/2  22:11:45 22:11:45   0.02   0.01 1540.00
turnacct root  pts/2  22:11:44 22:11:44   0.13   0.01 1688.00
sleep    root  pts/2  22:11:45 22:11:45   0.01   0.01 1212.00
ls       root  pts/2  22:11:45 22:11:45   0.01   0.01  896.00
mv       root  pts/2  22:11:45 22:11:45   0.01   0.01  896.00
:

# lastcomm
acctcom  root  pts/2     0.00 secs Fri Apr 25 22:21
ls       root  pts/2     0.00 secs Fri Apr 25 22:19
file     root  pts/2     0.00 secs Fri Apr 25 22:18
ls       root  pts/2     0.00 secs Fri Apr 25 22:18
ls       root  pts/2     0.00 secs Fri Apr 25 22:18
:

関連ツールとして/usr/lib/acctディレクトリ配下に以下のようなものがあるが、これらは必要に応じてcronなどで定期的に実行する。

ckpacct

/var/adm/pacctファイルのローテートを一定のサイズ(デフォルトは500ブロック)毎に行う。

サイズを変更したい場合は「ckpacct 300」などとして引数で指定できる。

runacct

1日で採取されたアカウント情報を集計して/var/adm/acct/niteディレクトリ配下に格納する。

またrunacctによって/usr/lib/acct/prdailyが1日に1回実行され、性能評価などに利用されるテキスト形式の/var/adm/acct/sum/rprtMMDDが作成される。

monacct

runacctで生成された/var/adm/acct/sum/rprtMMDDファイルを月単位で集計する。

集計されたデータは/var/adm/acct/fiscal/fiscrptMMファイルに格納され、/var/adm/acct/sum配下のファイルがクリアされる。

dodisk

各ユーザのディスク使用情報を採取する。

収集されたデータは/var/adm/acct/nite/disktacctファイルに格納され、/var/adm/acct/sum/rprtMMDDファイルの作成に使用される。

関連資料・記事

2007/7/29更新

対応バージョン: 9

以下の手順で設定する。

initスクリプト配置

# cd /etc/rc2.d
# ln -s ../init.d/acct S22acct

# cd /etc/rc0.d
# ln -s ../init.d/acct K22acct

現在年/プライムタイムの設定

# cd /etc/acct
# cp -p holidays holidays.YYYYMMDD
# vi holidays

:
* Prime/Nonprime Table for UNIX Accounting System
*
* Curr  Prime  Non-Prime
* Year  Start  Start
*
  2000  0800   1800
  ↑
現在年、プライムタイム/ノンプライムタイムそれぞれの開始時刻を設定する。
現在年は毎年変更する必要がある。

*
* only the first column (month/day) is significiant.
*
* month/day     Company
*               Holiday
*
1/1             New Years Day
7/4             Indep. Day
12/25           Christmas
↑
休日等、終日ノンプライムタイムになる日を指定する。

アカウンティング開始

# /etc/rc2.d/S22acct start

アカウンティング情報の参照方法や各種ツールの使用方法などは以下の資料を参照。

関連資料・記事

2007/7/29更新

対応バージョン: 8

以下のような脆弱なパスワードを指定しようとすると上記のエラーが出てパスワード変更が拒否される。

アカウント名と同じ
アカウント名をずらしただけのもの

尚、この機能はPAMモジュールのpam_authtok_check(5)によって制御されている。

2008/11/28更新

対応バージョン: 10

アカウントのパスワードには文字長や文字種など種々の要件が設定されているが、これを変更するには/etc/default/passwdで要件毎に値を設定する。

以下、主な要件について説明する。

パスワードに含める文字の設定

MINALPHA

パスワードに含める「英字」の最小数。大文字小文字は区別しない。

デフォルトは2。

MINLOWER

パスワードに含める「英小文字」の最小数。

デフォルトは0(チェックしない)。

MINUPPER

パスワードに含める「英大文字」の最小数。

デフォルトは0(チェックしない)。

MINDIGIT

パスワードに含める「数字」の最小数。

デフォルトは0(チェックしない)。

MINNONALPHAを指定した場合は使用できない。

MINSPECIAL

パスワードに含める「特殊文字」(英字・数字以外の文字)の最小数。

デフォルトは0(チェックしない)。

MINNONALPHAを指定した場合は使用できない。

MINNONALPHA

パスワードに含める「英字以外の文字」(数字・特殊文字)の最小数。

デフォルトは1。

MINDIGITかMINSPECIALを指定した場合は使用できない。

WHITESPACE

パスワードに空白文字を使用できるかどうかの指定(YES/NO)。

デフォルトはYES。

MAXREPEATS

同じ文字を続けてもよい回数の最大数。

デフォルトは0(チェックしない)。

パスワード全体に関する設定

PASSLENGTH

パスワードに最低限必要な文字数。

デフォルトは6。

MINDIFF

古いパスワードと新しいパスワードで異なる必要がある文字の最小数。

デフォルトは3。

2008/6/10更新

対応バージョン: 10

アカウントのパスワードを履歴管理し、過去n世代前のパスワードが使用できないようにするには/etc/default/passwdのHISTORYパラメータに管理する世代数を設定する。

設定可能な値は0〜26である(0は履歴管理なし)。

例) 3世代分管理

HISTORY=3

履歴管理が設定された状態でパスワード変更に過去n世代以内のものを使用しようとすると以下のようなメッセージが出る。

% passwd foo
既存のログインパスワードを入力してください: *****
新しいパスワード: *****
passwd: パスワードは履歴リスト内にあります。

再度実行してください
新しいパスワード: 

尚、この設定が適用されるのはローカルのアカウントに限られる。

2008/2/29更新

対応バージョン: 8

アカウントの2次グループは最大16(1次グループ=1、2次グループ=15)であるが、/etc/systemに以下の設定を追加することによりこれを増やすことができる(上限は32)。

set ngroups_max = 32

リブートを行うことで設定が有効になる。

設定が有効になったかどうかは以下のコマンドで確認できる。

# echo ngroups_max/D | adb -k
physmem 1f10c
ngroups_max:
ngroups_max:    32 ←

尚、NFSが利用するRPCの仕様(RFC1057)ではグループ数の上限が16と決められているのでngroups_maxの値を17以上に変更するとNFSが正常に動作しないことがある。

したがってNFSを利用する環境では16以下の設定にすることが推奨される。

2008/3/13更新

対応バージョン: 9,10

一般的なUNIX系OSではchshコマンドを使用するが、Solarisではchshの替わりに「passwd -e」を使用する。

例)

# passwd -e foo
Old shell: /bin/sh
New shell: /bin/bash
passwd: password information changed for foo

関連資料・記事

2007/7/29更新

対応バージョン: 8

以下の通り。

文字種

英数字

文字数

2〜8

注意事項

最初の文字は英字であること。

少なくとも1文字は小文字であること。

1つのユーザが所属できるグループは最大16。

最大UID,GID

2,147,483,647

(*) UID 0-99はシステムアカウント

(*) UID 60001はアクセス権のないユーザ(nobody)

(*) UID 60002はnoaccess (以前のSolaris 2.XとSVR4リリースとの互換性のために提供)

(*) 60003以上のUIDはSolarisの多くの機能と互換性がないので使用しないこと。

2007/7/29更新

対応バージョン: 9

システムにファームウェアリビジョン1007のToshiba SD-M1401 DVD-ROMドライブが含まれているとSolaris 9 DVDからのブートが失敗する。

同事象はファームウェアパッチ111649-03にて修正されているので以下の手順でパッチを適用する。

パッチを任意のディレクトリに解凍

ボリュームマネージャ停止

# /etc/init.d/volmgt stop

パッチ適用

# cd <パッチ格納ディレクトリ>
# ./optdload
:

c1t6d0s2  TOSHIBA  DVD-ROM SD-M1401  1007  06/22/00

↑対象デバイスが表示される

Are you sure you want to download firmware to this device (y/n)[n]? ■ ← y

マシンリブート

2007/5/24更新

CD-ROMでブート

ok boot cdrom

→ インストーラが自動的に起動する。

使用言語選択

インストール時に使用する言語を選択する。

ここで選択する言語はあくまでインストール時に(メッセージ表示用に)のみ使用される言語なので、実際にインストールする言語セットとは関係ない。

インストールに使用する端末によっては日本語がうまく処理できない場合もあるので、作業は英語で行うことにする。

The Solaris Installer can be run in English, or any of the following
languages:

 1) English                            6) Japanese
 2) German                             7) Korean
 3) Spanish                            8) Swedish
 4) French                             9) Simplified_Chinese
 5) Italian                           10) Traditional_Chinese

Select the language you want to use to run the installer: ■ ← 1

初期インストールかアップグレードインストールかの選択

ここでは初期インストールを行うことにする。

Do you want to do a Initial Install or Upgrade?

1) Initial Install
2) Upgrade
Please Enter 1 or 2 > ■ ← 1

rootディスクのレイアウト

新規インストールの場合はrootディスクをフォーマットしておいたほうが無難である。

The default root disk is /dev/dsk/c0t0d0.
The Solaris installer needs to format
/dev/dsk/c0t0d0 to install Solaris.

Do you want to format /dev/dsk/c0t0d0?  [y,n,?,q] ■ ← y

スワップのサイズをMB単位で指定する。

Enter a swap slice size between 382MB and 8632MB, default = 512MB [?] ■

スワップ用スライスをディスクの先頭から作成するかどうかを選択する。ルートファイルシステム用のスライスをディスクの先頭にするような場合はnを選択する。

Can the swap slice start at the beginning of the disk  [y,n,?,q] ■

上記質問にnと答えた場合、開始シリンダの入力を求められるので適切なシリンダを指定する。

Enter a starting cylinder between 0 and XXXX, default = 0 [?] ■

ここまでの設定を再確認する。

You have selected the following to be used by the Solaris installer:

    Disk Slice  : /dev/dsk/c0t0d0
    Size        : XXXX MB
    Start Cyl.  : 0

Is this OK  [y,n,?,q] ■ ← この指定でよければy

ここでminirootのインストールが始まり、終了するとリブートがかかる。

リブート後は自動的にWeb Startインストーラが起動するので対話形式でインストールを進めていく。

Web Startによるインストール開始

まず最初にインストールのステップが表示されるのでリターンを押して作業を進める。

  Network
  Name Service
  Date and Time
  Root Password
  Power Management

<Press Return to continue> ■ ← リターン

ネットワーク設定

ホストがネットワークに接続されているかどうかを選択する。

Is this machine networked (y/n) [n]? ■ ← ここではyを選択する

ネットワーク設定にDHCPを使用するかどうかを選択する。

Would you like to configure using DHCP [n]? ■ ← ここではnを選択する

ホストの属性を入力する。

Enter host name []: ■ ← ホスト名

Enter this machine's IP Address []: ■ ← IP アドレス

Enter the subnet netmask [255.255.255.0]: ■ ← サブネットマスク

Enable IPv6 [n]: ■ ← IPv6を使用する場合はy。ここではnを選択する

使用するネームサービスを選択する。

Available name services:

1. NIS+
2. NIS
3. DNS
4. LDAP
5. None

Please enter the number corresponding to the type of name service you would like [5]: ■ ← ここでは5を選択する

デフォルトルートを自動で設定するか手動で設定するかを選択する。

The default route provides a bridge between two physical networks that
forwards traffic between the networks.

You can let the software try to find one or you can specify one. The software
can find a default route only if the system is on a network that has a router
that broadcasts itself.

1. Find one
2. Specify one

Please enter the number corresponding to your router discovery method [1]: ■ ← ここでは2(手動)を選択する

デフォルトルートを設定する。

On this screen you must enter the IP Address of the default route.
IP Addresses must contain four sets of numbers separated by periods.

Router Address []: ■ ← デフォルトルート(XXX.XXX.XXX.XXX)を設定

タイムゾーン設定

タイムゾーンを選択する。日本を含む特定の地域を選択する場合は1を選択する。

Specify Time Zone by:

1. Geographic region
2. Offset from GMT
3. Time zone file

Please enter the number corresponding to how you would like to specify the
time zone [1]: ■ ← 1

リージョンを選択する。日本の場合は2。

Available Regions:

1. Africa
2. Asia, Eastern
3. Asia, Western
:

Please enter the number corresponding to the correct region [1]: ■ ← 2

ゾーンを選択する。日本の場合は4。

Available Zones:

1. People's Republic of China
2. Taiwan
3. Hong Kong
4. Japan
5. Republic of Korea
6. Singapore

Please enter the number corresponding to the correct zone [1]: ■ ← 4

デフォルトの日時が表示されるのでこれでよければy、違っていればnを選択して正しい時刻を入力する。

The default date and time is Monday October 20 13:14:31 JST 2003.
Do you want to use this date and time (y/n) [y]? ■

rootパスワード設定

Enter the root password []: ■ ← rootのパスワード
Enter the root password again []: ■ ← rootのパスワード(再入力)

インストールパラメータ確認

You have entered the following values:

  Host Name:                <ホスト名>
  IP Address:               <IPアドレス>
  System part of a subnet:  Yes
  Netmask:                  <ネットマスク>  
  Enable IPv6:              No
  Name Service:             None
  Default Route:            Yes
  Router Address:           <デフォルトルート> 
  Time Zone:                Japan
  
Enter 'y' to apply these values and proceed to the next stage of the
installation, or 'n' to return to the beginning and make changes (y/n): ■ 
← この設定でよければy、修正したければnを選択して再度目的の設定を行う。

付属ソフトウェアインストール

Solaris Web Start will assist you in installing software for Solaris.
    
  <Press ENTER to continue> ■ ← リターン

インストールメディアを選択する。

Please specify the media from which you will install the Solaris Operating
Environment.

Media:
  
1. CD  
2. Network File System 
3. HTTP (Flash archive only)
4. Local Tape (Flash archive only)
  
Media [1]: ■ ← ここでは1を選択する

Please insert the first CD from which you will install the Solaris Operating
Environment.
To select a different media, enter B to go Back.

  [] ■ ← 「SOLARIS 8 SOFTWARE 1 OF 2」のCDをCD-ROMに挿入してリターン

インストール種別を選択する。

Types of install available:

  1. Default Install
  2. Custom Install

Select the number corresponding to the type of install you would like [1]: ■
← デフォルトインストールかカスタムインストールかを選択するが、デフォルトを
   選択するとローカライズの設定もデフォルト(北米)になってしまうので2を選択する。

ローカライズの設定を行う。

  [ ]  0   Northern Africa
   :
  [ ]  11  Asia

To edit a region selection, enter the number here.
Enter n when finished. [n] ■ ← 地域コードを選択。日本の場合は11。

  [ ]  11     Asia
  [ ]  11.0   Japanese ( ja )
  [ ]  11.1   Japanese (Japan,PCK) ( ja_JP.PCK )
  [ ]  11.2   Japanese (Japan,UTF-8) ( ja_JP.UTF-8 )
  [ ]  11.3   Korean ( ko )
  [ ]  11.4   Korean (UTF-8) ( ko.UTF-8 )
  [ ]  11.5   Thai (Thailand) ( th_TH )
  [ ]  11.6   Chinese ( zh )
  [ ]  11.7   Chinese (GBK) ( zh.GBK )
  [ ]  11.8   Chinese (UTF-8) ( zh.UTF-8 )
  [ ]  11.9   Chinese (Taiwan) ( zh_TW )
  [ ]  11.10  Chinese (Taiwan,BIG5) ( zh_TW.BIG5 )
  [ ]  11.11  Chinese (Taiwan,UTF-8) ( zh_TW.UTF-8 )

To toggle locales in Asia, enter the number here.
Enter n when finished. [n] ■ 
← インストールするロケールを選択する(複数選択可能)。
   日本の場合は11.0、11.1、11.2を選択する。

上記を全て選択すると以下のような表示になる。

  [-]  11     Asia
  [X]  11.0   Japanese ( ja )
  [X]  11.1   Japanese (Japan,PCK) ( ja_JP.PCK )
  [X]  11.2   Japanese (Japan,UTF-8) ( ja_JP.UTF-8 )
  [ ]  11.3   Korean ( ko )
  [ ]  11.4   Korean (UTF-8) ( ko.UTF-8 )
   :

To toggle locales in Asia, enter the number here.
Enter n when finished. [n] ■ ← nを入力して一つ前のメニューに戻る

  [ ]  0   Northern Africa
   :
  [-]  6   North America
   :
  [-]  11  Asia

To edit a region selection, enter the number here.
Enter n when finished. [n] ■ ← nを入力して一つ前のメニューに戻る

デフォルトロケールの変更を行う。

Available regions:

  0     North America
  1     Asia
  2     POSIX

Default locale to be used:
English (United States,ISO8859-1) ( en_US.ISO8859-1 ).

If you wish to change the locale to be used, enter the number next
to the desired region to choose the locale to be used after the system
has been installed or enter n to use the default.  [n] ■ ← 日本の場合は1

Available locales for Asia:

  2.   Japanese ( ja )
  3.   Japanese (Japan,PCK) ( ja_JP.PCK )
  4.   Japanese (Japan,UTF-8) ( ja_JP.UTF-8 )
Please enter the number next to the desired locale to be used after the
system has been installed, or enter n to choose a new region.  [n] ■
← デフォルトで使用する言語パックを選択

ここからはインストールしたい対象物を選択していく。

各サイトによって必要なものは異なるので手順は省略する。

追加ソフトウェアインストール

標準でインストールされるソフトウェア以外に追加でインストールしたいソフトウェアがあればここで選択する。

例えばDiskSuite(下記メニューの2)などは標準ではインストールされないので必要に応じてインストール指示をする。

Select the CDs and products you would like to install.

 [X]  0  Solaris 8 Documentation European   204.4 MB
 [X]  1  Solaris 8 Documentation Asian   122.7 MB
 [ ]  2  Solaris 8 Software 2 of 2   0.0 MB
 [-]  3  Multilingual Computer Systems Supplement CD   246.0 MB

Select which CD(s) to install with the system. You will then be able to choose
individual products on each CD.

さらに、Solaris標準添付のもの以外に追加インストールしたいソフトウェアがあればここでインストールする。

各サイトによって必要なものは異なるので手順は省略する。

Additional Products

To scan for additional products, select the location you wish to scan.
Products found at the selected location that are in a Web Start Ready install
form will be added to the Products list.

  1. None
  2. Product CD
  3. Kiosk Download
  4. Local or Network File System

Web Start Ready product scan location [1]:

64bitサポート有無選択

従来の32bitモードに加えて64bitモードをサポートするかどうか選択する。

Do you want 64-bit support?  64-bit support is required in order to use this
product in 64-bit architecture environments.

  1. Software will be installed with 64-bit and 32-bit support (Recommended).
  2. Software will be installed with 32-bit support only.

Enter the number corresponding to your choice  [1] ■
← (32bitモードに加えて)64bitモードをサポートする場合は1。

ソフトウェアグループ選択

サイトの目的に応じてソフトウェアグループが以下のように分類されているので、必要なソフトウェアグループを選択する。

Available Solaris Software groups:

1. Entire Group Plus OEM
2. Entire Group
3. Developer Group
4. End User Group
5. Core Group

  Select the number corresponding to the desired Solaris software group [2]: ■