<!-- $Id: esdi.sgml,v 1.5 1997-02-25 04:55:26 hanai Exp $ -->
<!-- The FreeBSD Japanese Documentation Project -->
<!-- Original revision: 1.10 -->

<!--
      <title>ESDIハードディスクの紹介と FreeBSDでの利用</title>
      <author>(c) 1995, Wilko Bulte, <tt/wilko@yedi.iaf.nl/
      <date>Tue Sep 12 20:48:44 MET DST 1995</date>

    Copyright 1995, Wilko C. Bulte, Arnhem, The Netherlands 

<abstract>
この文書で解説するのは, ESDIハードディスクを FreeBSDオペレーティングシ
ステムとの組み合わせで利用することについてです. 一般的に信じられている
こととは違い, ESDIハードディスクを FreeBSDで利用することは可能です. 実
際,  ESDIを利用したシステムをうまく使っている人たちが存在します!  この
文書をとおして, ESDIハードディスクをいかに使うのかを紹介していきたいと
思います. 

この文書のなかで, もし欠落しているものや単純な間違い, あるいは文書をよ
りよいものにするための有効なご意見がございましたら, ぜひ 
<tt/wilko@yedi.iaf.nl/ までメールにてお知らせください. 
</abstract>
-->

<sect1><heading>ESDIハードディスクの使い方<label id="esdi"></heading>

<p><em>原作および Copyright &copy; 1995, &a.wilko;.<newline>24 September 1995.</em>

<p><em>訳: &a.ts;<newline>2 September 1996.</em>

ESDIとは Enhanced Small Device Interfaceの略語です. この技術は, 馴染み
深い ST506や ST412といったインタフェースに基づくものであり, 世界初の普
及型 5.25インチのウィンチェスタディスクを造ったSeagate Technology社に
よって最初に作られました. 

ESDIの Eは拡張 (Enhanced) を表しており, 実際そのとおりです. まず, イン
タフェースの速度は速く, 10 ないし 15Mビット/秒であり, ST412インタフェー
スに接続したドライブの 5Mビット/秒よりも高速です. また, 上位レベルのコ
マンドがいくつか追加されて, オペレーティングシステムレベルのドライバ作
成者にとって, ESDIインタフェースはある程度インテリジェントなものとなり
ました. ただし SCSIほどにインテリジェントではありません. ESDIは ANSIが
標準化をおこなっています.

トラックごとのセクタ数を増やすことで, ESDIドライブの記憶容量は引き上げ
られました. 通常, トラックあたり 35セクタですが, 今までに筆者がみたド
ライブの中で大容量のものは, トラックあたり 54セクタもありました. 

ESDIは IDEや SCSIといったインタフェースの普及によって消えつつあります
が, 無料あるいは在庫処分の格安なドライブが入手可能であることを考えると, 
少ない (もしくは現状の) 予算で縛られたシステムにとって, ESDIドライブは
理想的です. 

<sect2><heading>ESDIのコンセプト</heading>
<p>
<sect3><heading>物理的な接続</heading>
<p>
ESDIインタフェースでは, ドライブごとに2つのケーブルを接続します. 第 1
のケーブルは34ピンのフラットケーブルエッジコネクタで, コントローラとド
ライブ間のコマンドおよびステータスの両信号のやりとりのためのものです. 
コマンド用ケーブルは, すべての ESDIドライブをデイジーチェーンで結び
ますから, すべてのドライブを接続したバスを構成することになります. 

第2のケーブルは20ピンのフラットケーブルエッジコネクタで, ドライブへの
データ入出力に使います. このケーブルは放射状に接続しますから, ドライブ
ごとにコントローラへの専用接続を持つことになるわけです.

筆者の経験によれば, PC向け ESDIコントローラには, コントローラあたり最
大 2 台までのデバイス接続が可能という制限がありました. これは, ドライ
ブのアドレス割り当てのために, 単一ビットだけを用意したという WD1003か
ら持ち越された互換 (?) 機能なのだと思われます. 

