DISKLABEL(8)

名称
disklabel - ディスクラベルの読み書きを行う

書式
disklabel [-r] disk
disklabel -w [-r] disk disktype [packid]
disklabel -e [-r] disk
disklabel -R [-r] disk protofile
disklabel [-NW] disk

disklabel -B [ -b boot1 [-s boot2]] disk [disktype]
disklabel -w -B [ -b boot1 [-s boot2]] disk disktype [packid]
disklabel -R -B [ -b boot1 [-s boot2]] disk protofile [disktype]

解説
disklabel はディスクドライブやディスクパックにラベルを書き込んだり、 確認したり、修正したりするために使われます。 ラベルを書き込む際には、ドライブの識別子を変更したり、 ディスクのパーティションを変更したり、 異常のあるラベルを置き換えたりすることができます。 システムによっては、 disklabel は同時にブートストラップコードを インストールするためにも使われます。 コマンドには、ディスク上のラベルを読んだり (表示したり)、書き込んだり、 編集したりするいくつかの形式があります。 それぞれの形式に -r オプションをつけると、ラベルの読み書きをシステムの メモリ内のコピーに対して行うかわりに、ディスクに対して直接行います。 このオプションをつけると、システムに最初にラベルを書き込むときのように、 カーネルがそのラベルを保持していないような場合にもディスクへラベルを 書き込むことができるようになります。つまり、最初にディスクへラベルを 書き込むときには必ずこのオプションが必要になるということです。 -r スイッチの特別な機能については、それぞれのコマンドで解説しています。 ラベルの読み込みや書き込みの形式に対しては、ブートストラップコードを インストールするために -B スイッチを指定することができます。 これらの違いについてもあとで解説します。

コマンドの最初の形式 (read) は、 指定したディスクドライブ (例: sd0 や /dev/rsd0c) のラベルを確認するため に使用されます。 これによってドライブに関するすべてのパラメータとパーティションのレイアウトを 表示します。 -r フラグを指定しない場合には、カーネルのメモリ内にあるラベルのコピーが 表示されます。 もしディスクにラベルが書き込まれていなかったり、ディスクのパーティション形式が 正しくない場合には、カーネルが作り直したり、修正したりしたラベルが 表示されるかもしれません。 -r フラグが与えられると、メモリ内のラベルを表示するかわりにディスク上の実際の ラベルが表示されます。

2 番目の形式は、 -w フラグ付きの形式で、指定したドライブへ標準のラベルを書き込む ために使用されます。 コマンドには引数として、ラベルを書き込むドライブ名 (例: sd0)、および disktab(5) に書かれているドライブタイプが必要です。 ドライブのパラメータとパーティション情報は、このファイルから得られたもの が使われます。 もし、同じ型のディスクに異なるパーティション情報を持たせたい場合には、 disktab にそれぞれ別々のエントリを書いておくか、ラベルを書き込んだあとで 後述する方法でそれを編集する必要があります。 オプションの引数として、16 文字までのパック識別用文字列を指定します。 パック名に空白を含める場合にはそれをクォートする必要があります。 -r フラグが与えられると、ディスクのラベルとブートストラップが 直接書き換えられます。 この副作用として、すでにあるブートストラップ用コードが上書きされてしまうため、 ディスクがブート不能にされてしまいます。 -r が指定されない場合には、ラベルはメモリ内のコピーを通して書き換えられる ため、ブートストラップコードは影響されません。 もしまだディスクがラベル付けされていなければ、 -r フラグをつけなければなりません。 どちらの方法でも、カーネルのメモリ内コピーは変更されます。

disktab(5) に記載されていない未使用のディスクに対しては、 disktype として “auto” を指定できます。 この場合、ディスクの最初のラベルを生成するようにドライバに要求します。 これは成功するかも知れないし成功しないかも知れません。 これはディスクドライバがディスクを全く読む事無く 必要なデータを取得できるか否かに依存します。 全ての SCSI ディスクとほとんどの IDE ディスクと vnode デバイスにおいて 成功するでしょう。 ディスクに対するラベルの書き込みは唯一サポートされた操作であり、 disk 自身は標準の名前(フルパス名であってはなりません)で提供される必要があります。

-e フラグによって、すでに存在するディスクラベルを編集することができます。 ラベルはカーネルのメモリ内コピーから、または -r フラグが与えられた場合には直接ディスクから読み込まれます。 ラベルは整形され、編集するためのエディタへ渡されます。 EDITOR 環境変数によるエディタの指定がない場合には、このエディタには vi(1) が使用されます。 エディタを終了すると、整形されたラベルが再読み込まれて、 ディスクラベルに再び書き込まれます。 -r フラグの指定の有無にかかわらず、 すでにあるブートストラップコードは変更されません。

-R フラグを指定すると、 disklabel は以前の操作により整形済でアスキーファイルとして保存されているディスクラベル をディスクへ書き戻します。 ラベルを作成するときに使われるプロトタイプファイルは、ラベルを読み込んだり 編集したりするときのものと同じフォーマットである必要があります。 コメントは # と改行で区切られます。 -w のように、 -r が指定されているとブートストラップコードは使えなくなってしまいます。

disklabel コマンドの -NW フラグはそれぞれ、指定したディスクのパックラベルエリアへの書き込みを 明示的に禁止したり、許可したりします。

