lunes, 7 de enero de 2013

Ida y vuelta de grub4dos a grub2

Hace un tiempo (cuando todavía tenía cuenta en twitter) tuve un intercambio con @L_maga para ayudarla a poner una caja de contacto en un blog. Encontré una forma indirecta de hacerlo vinculando una tabla de google docs a una caja de texto, y mandando las notificaciones de actualización a mi correo. No llegué a saber si @L_maga pudo hacerlo, creo que mi entusiasmo por el tema fue mayor que el suyo.
De ese experimento surgieron un par de cosas interesantes y mucho spam. Interesante fue la búsqueda de nickoo para instalar desde imágenes vhd con winntsetup que quedó en los comentarios de este otro post, y la pregunta de nabla que da origen a éste. Les transcribo el intercambio para meternos en el tema:
Nabla:  Estoy intentando (sin éxito) cargar grub4dos desde un grub2 de un ubuntu 12.04, para desde disco duro (alojandolo en el c: de windows) poder cargar esa magnífica utilidad que es supergrubdisk, tu script lua boteador de isos, etc.Sin embargo, no lo consigo (me imagino que por diferencias en la sintáxis). He consultado en internet (consulta boot grub4dos from grub 2)y en algunos sitios se traspasa el menu.lst de grub4dos por la opción --config-file, otros con configfile, otros ponen comillas, otros no, otros utilizan la configuración de discos (hdx,msdosx), y una largo etc, etc. de variaciones para el archivo de configuración grub.cfg. No he logrado ninguna combinación válida de arranque combinando todo lo anterior.Te animo a que investigues y que publiques con éxito la sintáxis correcta.
Saludos y espero que puedas continuar con este interesante blog.
Se despide. Un fan."
486 Gracias! Te dejo una respuesta en forma de post: El iso booter maneja eso de ir y volver entre grub4dos y grub2, con dos métodos no muy elegantes pero efectivos al fin. Para salir de grub4dos a grub2 carga la iso de supergrubdisk (eso es malísimo, pero grub2 es bastante mañoso si se desempaqueta) desde el grub.cfg
Para bootear las isos desde grub2 es necesario volver a grub4dos. En realidad, el grub2 sólo me sirve porque tiene intérprete de un lenguaje parecido al C (LUA), y cada entrada del menú con las isos vuelve a un grub4dos con su configuración pasada por parámetros.
Lo que estás buscando está en el archivo m.lua, que construye el menú con las ISOs con esta forma:
search -f --set /grub.exe 
linux /grub.exe

