Eric Hammond has taught us how to create consistent snapshots of EBS volumes. Amazon has allowed us to use EBS snapshots as AMIs, providing a persistent root filesystem. Wouldn’t it be great if you could use both of these techniques together, to take a consistent snapshot of the root filesystem without stopping the instance? Read on for my instructions how to create an XFS-formatted boot-from-EBS AMI, allowing consistent live snapshots of the root filesystem to be created.
The technique presented below owes its success to the Canonical Ubuntu team, who created a kernel image that already contains XFS support. That’s why these instructions use the official Canonical Ubuntu 9.10 Karmic Koala AMI – because it has XFS support built in. There may be other AKIs out there with XFS support built in – if so, the technique should work with them, too.
How to Do It
The general steps are as follows:
- Run an instance and set it up the way you like.
- Create an XFS-formatted EBS volume.
- Copy the contents of the instance’s root filesystem to the EBS volume.
- Unmount the EBS volume, snapshot it, and register it as an AMI.
- Launch an instance of the new AMI.
More details on each of these steps follows.
1. Run an instance and set it up the way you like.
As mentioned above, I use the official Canonical Ubuntu 9.10 Karmic Koala AMI (currently ami-1515f67c for 32-bit architecture – see the table on Alestic.com for the most current Ubuntu AMI IDs).
ami=ami-1515f67c security_groups=default keypair=my-keypair instance_type=m1.small ec2-run-instances $ami -t $instance_type -g $security_groups -k $keypair
Wait until the
ec2-describe-instances command shows the instance is running and then ssh into it:
ssh -i my-keypair email@example.com
Now that you’re in, set up the instance’s root filesystem the way you want. Don’t forget that you probably want to run
sudo apt-get update
to allow you to pull in the latest packages.
In our case we’ll want to install
ec2-consistent-snapshot, as per Eric Hammond’s article:
codename=$(lsb_release -cs) echo "deb http://ppa.launchpad.net/alestic/ppa/ubuntu $codename main" | sudo tee /etc/apt/sources.list.d/alestic-ppa.list sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BE09C571 sudo apt-get update sudo apt-get install -y ec2-consistent-snapshot sudo PERL_MM_USE_DEFAULT=1 cpan Net::Amazon::EC2
2. Create an XFS-formatted EBS volume.
First, install the XFS tools:
sudo apt-get install -y xfsprogs
These utilities allow you to format filesystems using XFS and to freeze and unfreeze the XFS filesystem. They are not necessary in order to read from XFS filesystems, but we want these programs installed on the AMI we create because they are used in the process of creating a consistent snapshot.
Next, create an EBS volume in the availability zone your instance is running in. I use a 10GB volume, but you can use any size and grow it later using this technique. This command is run on your local machine:
ec2-create-volume --size 10 -z $zone
Wait until the
ec2-describe-volumes command shows the volume is available and then attach it to the instance:
ec2-attach-volume $volume --instance $instance --device /dev/sdh
Back on the instance, format the volume with XFS:
sudo mkfs.xfs /dev/sdh sudo mkdir -m 000 /vol sudo mount -t xfs /dev/sdh /vol
Now you should have an XFS-formatted EBS volume, ready for you to copy the contents of the instance’s root filesystem.
3. Copy the contents of the instance’s root filesystem to the EBS volume.
Here’s the command to copy over the entire root filesystem, preserving soft-links, onto the mounted EBS volume – but ignoring the volume itself:
sudo rsync -avx --exclude /vol / /vol
My command reports that it copied about 444 MB to the EBS volume.
4. Unmount the EBS volume, snapshot it, and register it as an AMI.
You’re ready to create the AMI. On the instance do this:
sudo umount /vol
Now, back on your local machine, create the snapshot:
ec2-describe-snapshots shows the snapshot is 100% complete, you can register it as an AMI. The AKI and ARI values used here should match the AKI and ARI that the instance is running – in this case, they are the default Canonical AKI and ARI for this AMI. Note that I give a descriptive “name” and “description” for the new AMI – this will make your life easier as the number of AMIs you create grows. Another note: some AMIs (such as the Ubuntu 10.04 Lucid AMIs) do not have a ramdisk, so skip the
--ramdisk $ramdisk arguments if you’ve used such an AMI.
kernel=aki-5f15f636 ramdisk=ari-0915f660 description="Ubuntu 9.10 Karmic formatted with XFS" ami_name=ubuntu-9.10-32-bit-ami-1515f67c-xfs ec2-register --snapshot $snapshot --kernel $kernel --ramdisk $ramdisk '--description=$description' --name=$ami_name --architecture i386 --root-device-name /dev/sda1 --block-device-mapping /dev/sda2=ephemeral0
This displays the newly registered AMI ID – let’s say it’s
5. Launch an instance of the new AMI.
Here comes the moment of truth. Launch an instance of the newly registered AMI:
ami=ami-00000000 security_groups=default keypair=my-keypair instance_type=m1.small ec2-run-instances $ami -t $instance_type -g $security_groups -k $keypair
Again, wait until
ec2-describe-instances shows it is running and ssh into it:
ssh -i my-keypair firstname.lastname@example.org
Now, on the instance, you should be able to see that the root filesystem is XFS with the mount command. The output should contain:
/dev/sda1 on / type xfs (rw)
We did it! Let’s create a consistent snapshot of the root filesystem. Look back into the output of
ec2-describe-instances to determine the volume ID of the root volume for the instance.
sudo ec2-consistent-snapshot --aws-access-key-id $aws_access_key_id --aws-secret-access-key $aws_secret_access_key --xfs-filesystem / $volumeID
The command should display the snapshot ID of the snapshot that was created.
ec2-consistent-snapshot and an XFS-formatted EBS AMI, you can create snapshots of the running instance without stopping it. Please comment below if you find this helpful, or with any other feedback.