lunes, 9 de agosto de 2010

El regreso del freak: The Super Duper ISO booter

Desde el comienzo de los tiempos el ser humano buscó un modo de bootear una imagen iso desde un pendrive de forma automágica, es decir, sin tocar un solo archivo de configuracion, por el solo expediente de colocarla en una carpeta. Siglos han pasado desde entonces, y para que semejante hazaña sea posible fue necesario que primero se inventaran (o descubrieran según seamos aristotélicos o platónicos) los pulgares oponibles, las herramientas, el lenguaje, la rueda, el fuego, la imprenta, la electricidad, las computadoras, los cds, las imagenes ISO, los puertos usb, los discos extraibles, syslinux, grub4dos y grub2.

A nosotros, seres humanos que vivimos una época en la que todo lo anterior existe, nos queda entonces la obligación de disfrutar de nuestros inpulsos frikis haciendo uso de las herramientas a nuestro alcance.

En eso me encontraba cuando empece a investigar el entonces nuevo grub2, descubriendo que incorpora un interprete LUA, que hasta donde pude ver (tengo la referencia del lenguaje para leer, solo me da paja hacerlo) es un lenguaje de programación similar a C y que puede usarse como lenguaje scripting. Y entonces me surgió la curiosidad de saber si bootmanager+scripting me podían dar el famoso boot automático de isos por el que varios lectores preguntaron al comienzo de las andadas de este, su blog amigo, cuando incursionabamos en pendrives booteables. Y resultó que sí.

Y el pueblo: ¿Quiere saber de que se trata?

O mejor dicho: si no quiere saberlo, puede saltar directamente a la sección "Todo masticado", en la que encontrara una bonita descarga con, justamente, todo masticado.

Para los que quieran saber de que se trata, les cuento: Se trata de una coleccion de utilidades, scripts archivos de configuración robados de otros proyectos y colocados todos juntos para que funcione. Para dar crédito a los autores originales vos a explicar como funciona.

El script de instalacion es una modificacion (y semi traduccion) del que se encuentra al final de la pagina del hirens para bootear por usb, y se encarga de copiar los archivos grub.exe, syslinux.conf, menu.lst, sgd.iso y m.lua a la raíz del pendrive. Luego crea el directorio /iso y mueve sgd.iso ahi, y al final instala el sector de arranque de syslinux en el pendrive. Con esto tenemos todo instalado.

Al bootear, el pendrive lee el sector de arranque y carga el syslinux. Este lee el archivo de configuración syslinux.cfg y carga el grub4dos (grub.exe modificado para que no saltee el floppy) , que lee el menu.lst y carga la iso del Super Grub Disk (modificada para agregarle la entrada del Super Duper Iso Booter) , que lee el script m.lua (que es modificacion del script bootiso.lua que trae el SGD2) y nos muestra un menú con todas las iso que haya en el directorio /iso. Cuando seleccionamos una entrada del menú, grub2 vuelve a cargar grub4dos, con parametros de configuración que mapean la iso y bootean desde el sector de arranque.

Y por qué es tan complicado?

Es complicado porque al hacerlo me encontré con algunos problemas:

- No instalo directamente grub4dos como arranque porque syslinux es mas compatible con maquinas viejas, y de todos modos uso grub.exe después.
- No puedo bootear la iso desde syslinux porque no lo soporta.
- No pude editar el floppy de SGD2 porque no pude montarlo en linux o en windows. Si alguien quiere hacerlo y poner el grub.cfg de la iso lo espero en mediafire.
- No puedo generar el menú desde grub4dos porque no soporta scripts.
- No puedo bootear las iso desde grub2 porque no soporta chainload, y eso nos deja sin bootear muchas cosas (el hirens, por ejemplo. O el silverdisk).

Verán que son muchos items, poniendo solo los que se me ocurrieron y no pude resolver. Por otra parte, la ventaja del método actual es que nos quedan a la vista un syslinux.cfg y un menu.lst para agregarle lo que queramos!

Un poco de código:

CorraMe.bat

@echo off
echo.
set udrv=
for %%x in (syslinux.cfg syslinux.exe grub.exe menu.lst sgd.iso m.lua) do if