es decir, busca el archivo grub.exe (el ejecutable para DOS de grub4dos) y pone el disco en el que está grub.exe como root, y después lo pone como kernel (llamado linux en grub2) para bootear. La diferencia con m.lua es que ahí también se pasa como parámetro una configfile (la que carga la ISO), pero supongo que si tenemos en la raíz del mismo disco que grub.exe el archivito menu.lst debería funcionar igual. Por las dudas explicito cómo quedaría la línea para cargar el supergubdisk:
search -f --set /grub.exelinux /grub.exe --config-file=\"root (hd0,0); map /iso/sgd.iso (0xff) || map --mem /iso/sgd.iso (0xff); map --hook; root (0xff); chainloader (0xff)\"
Suerte, no dudes en preguntar.486
PD: si tengo tu autorización, me gustaría publicar tu carta (no tu correo, por supuesto) y esta respuesta como post (después de chequear las configuraciones por parámetro o por menu.lst). Avisá si no tenés problema.
Nabla: Entiendo que la entrada para grub2 en el grub.cfg sería por ej. (cambiando a mi configuración de disco (hd1,1) - Disco dos partición 1 (creo que en grub 2 el disco empieza por 0 y la particón por 1)
search -f --set /grub.exelinux /grub.exe --config-file=\"root (hd0,0); map /iso/sgd.iso (0xff) || map --mem /iso/sgd.iso (0xff); map --hook; root (0xff); chainloader (0xff)\"
menuentry "Grub4DOS"{
search -f --set /grub.exelinux /grub.exe --config-file=\"root (hd1,1); map /iso/sgd.iso (0xff) || map --mem /iso/sgd.iso (0xff); map --hook; root (0xff); chainloader (0xff)\"

Probaré esta entrada con las variaciones de disco, aunque no se si puede dar problemas la utilización de linux16 y linux, y por la configuración de disco (en algun post explican que para cargar kernel linux no "reales" hablan de utilizar linux16), de todas formas lo probaré.
Si consigo arrancar sgd.iso te lo notificaría para poder postearlo como post, por mi no hay problema.
Saludos 
486: Si, la entrada en el menú quedaría como vos decís (agregando la llave de cierre, claro). Y me faltó aclararte que las isos deben ir en un directorio /iso en el mismo disco en el que ponés grub.exe. Yo uso bastante el ISObooter (si no lo uso yo entonces quien, no?), sobre todo ultimamente para bootear el hirens13 o algún disco de recuperación de w7, y no me trajo problemas. Supongo que es sobre todo porque una vez que carga el kernel al que hace chainload el grub4dos desaparece del mapa (de memoria).
Otra precisión: no se como maneja el grub2 las particiones, por eso uso search para poner el root automágicamente; pero grub4dos empieza a contar desde (hd0,0) y eso es lo que importa porque de las comillas en adelante le estamos pasando parámetros a grub4dos y no a grub2. Disco 2 partición 1 sería (hd1,0). O se puede usar una solución mas elegante y reemplazar root (hd0,0) con find --set-root /grub.exe, que hace lo mismo que search -f --set /grub.exe en grub2
 Acá se cortó la cadena de mails, pero la idea de buscar cómo se hacía quedó implantada (si, volví a ver inception hace poco, con mis hijas) hasta que encontrara el tiempo de probar lo que le aconsejé a nabla.

Y por supuesto, no funcionó. 
En primer lugar porque en grub2 no hay que modificar el archivo /boot/grub/grub.cfg, éste se genera automáticamente a partir del contenido de los archivos en /etc/grub.d/ cuando hacemos sudo update-grub (proceso que también corre cuando el sistema actualiza el kernel, llevándose puestos nuestros cambios manuales). Así que en vez de hacer lo que le dije a nabla que había que hacer, lo que tenemos que hacer para agregar una entrada personalizada al menú de grub2 es modificar el archivo /etc/grub.d/40_custom (sudo gedit /etc/grub.d/40_custom), que es como su nombre lo indica, el lugar para las entradas personalizadas. Como acá queremos agregar grub4dos el contenido a agregar debajo de las líneas existentes sería:

#sgd

menuentry "Grub4Dos"{
search -f --set /grub.exe
linux /grub.exe --config-file=/m.lst


suponiendo que grub.exe y m.lst esten en la raíz de alguno de los discos, y nuestro archivo de configuración sea m.lst. (verán que desistí de pasar la configuración por parámetro entre comillas, no pude hacer que grub4dos la reconozca). Luego debemos correr sudo update-grub para que se genere el grub.cfg. Para los mas obsesivos, esto también sirve para tener varios archivos de configuración distintos (m.lst, n.lst etc), y agregar así directamente las distintas configuraciones de grub4dos a grub2.

Con eso cargamos grub4dos. Si lo que queremos es el superIsoBooter (sin pisar nuestro boot con el instalador) lo más práctico es crear a mano la carpeta /iso, copiar m.lua a la raíz del mismo disco que tiene grub.exe (yo los tengo en (hd0,0), si lo prueban en otra avisen) y agregar a m.lst (o menú.lst, si ese es su archivo de configuración) las líneas para cargar la iso de SGD:

title SuperGrubDisk ISO

find --set-root /iso/sgd.iso
map /iso/sgd.iso (0xff) || map --mem /iso/sgd.iso (0xff)
map --hook
root (0xff)
configfile /grub4dos.lst || chainloader (0xff) 

Así tendremos en nuestro boot de ubuntu 12.10 (grub 2.0, supongo que el mismo que trae ubuntu 12.04) la entrada para cargar grub4dos con todos sus juguetes, incluyendo por supuesto el SuperIsoBooter. 
BTW, Slax7 corre de maravilla desde ahí.

Enjoy!

PD1: Nabla, si andás por ahí comentá tu experiencia.
PD2: Si son fans de la hibernación como yo, les aconsejo poner todo lo de grub4dos en una partición de windows y acordarse de desmontarla antes de hibernar.
PD3: es una buena práctica agregar al archivo de configuración de grub4dos un retorno al menú original de ubuntu, lo que nos ahorra un reinicio si algo falla o metemos mal el dedo. Basta con hacer chainload directo al boot del disco en el que está instalado grub2, algo así: 


title Ubuntu
rootnoverify (hd0,5)
chainloader (hd0,5)+1

  
Si lo tienen en el mbr sería:


title Ubuntu
rootnoverify (hd0)
chainloader (hd0)+1


PD4: Hace mucho que no ponía una posdata al pedo.