DISKLABEL(8)

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

書式
[-rt] [-C] disk -w [-r] [-f disktab] disk disktype [packid] -e [-r] [-C] disk -i [-r] disk -R [-r] disk protofile [-NW] disk

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

解説
disklabel は、ディスクドライブやディスクパックにラベルを書き込んだり、確認したり、 変更したりするために使われます。 ラベルを書き込む際には、ドライブの識別子を変更したり、ディスクの パーティションを変更したり、異常のあるラベルを置き換えたりすることができます。 システムによっては、 disklabel は同時にブートストラップコードをインストールするためにも使われます。

コマンドには、ディスク上のラベルを読んだり (表示したり)、書き込んだり、 編集したりするなど、いくつかの形式があります。それぞれの形式に -r オプションをつけると、ラベルの読み書きを、 システムのメモリ内のコピーに対して行うかわりにディスクに対して直接行います。 このオプションをつけると、システムに最初にラベルを書き込むときのように、 カーネルがそのラベルを保持していないような場合にもディスクへラベルを 書き込むことができるようになります。つまり、最初にディスクへラベルを 書き込むときには必ずこのオプションが必要になるということです。 -r オプションが及ぼす各コマンドに特有な影響については、 それぞれのコマンドで解説しています。

hp300, vax, arm32 などでは、ラベルの読込みや書込みの形式で、 ブートストラップコードをインストールするための -B オプションも指定することができます。 -B オプションは全てのプラットフォームでサポートしているわけではありません。 これらの違いについてもあとで解説します。

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

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

-f disktab で disktab(5) の代替ファイルを指定できます。

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

ラベルは、 -i フラグを使うことで対話的に作成することも可能です。

-C フラグを指定すると、 パーティションのオフセットとサイズが <cylinder/track/sector> の形式で表示されます。 -C が指定されているかいないかに関わらず、 disklabel の -e または -R フラグ による設定の場合には、常にこのフォーマットで解釈されることに注意して下さい。

-R フラグを指定すると、 disklabel は、以前の操作でフォーマット付けされ、ASCII ファイルとして保存された ディスクラベルをディスクへ書き戻します。 ラベルを作成するときに使われるプロトタイプファイルは、ラベルを読み込んだり 編集したりするときのものと同じフォーマットである必要があります。 コメントは # と改行で区切られます。 -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

/dev/rsd0c を通して得られる、カーネル内にある sd0 用のラベルを表示します。

    disklabel -w -r /dev/rsd0c sd2212 foo

/etc/disktab 内にある ``sd2212'' の情報をもとにして sd0 のラベルを作成します。 ディスクパックラベルは foo にします。既にあったブートストラップコードは破壊されます。 /etc/disktab にあなたのディスク用のエントリがない場合は、 この方法で初期段階のラベルを新しいディスクに書くことができます。 それからラベルを (disklabel sd0 > protofile を使って) ファイルにダンプし、ファイルを編集し、 disklabel -R sd0 protofile としてそのラベルに置き換えて下さい。

    disklabel -e -r sd0

sd0 のディスク上のラベルを読み、編集して、これをディスク上と カーネル内の両方に再設定します。 すでにあるブートストラップコードは影響を受けません。

    disklabel -R sd0 mylabel

sd0 のディスク上とカーネル内の両方のラベルを mylabel 内の情報で復元します。 すでにあるブートストラップコードは影響を受けません。

    disklabel -B sd0

新しいブートストラップを sd0 にインストールします。 ブートコードは /usr/mdec/sdboot を使います。 /usr/mdec/bootsd も使うかもしれません(機種によります)。 ディスク上とカーネル内のラベルは変更されません。

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

新しいラベルとブートストラップをインストールします。 ラベルは ``sd2212'' の disktab 情報を用い、カーネル内とディスク上の 両方にインストールします。 ブートストラップコードはファイル /usr/mdec/newboot を使います。

    disklabel -R -r sd0 <protofile>

新しいラベルとブートストラップを、プロトタイプのラベルファイルを用いて ディスク上にインストールします。ラベルが書き込まれておらずかつ /etc/disktab にエントリのないディスクがある場合に、もし、他のディスクのラベルを ファイルにダンプして、それを適切に編集 (合計のサイズ、パーティションの オフセット、種類など) してプロトタイプのファイルを作成できれば、 この方法でラベルをインストールするのがよいでしょう。

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

診断
カーネルデバイスドライバでは、 ディスクのパーティションを open 中に、そのサイズを減らしたり パーティションのオフセットを変更したりすることを許していません。 デバイスドライバによっては、ディスクにラベルがない場合に たった 1 つの大きなパーティションを含んだラベルを作成するものがあります。 従って、ラベルはディスクの open 中に ``a'' パーティションに書かなければ なりません。このような理由で、 場合によっては以下のように 2 段階でラベルを設定しなければいけなくなります。 最初に、別パーティションを最低 1 個作成し、次に ``a'' パーティションを 小さくしつつ新しいラベルを設定するという手順です。

マシンによっては、ブートストラップコードが、そのファイルシステムで ブートストラップコード用に確保した領域内に入りきらないことがあるかも しれません。その結果、``ブート可能'' なディスクのパーティションのいくつかが ファイルシステムを持つことができなくなるかもしれません。 disklabel は、ブートストラップコードをインストールする時に この状態かどうかのチェックを行います。 もし、インストールするブートコードが FS_UNUSED 型のパーティションに 跨る場合は、FS_BOOT 型であると印が付けられます。 newfs(8) ユーティリティは、FS_BOOT パーティションにファイルシステムを作成 することを禁止しています。 逆に言うと、 disklabel は、 FS_UNUSED と FS_BOOT 以外の型のパーティションでは パーティションを跨いだブートストラップコードのインストールはできません。

バグ
ディスクのパーティションがディスク名で与えられた場合 (``/dev/rxy0c'' でなく ``xy0'' という意味)、 disklabel は、tahoe では ``a'' パーティションを用いてディスクのフルパス名を作成して いましたが、i386 やその後継マシンでは ``d'' パーティションを用い、 その他のマシンでは ``c'' パーティションを用います。

sun3 と sparc の NetBSD システムでは、各パーティションサイズは セクタ/シリンダ の整数倍でなければ なりません (つまり、シリンダの整数倍でなければなりません)。さもないと、 ラベルが正しくない状態であるとブート ROM が言い、システムのブートに 失敗します。

さらに、sun3 と sparc では、システムのブートディスクを扱う場合に -r オプションを決して使ってはいけません。 NetBSD のカーネルは、ラベルを書く時に、 NetBSD のディスクラベルを SunOS 互換のフォーマットに変換してから書きます (これは boot PROM のために必要)。 -r を使うと、 disklabel は、フォーマット変換作業をバイパスして、ディスクに直接書いてしまいます。 この結果、PROM が認識できないディスクラベルになってしまい、 そのディスクからブートできなくなってしまいます。