Skip to content

A Container Storage Interface (CSI) plug-in that provides block devices (/dev) support.

License

Notifications You must be signed in to change notification settings

rexray/csi-blockdevices

Folders and files

NameName
Last commit message
Last commit date
Feb 8, 2018
Feb 14, 2018
Feb 14, 2018
Feb 14, 2018
Feb 14, 2018
Aug 25, 2017
Feb 8, 2018
Feb 14, 2018
Feb 14, 2018
Aug 24, 2017
Feb 14, 2018
Feb 14, 2018
Feb 14, 2018

Repository files navigation

CSI plugin for local block devices [Build Status]

Description

CSI-BlockDevices is a Container Storage Interface (CSI) plugin for locally attached block devices. Block devices can be exposed to the plugin by symlinking them into a directory, by default /dev/disk/csi-blockdevices. See sample commands for details.

This project may be compiled as a stand-alone binary using Golang that, when run, provides a valid CSI endpoint. This project can also be vendored or built as a Golang plugin in order to extend the functionality of other programs.

Runtime Dependencies

None

Installation

CSI-BlockDevices can be installed with Go and the following command:

$ go get github.com/thecodeteam/csi-blockdevices

The resulting binary will be installed to $GOPATH/bin/csi-blockdevices.

If you want to build csi-nblockdevices with accurate version information, you'll need to run the go generate command and build again:

$ go get github.com/thecodeteam/csi-blockdevices
$ cd $GOPATH/src/github.com/thecodeteam/csi-blockdevices
$ go generate && go install

The binary will once again be installed to $GOPATH/bin/csi-blockdevices.

Start plugin

Before starting the plugin please set the environment variable CSI_ENDPOINT to a valid Go network address such as csi.sock:

$ CSI_ENDPOINT=csi.sock ./csi-blockdevices
INFO[0000] configured com.thecodeteam.blockdevices       devicedir=/dev/disk/csi-blockdevices privatedir=/dev/disk/csi-bd-private
INFO[0000] identity service registered
INFO[0000] controller service registered
INFO[0000] node service registered
INFO[0000] serving                                       endpoint="unix://csi.sock"

The server can be shutdown by using Ctrl-C or sending the process any of the standard exit signals.

Using plugin

The CSI specification uses the gRPC protocol for plug-in communication. The easiest way to interact with a CSI plugin is via the Container Storage Client (csc) program provided via the GoCSI project:

$ go get github.com/thecodeteam/gocsi
$ go install github.com/thecodeteam/gocsi/csc

Then, set have csc use the same CSI_ENDPOINT, and you can issue commands to the plugin. Some examples...

Get the plugin's supported versions and plugin info:

$ ./csc -e csi.sock identity supported-versions
0.1.0

$ ./csc -v 0.1.0 -e csi.sock identity plugin-info
"com.thecodeteam.blockdevices"	"0.1.0+11"
"commit"="24167e6b3486c7938243c4a97fd5fb410390b8e5"
"formed"="Wed, 14 Feb 2018 18:40:13 UTC"
"semver"="0.1.0+11"
"url"="https://github.com/thecodeteam/csi-nfs"

Create a loopback device and make it available to plugin:

$ mkdir /dev/disk/csi-blockdevices
$ cd /dev/disk/csi-blockdevices

# make 100MiB disk image
$ dd if=/dev/zero of=test.img bs=1024 count=102400

# attach disk image to /dev/loop0
$ losetup /dev/loop0 test.img

# create symlink named loop0 -> /dev/loop0
$ ln -s /dev/loop0

$ csc -e csi.sock -v 0.1.0 c ls
"loop0"	0

Publish the "loop0" volume as a block volume

# create file to mount device to
$ touch /mnt/target
$ csc -v 0.1.0 n publish --cap SINGLE_NODE_WRITER,block --target-path /mnt/target loop0
loop0
$ mount | grep -e loop -e target
devtmpfs on /dev/disk/csi-bd-private/loop0 type devtmpfs (rw,relatime,seclabel,size=241476k,nr_inodes=60369,mode=755)
devtmpfs on /mnt/target type devtmpfs (rw,relatime,seclabel,size=241476k,nr_inodes=60369,mode=755) (rw,relatime,seclabel,size=241476k,nr_inodes=60369,mode=755)
$ csc -v 0.1.0 n unpublish --target-path /mnt/target loop0
loop0
$ mount | grep loop
$

Publish the "loop0" volume as a mount volume, formatted with ext4

# create directory to mount filesystem to
$ mkdir /mnt/test
$ csc -v 0.1.0 n publish --cap SINGLE_NODE_WRITER,mount,ext4 --target-path /mnt/test loop0
loop0
$ mount | grep loop
/dev/loop0 on /dev/disk/csi-bd-private/loop0 type ext4 (rw,relatime,seclabel,data=ordered)
/dev/loop0 on /mnt/test type ext4 (rw,relatime,seclabel,data=ordered)
$ csc -v 0.1.0 n unpublish --target-path /mnt/target loop0
loop0
$ mount | grep loop
$

Parameters

No additional parameters are currently supported/required by the plugin

Configuration

The CSI-BlockDevices SP is built using the GoCSI CSP package. Please see its configuration section for a complete list of the environment variables that may be used to configure this SP.

The following table is a list of this SP's default configuration values:

Name Value
X_CSI_SPEC_REQ_VALIDATION true
X_CSI_SERIAL_VOL_ACCESS true
X_CSI_SUPPORTED_VERSIONS 0.1.0
X_CSI_PRIVATE_MOUNT_DIR /dev/disk/csi-bd-private

The following table is a list of configuration values that are specific to BlockDevices, their default values, and whether they are required for operation:

Name Description Default Val Required
X_CSI_BD_DEVDIR Directory to scan for block devices /dev/disk/csi-blockdevices false

Capable operational modes

The CSI spec defines a set of AccessModes that a volume can have. CSI-BlockDevices supports the following modes for volumes that will be mounted as a filesystem:

// Can only be published once as read/write on a single node,
// at any given time.
SINGLE_NODE_WRITER = 1;

// Can only be published once as readonly on a single node,
// at any given time.
SINGLE_NODE_READER_ONLY = 2;

This means that mount volumes can be mounted only at one node at a time (because the disk is local to the node) and can be mounted as read-write or read-only.

For volumes that are used as block devices, only the following are supported:

// Can only be published once as read/write on a single node,
// at any given time.
SINGLE_NODE_WRITER = 1;

This means that giving a workload read-only access to a block device is not supported.

Support

For any questions or concerns please file an issue with the csi-blockdevices project or join the Slack channel #project-rexray at codecommunity.slack.com.

About

A Container Storage Interface (CSI) plug-in that provides block devices (/dev) support.

Resources

License

Stars

Watchers

Forks

Packages

No packages published