cloud
Sharing EBS Volumes Among Instances
Sep 25, 2008

Sharing EBS Volumes Among Instances

Sharing EBS Volumes Among Instances


In this post I share an experiment to create an EBS volume, to attach it to an EC2 instance, to mount it in the instance, to put a file on it, to unmount it, and to detach it. Afterwards the volume will be mounted in another instance (while the first instance has been terminated, because attaching volumes to different instances at the same time is impossible).

I followed the instructions given in the Elastic Block Storage Feature Guide.

Starting an Instance

Let’s see which AMIs are available:

$ ec2-describe-images -o self
IMAGE   ami-c6c622af    dehonk-gettingstarted/image.manifest.xml    190912652296    available   private     i386    machine

I launch ami-c6c622af with Elasticfox. Let’s check the status of the instance with the command line tools:

$ ec2-describe-instances
RESERVATION r-9f3deef6 190912652296 default
INSTANCE i-520faf3b ami-c6c622af pending gettingstarted-keypair 0 m1.small 2008-09-25T09:50:01+0000 us-east-1c

Important to note for later is the availability zone in which the instance is running, because volumes can only be attached to instances when they live in the same availability zone.

Create the Volume

Create a volume of 1 GB in the same availability zone in which the instance resides:

$ ec2-create-volume --size 1 -z us-east-1c
VOLUME vol-4001e429 1 us-east-1c creating 2008-09-25T09:51:48+0000

Check the status of the volume:

$ ec2-describe-volumes vol-4001e429
VOLUME  vol-4001e429    1       us-east-1c  available   2008-09-25T09:51:48+0000

The volume is available now. Time to use it!

Attaching the Volume

Attach the newly created volume as device /dev/sdh to the running instance:

$ ec2-attach-volume vol-4001e429 -i i-520faf3b -d /dev/sdh
ATTACHMENT  vol-4001e429    i-520faf3b  /dev/sdh    attaching   2008-09-25T09:59:14+0000

The command returns saying that the volume is attaching. Let’s check the status:

$ ec2-describe-volumes
VOLUME   vol-4001e429    1       us-east-1c  in-use  2008-09-25T09:51:48+0000 ATTACHMENT vol-4001e429    i-520faf3b  /dev/sdh    attached    2008-09-25T09:59:14+0000

While the volume was available and attaching before, now it is in-use and attached.

Formatting the Volume

Open another terminal. Connect to the instance via ssh:

$ ssh -i id_rsa-gettingstarted-keypair root@ec2-75-101-254-227.compute-1.amazonaws.com

Looking at the contents of /dev reveals that the volume is available as device sdh:

# ls /dev
MAKEDEV   port   ptyc1  ptye6  ptyqb  ptyt0  ptyv5  ptyxa  ptyzf    ttya2  ttyc7  ttyec  ttyr1  ttyt6  ttyvb  ttyy0
--- cut here for brevity ---
loop7     ptyb3  ptyd8  ptypd  ptys2  ptyu7  ptywc  ptyz1  sdh      ttyb9  ttyde  ttyq3  ttys8  ttyud  ttyx2  ttyz7
--- cut here for brevity ---

Since a new volume is not formatted, we do that first:

# yes | mkfs -t ext3 /dev/sdh
mke2fs 1.38 (30-Jun-2005)
/dev/sdh is entire device, not just one partition!
Proceed anyway? (y,n) Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
131072 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376
 
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
 
This filesystem will be automatically checked every 20 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

Mounting the Volume

Finally, the volume is ready to be mounted in the instance:

$ mkdir /mnt/data-store
$ mount /dev/sdh /mnt/data-store

Let’s check whether everything is as expected:

$ ls /mnt
data-store  lost+found
$ ls /mnt/data-store/
lost+found

That looks okay.

Put a file on the volume

Using vi, I created a file named readme with this contents:

This is an example file to show that a file persists on an EBS volume after unmounting and detaching.

Unmounting the Volume Before we stop the instance, we have to unmount the volume. From the Elastic Block Storage Feature Guide:

A volume must be unmounted inside the instance before being detached. Failure to do so will result in damage to the file system or the data it contains.

$ umount /mnt/data-store

Remember to cd out of the volume, otherwise you will get an error message umount: /mnt/data-store: device is busy

Detach the Volume

From the Feature Guide:

An Amazon EBS volume can be detached from an instance by either explicitly detaching the volume or terminating the instance.

