Hola compañeros,
En esta ocasión les mostraré como construir desde cero nuestro propio sistema embebido. Para eso utilizaremos buildroot, una herramienta que facilita mucho el proceso descargando las fuentes, compilando y configurando de forma automática (luego veremos que no es tan así) y soportar una gran variedad de arquitecturas.
Necesitaremos tener instalado git, syslinux y cdrkit (estos dos ultimos si queremos crear un live)
Primero clonaremos el repositorio remoto:
cd && git clone git://git.buildroot.net/buildroot
Entramos en el repositorio y ejecutamos la herramienta configuración de buildroot.
Aquellos que compilen sus kernels manualmente se sentirán familiarizados con la interface.
cd buildroot && make menuconfig
Estas son las configuraciones recomendadas por el manual de usuario de buildroot, sin embargo Uds. adaptenlo a lo que crean mas conveniente.
Configuración del menú toolchain:
Toolchain —>
[X] Enable WCHAR support
[X] Enable C++ support
Configuración del menú System configuration -->
(buildroot) System hostname
Cambiamos el nombre del host por el que nos guste
(Welcome to Buildroot) System banner
Cambiamos por un mensaje de bienvenida que nos guste
Configuración del menu Target Packages:
Target Packages —>
Graphic libraries and applications (graphic/text) —>
[X] xterm
[X] dillo
[X] feh
Aquí si quieren también pueden agregar algún WM.
[X] X.org X Window System —>
X11R7 Servers -->
[X] Xorg-server
X Window System server type —>
[X] Modular X.org
X11R7 Applications —>
[X] setxkbmap
[X] twm
[X] xclock
[X] xinit
[X] xinput
[X] xkbcomp
[X] xclipboard
X11R7 Drivers —>
[X] xf86-input-synaptics
[X] xf86-input-keyboard
[X] xf86-input-mouse
[X] xf86-video-cirrus
[X] xf86-video-fbdev
[X] xf86-video-vesa
X11R7 Fonts -->
[X] font-xfree86-type1
[X] font-adobe-75dpi
Libraries –>
Text and terminal handling —>
[X] ncurses
Kernel —>
[X] Linux Kernel
Defconfig name : x86_64
Target filesystem options —>
[[X] initial RAM filesystem linked into linux kernel
Target options -->
Target Architecture -->
[X] X86_64
Comenzamos a compilar. Este proceso demora bastante, en mi equipo me demora 30 minutos aprox.
sudo make
Durante este proceso es probable que se nos presentes algunos inconvenientes con la compilacion. Aparentemente en algunos paquetes (principalmente los del grupo xdriver_xf86*) buildroot se olvida ejecutar el ./configure de los paquetes antes de hacer make, lo cual termina en un error; generalmente por la falta de los archivos de chequeo que genera el configure; los mismo son .stamp_configure, .stamp_built, .stamp_target_installed (en ese orden).
Como buildroot se detendrá con un error, aprovechamos para ejecutar el .configure a mano.
Entramos a ~/buildroot/output/build/paqueteque falló
y ejecutamos:
sudo ./configure && cd ../../../ && sudo make
Otra de las cosas que suelen fallar, es que buildroot no usa el defconfig para compilar el kernel, así que debemos crear un .config para el kernel:
Entramos a :
~/buildroot/output/build/linux-4.x.x/
Y ejecutamos:
sudo make menuconfig
Si no sabemos como configurar un kernel simplemente denle a save, salen y vuelven a master:
cd ../../../ && sudo make
No nos preocupemos buildroot no comenzará todo de nuevo, solo desde el punto que se produjo el error. Probablemente si se produjo un error sobrevengan varios mas, todos los solucionaremos de la misma manera.
Si mas tarde queremos agregar paquetes o modificar configuraciones, podremos usar nuevamente:
sudo make menuconfig && sudo make
Y reconstruirá con las modificaciones. Aquí también solo compilará las modificaciones, asi que no empezaremos todo nuevamente, solo compilará e inyectará lo que modificamos.
Terminado este proceso debería habernos dejado un archivo bzImage en ~/buildroot/output/images/
Este arcchivo contiene todo lo que necesitamos. Podríamos iniciarlo desde el grub si quisiéramos (recuerden que el initramfs se compiló junto con el kernel) o bien hacerlo un livecd, para poder iniciarlo desde un cd (valga la redundancia) o desde un USB.
Como hacer un livecd con nuestro nuevo sistema.
Creamos una carpeta para contener los archivos de la ISO, copiamos el bzImage a la carpeta que creamos y nos ubicamos dentro de la misma:
mkdir ~/miiso && cp bz* ~/miiso/ && cd ~/miiso
Copiamos isolinux.bin y ldlinux.c32:
sudo cp {/usr/share/syslinux/isolinux.bin,/usr/share/syslinux/ldlinux.c32} ~/miiso/
Chequeen que tengan instalado syslinux en /usr/share/syslinux, porque dependiendo de la distro (yo uso gentoo) pueden ubicarse un otro directorio.
Ahora crearemos un mensaje de bienvenida antes de bootear en sistema. Para ello crearemos en archivo boot.msg y dentro del mismo el mensaje que queremos mostrar.
También debemos crear un archivo de configuración para syslinux. El mismo debe llamarse isolinux.cfg.
Syslinux es totalmente configurable, lo que yo aquí les dejo es solo una configuración mínima y funcional.
default mabas
timeout 150
ontimeout localhost
prompt 1
display boot.msg
label mabas
kernel bzImage
label localhost
localboot -1
MENU HIDE
Creo que se entiende cada cosa, sino me preguntan. Guardamos el archivo.
Creamos la ISO:
sudo genisoimage -J -r -o milivecd.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table ~/miiso
En este momento ya podrán iniciar la iso en una maquina virtual o desde un CD/DVD. Si queremos que ademas inicia desde un USB debemos usar isohybrid:
sudo isohybrid milivecd.iso
Y ya podrán iniciarla desde un USB sin problemas.
Algunas consideraciones:
- El único usuario del sistema es root y sin password.
- Para iniciar las X deben iniciarlas UDs, con startx.
- Si quieren configurar a mano el sistema solo deben modificar lo necesario en ~/buildroot/output/target.
Eso es todo.
Hasta la próxima.