FDISK(8)

名前
fdisk - ディスクのパーティションテーブルを操作する

書式
fdisk [options] device

fdisk -l [device...]

説明
fdisk は、パーティションテーブルの作成と操作を行う対話方式のプログラムである。 この fdisk は、GPT, MBR, Sun, SGI, BSD のパーティションテーブルを理解することができる。

ブロックデバイスは、パーティションと呼ばれる 1 個以上の論理ディスクに分割することができる。この分割に関する情報は、通常ディスクのセクタ 0 に存在するパーティションテーブルに記録される。(BSD の世界では、 「ディスクスライス」とか「ディスクラベル」という言い方をする。)

[訳注]
    このマニュアルでは、「パーティションテーブル」と「ディスクラベル」の両方を、 ほぼ同じ意味で、混ぜて使っている。強いて言えば、Linux や DOS (GPT や MBR) については「パーティションテーブル」を使い、他の OS の場合も含めて、より一般的に言うときは「ディスクラベル」を使うようにしているらしいが、 必ずしもそうとは言えないところもある。

すべてのパーティション分割は、デフォルトではデバイスの I/O リミット (I/O トポロジーとも言う) に基づいて行われる。そのため fdisk は、4K-sector のサイズにふさわしくディスクレイアウトを最適化したり、MBR や GPT のために最近のデバイスで開始点や終了点のオフセットを適切な値に揃えたりできるのである。 だから、デフォルトの値に (たとえば、パーティションの最初や最後のセクタの値に) fdisk の提示するデフォルトを使うのは、いつだって賢明なことである。 また、パーティションのサイズを +/-<size>{M,G,...} の表記で指定すれば、必ずデバイスのプロパティに合わせて大きさが調整されることになる。

[訳注]
    util-linux 所収の blkid(8) の man によれば、blkid -i device で「I/O Limits (aka I/O topology) の情報を表示する」ことになっている。そこで、それを実行すると、MINIMUM_IO_SIZE, PHYSICAL_SECTOR_SIZE, LOGICAL_SECTOR_SIZE が表示された。I/O リミットとは、そうしたもののことなのだろう。特に、PHYSICAL_SECTOR_SIZE が重要なようだ。「I/O 境界」「I/O 制約」と訳せるかもしれない。

CHS (Cylinder-Head-Sector) アドレシングは非推奨であり、デフォルトでは使用されない。だから、SSD や 4K-sector のデバイスを使うときは、"fdisk -S <n> -H <n>" といったアドバイスのある古い記事や助言には、どうか従わないでいただきたい。

なお、ディスクレイアウトを表示するスクリプトのためには、partx(8) が豊富なインターフェースを提供している。 fdisk の方は、主として人間が使うことを想定しているのである。fdisk は、出力については後方互換を保証していない。入力 (コマンド) については、どれも後方互換のはずである。

オプション

-b, --sector-size sectorsize
    ディスクのセクタサイズを指定する。有効な値は、512, 1024, 2048, 4096 である。(最近のカーネルはセクタサイズの情報を持っている。 このオプションを使うのは、カーネルが古い場合や、 カーネルの持っている情報を変更したい場合のみにすること。) util-linux-2.17 以来 fdisk は、論理セクタサイズと物理セクタサイズを区別している。 このオプションは、両方のセクタサイズを sectorsize に変更する。

-B, --protect-boot
    新しいディスクラベルを作成するとき、ディスクの最初のセクタの先頭部分を消去しない。 この機能は、GPT と MBR に対してサポートされている。

-c, --compatibility[=mode]
    互換モードが 'dos' か 'nondos' か指定する。デフォルトは、non-DOS モードである。後方互換のために、このオプションは、引き数の mode なしで使うこともできる。その場合は、デフォルトが使用される。 気を付けてほしいのは、オプションの -c と、指定が任意の引き数 mode との間を空白で区切ってはいけないことだ。正しい書式は、たとえば '-c=dos' である。

-h, --help
    ヘルプテキストを表示して終了する。

