DISKLABEL(8)

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

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

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

解説
disklabel はディスクドライブやディスクパックにラベルを書き込んだり、 確認したり、修正したりするために使われます。 ラベルを書き込む際には、ドライブの識別子を変更したり、 ディスクのパーティションを変更したり、 異常のあるラベルを置き換えたりすることができます。 コマンドには、ディスク上のラベルを読んだり (表示したり)、書き込んだり、 編集したりするいくつかの書式があります。 また disklabel は同時にブートストラップコードを インストールすることもできます。

  メモリ内のラベルとディスク上のラベル

ディスクラベルは各ディスクパーティションの先頭、 もしくは先頭付近に存在します。 より速くアクセスするために、カーネルは 常にメモリ内にコピーを保持します。 デフォルトでは、 disklabel による操作のほとんどは メモリ内にあるラベルのコピーに対してアクセスします。 (ディスク上に存在する) ラベルにアクセスするためには -r オプションを使用します。 このオプションにより、 カーネルのサポート無しでラベルをディスクにインストール することが可能になります。 例えばラベルがはじめてシステムにインストールされる時など、 ディスクにはじめてラベルを書き込む際に指定されなければなりません。 -r オプションによる固有の効果は以下の 各コマンドの説明で示します。

  ディスクデバイス名

全ての disklabel の書式で、ディスクのデバイス名が必要です。 ディスクのデバイス名は、 ディスクまたはスライスを示すローデバイス名でなければなりません。 例えば da0 は DOS パーティションに無関係でディスク全体を表し、 da0s1 はスライスを表します。 デバイスによっては、特に ccd では、 “ディスク全体を示す” (または “c”) パーティションを必要とします。 例えば ccd0c です。 デバイス指定時には、 /dev/ のパスプレフィックスを付ける必要はありません。 disklabel は自動的にこれを前に付けます。

  ディスクラベルの読み込み

ディスクドライブ上のラベルを確認するためには オプションを指定せずに disklabel を使用します。

disklabel [-r] disk

disk は対象とするローディスクを示します。 また da0 や /dev/da0c のような書式でも指定することができます。 これによってドライブに関するすべてのパラメータとパーティションのレイアウトを 表示します。 -r フラグを指定しない場合には、カーネルのメモリ内にあるラベルのコピーが 表示されます。 もしディスクにラベルが書き込まれていなかったり、ディスクのパーティション形式が 正しくない場合には、カーネルが作り直したり、修正するかもしれません。 -r フラグが与えられると、 ディスク上の実際のラベルが表示されます。 通常は、どちらでも同じ結果となりますが、 ラベルが未初期化の場合とまたは壊れている場合には、違う結果となります。

  標準的なラベルの書き込み

標準的なラベルを書き込むには、 以下の書式を使います。

disklabel -w [-r] [-n] disk disktype/auto [packid]

disklabel -w [-r] [-n] disk auto

コマンドには引数として、ラベルを書き込むドライブ名および disktab(5) に書かれているドライブタイプが必要です。 ドライブのパラメータとパーティション情報は、このファイルから得られたもの が使われます。 もし、同じ型のディスクに異なるパーティション情報を持たせたい場合には、 disktab にそれぞれ別々のエントリを書いておくか、ラベルを書き込んだあとで 後述する方法でそれを編集する必要があります。 オプションの引数として、16 文字までのパック識別用文字列を指定します。 パック名に空白を含める場合にはそれをクォートする必要があります。

-n フラグが与えられると、データはデバイスに書き込まれません。 代りに、書き込まれるはずだったディスクラベルが、標準出力に表示されます。

-r フラグが与えられると、ディスクのラベルとブートストラップが 直接書き換えられます。 この副作用として、すでにあるブートストラップ用コードが上書きされてしまうため、 ディスクがブート不能にされてしまいます。 ラベルとブートストラップを同時に書き込む方法は 後述のブートオプションを参照してください。 -r が指定されない場合には、ラベルはメモリ内のコピーを通して書き換えられる ため、ブートストラップコードは影響されません。 もしまだディスクがラベル付けされていなければ、 -r フラグをつけなければなりません。 どちらの方法でも、カーネルのメモリ内コピーは変更されます。

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

