Potyczki z grub-em ;)
Dziś będzie wpis o tym jak zainstalować grub na innym dysku niż pierwszy (w sektorze MBR). Jako że jest to rzadka operacja, to postanowiłem sobie zapisać na przyszłość. Może innym też się przyda.
Sytuacja mamy taką:
dysk1 = sda (primary master) Windows
dysk2 = sdb (primary secondary) Linux
Dla zrozumienia wyjaśnię oznaczenia:
sda - hd0 (primary master)
sdb - hd1 (primary secondary)
sdc - hd2 (secondary master)
sdc - hd3 (secondary secondary)
Domyślnie instalator systemu proponuje instalację bootloadera w MBR na dysku pierwszym.
Nasze menu.lst w /boot/grub/ na świeżym systemie Linux (ubuntu 8.04) wygląda tak (wkleiłem tylko te najważniejsze linijki):
...
## default grub root device
## e.g. groot=(hd0,0)
# groot=(hd0,0)
title Ubuntu 8.04, kernel 2.6.24-18-generic
root (hd1,0)
kernel /boot/vmlinuz-2.6.24-18-generic root=UUID=80b87c41-e7db-44e1-b7c3-590a09220797 ro quiet splash
initrd /boot/initrd.img-2.6.24-18-generic
quiet
title Ubuntu 8.04, kernel 2.6.24-18-generic (recovery mode)
root (hd1,0)
kernel /boot/vmlinuz-2.6.24-18-generic root=UUID=80b87c41-e7db-44e1-b7c3-590a09220797 ro single
initrd /boot/initrd.img-2.6.24-18-generic
title Ubuntu 8.04, memtest86+
root (hd1,0)
kernel /boot/memtest86+.bin
title Microsoft Windows XP Professional
root (hd0,0)
savedefault
makeactive
chainloader +1
Tutaj wygląda wszystko w porządku, sytuacja się zmieni gdy chcemy bootloadera na innym dysku.
Należy zwrócić uwagę że grub traktuje dysk na którym jest zainstalowany bootloader jako pierwszy (hd0). Czyli np. jak zainstalujemy grub na /dev/sdc to ten dysk staje sie jako /dev/sda (hd0) dla gruba. Powyżej mamy sytuację gdzie na sdb mamy Lin, a na sda Windows. Należy przede wszystkim ustawić wpisy z (hd1,0) na (hd0,0) dla ubuntu:
title Ubuntu 8.04, kernel 2.6.24-18-generic
root (hd0,0)
kernel /boot/vmlinuz-2.6.24-18-generic root=UUID=80b87c41-e7db-44e1-b7c3-590a09220797 ro quiet splash
initrd /boot/initrd.img-2.6.24-18-generic
quiet
title Ubuntu 8.04, kernel 2.6.24-18-generic (recovery mode)
root (hd0,0)
kernel /boot/vmlinuz-2.6.24-18-generic root=UUID=80b87c41-e7db-44e1-b7c3-590a09220797 ro single
initrd /boot/initrd.img-2.6.24-18-generic
title Ubuntu 8.04, memtest86+
root (hd0,0)
kernel /boot/memtest86+.bin
quiet
Dla systemu Windows musimy wykonać “mapowanie” jako że wcześniej hd0 już mamy zarezerwowane dla Linuksa w bootloaderze. Będzie to wyglądać tak:
title Microsoft Windows XP Professional
map (hd0,0) (hd1,0)
map (hd1,0) (hd0,0)
rootnoverify (hd1,0)
chainloader +1
i na koniec zaktualizować bootloader poleceniem:
$ sudo update-grub
wyświetli się nam coś w tym stylu:
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /boot/vmlinuz-2.6.24-18-generic
Found kernel: /boot/vmlinuz-2.6.24-16-generic
Found kernel: /boot/memtest86+.bin
Updating /boot/grub/menu.lst ... done
Po zabootowaniu systemu wszystko jest tak jak dawniej, czyli Lin jest na /dev/sdb, a Win na /dev/sda
Takich sztuczek (zamiana hd1 na hd0) nie wymaga gdy używamy lilo. Natomiast mapowanie dla Windows jest konieczne.