An introduction to the device mapper ==================================== The goal of this driver is to support volume management. The driver enables the definition of new block devices composed of ranges of sectors of existing devices. This can be used to define disk partitions - or logical volumes. This light-weight kernel component can support user-space tools for logical volume management. The driver maps ranges of sectors for the new logical device onto 'mapping targets' according to a mapping table. Currently the mapping table must be supplied to the driver through an ioctl interface. Earlier versions of the driver also had a custom file system interface (dmfs), but we stopped work on this because of pressure of time. The mapping table consists of an ordered list of rules of the form: [ ...] which map sectors beginning at to a target. Every sector on the new device must be specified - there must be no gaps between the rules. The first rule has = 0. Each subsequent rule starts from the previous + + 1. When a sector of the new logical device is accessed, the make_request function looks up the correct target and then passes the request on to the target to perform the remapping according to its arguments. The following targets are available: linear striped error snapshot mirror The 'linear' target takes as arguments a target device name (eg /dev/hda6) and a start sector and maps the range of sectors linearly to the target. The 'striped' target is designed to handle striping across physical volumes. It takes as arguments the number of stripes and the striping chunk size followed by a list of pairs of device name and sector. The 'error' target causes any I/O to the mapped sectors to fail. This is useful for defining gaps in the new logical device. The 'snapshot' target supports asynchronous snapshots. See http://people.sistina.com/~thornber/snap_performance.html. The 'mirror' target is used to implement pvmove. In normal scenarios the mapping tables will remain small. A btree structure is used to hold the sector range -> target mapping. Since we know all the entries in the btree in advance we can make a very compact tree, omitting pointers to child nodes as child node locations can be calculated. Benchmarking with bonnie++ suggests that this is certainly no slower than current LVM. Sistina UK Updated 30/04/2003