[][src]Crate devicemapper

Low-level devicemapper configuration of the running kernel.

Overview

Linux's devicemapper allows the creation of block devices whose storage is mapped to other block devices in useful ways, either by changing the location of its data blocks, or performing some operation on the data itself. This is a low-level facility that is used by higher-level volume managers such as LVM2. Uses may include:

  • Dividing a large block device into smaller logical volumes (dm-linear)
  • Combining several separate block devices into a single block device with better performance and/or redundancy (dm-raid)
  • Encrypting a block device (dm-crypt)
  • Performing Copy-on-Write (COW) allocation of a volume's blocks enabling fast volume cloning and snapshots (dm-thin)
  • Configuring a smaller, faster block device to act as a cache for a larger, slower one (dm-cache)
  • Verifying the contents of a read-only volume (dm-verity)

Usage

Before they can be used, DM devices must be created using DM::device_create(), have a mapping table loaded using DM::table_load(), and then activated with DM::device_suspend(). (This function is used for both suspending and activating a device.) Once activated, they can be used as a regular block device, including having other DM devices map to them.

Devices have "active" and "inactive" mapping tables. See function descriptions for which table they affect.

Polling for Events

Since DM minor version 37, first available in Linux kernel 4.14, the file descriptor associated with a DM context may be polled for events generated by DM devices.

The fd will indicate POLLIN if any events have occurred on any DM devices since the fd was opened, or since DM::arm_poll() was called. Therefore, in order to determine which DM devices have generated an event, the following usage is required:

  1. Create a DM.
  2. Call DM::list_devices() and track the event_nrs for any DM devices of interest.
  3. poll() on the DM's file descriptor, obtained by calling DM::file().as_raw_fd().
  4. If the fd indicates activity, first clear the event by calling DM::arm_poll(). This must be done before event processing to ensure events are not missed.
  5. Process events. Call DM::list_devices() again, and compare event_nr returned by the more recent call with event_nr values from the earlier call. If event_nr differs, an event has occurred on that specific device. Handle the event(s). Update the list of last-seen event_nrs.
  6. Optionally loop and re-invoke poll() on the fd to wait for more events.

Modules

IEC

International Electrotechnical Commission Units Standards

Structs

Bytes

A type for $T

CacheDev

DM Cache device

CacheDevPerformance

Cache dev performance data

CacheDevUsage

Cache usage

CacheDevWorkingStatus

Status values of a cache device when it is working

DM

Context needed for communicating with devicemapper.

DataBlocks

A type for $T

Device

A struct containing the device's major and minor numbers

DmCookie

Flags used by devicemapper, see: https://sourceware.org/git/?p=lvm2.git;a=blob;f=libdm/libdevmapper.h#l3627 for complete information about the meaning of the flags.

DmFlags

Flags used by devicemapper.

DmName

The borrowed version of the DM identifier.

DmNameBuf

The owned version of the DM identifier.

DmOptions

Encapsulates options for device mapper calls

DmUuid

The borrowed version of the DM identifier.

DmUuidBuf

The owned version of the DM identifier.

FlakeyTargetParams

Target params for flakey target

LinearDev

A DM construct of combined Segments

LinearDevTargetTable

A target table for a linear device. Such a table allows flakey targets as well as linear targets.

LinearTargetParams

Struct representing params for a linear target

MetaBlocks

A type for $T

Sectors

A type for $T

TargetLine

One line of a device mapper table.

TargetType

The borrowed version of the DM identifier.

TargetTypeBuf

The owned version of the DM identifier.

ThinDev

DM construct for a thin block device

ThinDevId

A thindev id is a 24 bit number, i.e., its bit width is not a power of 2.

ThinDevWorkingStatus

Status values for a thin device that is working

ThinPoolDev

DM construct to contain thin provisioned devices

ThinPoolUsage

Contains values indicating the thinpool's used vs total allocations for metadata and data blocks.

ThinPoolWorkingStatus

Status of a working thin pool, i.e, one that does not have status Fail

Enums

CacheDevStatus

Return type of CacheDev::status()

DevId

Used as a parameter for functions that take either a Device name or a Device UUID.

DmError

Super error type, with constructors distinguishing outer errors from core errors.

ErrorEnum

A very simple breakdown of outer layer errors.

LinearDevTargetParams

Target params for linear dev. These are either flakey or linear.

ThinPoolNoSpacePolicy

Policy if no space on device

ThinPoolStatus

Top-level thinpool status that indicates if it is working or failed.

ThinPoolStatusSummary

Indicates if a working thinpool is working optimally, or is experiencing a non-fatal error condition.

ThinStatus

Thin device status.

Constants

MAX_CACHE_BLOCK_SIZE

The maximum size recommended in the docs for a cache block.

MIN_CACHE_BLOCK_SIZE

The minimum size recommended in the docs for a cache block.

SECTOR_SIZE

disk sector size in bytes

Traits

DmDevice

A trait capturing some shared properties of DM devices.

Functions

device_exists

Check if a device of the given name exists.

devnode_to_devno

Get a device number from a device node. Return None if the device is not a block device; devicemapper is not interested in other sorts of devices. Return None if the device appears not to exist.

Type Definitions

DmResult

return result for DM functions