No edit summary |
No edit summary |
||
Line 7: | Line 7: | ||
We assume that an instance has already been booted in a previous test, and we use this as a builder to facilitate the creation of a bootable volume. | We assume that an instance has already been booted in a previous test, and we use this as a builder to facilitate the creation of a bootable volume. | ||
Capture the instance name as an environment | Capture the instance name, user name, and IP address as an environment variables: | ||
INSTANCE=< | $> INSTANCE=<instance name> | ||
$> USER_NAME=<user name> | |||
$> IP_ADDR=$(nova show $INSTANCE | awk '/private network/ {print $5}') | |||
We also need a rootfs-style image, which may be download from: | We also need a rootfs-style image, which may be download from: | ||
Line 36: | Line 38: | ||
Format and mount volume to a staging mount point: | Format and mount volume to a staging mount point: | ||
$> ssh -o StrictHostKeyChecking=no | $> ssh -o StrictHostKeyChecking=no $USER_NAME@$IP_ADDR << EOF | ||
set -o errexit | set -o errexit | ||
set -o xtrace | set -o xtrace | ||
Line 43: | Line 45: | ||
sudo mount /dev/vdb /tmp/stage | sudo mount /dev/vdb /tmp/stage | ||
sudo touch /tmp/stage/cirros-0.3.0-x86_64-rootfs.img.gz | sudo touch /tmp/stage/cirros-0.3.0-x86_64-rootfs.img.gz | ||
sudo chown | sudo chown $USER_NAME /tmp/stage/cirros-0.3.0-x86_64-rootfs.img.gz | ||
EOF | EOF | ||
Copy image to the staging directory on the builder instance: | Copy image to the staging directory on the builder instance: | ||
$> scp -o StrictHostKeyChecking=no cirros-0.3.0-x86_64-rootfs.img.gz | $> scp -o StrictHostKeyChecking=no cirros-0.3.0-x86_64-rootfs.img.gz $USER_NAME@$IP_ADDR:/tmp/stage | ||
Unpack image into the volume (don't worry about an unmount failure). | Unpack image into the volume (don't worry about an unmount failure). | ||
$> ssh -o StrictHostKeyChecking=no -i $ | $> ssh -o StrictHostKeyChecking=no -i $USER_NAME@$IP_ADDR << EOF | ||
set -o errexit | set -o errexit | ||
set -o xtrace | set -o xtrace | ||
cd /tmp/stage | cd /tmp/stage | ||
sudo mkdir -p /tmp/ | sudo mkdir -p /tmp/image | ||
sudo gunzip cirros-0.3.0-x86_64-rootfs.img.gz | sudo gunzip cirros-0.3.0-x86_64-rootfs.img.gz | ||
sudo mount cirros-0.3.0-x86_64-rootfs.img /tmp/ | sudo mount cirros-0.3.0-x86_64-rootfs.img /tmp/image | ||
sudo cp -pr /tmp/ | sudo cp -pr /tmp/image/* /tmp/stage/ | ||
cd | cd | ||
sync | sync | ||
sudo umount /tmp/ | sudo umount /tmp/image | ||
<nowiki>sudo umount /tmp/stage || true</nowiki> | <nowiki>sudo umount /tmp/stage || true</nowiki> | ||
EOF | EOF |
Revision as of 16:53, 17 September 2012
Description
Nova instances can be booted from volume, analogous to EBS-backed volumes in EC2.
We construct a bootable volume, then fire up an instance backed by this volume.
Setup
We assume that an instance has already been booted in a previous test, and we use this as a builder to facilitate the creation of a bootable volume.
Capture the instance name, user name, and IP address as an environment variables:
$> INSTANCE=<instance name> $> USER_NAME=<user name> $> IP_ADDR=$(nova show $INSTANCE
How to test
Create a 1Gb volume, which we will make bootable:
$> nova volume-create --display_name=bootable_volume 1 $> VOLUME_ID=$(nova volume-list | awk '/bootable_volume/ {print $2}')
and wait for the volume to become available:
$> watch "nova volume-show bootable_volume | grep status"
Temporarily attach volume to your builder instance, this will allow us to copy image data into the volume
$> nova volume-attach $INSTANCE $VOLUME_ID /dev/vdb
Wait for the volume status to show as in-use:
$> watch "nova volume-show bootable_volume | grep status"
Format and mount volume to a staging mount point:
$> ssh -o StrictHostKeyChecking=no $USER_NAME@$IP_ADDR << EOF set -o errexit set -o xtrace sudo mkdir -p /tmp/stage sudo mkfs.ext3 -b 1024 /dev/vdb 1048576 sudo mount /dev/vdb /tmp/stage sudo touch /tmp/stage/cirros-0.3.0-x86_64-rootfs.img.gz sudo chown $USER_NAME /tmp/stage/cirros-0.3.0-x86_64-rootfs.img.gz EOF
Copy image to the staging directory on the builder instance:
$> scp -o StrictHostKeyChecking=no cirros-0.3.0-x86_64-rootfs.img.gz $USER_NAME@$IP_ADDR:/tmp/stage
Unpack image into the volume (don't worry about an unmount failure).
$> ssh -o StrictHostKeyChecking=no -i $USER_NAME@$IP_ADDR << EOF set -o errexit set -o xtrace cd /tmp/stage sudo mkdir -p /tmp/image sudo gunzip cirros-0.3.0-x86_64-rootfs.img.gz sudo mount cirros-0.3.0-x86_64-rootfs.img /tmp/image sudo cp -pr /tmp/image/* /tmp/stage/ cd sync sudo umount /tmp/image sudo umount /tmp/stage || true EOF
Detach volume for the builder instance:
$> nova volume-detach $INSTANCE $VOLUME_ID
and wait for the volume status to show as availble:
$> watch "nova volume-show bootable_volume | grep status"
Now snapshot the bootable volume we just created:
$> nova volume-snapshot-create --display_name bootable_snapshot $VOLUME_ID
and wait for the snapshot to become available:
$> nova volume-snapshot-show bootable_snapshot $> SNAPSHOT_ID=$(nova volume-snapshot-list | awk '/bootable_snapshot/ {print $2}')
Now we can boot from the bootable volume. We use the same image as the builder instance but that is only in order to retrieve the image properties (kernel and ramdisk IDs)
$> IMAGE_ID=$(nova show $INSTANCE | awk '/image/ {print $5}' | sed 's,(\(.*\)),\1,') $> nova boot --flavor 1 --image $INSTANCE --block_device_mapping vda=${SNAPSHOT_ID}:snap::0 volume_backed
Expected Results
You should be able able to shh into the volume-backed instance.
Note that an additional snapshot now exists to back the image:
$> nova volume-snapshot-list
Also note the volume-backed instance you've fired up, there is a volume cloned from the corresponding snapshot:
$> nova volume-list