Edited at

AWSでAMIのルートパーティションをLVMに変換する

More than 3 years have passed since last update.


やったこと

AWSのEC2にて、ルートパーティションが非LVMのイメージを使っていたのですが、ルートパーティションをLVMのイメージに変換してみました。

今回対象としたAMIは次のような構成のものです。


  • 仮想化方式 : hvm

  • ブロックデバイス : /dev/xvda にスナップショットが1つだけ

  • パーティション : /dev/xvda1 だけが存在し、その中にルートや/bootが入っている

  • OS : CentOS 6 (ゼロからインストールしたもの)

  • SELinux : 無効

変換後のAMIのパーティションは次のようにしました。


  • /dev/xvda1 と /dev/xvda2 が存在する

  • /dev/xvda1 は普通のパーティションで、/boot の中身が入っている

  • /dev/xvda2 はLVMで、1つのLVを作り、その中にルートが入っている


作業準備

作業用のインスタンスを準備しましょう。

Linuxなら何でも良いと思いますが、今回は上記のAMIから作ったインスタンスを使いました。


変換作業


EBS作成&アタッチ

AWSマネジメントコンソールにて、対象のAMIのスナップショットからEBSを作り、作業用インスタンスにアタッチします。

今回は /dev/sdf にアタッチしました。(OSでは /dev/xvdf として認識される。)

また、変換後のAMIになる空のEBSを作り、作業用インスタンスにアタッチします。

先に作ったものと同じサイズで作り、/dev/sdg にアタッチしました。


fdiskでパーティション作成

作業用インスタンスにて、fdiskで変換先のEBSにパーティションを作成します。

(partedでも良いですが、fdiskのほうが慣れているので…。)

fdisk /dev/xvdg << EOF

n
p
1

64
u
n
p
2

t
2
8e
w
EOF

1つ目のパーティションは /boot 用で、ざっくり500MB程度として作っています。

(512byte × 255 × 63 × 64 ≒ 502MB)


LV作成&フォーマット

/boot 用のパーティションは普通にext4でフォーマットします。

mkfs.ext4 /dev/xvdg1

ルート用のパーティションにはPV&VG&LVを作って、ext4でフォーマットします。

pvcreate /dev/xvdg2

vgcreate VGroot /dev/xvdg2
lvcreate -n LVroot -l 100%FREE VGroot
mkfs.ext4 /dev/VGroot/LVroot

パーティションにラベルを付けておきます。

e2label /dev/xvdg1 BOOT

e2label /dev/VGroot/LVroot /


マウント

変換元、変換先のルートパーティションがそれぞれ /mnt/src , /mnt/dest になるようにマウントします。

mkdir /mnt/src

mount /dev/xvdf1 /mnt/src

mkdir /mnt/dest
mount /dev/VGroot/LVroot /mnt/dest

mkdir /mnt/dest/boot
mount /dev/xvdg1 /mnt/dest/boot
chmod 555 /mnt/dest/boot

rmdir /mnt/dest/lost+found/
rmdir /mnt/dest/boot/lost+found/


ファイルのコピー

変換元のファイルをまるっと変換先にコピーします。

shopt -s dotglob

cp -pr /mnt/src/* /mnt/dest/


grubのインストール&設定

単純にファイルをコピーしただけではAMI化しても起動しないので、MBRにgrubをインストールします。

cat << EOF | grub --batch

device (hd0) /dev/xvdg
root (hd0,0)
setup (hd0)
EOF

/boot を独立したパーティションに分けたので、grub.conf で指定している kernel や initrd のパスから "/boot" を除去します。

sed -i -e "s/\/boot//g" /mnt/dest/boot/grub/grub.conf


fstabの設定

ルートと /boot がマウントされるように fstab を次のような感じに設定します。

vi /mnt/dest/etc/fstab

---
LABEL=/ / ext4 defaults 1 1
LABEL=BOOT /boot ext4 defaults 1 2
(その他はお任せ)
---


アンマウント

ファイル操作はこれで終わりなのでアンマウントします。

EBSを正しくデタッチできるようにするために、VG&LVを無効にするのをお忘れなく。

umount /mnt/dest/boot/

umount /mnt/dest/
umount /mnt/src/

vgchange -an VGroot


EBSデタッチ&スナップショット作成&AMI登録

AWSマネジメントコンソールに戻り、変換後のEBSをデタッチしてスナップショットを作成し、AMIとして登録します。


動作確認

AMI登録が終われば、インスタンスを起動して確認しましょう。

期待通り起動することを祈りましょう。


後始末

新しいAMIで問題なければ、作業用のインスタンスやEBSを削除しましょう。

変換前のAMIやスナップショットもバッサリと削除したら漢ですね。


おまけ(備忘録)

ルートパーティションをLVMにすることのメリットは、インスタンスを起動したまま簡単に容量を増やせることです。

増やしたいサイズの空のEBSを作成してインスタンスにアタッチし、次のようにすれば容量を増やせます。

※EBSを /dev/sdf にアタッチした場合

fdisk /dev/xvdf
pvcreate /dev/xvdf1
vgextend VGroot /dev/xvdf1
lvextend -l +100%FREE /dev/VGroot/LVroot
resize2fs /dev/VGroot/LVroot