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.
#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|
\--------------------------------------------/
