LoginSignup
3
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-05-06

やったこと

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
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1