Mostrando postagens classificadas por relevância para a consulta busybox. Ordenar por data Mostrar todas as postagens
Mostrando postagens classificadas por relevância para a consulta busybox. Ordenar por data Mostrar todas as postagens

Dando uma olhada no toybox

Dando uma olhada no toybox
Dando uma olhada no toybox
Busybox na verdade é um conjunto de quatro shells, há pouco código próprio no Busybox mas é um trabalho interessante (não precisaram reinventar a roda sem haver necessidade). O maior trabalho feito e próprio do Busybox é a correção de código. A primeira vez que mencionei sobre o Busybox no meu canal foi quando saiu a noticia de que removeram o suporte ao systemd. Agora vamos dar uma olhada no terminal de comandos toybox, um terminal de comando tudo em um assim como o Busybox; porém menor, mais fácil de manter e que já substituiu o Busybox no Android:


É possível baixar a versão binária do toybox para arquiteturas diferentes clicando aqui caso não queira baixar o código fonte para compilá-lo. Mais uma coisa interessante é que é possível escolher qual biblioteca será utilizada como padrão no momento da compilação como musl (fortemente sendo adotada como padrão pelo toybox), UclibC, GlibC e a Bionic do Android (ou seja, um terminal multi-biblioteca C) como pode ser lido em seu git:

toybox tem sido testado com a musl, uClibc, glibc, e a bionic.
Informações em seu git sobre o uso de bibliotecas com o toybox

De acordo com a comunidade toybox, está previsto um novo lançamento para meados ou final deste mês. De acordo com Rob Landley, ainda é necessário um fix para o comando ps -T, . Mais uma coisa que a equipe do toybox trabalha para um futuro lançamento é em um executável ./configure.

Resolvi fazer o mesmo procedimento com o Busybox comparado seu tamanho final após compilá-lo. Comparei o tamanho final do Busybox, das duas versões do toybox, do Bash e do Zsh e uma coisa que notei é que o Zsh, apesar de oferecer maior segurança, maior estabilidade e muito mais recursos do que o Bash é menor até mesmo que o Busybox como pode ser conferido na lista abaixo:

bash-zsh-busybox-e-toybox
Diferença de tamanho entre terminais (reparem que o zsh é menor até mesmo que o Busybox, que é menor que o Bash e ainda assim oferece mais poder e maior segurança que o próprio Bash.

Muito além do GNU - Toybox

Beleza cambada?

Continuando no raciocínio sobre comandos, apresento a vocês o Toybox. Para quem já conhece o Busybox se torna mais fácil saber do que se trata. E para você que não sabe o que é, o Busybox é o conjunto de comandos agrupados em um único programa. Ele foi criado pelo cara que assumiu o Debian na saída de Ian Murdock. Foi o cara que também que deu a ideia de code nome com bonecos do Toy Story para cada lançamento do Debian. O busybox é utilizado durante o processo de boot do Linux estando dentro do initrd e do initramfs. O Red Hat Enterprise Linux possui um próprio chamado Nash.
O toybox é a mesma coisa que o busybox (o conjunto de comandos agrupados em um único binários); porém, diferente do busybox que é uma implementação de comandos já existentes, o toybox é todo reescrito do zero e é menor e mais simples do que o busybox (porém como o mesmo poder de fogo).

Os terminais não ficam longe do que o Busybox e o toybox são. O Bash mesmo por exemplo (que você está mais acostumado) possui muitos comandos dentro dele assim como o busybox e o toybox. Outros comando utilizados externamente são consultados através da variável $PATH que o comando lê o caminho que está nela e executa após encontrar aonde o programa (comando) está.

Existem distribuições que utilizam o Busybox como terminal padrão ao invés do Bash e no caso do toybox, ele foi o substituto do busybox no Android Marshmallow (que anteriormente tinha sido o substitudo do toolbox do android) e futuramente no Tizen. Confiram o vídeo =)

O Paradoxo do Navio de Teseu no mundo open source.

O Paradoxo do Navio de Teseu

O Paradoxo do Navio de Teseu no mundo open source.

 Este artigo é parte integrante de um livro sobre licenças de software livre e de código aberto que estou escrevendo (e que honestamente ainda não há previsão de lançamento). Mas o que me motivou a disponibilizar esta parte foram dois motivos. O primeiro foi que recentemente eu postei o artigo o envolvimento do Netfilter/Iptables em ações judiciais. O segundo foi durante a live sobre o projeto Pindorama Copa Cabana onde um dos pontos que abordamos foi sobre forks pois há alguns comandos no pacote Util-Linux que são forks de comandos do Core utils do GNU. E é aí que eu hoje resolvi bancar de filósofo sem formalidades e entro com O paradoxo do Navio de Teseu para que possamos analisar e melhor entender sobre código fonte e forks*. 

O NAVIO DE TESEU

 Teseu é aquele maluco da mitologia grega que enfrentou o Minotauro (o maluco é bravo mesmo).  Mas o que nos interessa aqui é sobre o paradoxo criado em torno dele. Em Vidas Paralelas, Plutarco propõe que se Teseu partiu com seu navio em uma viagem (que durou uns 50 anos) e ao longo dessa viagem seu navio precisou de manutenção (é obvio) ao ponto que ao final da viagem, todas as peças originais haviam sido substituídas, surge a questão:
