NEWS(NWS5000)に純正品以外のHDDを増設する手順は以下のようなものです。

1.SCSI IDを決めてNEWSに接続する。
2.カーネルにHDDの機種登録を行う。
3.formatコマンドを作り直す。
4.パーティションを決め、ディスクラベルを書く。
5.newfsを行いファイルシステムを作成する。

NEWSOSでは、HDDの認識がUNKNOWNのままでも使用する事は可能です
しかし、
formatコマンドで再formatが出来ない
UNKNOWNだと気分が悪い
HDDの設定によっては処理能力が今一つ

などの気になるところもあります。
そこで今回は、それなりの設定を追加しカーネルはもちろん
NEWSOSのformatコマンドまで再作成して見ることにします。

まず、現在の認識状況を確認します。

dmesg
SCSI1 Initialization... done
sd8 at spifi1 slave 0 (bus=1, chan=0, lun=0)
sd8: UNKNOWN

format -v /dev/rsd10c
format: format_sd: $SonyRevision: 4.3500 $
 ** SCSI bus=1, chan=0
 **         lun = 0
 ** Attached disk is UNKNOWN
        "IBM     DNES-309170     SA30"

上記から、増設したHDDは IBM DNES-309170 であり NEWSOSの認識が
UNKNOWNであることがわかります。

NWS5000/NWS3150では /usr/include/newsapbus それ以前の機種では
/usr/include/newsiodevにNEWSOSにおけるHDDのデータが記述された
sdreg.h,sddefs.cがあります。

sdreg.h の中にある以下のブロック
device type code */
enum sd_device_types {
}
の中に、新しく増設するHDDのエントリを作成します。
今回は、 DNES309170 とします。

scsiping等で HDDの諸元を調べます。

   Read capacity:
      9173114880bytes (17916240blocks, 512bytes/block)
   Inquiry:
      IBM     DNES-309170     SA30
      Hard disk(00), SCSI3, ECMA=0, ISO=0
      Options: SYNC LinkCtl CmdQueue

         Format parameters 1:
            14 5F 00 00 00 00 00 00 01 40 02 00 00 01 00 0B 00 14 40 00 00 00
            Tracs/zone: 5215, AltSect/zone: 0, AltTrack/zone: 0, AltTrack/LU: 0
            Sect/track: 320, Byte/sect: 512
            InterLeave: 1, Track skew: 11, Cylinder skew: 20
         Geometry parameters:
            00 2C D2 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1C 20 00 00
            Cylinders: 11474, Head: 5, rpm: 7200

以上より

トラック当たりのセクタ数: 320
トラック数(ヘッド数)    : 5
シリンダ当たりのセクタ数: 320 * 5
シリンダ数              : 11474
回転数(毎秒)            : 120 

ですが同時にReadCapacityで、17916240blocksとなっているため
安全を見て 17916240blocksに収まるように調整します。

そこで作成したのが以下のものです。

sddefs.c
ジオメトリ定義
struct sdst sdst_dnes309170 =
    {320,  5,320*5,11197,120,0,calc_disk_sizes }; /* DNES-309170 */

デバイス情報
    {                                   /* IBM DNES-309170 */
        20,                             /* identify length */
        "IBM     DNES-309170 ",
        revs_all,                       /* revision */
        17916240,                        /* drive capacity */
        "hd8950",                       /* device nickname */
        DNES309170,                     /* device type code */
        FIRM_CACHE_ON|FIRM_AWRE|FIRM_SYNCTR,    /* firmware spec */
#ifdef FORMAT_PAGE
        NULL,                           /* Format Parameters */
        0,                              /* Format time (in seconds) */
        0,                              /* reserved */
#else /* FORMAT_PAGE */
        0,                              /* synchronous transfer period */
        8,                              /* synchronous transfer offset */
        NULL,                           /* device setup commands */
#endif /* FORMAT_PAGE */
        &sdst_dnes309170,               /* device specifications */
        NULL,                           /* normal Error Recovery Parameters */
        NULL,                           /* max Error Recovery Parameters */
        NULL,                           /* Other Parameters */
        NULL,                           /* Format options */
    },


ジオメトリ定義は順に
トラック当たりのセクタ数
トラック数
シリンダ当たりのセクタ数
シリンダ数
回転数(毎秒)
0
パーティション定義
となっています。


次に、細かな設定を行います。まず フォーマット時のパラメータを設定します。
scsipingの結果より

     Format parameters 1:
        14 5F 00 00 00 00 00 00 01 40 02 00 00 01 00 0B 00 14 40 00 00 00
        Tracs/zone: 5215, AltSect/zone: 0, AltTrack/zone: 0, AltTrack/LU: 0
        Sect/track: 320, Byte/sect: 512
        InterLeave: 1, Track skew: 11, Cylinder skew: 20


