Fast Virtio VM
This page explains a way to build a blazing fast Gentoo VM under KVM using Virtio and mdev.
Use a fast computer!
No really, this is probably the most important thing of all, don't expect a 2 second booting VM if you are on a P3 with a slow IDE disk. This tutorial is Build on a CentOS 6.2 KVM HypverVisor on a Dual QuadCore Xeon 2.4Ghz with 8 (v)CPU's and 2GB RAM assigned to the VM. The disk file is on an SSD (Old Intel x25-M 80GB, so their is more to gain if you use a faster SSD).
It has the fastest mount time.
Compile your kernel with:
- VirtIO support
- Hugetlb support
- NO usb support (Unless you plan to passthrough USB from the host).
- NO HID support (see above).
- NO extended video/device drivers/filesystem drivers you don't use. (duh)
- NO fuse support (Slow...)
- NO modules (Slower...)
Kernel boot options
noapic (APIC is for hardware management, and since we are in VM and the hardware is managed by our host, we don't need it). notsc (TSC is CPU clock synchronization, not needed in a VM). Because they cannot be removed from the kernel itself, no need these as kernel boot options.
Use a Static IP
DHCP is f* slow.
Replace udev with mdev (BusyBox), udev is dead slow vs mdev.
Remove useless mdev devices (tun,tap, all sound, hd*, sd*, fd*, md*, grsec(*), zap, dvb, v4l stuff)
Prelink all binaries, (emerge prelink -> prelink -amRf)
use rc-update to delete all non-essential daemons(git, consolefont,devfs,keymaps,modules,sysfs,swclock,staticroute)
Use tmpfs for /tmp and /var/run (will not necesarrily speedup boot, but if you have startup services that use /tmp heavilly, it might help)
I created my own boottime init script, which echoes the current kernel uptime. Please keep in mind that all of this is without *any* dirty tricks like initrd or initramfs. It's just static sequential boot. Even using parallel start of services (thru RC_PARALLEL="yes") would slow down the system.