Trata-se do mesmo navio ou de outro?
 E esse paradoxo virou uma bagunça; Heráclito e Aristóteles afirmaram que sim, aí vem Gottfried Leibniz afirmou que não; Thomas Hobbes piora ainda mais o assunto propondo que se remontassem o navio com as peças originais (por que alguém iria querer montar a porcaria de um navio com as peças velhas? Alias, quem seria desocupado o suficiente para ficar procurando estas peças?) se ambos os navios são o mesmo ou se são navios diferentes (aí que bugou a cabeça de todo mundo mesmo); John Locke já mete o bicão falando de meia furada (a conversa mais paralela que eu já ouvi) e o assunto foi tão longe que teve gente até mesmo falando de teletransporte...

 Esse paradoxo foi tema no ultimo capítulo da série Wanda Vision quando ambos Visões (a versão projetada por Wanda e o branco que foi reconstruído a partir do corpo original do Visão) lutavam entre si. O versão branca de Visão foi programada para destruir o Visão porém, ele é o visão; o original. Daí surge o debate entre os dois sobre o navio de Teseu e ambos chegam a conclusão de que os dois são o Visão (ou talvez não, sei lá. Assunto que vira uma bagunça na mente).

Vision vs Vision
Visão vs Visão em Wanda Vision.

 Bom, deixando essa balela filosófica de lado porque eu não tenho um pingo de interesse em falar de meia furada; vamos aproveitar a ideia do navio e substituir por código fonte.

 Então suponha que você seja o autor de um programa open source*; porém alguém cria um fork do seu programa e ao longo do tempo o código fonte foi tão modificado ao ponto que não há mais uma só linha do seu código original. E agora faço a mesma pergunta do navio:
Trata-se do mesmo programa ou de outro?
 Bom de acordo com a lei, quando um programa é totalmente modificado, não se trata mais do mesmo programa. Não há como reivindicar direito sobre o código fonte de outras pessoas.

 Externamente enxergamos o mesmo programa com funcionalidades semelhantes porém, internamente ambos são programas totalmente diferentes. Para entender melhor, vamos analisar dois projetos que passaram por situações semelhantes ao longo de sua história. São eles o 4.4BSD-LITE e o Busybox.

O CASO 4.4BSD-LIT vs USL

 Como já contei em uma live, a BSDI (Berkeley Software Design, Inc) tomou um processo da AT&T simplesmente por seu número de telefone conter a palavra Unix...1-800-ITS-UNIX. Pois é, um simples numero de telefone foi motivo o suficiente para a BSDI tomar um processo da AT&T que se estendeu por um bom tempo (em partes por culpa da própria galera do BSD).


 Só se chegou a alguma solução quando removeram certos arquivos e modificaram outros e assim surgiu o 4.4BSD. Em Julho de 1.994 foi lançado o 4.4 BSD-Lite não contendo nenhuma linha de código fonte AT&T (o 4.4BSDLite que deu origem aos BSDs que conhecemos hoje).


 Ou seja, com a remoção de todo código da AT&T, os BSDs continuam sendo Unix porém,  não mais o Unix da AT&T, Bell Labs, USL, Open Groups ou seja lá quem for. Não há como reivindicar direitos sobre os BSDs por não conter mais código fonte de autoria dessas instituições. No caso eles se tornaram outro Unix; Unix independente do original.

Busybox e o caso GPLv3

 O autor do Busybox é Bruce Perens; primeiro presidente a assumir o Debian após a saída de Ian Murdock. Bruce Perens é também o responsável pelo logo e pela ideia de codinomes do Debian serem inspirados na animação Toy story.

 Bruce desenvolveu o Busybox a partir de comandos já existentes, originados de outros pacotes como o Core utils do GNU e o Util-linux do... Linux.... A ideia era desenvolver uma ferramenta (um terminal de comandos) tendo somente os comandos necessários para que o kernel Linux pudesse utiliza-lo durante o processo de boot. Tanto que encontramos o Busybox dentro do initrd ou do initramfs.


 Porém, Bruce Perens deixou o projeto Busybox antes que ficasse pronto sendo então assumido por outros como Erik Andersen. Erik Andersen foi quem tornou o Busybox funcional para que pudesse ser utilizado como terminal de comandos padrão (assim como vemos no Alpine Linux e em muito roteadores). Após Erik Andersen, quem assumiu o projeto como mantenedor foi Rob Landley (o autor do terminal de comando toybox que é encontrado no Android desde a versão 7, no Tizen e em vários outros projetos).

 10 anos depois que o projeto se encontrava consolidado, com ferramentas funcionais e todos os problemas judiciais solucionados, eis que Bruce Perens surge de volta ao projeto como um herói (e até levando créditos pelos trabalhos de outras pessoas) e começa a querer ditar regras. Uma delas é que o Busybox deveria ser migrado para a licença GPLv3.

 Um dos motivos apresentados a Bruce Perens para que não ocorresse tal migração de licença foi que já não havia mais código do projeto GNU no Busybox. Então não haveria como fazer tal exigência.

