You have three choices: you can have Grub treat FreeBSD as some unknown OS and chainload FreeBSD's stage 1 bootloader, or you can have Grub load FreeBSD's stage 2 bootloader, or you can have Grub load the FreeBSD kernel.
Chainloading
This is the simplest and most reliable method. All you need is to install the FreeBSD bootloader on its own slice (what *BSD calls a slice is what Linux and Windows call a partition). Then Grub should find it automatically (via /etc/grub.d/30_os-prober) when you run update-grub. The entry in /boot/grub/grub.cfg would look like this (if FreeBSD is on /dev/sda2 a.k.a. /dev/wd0s2):
menuentry "FreeBSD" {
set root=(hd0,2)
chainloader +1
}
Loading a FreeBSD bootloader or kernel
Grub2 currently supports all major BSD kernels (assuming your computer boots from BIOS). The installation scripts don't (at least the ones shipped with Ubuntu 10.04, I haven't checked 11.04), so if you choose this route, you'll have to add your own entries via /etc/grub.d/40_Custom.
Here are sample entries from David Marec on the FreeBSD forums. I haven't tested them but they look plausible. The best method seems to be to load the FreeBSD stage 2 bootloader. You can specify the location of the FreeBSD installation as a disk number, slice number and partition a:
menuentry "FreeBSD (/boot/loader)" {
insmod ufs2
set root=(hd0,1,a)
kfreebsd /boot/loader
}
or by searching a filesystem with a certain UUID, file or label:
menuentry "FreeBSD (/boot/loader)" {
insmod ufs2
search --no-floppy --file /boot/loader
kfreebsd /boot/loader
}
ddto put it on the USB stick. It starts into a text based installer. – Azendale Jul 18 '11 at 14:30