ほとんどのハードディスクでは、パーセントベースのラベル (および大きさに ‘*’ を指定する単一のパーティション) で、もっともな設定を出力するでしょう。

PC ベースのシステムでは、 BIOS に正しく FreeBSD ディスクラベルを認識させるために、特別な要件があります。 古いシステムでは、 “危険な方法で専用化された” ディスクラベルが必要かもしれません。 これは、偽の DOS パーティションを作成することにより、 最近のディスクのジオメトリに対して古い BIOS が引き起す問題を 回避するというものです。 新しいシステムでは、通常の DOS パーティションを fdisk で作成して、このスライス中に FreeBSD ディスクラベルを作成すれば良いでしょう。 本件についてはこのマニュアルで後述します。

新規ディスクラベルをインストールするだけでは、 このラベルでシステムをブートさせることは出来ません。 ブートブロックもまたインストールする必要があります。 本件についてはこのマニュアルで後述します。

  既存のディスクラベルの編集

既存のディスクラベルを編集するには、 以下の書式を使います。

disklabel -e [-r] [-n] disk

このコマンドはラベルを カーネルのメモリ内コピーから、または -r フラグが与えられた場合には直接ディスクから 読み込みます。 ラベルは ASCII でファイルにかかれ、 編集するためのエディタへ渡されます。 EDITOR 環境変数によるエディタの指定がない場合には、このエディタには vi(1) が使用されます。 エディタを終了すると、ラベルファイルはディスクラベルを 再書き込みするために使われます。 -r フラグの指定の有無にかかわらず、 すでにあるブートストラップコードは変更されません。 -n フラグが与えられると、データはデバイスに書き込まれません。 代りに、書き込まれるはずだったディスクラベルが、標準出力に表示されます。 特定のディスクに対して、 パーティション方式がどのように動作するかを見るのに有用です。

  ファイルからのディスクラベルの復元

ファイルからディスクラベルを復元するには、 以下の書式を使います。

disklabel -R [-r] [-n] disk protofile

disklabel は以前の操作により ASCII ファイルとして保存されているディスクラベル をディスクへ書き戻します。 ラベルを作成するときに使われるプロトタイプファイルは、ラベルを読み込んだり 編集したりするときのものと同じフォーマットである必要があります。 コメントは # と改行で区切られます。 新しいラベルを書き込む際に -r が指定されているとブートストラップコードは使えなくなってしまいますが、 指定されていない場合には影響ありません。 ラベルの復元とブートストラップの書き込みを同時に行う方法は 後述のブートオプションを参照してください。 -n フラグが与えられると、データはデバイスに書き込まれません。 代りに、書き込まれるはずだったディスクラベルが、標準出力に表示されます。 特定のディスクに対して、 パーティション方式がどのように動作するかを見るのに有用です。

  ディスクラベル領域への書き込みの有効化および無効化

デフォルトでは、 ディスクの先頭領域にあるディスクラベル領域への書き込みは不可能です。 ディスクドライバはいかなる操作も無視します。 もし (例えばラベルを消去するなど) この領域への書き込みを行う必要があるならば、 以下の書式を使います。

disklabel -W disk

ラベルの書き込みを可能にした後に不可能にするには 以下のコマンドを使います。

disklabel -N disk

  ブートストラップのインストール

disklabel の最後の 3 つの書式は、ブートストラップコードを インストールするために使われます。 古い PC システムとの互換性のために “危険な方法で専用化された” スライスを作成している場合、通常、 da0 等の生ディスクを指定したいでしょう。 既存の DOS スライス中にラベルを作成している場合、パーティション名 da0s1a 等を指定することでしょう。 スライスをブート可能にすることはトリッキーです。 通常の DOS スライスを使用している場合、典型的には、 ベースディスクに標準 MBR をインストールし (または残し)、 FreeBSD ブートブロックをスライス中にインストールします。

