~nabeken/diary/

Gentoo Linux(6年くらい)とFreeBSD(1年くらい)とOpenBSD(新参者)を使う日々。


IHANet BGP peering overview

instance store-backedなCentOS 5.xのAMIからEBS-backedなAMIを作る

Posted on Sun Dec 02 13:31:37 +0900 2012 by nabeken

前回はAmazon Linux 2011.09上でCentOS 5.6のリリース版AMIを作成する手順を記しました。 今回は作成したAMIをEBS-backedに作り返る手順を記します。

instance store-backed vs. EBS-backed

今回は pvgrub + パーティションのないディスクイメージ (swapをディスクイメージとして持つ) で作成します。 先日リリースされた待望の m1.small (x86_64) でも動きます。

ストレージの種別について、前回の記事から再掲します。 (このあたりはXenがどのようにゲストへディスクを見せるかという話です。)

  • instance store-backed (S3-backed)

    インスタンスストレージ(ephemeral領域と同じ種別)上にディスクイメージを展開したものをroot deviceにする。 root deviceになる場合、domUからはsdaとしては見えず、パーティション1(sda 1)として見える。

  • EBS-backed

    通常、EBSはディスク(sdaなど)として見えます。パーティションを切って使うこともできます。

    パーティションを切らない場合(domU的にパーティションXとして見える)は instance store-backedと同様の扱いになります。

ややこしいのは、ストレージの種別とdomU(インスタンス)からみた場合の見えかたは直接は関係ありません。

  • raw または unpartitioned disk image

    domUからはパーティション1(sda1)のように見える。pvgrubからみるとこれを whole disk と 呼んでいる。ほとんどのAMIがこの形式。

    instance store-backedのAMIは通常この形式になる。実のところ、EBS-backedのAMIも ほとんどがこの形式。

    (なぜなら、m1.smallはsda2にephemeral領域, sda3にスワップ領域をねじこむため、sdaにEBSをattach してもsda2, sda3は見えない。全インスタンスタイプに対応可能なAMIを作る場合はsda1を / にして、 EBSをattachするのが得策。)

    pvgrubを使う場合は "hd0" 版を使います

  • partitioned disk image / image that has a partition table

    domUからはディスクそのもの(sda)のように見える。

    LVMルートにする場合、 / はpvgrubから見えないため、/bootだけ通常のファイルシステム として見せる必要があります。そのため、パーティションを切る必要でてきます。

    /bootを分割する必要がなければわざわざこの形式を選ぶことはいと思います。 swapもディスクイメージとして持てるのでわざわざ切る必要はありません。

    pvgrubを使う場合は "hd00" 版を使います

instance store-backed から EBS-backed AMIを構築する

手順は以下。

  1. 作成したinstance store-backed AMIから起動

    ec2-run-instances でもManagement Consoleでもなんでも。

  2. EBS-backedにするために新規にEBS volumeを作成

    作成時、AZを起動したインスタンスに合せます。生のEBSはAZを跨いでattachできません。 (EBSから作ったスナップショットはリージョン内ならAZ問わず参照可能)。

    このEBS volumeが / になります。容量がここで決まります。今回は10GiBにしました。

  3. 作成したEBS volumeを起動したインスタンスにattach

    今回は /dev/sdf にattachしました。

  4. 起動したインスタンスでattachしたEBS volumeを下ごしら

    パーティションは切らずに そのまま /dev/sdf をext4でフォーマットします。

    # yum install -y e4fsprogs
    (必要に応じて)
    # /sbin/mkfs.ext4 -L '/' /dev/sdf
    # mkdir /media/ebs-root
    # mount /dev/sdf /media/ebs-root
    
  5. EBS volumeへ起動中のインスタンスの中身をコピー

    rsyncでいっきにコピーします。

    # rsync -avP --exclude=/proc --exclude=/sys --exclude=/media / /media/ebs-root/
    # mkdir /media/ebs-root/{proc,sys,media}
    
  6. スワップをディスクイメージで用意

    m1.smallにはもともと1GBのswapパーティションがついてきますが、全インスタンスで共通化するため、 EBS内部に含めておきます。

    # dd if=/dev/zero of=/media/ebs-root/SWAP.IMG bs=1M count=1000
    # mkswap /media/ebs-root/SWAP.IMG
    
  7. fstab調整

    swapを追加します。

    # vi /media/ebs-root/etc/fstab
    /SWAP.IMG none swap sw 0 0
    
  8. 痕跡を削除

    念のため .bash_history が存在していれば削除します。

    # rm /media/ebs-root/root/.bash_history
    

    忘れずに公開鍵も削除しておきます。

    # rm /media/ebs-root/root/authorized_keys
    
  9. EBS volumeをumountしてスナップショット作成

    # umount /media/ebs-root
    

    ec2-create-snapshot を使うなりManagment Consoleを使うなりしてEBS volumeに対してスナップショットを作成します。

  10. AMIを作成

    出来上がったスナップショットをroot deviceにしてAMIを作成します。ついでにephemeral領域も最大限有効にしておきます。

    # ec2-register --cert ${EC2_CERT} --private-key ${EC2_PRIVATE_KEY} -a x86_64 \
      -n 'CentOS 5.6 (x86_64) EBS-backed/swap/ephemeral0-3' \
      -d 'CentOS 5.6 (x86_64) EBS-backed w/swap/ephemeral[0-3]' --snapshot snap-XXXXX \
      -b '/dev/sdc=ephemeral0' -b '/dev/sdd=ephemeral1' -b '/dev/sde=ephemeral2' -b '/dev/sdf=ephemeral3' \
      --kernel aki-aki-ee5df7ef
    
  11. できあがったAMIで起動する

    念のため各インスタンスタイプ(t1.micro, m1.{small,large}など)で起動するかを確認します。

作成に使ったEBS volumeは置いておくと便利です。 今後、AMIを更新する必要があればまたEBSをattachし、更新後スナップショットを取り ec2-register するだけです。

たぶん、 ec2-create-image とか他のを使えばもう少し楽かもしれません。

更新履歴

  • SSH公開鍵を削除し忘れていたので追加 (Sun, 2 Dec 2012 13:31:37 +0900)
  • 初稿 (Fri, 9 Mar 2012 23:07:55 +0900)