parted・gdisk・fdiskによるLinuxディスクパーティション管理:GPT/MBR完全ガイド

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

3つのツール、1つの目的 — どれを選ぶべきか?

新しいサーバーを立ち上げるたびに、あるいはディスクを追加するたびに、チームメンバーから同じ質問を受ける:「fdisk、parted、gdisk、どれを使えばいいですか?」正直に言えば、3つともほとんどのパーティション作業をこなせる。しかし、ディスクサイズ・パーティションテーブルの種類・対話型メニューとスクリプト実行のどちらを好むかによって、実際の使い勝手には大きな差がある。

このガイドでは各ツールを順番に紹介し、並べて比較したうえで、どの状況でどのツールを使うべきかを、今すぐ実行できるコマンドとともに具体的に解説する。

アプローチ比較:fdisk vs gdisk vs parted

ディスクに触れる前に、各ツールが何を目的として設計されたのかを理解しておくと役に立つ。

fdisk — 定番ツール、ただし注意点あり

fdiskはUnixの黎明期から存在する。MBR(DOS)パーティションテーブルに対してうまく機能し、あらゆるLinuxディストリビューションで利用できる。ただし落とし穴がある:古いバージョンのfdisk(2.26以前)はGPTを適切に扱えず、最新版でさえ他の2つのツールと比べるとGPTサポートが限定的だ。2TB未満のディスクでレガシー構成ならfdiskで十分。それを超えるなら、ツールの選択を誤っている。

gdisk — fdiskのGPTネイティブ版

gdiskはGPTパーティションテーブルに特化して作られた。インターフェースはfdiskとほぼ同じ——同じメニュー形式、同じコマンド文字——なので切り替えも簡単だ。GPTをネイティブで扱え、2TBを超えるディスクにも対応し、MBRテーブルをGPTに変換することもできる(慎重に行う必要はあるが)。最新のサーバーやNVMeドライブを扱うなら、gdiskが第一の選択肢だ。

parted — スクリプト向けの強力なツール

partedはMBRとGPTの両方をサポートし、任意のサイズのディスクを扱え、さらに重要なことに非対話型で動作する。コマンドを1行のシェルスクリプトにまとめられるため、自動化・cloud-initスクリプト・Terraformプロビジョニングに最適だ。RAM 4GBのUbuntu 22.04本番サーバーで複数のデータディスクをデプロイ時にプロビジョニングする際、partedコマンドをスクリプト化して対話プロンプトを待つ必要をなくしたことで、処理時間が大幅に短縮できた。

メリットとデメリット

fdisk

  • メリット:どこでも利用可能、慣れ親しんだインターフェース、MBRディスクに最適、追加パッケージ不要
  • デメリット:GPTサポートが限定的、デフォルトでは非対話型スクリプト実行に不向き、古いバージョンでは2TBのディスク制限あり

gdisk

  • メリット:完全なGPTサポート、MBRからGPTへの変換、fdisk風の使い慣れたインターフェース、大容量ディスクに対応
  • デメリット:プリインストールされていない場合がある(gdiskパッケージが必要)、MBRサポートは副次的

parted

  • メリット:GPTとMBR両対応、スクリプト向け非対話型モード、リサイズ対応、広く利用可能
  • デメリット:fdisk/gdiskとは構文が異なる、安全確認プロンプトが少ない(ミスを犯しやすい)、gdiskのようなGUID固有の操作はない

推奨する使い分け

私が日常的に使っている判断基準はこうだ:

  • MBRディスク、対話型作業fdisk
  • GPTディスク、対話型作業gdisk
  • 任意のディスク、スクリプト/自動化parted
  • パーティションのリサイズparted(3つの中で唯一resizepartコマンドを持つ)

2024年以降の新しいサーバーでは、ほぼすべてがGPTだ。スクリプトによるプロビジョニングにはpartedをデフォルトとし、パーティションテーブルを手動で確認・修復する場合はgdiskを使う。

実装ガイド

ディスクと現在のパーティションテーブルの確認

まずディスクを特定することから始めよう:

# すべてのブロックデバイスを一覧表示
lsblk -f

# パーティションテーブルの詳細情報を表示
sudo parted -l

# ディスクがGPTかMBRかを確認
sudo fdisk -l /dev/sdb

partedでGPTパーティションテーブルを作成する

対象ディスクが/dev/sdbで現在空の場合:

# GPTテーブルを作成
sudo parted /dev/sdb mklabel gpt

# 全領域を使う単一パーティションを作成
sudo parted /dev/sdb mkpart primary ext4 0% 100%

# 確認
sudo parted /dev/sdb print

複数パーティションを細かく設定する場合:

# 最初のパーティションを20GB、残りを2つ目のパーティションに
sudo parted /dev/sdb mkpart primary ext4 1MiB 20GiB
sudo parted /dev/sdb mkpart primary ext4 20GiB 100%

gdiskでGPTパーティションを作成する(対話型)

sudo gdisk /dev/sdb

gdiskメニュー内での操作:

GPT fdisk (gdisk) version 1.0.8