disklabel -B [ -b boot1 -s boot2] disk [disktype]

この書式ではブートストラップのみインストールします。 ディスクラベルは変更しません。

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

この書式は前述の “ラベルの書き込み” コマンドと一致します。 新しいボリュームラベルを書き込むとともに ブートストラップのインストールもおこないます。 ベースディスクに対して本コマンドを実行すると、 “危険な方法で専用化された” ラベルを作成します。 本コマンドは、通常、ベースディスクではなくスライスに対して実行します。 -n フラグが与えられると、データはデバイスに書き込まれません。 代りに、書き込まれるはずだったディスクラベルが、標準出力に表示されます。

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

この書式は前述の “ラベルの復元” コマンドと一致します. ボリュームラベルを復元するとともに ブートストラップのインストールもおこないます。

ブートストラップコマンドは常にディスクに直接アクセスするため、 -r フラグを指定する必要はありません。 -n フラグが与えられると、データはデバイスに書き込まれません。 代りに、書き込まれるはずだったディスクラベルが、標準出力に表示されます。

ブートストラップコードは 2 つのブートプログラムより構成されます。 インストールされるブートプログラムの名前は 以下の 3 つの方法の中の 1 つより指定します。

1.  -b フラグと -s フラグを用いて明示的に名前を指定します。 -b フラグで指定するのが最初のブートプログラムで、 -s フラグで指定するのが 2 段階目のブートプログラムになります。 ブートプログラムは、 /boot に置かれます。

2.  -b フラグと -s フラグが指定されておらず disktype が指定された場合、 disktab のエントリが存在しこれらのパラメータが含まれるならば プログラムの名前は このディスクに対する disktab(5) エントリの “b0” および “b1” パラメータより得られます。

3.  そうでない場合、デフォルトのブートイメージ名は 標準のステージ 1 およびステージ 2 のブートイメージとして /boot/boot1 と /boot/boot2 になります (詳細はアーキテクチャによって異なり、 Alpha においては単一ステージのブートが使用されます)。

  スクラッチからの、ブート可能ディスクの初期化/フォーマット

ディスクをスクラッチから初期化するには、次の手順をお勧めします。 この手順は、FreeBSD 以外のスライスを含む、 ディスク上のすべてを削除してしまうことに注意してください。

1.  fdisk(8) を使用してハードディスクを初期化し、 DOS からはパーティションテーブルとして参照されるスライステーブルを作成します。 あなたのシステム用のディスクスライスをここで定義します。

2.  disklabel(8) を使用して、パーティションおよびマウントポイントの定義と書き込みを行います。 ここでマウントポイントを決める必要は無く、後で mount(8) を使用して定義可能です。

3.  最後に、 newfs(8) を使用して、新パーティション中にファイルシステムを作成します。 典型的なディスクラベルのパーティショニング方式では、 “a” パーティションは約 128MB でルートファイルシステムを、 “b” パーティションはスワップを、 “d” パーティションは /var を (通常 128MB)、 “e” パーティションは /var/tmp を (通常 128MB)、 “f” パーティションは /usr を (通常 2G くらい)、 “g” パーティションは /home を (通常、残り)、 それぞれ割り当てます。 これは、システムによって異なります。

fdisk -BI da0

disklabel -w -B da0s1 auto

disklabel -e da0s1

関連ファイル
/etc/disktab
/boot/
/boot/boot<n>

保存されたファイルの書式
disklabel は ディスクラベルを確認、編集、または復元する際に ASCII 形式のラベルを使用します。 フォーマットは以下のとおりです。

    # /dev/da1c:
    type: SCSI
    disk: da0s1
    label:
    flags:
    bytes/sector: 512
    sectors/track: 51
    tracks/cylinder: 19
    sectors/cylinder: 969
    cylinders: 1211
    sectors/unit: 1173930
    rpm: 3600
    interleave: 1
    trackskew: 0
    cylinderskew: 0
    headswitch: 0           # milliseconds
    track-to-track seek: 0  # milliseconds
    drivedata: 0
    8 partitions:
    #        size   offset    fstype   [fsize bsize bps/cpg]
      a:    81920        0    4.2BSD     1024  8192    16   # (Cyl.    0 - 84*)
      b:   160000    81920      swap                        # (Cyl.   84* - 218*)
      c:  1173930        0    unused        0     0         # (Cyl.    0 - 1211*)
      h:   962010   211920     vinum                        # (Cyl.  218*- 1211*)

