Go to file
2013-06-27 11:44:02 +01:00
autoconf more build stuff 2011-12-09 12:54:51 +00:00
cache some __le -> le issues 2013-03-22 15:48:43 +00:00
features Add feature file for thin_restore. 2013-06-27 09:40:43 +01:00
lib gmock stub 2013-03-22 10:55:55 +00:00
man8 [thin_check] --ignore-non-fatal-errors 2013-05-23 11:57:02 +01:00
persistent-data Get unit-tests building with g++ 4.8.1 2013-06-25 14:18:38 +01:00
thin-provisioning [thin_restore] Tweak usage message. 2013-06-27 09:44:46 +01:00
unit-tests [build] DEPs build quietly now and aren't generated when making clean. 2013-06-27 10:17:38 +01:00
xml_metadata add some example metadata dumps 2011-11-16 12:17:23 +00:00
.gitignore update ignore file 2013-06-27 10:18:09 +01:00
.ruby-version Some trivial cucumber tests 2013-03-20 19:44:09 +00:00
configure.in - fix configure.h.in error and .PHONY 2011-12-21 11:31:56 +01:00
COPYING Add copyright 2011-12-06 13:43:44 +00:00
Gemfile Update gem requirements 2013-06-19 11:29:49 +01:00
Gemfile.lock Update gem requirements 2013-06-19 11:29:49 +01:00
get-gmock.sh Convert buffer_t to gmock. 2013-03-22 12:04:38 +00:00
Makefile.in [build] DEPs build quietly now and aren't generated when making clean. 2013-06-27 10:17:38 +01:00
mk_release make mk_release executable 2012-03-05 11:46:20 +00:00
README Update README 2013-06-27 11:44:02 +01:00
TODO.org Add a TODO file 2013-04-23 11:18:21 +01:00
VERSION bump version to 0.2.0-rc2 2013-06-27 11:41:47 +01:00
version.h.in version.h.in 2011-12-15 14:58:25 +01:00

Introduction
============

A suite of tools for manipulating the metadata of the dm-thin
device-mapper target.

Requirements
============

A C++ compiler that supports the c++11 standard (eg, g++).
The [Boost C++ library](http://www.boost.org/).
The [expat](http://expat.sourceforge.net/) xml parser library (version 1).
make, autoconf etc.

There are more requirements for testing, detailed below.

Building
========

./configure
make
sudo make install


Quick examples
==============

These tools introduce an xml format for the metadata.  This is useful
for making backups, or allowing scripting languages to generate or
manipulate metadata.  A Ruby library for this available;
[thinp_xml](https://rubygems.org/gems/thinp_xml).

To convert the binary metadata format that the kernel uses to this xml
format use _thin\_dump_.

  `thin_dump --format xml /dev/mapper/my_thinp_metadata`

To convert xml back to the binary form use _thin\_restore_.

  `thin_restore -i my_xml -o /dev/mapper/my_thinp_metadata`

You should periodically check the health of your metadata, much as you
fsck a filesystem.  Your volume manager (eg, LVM2) should be doing
this for you behind the scenes.

  `thin_check /dev/mapper/my_thinp_metadata`

Checking all the mappings can take some time, you can omit this part
of the check if you wish.

  `thin_check --skip-mappings /dev/mapper/my_thinp_metadata`

If your metadata has become corrupt for some reason (device failure,
user error, kernel bug), thin_check will tell you what the effects of
the corruption are (eg, which thin devices are effected, which
mappings).

There are two ways to repair metadata.  The simplest is via the
_thin\_repair_ tool.

  `thin_repair -i /dev/mapper/broken_metadata_dev -o /dev/mapper/new_metadata_dev`

This is a non-destructive operation that writes corrected metadata to
a new metadata device.

Alternatively you can go via the xml format (perhaps you want to
inspect the repaired metadata before restoring).

  `thin_dump --repair /dev/mapper/my_metadata > repaired.xml`
  `thinp_restore -i repaired.xml -o /dev/mapper/my_metadata`

Development
===========

Autoconf
--------

If you've got the source from github you'll need to create the
./configure script with autoconf.  I do this by running:

  `autoreconf`

Enable tests
------------

You will need to enable tests when you configure.

  `./configure --enable-testing`

Unit tests
----------

Unit tests are implemented using the google mock framework.  This is a
source library that you will have to download.  A script is provided
to do this for you.

  `./get-gmock.sh`

All tests can be run via:

  `make unit-test`

Alternatively you may want to run a subset of the tests:

  `make unit-tests/unit_tests`
  `unit-tests/unit_tests --gtest_filter=BtreeTests.*`

Functional tests
----------------

These top level tests are implemented using the
[cucumber](http://cukes.info/) tool.  They check the user interface of
the tools (eg, command line switches are accepted and effective).

I've provided a Gemfile, so installing this should be easy:

i) Install Ruby 1.9.x.  I recommend doing this via RVM.
ii) Make sure _bundler_ is installed:

  `gem install bundler`

iii) Install dependencies (including _cucumber_ and _thinp\_xml_)

  `bundle`

Once you've done this you can run the tests with a simple:

  `cucumber`

Or specific tests with:

  `cucumber features/thin_restore -n 'print help'`