Early creation of mapped devices

It is possible to configure a device-mapper device to act as the root device for your system in two ways.

The first is to build an initial ramdisk which boots to a minimal userspace which configures the device, then pivot_root(8) in to it.

The second is to create one or more device-mappers using the module parameter "dm-mod.create=" through the kernel boot command line argument.

The format is specified as a string of data separated by commas and optionally semi-colons, where:

  • a comma is used to separate fields like name, uuid, flags and table (specifies one device)

  • a semi-colon is used to separate devices.

So the format will look like this:

dm-mod.create=<name>,<uuid>,<minor>,<flags>,<table>[,<table>+][;<name>,<uuid>,<minor>,<flags>,<table>[,<table>+]+]

Where:

<name>          ::= The device name.
<uuid>          ::= xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | ""
<minor>         ::= The device minor number | ""
<flags>         ::= "ro" | "rw"
<table>         ::= <start_sector> <num_sectors> <target_type> <target_args>
<target_type>   ::= "verity" | "linear" | ... (see list below)

The dm line should be equivalent to the one used by the dmsetup tool with the --concise argument.

Target types

Not all target types are available as there are serious risks in allowing activation of certain DM targets without first using userspace tools to check the validity of associated metadata.

cache

constrained, userspace should verify cache device

crypt

allowed

delay

allowed

era

constrained, userspace should verify metadata device

flakey

constrained, meant for test

linear

allowed

log-writes

constrained, userspace should verify metadata device

mirror

constrained, userspace should verify main/mirror device

raid

constrained, userspace should verify metadata device

snapshot

constrained, userspace should verify src/dst device

snapshot-origin

allowed

snapshot-merge

constrained, userspace should verify src/dst device

striped

allowed

switch

constrained, userspace should verify dev path

thin

constrained, requires dm target message from userspace

thin-pool

constrained, requires dm target message from userspace

verity

allowed

writecache

constrained, userspace should verify cache device

zero

constrained, not meant for rootfs

If the target is not listed above, it is constrained by default (not tested).

Examples

An example of booting to a linear array made up of user-mode linux block devices:

dm-mod.create="lroot,,,rw, 0 4096 linear 98:16 0, 4096 4096 linear 98:32 0" root=/dev/dm-0

This will boot to a rw dm-linear target of 8192 sectors split across two block devices identified by their major:minor numbers. After boot, udev will rename this target to /dev/mapper/lroot (depending on the rules). No uuid was assigned.

An example of multiple device-mappers, with the dm-mod.create="..." contents is shown here split on multiple lines for readability:

dm-linear,,1,rw,
  0 32768 linear 8:1 0,
  32768 1024000 linear 8:2 0;
dm-verity,,3,ro,
  0 1638400 verity 1 /dev/sdc1 /dev/sdc2 4096 4096 204800 1 sha256
  ac87db56303c9c1da433d7209b5a6ef3e4779df141200cbd7c157dcb8dd89c42
  5ebfe87f7df3235b80a117ebc4078e44f55045487ad4a96581d1adb564615b51

Other examples (per target):

"crypt":

dm-crypt,,8,ro,
  0 1048576 crypt aes-xts-plain64
  babebabebabebabebabebabebabebabebabebabebabebabebabebabebabebabe 0
  /dev/sda 0 1 allow_discards

"delay":

dm-delay,,4,ro,0 409600 delay /dev/sda1 0 500

"linear":

dm-linear,,,rw,
  0 32768 linear /dev/sda1 0,
  32768 1024000 linear /dev/sda2 0,
  1056768 204800 linear /dev/sda3 0,
  1261568 512000 linear /dev/sda4 0

"snapshot-origin":

dm-snap-orig,,4,ro,0 409600 snapshot-origin 8:2

"striped":

dm-striped,,4,ro,0 1638400 striped 4 4096
/dev/sda1 0 /dev/sda2 0 /dev/sda3 0 /dev/sda4 0

"verity":

dm-verity,,4,ro,
  0 1638400 verity 1 8:1 8:2 4096 4096 204800 1 sha256
  fb1a5a0f00deb908d8b53cb270858975e76cf64105d412ce764225d53b8f3cfd
  51934789604d1b92399c52e7cb149d1b3a1b74bbbcb103b2a0aaacbed5c08584

For setups using device-mapper on top of asynchronously probed block devices (MMC, USB, ..), it may be necessary to tell dm-init to explicitly wait for them to become available before setting up the device-mapper tables. This can be done with the "dm-mod.waitfor=" module parameter, which takes a list of devices to wait for:

dm-mod.waitfor=<device1>[,..,<deviceN>]