Resizing a volume
A server may require additional capacity for a persistent storage volume that is attached to it. You can expand a volume online, while it is attached to a running server.
Prerequisites
In order to expand a volume online (that is, without detaching it from its server), you must use the OpenStack CLI. Make sure you have enabled it.
Checking the volume's state
Assume you have a volume named testvol
that is currently attached to a server named testsrv
:
$ openstack volume list
+-----------------------------------+---------+--------+------+----------------------------------+
| ID | Name | Status | Size | Attached to |
+-----------------------------------+---------+--------+------+----------------------------------+
| 357e1022-4156-4383-a49d-729f86e84 | testvol | in-use | 2 | Attached to testsrv on /dev/vdb |
| 347 | | | | |
+-----------------------------------+---------+--------+------+----------------------------------+
As you can see, this volume's status is in-use
, meaning it is currently attached to a server, and the volume's size is 2 GiB.
You can also use openstack server ssh
to verify the current state of the block device.
In this example, the virtual block device /dev/vdb
contains an XFS file system and is mounted to /srv
:
$ openstack server ssh testsrv -- -l ubuntu "mount | grep /dev/vdb"
/dev/vdb on /srv type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
Expanding the volume
You can now change the volume's size (in this example, we'll use a new size of 5 GiB).
Note that in order to be able to do this while the volume is attached to a server, you must invoke the openstack
command with the --os-volume-api-version
flag:
$ openstack --os-volume-api-version 3.42 volume set --size 5 testvol
$ openstack volume list
+-----------------------------------+---------+--------+------+----------------------------------+
| ID | Name | Status | Size | Attached to |
+-----------------------------------+---------+--------+------+----------------------------------+
| 357e1022-4156-4383-a49d-729f86e84 | testvol | in-use | 5 | Attached to testsrv on /dev/vdb |
| 347 | | | | |
+-----------------------------------+---------+--------+------+----------------------------------+
When using one of the VirtIO storage drivers, the operating system on the server immediately becomes aware of the new device size. There is no need to rescan the block devices from within the guest operating system.
You can verify this by using the blockdev
command in a shell session, querying the block device size in bytes:
$ openstack server ssh testsrv -- -l ubuntu "sudo blockdev --getsize64 /dev/vdb"
5368709120
Using the resized volume
Resizing a volume only resizes the block device, but does not touch any data structures using that block device. In our example, this means that in order to use the block device's expanded capacity, you must also resize its filesystem:
$ openstack server ssh testsrv -- -l ubuntu "sudo xfs_growfs /dev/vdb"
meta-data=/dev/vdb isize=512 agcount=4, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=524288, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 524288 to 1310720
Once this is complete, you can verify that the filesystem is now available at the desired (expanded) capacity:
$ openstack server ssh testsrv -- -l ubuntu "df -h /srv"
Filesystem Size Used Avail Use% Mounted on
/dev/vdb 5.0G 69M 5.0G 2% /srv