BusyBox is not a GNU project, so the Free Software Foundation does not hold its copyrights; instead, those copyrights are retained by the original authors. As Rob looked over the code, he found many contributions with the usual "or any later version" language which would allow a change to GPLv3. Others, however, had the explicit "version 2 only" language. Some, contributed by one Linus Torvalds, state that they "may be redistributed as per the Linux copyright." Some other contributions carry a BSD license - originally with the GPL-incompatible advertising clause. It was quite the mixture of licenses.
Passe o cursor na imagem para ler a tradução (texto original clicando aqui)

 Um dos argumentos apresentados por Brunce Perens foi que ele era o autor do projeto e eles iriam fazer o que Richard Stallman mandasse.... Foram 9 meses de debate sobre o assunto que não levou a lugar nenhum. Houve até mesmo consulta de advogados (da qual Bruce Perens não compareceu).

 Rob landley chegou a passar dias analisando e comparando o código entre versões do Busybox para provar que existia mais códigos de Bruce Perens presente no projeto. A equipe do Busybox Sugeriu que Bruce perens fizesse um fork de qualquer versão do projeto para que atendesse às suas necessidade e Bruce até mencionou que faria porém... No final das contas, o BusyBox permanece até hoje sob GPLv2 e... Cadê o fork do Bruce Perens?

Conclusão

 As regras apresentadas aqui não são exclusivas a forks ou a software livre e de código aberto. Elas também são aplicáveis tanto ao próprio projeto ou até mesmo software proprietário. Você pode ter por exemplo um programa e modificá-lo por completo que ele também deixará de ser o mesmo programa.

 Como exemplo, reparem as duas imagens abaixo. tratam-se do código fonte do comando fsck. A primeira apresentada é do código de autoria do Linus Torvalds de 1991 e 1992 (quando foi lançada a versão 0.11 do kernel) e está disponível no util-linux-ng-2.13.0.1. Já a segunda está disponível no util-linux-2.38-rc1 e possui seu código totalmente modificado por Ted T'so, Karel Zak e outras pessoas. 

Fsck de autoria de Linus Torvalds no util-linux-ng-2.13.0.1
Fsck de autoria de Linus Torvalds no util-linux-ng-2.13.0.1

util-linux-2.38-rc1
O mesmo fsck do util-linux-2.38-rc1

 Mas mesmo que um programa tenha dado origem a outro, ambos são considerados programas diferentes se totalmente modificado (ambos possuem a mesma origem, o mesmo propósito, funcionalidades iguais, mas são programas diferentes), não tendo ao autor do original créditos e direitos sobre o posterior; esse é o foco principal deste assunto; tratar da questão de direitos autorais sobre o código fonte (sim, software livre e de código aberto também acabam agregando direitos autorais a seus autores). Os créditos são sempre reservados a cada um que realizou alguma contribuição (todos são autores e todos merecem seu reconhecimento).

 Mas se me perguntarem sobre o navio; se trata-se do mesmo ou de outro. Para mim trata-se de um navio pow... Vai entender o que passa na cabeça dos seres humanos. Não é a toa que ficar buscando inteligência fora da terra...
Busy busy busybox

Comando fdisk do Busybox não consegue lidar com dispositivos de 8TB

Comando fdisk do Busybox não consegue lidar com dispositivos de 8TB
Comando fdisk do Busybox não consegue lidar com dispositivos de 8TB
 Em outubro de 2019 eu postei que a distribuição Puppy quirky passará a utilizar toybox, musl e clang. Com isso Barry Kauler , o criador do projeto, passou a contribuir com os projetos para que também possa beneficiar seu próprio projeto (é assim que tem que ser).

 Graças a isso, Barry e reportou a comunidade toybox para darem atenção ao seu comando fdisk pois descobriu o fdisk do Busybox não consegue lidar com dispositivos de 8TB.

 A descoberta aconteceu quando havia instalado o EasyOS em um desktop Lenovo que possui um HD do tamanho especificado e criando uma partição com sistema de arquivos ext4 de aproximadamente 6.3TB, uma fat32 de 1.3G, swap e outras pequenas ext4.

 No artigo que você pode ler na descrição, Barry explica porque particionou desta forma. Quando Barry bootou seu sistema, o comando fdisk retornou a seguinte mensagem de erro:
fdisk: Device has more than 2^32 sectors, can't use all of them
  Ao executar o comando "fdisk -l /dev/sda" é exibido informações irrelevantes e a solução foi utilizar o fidsk completo de forma estática no initrd até quue os desenvolvedores do busybox solucionem o problema (lembrando quue o fdisk completo, que vem do pacote util-linux, é do tamanho do busybox).

 Rob Landley retornou a Barry informando que o comando fdisk ainda está como pendente. Então, poderão concentrar-se nesta parte para que o fdisk do toybox não venha a ter o mesmo problema.
Mais sobre o Busybox