Command (? for help): n       # 新しいパーティション
Partition number: 1
First sector: (Enterキーでデフォルト値を使用)
Last sector: +20G             # または +100% で全領域
Hex code or GUID: 8300        # Linuxファイルシステム

Command (? for help): w       # 書き込んで終了
Do you want to proceed? (Y/N): Y

gdiskでよく使うパーティションタイプコード:

fdiskでMBRパーティションを作成する

sudo fdisk /dev/sdb
Command (m for help): o       # 新しいMBRテーブルを作成
Command (m for help): n       # 新しいパーティション
Partition type: p             # プライマリ
Partition number: 1
First sector: (Enter)
Last sector: +20G

Command (m for help): t       # パーティションタイプを変更(任意)
Hex code: 83                  # Linux

Command (m for help): w       # 書き込み

パーティション作成後のフォーマット

パーティション作成後はフォーマットを行う。カーネルは通常新しいパーティションテーブルを自動認識するが、認識されない場合はpartprobeを実行する:

sudo partprobe /dev/sdb

# ext4としてフォーマット
sudo mkfs.ext4 /dev/sdb1

# または xfs(大容量ファイルに適している)
sudo mkfs.xfs /dev/sdb1

# マウントしてfstabに追加
sudo mkdir /mnt/data
sudo mount /dev/sdb1 /mnt/data

# fstabエントリ用のUUIDを取得
blkid /dev/sdb1

partedでパーティションをリサイズする

ここでpartedの真価が発揮される。例えば/dev/sdb1を利用可能な全領域まで拡張したい場合:

# まず現在のレイアウトを確認
sudo parted /dev/sdb print

# パーティション1をディスク全体まで拡張
sudo parted /dev/sdb resizepart 1 100%

# 次にファイルシステムをリサイズ(ext4の例)
sudo resize2fs /dev/sdb1

XFSの場合は、マウント後にファイルシステムをリサイズする:

sudo xfs_growfs /mnt/data

破損したGPTテーブルの修復

GPTはパーティションテーブルのコピーを2つ保持している——ディスクの先頭と末尾にそれぞれ1つずつ。一方が破損しても、gdiskはバックアップから復元できる:

sudo gdisk /dev/sdb
# gdiskがGPTの問題を警告する
# リカバリーメニューを使用する
Command (? for help): r       # リカバリーと変換

Recovery/transformation menu:
b   # バックアップGPTヘッダーを使用(ディスク末尾から)
c   # ディスクからバックアップパーティションテーブルを読み込む
d   # メインGPTヘッダーを使用(ディスク先頭から)

# 選択後、修復したテーブルを書き込む
Command (? for help): w

MBRの破損については、元のパーティションレイアウトがわかればfdiskでテーブルを再構築できる。また、testdisk(別パッケージ)は自動パーティション復元に非常に優れている。

MBRからGPTへの変換

データを失わずに既存のMBRディスクをGPTに変換する必要がある場合(2TBの制限に達したときや4つ以上のプライマリパーティションが必要なとき):

sudo gdisk /dev/sdb
# gdiskがMBRを検出して変換を提案する
Found valid MBR and corrupt GPT. Which do you want to use?
 1 - MBR
 2 - GPT
 3 - Create blank GPT

# 2を選択して変換 — gdiskはメモリ上で変換する
# パーティションテーブルを確認した後:
Command (? for help): w       # GPTをディスクに書き込む

実行前に必ずデータをバックアップすること。変換は通常うまくいくが、ディスク操作には常にリスクが伴う。

クイックリファレンス チートシート

# --- parted(非対話型)---
parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary ext4 1MiB 100%
parted /dev/sdb resizepart 1 100%
parted /dev/sdb rm 2
parted -l                              # 全ディスクを一覧表示

# --- gdisk(対話型)---
gdisk /dev/sdb
  n = 新しいパーティション
  d = パーティションを削除
  p = テーブルを表示
  w = 変更を書き込む
  r = リカバリーメニュー
  q = 保存せずに終了

# --- fdisk(対話型)---
fdisk /dev/sdb
  o = 新しいMBRテーブル
  n = 新しいパーティション
  d = パーティションを削除
  t = タイプを変更
  p = テーブルを表示
  w = 変更を書き込む

パーティション操作の前に必ずやること

破壊的なコマンドを実行する前に、必ずlsblkまたはfdisk -lで対象ディスクをダブルチェックしよう。パーティション操作はブロックレベルで動作する——元に戻す方法はない。本番環境では、変更を加える前に必ずディスクのスナップショットを取るか、先頭数メガバイト(パーティションテーブルが格納されている場所)をddで素早くバックアップしておく:

# 最初の10MBをバックアップ(MBR + GPTヘッダーを含む)
sudo dd if=/dev/sdb of=~/sdb_header_backup.img bs=1M count=10

# 問題が発生した場合はリストア
sudo dd if=~/sdb_header_backup.img of=/dev/sdb bs=1M count=10

この3つのツールを使いこなし、それぞれをいつ使うべきかを明確に理解できれば、ディスクのパーティション管理はもう不安の種ではなく、日常的なサーバー作業のひとつに過ぎなくなる。

Share: