devmapper: add README and minor fixes

Signed-off-by: Maksym Pavlenko <makpav@amazon.com>
This commit is contained in:
Maksym Pavlenko 2019-02-14 16:06:22 -08:00
parent 2218275ec9
commit 0c6d194cce
No known key found for this signature in database
GPG Key ID: BDA48CBFE7A0FC14
3 changed files with 54 additions and 7 deletions

View File

@ -0,0 +1,46 @@
## Devmapper snapshotter
Devmapper is a `containerd` snapshotter plugin that stores snapshots in ext4-formatted filesystem images
in a devicemapper thin pool.
## Setup
To make it work you need to prepare `thin-pool` in advance and update containerd's configuration file.
This file is typically located at `/etc/containerd/config.toml`.
Here's minimal sample entry that can be made in the configuration file:
```
[plugins]
...
[plugins.devmapper]
pool_name = "containerd-pool"
base_image_size = "128MB"
...
```
The following configuration flags are supported:
* `root_path` - a directory where the metadata will be available (if empty
default location for `containerd` plugins will be used)
* `pool_name` - a name to use for the devicemapper thin pool. Pool name
should be the same as in `/dev/mapper/` directory
* `data_device` - path to the data volume that should be used by the thin pool
* `meta_device` - path to the metadata volume that should be used by the thin-pool
* `data_block_size` - the size of allocation chunks in data file, between 128
sectors (64KB) and and 2097152 sectors (1GB) and a multiple of 128 sectors (64KB)
* `base_image_size` - defines how much space to allocate when creating the base device
Pool name and base image size are required snapshotter parameters.
## Run
Give it a try with the following commands:
```bash
ctr images pull --snapshotter devmapper docker.io/library/hello-world:latest
ctr run --snapshotter devmapper docker.io/library/hello-world:latest test
```
## Requirements
The devicemapper snapshotter requires `dmsetup` command line tool to be installed and available on your computer.
On Ubuntu, it can be installed with `apt-get install dmsetup` command.

View File

@ -65,7 +65,7 @@ type Config struct {
BaseImageSizeBytes uint64 `toml:"-"` BaseImageSizeBytes uint64 `toml:"-"`
} }
// LoadConfig reads devmapper configuration file JSON format from disk // LoadConfig reads devmapper configuration file from disk in TOML format
func LoadConfig(path string) (*Config, error) { func LoadConfig(path string) (*Config, error) {
if _, err := os.Stat(path); err != nil { if _, err := os.Stat(path); err != nil {
if os.IsNotExist(err) { if os.IsNotExist(err) {

View File

@ -39,12 +39,9 @@ import (
func init() { func init() {
plugin.Register(&plugin.Registration{ plugin.Register(&plugin.Registration{
Type: plugin.SnapshotPlugin, Type: plugin.SnapshotPlugin,
ID: "devmapper", ID: "devmapper",
Config: &Config{ Config: &Config{},
PoolName: "containerd-pool",
BaseImageSize: "128Mb",
},
InitFn: func(ic *plugin.InitContext) (interface{}, error) { InitFn: func(ic *plugin.InitContext) (interface{}, error) {
ic.Meta.Platforms = append(ic.Meta.Platforms, ocispec.Platform{ ic.Meta.Platforms = append(ic.Meta.Platforms, ocispec.Platform{
OS: "linux", OS: "linux",
@ -56,6 +53,10 @@ func init() {
return nil, errors.New("invalid devmapper configuration") return nil, errors.New("invalid devmapper configuration")
} }
if config.PoolName == "" {
return nil, errors.New("devmapper not configured")
}
if config.RootPath == "" { if config.RootPath == "" {
config.RootPath = ic.Root config.RootPath = ic.Root
} }