not exist files\%%x goto error
set /p udrv=Ingrese la letra del disco USB (Por ejemplo F:)
if "%udrv%"=="" goto nodrv
echo.
echo !! CUIDADO !!
echo.
echo ESTO INSTALARA SYSLINUX EN %udrv%
echo PRESIONE CUALQUIER TECLA PARA CONTINUAR (O CIERRE ESTA VENTANA)
pause
echo Copiando archivos al pendrive ...
for %%x in (syslinux.cfg grub.exe menu.lst sgd.iso m.lua) do echo copy /y

files\%%x %udrv%\ && copy /y files\%%x %udrv%\
for %%x in (syslinux.cfg grub.exe menu.lst sgd.iso m.lua) do if not exist

%udrv%\%%x goto errcopy
mkdir %udrv%\iso
move %udrv%\sgd.iso %udrv%\iso

echo Instalando el boot en el USB...
echo files\syslinux.exe -ma %udrv% -f
files\syslinux.exe -ma %udrv%
if errorlevel 0 goto ok
echo syslinux.exe error
pause
goto end
:ok
echo done
pause
goto end
:nodrv
echo nothing is selected
pause
goto end
:errcopy
echo Error while copying
pause
goto end
:error
echo file(s) missing (syslinux.cfg syslinux.exe grub.exe menu.lst sgd.iso

m.lua)
pause
:end



Este es el "instalador", modificacion del que viene en el paquete de syslinux del hirens. Primero chequea que existan los archivos necesarios en /files, después pide la letra de la unidad y copia los archivos. crea el directorio /iso y mueve ahi el sgd.iso .Despues escribe el boot en el mbr y sale, Lo que sigue son los mensajes de error que nos muestra si algo falla. Verán que no están traducidos, con lo que notarán mi lazyness.

Syslinux.cfg

default /grub.exe

Simple, carga el grub.

Menu.lst

timeout 2
default 0

title SuperGrubDisk ISO
find --set-root /iso/sgd.iso
map /iso/sgd.iso (0xff) || map --mem /iso/sgd.iso (0xff)
map --hook
root (0xff)
chainloader (0xff)

Encuentra la iso del super grub disk, la mapea directamente o en memoria y bootea desde ahi. Esta forma de cargar las iso en grub4dos está robada del proyecto winsetupfromusb.

Grub.cfg (dentro de la iso)

...
#Super iso booter
menuentry "Super duper iso booter" {
search -f --set /m.lua
configfile /m.lua
}
...

Agregado la entrada del menu. Search es el reemplazo de find (diferencia entre grub4dos y grub2), y se pasa como archivo de configuracion el script que genera el menu

m.lua

#!lua

isofolder = "/iso"

function enum_file (name)
local title = string.match (name, "(.*)%.[iI][sS][oO]")

if (title) then
local source = "search -f --set /grub.exe \n linux /grub.exe --config-file=\"root (hd0,0); map /iso/" .. name .." (0xff) || map --mem /iso/" .. name .. " (0xff); map --hook; root (0xff); chainloader (0xff)\" "

grub.add_menu (source, title)
print ("titulo: "..title.. " ruta: "..source)
end
end

grub.enum_file (enum_file, isofolder)

Este es el mas robado (lo que implica que no hubiera podido programarlo yo sin leer muuuucho mas)! Para mas datos, está robado específicamente del script listisos.lua de esta pagina de ubuntuforums. Crea una funcion que por cada archivo terminado en .iso (mayuscula o minuscula) agrega una entrada del menu con los parametros definidos en source y title. Yo solo le cambié la llamada a la funcion bootiso.lua por la llamada directa a grub4dos con los parametros de arranque.

Y listo!

Todo masticado!


Acá tienen la descarga del instalador en rar. Se descomprime en cualquier lado (el escritorio, por ejemplo, aunque yo lo dejaría en el pendrive por si hay que restaurar) y al ejecutar CorraMe.bat pregunta la letra de la unidad y se instala ahí.
Para agregar una iso al menu solo hay que copiarla en la carpeta /iso en el pendrive.


Notas:

- Cuidado! Si hay otro sector de arranque, syslinux.cfg o menu.lst en la raiz del pendrive hagan un backup antes de instalar, porque el CorraMe.bat sobreescribe sin preguntar.
- El grub4dos intenta mapear la imagen directamente, y si falla lo hace en memoria. Esto último sucede cuando la imagen iso esta fragmentada en el pendrive, y aparte de ser lento consume memoria, por lo que si vamos a tirar isos de 700Mb en la carpeta, es recomendable wincontig.
- Desde seven o vista, hay instrucciones en la última posdata!
- Las isos booteadas no siempre andan.
- Puede fallar!



