DISKLABEL(8)

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

書式
disklabel [-r] disk disklabel -w [-nr] [-m machine] disk type [packid] disklabel -e [-nr] [-m machine] disk disklabel -R [-nr] [-m machine] disk protofile

disklabel -B [-b boot] [-m machine] disk disklabel -w -B [-n] [-b boot] [-m machine] disk type [packid] disklabel -R -B [-n] [-b boot] [-m machine] disk protofile

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

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

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

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

disklabel [-r] disk

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

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

disklabel -w [-nr] [-m machine] disk type [packid]

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

-m オプションが与えられると、ターゲットとなる machine が理解できるラベルが書き込まれます。 デフォルトでは、現在使用しているハードウェアアーキテクチャの ものとなります。 -n が使用された場合、データはデバイスに書き込まれません。 代わりに、書き込まれるはずだったディスクラベルが標準出力に表示されます。

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

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

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

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

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

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

disklabel -e [-nr] [-m machine] disk

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

-m オプションが与えられると、ターゲットとなる machine が理解できるようにラベルが書き出されます。 デフォルトでは現在使用しているハードウェアアーキテクチャの ものとなります。

-n オプションが与えられると、データはデバイスに書き込まれません。 代わりに、書き込まれるはずだったディスクラベルが標準出力に表示されます。 特定のディスクに対して、 パーティション方式がどのように動作するかを見るのに有用です。

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

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

disklabel -R [-nr] [-m machine] disk protofile

disklabel は以前の操作により ASCII フォーマットのファイルに保存されたディスクラベル を復元することができます。 ラベルを作成するときに使われるプロトタイプファイルは、ラベルを読み込んだり 編集したりするときのものと同じフォーマットである必要があります。 コメントは ‘#’ と改行で区切られます。 新しいラベルを書き込む際に -r が指定されているとブートストラップコードは使えなくなってしまいますが、 指定されていない場合には影響ありません。 ラベルの復元とブートストラップの書き込みを同時に行う方法は 後述のブートオプションを参照してください。

-m オプションが与えられると、ターゲットとなる machine が理解できるようにラベルが書き出されます。 デフォルトでは現在使用中のハードウェアアーキテクチャの ものとなります。

-n オプションが与えられると、データはデバイスに書き込まれません。 代わりに、書き込まれるはずだったディスクラベルが、標準出力に表示されます。 特定のディスクに対して、 パーティション方式がどのように動作するかを見るのに有用です。

  ブートストラップのインストール
disklabel の最後の 3 つの書式は、ブートストラップコードを インストールするために使われます。 古い PC システムとの互換性を保つために “危険な方法で専用化された” ディスクを作成している場合、通常、 da0 のような raw ディスク名を指定する必要があります。 既存のスライスをラベル付けする必要がある場合、 da0s1 のようなスライス名を指定する必要があります。 スライスをブート可能にするには ベースディスク上の MBR を更新する必要があるでしょう。 fdisk(8) を参照してください。

disklabel -B [-b boot] [-m machine] disk

この書式ではブートストラップのみインストールします。 ディスクラベルは変更しません。 “危険な方法で専用化された” ディスクを作成しようとしているのではない限り、 da0 のようなベースディスクにこのコマンドは絶対に使用しないでください。 このコマンドは典型的には da0s1 のようなスライスに対して実行します。

現在使用中のマシン以外のハードウェアアーキテクチャ machine 用にラベルを作成する場合、 -m オプションを指定する必要があります。

disklabel -w -B [-n] [-b boot] [-m machine] disk type [packid]

この書式は前述の “ラベルの書き込み” コマンドと一致します。 新しいボリュームラベルを書き込むとともに ブートストラップのインストールもおこないます。 ベースディスクに対して本コマンドを実行すると、 “危険な方法で専用化された” ラベルを作成します。 本コマンドは、通常、ベースディスクではなくスライスに対して実行します。

-m オプションが与えられると、ターゲットとなる machine が理解できるようなラベルおよびブートストラップが書き出されます。 デフォルトでは現在使用中のハードウェアアーキテクチャの ものとなります。 -n オプションが与えられると、データはデバイスに書き込まれません。 代わりに、書き込まれるはずだったディスクラベルが標準出力に表示されます。

disklabel -R -B [-n] [-b boot] [-m machine] disk protofile

この書式は前述の “ラベルの復元” コマンドと一致します。 ボリュームラベルを復元するとともに ブートストラップのインストールもおこないます。 ベースディスクに対して本コマンドを実行すると、 “危険な方法で専用化された” ラベルを作成します。 本コマンドは、通常、ベースディスクではなくスライスに対して実行します。

ブートストラップコマンドは常にディスクに直接アクセスするため、 -r オプションを指定する必要はありません。

-m オプションが与えられると、ターゲットとなる machine が理解できるようなラベルおよびブートストラップが書き出されます。 デフォルトでは現在使用中のハードウェアアーキテクチャの ものとなります。

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

ブートストラップコードは 2 つのブートプログラムより構成されており、 1 つの /boot/boot イメージにコンパイルされます。 代替のブートイメージを -b オプションを用いて指定することが可能です。

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

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

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

2.  disklabel を使用して、直前のステップで作成した FreeBSD スライス上のパーティションを定義します。

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

関連ファイル
/boot/boot
    デフォルトのブートイメージ
/etc/disktab
    ディスクを説明したファイル

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

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

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

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

#   パーティションの識別子は ‘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) では 4.2BSD が使われます。 Vinum ドライブでは vinum が使われます。 他の一般的な型は swap と unused です。 取り決めでは、パーティション ‘c’ はスライス全体を表し、型 unused であるべきですが、 disklabel はこの取り決めを強制しません。 disklabel ユーティリティは多くの他のパーティション型を知っていますが、 それらは現在使用されていません。 (詳細は、 <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

da0 の最初のスライス用に、 /dev/da0s1 から得たものとしてメモリ上のラベルを表示します (ディスクが “危険な方法で専用化された” 場合、 da0 のようにベースディスク名を指定する必要があります)。

    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/boot です。 ディスク上のラベルおよびカーネル内コピーは影響を受けません。

    disklabel -w -B /dev/da0s1 -b newboot da2212

新たなラベルとブートストラップコードを書き込みます。 ラベルは disktab(5) の “da2212” の情報を使用し、 ディスク上のラベルとともにカーネル内コピーも書き換えられます。 ブートストラップコードは カレントディレクトリにある newboot です。

    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

ディスク上の既存の情報を完全に削除し、 ディスク全体を覆う 1 つのスライスを含んだ 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), md(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 テーブルをブートストラッププログラム内のダミーに置き換えます。 これはディスク全体を専用に使う場合、 すなわち FreeBSD ディスクラベルがディスクの絶対ブロック 0 から始まる場合 のみ関係あります。

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