概要

AmazonEC2 EBS とサイズ変更の問題点

EBS(Elastic Block Storage)は Amazon EC2 上で使える仮想のディスクボリュームです。
1GB 単位で最大1TB まで自由な大きさで作成し、通常のディスクボリュームと同じように OS にマウントして使えます。

ただ、現時点(2011/04/01)で EBS(Elastic Block Storage)のサイズを動的に変更する方法は用意されていません(([Amazon としては RAID や LVM と使って動的なディスク容量を変更する環境を作ることを想定しているようです]))。

つまり、EBS ボリュームを10GB で作成したとして、徐々にディスク容量が増え、より大くのボリュームサイズ(例えば20GB とか30GB とか)が必要になったとしても、ディスクのサイズをすぐに変更することはできません。

EBS のサイズを変更するには、新しい EBS ボリュームを作成し、既存の EBS からデータをコピーして、新しい EBS で再マウントする手順が必要です。

この文章では、dump,restore というツールを使って、既存の EBS から新しい EBS にデータを移行する手順を説明します。

想定する状況

すでに10GB の EBS ボリュームを /dev/sdh にアタッチし /var/backup にマウントしてバックアップ用の領域として使っていました。

しかし、日々のバックアップを保存しているため、徐々に容量が不足してきてしまいました。

そこで、新たに 20GB の EBS ボリュームを作成し、既存の10GB のデータを新しい EBS に移行してディスク容量を 10GB から 20GB に増やすことにします。

また、現状で EC2 インスタンス(仮想ホスト)と 既存の EBS ボリュームは以下のような状態にあるとします。

  • EC2 インスタンス
    • インスタンス ID: i-123XXX
  • 既存の EBS ボリューム:
    • EBS ID : vol-AB010XXX
    • 容量: 10GB
    • アタッチデバイス : /dev/sdh
    • マウントポイント : /var/backup

移行の準備

新しい EBS ボリュームの作成とアタッチ

新しい EBS ボリュームの作成

まず、データを移行するための新しいEBSを作成します。
Amazon Management Console にログインし、以下の手順で EBS ボリュームを作成してください。

  1. 上段の”EC2”タブを選択
  2. Navigation メニューから “Volumes” を選択
  3. EBS Volumes メニュー の “Create Volume” を選択
  4. ウィザードの従って 20GB の EBS ボリュームを作成(※ Availability Zone をマウントするインスタンスと同じゾーンに設定します)

ここでは vol-AB020XXX という EBS を作成したとします。

新しい EBS ボリュームのアタッチ

上の「((=新しい EBS ボリュームの作成=))」で作成した EBS ボリュームを既存のインスタンスにアタッチします。

  1. ボリュームリストから、新しい EBS ボリューム(vol-AB020XXX)を選択
  2. メニューから”Attache Volume”を選択
  3. アタッチするインスタンス(i-123XXX)をデバイス名(ここでは /var/sdi とします)を入力
  4. “Attach” を選択してインスタンスにアタッチする

Dump/restore ツールのインストール

Dump/restore ツール ext2/3/4 ファイルシステムのデータバックアップと復元を行います。
通常は、日々のバックアップと障害時のレストアのためのツールですが、ここではデータコピーのツールとして使用します。

dumpツールは標準でインストールされていることも多いですが、もしインストールされていない場合は手動でインストールします(dump パッケージの中に restore コマンドも含まれています)。

// Debian,Ubuntu系の場合
# aptitude install dump

// RedHat,CentOS系の場合
# yum install dump

データの移行

新しい EBS のフォーマット・マウント

「((=新しい EBS ボリュームのアタッチ=))」でインスタンスにアタッチした、新しいEBSボリュームをフォーマットし(([フォーマットが必要なのは新規の EBS のみです。既存の EBS をフォーマットするとデータが削除されるので絶対に行わないでください]))、移行時用の一時マウントポイント(このマウントポイントは移行作業が完了したら削除します)にマウントします。

// ext3 ファイルシステムでフォーマット
# mkfs -t ext3 /dev/sdi

// 一時マウントポイントにマウント
# mkdir /var/backup_new
# mount /dev/sdi /var/backup_new

// 現在のマウント状況を確認(イメージ)
# df -h
Filesystem     Size  Used  Avail Use% Mounted on
/dev/sdh      10.0G  9.0G   1.0G  90% /var/backup       # 既存の EBS ボリューム
/dev/sdi      20.0G    0G  20.0G   0% /var/backup_new   # 新しい EBS ボリューム

既存 EBS のアンマウント

データ移行のために既存の EBS をアンマウントします。
注意: 移行作業中はマウントポイント(この例では /var/backup)に書き込みが発生しないようにしてください。

// 書き込みをディスクと同期
# sync ; sync

// 内容の確認
# ls /var/backup
data1   data2

// アンマウント
# umount /var/backup

データのコピー

新しいEBSの一時マウントポイントに、既存 EBS のデバイスからデータをコピーします。
以下では、dump コマンドで既存の EBS(/dev/sdh)のデータを標準出力に出力しながら、restore でカレントディレクトリにそのデータを展開しています。

// 一時マウントポイントに移動
# cd /var/backup_new

// 既存の EBS からダンプしたデータをそのままカレントディレクトリに展開する
// (実測値ですが、Amazon EC2 の small インスタンスで10GB のボリュームの移行に5分程度で完了しました)
# dump -0uf - /dev/sdh | restore -rf -

// データが移行したのを確認
# ls /var/backup_new
data1   data2

dump オプション

  • -0 : フルダンプ
  • -u : /var/lib/dumpdates をダンプ後にアップデートする(増分バックアップには必須)
  • -f file : 出力先のファイル “-“ で標準出力を指定
  • -z : zlib の圧縮率を指定。指定がない場合の圧縮率は2

restore オプション

  • -r : リストアを実行する
  • -f file : リストア元の指定。 “-“ は標準入力
  • -v : 詳細を表示する

新しいボリュームのマウント

新しいEBSボリュームをマウントポイントに再マウントします。

// 書き込みをディスクと同期
# sync ; sync

// 一時マウントポイントからのアンマウント
# umount /var/backup_new
// 本来のマウントポイントにマウント
# mount /dev/sdi /var/backup

// 一時マウントポイントの削除
# rm -rf /var/backup_new

// 確認(マウントポイントのディスク容量が10GB から20GB に増加しているかを確認)
# df -h (イメージ)
Filesystem     Size  Used  Avail Use% Mounted on
/dev/sdi      20.0G  9.0G  11.0G   0% /var/backup       # 新しい EBS ボリューム

以上で既存 EBS ボリュームから新しい EBS ボリュームへのデータの移行は完了です。
この時点で、古い EBS ボリューム(vol-AB010XXX)はこの時点で削除して問題ありません。