<sect3><heading>デバイスのアドレス指定</heading>
<p>
1本のコマンドケーブルには最大で 7つのデバイスと 1つのコントローラを接
続することができます. どのドライブをコントローラがアドレスしているのか
を個別に認識できるようにするために, ESDIデバイスは, デバイスアドレスを
設定するためのジャンパかスイッチを備えています. 

PC向けコントローラでは, 最初のドライブにはアドレス0を設定し, 第2番目の
ディスクへはアドレス1を設定します.  <it>いつも留意すべきことは, </it> 
ディスクごとに固有のアドレスを必ず設定するということです! つまり, コン
トローラあたり最大2台のドライブというような PC向けのものでは, 第1 ドラ
イブは第0番ドライブで, 第2ドライブは第1番ドライブだということです.

<sect3><heading>ターミネート処理 (termination)</heading>
<p>
デイジーチェーン接続用コマンドケーブル (34ピンのケーブルであることを覚
えていますか? ) では, 最後のチェーン接続ドライブでターミネートしなけれ
ばなりません. このために, ESDIドライブにはターミネート用抵抗ネットワー
クが付属しており, ターミネートする必要がないときにはその抵抗をドライブ
から外したり, またはジャンパで無効 (disable) にすることができるようになっ
ています. 

したがって, ひとつのドライブ, すなわちコマンドケーブルの最終端に位置す
るドライブだけが, そのターミネート用抵抗を有効 (installまたは enable) 
にすることができます. コントローラは自動的にコマンドケーブルのもう一方
の端のターミネート用抵抗を有効にします. ご注意いただきたいのは, コント
ローラは必ずコマンドケーブルのいずれかの端に位置しなければならず, けっ
して途中に位置するようにしては <it>いけない</it> ということです. 

<sect2><heading>ESDIディスクの FreeBSDでの使い方</heading>
<p>
ESDIを初めて動かすようにすることが, どうしてこうも大変なことなのでしょ
うか ?

ESDIディスクを FreeBSDで動かそうと試みた人たちが激烈なイライラを募らせ
たことは知られています. 今までまったく ESDIを知らない場合には, 複数の
要因の組み合わせが悪く働いて, ESDIへの理解を妨げることになるかもしれま
せん. 

このことは, ESDIと FreeBSDの組み合わせは選んではいけないという俗説も生
み出しました. 以下の節において, 落し穴のすべてとその解決策を
述べてみようと思います. 

<sect3><heading>ESDI速度の違い</heading>
<p>
すでに簡単に紹介したように, ESDIは2種類の速度を持っています. 旧式のド
ライブとコントローラは 10Mビット/秒のデータ転送速度ですが, 新しいもの
では 15Mビット/秒が利用できます. 

仮に 10Mビット/秒のコントローラへ 15Mビット/秒のドライブを接続したよ
うな場合に問題が生じることを予想することは簡単です. したがって必ず, コ
ントローラ <it>および</it> ドライブのマニュアルを参照して, それぞれの
転送速度が一致しているかどうかを調べるようにしてください. 

<sect3><heading>トラックについて</heading>
<p>
主流の ESDIドライブは, トラックあたり34ないし36個のセクタを持ちます. 
しかし大部分の (古い) コントローラは36個以上のセクタを扱うことができま
せん. 

新しい大容量のドライブでは, トラックごとにさらに多くの数のセクタを持つ
ことができます. たとえば筆者の 670MBのドライブは, トラックあたり 54セ
クタも持たせることができます. 

筆者のコントローラは54セクタ数をサポートしていませんでしたが, トラック
あたり35セクタという設定で, 問題なく動作しました. しかし, これが意味す
るのは大量のディスク容量を失うということです. 

