FDISK(8)

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

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

fdisk -l [-u] [-b sectorsize] [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 から割り当 ててはならない。ディスクラベルを破壊してしまう。 IRIX/SGI 形式のディスクラベルは、 16 パーティションを記述できる。 そのうちの第 11 番目は `volume' 全体に対応するパーティションであり、 第 9 番めは `volume header' とラベル付けされる。 volume header はパーティションテーブルの領域もカバーする。 つまり volume header はブロック 0 から始まり、デフォルトでは シリンダ 5 までの部分を占める。 volume header の残りの部分は ヘッダディレクトリエントリに用いられる。 volume header は他のパーティションと重なってはならない。 またパーティションテーブルが含まれているので、形式を変更したり、 ファイルシステムを作ったりもできない。 このラベル形式は、 IRIX/SGI マシンで動作している Linux か、 IRIX/SGI ディスクを Linux で使う場合に限って用いること。 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 で作るべきなのである。

オプション

-b sectorsize
    ディスクのセクターサイズを指定する。 指定できる値は 512, 1024, 2048 のいずれかである。 (最近のカーネルはセクターサイズをうまく扱える。 このオプションを用いるのは、カーネルが古い場合や、 カーネルの考えを上書きする場合だけにすること。)

-l  指定したデバイスのパーティションテーブルをリストして終了する。 デバイスを何も指定しないと、 /proc/partitions があれば、そこにあるデバイスを対象にする。

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

-s partition
    パーティションのサイズを (ブロック単位で) 標準出力に表示する。

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

バグ
この種の *fdisk プログラムには、同じ機能を持ったものが複数存在する。そ れぞれ長所短所がある。 cfdisk, fdisk, sfdisk の順に試してみると良いだろう。 (実際のところ、 cfdisk は美しいプログラムであり、受付けるパーティションテーブルに 厳しい条件を課し、品質の高いパーティションテーブルを生成する。 可能な場合はこれを用いること。 fdisk はバグっぽいプログラムで、やることもややあやふやである - 通常は真っ当な結果を出力するけれど。一つ利点があるとすると、 fdisk は BSD のディスクラベルや、その他の非 DOS パーティションテーブルを 多少サポートしている点である。 sfdisk はハッカー専用である。ユーザーインターフェースはひどいが、 fdisk よりも正しく、また fdisk, cfdisk のどちらよりもパワフルだ。 それに、インタラクティブでない使い方もできる)

IRIX/SGI 形式のディスクラベルは、現時点ではカーネルでサポートされていない。 また IRIX/SGI ヘッダディレクトリはまだ完全にはサポートできていない。

「パーティションテーブルをファイルにダンプする」 オプションは存在しない。

関連項目
cfdisk(8), mkfs(8), parted(8), sfdisk(8)