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.
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.
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
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.
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)
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
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
Por completar. Puedes usar los enlaces en la parte “Fuentes y más información/ayuda”
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
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
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…)
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.