dd can copy block by block from one block device to another
ddrescue can do the same, but will handle errors better
e2image understands ext2/3/4 filesystems and can copy only the blocks in use, which can really help (though don't know how it works if it encounters an error)
The correct abstraction is that a file is a device. A file is a section of a hard disk which behaves like a whole disk. It also happens to be expandable.
cp's default behaviour for device files also happens to be very stupid.
$ cp /dev/nvme0n1p1 /mnt/my-special-backup
?