Skip to content
This repository
Octocat-spinner-32 autoconf more build stuff
Octocat-spinner-32 base Factor out base/indented_stream.h
Octocat-spinner-32 caching Merge branch 'master' of…
Octocat-spinner-32 era [era_dump] add --logical
Octocat-spinner-32 features Merge branch 'master' of…
Octocat-spinner-32 lib gmock stub
Octocat-spinner-32 man8 Add missing cache tools manual pages and update respectively
Octocat-spinner-32 persistent-data [era] switch from bloom filters to writesets
Octocat-spinner-32 thin-provisioning Merge branch 'master' of…
Octocat-spinner-32 unit-tests [era] switch from bloom filters to writesets
Octocat-spinner-32 xml_metadata add some example metadata dumps
Octocat-spinner-32 .gitignore Merge branch 'master' of…
Octocat-spinner-32 .ruby-version Don't put a patch version in .rub-version, 1.9.3 is enough
Octocat-spinner-32 COPYING Add copyright
Octocat-spinner-32 Gemfile Update gem requirements
Octocat-spinner-32 Gemfile.lock Update Gemfile.lock
Octocat-spinner-32 install era tools
Octocat-spinner-32 wrong repo
Octocat-spinner-32 Add a TODO file
Octocat-spinner-32 VERSION bump version
Octocat-spinner-32 autconf: support build of thin_metadata_size.c
Octocat-spinner-32 Convert buffer_t to gmock.
Octocat-spinner-32 mk_release make mk_release executable


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


A C++ compiler that supports the c++11 standard (eg, g++). The Boost C++ library. The expat xml parser library (version 1). make, autoconf etc.

There are more requirements for testing, detailed below.


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.

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



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


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.


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 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:

  • Install Ruby 1.9.x. I recommend doing this via RVM.
  • Make sure bundler is installed:

    gem install bundler

  • Install dependencies (including cucumber and thinp\xml_)


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


Or specific tests with:

cucumber features/thin_restore -n 'print help'
Something went wrong with that request. Please try again.