-L, --color[=when]
    出力をカラー表示にする。指定が任意の引き数 when には、auto, never, always が使える。引き数 when を省略すると、デフォルトの auto になる。カラー表示は無効にすることもできる。 プログラムに埋め込まれた現在のデフォルトが有効か無効かを知りたければ、--help の出力を見ればよい。「カラー表示」セクションも参照していただきたい。

-l, --list
    指定されたデバイスのパーティションテーブルを一覧表示して、終了する。 デバイスをひとつも指定しなかった場合は、 /proc/partitions というファイルが存在するなら、そこに記載されているデバイスを対象にする。

-o, --output list
    どの出力項目 (columns) を表示するかを指定する。サポートされている全項目のリストを知るには、--help オプションを使用すればよい。

    list を +list という書式で指定すれば、デフォルトのリストに項目を追加することができる (たとえば -o +UUID のように)。

-s, --getsz
    指定した各ブロックデバイスについて 512-byte セクタでサイズを表示する。このオプションは非推奨であり、blockdev(8) を使った方がよい。(訳注: 実のところ、手元の v2.35.2 の fdisk -s では、1 セクタ 1024 バイト計算のセクタ数を表示する。blockdev --getsz の方は 1 セクタ 512 バイトのセクタ数。)

-t, --type type
    指定したタイプ (type) のディスクラベルに対してのみサポートを有効にし、 ほかのすべてのタイプに対するサポートは無効にする。

-u, --units[=unit]
    パーティションテーブルの一覧表示をするとき、 「セクタ数」または「シリンダ数」でサイズを表示する。 デフォルトは、セクタ数でのサイズ表示である。後方互換を考慮して、このオプションは、 unit 引き数なしでも使えるようになっている。その場合は、デフォルトが使用される。 気を付けてほしいのは、オプションの -u と、指定が任意の引き数 unit との間を空白で区切ってはいけないことだ。すなわち、正しい書式は、たとえば '-u=cylinders' である。

-C, --cylinders number
    ディスクのシリンダ数を指定する。 どうしてそんなことをしたがるのか、筆者にはさっぱりわからないが。

-H, --heads number
    ディスクのヘッド数を指定する (もちろん、物理的なヘッド数ではなく、 パーティションテーブルで使うヘッド数である)。 妥当な値は、255 または 16 である。

-S, --sectors number
    ディスクの 1 トラックあたりのセクタ数を指定する (もちろん、物理的なセクタ数ではなく、パーティションテーブルで使うセクタ数である)。 妥当な値は、63 である。

-w, --wipe when
    デバイスからファイルシステムや RAID やパーティションテーブルのシグナチャーを消去する (訳注: 前から存在する古いシグナチャーを消去するということだろう)。衝突 (collision) が起きないようにするためである。引き数の when には、auto, never, always が使える。このオプションが指定されない場合のデフォルトは、auto であり、その場合シグナチャーが消去されるのは、対話モードのときだけである。 いずれの場合でも、新しいパーティションテーブルが作成される前に、検出されたシグナチャーが、 警告メッセージとして通知される。wipefs(8) コマンドの説明もご覧いただきたい。

-W, --wipe-partition when
    新たに作成するパーティションからファイルシステムや RAID やパーティションテーブルのシグナチャーを消去する (訳注: 前から存在する古いシグナチャーを消去するということだろう)。衝突 (collision) が起きないようにするためである。引き数の when には、auto, never, alwaysが使える。このオプションが指定されない場合のデフォルトは、 auto であり、その場合シグナチャーが消去されるのは、対話モードのときだけで、 それもユーザが承認した後である。 いずれの場合でも、新しいパーティションが作成される前に、検出されたシグナチャーが、 警告メッセージとして通知される。wipefs(8) コマンドの説明もご覧いただきたい。

-V, --version
    バージョン情報を表示して終了する。

デバイス
「デバイス」は普通、/dev/sda, /dev/sdb などである。デバイス名は、ディスク全体を指している。libata (ATA ホストコントローラーと ATA デバイスをサポートするために Linux カーネルの内部で使われるライブラリ) の存在しない古いシステムでは、IDE と SCSI のディスクを区別している。そうした場合は、デバイス名が /dev/hd* (IDE) や /dev/sd* (SCSI) になるだろう。