もう一度, 詳しい情報についてハードウェアのドキュメントを調べてください. 
この例のような仕様からはずれた設定をしたときには, うまく動くかもしれま
せんが, 動かないこともあります. そのようなときには, 別のより多くの機能
をもつコントローラで試してみるようにしてください.

<sect3><heading>ハードセクタとソフトセクタ</heading>
<p>
多くの ESDIドライブでは, ハードセクタまたはソフトセクタによる処理を, 
ジャンパ設定で指定することができます. ハードセクタとは, 新しいセクタの
開始位置において, ESDIドライブにセクタパルス (sector pulse) を発生させ
ることです. コントローラはこのパルスを利用して, 書き込みや読み取りのタ
イミングを指示します.

ハードセクタではセクタのサイズを選ぶことができます (通常はフォーマット
後セクタあたり256, 512, および1024バイト). FreeBSDは512バイトのセクタ
サイズを使います. トラックあたりのセクタ数は, 同じように選択に幅があり
ますが, フォーマット後のセクタのバイト数はすべて同じです. セクタごとの 
<em>未フォーマット</em> のバイト数は, コントローラがどの程度の調整用の
バイト数を必要とするかによって異なります. トラックあたりのセクタ数を多
くすれば記憶容量は増えますが, もしドライブから与えられるバイト数よりも
多くのものをコントローラが必要とするのであれば, 問題を生じることがあり
ます.

ソフトセクタでは, コントローラ自身が読み書きの始まりと終りの位置を決め
ます. なお, ESDI (筆者が知り得たものすべて) では, ハードセクタがデフォ
ルトのようです. ソフトセクタを試みる必要性は感じたことがありません.

通常, FreeBSDをインストールする以前に, まずセクタ処理の設定を試される
ことをおすすめします. というのも, セクタ処理の設定を変えるたびに, 物理
フォーマット (low-level format) をしなければならないからです. 

<sect3><heading>物理フォーマット処理</heading>
<p>
ESDIドライブは, 使い始める前に, 物理フォーマットをおこなう必要があります. 
もしトラックあたりのセクタ数を変えたり, ドライブの物理的な設置方法 (水
平や垂直方向) を変えたときには, ふたたびフォーマットする必要があります
から, よく検討した後でフォーマットしてください. フォーマット処理の所要
時間を短く予想してはいけません. 大容量のディスクでは数時間を要します. 

物理フォーマットが終わったならば, サーフィススキャン (surface scan) を
おこない, バッドセクタの検出とフラグの処理をします. ほとんどのディスクには, 
メーカが作成したバッドブロックリストを記録した用紙またはステッカーが付
いています. さらに, ほとんどのディスク内にもバッドブロックリストが記録
されています. メーカが作成したリストを利用するようにしてください. この
時点で不良部分をマップし直す方が, FreeBSDのインストール後におこなうよりも, 
はるかに簡単です. 

物理フォーマットプログラムのなかでも, トラックの中にひとつでもバッドセ
クタがあれば, 同じトラック内の残りのすべてのセクタを不良とするようなプ
ログラムがありますから, そのようなものは利用しないようにしてください. 
ディスクスペースの浪費だけでなく, より重大な bad144と関連した悲劇の原
因にもなるからです (bad144の節を参照のこと). 
	
<sect3><heading>トランスレーション</heading>
<p>
トランスレーションが, ESDIだけに限定された問題ではないにもかかわらず, 
重大な困難になることがあります. トランスレーションにはいくつかの側面が
あります. 多くに共通なものは, IBM PC/ATのオリジナルの設計に起因するディ
スクジオメトリに関する制限を, うまく回避するような調整を試みるものです 
(IBM に感謝 ! ). 

