はじめに
EC2(t3.micro)の上でアプリをビルドしようとしたら、その準備の swap 作成でいきなり怒られました。
dd: error writing '/swapfile': No space left on device
「ディスクの空きがない」?立てたばかりの EC2 なのに? df を見たら、ルートディスクが 2GB しかありませんでした。
「え、2GB?そんなに小さいの…?」と固まりました😅
EBS を増やすだけでは終わらず、OS 側にもうひと手間が要る、という話を残します。
環境
- AWS EC2(t3.micro、Amazon Linux 2023)
- ルートディスク:EBS
- やりたかったこと:EC2 上でアプリ(Gradle)をビルド
- リージョン:ap-northeast-1
起きたこと
ビルド前に swap(仮想メモリ)を 2GB 作ろうとしたら失敗:
dd: error writing '/swapfile': No space left on device
df -h / で確認すると:
Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p1 2.0G 1.7G 272M 87% /
ルートディスクが 2.0G、空きは 272M。今回使った AMI のルートボリュームが小さく、ビルドツール(Gradle 本体のダウンロード+依存+JDK)には全然足りませんでした。
原因
ルートに使う EBS ボリュームのサイズが小さかった(今回は 2GB)だけでした。
そして大事なのが、EBS を大きくしても、OS 側の領域は自動では広がらないこと。AWS 側でボリュームを 20GB に増やしても、Linux 側ではパーティションやファイルシステムがまだ 2GB のままなので、df の空き容量は増えません。だから2段階が必要でした:
- AWS 側で EBS ボリュームを増やす(コンソール、または IaC で
volume_sizeを増やす) - OS 側で パーティションとファイルシステムを広げる
解決
まず現状を確認します。
# ディスク・パーティション・マウント先を確認
lsblk
# ファイルシステムの種類(xfs か ext4 か)とサイズを確認
df -T /
失敗して中途半端にできた swap ファイルがあれば消して空きを戻します(まだ swap として有効化できていなければ swapoff は失敗しても大丈夫です)。
sudo swapoff /swapfile 2>/dev/null || true
sudo rm -f /swapfile
EBS を 20GB に増やしてから、OS に反映します。
# ① パーティションをディスク全体まで広げる(末尾の 1 は対象パーティション番号)
sudo growpart /dev/nvme0n1 1
# ② ファイルシステムを広げる(今回の環境は xfs)
sudo xfs_growfs /
# 反映確認(20G になる)
df -h /
これで Size が 20G になり、ビルドも通りました。
※ファイルシステムが ext4 の場合は
xfs_growfsではなくsudo resize2fs /dev/nvme0n1p1を使います。最初のdf -T /で種類を、lsblkでデバイス名を確認できます。
学び
-
EBS を増やす ≠
dfの空きが増える。 AWS 側でボリュームを拡張したあと、OS 側でgrowpart→ ファイルシステム拡張(xfs ならxfs_growfs、ext4 ならresize2fs)が要る。 - 「No space left on device」は、本当にディスクの空きが足りないサイン。まず
df -h /で実際の容量を見る。 - ビルドや依存ダウンロードは意外とディスクを食う。最初から少し余裕のあるボリュームサイズにしておくと楽。
おわりに
「立てたばかりなのにディスクの空きが無い」で一瞬パニックでしたが、EBS拡張+OS側の拡張までやって、ようやく空き容量が増えました😅 同じように No space left on device で止まった人の参考になれば嬉しいです🙌