PD: para toquetear los archivos de configuracion y probar, les recomiendo este probador de boot basado en qemu (robado del paquete UBCD4Win) .

PD2: (Arreglado. No les debo nada) .Les debo los links a las paginas de hirens, grub4dos, grub2, syslinux, lua, wincontig, UBCD4WIN y mil mas. Capaz que mas tarde, es decir dentro de seis meses, con mi ritmo de publicación.

PD3: Soy lento para despedirme y escribo muchas posdatas. Pero si alguien prueba esto deje un comentario, para saber que no soy el único friki al que le interesa esto. O que si.

PD5: Enjoy!

PD4: En W7 o Vista tenemos una problema: necesitamos ser administradores para poder escribir el mbr, pero el sistema cambia el path a \windows\system32 cuando ponemos el modo administrador, con lo que el batch no encuentra los archivos. Para solucionar eso debemos:
1) Abrir una consola en modo administrador. Eso se hace buscando en el menu "cmd", y después con boton derecho sobre el ícono "Ejecutar como administrador".
2) Cambiar el path al lugar donde tenemos el archivo CorraMe.bat. En mi pendrive, el comando es cd "F:\boot tools\SuperIsoBooter"
3) Ejecutar el batch a mano desde la consola.
4) Debería funcionar!
Of course, si alguien tiene una solucion mas elegante, lo espero en los comentarios y será agradecido. No eternamente, pero agradecido.

miércoles, 17 de febrero de 2010

Obsesiones surtidas: sincronizar la hora de una maquina en una LAN

Versión larga

Hay ocasiones en las que uno se embarca en tareas que (a ojos de terceros) pueden parecer desproporcionadas para su propósito original. Así, hay quienes queman una biblioteca para deshacerse de un libro, o escriben un libro para hacer de marco a un capítulo que ya tienen (la historia de Cortázar y el capítulo de los tablones en Rayuela es probablemente falsa, pero ilustra).

Pongamos como ejemplo un poema reciente, escrito para sacar de mi cabeza el loop de la primera estrofa, robada de "cada loco con su tema".

Sentidos

Por lo general
Me gustan las palabras
mas que los sonidos,
y los sonidos
mas que los colores

Pero claro

El frio del vaso
el sabor de una cerveza
en un dia de calor

El olor a manzana
verde en la cabeza
recien lavada de mis hijas

Tu piel en la yema
de mis dedos
como preámbulo

La obra de arte
de tu cuerpo desnudo

Valen mas que mil volando.




El poema y este blog, como todo lo que escribo, tienen ese defecto.

Hace unos días estuve tratando de resolver un problema: una máquina que no mantiene la fecha, que está atrás de un proxy sin soporte NTP y que no puedo abrir fisicamente. Las búsquedas en google acerca del tema me daban siempre salidas de relojes atómicos, foros con preguntas sin responder, servidores de hora shareware y demás.

Así que de intentar actualizar por internet pase a actualizar por lan, y de intentar instalar un servidor NTP propio a buscar como hacer un script usando los viejos "time" y "date".En algún momento, investigando las opciones del comando NET TIME me encontré este articulo del soporte de Microsoft, que solucionó mi problema.


Versión corta

El comando que hay que usar es:

net time \\maquinaenlaredconlahorabienpuesta /set /y

Conviene ponerlo en un .bat y cargarlo al inicio de la sesión.
Y eso es lo que quería decir!

PD: Tres días, tres entradas. Para mantener mi ritmo de publicacion de los últimos tres meses debería dejar de escribir hasta Agosto!

martes, 16 de febrero de 2010

Obsesiones surtidas: Mejorando la compatibilidad de Grub4dos en el pendrive

Grub4dos es una herramienta increíble: puede bootear directamente linux, xp, vista y seven, puede montar diskettes o imagenes iso, y tiene una linea de comandos poderosa, que nos permite buscar las opciones corectas en vivo.

En mi pendrive de laburo el grub4dos se encarga de bootear un par de mini XP, el Hirens 10, la consola de recuperacion de XP, las ISO de Acronis TrueImage y Puppy 4.21 y el Slitaz, una mini distro que es rápida y maneja bien NTFS.