「パーティション」は、デバイス名の後ろにパーティション番号が付いたものだ。 たとえば、/dev/sda1 は、そのシステムの最初のハードディスクの最初のパーティションである。 Linux kernel 文書 (この場合は、Documentation/admin-guide/devices.txt というファイル) もご覧になっていただきたい。

サイズ
"Last sector (最終セクタ)" という問い合わせに対しては、パーティションサイズをセクタ数でも +/-<size>{K,B,M,G,...} という表記でも指定できる。

[訳注]
    デフォルトでは、最終セクタ番号を指定するようになっている。 サイズを、バイト数ではなく、セクタの数で指定する +/-<セクタ数> という指定法もある。

サイズの前に '+' を付けると、そのパーティションの最初のセクタからの相対的なサイズと解釈される。 サイズの前に '-' を付けた場合は、最大位置 (そのパーティションのために利用できる最後のセクタ) からのサイズになる。

サイズをバイト数で指定する場合は、数字の後に KiB=1024, MiB=1024*1024 のような乗数を表す接尾辞を付けることができる。GiB, TiB, PiB, EiB, ZiB, YiB も同様に使える。"iB" を続けるのは任意であり、たとえば、"K" は "KiB" と同じ意味である。

相対的なサイズは、必ずデバイスの I/O リミットに合わせて大きさが調整される。 +/-<size>{K,B,M,G,...} というこの表記法をお勧めする所以である。

後方互換のため、fdisk は KB=1000, MB=1000*1000 といった接尾辞も解する。 GB, TB, PB, EB, ZB, YB も同様に使える。ただし、こういった 10^N を表す接尾時は非推奨である。

スクリプトファイル
fdisk では、sfdisk 互換のスクリプトファイルを読み込むことができる ('I' コマンドを使用する)。スクリプトはメモリ中のパーティションテーブルに適用されるので、 そのパーティションテーブルに変更を加えてから、それをデバイスに書き出すことが可能である。

また逆に、現在メモリ中にあるディスクレイアウトを、'O' コマンドを使って、スクリプトファイルに書き出すこともできる。

こうしたスクリプトファイルは、cfdisk, sfdisk, fdisk などの libfdisk アプリケーションの間で互換性がある。より詳しいことは、sfdisk をご覧いただきたい。

ディスクラベル
GPT (GUID Partition Table)
    GPT は、パーティションテーブルのレイアウトについての最近の規格である。 GPT は、各パーティションに対して、64 ビットの論理ブロックアドレス、チェックサム、 UUID、それに、どんなパーティションかを示す名前を使用する。 また、パーティションの数に制限がない (とは言え、パーティショニングツールの多くでは、パーティション数の上限をたいてい 128 にしている)。

    [訳注]
        ここで言う「どんなパーティションかを示す名前」は、fdisk -l -o +Name を実行すると (存在すれば) 表示される、簡単なパーティションの説明のことだろう。"EFI system partition" とか "Basic data partition" のようなものである。 sfdisk の --part-label オプションの説明や、 「入力の書式」セクションのフィールド名の説明もご覧になっていただきたい。

    なお、GPT の仕様では、今でも最初のセクタが protective MBR のために留保されている。MBR 専用のパーティショニングツールが、誤認識して GPT ディスクを上書きしてしまうのを防ぐためである。

    GPT は、MBR より常によい選択である。UEFI のブートローダーを持つ最近のハードウェアでは、なおさらのことだ。

DOS-type (MBR)
    DOS 形式のパーティションテーブルは、記述できるパーシションの数に上限がない。 セクタ 0 には、4 パーティションを記述する余地がある (これらは基本パーティションと呼ばれる)。 そのうちのひとつは拡張パーティションにすることができる。 これは、言わば、論理パーティションを入れる容器であり、セクタの連鎖リストの形になっている記述子 (descriptors) が、それぞれの対応する論理パーティションの前に付いている。 4 個の基本パーティションは、存在する、しないにかかわらず、1-4 の番号を取る。論理パーティションの番号は、5 から始まる。

    DOS 形式のパーティションテーブルでは、各パーティションの開始オフセットとサイズは、 二つの方法で記録される。すなわち、セクタの絶対数 (32 ビットで指定される) と、シリンダ数/ヘッド数/セクタ数 (C/H/S) の三つ組としてである (10+8+6 ビットで指定される)。前者には問題がない。512-byte セクタで最大 2 TB まで表現できる。後者には二つの問題がある。第一に、こうした C/H/S のフィールドを埋めることができるのは、ヘッド数や 1 トラックあたりのセクタ数が分かっているときだけだ。 第二には、そうした数値の妥当な値が分かっている場合でも、利用できる 24 ビットでは十分ではない。DOS は C/H/S のみを使い、Windows は両方を使う。Linux は C/H/S を全く使わない。C/H/S 方式のアドレス指定は非推奨である。 fdisk の将来のバージョンではサポートされないかもしれない。

    DOS 互換のパーティションを作成したいなら、「DOS モード ...」セクションをお読みになるとよい。fdisk はデフォルトでは、シリンダ境界に留意しない。

BSD/Sun-type
    BSD/Sun 形式のディスクラベルは、8 個のパーティションを記述できる。そのうちの 3 番目は、ディスク全体を表すパーティションになるはずだ。 パーティションが (スワップパーティションのように) その最初のセクタを実際に使用する場合には、そのパーティションをシリンダ 0 から始めてはいけない。ディスクラベルを破壊することになるからである。 なお、BSD ラベル は、通常 DOS パーティションの中にネストされる。

IRIX/SGI-type
    IRIX/SGI 形式のディスクラベルは、16 個のパーティションを記述できる。そのうちの 11 番目は、ボリューム全体を表すパーティションであり、 9 番目は、ボリュームヘッダと名付けられるはずだ。 このボリュームヘッダには、パーティションテーブルも含まれることになる。 すなわち、ブロック 0 から始まって、デフォルトでは 5 シリンダ分を占めるのである。ボリュームヘッダの残りのスペースは、 ヘッダのディレクトリエントリ用に使用することができる。 どのパーティションも、ボリュームヘッダと重なってはいけない。 また、ボリュームヘッダのパーティションタイプを変更してはならないし、 そこにファイルシステムを作ってもいけない。 パーティションテーブルがなくなってしまうからである。このタイプのラベルを使うのは、 IRIX/SGI マシンで Linux を動かすときか、Linux の元で IRIX/SGI のディスクを扱うときだけにするべきである。

パーティションテーブルが更新されたときは、プログラムを終了する前に、 sync() と ioctl(BLKRRPART) (ディスクからパーティションテーブルを再読み込みする) が実行される。

DOS モードと DOS 6.x に関する警告
ご注意いただきたいが、このセクションで述べることの全てが非推奨である。 最近のオペレーティングシステムでは、ジオメトリやシリンダ数といったことに気を使う必要はない。 それでも、本当に DOS 互換のパーティション分割をなさりたいのならば、fdisk のコマンドラインオプション '-c=dos -u=cylinders' を使用して DOS モードと cylinder 単位を有効にしなければならない。

DOS 6.x の FORMAT コマンドは、パーティションのデータ領域の最初のセクタに、ある種の情報を探しに行き、 それをパーティションテーブルの情報より信頼できるものとして扱う。また、DOS の FORMAT は、DOS の FDISK が、サイズの変更があったときには必ず、パーティションのデータ領域の最初の 512 バイトをクリアすることを当てにしている。DOS の FORMAT は、/U フラグが指定されたときでさえ、上記の追加情報を見に行こうとする。 我々としては、こうした振る舞いは、DOS の FORMAT や FDISK のバグだと思う。

要するにこういうことだ。fdisk や cfdisk を使って、パーティションテーブル上の DOS の領域のサイズを変更する場合には、DOS の FORMAT でそのパーティションをフォーマットする前に、dd(1) コマンドを使って、そのパーティションの最初の 512 バイトを 0 で初期化することも行わなければならないのである。 たとえば、fdisk を使って、パーティションテーブル中の /dev/sda1 に DOS の領域を作成しているのならば、(fdisk を終了し、パーティションテーブルの情報が有効になるように Linux をリブートした後で) "dd if=/dev/zero of=/dev/sda1 bs=512 count=1" というコマンドを実行して、そのパーティションの最初の 512 バイトを 0 で初期化することになるだろう。

通常 fdisk はディスクジオメトリを自動的に取得する。 それは必ずしも実際の物理的なディスクジオメトリとはかぎらない (そうなのだ。最近のディスクには、物理的なジオメトリのようなものは実のところ存在しない。 「シリンダ数/ヘッド数/セクタ数」といった単純化された形で記述できるようなものは、 確かに存在しないのだ)。それでも、MS-DOS がパーティションテーブルで使用するのは、このディスクジオメトリなのである。

たいていの場合、デフォルトで万事うまく行くし、Linux がディスク上の唯一のシステムなら、問題はまったく起きない。 それでも、ディスクを他のオペレーティングシステムと共有しなければならないのなら、他の OS の FDISK でパーティションを少なくとも 1 つ作っておくのは、多くの場合、よい考えである。Linux は、ブートするとき、パーティションテーブルを調べて、 他のシステムとうまくやって行くためには、どんな (見せかけの) ジオメトリが必要かを推測しようとと試みるからである。

パーティションテーブルが DOS モードで表示される際には、 パーティションテーブルの各領域について、整合性のチェックが必ず行われる。 このチェックは、物理開始点と論理開始点、物理終了点と論理終了点が同じかどうかと、 各パーティションの開始点や終了点が、シリンダ境界と一致しているかどうかをチェックしている (ただし後者のチェックでは、最初のパーティションは除外される)。

MS-DOS のバージョンによっては、作成する最初のパーティションを、シリンダ境界ではなく、 先頭シリンダの第 2 セクタから始めるものがある。 開始点が先頭シリンダ中にあるパーティションでは、 シリンダ境界からパーティションが始まるわけがないが (訳注: 何故なら、先頭シリンダの先頭には MBR などがあるはずだから)、それが問題になることは、お手元のマシンに OS/2 も入っていないかぎり、まずないだろう。

最善の結果を得るためには、必ずその OS に固有のパーティションテーブル作成プログラムを使うべきである。 たとえば、DOS のパーティションは、DOS の FDISK プログラムで作り、Linux のパーティションは、Linux の fdisk か　cfdisk プログラムで作るべきなのだ。

カラー表示
自動的なカラー表示は、/etc/terminal-colors.d/fdisk.disable という空ファイルを作ることで無効にできる。

カラー表示の設定についてもっと詳しいことを知りたかったら、terminal-colors.d(5) をご覧になるとよい。fdisk は、以下の論理カラー名をサポートしている。

header
    出力するパーティションテーブルのヘッダ。

help-title
    ヘルプセクションのタイトル。

warn
    警告メッセージ。

welcome
    ウェルカムメッセージ。

作者
Karel Zak <kzak@redhat.com>
Davidlohr Bueso <dave@gnu.org>

最初のバージョンを書いたのは、Andries E. Brouwer, A. V. Le Blanc, その他の人たちだった。

環境変数

FDISK_DEBUG=all
    fdisk のデバッグ出力を有効にする。

LIBFDISK_DEBUG=all
    libfdisk デバッグ出力を有効にする。

LIBBLKID_DEBUG=all
    libblkid デバッグ出力を有効にする。

LIBSMARTCOLS_DEBUG=all
    libsmartcols デバッグ出力を有効にする。

LIBSMARTCOLS_DEBUG_PADDING=on
    目に見える埋め文字 (padding characters) を使用する。LIBSMARTCOLS_DEBUG を有効にしておく必要がある。

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

入手方法
この fdisk コマンドは、util-linux パッケージの一部であり、以下の URL から入手できる。https://www.kernel.org/pub/linux/utils/util-linux/