Indice


OpenWRT como host de contenedores LXC

Ejecutar contenedores dentro de OpenWRT nos puede insteresar cuando tengamos instalado OpenWRT en equipos más potentes que routers, por ejemplo placas tipo pi. Esto puede dejarnos como interesante un equipo linux de bajo consumo y entorno amigable (luci) al que además podamos ejecutar cualquier eaplicación bajo contenedores linux, como por ejemplo Nextcloud, Jellyfin, nagios, Tiny Tiny RSS, prosody, automatizar un certificado con certboot y cualquier aplicación que pueda interesarte y no este portada a OpenWRT.

Requisitos:

Es importante saber que las versiones de OpenWRT que tienes para descargar en la web no soportan esto, ya que requieren que el kernel cargue el soporte para virtualización y cgroups. Tienes como hacer esto en la sección Compilar al gusto OpenWRT y añadir funcionalizades no soportadas por defecto y cuando lo hagas, recuerda añadir cuando lances make menuconfig los modulos lxc dentro del menu Utilities y opciones para cgroups.

Instalar:

opkg install luci-app-lxc # Instalará: lxc lxc-hooks libcap liblxc lxc-configs lxc-templates flock lxc-create rpcd-mod-lxc liblzma libbz2 bzip2 lxc-attach lxc-console getopt xz-utils xz tar luci-app-lxc.

Para mejorar la experiencia y funcionalidades:
  opkg install kmod-veth lxc-cgroup lxc-unprivileged # lxc-unprivileged instalará también: shadow-common shadow-newgidmap shadow-utils # newuidmap and newguidmap

Reinicia para que carge el kernel y modulos adecuados

Nota: Si te da error al instalar xc por que dice que ya existe el de busybox, y como no debes desinstalar busybox, borra simplemente el que esté en /usr/bin/, ya que es un enlace que apunta a las tools de bysybox y te dejará instalar el nuevo

Iniciar / descargar plantillas:

Ahora en Luci tendrás la sección LXC Containers. Podrás ver el listado de plantillas disponibles y descargargarlas.
Con luci crea un contenedor de prueba. Elige algo ligero, Alpine edge por ejemplo. En Luci es muy sencillo iniciar, parar o pausar/reiniciar los contenedores.

Notas:

  Recuerda que descargar plantillas requiere de cierto espacio, por lo que incluso el Propio OpenWRT no te dejará si no tienes algo más de 300MB.

  Si instalaste OpenWRT en una placa tipo pi y no uso todo el espacio de la tarjeta, puedes usar un particionador como GParted y redimensionar de los tipicos 256MB a 512B e incluso generar una segunda partición para montarla más adelante con OpenWRT y relegar allí los contenedores. (Al compilar tienes opción de decirle los tamaños de boot y root)

  Si quieres conectar y descargar las plantillas mediante conexión TLS, tendrás que instalar: wget, ca-certificates, gnupg y gnupg-utils.

Usar:

Ya con la plantilla creada y en marcha:

lxc-console -n NombreContenedor    # Acceder al contendor seleccionado, podrás hacer login y ya estarás dentro del contenedor. (En Alpine edge por ejemplo es root y en blanco)

Fuentes y más información/ayuda
https://wiki.alpinelinux.org/wiki/LXC#Alpine_Template
https://prplworks.files.wordpress.com/2015/10/elce-2015-dublin.pdf
https://openwrt.org/docs/guide-user/virtualization/start

Compilar al gusto OpenWRT y añadir funcionalizades no soportadas por defecto

En proceso

Tengo documentada solo una de las tres formas recopiladas de compilar que hay en la wiki de OpenWRT + una oldschool que tampoco he acabado de documentar ni probar


Compilar OpenWRT sobre la rama estable

Por completar. Puedes usar los enlaces en la parte “Fuentes y más información/ayuda”

####Notas:

  Si quieres usar en menuconfig para compilar para varios target a la vez, usa CONFIG_TARGET_MULTI_PROFILE y CONFIG_TARGET_PER_DEVICE_ROOTFS

Fuentes y más información/ayuda
https://openwrt.org/docs/guide-user/additional-software/beginners-build-guide
https://forum.openwrt.org/t/checkout-a-tagged-releases-source-code-like-v18-06-1/1256/19
https://openwrt.org/docs/guide-developer/crosscompile

Compilar OpenWRT sobre la rama snapshot usando Image Builder (precompilada)

Por completar. Puedes usar los enlaces en la parte “Fuentes y más información/ayuda”

Fuentes y más información/ayuda
https://openwrt.org/docs/guide-developer/quickstart-build-images
https://openwrt.org/docs/guide-user/additional-software/imagebuilder

Compilar OpenWRT sobre la rama snapshot

Las versiones snapshots no se recomiendan para producción, solo testeo o si las versiones estables no soportan tu dispositivo.
Ten presente que solo podrás instalar paquetes para tu misma versión de kernel snapshot. Puedes actualizar todos los paquetes pero tarde o temprano en alguna actualización se quedará pillado por que no habras actualizado el kernel y precisamente algunos paquetes te pedirán del último kernel. En ese caso requeriría que, guardases configuración, compilases de nuevo la versión, actualizases con la nueva versión compilada y recuperes configuración. Esto con la snapshoot disponible en la web se hace asumible, pero en caso de versiones compiladas por tí se hará tedioso mantener un equipo al día, ya que a cada actualización de kernel tendrás que compilar. El paso intermedio seria compilar mejor la rama snapshot usando la Image Builder. Igualmente, como truco, antes de flashear, puedes hacer backup y probar con: opkg list-upgradable | cut -d " " -f 1 | xargs opkg upgrade --force-depends --force-overwrite

