TL;DR:
IF you use Geerling's rpi-clone tool, THEN DON'T name your new root partition, let it do all the config by UUID,
AND if you have NVMe on a dual-device board, through a PCIe-switch chip, then your ONLY option is to boot from RasPi OS, because Ubuntu 24.04 LTS simply won't work through that: they configured the kernel to not be capable of it.
( didn't bother trying 25.10, because on the destop, Lubuntu 25.10 CAN'T INSTALL build-essential PACKAGE, so that breaks EVERYthing for my learning-programming machine, & I need both to be using the same OS, version-included, so I don't get driven mad by UX-inconsistencies : )
This took waaay too long to figure-out, so I'm putting it here for others, so you don't have to bash your brain against the damn wall, like I did.
Geerling's rpi-clone tool, available from geerlingguy's github,
# Install rpi-clone.
git clone https://github.com/geerlingguy/rpi-clone.git
cd rpi-clone
sudo cp rpi-clone rpi-clone-setup /usr/local/sbin
# Clone to the NVMe drive (usually nvme0n1, but check with `lsblk`).
sudo rpi-clone nvme0n1
has a gotcha: if you name the new root-partition, then it won't be able to mount it, in my experience.
Once named, that root-partition can't be mounted when booting from NVMe, by /dev/nvme0n1p2, not by LABEL=whatever. ( didn't try UUID mount )
You need to have it identical in your linux-kernel cmdline.txt ( which is in your /boot/firmware/ dir, aka your 1st-partition ) and in your /etc/fstab ( which is in your 2nd partition ).
That took ages to learn, too.
Let the rpi-clone util have NO name for the new root partition, & then it'll correctly give UUID identifiers to both of those files, for your new root.
Then it'll work in Raspberry Pi OS.
However, nothing one does can get Ubuntu's 24.04 LTS to boot from dual-device/PCIe-switched NVMe adapter/"hat": apparently Ubuntu pruned-out the kernel's ability to work through a PCIe-switch, breaking all dual-NVMe-adapter-boards from being able to work.
( updated-system is current @ 2026-04-02, in case they update it in the future )
I'd wanted to someday switch to BTRFS raid1, but .. that's impossible, unless remaining in RasPi OS, which I don't want to do, because too many things consider Ubuntu to be the only default-config.
As Torvalds identified: it's hell to make an app work with multiple distros, due to too-little being standard between them all, hence the "just do Ubuntu" paradigm that's substituting for app-developer's standard..
( & snaps/flatpaks are usually x86_64 only, ttbomk, so that doesn't help, either )
Yeah, I know, Arch's got a Rpi4 ( or greater ) version, & yes, I've tried it,
but I really want to stop doing sysadmin, & just do learning Haskell, THE programming-language for developing one's ability to think & to prevent-bugs in programs, if done correctly.
( no side-effects-distributed-throughout-the-entire-codebase, pure-functional, & type-level programming all contribute to that )
May you not hit all the damn corner-cases in the world,
_ /\ _