Morre Aboriginal Linux :(

Turtle Board testada com o FPGA
Turtle Board testada com o FPGA antes do primeiro cilicio do J2 ser lançado
Ok, esse título foi somente para chamar a atenção mesmo, mas que o Aboriginal Linux morreu, isso sim aconteceu. apesar que isso não é uma noticia nova. O Aboriginal Linux chegou ao seu fim em no dia 30 de Abril deste ano. Isso aconteceu para dar inicio ao projeto mkroot feito pelo próprio Rob Landley (criador do Toybox, do propŕio Aboriginal Linux e contribuidor no desenvolvimento do processador J-core). Então, a distribuição em si mesmo não morreu; ela só está se metamorfoseando em algo melhor.

O Aboriginal Linux foi a primeira distribuição a rodar com a biblioteca UclibC ao invés da GlibC e o Busybox ao invés do Bash. O motivo original do Aboriginal Linux foi que Knoppix era única distribuição que realmente dava atenção aos desktops por volta de 2002 (entenderam o porque da minha não adoção ao Linux em 2001?) e os 700 megabytes do Live CD do Knopix incluíam os mesmo 100 Megabytes dos pacotes do Linux From Scratch que proporcionavam quase a mesma experienciaria que o tomsrbt (que rodava em apenas 1.7 Megabytes; ou seja, um disquete).

tomsrbt
Imagem da distribuição tomsrbt
Mais uma coisa foi a prova de conceito de que Linux não era obrigado a ser chamado de GNU/Linux ou LiGNUx ou sei lá que bobeira mais.

Com o mkroot, você pode Compilar um root filesystem e o kernel Linux baseados no toybox que podem ser bootados sob o qemu.

A diferença entre o Aboriginal Linux e o projeto mkroot é a da substituição da UcLibC pela biblioteca Musl e do Busybox pelo Toybox sobre o kernel Linux. Ambas (tanto biblioteca quanto terminal) estão sob licenças diferentes que não sejam GPL. A Musl está sob a licença MIT (me lembro de ser o meu primeiro contato de uso real desta licença) e o toybox que está sob a clausula 0 da licença BSD (0BSD). Mais um motivo está em torno do melhor código de ambos os projetos adotados. Parece que pretendem  adotar o compilador tcc no futuro também. O Toybox já é utilizado por padrão no Android ao invés do Busybox como pode ser visto no vídeo abaixo. Espero que também venha a fazer parte do boot do Linux substituindo do Linux e também seja adotada por padrão na distribuição alpine Linux:


A principio o mkroot fazia (ou ainda faz) uso em partes do Busybox por uma questão de dependências que ainda podem não ter sido  supridas no Toybox, mas que trabalham nisso ao longo do tempo. Me lembro de ter visto links simbólicos dentro do mkroot quando baixei para testar e gerando um root filesystem.

Hoje o mkroot recebeu atualização para o kernel 4.14 kernel, está disponpivel para muitas arquiteturas como arm64 e powerpc64 funcionando, já testado tudo com o gcc 7.2, estão atualmente testando com a futura versão da musl-libc, thalheim no freenode utilizou o script mcm-buildall.sh de Rob e postou os resultados dos binários compilados em:
http://b.zv.io/mcm/bin/
Se conseguirem construir o kernel para o processador SH2, não precisarão de emulação para a placa turtle/numato.

Analisando 6 diferentes implementações do comando sed

Different implementatins of sed command

Analisando e comparando seis diferentes implementações do comando sed


 Em abriu deste ano eu escrevi o artigo minised: Um sed melhor do que o sed. sed é um comando que como seu próprio nome sugere (Stream EDitor), serve para editar/alterar as informações que são exibidas em sua tela (observação que deve ser feita é que arquivos acessados através do sed não são modificados, apenas a forma como as informações são exibidas; a não ser que as informações exibidas sejam redirecionadas ao arquivo de origem). sed Foi um dos primeiros comandos desenvolvidos para o Unix para processamento de dados e, conforme o e-mail de lançamento do kernel Linux 0.02 "intitulado Códigos livres de kernel parecido com minix para AT-386" no grupo comp.os.minix, é descrito que sed também foi um dos primeiros comandos a ser utilizado pelo Linux:

"Ainda está na versão 0.02 (+1 (muito pequeno) patch já), mas executei com sucesso bash/gcc/gnu-make/gnu-sed/compress nele."

 O gnu-sed é a implementação utilizada na maioria das distribuições Linux porém, como existem diferentes implementações do mesmo comando (assim como existem diferentes implementações de todos os comandos e de todas as ferramentas), eu resolvi analisar e comparar ao menos seis delas apresentando aqui neste artigo os resultados de cada uma.

 Eu analisei o gnu-sed 4.8 disponível no Fedora 35 (sed-4.8-8.fc35.x86_64); o minised 1.16 já apresentado aqui no blog; o Busybox_SED que apesar de ter originado do gnu-sed, já não possui uma unica linha de código do do gnu-sed; logo não tendo mais nenhuma relação um com o outro (para entender melhor sobre esse caso, leia o meu artigo "O Paradoxo do Navio de Teseu no mundo open source" clicando aqui); as versões do toybox 0.8.6 e 0.8.7; o 9base sed (de origem do plan9 e depois portado para outros sistemas operacionais) e por fim o sbase sed de origem do Unix e portado para outros Unixes (incluindo Linux na lista de outros Unix) que não possui versão específica. Neste artigo eu irei avaliar as implementações por:
  • Licença
  • Tamanho do binário
  • Recursos disponíveis
  • descrição de ajuda
  • Desempenho
  • bugs
 Para os testes eu utilizei o terminal de comandos zsh por proporcionar melhores informações (inclusive uso de CPU por padrão) e devido o Bash por vezes já ter apresentado bugs que não podem nos garantir confiabilidade nos resultados (leia mais sobre os bugs que encontrei no bash clicando aqui). Em conjunto eu utilizei o comando time.

Stdout difference between bash and zsh by running the time command

Diferença de exibição de resultados do comando time entre os terminais de comando bash e zsh.


 Fiz uso dos materiais públicos aurelio, the mouseless Dev que possui até mesmo um mapa mental muito interessante, o manual gnu-sed e os próprios arquivos de testes disponibilizados pelos próprios comandos.

https://themouseless.dev/images/2021/sed/sed.jpg
Mapa mental do comando sed do site The Mouseless Dev

 Ao final de cada teste, eu irei classificar uma ou mais implementações como vencedores e na conclusão do artigo eu irei classificar da primeira a terceira colocação a partir da que proporcionar a maior quantidade de vantagens. Agora vamos partir para o arrebento.


LICENÇAS

 Neste primeiro tópico eu analiso quais as licenças adotadas por cada implementação levando em conta que cada licença proporciona vantagens e desvantagens. Parece um assunto irrelevante, mas trata-se de algo que pode afetar fortemente todo o mercado, todo um ecossistema e automaticamente você (se hoje o busybox estivesse sob GPLv3, provavelmente você nem teria um roteador em sua casa).

Licenças adotadas por cada implementação do comando sed
Licenças adotadas por cada implementação do comando

 Enquanto o gnu-sed está sob GPLv3+, o busybox-sed manteve-se sob GPLv2 mesmo tendo originado-se do gnu-sed (como pode ser lido no artigo O Paradoxo do Navio de Teseu no mundo open source) e é mantido pelo FFC.

BusyBox is not a GNU project, so the Free Software Foundation does not hold its copyrights; instead, those copyrights are retained by the original authors. As Rob looked over the code, he found many contributions with the usual "or any later version" language which would allow a change to GPLv3. Others, however, had the explicit "version 2 only" language. Some, contributed by one Linus Torvalds, state that they "may be redistributed as per the Linux copyright." Some other contributions carry a BSD license - originally with the GPL-incompatible advertising clause. It was quite the mixture of licenses.
Passe o cursos sobre a imagem para ler a tradução (texto original, basta clicar aqui)

 O sbase e o 9base estão sob MIT (9base sob MIT/X Consortium License); o minised foi disponibilizado sob GPL a partir da versão 1.13 e passou a ser disponibilizado sob BSD-like a partir da versão 1.14 em diante com o consentimento de Eric Raymond. O toybox está sob a clausula zero BSD (0-BSD) criada por Rob Landley que na verdade trata-se de uma Domínio Publico apenas sob o nome de BSD (com a aprovação dos próprios membros dos BSDs).

 VENCEDOR: Com exceção da GPL (que possui tendência natural a declínio), todos as demais licenças são muito boas. O busybox_SED ainda pode levar alguma vantagem com a GPLv2 por não ser incompatível com o kernel Linux e ser menos negativamente impactante que a GPLv3.


TAMANHO DOS BINÁRIOS

 Tenha em mente que, quanto menor o binário, melhor é em todos os sentidos (segurança, desempenho, modularidade e portabilidade). Códigos menores se tornam mais fáceis de manter e serem atualizados.

the more code you deploy the opportunity an attacker has
Passe o cursor sobre a imagem para ler a tradução

 Como mencionado no site do projeto embutils (que infelizmente não entrou para nossa lista), o userland dos Unix geralmente é composto de comandos dos BSDs e do projeto gnu. Na época que surgiram, as técnicas de desenvolvimento eram diferentes; os projetos focavam somente em recurso, mas não na otimização do tamanho.

Most of the typical Unix userland typically comes from either the GNU project or the BSD people. Those sources are ancient and optimized for features, not for small size, and now that computers are fast enough and have lots of RAM, implementations became larger and larger. Features like internationalization eat lots of memory and disk space.

Passe o cursor sobre a imagem para ler a tradução

 No episódio 06 do Linux Link Radio Rob Landley menciona que na época em que era mantenedor do BusyBox curiosamente descobriu que foram  escritas 833 linhas de código apenas para implementar o comando cat... E parece que não mudou muita coisa já que o gnu cat hoje ele possui 805 linhas... Outra coisa bem curiosa relatada por Rob é que, um simples código "hello World" linkado estaticamente à glibc, gera um binário de 400k.... Desenvolvedores de embarcados são declaradamente inimigos mortais da glibc.

 Para dispositivos como embarcados e até mesmo para o processo de boot, binários grandes são simplesmente inviáveis e parece não fazer sentido, mas mesmo em ambientes como desktop, servidores e até supercomputadores binários menores também são extremamente importantes pois assim o sistema consegue melhor desempenho em seus processos, é carregado mais rápido pela  cache L2, deixa o buffer mais livre.

 Há ressalvas a serem consideradas durante as avaliações como sua ligação se dinâmica ou estática, quais bibliotecas foram utilizadas, qual compilador e com quais flags e assim por diante. As ressalvas foram feitas em asteriscos (*).

sed implementations binaries size
Tamanho de cada implementação do comandos sed.

*Relembrando aqui que menor significa melhor
**Eu compilei o minised estaticamente a dietlibc.
***Consta no site do busybox que o busybox_SED possui 89K; porém, após baixar, seu tamanho final é de 92K (também likado estaticamente. Baixe aqui para conferir).
**** Eu compilei o sed do toybox dinamicamente para que pudéssemos saber o seu real tamanho.

 VENCEDOR: Neste caso eu deixo três colocados. O toybox sed em primeiro com apenas 36k; o minised em segundo com apenas 44k, e o sbase sed em terceiro com 56K.

minised and toybox sed size comparasion
Comparação de tamanhos entre minised linkado estaticamente e toybox sed linkado dinamicamente

 Você deve estar se perguntando se não seria injusto sendo que o toybox foi ligado dinamicamente enquanto quer o minised estaticamente. E a resposta é que o minised, mesmo ligado dinamicamente, é maior do que toybox sed. Confiram os resultados na imagem abaixo.

Size comparasion between minised statically and dinamikly linked
Comparação de tamanhos entre minised linkado tanto dinamicamente quanto estaticamente

 Além do mais, eu testei as versões binárias do toybox já disponibilizadas pelo próprio projeto que são linkadas estaticamente, e os comandos estão incorporados ao terminal (sendo um deles o sed). Mesmo contendo 231 comandos incorporados a si, o toybox  0.8.7 possui apenas 716K.

Reparem a quantidade de comandos dentro do toybox 0.8.7 em apenas 716k (sendo um deles, o comando sed que está selecionado nesta leu).
Reparem a quantidade de comandos dentro do toybox 0.8.7 em apenas 716k (sendo um deles, o comando sed que está selecionado nesta imagem).


RECURSOS

 É agora que constataremos se o tamanho dos binários fazem jus à quantidade de recursos. Reforçando o que foi dito no tópico anterior, quanto menor o binário, melhor é porém, não vai adiantar muito o binário ser pequeno e enxuto se não conter os recursos necessários para a sua adoção.

 Além do mais, esse é um ponto extremamente importante pois uma regra histórica que não falha é que, mesmo que um programa contenha certos bugs, mas possui os recursos que as pessoas querem (ou precisam), elas aceitam conviver com tais bugs. Tudo uma questão de prós e contras; além do que os bugs podem ser corrigidos ao longo do tempo (ou não, vai saber a complexidade).

 Podemos dizer que neste tópico o gnu-sed dispensa explicações pois um ponto forte das ferramentas do gnu (não por total mérito seu) mas que é mal divulgado pelo próprio projeto é exatamente a parte de recursos possuindo até mesmo extensões próprias. OK para o gnu-sed.

 No arquivo BUG do minised é descrito "Focarão nas conformidades POSIX e pequeno tamanho - extensões do GNU sed provavelmente não serão aceitas". O minised possui um diretório chamado tests que após compilá-lo, podemos executar o script run, conforme descrito em seu arquivo Makefile (cd tests; ./run ../minised) ou bastando executar o comando make check que se encarregará de fazer esse trabalho (realizando o total de 68 testes). Um dos testes falha (especificamente o empty-lhs), mas como descrito no próprio resultado, essa falha é intencional.

minised make check
Testes disponibilizados pelo próprio minised

 O toybox também disponibiliza seus próprios arquivos de teste também dentro do diretório tests. No total, ele realiza 91 testes com o toybox sed.

toybox sed test files
Teste disponibilizados pelo próprio toybox

 O toybox sed possui uma lista dentro do seu próprio código fonte com algumas pequenas pendências a serem ajustados como "fazer y// lidar com delimitadores unicode, lidar com retorno de erro a partir do emit(), error_msg/exit consistentemente", "Qual a coisa certa a se fazer com -i quando escrever as falhas? Skip ou next?". Eu considero uma lista baixa; lógico que prefiro ver estas questões sanadas, mas são consideráveis.


O Busybox sed também possui uma pequena lista comentada em seu código fonte de apenas três de pequenos detalhes a serem acertados. 

 Eu não encontrei algumas pendências tanto no sbase quanto no 9base e não foram ruim nos testes.

 VENCEDOR: Empate geral. Em todos os testes que eu realizei, todas as implementações conseguiram processar com sucesso.


DESCRIÇÃO DE AJUDA

 Descrições de ajuda (--help e manpages) assim como as licenças, parecem ser irrelevantes, porém pense no seguinte cenário; você está administrando o seu sistema, precisa consultar uma opção e sabe que tal comando não possui opção de ajuda. Até aí, tudo bem, basta consultar a manpage... Certo?...

 A resposta é... depende de qual distribuição estamos falando. Distribuições como Alpine Linux ou Porteus não possuem manpages por padrão. E se de repente você não possui acesso a internet? O que você faz?...

 Do que adiante um programa conter todos os recursos necessários sendo que não vem com as informações de como utilizá-los? Seria o mesmo que uma TV não acompanhar manual de instruções. Alias, eu já vi empresas adotarem uma certa distribuição devido a facilidade em encontrar informações e soluções de problemas. Então, por mais que pareça algo irrelevante, descrições de ajuda é algo extremamente importante.

 E aqui vamos nós para a nossa analise. O minised, apesar de possuir uma boa manpage, não possui a opção --help por padrão. Eu acredito que poderia possuir ao menos uma leve descrição assim no sbase e no 9base. Ou melhor, assim como o busybox_SED; enxuta e explicativa.

minised and sbase sed help
Descrição de ajuda do minised e do sbase sed

Me lembra muito a descrição no Solaris
Me lembra muito a descrição no Solaris

busybox sed --help
descrição de ajuda do busybox sed

 O gnu-sed e o toybox sed são os que melhores implementam tais descrições. Aqui eu postei apenas uma porção de toda a descrição de ambos.


gnu sed options
Descrição de ajuda do gnu-sed

toybox sed options
Descrição de ajuda do toybox sed


[27/11/2023] Estranhamente na versão 0.8.10 do toybox, a opção --help ficou bem limitada assim como da implementação do sbase e do Solaris. Porém, como já mostrado tanto aqui no blog quanto no canal, o toybox possui a opção help seguido do comando. Então, digitando toybox help sed, o comando sed do toybox oferece opções muito mais completa.

toybox help sed
opção help do terminal de comandos toybox


VENCEDOR: Empate entre o toybox sed e o gnu-sed


POSSÍVEIS BUGS

 Já que falamos de recursos, agora vamos tratar de... bugs. O que é uma parte um pouco complicada de se tratar já que difícil constatar a real quantidade de bugs de um programa. Como todos sabem, há relatos de bugs que só foram encontrados mais uma década após sua existência. O bug estava lá mas só foi detectado dois de tanto tempo.

 Então, o que podemos fazer aqui é relatar os que já estão reportados em bug reports, procurar por informações em man pages, comentários dentro dos códigos, informações nos arquivos README e BUGS ou... da forma mais árdua, testando mesmo assim como já mostrei alguns que reportei e podem ser conferidos no meu canal clicando aqui. O que alias não é o meu interesse.

 Por exemplo, no arquivo BUGS do minised é descrito como não havendo a necessidade de regressão até o momento; porém, como puderam acompanhar no inicio, vale ressaltar que sua base de código é bem pequena (o que é muito vantajoso). Apesar disso, eu encontrei apenas dois comentários de FIXME nos códigos sedcomp.c e sedexec.c (/* FIXME: scan for the brace end */ e /* FIXME: lastep becomes start */).

 O mesmo ocorre no toybox sed (tendo sua base de código ainda menor que do minised). A primeira versão do sed no toybox surgiu na versão 0.5.1 (em Novembro de 2014). De lá para cá, poucos bugs foram encontrados (total de 11 bugs encontrados e corrigidos desde então. Um deles pode ser conferido clicando aqui) e poucos deles eram críticos. O minised teve 12 correções desde a versão 1.3 que podem ser lidos em seu README.

 E que comece o choro e ranger de dentes. O gnu-sed é o que mais podemos encontrar bugs. Em seu próprio git (clicando aqui) ou podem ser conferidos no Debian Bugs clicando aqui apresentam uma lista de bugs conhecidos.

 Já o Busybox_SED possui apenas duas informações de FIXME em seu código mas é possível consultar bugs em seu próprio bug reports clicando aqui.

 No código do sbase sed existem 20 comentários com o dizer FIXME. Estes comentários descrevem correcções que ainda são necessárias. Foi difícil encontrar algo relacionado ao 9base sed, há sim correções ocorrendo e podem ser conferidas no próprio git do plan9port (clicando aqui), mas não é uma lista fácil de encontrar (muito menos especificamente de seu sed).

 VENCEDOR:  Com excessão do gnu-sed, todos os demais apresentaram baixa quantidade de bugs.


DESEMPENHO

 E por fim, a parte que a galera vai para delírio: benchmarks... Parece que a galera pira com essa palavra. Aqui eu considerei analisar tanto o uso de CPU quanto o tempo para a concluir as operações. E obtivemos os seguintes resultados:


 Estranhamente tanto o gnu-sed, o sbase sed, o 9base sed e o busybox_SED se comportam da mesma forma. eles sempre se mantêm na margem de 86-89% de uso de CPU, nunca a menos nem a mais do que isso. Mas não devemos analisar unicamente o uso de CPU pois, de certo forma, isso pode significar tanto algo bom quanto algo ruim; tudo vai depender muito da situação.

 Reparem um exemplo disso na imagem abaixo onde fiz uma analise entre o minised e o gnu-sed sendo eles separados pela faixa azul. Enquanto o gnu-sed manteve o uso de 89% de CPU, o minised desta vez fez uso de 106%. Apesar do uso de CPU do minised ter sido mais alto, o mimised concluiu sua operação em 120ms enquanto que o gnu-sed concluiu a mesma operação em 284ms.

minised and GNU sed comparasion.
Comparação de uso de CPU e tempo de conclusão entre minised e gnu-sed

 Para que o gnu-sed, sbase sed, 9base sed e o busybox_SED consigam concluir as operações no mesmo tempo que o minised, seria necessário que utilizassem entre 136,17% a 161,87% a mais de CPU além dos 89% já utilizado. O que totalizaria entre 225,17% a 250,87% de uso de CPU.

 VENCEDOR: Empate entre o minised (utilizando entre 61% - 76% de CPU porém, com menor tempo de execução) e toybox sed (utilizando entre 50% - 76% de CPU, algumas vezes atingindo 88%). Os demais ficam entre 86% a 89% de uso de CPU e o mesmo tempo de execução.


CONCLUSÃO

 O primeiro lugar fica para o toybox sed com 6 pontos. O minised em segundo com 5 pontos perdendo apenas na descrição de ajuda apesar que possui uma boa manpage. Então poderíamos declarar empate entre os dois já que o minised possui desempenho melhor do que o toybox sed.

 O segundo lugar ficaria empatado entre o busybox_SED com quatro ponto (tamanho, recursos, descrição de ajuda e poucos bugs) e o sbase sed (licença, tamanho, recursos e poucos bugs). O 9base sed teve três pontos (licença, recursos e bugs) e o gnu-sed apenas dois pontos (recursos e descrição de ajuda).

sed implementations analise conclusion
Conclusão da analise das implementações do sed

Existem outras implementações ou comandos semelhantes como é o caso do comando sd , mas não nos interessa para este artigo.

sd é um comando que pode substituir find, sed e awk.
sd é um comando que pode substituir find, sed e awk.

Marcadores

A pior história sobre Linux que já ouvi (6) A.I (2) ambiente gráfico (19) AMD (14) analise (10) Andriod (17) android (9) Apple (1) arm (5) artigo (5) aws (1) bc (24) benchmark (6) BetrFS (1) biglinux (1) blackhat (1) BSDs (36) btrfs (32) bugs (2) Caixa de Ferramentas do UNIX (18) canonical (1) canto do Diego Lins (2) certificações Linux (7) Código Fonte (53) comandos (34) comp (1) compressores (9) consoles (1) container (8) CPU (20) cracker (1) criptografia (5) crowdfunding (9) cursos (24) daemons (14) Debian (31) desempenho (2) desenvolvimento (105) desktop (19) DevOps (3) DevSecOps (4) dic (1) Dica de leitura (91) dica DLins (2) dicas do Flávio (27) Dicas TechWarn (1) diet libc (4) diocast (1) dioliunx (3) distribuições Linux (15) Docker (13) DragonflyBSD (24) driver (2) dropbear (3) ead Diolinux (2) edição de vídeo (5) embarcados (1) EMMI Linux (4) emuladores (9) endless (5) English interview (3) Enless OS (2) entrevista (17) espaço aberto (82) evento (6) facebook (1) Fedora (11) filesystem (82) financiamento coletivo (2) fork (4) fox n forests (4) FreeBSD (23) Funtoo Linux (13) games (96) garbage collector (1) gerenciadores de pacotes (4) glaucus (8) GOG (3) google (9) gpu (4) hacker (2) hardware (104) hash (1) helenos (3) I.A (1) init system (13) Intel (16) inteligencia artificial (2) IoT (1) ispconfig (1) jogos (40) kde (1) kernel (144) lançamento (64) leis (1) LFCS (1) libs (2) licenças (10) Linus (16) linus torvalds (2) Linux (196) linux foundation (3) linux para leigos (1) live (4) lkgr (1) LPI (8) LTS (1) Mac (1) machine learning (1) matemática (9) mesa redonda (27) microcontroladores (1) microsoft (6) microst (1) muito além do GNU (183) musl (3) não viva de boatos (9) navegadores (5) NetBSD (7) newlib (1) nim (13) nimlang (5) nintendo (2) novatec (17) novidades (1) nuvem (1) o meu ambiente de trabalho (3) off-topic (12) ONLYOFFICE (5) open source (85) OpenBSD (8) OpenShift (1) oracle (1) os vários sabores de Linux (46) padrim (2) palestras e eventos (5) partições (6) pentest (8) performance (1) pipewire (1) plan9 (3) playstation (1) processadores (30) professor Augusto Manzano (11) Programação (72) promoção (1) propagandas com Linux (8) ps4 (1) real-time. (1) Red Hat (23) redes (4) resenha nerd (5) Resumo da Semana do Dlins (2) resumo do Tux (19) retrospectiva Linux (1) risc-V (14) RISCV (13) rtos (2) runlevel (2) rust (16) Sega (1) Sega Saturn (1) segurança digital (28) servidor web (2) servidores (3) shell (13) shell script (10) sistema operacional (26) skarnet (2) smartphones (3) Software livre e de código aberto (150) sorteio (3) Steam (11) Steam no Linux (9) supercomputadores (4) suse (7) systemd (9) terminal (91) terminal de comandos (22) toca do tux (1) toybox (32) tutorial (6) Tux (3) ubuntu (1) unboxing (7) UNIX (17) UNIX Toolbox (13) vartroy (1) vga (1) virtualização (3) vulnerabilidade (7) wayland (5) web (1) whatsapp (1) whitehat (1) Windows Subsystem for Linux (2) wine (14) WoT (1) yash (1) ZFS (16) zsh (3)