####Requisitos:

    Dependencias Debian/Ubuntu:
        sudo apt install subversion g++ zlib1g-dev build-essential git python python3
        sudo apt install libncurses5-dev gawk gettext unzip file libssl-dev wget
        sudo apt install libelf-dev ecj fastjar java-propose-classpath

    Dependencias adicionales para Debian 10:
        sudo apt install python3-distutils

    Dependencias adicionales para Ubuntu 18.04 o +
        sudo apt install build-essential libncursesw5-dev python unzip 

Preparar distro para compilar:

    Trabaja en una path no muy lejos de raíz, ya que al compilar utiliza rutas muy largas y podría fallar

    git clone https://github.com/openwrt/openwrt.git

    cd openwrt

    ./scripts/feeds update -a
    ./scripts/feeds install -a

    make menuconfig     # Aqui es donde elegiremos el quipo/target para el que vamos a compilar, drivers y paquetes que queremos incluír (carga si tienes alguna configuración guardada)

         Por ejemplo para la Orange Pi Zero Plus
            “Target System” ⇒ "AllWinner Ax"
            “Subtarget” ⇒ “A64"
            “Target Profile” ⇒ “Orange Pi Zero Plus"

         Por ejemplo para el “TL-WR841N v11”:
            “Target System” ⇒ “Atheros AR7xxx/AR9xxx”
            “Subtarget” ⇒ “Devices with small flash”
            “Target Profile” ⇒ “TP-LINK TL-WR841N/ND v11”

    Puedes incluir tus ficheros a tu imagen colocandolos en <buildroot>/files. Ej: colocar test dentro de /etc/config/ ⇒ <buildroot>/files/etc/config/test. # Si no existe el directorio, crealo

    Para editar algun fichero o añadir:   /TuPath/package/base-files/files     # Aqui edité para añadir mis alias en fichero /etc/profile

Compilar:

    make download   # No es necesario pero recomendable antes de compilar, sobretodo si lo haces en paralelo

    make

        -j{hilos}   # Para especificar el número de hilos a utilizar para compilar.
                    # Puedes lanzar con un hilo menos que tu equipo para que no lo sature o llamarlo con el comando nice delante para que le asigne menos prioridas
                    # Si falla y quieres ver que es lo que falla, es mejor lanzarlo en monohilo y debug "make -j1 V=s" (la salida se solapa entre todos los hilos cuando es multithread)

        V=s         # Debug con mayor salida de información
        V=sc        # Debug con extra de información (Es mucha y puede ser dificil seguirla)


    Una vez acabe, tendrás los resultados dentro de la carpeta bin/targets/ y la plataforma que hayas escogido
    Guarda el perfil .config o como lo hayas llamado para rescatarlo en el futuro (ojo que .config se borra si lanzas comandoa clean para hacer borrón y cuenta nueva)

    Para hacer borrón y cuenta nueva: (ojo, perderás todas tus compilaciones y perfiles con paquetes seleccionados)

        make clean
        make dirclean
        make distclean
        ./scripts/feeds update -a   # Si has lanzado antes que esto make menuconfig, verás que te faltaban cosas, como por ejemplo LuCi, con update te descargará el resto
        ./scripts/feeds install -a
        make menuconfig             # Vuelve a abrir el menu para seleccionar a medida la compilación
        make download
        make

####Notas/Incidencias:

  Procura no compilar en una unidad o home cifrado. Cuando tienes el home privado el path es mayor y genera incidencias por longitud de este.
  Al compilar algunas veces requiere conectarse externamente debido a imports externos, si hay algún fallo de conectividad tendrás que volver a reintentar.
  La rama snapshoot está en desarrollo, por lo que podría haber algunos paquetes con errores. En mi caso spoofer me generaba error y no pude incluirlo para probarlo.
  Hay paquetes de los que dependen otros y no podrás desmarcarlos. Ponte encima y pulsa H o selecciona Help para ver de quien depende y sobre quien depende cada paquete.
  Sí, es normal que la carpeta donde tienes el proyecto para compilar ocupe y tenga tantos ficheros (~10GB y +600.000 ficheros…)

Fuentes y más información/ayuda
https://openwrt.org/docs/guide-developer/quickstart-build-images
https://openwrt.org/releases/snapshot

Compilar OpenWRT a la vieja escuela (Incompleto)

Requisitos para poder compilar:

sudo apt-get install build-essential     # Para Debian, Ubuntu y derivados

Descarga openwrt-imagebuilder en la rama y micro que vayas a compilar https://archive.openwrt.org/releases. Ej: https://archive.openwrt.org/releases/18.06.4/targets/sunxi/cortexa53/openwrt-imagebuilder-18.06.4-sunxi-cortexa53.Linux-x86_64.tar.xz

Descomprime la imagen en la ruta que quieras:

        tar -xf openwrt-imagebuilder-18.06.4-sunxi-cortexa53.Linux-x86_64.tar.xz -C .   # Esto lo descomprimira en la ruta actual ( . )

        cd openwrt-imagebuilder-18.06.4-sunxi-cortexa53.Linux-x86_64/                   # Entra

        make help       # Si todo está bien, te dará la sopciones de ayuda

        cd ~/Descargas/zero/openwrt-imagebuilder-18.06.4-sunxi-cortexa53.Linux-x86_64/packages # Entra en paquetes y elimina aquellos que no quieras:

Al compilar (make) especifica que paquetes quieres añadir en la linea de comandos.

Fuentes y más información/ayuda
https://www.pcsuggest.com/build-openwrt-minimal-image-custom-firmware/#3_Choose_which_packages_to_add_and_remove