viernes, 20 de febrero de 2009

Un boot para dominarlos a todos: Jugando con grub4dos

En un comentario en la entrada sobre grub4dos en el menu de arranque de vista, Reirok nos recomendó un manual de grub4dos mas completo que el wiki oficial.

De ahí saque la clave para manejarme mejor en la consola de grub, y aprendí un par de comandos que me resultaron útiles para hacer lo que siempre trato de hacer: bootear todo lo que se me ocurra. Aqui se los voy dejando, por si alguien con mi misma enfermedad quiere jugar un poco.

Primero los básicos:

root : sirve para decirle al grub desde que particion queremos bootear. La primera particion del primer disco rígido es (hd0,0) , y de ahi en adelante. El comando nos devuelve amablemente una linea donde nos indica el tipo de particion y el sistema de archivos: "Filesystem type is fat, partition type 0xb".

kernel : indica el nucleo de sistema a cargar. Se usa principlamente para bootear linux.
initrd: tambien para linux, indica el nombre de la imagen de sistema base que se usa.

boot : arranca el sistema usando los parametros dados antes

Y ahora los mágicos; los que nos resuelven los problemas:

Problema uno: no me acuerdo cómo de llama el kernel que tengo que bootear, en que disco se encuentra o en que directorio lo puse.

find nos devuelve el disco en el que se encuentra el archivo buscado. No hace búsqueda recursiva, por lo que necesitamos decirle en que directorio buscar, pero en caso de que no sepamos bien ese dato podemos usar TAB para autocompletar.

Por ejemplo, si queremos encontrar el archivo de imagen de floppy de win98, que esta en una carpeta img, o imagen, o images etc, basta con poner:

find / +TAB, nos da el listado de lo que hay en / en el disco (hd0,0). De ahi sacamos el nombre del directorio (imagenes, por ejemplo).

find /imagenes/ +TAB nos lista el contenido del directorio imagenes en (hd0,0), para saber el nombre de la imagen.

find /memdisk nos devuelve (hd0,0) (porque copie el archivo ahí para probar)

Ahora podemos bootear el diskette colocando

root (hd0,0)
kernel /memdisk
initrd /imagenes/win98.img
boot

Para ahorrarnos un paso, podemos combinar find y root colocando find --set-root /memdisk ; lo que nos devuelve la salida de ambos comandos.

Problema dos: me cargué el arranque de xp/vista/win98 y necesito bootearlo.

chainloader hace lo que su nombre indica: encadena el arranque del grub con otro cargador a nuestro antojo. Así podemos bootear win98 sin instalar el boot, copiando io.sys, msdos.sys y command,com al disco (hd0,0) y corriendo chainloader /io.sys, o xp con chainloader /ntldr o el menu de arranque de vista con chainloader /bootmgr.

Hay que tener en cuenta que este método requiere que el disco de arranque sea el (hd0).

Para los que vienen siguiendo el blog, esto simplifica enormemente el trabajo de colocar el hirens, el livexp y cualquier linux en el pendrive. Basta con copiar todo a la raíz del pen, instalar grub4dos y modificar el menu.lst. Quizas haga un mini howto paso a paso en otro post.

chainloader también sirve para bootear desde una particion (bootsector) o disco (mbr). Así, si queremos bootear desde el mbr del disco (hd0) usamos chainloader (hd0)+1, que le indica a grub que botee del disco hd0, el sector1 (que es donde se encuentra el mbr); y si queremos iniciar desde lilo, instalado en el bootsector del (hd0,3),. basta con poner chainloader (hd0,3)+1

Problema tres: mi disco de windows no aparece como (hd0), y no me funciona el chainloader/ntldr.

map es un comando muy útil que nos permite solucionar este tema. Basicamente nos permite engañar al sistema que queremos arrancar para que crea que el disco X esta en la posición Y. Por ejemplo, si tenemos la particion de windows xp en (hd1,1) y queremos hacer chainloader /ntldr, tenemos que decirle a grub que haga aparecer el disco hd1 como hd0:

map (hd1) (hd0)

Si ahora usamos find /ntldr el comando nos devuelve
(hd0,1)
(hd1,1)

Esto es porque el disco 1 esta mapeado en hd0, y esta realmente en hd1.
Ahora, si queremos volver a tener acceso al disco 0 anterior, o necesitamos verlo en dos, lo mejor es hacer el cambio completo

map (hd1) (hd0)
map (hd0) (hd1)

y por fin, si queremos ver los cambios antes de bootear, podemos salir de esta ambigua situacion con

map --hook

este comando hace efectivos los mapeos anteriores, con lo que el resultado de find /ntldr pasa a ser

(hd0,1)

map es una instrucción muy potente, que aparte nos permite montar una imágen de floppy o de disco rigido como (fd0) o (hd0). Lamentablemente, esta funcion requiere que la imagen en cuestión sea contigua en el disco (no fragmentada), con lo que muchas veces el mapeo nos da un error.

