In theory, Ubuntu should work with all your hardware in either BIOS/CSM/legacy mode or in EFI/UEFI mode. In practice, there are sometimes incompatibilities with one boot mode or the other, but those are pretty rare. Sometimes you can work around them by passing particular kernel options, but you'll need to research the specific hardware and problems to track down such details. You don't specify what version of Ubuntu you're trying to install, so if you're trying something old (like Ubuntu 14.04 GA), you might try something more recent (like 14.04.5, 16.04.1, or even the 16.10 testing version). The newer kernels in the latest releases might fix the problems you're having.
Switching between two OSes that are installed in different boot modes (BIOS vs. EFI) is possible, but I know of only two ways to manage this:
- The computer's built-in boot manager -- Most EFI-based computers have a built-in boot manager that can handle this task. Details vary from one computer to another, though. Typically, you access it by hitting Esc, Enter, or a function key at startup (what key varies from one computer to another). In your scenario, the computer will probably show options for Windows, one or both of your hard disk, and perhaps other things. You'd pick the Windows option to boot Windows in EFI mode, of course, and the option for the disk on which Ubuntu is installed to boot Ubuntu.
- My rEFInd boot manager -- AFAIK, this is the only add-on boot manager that can launch BIOS-mode boot loaders on an EFI-based PC that's booted initially in EFI mode. (Booting an EFI-mode boot loader from BIOS mode is possible with the help of UEFI DUET or the Clover boot loader, but those are way too hackish and awkward for your situation.) By default, rEFInd disables its BIOS-mode boot loader support on UEFI-based PCs. To enable this support, you must edit
refind.conf
: Uncomment the scanfor
line and add hdbios
to the list of options. You may also need to uncomment the uefi_deep_legacy_scan
option, although I recommend trying without that option first. When configured in this way, rEFInd's menu will show you options for Windows, for one or all of your hard disks, and perhaps others. You can test rEFInd by using the USB flash drive version before installing it to your hard disk, if you like. One caveat: A few (mostly very early) EFIs lack the CSM feature that rEFInd uses to launch BIOS-mode OSes, so rEFInd won't do you any good on such computers.
Note that the EFI version of GRUB cannot chainload to a BIOS-mode boot loader, the BIOS-mode version of GRUB cannot chainload to an EFI boot loader, and neither version of GRUB can directly boot a Windows kernel. Thus, you cannot use GRUB to do what you want (although you could with both OSes installed in the same mode).
If you decide to use rEFInd, you may want to install it from Windows, but be sure to not install the Linux filesystem drivers that come with it. If you install the Linux filesystem driver for the filesystem that holds your kernel, rEFInd will probably detect the Linux kernel and create an entry to boot it directly; but if EFI-mode booting is not working for you, that entry will be useless. Thus, omitting the driver will help keep rEFInd's display uncluttered. (Note that the USB flash drive version of rEFInd includes the filesystem drivers, so it will probably present such an entry. You might as well try it; there's a slim chance it will work better than GRUB at handling your hardware, in which case you can install rEFInd from within Ubuntu and then forget about all the BIOS-mode hackishness.) If you see BIOS-mode boot entries for two disks, you can remove the one you don't want by using the dont_scan_volumes
option in refind.conf
to blacklist the entry that doesn't work.
Note that some EFIs have problems booting in BIOS mode from GPT disks. This problem is rare, but if you run into it, you might need to use MBR partitioning for the Ubuntu disk. Otherwise, Ubuntu is happy to boot in BIOS mode from either GPT or MBR; but you should create a BIOS Boot Partition (bios_grub
flag set in parted
or GParted; type code EF02 in gdisk
) of ~1MiB if you use GPT.