Setting Up Storage

Introduction

The Atomic host is a minimal distribution and as such is distributed on a 6GB image to keep the footprint small. However, that amount of storage doesn’t support building and storing lots of Docker images. It is an expected practice that external storage of sufficient size will be attached to the Atomic Host host in order to provide enough space to build and store Docker images.

Docker uses /var/lib/docker as the default directory where all Docker related files, including the images, are stored. Atomic hosts however use direct LVM volumes via the devicemapper backend to store Docker images and metadata /dev/atomicos/docker-data and /dev/atomicos/docker-meta. Adding storage to an Atomic host therefore requires a different procedure to grow the LVM volume than adding more storage to a device mounted at /var/lib/docker.

This document provides instructions for using an attached device with your Atomic host so that you can build and store lots of Docker images. The basic procedure is the same as extending any other LVM volume. Add the new device to the host, create a physical volume using the new device, add the physical volume to the volume group, and then extend the LVM volumes. Since we are directly accessing the thin pool within docker, we won’t need to create or extend a filesystem or mount the LVM volumes.

Using the docker-storage-setup LVM helper

In this example, we’ll be using a virt-manager installed Atomic host.
Create a new VirtIO drive for use by the virtual machine and attach the volume to the Atomic host virtual machine in virt-manager. On the Atomic host, ensure the device is available. You may need to reboot the virtual machine. Make sure no partitions are listed on the device, as we’ll be adding this as a physical volume in LVM and get the appropriate device name.

In the example, you can see a new 5GB volume available at /dev/vdb. This is the disk we’ll add to the available pool.

[fedora@atomic-host-001 ~]$ sudo fdisk -l

Disk /dev/vda: 6 GiB, 6442450944 bytes, 12582912 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x0e409ce2

Device     Boot  Start      End  Sectors  Size Id Type
/dev/vda1  *      2048   411647   409600  200M 83 Linux
/dev/vda2       411648 12582911 12171264  5.8G 8e Linux LVM

Disk /dev/vdb: 5 GiB, 5368709120 bytes, 10485760 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Setting Up /etc/sysconfig/docker-storage-setup

Atomic hosts are delivered with a helper script to configure the direct LVM storage, docker-storage-setup. The script reads from configuration options in /etc/sysconfig/docker-storage-setup.

We’ll set up a very basic configuration file to add the new device to the docker data storage pool. The two options we’ll deal with are DEVS and VG.

The DEVS option is a space separated list of the devices you want to add to the pool. The docker-storage-setup script will automatically calculate the required amount of meta-data space from the overall size of the volume group, grow that volume, and then grow the data volume with the remaining space.

The VG option allows you to control the volume group used for Docker storage. By default, Atomic uses the same volume group as the root device. This means that you can set or change the root volume size with this utility as well. You can also change the group if you so choose.

[fedora@atomic-host-001 ~]$ sudo vi /etc/sysconfig/docker-storage-setup
DEVS="/dev/vdb"

Once you’ve added the new storage device or devices in the configuration file, you can run the helper script. If you are adding more than one device at a time, you’ll see some of these steps more than once.

[fedora@atomic-host-001 ~]$ sudo docker-storage-setup
0
sfdisk: Checking that no-one is using this disk right now ...
sfdisk: OK

Disk /dev/vdb: 6241 cylinders, 16 heads, 63 sectors/track
sfdisk:  /dev/vdb: unrecognized partition table type
Old situation:
sfdisk: No partitions found
New situation:
Units: sectors of 512 bytes, counting from 0

Device Boot    Start       End   #sectors  Id  System
/dev/vdb1          2048   6291455    6289408  8e  Linux LVM
/dev/vdb2             0         -          0   0  Empty
/dev/vdb3             0         -          0   0  Empty
/dev/vdb4             0         -          0   0  Empty
sfdisk: Warning: partition 1 does not start at a cylinder boundary
sfdisk: Warning: partition 1 does not end at a cylinder boundary
sfdisk: Warning: no primary partition is marked bootable (active)
This does not matter for LILO, but the DOS MBR will not boot this disk.
Successfully wrote the new partition table

Re-reading the partition table ...

sfdisk: If you created or changed a DOS partition, /dev/foo7, say, then use     dd(1)
to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)
Physical volume "/dev/vdb1" successfully created
Volume group "atomicos" successfully extended
NOCHANGE: partition 2 could only be grown by -48 [fudge=20480]
Physical volume "/dev/vda2" changed
1 physical volume(s) resized / 0 physical volume(s) not resized
NOCHANGE: partition 1 could only be grown by -16 [fudge=20480]
Physical volume "/dev/vdc1" changed
  1 physical volume(s) resized / 0 physical volume(s) not resized
Rounding size to boundary between physical extents: 12.00 MiB
Size of logical volume atomicos/docker-meta changed from 8.00 MiB (2 extents) to 12.00 MiB (3 extents).
Logical volume docker-meta successfully resized
Size of logical volume atomicos/docker-data changed from 3.84 GiB (1494   extents) to 8.83 GiB (2260 extents).
  Logical volume docker-data successfully resized

You can verify that Docker can see the new storage with docker info:

[fedora@atomic-host-001 ~]$ sudo docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
 Pool Name: docker-253:0-4655104-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: <unknown>
 Data file: /dev/atomicos/docker-data
 Metadata file: /dev/atomicos/docker-meta
 Data Space Used: 11.8 MB
 Data Space Total: 4.123 GB
 Metadata Space Used: 53.25 kB
 Metadata Space Total: 8.389 MB
 Udev Sync Supported: true
 Library Version: 1.02.93 (2015-01-30)
Execution Driver: native-0.2
Kernel Version: 3.18.7-200.fc21.x86_64
Operating System: Fedora 21 (Twenty One)
CPUs: 1
Total Memory: 1.955 GiB
Name: atomic-host-001.localdomain
ID: QN7L:2FJ5:CZXS:265G:JVIF:2CB3:35EE:T5KJ:7HXN:OXGG:MEW2:XLC2

Looking Forward

In order to add a new device using the docker-storage-setup script, you will need to make sure that the configuration file only contains references to devices and sizes for this particular run of the tool.

For example, if you add a new device to host and to the DEVS line, the docker-storage-setup script will exit as the existing device has a partition and physical volume already created.

[fedora@atomic-host-002 ~]$ sudo vi /etc/sysconfig/docker-storage-setup
DEVS="/dev/vdb /dev/vdc"

[fedora@atomic-host-002 ~]$ sudo docker-storage-setup
0
/dev/vdb has partitions: vdb1

Since Atomic is using the devicemapper backend and direct LVM pools, you can also add new devices manually, as you would with any other LVM configuration. When adding data storage, you should also calculate the needed space for meta-data, the docker-storage-setup helper reserves 0.1% of the size of the volume group as meta-data space.