Para solucionar esto podemos usar el modificador --mem, que carga la imagen en memoria antes de bootear (para imágenes de disco, hay que tener en cuenta que necesitamos tener ram al menos del tamaño de la imagen).

Por ejemplo, para montar nuestra imagen del disco de inicio de win98:

map --mem (hd0,0)/images/win98.ima (fd0)

Como dato adicional, el comando map --mem puede montar imagenes comprimidas con gzip (así como memdisk puede bootear zip).

Nota extra: todos los que nos obsesionamos tratando de crear cds/pendrive multiarranque soñamos con la utilidad que nos permita montar una imagen iso y arrancarla desde un menú. Mejor aún: una que busque en el pendrive todas las iso que pongamos adentro, y nos de un menú desde el que elegir cuál queremos bootear. Bueno, grub4dos no hace eso todavía, y es posible que no lo haga. Pero la posibilidad de mapear una iso como (hd32) y bootearla con chainloader es lo mas cercano que ví hasta ahora.

Problema cuatro: tuve que reinstalar windows y me cargué el boot de linux.

Este problema podría solucionarse con una vuelta larga: bootear windows, acceder a la particion de linux con el plugin ext2 de totalcommander, extraer el menu.lst, imprimirlo, bootear grub4dos e ingresar a mano los parametros de kernel e initrd con todos sus append. O más corta, ubicar el menu.lst anterior en el disco, listarlo con cat y copiar a mano los parametros. En lugar de eso tenemos un comando que nos permite cargar el menu.lst de nuestro linux como menu de grub4dos.

configfile le indica a grub4dos cual es el archivo de configuracion que debe usar. Así, si teníamos nuestro linux en (hd1,5), que vendría a ser la primera unidad lógica de la partición extendida del segundo disco, podemos buscarla con:

find /boot/grub/menu.lst
(hd1,5)

y después cargar el menu con

configfile (hd1,5)/boot/grub/menu.lst

, con lo que tendremos todas las opciones que habíamos perdido. Hay que tener en cuenta que es posible que las opciones de arranque no funcionen sin laburo extra. Por ejemplo, si booteamos grub desde un pendrive; este se pone como (hd0,0), desplazando la nomenclatura de los discos internos, por lo que debemos hacer algo de edición "en vivo" sobre las opciones para sacarlas andando.

El comando configfile también es útil para hacer submenuses, solamente haciendo entradas que apunten a distintos archivos de configuración. Si quieren ver un excelente ejemplo vean SGD. Un estudio de los archivos de menú les va a dar una idea más clara.

Ya escribí demasiado. Chau, que lo disfruten!

PD: cada comando tiene un link a la guia del amigo diddy, en la que todo está mucho (mucho) mejor explicado. Les recomiendo que lo sigan, para hacerse una idea de que tan mala es esta mini guia.

14 comentarios:

Peste dijo...

Yo se que usted no escribe estas cosas para que les hallemos meritos literarios, pero la postdata me trae un recuerdo instantaneo de Vinge: "(...) the archive at Relay is a jumble, so huge that indexing systems are laid on top of indexing systems." (en A Fire Upon the Deep).

ReiRok dijo...

Muy bueno, como me gustan estas cosas.

Solo para agregar una cosa.
Para solucionar lo del map, para que el archivo no este fragmentado, yo utilizo otro programita util del muchacho Mark Russinovich.
Se llama contig, http://technet.microsoft.com/en-us/sysinternals/bb897428.aspx
Y para los vagos que prefieren un GUI, esta PowerDefragmenter, que les baja el contig si no lo tienen. http://c74y3g.bay.livefilestore.com/y1pazsKJzlk6FQl10BT-c89Qhrv_RumOIL9yTLU8a98mRuNluWB4jWFpD2DdDpAezzc8m57dENrHa0/PowerDefragmenter.zip?download

Saludos.

Anónimo dijo...

Muchas gracias por el contenido, tomare debida nota. les deseo suerte y mayores conocimientos.

Anónimo dijo...

Ayudenmen por favor, tengo instalado el windows 7 y pues ayer reinicie la pc y me aparece este mensaje:


GRB4DOS 0.4.4 2009-03-31, Memory: 632K /2953M, MenuEnd:0x48260

[Minimal BASH-like line.......device/filename. ]

grup>





No se como utilizar esto del "boot" soy muy ignorante en esto, ayudenmen por favor no se que instale o que hice para que me apareciera esto,si saben como puedo saltar esta ventana y arrancar el windows normal por favor diganmen estoy muy preocupado, no me arranca la pc, gracias de antemano.

486 dijo...

Anónimo del 16/8: Puede que ya sea tarde, pero veamos:
Si leiste el post (y espero que lo hayas hecho. Te doy una oportunidad para hacerlo ahora... estoy esperando!...bien) habras visto que grub4dos puede cargar el menu del seven. Si tu máquina no es un quilombo de particiones, entonces lo mas probable es que el arranque esté en la primera particion del primer disco (hd0,0). En ese caso:

