Este é realmente um cenário muito mais complicado do que parece a princípio, devido à tendência irritante que quase todos os BIOSs têm de reordenar como eles apresentam unidades de modo que a unidade da qual você inicializou é sempre a "primeira" unidade; é também o que alguns bootloaders (como os da Microsoft) esperam (ou seja, as coisas não funcionarão corretamente se você tentar encadear no Windows se parecer que a unidade que contém o Windows não é a "primeira" listada pelo BIOS). Você não consegue esse problema ao inicializar a partir do CD porque os CDs são tratados separadamente dos discos rígidos e não mudam a ordem. Há também o fato de que pode haver mais de uma unidade interna para escolher, portanto, você deve ser capaz de selecionar qual delas deseja inicializar nesse caso.
Para isso, o Ubuntu tem uma mudança no grub-mkconfig, de tal forma que a configuração GRUB_TIMEOUT em / etc / default / grub é ignorada, a menos que outro SO seja detectado (com a idéia de que se você não tiver outro sistema operacional, o computador deve inicializar mais rápido, não esperando no menu do grub, a menos que você segure a tecla Shift). A solução abaixo lida com todos esses problemas e espero ter comentários suficientes para deixar claro o que está sendo feito.
Execute gksudo gedit /boot/grub/custom.cfg
e copie e cole o seguinte:
# Set grub's timeout to 5 secons. By setting it here we are overriding any
# settings for the timeout in /etc/default/grub. This is to be sure that we get
# a five second timeout even if Ubuntu's grub-mkconfig thinks it's the only
# Operating System and disables showing of the menu.
timeout=5
insmod regexp
# Grab just the drive portion of $prefix, to determine what drive we booted
# from.
# The third parameter in the following command is a regular expression which
# says to capture just the "hdX" portion of a prefix like
# "(hd1,msdos5)/boot/grub". Note that the parentheses in the regular expression
# denote what needs to be captured (like in perl and most other regular
# expression engines), they're not the parentheses that denote a device in grub.
regexp --set=current_drive '(hd.)' "$prefix"
# Loop through all drives (but not partitions)
for drive in *; do
# If the drive is the same as the one we're booted from just continue on to
# the next without creating a menu entry for it.
if [ "$drive" = "(${current_drive})" ]; then
continue
fi
# Make a menu entry with the device name of the drive in the title
menuentry "Chainload $drive" "$drive" {
drive=""
root="$drive"
# Swap the drive currently designated as (hd0) with the drive we want to
# chainload. Thus the drive we are about to chainload will appear to be the
# first drive to the bootloader we chainload.
drivemap -s "(hd0)" "$drive"
chainloader +1
}
done
Depois salve o arquivo e pronto.
Ao inicializar, se houver outras unidades disponíveis para serem carregadas em cadeia, você verá entradas de menu para elas (e, se não houver, você não verá). A entrada do menu padrão permanecerá inalterada, o que significa que o Ubuntu deve inicializar por padrão e você terá um tempo limite de 5 segundos antes que isso aconteça. Como você está editando o /boot/grub/custom.cfg em vez de /etc/grub.d/40_custom, nem precisa executar o update-grub.