disklabel の最後の 3 つの形式は、ブートストラップコードがラベルの一部である ようなマシンで、ブートストラップコードをインストールするために使われます。 ブートストラップコードには、 マシンに依存する 1 つまたは 2 つのプログラムが含まれます。 -B フラグは、ブートストラップコードをインストールすることを示すために 使われます。 -r フラグの機能は -B フラグに含まれているので、同時に指定しないようにしてください。 インストールされるブートストラップコードの名前は、 いくつかの方法で選択することができます。 第1に、 -b や -s フラグによって明示的に名前を指定することができます。 1 段階のブートプログラムのみが必要なマシンでは、 -b によって指定するものがそのプログラムです。 2 段階のブートストラップを行うマシンでは、 -b で指定するのが最初のブートプログラムで、 -s で指定するのが 2 段階目のプログラムになります。 プログラム名が明示的に与えられなければ、標準ブートプログラムが使われます。 ブートプログラムは、 /usr/mdec に置かれます。 もし、 disktype が与えられ、それに対応する disktab(5) のエントリが存在し、 なおかつ ``b0'' , ``b1'' の 2 つのパラメータがある場合には、 ブートプログラムはこれらのパラメータから得られます。 さもなければ、ブートプログラム名はディスク名から得られます。 この名前は、1段階目のブートストラップに対しては basenameboot 、2 段階目のブートストラップに対しては bootbasename になります。 たとえば、ディスクデバイスが sd0 である場合には、これらの名前は /usr/mdec/sdboot や /usr/mdec/bootsd になります。

3 つのブートプログラムインストールの形式のなかで最初のものは、 すでに存在するディスクラベルを変更せずにブートストラップコードを インストールするために使われます。 これは、ディスクラベル自身に対しては本質的には読み込みコマンドで、 すべてのオプションはすでに記したように ブートプログラムを特定するのに関するものです。 あとの 2 つの形式は同様に、ディスクラベルを書き込んだり復元したりするのと同時に ブートストラップコードをインストールするものです。

関連ファイル
/etc/disktab
/usr/mdec/xxboot
/usr/mdec/bootxx

使用例
    disklabel sd0

sd0 のラベルとしてカーネル内のコピーを /dev/rsd0c から得られたものとして表示します。

    disklabel -w -r /dev/rsd0c sd2212 foo

/etc/disktab に書かれている ``sd2212'' の情報を sd0 のラベルとして書き込みます。 存在したブートストラップコードは使えなくなります。

    disklabel -e -r sd0

sd0 のディスク上のラベルを読み込み、編集し、再び書き込みます。 ディスク上のラベルとともにカーネル内コピーも書き換えられます。 存在したブートストラップコードは影響を受けません。

    disklabel -r -w sd0 auto

sd0 から必要な情報を自動検出し、新しいラベルをディスクに書こうとします。 パーティションおよびファイルシステム情報を編集するために、 この後で disklabel -e コマンドを使って下さい。

    disklabel -R sd0 mylabel

mylabel に書かれている情報を sd0 のラベルとして書き込みます。 ディスク上のラベルとともにカーネル内コピーも書き換えられます。 存在したブートストラップコードは影響を受けません。

    disklabel -B sd0

sd0 に新たにブートストラップコードを書き込みます. ブートストラップコードは /usr/mdec/sdboot 、およびもし必要ならば /usr/mdec/bootsd です。 ディスク上のラベルおよびカーネル内コピーは影響を受けません。

    disklabel -w -B /dev/rsd0c -b newboot sd2212

新たなラベルとブートストラップコードを書き込みます。 ラベルは disktab の ``sd2212'' の情報を使用し、 ディスク上のラベルとともにカーネル内コピーも書き換えられます。 ブートストラップコードは /usr/mdec/newboot です。

関連項目
disklabel(5), disktab(5)

診断
デバイスドライバは、 オープンされているパーティションに関して、 サイズが小さくなることおよびオフセットが変化することを許しません。 デバイスドライバの中には、 ラベルを持たないディスクに対して 1 パーティションのみからなる ラベルを作成するものがあります。 そのため、 オープンされているディスクのラベルは ``a'' パーティションに書く必要があります。 このような理由で、 次の 2 ステップにより、 所望のラベルを作成する必要がある場合があります。 第 1 ステップは少なくとももう 1 つのパーティションを作成することであり、 第 2 ステップは ``a'' パーティションを小さくしながら 新たなパーティションのラベルを設定することです。

ファイルシステムによっては、 用意された領域にブートストラップコードが収まり切らないような マシンがあるかも知れません その結果として、``ブート可能な'' ディスクのパーティションに ファイルシステムを作成できない場合があります。 ブートストラップコードを書き込む時に、 disklabel はこのようなケースをチェックします。 FS_UNUSED タイプのパーティションに重なるように ブートストラップコードが書き込まれる場合には、 そのパーティションは FS_BOOT とマークされます。 newfs(8) ユーティリティは、 FS_BOOT パーティションにファイルシステムを作成することを禁止します。 また逆に、 パーティションのタイプが FS_UNUSED もしくは FS_BOOT では無い場合、 disklabel はそのパーティションに重なるようなブートストラップコードを書き込みません。

バグ
ディスク名がフルパスで指定されない場合には、 デバイス名は Tahoe の場合 ``a'' パーティションになり、 その他の場合は ``c'' パーティションになります。

i386 アーキテクチャでは、プライマリブートストラップセクタに、 組み込みの fdisk テーブルを持ちます。 disklabel は、 ブートストラップのみをインストールする時 (-B) もしくはラベルを編集する時 (-e) にこれを壊さないように気を付けます。 しかし、 -w や -R を指定した時には、 無条件でプライマリブートストラッププログラムをディスクに書き込みますので、 fdisk テーブルをブートストラッププログラム内のダミーに置き換えます。 これはディスク全体を専用に使う場合、 すなわち BSD ディスクラベルがディスクの絶対ブロック 0 から始まる場合 のみ関係あります。