Discuta este tópico no fórum

Se este conteúdo te ajudou, deixe um presente!

quarta-feira, 25 de janeiro de 2012

OpenWRT: Customizando sua firmware

Mais um artigo da série sobre o OpenWRT.

Em geral, a palavra "firmware" assusta as pessoas. Dá a impressão de algo imutável e complexo. Uma "firmware" ou "imagem", no caso do OpenWRT, nada mais é que uma imagem de um sistema operacional para dispositivos embarcados, similar às imagens feitas por um Ghost ou mesmo um dd. Claro, tudo isto dentro do formato esperado de cada dispositivo.

Mas por que alterar a "firmware" do OpenWRT? Um dos maiores problemas dos dispositivos embarcados é o limitado espaço em disco. 4MB é bem pouco para os mais sonhadores. Preciosos kbyte podem ser recuperados se você montar uma imagem que não contém algum pacote desnecessário. Se você é um feliz proprietário de um dispositivo com 8MB ou mais, parabéns, provavelmente este artigo não será útil para você. Instale a imagem padrão e posteriormente os demais pacotes desejados.

Então, tenho pouco espaço em disco. A estratégia é retirar tudo que eu conseguir, criando um a imagem enxuta, e instalar individualmente os pacotes após a gravação? Não, os arquivos presentes na ROM são mais econômicos do que os mesmos arquivos salvos na partição de alteração (overlay). O mais econômico é que, após selecionar os pacotes desejados, seja criada uma imagem com tudo pré-instalado, sempre deixando o espaço vazio para as configurações e para instalações não planejadas que, idealmente, serão embutidas em uma nova firmware para posterior gravação.

Outro bom motivo é a mais fácil reinstalação de um dispositivo ou a sua instalação em lote. Ao instalar o OpenWRT com a "firmware" padrão, os programas instalados anteriormente serão removidos. Colocando-os diretamente na "firmware", eles já estarão prontos logo após a nova instalação. Para o caso da instalação em lote, o mesmo vale para configurações padrão, que podem ser embutidas na firmware. Muito cuidado neste ponto pois o modo de emergência não irá ser útil caso a falha de configuração já estiver na firmware!

Pela característica de um projeto de Software Livre, tudo no OpenWRT é customizável. Basta baixar, alterar e recompilar. Porém, isto dá um pouco de trabalho. Para a customização dos pacotes instalados e de arquivos diversos, o OpenWRT desenvolveu o construtor de  "firmwares" chamado ImageBuilder. Ele fica localizado no mesmo nível das "firmwares" no download do OpenWRT. No caso da arquitetura que tenho usado (ar71xx), seria este arquivo. É um arquivo tar.bz2 grande, aproximadamente 420MB contendo todos os pacotes do OpenWRT compilados para esta arquitetura e os scripts de construção de novas "firmwares".

Depois de descompactá-lo, entre no diretório criado e use o comando "make". "make help" irá dar algumas instruções de como usá-lo. Ah, o pacote de tradução do Português do Brasil pode ser colocado no subdiretório packages e os scripts irão achá-lo.


No meu ambiente, estou usando o seguinte comando:
make image PROFILE=TLWR740NV1 PACKAGES="luci-i18n-portuguese_brazilian ip6tables libiwinfo wpad-mini luci-app-wol luci-theme-openwrt uhttpd wol netstat-nat ifstat luci-theme-base luci-app-qos luci-app-upnp luci-app-firewall luci-app-ddns kmod-input-polldev -ppp -ppp-mod-pppoe aiccu radvd ddns-scripts libiptc resolveip luci-mod-admin-full libiwinfo-lua"
Ele gerará a imagem para o dispositivo "TLWR740NV1" e selecionará os pacotes necessário para o suporte IPv6, que comentei anteriormente, o programa netstat-nat, para mostrar as conexões do NAT, programas para o Wake-on-LAN (WOL), UPnP, scripts para serviços de DynDNS. O que eu retirei? Suporte a PPP. Para o meu caso onde o modem fornece o endereço IP por DHCP, ele é desnecessário (e bem grande). Com isto, você ainda terá 320 KBytes livres para configurações e outros pacotes. Para listas todos os PROFILES possíveis use:
make info
O PROFILE padrão é a geração de imagens para todos os "firmware", o que leva algum tempoPorém, notei um problema com o construtor do OpenWRT: ele não respeita o parâmetro PROFILE. O patch do bugreport resolve o problema. Outra alternativa é esperar ele gerar as imagens até que a desejada esteja pronta e, então, o processo pode ser abortado (ctrl+c é suficiente). As imagens são geradas no subdiretório bin/<alvo>, e seguem o mesmo nome encontrado no download do site.

