How to grow ext4+lvm+LUKS+RAID

Here are some instructions for how to grow ext4+lvm+LUKS+RAID storage.

NOTE: If you can stop the array and are only growing (and not moving) the partition, you can modify all drives at once. Otherwise you will need to do one disk at a time with a resync after each disk is done. Detailed instructions here. These instructions are only for growing partitions on existing disks, you will need to adjust if you are doing something different.

unmount the partition

umount /dev/mapper/vg_hostnameX-lvol

stop the vg (assuming other lvols in that vg are unmounted)

vgchange -a n vg_hostnameX

stop the crypt

(use pvs to determine which device for the vg)

cryptsetup luksClose /dev/mapper/mdX_crypt

initialized the new space

we want to random fill the space we will add, we do this by adding a temporary partition, filling it with random data, and then deleting it (this page claims that deleting a partition on an SSD does not result in a TRIM operation, so the random data should be left)
For each disk

fdisk /dev/sdX # add additional partition
partprobe /dev/sdX
dd if=/dev/urandom of=/dev/sdXN+1
fdisk /dev/sdX # delete the added partition
partprobe /dev/sdX

debian-installer has a faster way of doing this, it creates a throw-away LUKS on the device , writes data to it, and then deletes it. It would be nice to have that as a stand-alone tool.

extend the partitions and raid

(use /proc/mdstat to determine the devices in the raid array)

NOTE: read note at top, these instructions are only for growing

If you are using write intent bitmaps you will need to remove them before growing and then re-add them (make sure you have the bitmap settings recorded)

mdadm --grow /dev/mdX --bitmap none

extend the partitions

fdisk /dev/sdX # extend partition
fdisk /dev/sdY # extend partition, repeat for additional disks
partprobe /dev/sdX
partprobe /dev/sdY

grow the RAID and after it’s finished re-add the bitmap

mdadm --grow /dev/mdX --size=max
mdadm --wait /dev/mdX
mdadm --grow /dev/mdX --bitmap internal

If you are creating a new array

  • create the partitions you need with fdisk
  • create the array with something like: mdadm --create /dev/md4 --raid-devices=2 --level=raid1 --bitmap=/boot/md4_bitmap --bitmap-chunk=128M /dev/sde1 /dev/sdf1

start and resize the crypt

cryptsetup luksOpen /dev/mdX mdX_crypt
cryptsetup resize mdX_crypt

extend the pv/vg/lvol and activate

pvresize /dev/mapper/mdX_crypt
lvresize -L +sizeG /dev/mapper/vg_hostnameX-lvol # where size is how much you are adding, or
lvresize -l +100%FREE /dev/mapper/vg_hostnameX-lvol # to extend the lvol to use the rest of the space in the vg
vgchange -a y vg_hostnameX

force a filesystem check, to be sure it’s clean before extending

fsck.ext4 -C0 -f /dev/mapper/vg_hostnameX-lvol

extend the filesystem and remount

resize2fs /dev/mapper/vg_hostnameX-lvol
mount /dev/mapper/vg_hostnameX-lvol


You’re done! Use df to ensure the filesystem is the correct new size.