2 min read

Moving Ubuntu from SSD to NVMe (mostly online) with LVM

Moving Ubuntu from SSD to NVMe (mostly online) with LVM

This is mostly notes to my future self however it may also help someone else.

So to set the scene, I run most of my self-hosted services on a single server at home. Previously this was an Intel NUC6CAYH with the OS on a 2.5" SSD. Almost a year ago I picked up a Lenovo P330 Tiny to replace this NUC. It came with a 500GB NVMe. Anyway, when it arrived, I moved the SSD over and my system was moved. I now wanted to utilse the 2.5" slot for other purposes and that brings me to wanting to move the OS from the SSD to the NVMe drive.

I could have used pvmove but I wasn't 100% confident, as like it's name suggests moves the data. I didn't know what this would look like had things failed.

TL;DR

Note: My SSD was /dev/sda and the new NVMe is /dev/nvme0n1

  1. Created 3 partitions to match /dev/sda: 512MB, 1024MB and the rest for LVM
$ sudo cfdisk /dev/nvme0n1

2. Created PV from 3rd partition

$ pvcreate /dev/nvme0n1p3

3. Added the NVMe to vg0

$ vgextend vg0 /dev/nvme0n1p3

4. List the devices (I forget what this looked like)

$ lvs -a -o name,copy_percent,devices

5. This is the good bit, here we mirror vg0/system also onto our nvme PV. The command will hang until complete, but I found Ctrl-C seems safe

$ lvconvert -m1 --type mirror --mirrorlog mirrored --alloc anywhere vg0/system /dev/nvme0n1p3

6. Monitor that the copy has completed

$ lvs -a -o name,copy_percent,devices

7. Once happy, I then split off the /old/ PV: /dev/sda3 to an LV called system_old.

$ lvconvert --splitmirrors 1 --name system_old vg0/system /dev/sda3

That was roughly it, as I said this is more of a memory jog if I need to handle it again in the future. There were some missing commands to fully remove /dev/sda3 from the pv but I can't remember what they were.

The other bit was moving /boot/ and /boot/efi which was little more than dding the old partitions to the new ones. Some how I didn't need to mess around with efibootmgr the machine just booted. One thing I would do next time is create a larger /boot/ next time, 512mb can be a struggle with more than one kernel.