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
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.
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
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
Before starting the plugin please set the environment variable
CSI_ENDPOINT to a valid Go network address such as
$ CSI_ENDPOINT=csi.sock ./csi-blockdevices INFO configured com.thecodeteam.blockdevices devicedir=/dev/disk/csi-blockdevices privatedir=/dev/disk/csi-bd-private INFO identity service registered INFO controller service registered INFO node service registered INFO serving endpoint="unix://csi.sock"
The server can be shutdown by using
Ctrl-C or sending the process
any of the standard exit signals.
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
$ 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 $
No additional parameters are currently supported/required by the plugin
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:
The following table is a list of configuration values that are specific to BlockDevices, their default values, and whether they are required for operation:
||Directory to scan for block devices||
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.
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.