Let’s do it by explicitly detaching it:

$ ec2-detach-volume vol-4001e429 -i i-520faf3b -d /dev/sdh
ATTACHMENT  vol-4001e429    i-520faf3b  /dev/sdh    detaching   2008-09-25T09:59:14+0000

Soon the status of the volume changes form detaching to available:

$ ec2-describe-volumes
VOLUME  vol-4001e429    1       us-east-1c  available   2008-09-25T09:51:48+0000

Mounting the Volume in Another Instance

Now do all the steps over again to start a new image and mount the volume. Because the volume resides in availability zone us-east-1c and instances and volumes have to live in the same availability zone, we have to launch the instance in us-east-1c.

$ ec2-run-instances ami-c6c622af -k gettingstarted-keypair -z us-east-1c
RESERVATION    r-eb22f182  190912652296    default 
INSTANCE    i-5a12b233  ami-c6c622af            pending gettingstarted-keypair  0       m1.small    2008-09-25T11:23:01+0000    us-east-1c 
$ ec2-describe-instances
RESERVATION r-eb22f182  190912652296    default 
INSTANCE    i-5a12b233  ami-c6c622af    ec2-72-44-53-70.compute-1.amazonaws.com domU-12-31-39-01-5C-76.compute-1.internal   running gettingstarted-keypair  0       m1.small    2008-09-25T11:23:01+0000    us-east-1c 
$ ec2-describe-volumes
VOLUME    vol-4001e429    1       us-east-1c  available   2008-09-25T09:51:48+0000 
$ ec2-attach-volume vol-4001e429 -i i-5a12b233 -d /dev/sdh 
ATTACHMENT  vol-4001e429    i-5a12b233  /dev/sdh    attaching   2008-09-25T11:25:46+0000 
$ ec2-describe-volumes
VOLUME  vol-4001e429    1       us-east-1c  in-use  2008-09-25T09:51:48+0000 
ATTACHMENT vol-4001e429    i-5a12b233  /dev/sdh    attached    2008-09-25T11:25:46+0000

Now start another terminal to connect to the instance:

$ ssh -i id_rsa-gettingstarted-keypair root@ec2-72-44-53-70.compute-1.amazonaws.com
Last login: Tue Sep  9 14:48:20 2008 from 213.49.236.209
 
     __|  __|_  )  Rev: 2
     _|  (     /
    ___|\___|___|
 
 Welcome to an EC2 Public Image
                       
 
    Getting Started
 
    __ c __ /etc/ec2/release-notes.txt
 
[root@domU-12-31-39-01-5C-76 ~]# mkdir /mnt/data-store
[root@domU-12-31-39-01-5C-76 ~]# mount /dev/sdh /mnt/data-store
[root@domU-12-31-39-01-5C-76 ~]# cd /mnt/data-store
[root@domU-12-31-39-01-5C-76 data-store]# ls
lost+found  readme
[root@domU-12-31-39-01-5C-76 data-store]# cat readme
This is an example file to show that a file persists on an EBS volume after unmounting and detaching.
[root@domU-12-31-39-01-5C-76 ~]# umount /mnt/data-store
[root@domU-12-31-39-01-5C-76 ~]# exit

The file we created earlier was on the volume and we could read it. This proves that we can share volumes among instances. To clean up:

$ ec2-detach-volume vol-4001e429 -i i-5a12b233
ATTACHMENT  vol-4001e429    i-5a12b233  /dev/sdh    detaching   2008-09-25T11:25:46+0000
$ ec2-describe-volumes
VOLUME  vol-4001e429    1       us-east-1c  available   2008-09-25T09:51:48+0000
$ ec2-terminate-instances i-5a12b233
INSTANCE    i-5a12b233  running shutting-down
$ ec2-describe-instances
RESERVATION r-eb22f182  190912652296    default
INSTANCE    i-5a12b233  ami-c6c622af    ec2-72-44-53-70.compute-1.amazonaws.com domU-12-31-39-01-5C-76.compute-1.internal   shutting-down   gettingstarted-keypair  0       m1.small    2008-09-25T11:23:01+0000    us-east-1c
$ ec2-describe-instances
RESERVATION r-eb22f182  190912652296    default
INSTANCE    i-5a12b233  ami-c6c622af            terminated  gettingstarted-keypair  0       m1.small    2008-09-25T11:23:01+0000