Install normally locally onto hardware or in a VM.
Boot with a Live CD such as gparted, finnix, knopix, etc and shrink partition to minimum.
Create swap and root images.



Create Finnix profile.

Boot Finnix profile, set a root password and start up sshd.

Boot Finnix on source system, and dd to Finnix on your Linode via SSH.
Destination is /dev/xvdb for Xen or /dev/ubdb for UML Linodes.

Wait a (possibly) long while.

Once complete mount system from Lish.

Edit fstab, root and swap should be /dev/xvda and /dev/xvdb for Xen and /dev/ubda and /dev/ubdb for UML.

If not using upstartd:
edit /etc/inittab comment out all gettys but one. Leave one getty on /dev/tty1 for Xen and /dev/tty0 for UML.
If using upstartd:
In /etc/event.d remove all tty files except tty1. If you are on UML rename tty1 to tty0 and change every occurrence of tty1 to tty0 inside the file.

Check that /mnt/xvdb/dev (/mnt/udbb/dev) looks complete, if not chroot to the mountpoint and MAKEDEV it. Syntax for MAKEDEV may vary slightly by distro.
mknod xvda b 202 0
mknod xvdb b 202 16
mknod xvdc b 202 32
mknod xvdd b 202 48
mknod xvde b 202 64
mknod xvdf b 202 80
mknod xvdg b 202 96
mknod xvdh b 202 112

If your distro is using udev (most these days are), cd to /mnt/xvdb/etc/udev/rules.d and open the file that creates the persistent network rules, usually 75-persistent-net-generator.rules.
modify this line so that it does not create persistent rules for eth*. In this case we simply removed eth* from the beginning of the kernel white-list.

Remove any rules that were auto generated already. In this case /mnt/xvdb/etc/udev/rules.d/70-persistent-net.rules.

Create a profile for booting your custom distro.

Boot and enjoy \o/.