# で始まる行はコメントです。 他の項目のほとんども既に使われていません。 正しく設定されてなければならない項目は以下のとおりです:

label
    オプションのラベルです。 ラベルを書き込む際に packid オプションにより設定されます。

flags
    flags は removable、 ecc もしくは badsect が指定可能です。 removable はリムーバブルメディアドライブに対して設定されますが、 現在の FreeBSD のドライバはこのフラグを 評価しません。 ecc はサポートされていません。 badsect はドライブが不良セクタの代替を行える場合に 指定します。

sectors/unit
    ディスクの全体の大きさを示します。 この値は正しくなければなりません。

パーティションテーブル
    これは UNIX のパーティションテーブルであり、 fdisk(8) で述べられている Microsoft のパーティションテーブルではありません。

パーティションテーブルは 8 つまでエントリを持つことができ、 以下の情報を含みます:

identifier
    パーティションの識別子は “a” から “h” の 1 文字です。 慣例的な理由により、 “c” パーティションは ディスク全体を表すために予約されています。

size
    セクタ単位でのパーティションの大きさです。 K (キロバイト - 1024), M (メガバイト - 1024*1024), G (ギガバイト - 1024*1024*1024), % ( “c” 以外の固定長のパーティションを取り除いた後の空間に対するパーセント)か、 * (固定長のパーティションとパーセント指定のパーティションを取り除いた後 の空間すべて)。 “c” に対して * を指定すると、ディスク全体を意味します 小文字の K, M, G も許されます。 大きさと型の間には空白を入れてはなりません。

    例: 2097152, 1g, 1024m, 1048576k はすべて同じ大きさです (512 バイトセクタを仮定)。

offset
    ドライブの先頭からのオフセットによるパーティションの開始位置を、 セクタ単位で指定します。 * は、使用すべき正しいオフセット (直前のパーティションの終端に 1 を加えたもの) を、 disklabel に計算させます。ただしパーティション “c” は無視します。 パーティション “c” に対しては、 * はオフセット 0 と解釈されます。

fstype
    パーティションの使用目的を表します。 例では現在使用されているパーティション型を示します。 UFS ファイルシステムおよび ccd では 4.2BSD が使われます。 Vinum ドライブでは vinum が使われます。 他の一般的な型は unused と swap です。 取り決めでは、パーティション “c” はスライス全体を表し、型 unused であるべきですが、 disklabel はこの取り決めを強制しません。 disklabel は多くの他のパーティション型を知っていますが、 それらは現在使用されていません。 詳細は、 /usr/include/sys/disklabel.h で FS_UNUSED で開始する定義を参照してください。

fsize
    4.2BSD と LFS のファイルシステムに対してのみ有効です。 フラグメントの大きさを意味します。 1 GB 未満のパーティションに対するデフォルトは 1024 で、 1 GB 以上に対するデフォルトは 4096 です。

bsize
    4.2BSD と LFS のファイルシステムに対してのみ有効です。 ブロックの大きさを意味します。 1 GB 未満のパーティションに対するデフォルトは 8192 で、 1 GB 以上に対するデフォルトは 16384 です。

bps/cpg
    4.2BSD ファイルシステムに対しては、 シリンダグループ中のリシンダ数を意味します。 LFS ファイルシステムに対しては、 セグメントシフト値を意味します。 1 GB 未満のパーティションに対するデフォルトは 16 で、 1 GB 以上に対するデフォルトは 64 です。