root (hd0,0)
chainloader /bootmgr
boot

debería devolverte el menu de arranque. Después podes hacer un archivito menu.lst con ese mismo contenido en la raiz del disco para que te pase al menu directamente.

También podes bootear con el cd de windows7, que trae herramientas para restaurar el boot, pero no es tan divertido.

Anónimo dijo...

al reiniciar con windows7 con un disco duro extraible o pendrive encendido no me reinicia me sale una pantalla en rojoque me sale varias lineas quie pone windows7loader o algo asi y en laprimera linea pone grb4dos0.4.4.2009-09-21 memory y yo que sepa no e istalado nada quisiera saber por favor como desistalarlo por que tengo que apagar el disco duro para reiniciar gracias

Anónimo dijo...

Tengo un problema. instalé windows 7. cuando arranque la máquina tenia el grb4dos con varias opciones que casi todas arrancaban el windows 7. luego intale ubuntu 9.10 en el espacio sin particionar al final del disco, pense que el grub del ubuntu iba a remplazar al grub4dos pero no fue asi . ahora cuando prendo la maquina me aparece primero el grub del ubuntu si elijo que cargue windows 7 me manda al grub4dos y recien ahi puedo arrancar windows. quisiera que solo quede el grub de ubuntu y cuando elijo windows 7 que bootee directamente ,o sea no quiero el grub4dos que me instalo el windos 7, no se de donde salio, busque en internet y no encontre nada sobre grub4dos y windows 7. por favor me pueden ayudar. MARIANA

486 dijo...

Mariana: El grub4dos lo instalan varios loaders para windows 7 (es decir, viene con el seven trucho). El grub que instala ubuntu es distinto, y hasta donde se no tiene la capacidad de bootear el arranque del seven. Si te molesta mucho el hecho de tener dos menuses lo que podes hacer es tratar de agregar el ubuntu al grub4dos, copiando las entradas que tenes en /boot/grub/menu.lst al menu.lst que deberías tener en la raiz de la particion windows, o por ahi. Capaz que tambien tenes que tocar un poco las lineas para espècificar la particion de root correcta. Despues de eso tenes que sacar el grub del ubuntu, limpiando el mbr (se puede con el cd de instalación de w7). El problema es que te arriesgas a quedarte con la maquina sin arrancar. La ventaja es que aprendés mucho.
La segunda opción es, si la entrada por defecto del grub4dos bootea el seven, sacarle la espera para no volver a ver el menu. Investigate un poco el formato del menu.lst, y avisa como te fue!

Anónimo dijo...

maestro podes hacer el favor y explicar bien como utilizar el programita YUMI? que vendria a ser el programa soñado!!! lei este tutorial que te felicito esta muy bueno pero yo soy demasiado novato y al ritmo que voy , me va a llevar mucho tiempo entender esto, muchas gracias

486 dijo...

Anónimo del 3/7: no le veo mucho misterio a YUMI, según los muchachos de pendrivelinux.com basta con bajarse las isos y correrlo una vez por casa una que se quiere agregar. Es decir, es como los demás usb-auto-boot pero mantiene las entradas anteriores de booteo. Además usa syslinux y carga grub4dos solo si lo necesita, parece estar bien hecho.
Ahora, para no seguir tirándole flores a la competencia (?): probaste el super iso booter? Está en este mismo blog, y te permite agregar isos al pendrive con el solo expediente de copiarlas a una carpeta. (en contraposicion, no funciona con tooodo).
Probalo y avisá.

Anónimo dijo...

cuando mencionas esto: 486 dijo...
Anónimo del 16/8: Puede que ya sea tarde, pero veamos:...
T refieres q ya es un problema d hardware? o similar? yo tengo una laptop con el mismo problema y agregale un pitido permanente, ya el test de mem y disco duro han sido hechos con resultados positivos (test succesful), podrias aclarar, la laptop es una compaq con win7 ultimate.
gracias

486 dijo...

Anónimo del 10/11: me refería a que había tardado en contestarle, nada más.
Con respecto a tu problema, sería útil que aclares qué hiciste hasta ahora: leiste el post? probaste la solución que le dejé al anónimo del 16/8? que resultado te dio?
Avisá.

Anónimo dijo...

Hola, ayuda, tengo un disco IDE de 40 GB de notebook con muchas isos y particiones arrancables e instalaciones de Windows todo perfecto. Decidí clonarlo a un disco SSD de 110 GB y comencé a tener errores en todas las entradas antes mencionadas. Desde ya gracias porsu tiempo. Saludos Gabriel.

torbiga dijo...

Saludos, en vista de que la pagina que menciona no esta disponible y no he podido encontrar un tuto que explique como resolver los errores, quisiera pedirle que me ayude a encontrar solucion a error 14 Filesystem compatibility error,cannot read whole file. Este error solo ocurre con lgunas isos, pues las de ubuntu siempre las inicia sin problemas