まずはじめに,  1024シリンダに関する (悪) 名高い制限があります. すなわ
ち, ブート可能なシステムについて, システム関連ファイルは (オペレーティ
ングシステムがどのようなものであっても) , ディスクの先頭部分の 1024シ
リンダ内になければいけない, という制限です. シリンダ番号を表すためには 
10ビットしか与えられていません. セクタの総数については, 上限は 64 (0か
ら 63) です. この1024シリンダの制限を, 16ヘッドの制限 (これも ATの仕様
による) と組み合わせると, かなり限定されたディスク容量しか利用できませ
ん. 

この難点を解消するために, PC 向け ESDIコントローラのメーカは, 自社のコ
ントローラボードへ BIOS PROM拡張を施しました. この BIOS拡張の内容は, 
ブート時のディスクI/Oを (OSによっては <it>すべて</it> のディスクI/Oも) 
, トランスレーションを用いておこなうというものです. すなわち, 大容量のディ
スクを, あたかも32ヘッドかつトラックあたり64セクタであるようなデバイス
として OSへ知らせるのです. この結果, 総シリンダー数は 1024よりも少なく
なりますから, 上記の難点などなかったものとして大容量ディスクを使うこと
ができるようになります. なお, 注目いただきたいことは, FreeBSDカーネル
の起動以降, FreeBSDはこの BIOS拡張機能を使わないということです. 詳しく
は後ほどご説明いたします. 

トランスレーションの第2の存在理由は, 多くの旧いシステムBIOSが, トラッ
クあたり17セクタのドライブだけしか扱えない (ST412という古い仕様) から, 
というものです. 比較的新しい BIOSは通常, 自由な値を設定できるドライブ
タイプ (多くの場合ドライブタイプ47) を持っています. 

<em>この文書を読み終えられた後で, どのようにトランスレーションを利用す
るにせよ, ぜひご留意いただきたいことがあります. もし複数の OSをひとつ
のディスクにインストールするときには, 必ず同じトランスレーションを使わ
なければなりません. </em>

トランスレーションに関して, 筆者が使用したコントローラは, ひとつのドラ
イブを複数のパーティションに論理的に分けることができる機能を BIOSのオ
プションとして持っていました (このような製品はいくつかあると思われる). 
しかし, ひとつのドライブにはひとつのパーティションに限定しました. なぜ
なら, このコントローラはパーティション情報をディスクへ書き出すからです. 
つまり, 電源を入れると, コントローラはこの情報を読み取り, OSに対してディ
スクから読みとった情報に基づくデバイスとして知らせるからです. 

<sect3><heading>代替セクタ処理</heading>
<p>
多くの ESDIコントローラはバッドセクタを取り替える機能を備えています. 
ディスクの物理フォーマット処理の途中もしくは終了時に, バッドセクタであ
ることを記録して, 代わりのセクタを壊れたセクタの位置へ (論理的に) 置き
ます. 

通常この置き換え処理は, トラック内のN-1個のセクタを実際のデータ記録に
使い, 第N番目のセクタだけを代替セクタとすることで実現します. ここでNと
いう値はトラック内の物理的セクタの総数です. このアイデアが生まれた背景
は, オペレーティングシステムが壊れたセクタを持たない「完全」なディスク
を想定している, というものです. しかし FreeBSDではこのアイデアを使うこ
とはできません. 

理由は, <it>使用不可 (bad)</it> から <it>使用可能</it> への変換をおこなう
のが ESDIコントローラ上の BIOSだからなのです. FreeBSDは, 真の 32ビット
のオペレーティングシステムであるために, ブート後には BIOSを使いません. 
代わりに FreeBSDが使うのは, ハードウェアと直接「対話」するデバイスドラ
イバというものです.

<em>結論: 代替セクタ処理やバッドブロックマッピングなど, コントローラ・
メーカがなんと呼ぶかは判りませんが, それらに似た機能を FreeBSDのディス
クへは使わないでください. </em>