Depois de uma certa experiência, o administrador pode, inclusive, optar por não instalar a interface Web. Com isto, será preservado um bom espaço em disco, permitindo a instalação de muito mais programas, mesmo em um disco limitado. Que tal um servidor VPN? Um cliente VPN? Um relay TOR? Suporte a uma rede em malha (mesh)?

Boa sorte, pessoal!

37 comentários:

  1. Boa tarde, se eu precisar de algum programa que não tem ja compilado para o openwrt como eu faria para compilar para o mesmo?

    Att.
    Anderson Junior

    ResponderExcluir
    Respostas
    1. Ola Anderson,

      Antes de gastar esforço, se o APP é "de uso geral", verifique se já não existe o pacote pronto. As vezes ocorre de um pacote ficar fora de uma versão por uma pequena falha, mas ele está funcionando na versão de desenvolvimento. Poderia citar o que você quer compilar?

      Resposta curta, seria somente necessário compilá-lo para a arquitetura do seu roteador.

      Resposta longa, normalmente você não vai ter recursos para compilar seu programa em um roteador. Por isto, precisaria usar cross compiling. Acredito que o SDK do OpenWrt vai ter tudo que você precisaria. Só baixar o da versão e arquitetura do seu roteador e rodar no seu PC.

      O segundo trabalho é configurar a compilação do seu APP para usar as ferramentas da SDK e não as do seu ambiente. Acho que a forma mais fácil é criar um pacote pra seu app. Em geral é fácil http://wiki.openwrt.org/doc/devel/packages
      Assim a SDK cuida de chamar as ferramentas corretas.

      O terceiro ponto é se o código fonte foi escrito de forma portável. O fato de ser C nao torna o código magicamente portável. Em geral, coisas que rodavam em mais de uma arquitetura (arm e x86, por exemplo) devem estar preparadas para uma terceira. As vezes ocorre a necessidade de criar um patch para adicionar uns #ifdef.

      Por fim, seu roteador precisa ter recursos suficientes para rodar o programa. Recompilá-lo não o fará rodar automaticamente em um ambiente de 32mb de RAM.

      Abs

      Excluir
  2. que seria um relay tor? é algo relacionado a proxy usando rede tor?
    mais se o roteador tiver USB, voce poderia usar um pendrive de 1Gb e passar instalar os app no pendrive, correto? nesse caso o openwrt suporta USB?

    ResponderExcluir
    Respostas
    1. Relay tor é um dos n nós usados para "anonimaz o tráfego". Grosseiramente é para onde o proxy tor envia o tráfego.
      https://www.eff.org/torchallenge/what-is-tor.html

      Sim, suporta usb muito bem! http://luizluca.blogspot.com.br/2013/03/openwrt-expandindo-o-espaco-do-disco.html

      Excluir
  3. Luiz, vc ja fez algum programa e compilou como explicou pro anderson? Gostaria de ver um exemplo, preciso criar um programa pra rodar no roteador, mas so sei ate a linguagem C. Vc tem um exemplo?
    Agradeço desde ja.

    ResponderExcluir
    Respostas
    1. Paulo, este blog é cheio de surpresas...Veja http://luizluca.blogspot.com.br/2015/04/openwrt-criando-novos-pacotes.html

      Excluir
  4. Eu preciso de um firmware personalizado para modelos de TP-link TL WR ... definido como roteador Wi-Fi e nome da rede e senha wifi definida por mim, que apos um reset, voltem por padrao para estes valores definidos para mim, tem como ? obrigado

    ResponderExcluir
    Respostas
    1. Sim, basta inserir os arquivos de configuração necessários. Ex:

      mkdir -p files/etc/config
      scp root@192.168.1.1:/etc/config/network files/etc/config/
      scp root@192.168.1.1:/etc/config/wireless files/etc/config/
      scp root@192.168.1.1:/etc/config/firewall files/etc/config/
      make image PROFILE=WL500GP PACKAGES="nano openvpn -ppp -ppp-mod-pppoe" FILES=files/

      Excluir
    2. Olá Luiz, estou tentando criar uma imagem para o MR3420V2, uma imagem que tenha o mínimo + suporte a USB, pra que eu possa instalar os outros pacotes que utilizo já com um HD externo como overlay.

      Queria entender direitinho como funciona.. NO seu caso aí em cima você disse quais os pacotes queria instalar.. mas existe um padrão mínimo, certo? a partir desse padrão mínimo você ADICIONOU os pacotes acima, certo?

      Se você só pedisse pra criar o profile sem especificar os pacotes que você queria? Quais os pacotes seriam instalados?

      Excluir
  5. Só mais uma dúvida.. Se eu quiser colocar vários pacotes em uma imagem, como sei se vai caber tudo na flash do roteador? tem como eu saber o tamanho de cada pacote?

    ResponderExcluir
    Respostas
    1. Jônatas,

      Não tem um "mínimo". Depende do que você quer fazer. Se está com problema para instalar até o extroot, pode tentar remover as coisas grander como o luci+lighthttp. Depois você as reinstala no extroot. Na geração da imagem tem a seleção padrão. A partir dela, você pode adicionar ou remover mas não tem um "core" mínimo. Tudo que listei acima sem o "-" é extra. O que estava na imagem original ficou, exceto o que eu tirei com o "-". Se não especificar nada, vai ter uma imagem padrão (a mesma que você baixaria do site).

      A fica é ir individualmente tirando pacotes opcionais até ter o suficiente para instalar o extroot.

      Faz um tempo que não preciso gerar uma firmware customizada. Porém, pelo que lembro, ele alerta quando não consegue gerar uma imagem por falta de espaço. O que ele poderia dizer (mas não dizia) era o espaço restante. Eu fiz um pequeno script para informar isto a partir do rootfs:
      https://drive.google.com/open?id=0B54xzz44RpW6SUQxM216eExZN3M Porém, não era muito inteligente e estava com os valores de um wr740ndv1 chumbados no código. Faz um bom tempo que o escrevi e talvez ele não esteja tão preciso mesmo para o wr740ndv1...

      O espaço que cada pacote ocupa é uma informação complexa... Você tem a informação do tamanho do pacote compactado com gz (ipk é um tar de tar.gz). O problema é que, ao instalar, ele é descompactado. Ao mesmo tempo, imagens em jffs2 são compactadas com lzo. Então, a partir do tamanho do pacote, se descompactar os arquivos e recompactar com lzo, você saberia quanto ocupa no disco ;) Sugestão? faz um chute pelo tamanho do ipk e, para saber com exatidão, gera uma imagem. As variações na rootfs te dirão o resultado. Porém, a rootfs muda em passos largos (do tamanho do bloco do squashfs. Se apagar coisas e não liberar um bloco, o tamanho será o mesmo.

      Excluir
  6. como faço para alterar a interface web do openwrt?

    ResponderExcluir
    Respostas
    1. Diyerdre, você pode criar/adotar um outro tema (CSS).
      Se quiser modificar os "htmls", só olhar os arquivos dos pacotes luci-*
      Tudo é "editável" no roteador.

      Excluir
    2. Tenho a mesma duvida, gostaria de modificar pelo menos a tela de login do openwrt, mas nao sei onde estão os arquivos html

      Excluir
    3. PU7HZZ,

      Olhe os arquivos dos pacotes luci-*. Por exemplo, rode:

      # opkg files luci-base

      Está tudo abaixo de:

      /www/luci-static/
      /usr/lib/lua/luci/

      Excluir
  7. Luiz, preciso de uma imagem customizada para os router Tplink Tl-741N e os D-link Dir-610, me recomenda alguém ou você aceitaria esse serviço?

    ResponderExcluir
    Respostas
    1. Ambos. Só depende do tipo de serviço. O que seria customizar?

      Excluir
    2. Boa noite Luiz, eu também necessito costumizar uma imagem para esses roteadores, configurar um PPOE e SENHA, para quando resetar já está setado, teria como me ajudar a criar uma imagem? pode me enviar um email me ensinando como começo? sou desenvolvedor mas não sei como fazer, só preciso saber como iniciar.

      Excluir
    3. Jurandir,

      É menos complicado do que parece.
      https://lede-project.org/docs/guide-developer/quickstart-build-images
      https://lede-project.org/docs/user-guide/imagebuilder

      Você vai precisar colocar todos os pacotes que quer dentro da sua firmware. Também pode incluir pelo Imagebuilder arquivos. O ideal para configurar é criar scripts dentro de /etc/uci-defaults. Isso roda no boot. Se rodar e não retornar erro (exitcode = 0), o arquivo será apagado. Você pode ver o que tinha no seu roteador em /rom/etc/uci-defaults.

      Então, se um usuário zerar o roteador, os arquivos ressurgem e seu script de configuração é executado novamente.
      A configuração dos arquivos em /etc/config deve ser feita com o comando uci. Você pode se inspirar nos scripts existentes em /rom/etc/uci-defaults.

      Excluir
  8. Cara eu tenho um TL-WR941ND e não consigo instalar o Tor pois informa que excede a memória. Dos pacotes padrões que vem no Chaos Calmer, o que eu poderia remover a fim de ter esse espaço para o tor ?

    ResponderExcluir
    Respostas
    1. Pouca coisa. Pppoe se não estiver usando. No fim, resta remover a interface web (uhhtpd, luci-* e lua).
      4 MB é pouco mesmo

      Excluir
    2. Ola Luis ,preciso de um firmware openwrt para o D-link Dir-610 com pppoe em cima de vlan e ipv6 vc faria o serviço para mim.?

      Excluir
    3. Olá José,

      Normalmente eu não faço serviço para particulares pois pelos custos não ficaria interessante para um dos lados.
      Mas posso ver com um colega se ele estaria interessado.

      Excluir
    4. Jose, infelizmente não achei interessados em prestar o serviço.
      Coloquei mais informações no comentário
      https://luizluca.blogspot.com/2012/01/openwrt-turbine-seu-roteador_25.html?showComment=1497548503140#c305904105114152526

      Excluir
  9. teria um contato para discutirmos valores do serviço

    ResponderExcluir
    Respostas
    1. Olá Mailson,

      Infelizmente não estou em condições temporais de aceitar serviços extras.
      Dependendo do serviço, posso tentar achar alguém interessado. Qq coisa,
      meu login do gmail é o mesmo do nome do blog.

      Excluir
  10. Luiz, tenho um roteador + modem adsl com 16Mb, mas o bendito é broadcom tanto chipset quanto chip de wireless :(
    queria compilar um openWRT ou gargoyle pra ele, mas não tem suporte para ambos, o suporte fica no kernel ne? se eu compilar o openWRT com o ultimo kernel 4.12 tem como?

    ResponderExcluir
    Respostas
    1. Rick,

      Espero que seja 16MB de Flash. Se for RAM, pode desistir já na largada :-)
      O suporte não é bem só o "kernel". Além de um kernel com seus drivers, você vai
      precisar da configuração dos periféricos (descritos no device tree), que são específicos para cada modelo.
      Normalmente dois roteadores com o mesmo chipset podem compartilhar o DeviceTree. Procure pelos arquivos
      .dts (Device Tree Source) em targets nos fontes do OpenWRT/LEDE que você terá uma boa ideia.

      Depois de tudo funcionando, ainda falta construir uma firmware que pode ser gravada pela interface do fabricante (sysupgrade).
      As vezes você consegue viver sem isso se existir um método de gravação/carga alternativo, como tftp.

      Enfim, é um pouco mais do que simplesmente compilar o kernel. Porém, normalmente o trabalho é na maior parte baseado (para não dizer cópia) no que foi feito para outros dispositivos similares.

      Excluir
    2. Por curiosidade, qual seria o modelo? Olhasse também no LEDE?

      Excluir
  11. Luiz, efetuei um upgrade da Flash do TL-MR3220 para 8M, apos esse upgrade a interface wireless não funcionou e não e listada no device, tem como criar uma build especificando o tamanho da flash para 8M?

    ResponderExcluir
    Respostas
    1. Esse é dos meus... Hardware mod! Trocar o tamanho da flash é complicado mesmo. O tamanho da memória RAM é bem mais simples.

      Provavelmente seu problema é que o sistema não achou a partição ART. Ela guarda dados como endereço MAC e de regulação. Se estiver fazia, não lista a wifi mesmo.

      Tem uma postagem no fórum bem próximo ao que você fez.
      https://forum.openwrt.org/viewtopic.php?id=32512

      Achei também que você teria que recompilar o kernel para mudar o march (hoje em dia acho que já migraram para device tree). Pelo comentário do fórum, a posição da ART agora é relativa ao final da flash. Então, copie o conteúdo da ART da flash original para a nova. Acho que é só copiar os últimos 65536 bytes do final de uma para o final da outra.

      Excluir
  12. Olá Luiz,

    gostaria de gerar uma com algumas propriedades da network diferente, algumas propriedades de firewall também, é possivel?
    Poderia da um norte?

    ResponderExcluir
    Respostas
    1. Iarly,

      Já tens duas alternativas. A primeira é configurar um roteador e chumbar essa configuração na firmware. Comentei sobre isso em http://luizluca.blogspot.com/2012/01/openwrt-turbine-seu-roteador_25.html?showComment=1466854494939#c3123110566533338942

      A outra é criar um script que usando comandos uci configuram o que você quer, como comentado em http://luizluca.blogspot.com/2012/01/openwrt-turbine-seu-roteador_25.html?showComment=1497548503140#c305904105114152526

      Excluir
  13. TRABALHAMOS COM ESSE ROTEADOR:
    ROTEADOR WIRELESS N 300MBPS
    NÚMERO DO MODELO TL-WR849N
    SALVAMOS UMA IMAGEM DO JEITO QUE UTILIZAMOS PARA O NOSSOS CLIENTES QUE SÃO 2 TIPOS, CLIENTES DE ANTENA E CLIENTES DE RUA.
    TERIA COMO VCS FAZER UMA FIRMEWARE DAS 2, PARA QUANDO O CLIENTE RESETAR JA VOLTA AS NOSSAS CONFIGURAÇÕES UTILIZADAS?

    CONTATO WHATSAPP 21 983216173

    ResponderExcluir
  14. tem como desinstalar pacotes da imagem instalada para liberar espaço?
    Ou só criando uma imagem nova?

    ResponderExcluir
    Respostas
    1. Tanto o arquivo .bin como a imagem já instalada usam squashfs. Ele não é feito para ser modificado. Se existir uma forma de modificá-lo para reduzir seu tamanho, deve ser mais complicado do que reconstruir uma firmware nova. O ImageBuilder é muito mais tranquilo de usar.

      Excluir
  15. Olá pessoal, tem alguém ou contato de alguém que faça customização, aqui ta meu email: mgnetmaceio@gmail.com

    ResponderExcluir