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.
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 ubuntu@ec2-1-2-3-4.amazonaws.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:2. Create an XFS-formatted EBS volume.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
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:
Now you should have an XFS-formatted EBS volume, ready for you to copy the contents of the instance's root filesystem.sudo mkfs.xfs /dev/sdh
sudo mkdir -m 000 /vol
sudo mount -t xfs /dev/sdh /vol
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-create-snapshot $volume
Once
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.This displays the newly registered AMI ID - let's say it'skernel=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
ami-00000000
.5. Launch an instance of the new AMI.
Here comes the moment of truth. Launch an instance of the newly registered AMI:
Again, wait untilami=ami-00000000
security_groups=default
keypair=my-keypair
instance_type=m1.small
ec2-run-instances $ami -t $instance_type \
-g $security_groups -k $keypair
ec2-describe-instances
shows it is running and ssh into it:ssh -i my-keypair ubuntu@ec2-5-6-7-8.amazonaws.com
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.The command should display the snapshot ID of the snapshot that was created.sudo ec2-consistent-snapshot --aws-access-key-id \
$aws_access_key_id --aws-secret-access-key \
$aws_secret_access_key --xfs-filesystem / $volumeID
Using
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.