<sect3><heading>バッドブロックの取り扱い</heading>
<p>
前節から残された問題があります. すなわち, コントローラによるバッドブロッ
ク処理は利用できない状況であるにもかかわらず, FreeBSDのファイルシステ
ムが想定しているのはあくまで完全無欠なディスクである, という問題で
す. これを解消するために, FreeBSDは <it>bad144</it> というツールを採用
しています. この bad144 (この名前は DEC社の標準となったバッドブロック
処理に由来している) は, FreeBSDのスライスごとにバッドブロックを調べま
す. バッドブロックを見つけ出すと, bad144は傷ついたブロック番号によるテー
ブルを FreeBSDスライスの末尾へ書き込みます.

ディスクが動作し始めると, ディスクから読みとられたテーブルを基に, ディ
スクアクセスを調べます. この bad144リストに記録されたブロック番号への
要求が起こると, 代わりのブロック (同じく FreeBSDスライスの末尾に位置す
る) を使います. このように, bad144による置換手続きによって「完全」なディ
スクを FreeBSDファイルシステムへ提供しているのです. 

Bad144の使用により陥るかもしれない落し穴があります. まず, ひとつのス
ライスには126個以上のバッドセクタを持てません. もしドライブに126個以上
のバッドセクタがあったときには, 複数の FreeBSDのスライスに分けて, 各ス
ライスのバッドセクタが126個以下となるようにする必要があります. くれぐ
れも, ひとつのトラック内にたったひとつの欠陥セクタが見つかっただけで, 
そのトラック内セクタ <em>すべて</em> を傷ついたものとして記録するよう
な物理フォーマットプログラムを使わないようにしてください. 簡単にお解り
いただけると思いますが, このような物理フォーマットをおこなえば, 126個の制
限は短時間で達成してしまいます. 

次に, もしスライスが rootファイルシステムを含んでいるときには, 1024シ
リンダ以内という BIOSの制限を守っていなければなりません. ブート処理の
ときですから, bad144リストは BIOSを使って読み取りますので, このリスト
が1024シリンダ限界以内に位置していなければ読みとれません. <em>注意
</em> いただきたいのは, この制限は root <em>ファイルシステム</em> だけ
が1024シリンダ限界以内にあれば十分ということではなく, rootシステムを含
んだ <em>スライス</em> 全体が1024シリンダ限界以内におさまっている必要
があります. 

<sect3><heading>カーネルのコンフィグレーション</heading>
<p>
ESDIディスクを扱うドライバは, IDEや ST412 MFMディスクなどと同じ 
<it>wd</it> ドライバです. この <it>wd</it> ドライバは, すべての WD1003
互換インタフェースにも利用できるはずです. 

大部分のハードウェアは, ジャンパの設定によって, ふたつの I/Oアドレス範
囲と IRQ値のうちから, それぞれひとつを選ぶことができます. したがって, 
wdタイプのふたつのコントローラをひとつのシステムで使うことができます. 

もし設定しようとしているハードウェアが標準以外の割り当てをサポートして
いれば, 適切な設定情報をカーネルのコンフィグレーションファイルに記述す
ることで, この非標準割り当てを利用できます. 次にカーネルのコンフィグレー
ションファイルの例を示します (このファイルがあるディレクトリは 
<tt>/sys/i386/conf</tt> である).

<tscreen><verb>
# First WD compatible controller
controller      wdc0    at isa? port "IO_WD1" bio irq 14 vector wdintr
disk            wd0     at wdc0 drive 0
disk            wd1     at wdc0 drive 1

# Second WD compatible controller
controller      wdc1    at isa? port "IO_WD2" bio irq 15 vector wdintr
disk            wd2     at wdc1 drive 0
disk            wd3     at wdc1 drive 1
</verb></tscreen>

<!--
<sect3><heading>Tuning your ESDI kernel setup</heading>
<p>
-->

<sect2><heading>ESDIハードウェアの例</heading>
<p>
<sect3><heading>Adaptec 2320コントローラ</heading>
<p>
筆者は, ACB-2320でコントロールされた ESDIディスクへ, FreeBSDをインストー
ルすることができました. なお, このディスクには他のオペレーティングシス
テムをインストールしていません. 

