やったこと
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