| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 | 
							- luksmeta(8)
 
- ===========
 
- :doctype: manpage
 
- == NAME
 
- luksmeta - Utility for storing metadata in a LUKSv1 header
 
- == SYNOPSIS
 
- *luksmeta test* -d DEVICE
 
- *luksmeta nuke* -d DEVICE [-f]
 
- *luksmeta init* -d DEVICE [-f] [-n]
 
- *luksmeta show* -d DEVICE [-s SLOT]
 
- *luksmeta save* -d DEVICE [-s SLOT]  -u UUID  < DATA
 
- *luksmeta load* -d DEVICE  -s SLOT  [-u UUID] > DATA
 
- *luksmeta wipe* -d DEVICE  -s SLOT  [-u UUID] [-f]
 
- == OVERVIEW
 
- The *luksmeta* utility enables an administrator to store metadata in the gap
 
- between the end of the LUKSv1 header and the start of the encrypted data. This
 
- is useful for storing data that is available before the volume is unlocked,
 
- usually for use during the volume unlock process.
 
- The metadata is stored in a series of UUID-typed slots, allowing multiple
 
- blocks of metadata. Although the *luksmeta* slots are inspired by the LUKS
 
- slots, they are functionally independent and share only a casual relationship.
 
- Slots merely provide a hint that a given chunk of metadata is associated with
 
- a specific LUKSv1 password (in a slot with the same number). However,
 
- *luksmeta* itself is indifferent to the relationship between a LUKSv1 slot
 
- and the correspondly numbered *luksmeta* slot, with one exception (detailed
 
- below).
 
- After a LUKSv1 volume is initialized using *cryptsetup*(8), it must also be
 
- initialized for metadata storage by *luksmeta init*. Once this is complete,
 
- the device is ready to store medata.
 
- Data can be written to a slot using *luksmeta save* or read from a slot
 
- using *luksmeta load*. You can also erase the data in an existing slot using
 
- *luksmeta wipe* or query the slots using *luksmeta show*.
 
- == UUID GENERATION
 
- It is often presumed that saving metadata to a slot requires a specific UUID
 
- or that there is an official registry of UUID types. This is incorrect.
 
- UUID stands for Universally Unique IDentifier. UUIDs are a standardized,
 
- widely-used data type used for identification without a central registry. For
 
- the relevant standards, see ISO 9834-8:2005 and RFC 4122.
 
- UUIDs are large enough that collision is practically impossible. So if your
 
- application wants to store data in a *luksmeta* slot, just generate your own
 
- UUID and use it consistently to refer to your type of data. If you have
 
- multiple types of data, feel free to generate multiple UUIDs.
 
- The easiest way to generate a UUID is to use *uuidgen*(1). However, any compliant
 
- UUID generator will suffice.
 
- == INITIALIZATION
 
- Before reading or writing metadata, the LUKSv1 block device must be
 
- initialized for metadata storage. Three commands help with this process:
 
- *luksmeta test*, *luksmeta nuke* and *luksmeta init*.
 
- The *luksmeta test* command simply checks an existing block device to see
 
- if it is initialized for metadata storage. This command does not provide any
 
- output, so be sure to check its return code (see below).
 
- The *luksmeta nuke* command will zero (erase) the entire LUKSv1 header gap.
 
- Since this operation is destructive, user confirmation will be required before
 
- clearing the gap unless the *-f* option is supplied.
 
- The *luksmeta init* command initializes the LUKSv1 block device for metadata
 
- storage. This process will wipe out any data in the LUKSv1 header gap. For
 
- this reason, this command will require user confirmation before any data is
 
- written unless the *-f* option is supplied. Note that this command succeeds
 
- without any modification if the device is already initialized. If you would
 
- like to force the creation of clean initialization state, you can specify the
 
- *-n* option to nuke the LUKSv1 header gap before initialization (but after
 
- user confirmation).
 
- == METADATA STATE
 
- The *luksmeta show* command displays the current state of slots on the LUKSv1
 
- block device. If no slot is specified, it prints a table consisting of the
 
- slot number, the corresponding LUKSv1 slot state and the UUID of the data
 
- stored in the *luksmeta* slot (or "empty" if no data is stored). If a slot is
 
- specified, this command simply prints out the UUID of the data in the slot. If
 
- the slot does not contain data, it prints nothing.
 
- == MANAGING METADATA
 
- Managing the metadata in the slots is performed with three commands:
 
- *luksmeta save*, *luksmeta load* and *luksmeta wipe*. These commands write
 
- metadata to a slot, read metadata from a slot and erase metadata in a slot,
 
- respectively.
 
- The *luksmeta save* command reads metadata on standard input and writes it to
 
- the specified slot using the specified UUID. If no slot is specified,
 
- *luksmeta* will search for the first slot number for which the LUKSv1 slot
 
- is inactive and the *luksmeta* slot is empty. This represents the only
 
- official correlation between LUKSv1 slots and *luksmeta* slots. In this case,
 
- the metadata is written to the first applicable slot using the specified UUID
 
- and the slot number is printed to standard output. In either case, this
 
- command will never overwrite existing data. To replace data in a slot you will
 