Lamentablemente para nosotros, los habitantes del subdesarrollo, algunas máquinas de las que son mayoría por estos lares (maquinas con DDR y sin SATA, sin muchas opciones para bootear desde usb) tienen problemas para llegar al menú.

PROBLEMAS Y SOLUCIONES

El primer problema es en el booteo. El síntoma es que al arrancar desde el pendrive el sistema se queda colgado con un cursor parpadeante en la esquina superior izquierda, y es incapaz de cargar el grub. La solución que nos propone la gente del Hirens es cargar grub.exe desde syslinux, que es un arranque mucho más amigable. El archivo que descargamos de la página de hirens no hace mas que instalar el syslinux, copiar a la raiz del pen el grub.exe y el archivo syslinux.cfg, que contiene solo la sentencia “default /grub.exe”. Elegante y conciso. Y funciona. Por supuesto, nosotros no podemos dejar tranquilo ese syslinux.cfg, pero eso es de otros posts que ya pasaron!

El otro problema, con el que me encuentro mas veces de las que quisiera, nos deja en la línea de comandos de grub sin mostrarnos nuestro menú. Esto sucede porque la bios esta reconociendo el pendrive como un diskette, y nuestro grub4dos esta seteado explícitamente para no buscar en floppies.

Cómo sabemos si es esa la causa? Buscando nuestro menu.lst desde la linea de comandos con find /menu.lst el comando nos devuelve un bonito (fd0).

La solución más directa es hacer a mano lo que el grub no quizo hacer automáticamente.

Tipeamos:

find --set-root /menu.lst
configfile /menu.lst


Y tendremos nuestro menú. Hay que tener en cuenta que estamos booteando con fd0 como root, lo cual no suele gustarle al hirens, pero los chainloaders del xp o las iso no tienen mayores problemas para arrancar.

Pero... para los enfermos como yo existe una solucion más permanente, que nos evita el delay de cargar a mano el menú. Podemos modificar las opciones de arranque del grub4dos.

Parte de la magia de este bootloader está en su capacidad de cargar automáticamente el menu.lst. Si lo arrancamos en una máquina lenta, y tocamos las teclas del cursor al iniciar, podemos entrar en un menú intermedio, cuyas entradas buscan al archivo menu.lst en el directorio raiz /, en /grub y en /boot/grub. Al editar estas entradas vemos al culpable de nuestras desdichas. La línea que busca el menu.lst es así:
find --set-root --ignore-floppies --ignore-cd /menu.lst

y la siguiente

configfile /menu.lst

Bien! Ahora sólo nos queda sacar la parte de “ignore floppies” del menú intermedio, para que el boot funcione de primera.

Pero dónde está ese menú? Esta es la parte divertida del procedimiento. El menú está en el archivo grub.exe (y en el grldr, pero como usamos syslinux ese no nos importa), y podemos editarlo directamente con un editor hexadecimal.

Voy a usar el TinyHexer, que es el que llevo en el pendrive. No por nada en particular.

El truco es buscar la cadena de texto “--ignore-floppies --ignore-cd /menu.lst” en el archivo, seleccionar la parte de “--ignore-floppies“ y eliminarla. Acá una muestra de cómo se ve en mi editor:



That´s all folks!

PD: Para los que quieren todo cocinado, aca les dejo mis Grub.exe y grldr modificados.

PD2: Calmadas nuestras obsesiones, ya podemos seguir viendo los capitulos de Fringe que nos quedan. Hasta luego!

lunes, 15 de febrero de 2010

Ingeniería social básica, o el juego de los 3 bits

Ingeniería social es el nombre que los freaks de la informatica como yo le dan al trato con otros seres humanos. A mi en particular siempre me interesó el tema, sea desde el lado oscuro de la fuerza, investigando las formas que los hackers, spammers y creadores de virus usaban para que los usuarios ejecuten sus programas , o desde el otro lado (¿el lado claro?) mirando como los que saben de usabilidad se las arreglaban para que un tipo pudiera manejar algo totalmente nuevo como si ya supiese.

En nuestro trabajo como técnicos hay ocasiones en las que tenemos que usar ingeniería social para sacar información de los usuarios acerca de la falla del equipo. En este caso no se trata de conseguir un dato que el cliente nos quiera ocultar (como una contraseña, por ejemplo), sino de guiarlo para que nos de una informacion que él no sabe que tiene. Las dificultades de la tarea son varias:

