Bootloader Chameleon, particiones activas y Windows
Este post trata sobre las complicaciones que las particiones activas generan entre Chameleon y Windows.
Una brevísima introducción de Chameleon antes de entrar en materia:
Un bootloader es el programa que carga el sistema operativo al encender el ordenador, transfiriendo el control al kernel. El bootloader de Windows es NTLDR (NT loader); el de Mac OS X, BootX; y el de Linux suele ser GRUB.
Apple sólo permite ejecutar Mac OS X en hardware propio. Chameleon es un bootloader, basado en otro llamado Boot-123, que elimina esta restricción. Permite cargar copias originales de Mac OS X, evitando la necesidad de una instalación previamente modificada, como se hacía con JaS, Kalyway, o Leo4All por ejemplo. Esto supone una importante ganancia en comodidad, puesto que podemos instalar nuevas versiones de Mac OS X en cuanto salgan a la venta, sin esperar a que alguien cree una distribución específica para una versión concreta.
El problema
Chameleon siempre carga la partición activa (flag boot), en la que se debe situar Mac OS X. El problema viene cuando Windows está presente en otra partición del mismo disco duro. Windows necesita que la partición en la que esté instalado sea la activa. De lo contrario, no funcionará hybrid sleep, no podremos instalar el Service Pack 1, ni tampoco crear imágenes de backup del sistema operativo. En situación me encontraba yo. He encontrado tres soluciones:
Soluciones
-
Instalar GRUB2, y utilizar el comando parttool.
-
Pequeña modificación en el código de Chameleon.
-
Iniciar el kernel de Mac OS X directamente desde GRUB2, gracias al soporte XNU, sin ningún otro bootloader intermedio. En este link se puede observar un usuario que lo ha logrado. Carga las extensiones necesarias para arrancar el kernel en hardware que propio de Apple. No cubro esta opción porque, a pesar de ser muy interesante, es compleja y no la he probado.
Solución 1: Grub2 y parttool
Navegamos a /etc/grub.d, y a continuación:
En el fichero 30_os-prober, añadimos parttool (hdX,Y) boot+
a la entrada de Windows (donde X e Y son el disco y la partición correspondiente):
menuentry '$(echo "${LONGNAME} $onstr" | grub_quote)' --class windows [...] {
[...]
parttool (hdX,Y) boot+ # Añadimos esta línea
chainloader +1
}
Añadimos una entrada que cargue el bootloader de Chameleon. Puede que esto sorprenda al lector, puesto que GRUB ya escribe automáticamente dos entradas para Mac, llamadas Mac OS X (32-bit) (on /dev/sdXY)
y Mac OS X (64-bit) (on /dev/sdXY)
. Éstas inician directamente el kernel de Mac OS X, pero están pensadas para hardware propio de Apple, y por tanto no cargan las extensiones que necesarias para hardware no propio (como sí hace la Solución nº3), por lo que no nos sirven. Por eso, tenemos que construirla manualmente. Editamos el fichero 40_custom:
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
menuentry "Mac OS X Chameleon"{
set root=(hdX,Y)
parttool (hdX,Y) boot+ # Aquí también tenemos parttool
multiboot /boot
}
Después, ejecutamos
grub2-mkconfig -o /boot/grub2/grub.cfg
Hemos añadido «parttool» tanto a las particiones de Windows como a las de Mac OS. parttool es el equivalente a «makeactive» en GRUB1. Establece la partición seleccionada como activa, de manera que será la de Windows o Mac según carguemos uno u otro sistema operativo.
Este método es fácil pero no muy elegante, puesto que sería más razonable que la partición activa fuese siempre la misma, cosa que sí se consigue en las Soluciones 2 y 3.
Solución 2: Pequeña modificación en el código de Chameleon
Este método está basado en la información que entontré en este link:
Wrong system booted by default
Problem: On a system with multiple OSes, boot wants to boot the wrong (non-PureDarwin) one by default. This happens when a non-HFS+ partition (e.g., FAT32 or NTFS) has the bootable («active») flag and comes before the HFS+ partition that contains PureDarwin.
Solution: Modify boot so that it uses the first HFS+ partition instead of the first partition with the bootable («active») flag:
In boot-132/i386/lib/libsaio/sys.c
, comment the following line:
for ( bvr = chain; bvr; bvr = bvr->next )
{
if ( bvr->flags & kBVFlagNativeBoot ) bvr1 = bvr;
// if ( bvr->flags & kBVFlagPrimary ) bvr2 = bvr;
}
Modificación del código y compilación
-
Instalar XCode (para compilar) y los command line tools (para el comando svn)
-
Descargar los fuentes de Chameleon. Para ello, en la terminal:
svn co http://forge.voodooprojects.org/svn/chameleon/trunk
Es importante obtener la última versión desde el repositorio Subversion, porque el link que aparece en la página oficial de Chameleon es más antiguo y no funciona bien al compilar en XCode 4.6.3.
-
Comentar la línea. En Chameleon la ruta es trunk/i386/libsaio/sys.c, y el código es ligeramente distinto:
/*
* Use the standrad method for selecting the boot volume.
*/
if (foundPrimary)
{
for ( bvr = chain; bvr; bvr = bvr->next )
{
if ( bvr->flags & kBVFlagNativeBoot && bvr->biosdev == gBIOSDev ) bvr1 = bvr;
// if ( bvr->flags & kBVFlagPrimary && bvr->biosdev == gBIOSDev ) bvr2 = bvr;
}
}
-
Compilamos Chameleon. Para ello, nos situamos en el directorio
trunk
y ejecutamos:
make clean && make
Instalación del código compilado
-
Tomamos nota del disco duro (que será
/dev/disk0
si sólo tenemos uno), y de la partición de Mac OS X:
diskutil list
En mi caso es /dev/disk0
:
JBMs-imac:~ JBM$ diskutil list
/dev/disk0
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *250.1 GB disk0
1: Windows_NTFS Seven 83.9 GB disk0s1
2: Apple_HFS Macintosh HD 31.5 GB disk0s2
3: Windows_NTFS Datos 103.3 GB disk0s4
4: Linux 8.6 GB disk0s5
5: Linux 22.9 GB disk0s6
-
Copiamos el fichero
boot0
en el MBR:
cd /trunk/sym/i386
./fdisk440 -f boot0 -u -y /dev/rdiskX
Sustituimos /dev/rdiskX por el disco duro que anotado en el paso anterior, añadiendo una «r» inicial. Para /dev/disk0
utilizamos /dev/rdisk0
; para /dev/disk1
, /dev/rdisk1
-
Copiamos el
boot1h
en el primer sector de la partición (también conocido como Volume Boot Record, Partition Boot Record, Partition Boot Sector…):
dd if=boot1h of=/dev/rdiskXsY
Sustituimos /dev/rdiskXsY por la partición que anotamos anteriormente, añadiendo nuevamente la «r» inicial. Para disk0s1, rdisk0s1; para disk0s2, rdisk0s2…
-
Copiamos el fichero
boot
en el directorio raíz de la partición Mac OS X:
cp boot /
Windows como partición activa
-
Ejecutamos
diskutil list
y tomamos nota de la partición en la que Windows esté instalada. Para localizarla, nos fijamos en que la columa TYPE indique Windows_NTFS. En mi caso tengo dos de este tipo, una para el sistema operativo y otra para datos. Para localizar la del sistema operativo, podemos comprobar el orden, si es que lo conocemos previamente, el tamaño, o el label (columna NAME), si es que hemos etiquetado las particiones con anterioridad.
-
Entramos en el modo interactivo de fdisk para nuestro disco duro:
./fdisk440 -e /dev/diskX
-
Establecemos la partición de Windows como activa:
f X
donde X será el número (sólo el número) de la partición de Windows. Por ejemplo: para /dev/disk0s1, X será 1; para /dev/disk0s2, X será 2 …
-
Escribimos los cambios:
write
exit
-
Reiniciamos. Deberíamos poder arrancar Mac OS X.
Un aspecto importante a considerar es que este método selecciona la primera partición HFS+ encontrada. En caso de tener varias, se cargará la que esté primero en la tabla de particiones. Si por ejemplo disponemos de una para Mac OS X y otra para datos, la del sistema operativo tendrá que ser la primera.
GRUB junto a Chameleon
Si después de instalar Mac OS X hacemos lo propio con Linux, el bootloader GRUB reemplazará a Chameleon. Si en esta situación queremos aplicar el procedimiento anterior y a la vez conservar GRUB, tan sólo tendríamos que omitir el paso 2 de la sección «Instalación del código compilado», es decir, no copiar boot0
en el MBR. Por supuesto, también tendríamos que añadir la entrada de Mac OS X mostradas en la Solución 1.