miércoles, 13 de octubre de 2010

Creando un mini Linux con busybox

Bueno en este “pequeño” documento veremos la manera de crear un muy pequeño Linux, con busybox y un kernel precompilado de algún live cd. La utilidad de este Linux pues depende de los fines que quieras, desde ponerlo en una usb hasta en un sistema embebido para controlarlo.

Primero que nada, pues tendremos que tener un sistema Linux pre instalado en mi caso utilizare un Ubuntu, también tener las herramientas para compilar como make, gcc, etc. En este howto no se verá la instalación de esas herramientas por que no es el objetivo de esto.

1. Es necesario tener un sistema parecido a este:
/dev/sda1 on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
none on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
none on /dev type devtmpfs (rw,mode=0755)
none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
none on /dev/shm type tmpfs (rw,nosuid,nodev)
none on /var/run type tmpfs (rw,nosuid,mode=0755)
none on /var/lock type tmpfs (rw,noexec,nosuid,nodev)
none on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
/dev/sdb1 on /mnt type ext3 (rw)
root@carlos-desktop:/home/carlos# df -h
S.ficheros Tamaño Usado Disp Uso% Montado en
/dev/sda1 29G 2.3G 25G 9% /
none 245M 188K 245M 1% /dev
none 249M 124K 249M 1% /dev/shm
none 249M 104K 249M 1% /var/run
none 249M 0 249M 0% /var/lock
none 249M 0 249M 0% /lib/init/rw
/dev/sdb1 2.0G 36M 1.9G 2% /mnt

2.Como podemos observar tenernos un disco duro con el sistema principal /dev/sda1 y nuestro target en donde instalaremos nuestro busybox /dev/sdb1.

3. Montamos nuestro el disco duro sdb1 en mnt:
mount /dev/sdb1 /mnt

4. Procederemos a descargar nuestro busybox http://www.busybox.net/downloads/
5. Una vez que se termine de descargar descomprimimos el archivo.
6. Nos colocamos dentro de nuestra carpeta que contiene el busybox ejem:
cd /home/carlos/Descargas/busybox
7. Ejecutamos make menuconfig.
8. Una vez que se nos presente una pantalla como la siguiente:



9. Procederemos a dirigirnos a “Busybox settings” – “Build options” y seleccionamos “Build BusyBox as a static binary (no shared libs)”.
10. Una vez que se defina que se compile como librería estática, procedemos a configurar la ruta donde se debe instalar.
11. Nos dirigimos a “Busybox settings” – “Install Options” y editamos “(./_install) BusyBox installation prefix (NEW)”.
12. El cual debe quedar de la siguiente forma ” (/mnt) BusyBox installation prefix”, cambiando la ruta donde se instalaran los binarios.
13. Dejamos todo lo demás como esta, realmente no me he puedo a investigar como recortarlo, quizás después haga algún documento sobre eso.
14. Nos dirigimos hasta abajo para salvar la configuración



15.Una vez con la configuración salvada procedemos a compilar con “make”.
16.Una vez que se haya terminado de compilar con make ejecutamos “make install” O_o.
17.Procedemos a cambiarle los permisos al ejecutable de busybox:

sudo chmod +s /mnt/bin/busybox

-rwsr-sr-x 1 root root 1.5M 2010-10-13 10:17 /mnt/bin/busybox

18. Ahora bien que ya tenemos los ejecutables en nuestro disco duro separado como dios manda, vamos a probar su ejecución mediante un chroot.

sudo chroot /mnt/ /bin/sh

19. Probamos un tar –h nos arroja lo siguiente



20. Salimos del chroot y creamos el filesystem como debe ser, nos colocamos en /mnt con un cd.
21. Creamos las siguientes carpetas:

mkdir boot home opt sys proc var etc dev

22. Ahora bien esto ya parece un sistema linux convencional :p .
23. Dentro del etc de nuestro sistema creamos la carpeta init.d.

mkdir /mnt/etc/init.d

24. Creamos un script como el siguiente y le damos permisos de escritura.
#!/bin/sh
echo "Hola :)"
25. Bueno ya que nuestro sistema parece más un Linux, procederemos a tomar prestado un kernel y una imagen initrd para que nuestro sistema pueda arrancar.
26. De algún live cd como el de Xubuntu en la carpeta casper tenemos un kernel vmlinuz lo descargamos junto con el archivo initrd.lz
27. Ahora bien procedemos a arrancar nuestro sistema mediante pxeboot, configuramos un dhcp server y un servidor tftp, para esto hay muchos howtos, por eso no lo explicare o usamos en Windows la aplicación Tftpd32, la cual es muy fácil de configurar.

28. Creamos una estructuras de archivos como la siguiente:

29. Dentro de pxelinux.cfg creamos un archivo de texto como el siguiente con nombre default

label tmp

menu label ^m tmp

menu default

kernel images/tmp/vmlinuz

append initrd=images/tmp/initrd.lz ip=dhcp root=/dev/sda1

30. Dentro de la carpeta images, creamos la carpeta tmp y colocamos el vmlinuz kernel y el archive initrd.lz.
31. Configuramos nuestro bios para que arranque desde la red.
32. Colocamos el servidor tftp y dhcp en la misma red que el equipo con busybox que queremos arrancar, y apagamos cualquier otro demonio de dhcp que pueda causar problemas.
33. Colocamos el disco duro con busybox como primario, para que sea reconocido como sda1.
34. Arrancamos nuestro equipo por pxeboot y se empieza a ejecutar nuestro pequeño sistema con busybox.





35. Y tenemos un sistema funcional de 36 Mgs.