行の残りの部分はコメントで、 ドライブの 一般的には使われていない (しかし多分正確な) ジオメトリ情報に 基づいたシリンダの割り当て情報を示しています。 アスタリスク (*) はパーティションがシリンダ境界で 厳密にはじまっていない、もしくは終っていないことを意味します。

使用例
    disklabel da0s1

da0s1 のラベルとしてカーネル内のコピーを /dev/da0s1 から得られたものとして表示します。 ラベルを読み込み時には、ラベルがスライス上に存在する場合でも、 FreeBSD はベースディスク名を指定することを許しています。 しかしながら、厳密には、 ベースディスク名を指定するのは “危険な方法で専用化された” ラベルを使用する場合に限定してください。 通常は、スライスを指定してください。

    disklabel da0s1 > savedlabel

da0s1 に対する カーネル内のコピーをファイルに savedlabel に保存します。 このファイルは後で -R フラグを用いてラベルを復元する際に使用できます。

    disklabel -w -r /dev/da0s1 da2212 foo

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

    disklabel -e -r da0s1

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

    disklabel -e -r -n da0s1

da0s1 のディスク上のラベルを読み、編集し、新規ラベルがどのようになるかを (セクタ単位で) 表示します。 新規ラベルは、メモリにもディスクにもインストールしません。

    disklabel -r -w da0s1 auto

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

    disklabel -R da0s1 savedlabel

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

    disklabel -R -n da0s1 label_layout

パーティションレイアウト label_layout を使用すると、 da0s1 のラベルがどのようになるかを表示します。 % と * に基くパーティションの大きさ指定を使用するラベル方式を使用した場合に、 各パーティションにどれだけ割り当てられるかを判定するのに有用です。

    disklabel -B da0s1

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

    disklabel -w -B /dev/da0s1 -b newboot1 -s newboot2 da2212

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

    dd if=/dev/zero of=/dev/da0 bs=512 count=32
    fdisk -BI da0
    dd if=/dev/zero of=/dev/da0s1 bs=512 count=32
    disklabel -w -B da0s1 auto
    disklabel -e da0s1

ディスク上の既存の情報を完全に削除し、 単一の “ディスク全体” スライスを含む DOS パーティションテーブル付きの、 ブート可能ディスクを新規に作成します。 次にスライスを初期化し、編集します。 dd はオプションですが、 BIOS によっては正しくディスクを認識するために必要です。

これは、 %, M, G, * といった新規パーティションサイズ型を使用する、ディスクラベルの例です。 次のコマンドラインのソースファイルとして使用可能です:

    disklabel -R ad0s1c new_label_file

    # /dev/ad0s1c:
    type: ESDI
    disk: ad0s1
    label:
    flags:
    bytes/sector: 512
    sectors/track: 63
    tracks/cylinder: 16
    sectors/cylinder: 1008
    cylinders: 40633
    sectors/unit: 40959009
    rpm: 3600
    interleave: 1
    trackskew: 0
    cylinderskew: 0
    headswitch: 0		# milliseconds
    track-to-track seek: 0	# milliseconds
    drivedata: 0
    8 partitions:
    #        size   offset    fstype   [fsize bsize bps/cpg]
      a:   400M        0    4.2BSD     4096 16384    75 	# (Cyl.    0 - 812*)
      b:     1G        *      swap
      c:      *        *    unused
      e: 204800        *    4.2BSD
      f:     5g        *    4.2BSD
      g:      *        *    4.2BSD

関連項目
ccd(4), disklabel(5), disktab(5), boot0cfg(8), fdisk(8), vinum(8)

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

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

バグ
ディスク名がフルパスで指定されない場合には、 デバイス名は “c” パーティションになります。

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

disklabel はすべての実施可能なエラーチェックは行いません。 次の場合、警告が表示されます： パーティションが重なる場合、 絶対的なオフセットが期待したオフセットと異る場合、 “c” パーティションが 0 から開始しないかディスク全体を覆わない場合、 パーティションがデバイスの終端を越える場合、 その他のエラー。 ただし、未使用空間があっても警告は表示されません。