Hola Compañeros,
En este post les mostraré como hacer un mini sistema con linux y busybox parecido al de mi ultimo post pero en este caso será mas mínimalista y lo haremos mas artesanalmente, sin la ayuda de buildroot.
La idea es crear un livecd de no mas de 8 mb. mas con la intención de aprender como se arma un sistema basico, que la utilidad que el mismo tenga.
Necesitaremos tener cdrkit y syslinux instalados (en la mayoría de las distros ya vienen instalados)
Aviso que no habrá muchas imágenes puesto que no tiene sentido tomar capturas de los comandos escritos en la terminal.
Las versiones del kernel y busibox son las ultimas al momento de publicar este post, Uds. deberán modificarlas según lo crean conveniente.
Empezamos:
Nos logueamos como root.
Creamos la estructura de directorios que contendran nuestro proyecto y entramos en el segundo nivel de la misma:
mkdir -p midistro/{fuentes/kernel,fuentes/busybox} && cd midistro/fuentes
Descargamos y descomprimos el kernel:
wget -c https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.3.3.tar.xz
tar -xvf linux* -C ../fuentes/kernel
Descargamos y descomprimimos busybox:
wget -c https://www.busybox.net/downloads/busybox-1.24.1.tar.bz2
tar -xvf busybox-* -C ../fuentes/busybox
Creamos una instalación limpia, una configuración por defecto y lo compilamos (cambien el valor j9 por el que les corresponda núcleos +1, si tienen HT, nucleos * 2 +1):
cd ../fuentes/kernel/linux-4.3.3 && make mrproper && make defconfig && make -j9 bzImage && cd ../../../
Si quieren darle un nombre al kernel, antes de compilarlo abran el .config y modifiquen la linea
CONFIG_DEFAULT_HOSTNAME=""
Y pónganle el nombre que quieran.
Creamos una instalación limpia y una configuración por defecto para busybox:
cd fuentes/busybox/busybox-1.24.1 && make clean && make defconfig
Abrimos el .config y modificamos lo necesarios antes de compilar
nano .config
Aquí modificamos las siguientes lineas:
CONFIG_STATIC=y
CONFIG_FEATURE_HAVE_RPC=n
CONFIG_FEATURE_INETD_RPC=n
deben quedarles asi; estatico y sin redes RPC, sino no iniciará el sistema.
Compilamos busybox:
make -j9 && make install
Copiamos la instalación de busybox a una carpeta que contendrá el sistema de archivos root:
cp -R _install ../../fstemp && cd ../../fstemp && rm -f linuxrc
Creamos la estructura de archivos y damos permisos a /tmp
mkdir {dev,etc,proc,root,src,sys,tmp} && chmod 1777 tmp && cd etc
Creamos los initscripts que montaran nuestro sistema:
cat > bootscript.sh << EOF
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
for DEVICE in /sys/class/net/* ; do
ip link set ${DEVICE##*/} up
[ ${DEVICE##*/} != lo ] && udhcpc -b -i ${DEVICE##*/} -s /etc/rc.dhcp
done
EOF
cat > rc.dhcp << EOF
#!/bin/sh
ip addr add $ip/$mask dev $interface
if [ "$router" ]; then
ip route add default via $router dev $interface
fi
EOF
chmod +x rc.dhcp && chmod +x bootscript.sh
Creamos un inittab basico:
cat > inittab << EOF
::sysinit:/etc/bootscript.sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::once:cat /etc/bienvenido.txt
::respawn:/bin/cttyhack /bin/sh
tty2::once:cat /etc/bienvenido.txt
tty2::respawn:/bin/sh
tty3::once:cat /etc/bienvenido.txt
tty3::respawn:/bin/sh
tty4::once:cat /etc/bienvenido.txt
tty4::respawn:/bin/sh
EOF
Ponemos un mensaje de bienvenida al iniciar el sistema:
cat > bienvenido.txt << EOF
Bienvenido!!!
EOF
cd ..
Creamos el script que lanzará el init de busybox:
cat > init << EOF
#!/bin/sh
exec /sbin/init
EOF
chmod +x init
Creamos y comprimimos el initramfs:
find . | cpio -H newc -o | gzip > ../fstemp.cpio.gz && cd ../../fuentes/kernel/linux-4.3.3
Ahora creamos la ISO, pero debemos cambiar algunas cosas de Makefile:
nano arch/x86/boot/Makefile
Agregan la siguiente linea (justo como se ve en la imagen)
cp /usr/share/syslinux/ldlinux.c32 $(obj)/isoimage/
Y comentan esta otra:
# isohybrid $(obj)/image.iso 2>/dev/null || true
Ahora si, creamos la ISO y la copiamos al directorio principal con el nombre de midistro.iso:
make -j9 isoimage FDINITRD=../../fstemp.cpio.gz && mv arch/x86/boot/image.iso ../../../midistro.iso && cd ../../../
Hasta aca ya podran iniciar la ISO desde una máquina virtual o un CD, si quiren que inicie desde un USB, ubiquense donde esta la ISO y ejecuten:
isohybrid midistro.iso
Y listo!
Hasta la próxima!