- need to execute *luksmeta wipe* before *luksmeta save*.
 
- The *luksmeta load* command reads data from the specified slot and writes it
 
- to standard output. If a UUID is specified, the command will verify that the
 
- UUID associated with the metadata in the slot matches the specified UUID. This
 
- type check helps to ensure that you always receive the type of data you are
 
- expecting as output. If the UUIDs do not match, the command will fail.
 
- The *luksmeta wipe* command erases the data from the given slot. If a UUID is
 
- specified, the command will verify that the UUID associated with the metadata
 
- in the slot matches the specified UUID. This type check helps to ensure that
 
- you only erase the data you intended to erase. Because this is a destructive
 
- operation, this command will require user confirmation before any data is
 
- erased, unless the *-f* option is supplied. Note that this command succeeds
 
- if you attempt to wipe a slot that is already empty.
 
- == CAVEATS
 
- The amount of storage in the LUKSv1 header gap is extremely limited. It also
 
- varies based upon the configuration used by LUKSv1 at device initialization
 
- time. In some LUKSv1 configurations, there is not even enough space for
 
- all the metadata slots even at the smallest possible slot size.
 
- During the design of this utility, we considered it likely that users would
 
- want to reduce the number of usable slots in exchange for more storage space
 
- in the slots used. In order to provide this flexibility, the amount of storage
 
- available per-slot is dynamic. Put simply, slots are not a fixed size. This
 
- means that it is possible (and even somewhat likely) to encounter an error
 
- during *luksmeta save* indicating that there is insufficient space.
 
- This error is not a programming bug. If you encounter this error it likely
 
- means that either all space is being consumed by the already-written slots or
 
- that the metadata you are attempting to write simply does not fit.
 
- You can attempt to resolve this problem by calling *luksmeta wipe* on slots
 
- that are no longer in use. This will release the storage space for use by
 
- other slots. Note that *luksmeta* does not, however, currently perform
 
- defragmentation since the number of usable blocks is rather limited. You can
 
- attempt to manually get around this by extracting all slot data, wiping the
 
- slots and reloading them in order. However, this operation is potentially
 
- dangerous and should be undertaken with great care.
 
- == OPTIONS
 
- * *-d* _DEVICE_, *--device*=_DEVICE_ :
 
-   The device on which to perform the operation.
 
- * *-s* _SLOT_, *--slot*=_SLOT_ :
 
-   The slot number on which to perform the operation.
 
- * *-u* _UUID_, *--uuid*=_UUID_ :
 
-   The UUID to associate with the operation.
 
- * *-f*, *--force* :
 
-   Forcibly suppress all user prompting.
 
- == RETURN VALUES
 
- This command uses the return values as defined by *sysexits.h*. The following
 
- are general errors (and corresponding numeric exit codes) whose meaning is
 
- shared by all *luksmeta* commands:
 
- * *EX_OK*         (0): The operation was successful.
 
- * *EX_USAGE*     (64): The program was called with invalid parameters.
 
- * *EX_DATAERR*   (65): The specified UUID does not match the slot UUID.
 
- * *EX_NOINPUT*   (66): An error occurred while reading from standard input.
 
- * *EX_OSERR*     (71): An undefined operating system error occurred.
 
- * *EX_OSFILE*    (72): The device is not initialized or is corrupted.
 
- * *EX_CANTCREAT* (73): There is insufficient space in LUKSv1 header.
 
- * *EX_IOERR*     (74): An IO error occurred when writing to the device.
 
- * *EX_NOPERM*    (77): The user did not grant permission during confirmation.
 
- Additionally, *luksmeta save* will return *EX_UNAVAILABLE* when you attempt
 
- to save data into a slot that is already used. Likewise, *luksmeta load* will
 
- return *EX_UNAVAILABLE* when you attempt to read from an empty slot.
 
- == EXAMPLES
 
- Destroy all data (including LUKSMeta data) in the LUKSv1 header gap and
 
- initialize the gap for LUKSMeta storage:
 
-     $ luksmeta init -n -f -d /dev/sdz
 
- If already initialized, do nothing. Otherwise, destroy all non-LUKSMeta data
 
- in the LUKSv1 header gap and initialize the gap for LUKSMeta storage:
 
-     $ luksmeta init -f -d /dev/sdz
 
- Write some data to a slot:
 
-     $ UUID=*uuidgen*
 
-     $ echo $UUID
 
-     31c25e3b-b8e2-4eaa-a427-23aa882feef2
 
-     $ echo "Hello, World" | luksmeta save -d /dev/sdz -s 0 -u $UUID
 
- Read the data back:
 
-     $ luksmeta load -d /dev/sdz -s 0 -u $UUID
 
-     Hello, World
 
- Wipe the data from the slot:
 
-     $ luksmeta wipe -d /dev/sdz -s 0 -u $UUID
 
- Erase all trace of LUKSMeta:
 
-     $ luksmeta nuke -f -d /dev/sdz
 
- == AUTHOR
 
- Nathaniel McCallum <npmccallum@redhat.com>
 
- == SEE ALSO
 
- *cryptsetup*(8),
 
- *uuidgen*(1)
 
 
  |