Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
appnotes:cow [2008/02/27 18:33] toxicnaan |
appnotes:cow [2009/02/25 12:44] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== 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}} | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ========= | ||
+ | |||
+ | <code bash> | ||
+ | |||
+ | #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 | ||
+ | |||
+ | </code> | ||
+ | |||
+ | |||
+ | Same diagram but in Ascii. | ||
+ | |||
+ | <code> | ||
+ | |||
+ | 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| | ||
+ | \--------------------------------------------/ | ||
+ | |||
+ | |||
+ | </code> |