FDISK(8)

名前
fdisk - Linux 用のパーティションテーブル操作ツール

書式
fdisk [-b] [-u] [device]

fdisk -l [-b] [-u] [device ...]

fdisk -s partition ...

fdisk -v

説明
ハードディスクは、一つ以上の論理的なディスクに分割することができる。 これは パーティション (partition) と呼ばれる。この分割に関する情報は、ディスクのセクタ 0 に置かれる パーティションテーブル に保存される。 BSD の世界では、それぞれ「ディスクスライス (disk slice)」、「ディスク ラベル (disklabel)」といった用語が用いられる。 Linux は少なくとも一つのパーティションを必要とする。すなわちルートファ イルシステムとするパーティションである。また Linux ではスワップファイ ルやスワップパーティションを利用することができるが、後者の方が効率が良 い。したがって、通常は二つめのパーティションをスワップ用に利用したくな る場合が多いだろう。 Intel 互換のハードウェアでは、システムをブートさせる BIOS はディスクの 先頭 1024 シリンダにしかアクセスできない場合が多い。したがって大きなディ スクを使っているユーザーは、数メガバイト程度の第三のパーティションを追 加することになる。これは典型的には /boot にマウントされ、カーネルイメージと、ブートに必要ないくつかの外部ファイ ルを保存する。このようにして、ブートに必要なファイルが BIOS によってア クセス可能であることを保証するのである。またセキュリティ、保守の都合、 バックアップ、テストなど、より多くのパーティションを使う理由は他にも存 在する。 fdisk は (最初の形式で起動された場合には) メニュー駆動型のプログラムであり、パーティ ションテーブルの作成と操作を行う。 DOS 形式のパーティションや、 BSD, SUN 形式のディスクラベルを扱うこともできる。 device に指定するのは通常以下のうちのどれかである。
    /dev/hda
    /dev/hdb
    /dev/sda
    /dev/sdb
(/dev/hd[a-h] は IDE ディスク、 /dev/sd[a-p] は SCSI ディスク、 /dev/ed[a-d] は ESDI ディスク、 /dev/xd[ab] は XT ディスクである) デバイス名はディスク全体を参照する。 partition は device 名にパーティション番号を付加したものである。例えば /dev/hda1 はシステムの第一 IDE ハードディスクの第一パーティションを指す。 IDE ディスクは 63 個までのパーティションを保持することができる。 SCSI ディスクは 15 までである。 /usr/src/linux/Documentation/devices.txt も参考にすると良い。 BSD/SUN 形式のディスクラベルは 8 パーティションを扱うことができる。そ のうち 3 番目は「ディスク全体」を表すパーティションとなる。先頭セクタ を実際に利用するパーティション (スワップなど) をシリンダ 0 から割り当 ててはならない。ディスクラベルを破壊してしまう。 DOS 形式のパーティションテーブルは、パーティションの数に制限がない。セ クタ 0 には、 4 つのパーティション (「基本 (primary) パーティション」と 呼ばれる) に関する情報が記述されている。これら基本パーティションは、拡 張 (extended) パーティションにすることもできる。これは論理 (logical) パーティションの入れ物となる。拡張パーティションにはディスクリプタ−が セクタのリンクリストの形式で置かれ、それぞれ対応する論理パーティション の情報を保持する。四つの基本パーティションには (存在していなくても) 番 号 1-4 が割り当てられる。論理パーティションの番号は 5 から始まる。 DOS 形式のパーティションテーブルでは、それぞれのパーティションのスター トオフセットとサイズは、 2 種類の方法で保存される。一つはセクタの絶対 数 (32 ビット) であり、もう一つは「シリンダ数/ヘッド数/セクタ数 (C/H/S)」の三つの組み合わせである (それぞれ 10, 8, 6 ビット)。前者には 問題は特になく、 512 バイトのセクタで 2 TB を扱うことができる。後者に は二種類の問題がある。まず第一に、この C/H/S を与えるためには、ヘッド 数とトラックあたりのセクタ数を知っていなければならない。第二に、これら の数値がわかったとしても、 24 ビットでは足りないかもしれない。 DOS は C/H/S だけを用いる。 Windows は両方を用いる。 Linux では C/H/S は使わない。 可能な場合は fdisk はディスクのジオメトリを自動的に取得する。これはディスクの物理的なジオメ トリであるとは限らない (実際、最近のディスクでは、本当に物理的な - 単 純な C/H/S 形式で記述できるような - ジオメトリを 持っていないもの もある)。しかしいずれにせよ、 MS-DOS はこのジオメトリをパーティション テーブルで利用する。 Linux しか置かないディスクなら、通常はデフォルトで問題なくすべてうまく いく。しかし他の OS とディスクを共有しなければならない場合には、まず他 の OS 上で、その OS 付属の fdisk を先に実行し、少なくとも一つのパーティ ションを作っておくと良い場合が多い。 Linux は、他の OS とうまく付き合う ために、ブート時にパーティションテーブルを参照し、どんなジオメトリが要 求されているのかを判断・決定しようとする (要求されているジオメトリは、 物理的なものとは異なっているかもしれないから)。 パーティションテーブルが表示されるときには、パーティションテーブルのエ ントリに対して整合性チェックが行われる。このチェックは、パーティション の開始と終了に関する、物理的な情報と論理的なそれとが同一であるか、また パーティションの開始／終了点がシリンダ境界にあるかを調べる (ただし後者 のチェックでは、最初のパーティションは例外である)。 MS-DOS のバージョンによっては、最初のパーティションの開始点をシリンダ 境界ではなく先頭シリンダの第 2 セクタにするものがある。シリンダ 1 から 始まるパーティションの開始点はシリンダ境界にならないが、これは問題にな ることはあまりないだろう。ただし OS/2 を同じマシンで使っていなければ、 であるが。 パーティションテーブルが更新されると、終了する前に sync() と BLKRRPART ioctl() (ディスクからパーティションテーブルを読み込みなおす) が実行さ れる。とても昔には、 fdisk を利用した後にはリブートが必須であったこと もあった。多分これは現在では直っていると思う - きっと。あまりに急いで リブートすると、まだ書き込まれていないデータを失うかもしれない。カーネ ルとディスクハードウェアの両方にバッファーデータが存在することに注意す ること。

