eXplode Code
Status: Pre-Alpha
Brought to you by:
junfeng
eXplode is a storage system checker. It comes with a model checker (in directory mcl/) for real code instead of abstract models. Model checking is a formal verification technique that systematically enumerates the possible execution paths of a system by starting from an initial state and repeatedly performing all possible actions to this state and its successors. This state-space exploration makes rare actions such as network failures appear as often as common ones, thereby quickly driving the target system (i.e., the system we check) into corner cases where subtle bugs surface. eXplode's model checkier is a generic model checker that you can use to check other systems as well (not just storage systems). To learn more information on using this model checker, please refer to mcl/README. Conventional model checking is heavyweight and difficult to apply to real systems; eXplode avoids the overheads associated with model checking using new checking architecture that checks a system in-situ, in its native environment. This architecture makes it really easy to check new systems. For example, a lot of the checkers we write have only less than 100 lines of code. Most of the other code in eXplode implements a crash simulator. With this simulator, you can check if your storage system correctly handles crashes and recoveries. Note eXplode will not simply check random crashes that merely occur; it will systematically generate *possible* crashes by permuting modified disk blocks in the buffer cache. Quick Start ================== 1. Get the eXplode virtual machine (VM) image from http://rcs.cs.columbia.edu/explode/vm/, and start it with VMware Player (http://www.vmware.com/products/player). 2. Boot eXplode VM with VMware Player, and in the grub boot menu, select "Ubuntu 8.04.1, kernel 2.6.24.3-eXplode." Use username "explode" and password "#explode" to log in. The eXplode source tree is in ~/explode. For the tree structure, refer to the Directory Structure below. 3. To check a file system, go to directory "~/explode/check," and run "./check-fs." All checkers are in directory "~/explode/check." You can also check cvs by running "./check-cvs." 4. To check a different file system, change fs::type and rdd::sectors in ~/explode/check/explode.options; this file stores user options. For all options users can configure, check out the "Configure eXplode" section below. Installation from Source ========================= Download and uncompress the eXplode source code: % wget http://rcs.cs.columbia.edu/explode/explode-latest.tar.gz % tar xzvf explode-latest.tar.gz % mv explode-latest explode Download and uncompress an eXplode-supported kernel into explode/kernel % cd explode/kernel % wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.3.tar.bz2 % tar xjvf linux-2.6.24.3.tar.bz2 Patch, build and install the kernel % cd linux-2.6.24.3 % patch -p1 < ../patch/linux-2.6.24.3 % make menuconfig % ... Configure and build eXplode: % cd explode % configure --with-kernel=kernel/linux-2.6.24.3 % make Directory Structure =================== The directory structure of eXplode is as follows: explode/ mcl/ Generic model checking library. For details, read mcl/README crash/ Code in this directory implements crash and recovery checking driver/ Generic file system test driver storage/ Wrappers to storage system utilities, such as mkfs and fsck check/ Checkers for different storage systems. rpc/ Wrappers to eXplode kernel modules below rdd-linux-2.6/ Simple RAM disk driver for Linux 2.6 rdd-bsd-6.0/ Simple RAM disk driver for FreeBSD 6.0 mtd-linux-2.6/ Simple flash disk driver for Linux 2.6 ekm-linux-2.6/ Explode kernel module for Linux 2.6 ekm-bsd-6.0/ Explode kernel module for FreeBSD 6.0 kernel/ patches/ eXplode kernel patches linux-2.6.24/ Full Linux kernel tree with eXplode patch applied How does eXplode work? ==================== When a marchine crashes, we lose the cached dirty blocks. Given a set of cached dirty blocks, depending on the order in which the disk scheduler writes out these cached blocks, any subset of these cached writes could occur on a crashed disk. If we test crashes simply by unplugging powercords, we may see only a few different crashed disks because the disk write order is mostly deterministic. To increase coverage by testing many different crashed disks, eXplode will keep track of the set of dirty blocks in the buffer cache and try to enumerate all subsets of these dirty blocks. Since using real disks to simulate these crashes would be slow, eXplode provides a RAM disk driver that simulates a block device. Thus, simulating crashes in eXplode is fast and easy: simply memcpying the subset of cached dirty blocks onto the RAM disk. Configure eXplode ==================== You can configure eXplode by providing an explode.options file in the directory where you run an eXplode executable. To see all available options, run the following command % find . -name \*.default.options -exec cat {} \; This command essentially prints out all default options stored in *.default.options files. Re-building After You've Made Changes ================== - Compiling eXplode eXplode uses autoconf and automake. If you have only modified existing files, re-building eXplode is easy. Simply run: explode@explode-vm:~/explode$ make If you add new files or directories, add them to the corresponding Makefile.am, then: explode@explode-vm:~/explode$ ./setup explode@explode-vm:~/explode$ ./configure explode@explode-vm:~/explode$ make - Compiling and installing the kernel Normally you wouldn't need to touch the kernel. But if you do, use the following instructions to install a new kernel: explode@explode-vm:~/explode/kernel/linux-2.6.24$ make bzImage [this may take a while ...] explode@explode-vm:~/explode/kernel/linux-2.6.24$ sudo cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.24 [this installs the new kernel] - Updating eXplode We use git (http://git-scm.com/) to manage eXplode source. To update eXplode, simply run: explode@explode-vm:~/explode$ git pull This command will pull the updates from the eXplode source forge repository (git://explode.git.sourceforge.net/gitroot/explode/explode) Checking a New Storage System ================== Three steps: 1. Create a checker 2. Create a storage component 3. Assemble a checking stack You'll find plenty of storage component examples in storage/ and test driver examples in driver/ and check/ For more details, please refer to the eXplode paper (http://rcs.cs.columbia.edu/papers/yang_osdi06.pdf).