インストールするために, まず, NEFMT.EXE (<it>www.adaptec.com</it> から
<it>ftp</it>可能) でディスクを物理フォーマットし, かつトラックを代替セ
クタとともにフォーマットするかどうかの設問に NOと答えました. また 
ACB-2320の BIOSは使わないように設定しました. そしてシステム BIOSがブー
トできるように, システム BIOSの「自由に設定可能」オプションを使いまし
た. 

実は, NEFMT.EXEを使う以前に, まず ACB-2320 の BIOSに組み込まれているフォー
マットプログラムでディスクをフォーマットしてみましたが, 使えないことが
判りました. なぜなら, 代替セクタの処理をおこなわないようにするオプションが
用意されていないからです. 代替セクタ処理をおこなうようにすると, FreeBSDの
インストール作業は bad144の実行の段階で失敗しました. 

もし ACB-232xyをお持ちであれば, そのバージョン番号に注意してください. 
文字 xには0か2が入りまして, ボード上にフロッピーコントローラがあるかど
うかを見分けることができます. 

文字 yはさらに興味深いもので, ブランクか, A-8か, または Dのいずれかで
す. ブランクは, 単純な10Mビット/秒のコントローラであることを表します. 
A-8は, 15Mビット/秒のコントローラで, かつ 52セクタ/トラックをサポート
しているものであることを表します. Dは, 15Mビット/秒のコントローラで, 
かつ 36セクタ/トラック以上 (52セクタも可能か?) のドライブをサポートし
ているものであることを表します. 

このコントローラのすべてのバージョンはインターリーブ比 1:1に対応してい
るはずです. FreeBSDは充分高速なので, ぜひ 1:1と指定してください. 

<sect3><heading>Western Digital WD1007コントローラ</heading>
<p>
筆者は, WD1007でコントロールされた ESDIディスクへ, FreeBSDをインストー
ルすることができました. 正確には WD1007-WA2というコントローラでした. 
これ以外の複数のバージョンも WD1007にあります. 

利用できるようにするために, セクタトランスレーションとWD1007の BIOSと
を使わないように設定しました. この設定の意味は, BIOSに組み込まれた物理
フォーマットプログラムを使えないようにしたということです. 代わりに, 
<it>www.wdc.com</it>から WDFMT.EXEを入手して, ディスクをフォーマットし
ました. 以後, 順調に動いています. 
	
<sect3><heading>Ultrastor U14Fコントローラ</heading>
<p>
ネットに流れたいくつかの報告によれば, Ultrastorの ESDIボードも FreeBSD
で動作するようです. 実際の設定についての詳しい情報はありません.

	
<!--

<sect2><heading>Tracking down problems</heading>
<p>
-->

<sect2><heading>追加資料<label id="esdi:further-reading"></>
<p>
本格的に ESDIのプログラミングを計画している方は, 次の公式規格仕様書を
入手なさることをおすすめします. 

最新の ANSI X3T10 委員会の文書は次のものです：

<itemize>
<item>Enhanced Small Device Interface (ESDI) &lsqb;X3.170-1990/X3.170a-1991&rsqb;   
                                   &lsqb;X3T10/792D Rev 11&rsqb;
        </itemize>

USENETのニュースグループ <htmlurl url="news:comp.periphs"
name="comp.periphs"> は, 詳しい情報を得ることができる注目すべきもので
す. 

World Wide Web (WWW) もまた便利な情報源です. Adaptec社の ESDIコントロー
ラについては <htmlurl url="http://www.adaptec.com/">を参照ください. 
Western Digital社のコントローラについては <htmlurl
url="http://www.wdc.com/"> を参照ください. 

<sect2>感謝
<p>
Andrew Gordon氏より, テスト用の Adaptec 2320コントローラと ESDIディス
クを送っていただきました. 