DOS 6.x 向けの警告
DOS 6.x の FORMAT コマンドはパーティションのデータエリアの第一セクタか らある種の情報を検索し、これをパーティションテーブルにある情報よ り信頼できるものとして扱う。 DOS の FORMAT は、容量が変更されたときに は最初の 512 バイト分のデータ領域が DOS 版 FDISK によってクリアされて いることを仮定している。 DOS の FORMAT はこの拡張情報を /U フラグを指 定した場合でも見ようとする - 我々はこれは DOS FORMAT と DOS FDISK の バグであると考える。 結局のところ、 cfdisk や fdisk を用いて DOS パーティションの容量を変更 したときは、 DOS FORMAT を使ってパーティションをフォーマットする前に dd を使って先頭の 512 バイトを 0 で埋めなければならない、という訳である。 例えば cfdisk を用いて /dev/hda1 の DOS パーティションのテーブルエント リを作成した場合には、(fdisk または cfdisk を終了し、パーティションテー ブル情報が正しいかを確認するために Linux をリブートした後で) 先頭の 512 バイトをゼロにするために "dd if=/dev/zero of=/dev/hda1 bs=512 count=1" などと実行する必要がある。 dd コマンドを使う場合には特に注意すること。ちょっとしたタイプミスで、 ディスク上のすべてのデータがパーになる可能性もある。 できるだけ問題を起こしたくなければ、常に OS 固有のパーティションテーブ ル用プログラムを用いることである。例えば DOS パーティションは DOS FDISK プログラムで作り、 Linux のパーティションは Linux の fdisk また は cfdisk で作るべきなのである。

オプション

-v  fdisk プログラムのバージョン番号を表示する。

-l  ディスク /dev/hd[a-d], /dev/sd[a-h], /dev/ed[a-d], に対してパーティションテーブルを表示して終了する。.TP -b パーティションテーブルをリストするときに、 `Begin' カラムも表示する。 これは以前の fdisk のデフォルトの動作であった。 (注意: このカラムの値 がシリンダ単位で与えられているときには、 1023 以上の値は表示できない。 Begin と Start が異なっても、少なくとも Linux に関しては問題はない。)

-u  パーティションテーブルをリストするときに、サイズをシリンダ単位ではなく セクタ単位で表示する。

-s partition
    パーティションのサイズを (ブロック単位で) 標準出力に表示する。 この値は通常 mkfs(8) プログラムへの引数として与え、フォーマットするパーティションの容量 を指定するのに用いられる。 (古いバージョンの fdisk では、これはパーティション ID が 10 より大きな ディスクに対してのみ行われていた。これは DOS パーティションを避けよう としていたためである。現在ではこのテストは行われない。) sfdisk -s では異なった (実は正しい) 値が返ってくることに注意すること。 この違いが生じる理由は、カーネルと fdisk とで、パーティションの番号づけに対する扱いが異なることがあるからである (例えば BSD スライスを使っている場合など)。また両者の間で、拡張パーティ ションに対する扱いが異なっているからである。

バグ
この種の *fdisk プログラムには、同じ機能を持ったものが複数存在する。そ れぞれ長所短所がある。 cfdisk, fdisk, sfdisk の順に試してみると良かろう。