====== Copy on Write Vblade Server ======
If you want to support a lot of aoe clients, then using a copy on write device
may be the answer for you. I've written a small script that will setup
your loop device and device mapper configration for you. It will also run
vblade and link the approite cow block device with a aoe instance.
For more information on how copy on write works goto http://en.wikipedia.org/wiki/Copy_on_write
Here's a Diagram of how the scripts set things up (showing 4 cow devices)
Dash Disks represent Virtual Device, Solid disk represent sparse files on disk.
{{:holycow2.png|:holycow.png}}
=========
#Copy on write for vblade server v0.5
#toxicnaan guess what goes here gmail.com
#this uses raw device mapper commands, if your using either LVM,LVM2,DM,LOOP
#then run it at your own risk!
#This will be like crossing the streams, it will be bad, very bad.
#don't run this if you don't understand whats going on
#if this script murders your dog/cat, deletes your server, or causes a war
#you can't blame me.
#useage makecow.sh 'image file name'
#image file name is an image that you want booted over aoe.
#takes a current imagefile, and makes 8 cow devices using loop and devicemapper
#it uses sparse files to cut down on diskspace
#using this script allows for many machines booting over aoe to use
#the same primary disk image.
#all writes your clients with go into the cow files.
#you need to be root to run this.
#for extra fun, try placing your cow files on a suitable large ram disk
#like /dev/shm for extra speeeeeeeeeeeeeed!
#vblade dirly run in background, targets range from 0 0 to 0 7.
#big greets to the masters of #etherboot on freenode. Thanks for all
#your help getting gpxe working for me!!!!!!
#no thanks to device mapper documentation!!!!
modprobe dm_mod
modprobe dm_mirror
modprobe dm_snapshot
IMAGE_FILE=$1
img_loop_dev=`losetup -f`
losetup -v -f $IMAGE_FILE
cow_size=`blockdev --getsize $img_loop_dev`
echo $cow_size
chunk_size=64
FILE=$IMAGE_FILE
for loopnumber in 0 1 2 3 4 5 6 7
do
dd if=/dev/zero of=$FILE.cow.$loopnumber bs=512 count=0 seek=$cow_size
COWLOOPDEV=`losetup -f`
losetup -v -f $FILE.cow.$loopnumber
echo "0 $cow_size snapshot $img_loop_dev $COWLOOPDEV p $chunk_size" | dmsetup create $FILE.cow.$loopnumber
vblade 0 $loopnumber eth0 /dev/mapper/$FILE.cow.$loopnumber &
echo $COWLOOPDEV is attached to $FILE.cow.$loopnumber
done
losetup -a
dmsetup table
Same diagram but in Ascii.
Converted to PNG with http://ditaa.sourceforge.net/
-----------------------------
|--/dev/mapper/Image.cow.0--|
|----/----------+ /-----------+
| :{s} | |{s} |--vblade eth0
| |/dev/loop1|------>|Image.cow.0| 0 0
| +----------/ +-----------/
|
| -----------------------------
/-----------+ | |--/dev/mapper/Image.cow.1--|
:{s} | |----/----------+ /-----------+
| | | :{s} | |{s} |--vblade eth0
| | COW | |/dev/loop2|------>|Image.cow.1| 0 1
|/dev/loop0 |----------| +----------/ +-----------/
| | |
| | | -----------------------------
| | SNAPSHOT | |--/dev/mapper/Image.cow.2--|
|READ ONLY | |----/----------+ /-----------+
+-----------/ | :{s} | |{s} |-->vblade eth0
| | |/dev/loop3|------>|Image.cow.2| 0 2
| | +----------/ +-----------/
| |
/-----------+ | -----------------------------
|{s} | | |--/dev/mapper/Image.cow.3--|
|Image.img | |----/----------+ /-----------+
+-----------/ :{s} | |{s} |-->vblade eth0
|/dev/loop4|------>|Image.cow.3| 0 3
+----------/ +-----------/
/--------------------------------------------\
| dmsetup table |
|Image.cow.3: 0 8193150 snapshot 7:0 7:4 P 64|
|Image.cow.2: 0 8193150 snapshot 7:0 7:3 P 64|
|Image.cow.1: 0 8193150 snapshot 7:0 7:2 P 64|
|Image.cow.0: 0 8193150 snapshot 7:0 7:1 P 64|
\--------------------------------------------/