I recently needed to create a clean EC2 AMI using a fairly new linux distro. It has been a while since I've needed to create a new AMI so I also wanted to move away from the older pre-packaged AMI and boot using EBS. After taking a look at what was currently available publicly I decided I would just create my own EBS bootable AMI using Fedora 12. It wasn't all that complicated but there are a decent number of steps so I figured I would document them for anyone else who might want to give it a try.
I'm going to assume you already understand how to do things like create instances, create EBS volumes and ssh into your running instance using key based authentication. I use the AWS management console for a lot of what follows with the exception of needing to register the AMI and for that you will need the Amazon EC2 API Tools and Amazon EC2 AMI Tools
There are two ways to get to a bootable EBS backed Fedora 12 instance and they start off the same. The first thing to do is fire up the AMI named "Basic Fedora Core 8 (AMI Id: ami-84db39ed)" that is provided by Amazon.
Once the Fedora Core 8 EC2 instance is ready ssh into it. Fedora 12 requries a newer version of RPM to install so you now need to upgrade the instance to Fedora 10. This is pretty easy and can be done by following my instructions on upgrading from Fedora 9 to Fedora 10 (don't worry about skipping 9 it will work). Here are the commands needed to do the upgrade:
yum clean all rpm -Uhv http://archive.kernel.org/fedora-archive/releases/10/Fedora/i386/os/Packages/fedora-release-10-1.noarch.rpm http://archive.kernel.org/fedora-archive/releases/10/Fedora/i386/os/Packages/fedora-release-notes-10.0.0-1.noarch.rpm yum -y update
After a few minutes the instance will be upgraded and ready for the next step. This is where the two paths diverge depending on how you want the final product constructed. The options are to install Fedora 12 on a freshly minted volume or continue upgrading the instance you just created.
I will start with the upgrade path since that is probably the easier of the two although may leave you with a messier instances after it is done. The next step for the upgrade path is to do what I outline in upgrading from Fedora 10 to Fedora 11 and upgrading from Fedora 11 to Fedora 12. Here are the commands all in one place to make it easy:
yum clean all rpm -Uvh http://mirrors.usc.edu/pub/linux/distributions/fedora/linux/releases/11/Fedora/i386/os/Packages/fedora-release-11-1.noarch.rpm http://mirrors.usc.edu/pub/linux/distributions/fedora/linux/releases/11/Fedora/i386/os/Packages/fedora-release-notes-11.0.0-2.fc11.noarch.rpm yum -y update yum clean all rpm -Uvh http://mirrors.kernel.org/fedora/releases/12/Fedora/i386/os/Packages/fedora-release-notes-12.0.0-4.fc12.noarch.rpm http://mirrors.kernel.org/fedora/releases/12/Fedora/i386/os/Packages/fedora-release-12-1.noarch.rpm yum -y update
Once you have everything upgraded to Fedora 12 you will have a 15G root partition that has less than 2G used. This may not suite your needs very well if you really don't need that extra 13G but thankfully if you want to shrink the root EBS partition you can.
I found some instructions in this article on EBS backed AMIs that describes using the following command to copy the entire file system over. Assuming you have created a smaller volume and attached it to the instance as sdh you should be able to do something like the following to copy everything to the new volume:
mkfs.ext3 /dev/sdh mount /dev/sdh /mnt tar cpS / | cpipe -vt -b 1024 | gzip -c | tar zxpS -C /mnt rm -rf /mnt/mnt/* rm -rf /mnt/proc/* umount /mnt
One thing to note in the above is that the entire sdh drive is formatted for the file system (you will actually get a prompt asking if that is ok). As far as I can tell this is the way it has to be or the instance will not boot correctly. I assume this is because the root device is hidden behind a partition already as /dev/sda1 and so shouldn't have a second partition table.
Skip to the common part now to learn how to make the final bootable AMI.
From scratch path
This path is similar to and mostly an update/extension to my post on creating a Fedora 7 AMI setup. I'm going to leave out most of the details and just provide you with a script that will take an empty volume (assumed to be attached as /dev/sdh) and turn it into a bootable EBS backed Fedora 12 volume. Download the script createfedora12bootebs.sh instead of trying to cut and paste the following, it gets formatted in such a way as to lose a newline that is important. Please note that you will need at least 1G of space on the given volume.
#!/bin/sh echo "y" | mkfs.ext3 /dev/sdh mount /dev/sdh /mnt mkdir /mnt/dev mkdir /mnt/proc mkdir /mnt/etc for i in console null zero ; do /sbin/MAKEDEV -d /mnt/dev -x $i ; done cat <<EOL > /mnt/etc/fstab /dev/sda1 / ext3 defaults 1 1 none /dev/pts devpts gid=5,mode=620 0 0 none /dev/shm tmpfs defaults 0 0 none /proc proc defaults 0 0 none /sys sysfs defaults 0 0 /dev/sdc1 /mnt ext3 defaults 0 0 /dev/sdc2 swap swap defaults 0 0 EOL mount -t proc none /mnt/proc cat <<EOL > /tmp/yumec2.conf [main] cachedir=/var/cache/yum debuglevel=2 logfile=/var/log/yum.log exclude=*-debuginfo gpgcheck=0 obsoletes=1 reposdir=/dev/null [base] name=Fedora 12 – i386 – Base mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-12&arch=i386 enabled=1 [updates-released] name=Fedora 12 – i386 – Released Updates mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=updates-released-f12&arch=i386 enabled=1 EOL yum -c /tmp/yumec2.conf --installroot=/mnt -y groupinstall Base yum -c /tmp/yumec2.conf --installroot=/mnt -y install openssh-server yum -c /tmp/yumec2.conf --installroot=/mnt -y clean packages echo "UseDNS no" >> /mnt/etc/ssh/sshd_config echo "PermitRootLogin without-password" >> /mnt/etc/ssh/sshd_config cp /etc/rc.local /mnt/etc/ cp /etc/sysconfig/network /mnt/etc/sysconfig/network cp /etc/sysconfig/network-scripts/ifcfg-eth0 /mnt/etc/sysconfig/network-scripts/ifcfg-eth0 cp /usr/local/sbin/* /mnt/usr/local/sbin/ cp -Rp /lib/modules/184.108.40.206-2.fc8xen/ /mnt/lib/modules/ echo "/sbin/MAKEDEV /dev/urandom" >> /mnt/etc/rc.sysinit echo "/sbin/MAKEDEV /dev/random" >> /mnt/etc/rc.sysinit echo "/sbin/MAKEDEV /dev/sdc" >> /mnt/etc/rc.sysinit echo "/sbin/MAKEDEV /dev/sdc1" >> /mnt/etc/rc.sysinit echo "/sbin/MAKEDEV /dev/sdc2" >> /mnt/etc/rc.sysinit cat <<EOF >> /mnt/etc/rc.sysinit # The following will partition the local drive and set up swap cat <<EOL | fdisk /dev/sdc n p 1 1 +140G n p 2 w EOL mkswap /dev/sdc2 EOF mv /mnt/lib/tls /mnt/lib/tls.disabled echo "hwcap 0 nosegneg" >> /mnt/etc/ld.so.conf.d/kernelcap-220.127.116.11-2.fc8.conf chroot /mnt chkconfig --level 2345 NetworkManager off chroot /mnt chkconfig --level 2345 network on sync umount /mnt/proc umount /mnt
Common wrap up
At this point you will need to create a snapshot of the volume that was created for one of the paths above. Once the snapshot is available you will need to then register the snapshot as an AMI that is bootable from EBS. To do that you would issue something like the following command substituting the correct data in where it relates to your volume and snapshot.
ec2-register -n "AMIName" -d "AMI Description" --block-device-mapping /dev/sdc=ephemeral0 --snapshot your-snapname --architecture i386 --kernel aki-a71cf9ce --ramdisk ari-a51cf9cc
One thing to note in this command is the –block-device-mapping option. That option is what gives you access to the local drive on your node once it is booted. This gives you extra storage for things you don't need to keep after the life of the running node. In the from scratch option I'm turning part of the local drive into swap as well as creating a partition that could be used as a large temporary storage. If you want to know more details on the ephermeral storage look at this post
After all that you should have a bootable EBS backed Fedora 12 install to work with.