scsipingで得られる内容はDataそのものなので以下のように設定します

char fmt_dnes309170[] = {                               /* DNES-309170 */
        SDM_PG_FMT1,
        0x16,
        0x14, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x01, 0x40, 0x02, 0x00, 0x00, 0x01, 0x00, 0x0b,
        0x00, 0x14, 0x40, 0x00, 0x00, 0x00
};

 SDM_PG_FMT1 : formatを示すマクロ
 0x16        : 次に続くデータ長(今回は22Byte)
 data

と言う構成になっています。

char *fmtp_dnes309170[] = { fmt_dnes309170, NULL };

次に、異常発生時のリトライ関係の設定をします

     Error recovery parameters:
        C0 01 00 00 00 00 01 00 00 00
        AWRE ARRE
        Read retry count: 1, Correction span: 0, Head offset count: 0
        Data strobe offset: 0, Write retry count: 0, Recovery time limit: 1

デフォルトでは、AWRE、ARREになっているがNEWSではポリシーとして
AWRE、DCRとして使うようです。
リトライカウント1
上記の部分で C0 01 を示しているので後続のDataをパラメータとして設定します。

char erp_dnes309170[] =                                 /* DNES309170 */
    { SDM_PG_ERR, 0x0a, SDM_AWRE|SDM_DCR, IBM_ALLOWABLE_RETRY, 0, 0, 0, 0, 1, 0, 0, 0 };

最大リトライ回数等の設定をします。

char max_erp_dnes309170[] =                             /* DNES309170 */
    { SDM_PG_ERR, 0x0a, SDM_AWRE, IBM_MAX_RETRY, 0, 0, 0, 0, 1, 0, 0, 0 };

ほとんど先に作成したリトライに関する設定、erp_dnes309170と同じになります
SDM_DCRを外し、最大再試行回数(IBM_MAX_RETRY)を設定します。
ちなみに、IBM HDDの為に設定されているIBM_ALLOWABLE_RETRY,IBM_MAX_RETRYとも
値は同じ 1 です。これは、NEWSOSのdefault値です。

そこで、先程は細かい設定をしていなかったデバイス情報を更新します。

    {                                   /* IBM DNES-309170 */
        20,                             /* identify length */
        "IBM     DNES-309170 ",
        revs_all,                       /* revision */
        17916240,                       /* drive capacity */
        "hd8950",                       /* device nickname */
        DNES309170,                     /* device type code */
        FIRM_CACHE_ON|FIRM_AWRE|FIRM_SYNCTR,    /* firmware spec */
#ifdef FORMAT_PAGE
        fmtp_dnes309170,                /* Format Parameters */
        60*30,                          /* Format time (in seconds) */
        0,                              /* reserved */
#else /* FORMAT_PAGE */
        0,                              /* synchronous transfer period */
        8,                              /* synchronous transfer offset */
        NULL,                           /* device setup commands */
#endif /* FORMAT_PAGE */
        &sdst_dnes309170,               /* device specifications */
        erp_dnes309170,                 /* normal Error Recovery Parameters */
        max_erp_dnes309170,             /* max Error Recovery Parameters */
        NULL,                           /* Other Parameters */
        NULL,                           /* Format options */
    },

 
以上で、カーネル formatコマンドの再構成が可能なはずですがformatコマンドが
作成できません。(カーネルは作成できます)

本来は、/usr/src/sony/bin/formatの下でmake すれば良いはずです。

調べてみると、Makefileの中で /usr/src/sys/newsiodevの下にあるsddefs.cを
読み込んでいます。
これでは、変更が効くわけがありません。
そこで、/usr/src/sony/bin/formatの下にある Makefileを変更します。

SD_DIR=   $(TOP)/sys/newsiodev
SRC=      $(SD_DIR)/sddefs.c

となっていますので

SD_DIR=   $(TOP)/sys/newsapbus

にすると変更が反映されます。
make
make install で formatコマンドが更新されます。

NEWSの再起動を行います。
確認してみます。

dmesg
SCSI1 Initialization...  done
sd8 at spifi1 slave 0 (bus=1, chan=0, lun=0)
sd8: hd8950


format -v /dev/rsd10c
format: format_sd: $SonyRevision: 4.3500 $
 ** SCSI bus=1, chan=0
 **         lun = 0
 ** Attached disk is hd8950
        logical block = 0x111614f
             capacity = 8748(Mbytes)
         block length = 512(bytes)

正常に認識されているようです。

あとは、適切なdisktab/disklabelを書けば使用可能です。


これは、HDD増設時のメモとして作成したものです。
いくつかのパラメータの設定を誤ると、HDDがおかしな動作をする場合が
あります。
設定する値は間違いのないように良く確認して作業を行いましょう。

Nov.13.1999
NEWS World