a) El tipo cree que no sabe nada, por lo que nuestra investigación le resulta incómoda y/o vergonzante. Cuando le preguntamos que problema tiene solo suele repetir "yo de esto no se nada", y es complicado sacarlo de ahí.
b) El cliente está en shock. La máquina es como una parte de su cuerpo, y verla ahí inerte le provoca pavor, por lo que no atina ni siquiera a apagarla y volverla a prender.
c) Superado cierto número de preguntas, el susodicho empieza a pensar que nosotros no sabemos nada. Y es que nosotros deberíamos saber que le pasa a la máquina por ósmosis o clarividencia.

Lo cierto es que no somos nosotros los que pasamos varias horas por día frente a la máquina, y si lo fuéramos no seríamos capaces de cobrar por ellas. Por lo que muchas veces necesitamos esa información para trabajar.

Hace unos días volví a ver un capítulo de Cosmos (el 11: La persistencia de la memoria), en el que Sagan habla del juego de las 20 preguntas. Así como Akinator, con 20 preguntas bien elegidas contestadas con sí o no se puede identificar cualquier cosa de este mundo. No es poco: 20 bits nos dan (2^20)-1 posibilidades, poco mas de un millón. Con esa cantidad sería sencillo hacer un pre-diagnóstico de la máquina, lo que nos ahorraría tiempo de trabajo.

Pero la vida no es tan sencilla, y mas que Carl Sagan o el genio de la web nuestros clientes son como el genio de la lámpara o el rey de los minisúper: no nos permiten mas de tres preguntas.

Así con esos tres bits, tenemos que tratar de aproximar el diagnóstico.

Dejo un par de ejemplos como muestra:

Atención telefónica

Cliente: La máquina no anda (información=0).
Técnico: 1- ¿Prende alguna luz, o hace algún ruido?
C: Si, pero después no anda (1 bit)
T: 2- ¿Llega a mostrar el fondo de escritorio, y el botón inicio?
C: Si, pero la flechita no se mueve (digamos 2 bit)
T: 3- En su teclado tiene una tecla con el logo de windows. Está entre el control y el alt izquierdo. Si la aprieta: ¿Se ve el menú de inicio?
C: No sé, la compu está en mi casa y yo en el trabajo.(0 bits)

Ya está. Se gastaron las preguntas. Logramos reducir el problema a algunas posibilidades: O hay un programa al inicio que cuelga la PC, o hay un problema de temperatura, o bien el mouse está roto o desconectado. En el caso de que el cliente esté en su casa y comprenda la pregunta 3, la respuesta es la diferencia entre ir a lo del cliente con un mouse nuevo por las dudas o ir a retirar la máquina para ver en el taller.
También nos faltó el famoso “¿Ha probado apagarla y volverla a encender?”, que podría haber sido la tercera pregunta. Pero no hay nada que hacer ahora. Apostamos, y perdimos.

Otro caso similar:

Cliente: La máquina no anda.
Técnico: 1- ¿Prende alguna luz, o hace algún ruido?
C: Si, pero después no anda (1 bit)
T: 2- ¿Llega a mostrar el fondo de escritorio, y el botón inicio?
C: No, se queda la pantalla en negro con letras blancas (1bit).
T: 3- ¿Pasan varias pantallas con letras y después vuelve a empezar?
C (se fija): Sí, eso! (1bit)

En este caso tuvimos éxito. De "no anda" llegamos a "se reinicia continuamente", lo que nos dice que es un laburo real, con urgencia para el cliente y cobrable. Si la respuesta 3 era negativa podía ser un disco roto, o un diskette viejo en la diskettera, con un mensaje de "non system disk...". Por desgracia, para determinar eso nos hubiera faltado una pregunta. O una bola de cristal nueva.

Saludos!
Los dejo con sus clientes. Pregunten bien, y Good Show!

PD: Para aquellos preocupados por cuestiones de género, el post hace referencia a un cliente masculino. Por comodidad en la lectura me abstengo de poner cliente/a, tipo/mina, susodicho/a y demás correcciones.
Por el mismo motivo, el que se sienta mas cómodo podrá reemplazar "cliente" por "usuario". No suelo usar "luser", porque no quiero ofender al que me mantiene. Will you bite the hand that feeds you?