RHEL6.6のAMIでEBSを使用する際の注意点

2015.04.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

森永です。
弊社はAmazon Linuxでサーバを構築することが多いのですが、たまにRHELを使うことがあります。
RHEL6.6のAMIを使った際にハマったのでまとめておきます。

現象

RHEL6.6のAMI(ID:ami-a15666a0)からインスタンスを立ち上げてRootボリュームの容量を確認したところ、100GのEBSをマウントしているにもかかわらず6Gほどしか認識していないことが判明しました。

$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 5.8G 1.9G 3.6G 35% /
tmpfs 1.8G 0 1.8G 0% /dev/shm

ちなみに、RHEL6.6以外のAMIではこの現象は起きませんでした。。。(RHEL6.5や7では問題なし)

原因

デフォルトのRootボリューム容量が6Gで、cloud-initで自動拡張が動いてくれないことが原因のようです。 lsblkコマンドで確認したところ、6Gの大きさでパーテーションが切られていました。

$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 100G 0 disk
└─xvda1 202:1 0 6G 0 part

対処方法

パーテーションの切られ方がおかしいため、resize2fsコマンドを実行するだけでは解決できません。
gdiskを使ってパーテーションを拡張してから、ファイルシステム拡張という流れになります。

作業インスタンスへのアタッチ

そのままのインスタンスでの作業は怖すぎるので、作業用インスタンスを使用することにします。
まず、該当のRHELのインスタンスをStopし、EBSボリュームを取り外します。
この際、大量のEBSボリュームを抱えている場合、対象ボリュームを探すのに一苦労すると思いますので、インスタンス詳細画面から飛ぶことをおすすめします。

rhel01

また、EBSのNameにインスタンス名などをつけておくと管理が楽です。(デタッチするとどのインスタンスにアタッチされていたかの情報がなくなるため)

EBSボリュームのStatusが「Available」になったら作業用インスタンスにアタッチします。
作業用インスタンスはAmazon Linuxの最小設定で作成すれば事足ります。
ただし、必ず作業用インスタンスはEBSボリュームと同じAZに配置するようにして下さい。(別AZだとアタッチできません。。。)

アタッチの設定はデフォルトのもので構いません。

rhel03

パーテーションの拡張

この作業ではデータが破損、削除される可能性がありますので、既にボリュームを使用している場合にはSnapshotを取得しておきましょう。(新規インスタンスの場合は必要ありません。)

パーテーションの拡張をするのには、gdiskコマンドを使用します。
Amazon Linuxにはデフォルトでgdiskが入っています。(2015.03現在)

まず、拡張するボリュームを確認するために、lsblkコマンドを実行します。
今回の場合は"/dev/xvdf"が対象のボリュームとなります。

$ lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0    8G  0 disk
└─xvda1 202:1    0    8G  0 part /
xvdf    202:80   0  100G  0 disk
└─xvdf1 202:81   0    6G  0 part

上記手順で確認したパスを引数にgdiskコマンドを起動します。

$ sudo gdisk /dev/xvdf
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

pコマンドを実行し、パーテーションの情報を表示します。 Disk identifier (GUID)Codeをメモしておきます。

Command (? for help): p
Disk /dev/xvdf: 209715200 sectors, 100.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): C0E76C1A-B601-48A7-A1E0-CC49DEFF6CB4
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 20971486
Partitions will be aligned on 2048-sector boundaries
Total free space is 8388541 sectors (4.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048        12584959   6.0 GiB     EF00

空のパーテーションを作成するために、oコマンドを実行します。

Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): Y

nコマンドを使用して、パーテーションの設定をします。
今回はボリューム全体を一つのパーテーションとして設定するため、ほぼデフォルトで設定しました。
「Hex code or GUID」の項目については、さきほどメモしておいたCodeの値を使用します。

Command (? for help): n
Partition number (1-128, default 1):
First sector (34-209715166, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-209715166, default = 209715166) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): EF00
Changed type of partition to 'EFI System'

xコマンドでエキスパートコマンドモードに変更してから、gコマンドで識別子を書き換えます。 識別子はさきほどメモしておいたDisk identifier (GUID)を使用します。

Command (? for help): x

Expert command (? for help): g
Enter the disk's unique GUID ('R' to randomize): C0E76C1A-B601-48A7-A1E0-CC49DEFF6CB4
The new disk GUID is C0E76C1A-B601-48A7-A1E0-CC49DEFF6CB4

最後に、wコマンドで設定をデバイスに書き込みます。 "The operation has completed successfully."が表示されたら完了です。

Expert command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/xvdf.
The operation has completed successfully.

パーテーションの拡張は以上ですが、e2fsckコマンドを使用してエラーがないことを確認しておきましょう。
特にエラーが出力されなければ問題ありません。

$ sudo e2fsck -f /dev/xvdf1
e2fsck 1.42.12 (29-Aug-2014)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/xvdf1: 56645/393216 files (0.1% non-contiguous), 557393/1572864 blocks

ファイルシステムの拡張

ここでようやくresize2fsコマンドを使用できます。
元のインスタンスに戻してからでも出来るのですが、どうせなら作業用インスタンスでやってしまいましょう。

$ sudo resize2fs /dev/xvdf1
resize2fs 1.42.12 (29-Aug-2014)
Resizing the filesystem on /dev/xvdf1 to 26214139 (4k) blocks.
The filesystem on /dev/xvdf1 is now 26214139 (4k) blocks long.

元インスタンスへのアタッチ

マネジメントコンソールへ戻り、作業用インスタンスからEBSボリュームをデタッチします。
デタッチしたボリュームを元のインスタンスに再度アタッチします。 この時、Rootボリュームとしてアタッチする必要が有るため、Deviceのパスは"/dev/sda1"として下さい。

rhel04

最後に確認としてRHELのインスタンスでdfコマンドを実行してみます。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       99G  2.0G   92G   3% /
tmpfs           1.8G     0  1.8G   0% /dev/shm

Great!!!
正しく100Gのボリュームとして認識されました!

まとめ

RHELは7が出たとはいえ、6が使われる機会がまだたくさんあると思います。
今回は対策としてRootボリュームのパーテーションを拡張して使用する方法をご紹介しましたが、本来であればRootボリュームを大きくせずにデータボリュームを作成して別にアタッチするという方法で対応したほうがよいでしょう。

そもそものcloud-initがおかしい訳なので、それを修正するのが筋かも。。。

参考文献

Linux パーティションを拡張する - Amazon Elastic Compute Cloud