Go to file
Joe Thornber 3c02151a4f Merge branch 'master' into v0.7-devel
Conflicts:
	persistent-data/file_utils.cc
	persistent-data/file_utils.h
2016-04-05 13:13:10 +01:00
autoconf more build stuff 2011-12-09 12:54:51 +00:00
base Merge remote-tracking branch 'remotes/github-m-h-tsai/v0.6.2-repairtool' into 2016-02-29-mingus-merge 2016-02-29 10:29:28 +00:00
bin [build] add symlinks for the new dev tools 2016-02-29 13:51:30 +00:00
block-cache Merge remote-tracking branch 'remotes/github-m-h-tsai/v0.6.2-repairtool' into 2016-02-29-mingus-merge 2016-02-29 10:29:28 +00:00
caching Merge remote-tracking branch 'remotes/github-m-h-tsai/v0.6.2-repairtool' into 2016-02-29-mingus-merge 2016-02-29 10:29:28 +00:00
contrib don't avoid emitting part of the allocation bitmap when NOT told to do so 2016-04-06 15:56:09 +03:00
era [block-cache] Add check_raw() to bcache::validator 2016-02-27 15:21:13 +08:00
features [cucumber tests] update thin_delta help output 2015-06-22 11:58:18 +01:00
lib gmock stub 2013-03-22 10:55:55 +00:00
man8 [thin_dump] --format custom=<shared lib> 2016-03-24 13:59:08 +00:00
persistent-data Merge branch 'master' into v0.7-devel 2016-04-05 13:13:10 +01:00
thin-provisioning Merge branch 'master' into v0.7-devel 2016-04-05 13:13:10 +01:00
ui [thin_show_metadata] ncurses render 2016-02-26 12:50:17 +00:00
unit-tests Merge remote-tracking branch 'remotes/github-m-h-tsai/v0.6.2-repairtool' into 2016-02-29-mingus-merge 2016-02-29 10:29:28 +00:00
xml_metadata add some example metadata dumps 2011-11-16 12:17:23 +00:00
.gitignore update ignore file 2016-03-24 15:22:01 +00:00
.ruby-version Don't put a patch version in .rub-version, 1.9.3 is enough 2013-12-02 12:08:01 +00:00
CHANGES update CHANGES 2016-04-05 13:06:26 +01:00
configure.ac add configure option to enable static linking 2016-04-06 15:56:08 +03: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 Gemfile 2014-09-04 11:52:12 +01:00
get-gmock.sh Convert buffer_t to gmock. 2013-03-22 12:04:38 +00:00
main.cc [base] introduce a command type that gets registered with the app 2016-01-08 12:51:52 +00:00
Makefile.in allow tmakatos (a binary) emitter to be statically compiled 2016-04-06 15:56:09 +03:00
mk_release make mk_release executable 2012-03-05 11:46:20 +00:00
README.md no need to supply held root, thin_dump -m will look it up 2016-03-04 18:30:02 +03:00
TODO.org Add a TODO file 2013-04-23 11:18:21 +01:00
VERSION bump version 2016-03-21 17:27:26 +00: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. The expat xml parser library (version 1). The libaio library (note this is not the same as the aio library that you get by linking -lrt) 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.

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

    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'

Dump Metadata

To dump the metadata of a live thin pool, you must first create a snapshot of the metadata:

$ dmsetup message vg001-mythinpool-tpool 0 reserve_metadata_snap

Extract the metadata:

$ sudo bin/thin_dump -m /dev/mapper/vg001-mythinpool_tmeta
<superblock uuid="" time="1" transaction="2" data_block_size="128"nr_data_blocks="0">
    <device dev_id="1" mapped_blocks="1" transaction="0" creation_time="0" snap_time="1">
        <single_mapping origin_block="0" data_block="0" time="0"/>
    </device>
    <device dev_id="2" mapped_blocks="1" transaction="1" creation_time="1" snap_time="1">
        <single_mapping origin_block="0" data_block="0" time="0"/>
    </device>
</superblock>

Finally, release the root:

$ dmsetup message vg001-mythinpool-tpool 0 release_metadata_snap