はじめに
今回、EBS のボリューム拡張を行おうとしたところエラーが発生してしまったので、その内容についてメモしておこうと思います。
エラー内容
NOCHANGE: partition 1 is size 4294965248. it cannot be grown
実際に実行した際の状況は以下になります。
$ sudo growpart /dev/nvme0n1 1
NOCHANGE: partition 1 is size 4294965248. it cannot be grown
このエラーは、growpart を実行した際にコマンド側で既にパーティションが最大サイズに達していると判断し、拡張が行われなかったことを意味します。
調査
エラーだけでは原因がわからず、状況を確認するために以下の調査を実施しました。
1. 認識している EBS ボリューム容量確認
まずは EBS ボリュームの確認です。
lsblk コマンドで確認できますが、容量に余裕があります。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 3T 0 disk
└─nvme0n1p1 259:1 0 2T 0 part
2. パーティションテーブルの種類確認
まず、GPT または MBR かを確認します。
$ sudo parted /dev/nvme0n1 print
モデル: NVMe Device (nvme)
ディスク /dev/nvme0n1: 3221GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:
番号 開始 終了 サイズ タイプ ファイルシステム フラグ
1 1049kB 2199GB 2199GB primary xfs boot
パーティションテーブルは msdos
となっているので、パーティションテーブル形式は MBR であることがわかりました。
また、MBR の最大パーティションサイズは 2TiB ≒ 2.199TB
です。
そのため、今回は最大パーティションサイズに到達しているのが原因とわかりました。
3. 実際のディスクサイズとパーティションの境界確認
念の為 fdisk でも確認してみます。
$ sudo fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 3221.2 GB, 3221225472000 bytes, 6291456000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: dos
ディスク識別子: 0x000b956b
デバイス ブート 始点 終点 ブロック Id システム
/dev/nvme0n1p1 * 2048 4294967295 2147482624 83 Linux
以下はブロック数とセクター数での上限をまとめたものです。
表示値 | 単位 | バイト換算 | 備考 |
---|---|---|---|
2147482624 | ブロック数(1KiB単位) | 2147482624 × 1024 = 2199023254528 bytes | ≒ 2TiB(1024³) |
4294967295 | セクター数(512B単位) | 4294967295 × 512 = 2199023255040 bytes | ≒ 2TiB(MBRの上限) |
別の視点からも、完全に限界まで使っていることが確認できました。
対処法
今回発生したエラーから、このままではボリュームの拡張が難しいとわかりました。
その際の対処として2つ考えられます。
方法1: GPTに変換して再パーティション
この方法はディスクの再フォーマットが必要になるため、全データ削除されてしまうことに注意です。
まだ利用していないボリュームであれば良いですが、運用中のシステムでは推奨されません。
とりあえず、対応の流れは以下になります。
- データのバックアップ
- gdisk 等を用いて MBR → GPT に変換
- パーティションを1つで再作成し、xfs で再フォーマット
- / に戻す場合は、ルートパーティションの再インストールが必要
方法2: 空き領域を別パーティションにして /data などに割り当てる
非破壊的で安全に拡張できそうです。
以下、手順になります。
1. 空き領域に新しいパーティションを作成
$ sudo fdisk /dev/nvme0n1
- n(新しいパーティション作成)
- パーティション番号:2
- 開始セクタ:既存の終了セクタ + 1(例:4294967296)
- 終了セクタ:デフォルト(Enter)
- w(書き込みして終了)
2. フォーマット
$ sudo mkfs.xfs /dev/nvme0n1p2
3. マウントディレクトリ作成
$ sudo mkdir /data
4. マウント
$ sudo mount /dev/nvme0n1p2 /data
5. 永続化(/etc/fstab への登録)
$ echo '/dev/nvme0n1p2 /data xfs defaults 0 0' | sudo tee -a /etc/fstab
以上で完了です。
わかったこと
今回のエラーを調査してわかったポイントです。
- 現在の環境(MBR + / マウント済)では / を拡張できない
- 別パーティション /dev/nvme0n1p2 を作り /data などで運用するのが現実的かつ安全な方法
おわりに
MBR が 2TB までしか拡張できないということを今回初めて知りました。
あまり機会は少ないですが、今後 EBS に大容量のデータを保存する際は注意しようと思います。
参考