名前

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

書式

fdisk [options] device

fdisk -l [device...]

説明

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

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

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

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

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

-V, --version

バージョンを表示して、 終了する。

-L, --color[=when]

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

-l, --list

指定されたデバイスのパーティションテーブルを一覧表示して終了する。

デバイス指定がない場合は、 /proc/partitions に記述されたデバイスが (このファイルが存在していれば) 用いられる。 デバイスの順番は常に、 コマンドラインでの指定順か、 あるいは /proc/partitions に示されたカーネルに従う。

-x, --list-details

--list と同様であるが、 さらに詳細情報を提供する。

--lock[=mode]

操作するデバイスやファイルに対して、 排他 BSD ロックを用いる。 mode は任意の引数であり、 yes, no (あるいは 1 か 0) または nonblock の指定が可能である。 mode 引数が省略された場合、 そのデフォルトは yes である。 このオプションは、 環境変数 $LOCK_BLOCK_DEVICE を上書きする。 デフォルトは、 ロックを一切利用しない。 ただし systemd-udevd(8) や他のツールを用いる際の衝突は避けることが推奨される。

-n, --noauto-pt

空のデバイス上には、 デフォルトパーティションの自動生成は行わない。 パーティションテーブルは、 ユーザーが明示的に ('o', 'g' などのコマンドを実行して) 生成しなければならない。

-o, --output list

出力する項目を指定する。 --help を実行すれば、 サポートされている項目一覧を見ることができる。

list+list という書式で指定すれば、 デフォルトの項目一覧を拡張することができる (たとえば -o +UUID)。

-s, --getsz

指定した各ブロックデバイスについて 512-byte セクターでサイズを表示する。 このオプションは非推奨であり、 blockdev(8) を使った方がよい。

-t, --type type

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

-u, --units[=unit]

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

-C, --cylinders number

ディスクのシリンダー数 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-partitions 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(8), sfdisk(8), fdisk などの libfdisk アプリケーション間で互換である。 詳細については、 sfdisk(8) を参照していただきたい。

ディスクラベル

GPT (GUID Partition Table)

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

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

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

DOS-type (MBR)

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

DOS 形式のパーティションテーブルでは、 各パーティションの開始オフセットとサイズは、 2 つの方法で記録される。 すなわち、 セクターの絶対数 (32 ビットで指定される) と、 シリンダー数/ヘッド数/セクター数 (C/H/S) の三つ組としてである (10+8+6 ビットで指定される)。 前者には問題がない。 512-byte セクターで最大 2 TB まで表現できる。 後者には 2 つの問題がある。 第一に、 こうした 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(2) と 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 のバグと考えられる。

要するにこういうことだ。 fdiskcfdisk(8) を使って、 パーティションテーブル上の 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 セクターから始めるものがある。 開始点が先頭シリンダー中にあるパーティションでは、 シリンダー境界からパーティションが始まるわけがないが、 それが問題になることは、 お手元のマシンに OS/2 も入っていないかぎり、 まずないだろう。

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

カラー表示

カラー出力は terminal-colors.d(5) の機能により実現されている。 自動的なカラー表示は、 以下の空ファイルを用意することで無効にできる。

/etc/terminal-colors.d/fdisk.disable

for the fdisk command or for all tools by

/etc/terminal-colors.d/disable

ユーザー固有の指定 $XDG_CONFIG_HOME/terminal-colors.d または $HOME/.config/terminal-colors.d は、 グローバル設定を上書きする。

Note that the output colorization may be enabled by default, and in this case terminal-colors.d directories do not have to exist yet.

The logical color names supported by fdisk are:

header

出力するテーブルのヘッダー。

help-title

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

warn

警告メッセージ。

welcome

ウェルカムメッセージ。

環境変数

FDISK_DEBUG=all

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

LIBFDISK_DEBUG=all

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

LIBBLKID_DEBUG=all

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

LIBSMARTCOLS_DEBUG=all

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

LIBSMARTCOLS_DEBUG_PADDING=on

目に見える埋め文字 (padding characters) を使用する。

LOCK_BLOCK_DEVICE=<mode>

排他 BSD ロックを用いる。 モードには "1" または "0" がある。 詳しくは --lock を参照のこと。

作者

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

関連項目

cfdisk(8), mkfs(8), partx(8), sfdisk(8)

バグ報告

バグ報告は、 以下に示す issue トラッカーを利用すること。 <https://github.com/util-linux/util-linux/issues>.

入手方法

fdisk コマンドは util-linux パッケージの一部であり、 以下からダウンロードできる。 Linux Kernel Archive <https://www.kernel.org/pub/linux/utils/util-linux/>.