terça-feira, 30 de setembro de 2025

Ataque de "Negação Distribuída de Serviço" ao sítio do projeto GNU (notícia publicada em 05 de dezembro de 2024)

SysOps da FSF limpando a internet
por Michael McMahon — Publicado em 05 de dezembro de 2024, às 16h39
Colaboradores: Equipe SysOps da FSF

O texto a seguir foi inteiramente traduzido pelo Google Tradutor. O texto original (escrito em inglês) está acessível em <https://www.fsf.org/bulletin/2024/fall/fsf-sysops-cleaning-up-the-internet>.
 
A equipe SysOps, composta por apenas dois funcionários da FSF em tempo integral e alguns voluntários, dedica um tempo considerável a impedir que ataques derrubem nossos serviços, além de nossas operações habituais. Hospedamos mais de sessenta e três serviços, plataformas e sites diferentes para a equipe da FSF, o Projeto GNU, projetos da comunidade e a comunidade de software livre em geral em nosso próprio hardware de doze anos, que utiliza BIOS livres. Como acontece com muitas outras entidades na internet, os ataques geralmente ocorrem na forma de um ataque de Negação de Serviço Distribuída (DDoS), que pode usar milhares de dispositivos para atingir seu objetivo de inundar os servidores do alvo e, por fim, derrubá-lo.

Alguns dos nossos incidentes mais graves aconteceram em 2016 com um serviço terceirizado de mitigação de DDoS, envolvendo até mesmo o FBI. Não vou escrever sobre os detalhes dos nossos incidentes recentes ou em andamento, pois não quero ajudar ninguém que esteja nos atacando ativamente neste momento. O que posso mencionar, no entanto, é que um dos ataques recentes, ocorrido nos últimos meses, exigiu o bloqueio de mais de 40.000 endereços IP para um ataque DDoS. Também posso compartilhar algumas das ferramentas que usamos semanalmente para investigar ataques, que estão um pouco simplificadas para este artigo, mas que esperamos que sejam úteis para outros administradores de sistemas:
Monitoramento

Com ferramentas como Prometheus e Uptime Kuma, podemos ser alertados quando um serviço cai ou quando o tempo de resposta aumenta. Um padrão de alertas pode indicar a necessidade de uma investigação.
Analisando logs

Os logs do serviço afetado geralmente contam uma história, mas é difícil ler os logs linha por linha. Os logs podem ser analisados ​​usando variações de utilitários clássicos, como Bash, cat, zcat, grep, egrep, awk, sed, sort, uniq e tail. Normalmente, encontro os dez principais endereços IP que se comunicam com um serviço e, em seguida, procuro os três principais agentes de usuário usados ​​por esse endereço e uma amostra do que eles estão acessando.
Encontrando padrões

Você provavelmente notará tráfego estranho examinando arquivos de log de qualquer site disponível publicamente. Se um rastreador normal estiver acessando 1.000 páginas, é provável que algo esteja errado quando outro endereço tiver mais de 30.000 linhas no log. Exemplos reais de quando algo está errado incluem: procurar continuamente por páginas específicas do WordPress e o site não estiver usando WordPress; alegar ser o Googlebot e seu host não resolver como Google; não seguir o arquivo robots.txt; se o agente de usuário for um navegador de desktop padrão e eles estiverem gerando milhares de linhas de log; se uma string do agente de usuário estiver vazia; ou se eles solicitarem páginas várias vezes por segundo.
Pesquisando ASNs

Usamos o IPtoASN para fornecer tabelas atualizadas de números de sistema autônomo (ASNs) sem custo. É o único que encontramos que envolve o download de um banco de dados local que pode ser consultado. ASN é um número de identificação que representa um conjunto de endereços pertencentes a uma operadora de rede. Assim que tivermos uma tabela de ASNs local, consultamos a tabela com os endereços considerados questionáveis ​​para obter uma melhor compreensão em escala macro. Adicionar essas informações, bem como o comportamento às regras de firewall, nos ajuda a procurar padrões ao longo do tempo.
Bloqueio

Usamos uma variedade de firewalls para impedir que endereços cheguem aos nossos servidores antes de reiniciar o serviço afetado. Podemos precisar bloquear endereços individuais, endereços CIDR, provedores VPS ou até mesmo ASNs inteiros. Quando bloquear um endereço ou um bloco de endereços não for suficiente, regras podem ser escritas para procurar padrões de comportamento com ferramentas como o fail2ban. O exemplo de regra padrão quando o fail2ban é instalado é bloquear temporariamente um endereço IP após três tentativas de SSH com falha. As regras do Fail2ban podem ser escritas para corresponder aos padrões em qualquer arquivo de log. Ao escrever regras de fail2ban, esteja ciente de que pode ser fácil escrever regras muito agressivas, o que pode causar uma negação de serviço. Embora os padrões do fail2ban sejam sensatos, você pode observar os logs do fail2ban com atenção e ajustar as configurações para evitar o bloqueio de tráfego válido. É importante encontrar um bom equilíbrio com as regras do fail2ban.
Relatórios de abuso

Às vezes, o bloqueio não é suficiente para prevenir ou interromper o abuso persistente. Esse abuso pode ser denunciado a empresas de hospedagem e Provedores de Serviços de Internet (ISPs). Às vezes, os IPSs fornecem uma página para denunciar abusos, mas essa página pode usar JavaScript não livre. Geralmente, podemos contornar o uso de JavaScript não livre em casos como esses enviando um e-mail com uma descrição do abuso, um trecho do log e o comportamento esperado para abuse@theirdomain.com. Muitos relatórios de abuso não são respondidos, mas quando respondem, pode valer a pena.

Vemos três tipos de atividade de abuso com mais frequência em nossos servidores web. Várias organizações se dedicam à varredura de vulnerabilidades, um abuso que varre ativamente a Internet o tempo todo, na maioria das vezes que podem ser bloqueados com firewalls no nível do roteador. Outro tipo de scanner que pode ser persistente são os programas escritos para pesquisar sites inteiros, ou rastreadores de sites. A maioria dos programas rastreadores é gentil com os servidores que rastreiam, mas o mesmo não pode ser dito daqueles que ignoram os arquivos robots.txt, rastreiam muito rápido e derrubam sites, especialmente aqueles escritos por grandes empresas de modelos de linguagem. Também vemos alguma automação de integração contínua, que rastreia constantemente sites em busca de alterações, como as em nossas páginas de licenciamento.
Diferentes tecnologias

Por vários motivos, o tráfego da Internet que entra e sai de alguns locais, como a República Popular da China, se comporta de maneira diferente de qualquer outro lugar do mundo. Isso pode ter a ver com o Grande Firewall da China, NAT de nível de operadora e roteamento. Muitos comportamentos diferentes podem ser observados simultaneamente vindos dos mesmos endereços IP que se conectam a ASNs chineses. Como há tráfego bom misturado com tráfego ruim vindo dos mesmos endereços, ferramentas tradicionais como fail2ban e firewalls interrompem a funcionalidade. Se eu criar uma regra fail2ban para bloquear comportamentos nefastos vistos em um endereço chinês, também bloquearei o tráfego legítimo que tenta usar o mesmo endereço IP. Recentemente, comecei a usar um firewall de aplicação web chamado Modsecurity, que permite a modelagem de tráfego por agente de usuário em vez de apenas por endereço IP. Atualmente, estamos limitando a taxa de alguns agentes de usuário, mas planejamos adicionar mais configurações no futuro.
O que você pode fazer para ajudar?

Administrar nossos recursos minimalistas, conservar nossa computação e otimizar nossos recursos financeiros exige muito tempo e esforço. Mesmo com todas as ferramentas que usamos para investigar e bloquear ataques, estamos sempre buscando mais ajuda e listamos muitas maneiras de se voluntariar em fsf.org/volunteer. A melhor maneira de demonstrar apoio de longo prazo à equipe de SysOps da FSF, e à FSF como um todo, é se tornar um membro associado da FSF

Ataque de "Negação Distribuída de Serviço" ao sítio do Projeto GNU (notícia publicada em 02 de julho de 2025)

Nossa pequena equipe versus milhões de bots
por Ian Kelling — Publicado em 02 de julho de 2025, 14h25
Leia a atualização mais recente originária da equipe técnica da FSF.

O texto a seguir foi inteiramente traduzido pelo Google Tradutor. O texto original (escrito em inglês) está acessível neste linque: <https://www.fsf.org/blogs/sysadmin/our-small-team-vs-millions-of-bots>.

A equipe de SysOps da FSF é composta por dois funcionários em tempo integral e um punhado de voluntários dedicados. Grande parte do nosso trabalho consiste em executar o software e os servidores físicos que hospedam sites e outros serviços para projetos GNU, FSF e outros projetos de software livre, incluindo máquinas virtuais para a extensão de navegador JShelter, o ambiente de desktop e a coleção de software KDE, e o Sugar Labs, uma organização que cria ferramentas de aprendizagem para crianças. Recentemente, contabilizamos setenta serviços diferentes e temos uma dúzia de servidores físicos em dois data centers na área de Boston.

Desde a última vez que escrevemos, muita coisa aconteceu e, embora eu adorasse falar sobre tudo isso, incluindo o processo de implantação de quatro novos servidores em nossos data centers, quero me concentrar na enorme tarefa de manter nossos serviços diante dos contínuos (e crescentes) ataques distribuídos de negação de serviço (DDoS). Um ataque DDoS normalmente ocorre quando invasores controlam milhares ou milhões de máquinas e fazem com que todas enviem solicitações ou outro tráfego para um servidor alvo. Em seguida, o servidor fica sobrecarregado com o processamento dessas solicitações e não responde às solicitações de usuários legítimos. Uma maneira comum de se defender contra um ataque DDoS, que frequentemente usamos, é descobrir uma maneira de identificar quais endereços IP estão enviando solicitações como parte do DDoS e, em seguida, fazer com que o servidor ignore as solicitações desses endereços IP.

Nossa infraestrutura está sob ataque desde agosto de 2024. Os rastreadores web Large Language Model (LLM) têm sido uma fonte significativa dos ataques e, quanto ao restante, não esperamos saber que tipo de entidade está atacando nossos sites ou por quê.

No Boletim de outono, escrevemos sobre o ataque de agosto ao gnu.org. Esse ataque continua, mas nós o mitigamos. A julgar pelo padrão e escopo, o objetivo provavelmente era derrubar o site e não era um rastreador LLM. Não sabemos quem ou o que está por trás do ataque, mas, desde então, tivemos mais ataques com gravidade ainda maior.

Para começar, o GNU Savannah, o sistema de desenvolvimento colaborativo de software da FSF, foi atingido por uma botnet massiva que controlava cerca de cinco milhões de IPs a partir de janeiro. No momento em que este artigo foi escrito, o ataque ainda estava em andamento, mas a iteração atual da botnet foi mitigada. O objetivo provavelmente era construir um conjunto de dados de treinamento LLM. Não sabemos quem ou o que está por trás disso.

Além disso, gnu.org e ftp.gnu.org foram alvos de um novo ataque DDoS iniciado em 27 de maio de 2025. O objetivo parece ser derrubar o site. Atualmente, ele está mitigado. Ele teve várias iterações, e cada uma delas causou algumas horas de inatividade enquanto descobríamos como nos defender. Novamente, o objetivo provavelmente era derrubar nossos sites e não sabemos quem ou o que está por trás disso.

Além disso, directory.fsf.org, o servidor por trás do Diretório de Software Livre, está sob ataque desde 18 de junho. Provavelmente se trata de um scraper LLM projetado para atingir especificamente sites do Media Wiki com uma botnet. Esse ataque está muito ativo e agora foi parcialmente mitigado.

Conforme desenvolvíamos programas para identificar endereços IP pertencentes à botnet, eles às vezes identificavam incorretamente endereços IP de usuários legítimos. Nós os removemos da lista de endereços IP de DDoS e aprimoramos nossas defesas para torná-los mais precisos. Se você não tem acesso ao gnu.org no momento, envie-nos um e-mail para sysadmin@fsf.org com seu endereço IP e nós o verificaremos. Se você estiver com problemas com uma VPN (rede virtual privada), tente alternar os nós de saída e não nos contate — sabemos que nossos invasores usam VPNs, o que nos leva a bloquear as que eles estão usando.

Mais recentemente, os sistemas automatizados de construção de software se tornaram um problema para nós. Geralmente, eles são conhecidos pelo termo nada óbvio CI/CD, que significa "integração contínua ou implantação contínua". Eles enviam solicitações automatizadas para verificar se há novos códigos no Savannah a fim de reconstruir seu software. Frequentemente, enviam muito mais solicitações do que o necessário, o que parece e age como um ataque DDoS, mesmo que não seja intencional. As ferramentas de CI/CD normalmente não possuem informações de contato identificando seu tráfego, portanto, não temos como contatá-los caso haja algum problema além de banir seus endereços ou enviar relatórios de abuso, se conseguirmos encontrar um local para enviá-los. Tivemos que bloquear alguns desses endereços IP, o que frequentemente os leva a buscar maneiras melhores de atingir os mesmos objetivos.

Além de tudo isso, temos nossos rastreadores padrão comuns, rastreadores de SEO (otimização para mecanismos de busca), rastreadores que fingem ser usuários normais, rastreadores que fingem ser outros rastreadores, sistemas de tempo de atividade, scanners de vulnerabilidade, tradução de endereços de rede de nível de operadora, VPNs e navegadores comuns atacando nossos sites. É desgastante para nossos sites e para nossa equipe de funcionários e voluntários, pois precisamos descobrir uma abordagem de defesa específica para cada ataque. Alguns dos abusos não são Exclusivo para nós, e parece que a saúde da web está com sérios problemas no momento.

Quando você visita um site, ele pode enviar ao seu navegador um ou mais programas JavaScript. Esses programas JavaScript geralmente são proprietários. Explicamos isso com mais detalhes em "A Armadilha do JavaScript". Se um site lhe envia um programa JavaScript gratuito, você pode desenvolver uma versão modificada, compartilhá-la com outras pessoas para que elas possam se beneficiar e configurar seu navegador para executar a versão modificada em vez da que o site envia. Mas alguns programas JavaScript são malware, que fazem coisas como espionar você, e a única modificação que qualquer usuário desejaria é impedi-lo de ser executado.

Alguns desenvolvedores web começaram a integrar um programa chamado Anubis para diminuir a quantidade de solicitações que sistemas automatizados enviam e, assim, ajudar o site a evitar ataques DDoS. O problema é que o Anubis faz com que o site envie um programa JavaScript gratuito que age como malware. Um site que usa o Anubis responderá a uma solicitação para uma página da web com um programa JavaScript gratuito e não à página que foi solicitada. Se você executar o programa JavaScript enviado pelo Anubis, ele realizará alguns cálculos inúteis com números aleatórios e manterá uma CPU totalmente ocupada. Isso pode levar menos de um segundo ou mais de um minuto. Ao concluir, ele envia os resultados dos cálculos de volta ao site. O site verificará se o cálculo inútil foi realizado analisando os resultados e só então concederá acesso à página originalmente solicitada.

Na FSF, não apoiamos esse esquema porque ele entra em conflito com os princípios da liberdade de software. Os cálculos do programa JavaScript do Anubis são o mesmo tipo de cálculo feito por programas de mineração de criptomoedas. Um programa que realiza cálculos que o usuário não deseja é uma forma de malware. Software proprietário geralmente é malware, e as pessoas geralmente o executam não porque querem, mas porque foram pressionadas a fazê-lo. Se fizéssemos nosso site usar o Anubis, estaríamos pressionando os usuários a executar malware. Embora seja software livre, ele faz parte de um esquema muito semelhante ao software proprietário para ser aceitável. Queremos que os usuários controlem sua própria computação e tenham autonomia, independência e liberdade. Com o seu apoio, podemos continuar a colocar esses princípios em prática.

Mesmo sob ataque ativo, os sites gnu.org, ftp.gnu.org e savannah.gnu.org estão com tempos de resposta normais no momento, e assim têm sido durante a maior parte desta semana, em grande parte graças ao trabalho árduo dos hackers de Savannah, Bob, Corwin e Luke, que nos ajudaram, seus administradores de sistemas. Protegemos esses sites por quase um ano inteiro de ataques intensos e continuaremos combatendo esses ataques enquanto eles continuarem.

Nossa equipe técnica em tempo integral da FSF é composta por apenas dois administradores de sistemas, e atualmente não temos recursos para contratar mais técnicos em um futuro próximo. Sei que muitos leitores apoiam o movimento do software livre de diversas maneiras, o que apreciamos muito, mas, para melhorar nossa equipe, precisamos de mais membros associados.

Você pode se juntar a nós em nosso trabalho crucial para proteger a liberdade dos usuários e desafiar a distopia? Torne-se um membro associado hoje mesmo! Cada membro associado conta, e cada novo membro nos ajudará a atingir nossa meta de arrecadação de fundos de 200 novos membros. Ao nos apoiar hoje, você ajuda a desafiar a distopia que as Big Techs estão tentando nos impor.

Sabemos que nem todos têm condições de doar US$ 140 ou mais, e é por isso que também oferecemos a assinatura Friends por US$ 35, que vem com alguns benefícios a menos. Além disso, agora você pode se candidatar para receber uma assinatura patrocinada da FSF.

Obrigado por apoiar a equipe de tecnologia! 

segunda-feira, 1 de setembro de 2025

BLFS 12.4 traduzido para o português brasileiro

Olá a todos(as).

Estou muito feliz em anunciar o lançamento do livro "Beyond Linux From Scratch" (versão 12.4) traduzido para o português brasileiro.

(Links nos comentários)

Este é o repositório principal:
https://github.com/espindula/br-blfs

Estes são os secundários (para redundância):
https://gitlab.com/jafesp/br-blfs
https://salsa.debian.org/jamenson/br-blfs


Edição System V
===============

Link para leitura online:
<https://br.linuxfromscratch.org/blfs/view/12.4/>

Links para download:

Formato PDF:
<https://github.com/espindula/br-blfs/releases/download/v12.4-sysv/BLFS-SYSV-BOOK-12.4-pt_BR.pdf>

Formato HTML (fragmentado):
<https://github.com/espindula/br-blfs/releases/download/v12.4-sysv/BLFS-SYSV-BOOK-12.4-pt_BR-HTML.tar.bz2>

Formato HTML (monolítico):
<https://github.com/espindula/br-blfs/releases/download/v12.4-sysv/BLFS-SYSV-BOOK-12.4-pt_BR-NOCHUNKS.html>

Formato de texto simples:
<https://github.com/espindula/br-blfs/releases/download/v12.4-sysv/BLFS-SYSV-BOOK-12.4-pt_BR-NOCHUNKS.txt>

Formato epub:
<https://github.com/espindula/br-blfs/releases/download/v12.4-sysv/BLFS-SYSV-BOOK-12.4-pt_BR.epub>

Somas MD5:
<https://github.com/espindula/br-blfs/releases/download/v12.4-sysv/BLFS-SYSV-BOOK-12.4-pt_BR-MD5SUMS.txt>

Somas SHA1:
<https://github.com/espindula/br-blfs/releases/download/v12.4-sysv/BLFS-SYSV-BOOK-12.4-pt_BR-SHA1SUMS.txt>


Edição systemd
==============

Link para leitura online:
<https://br.linuxfromscratch.org/blfs/view/12.4-systemd/>

Links para download:

Formato PDF:
<https://github.com/espindula/br-blfs/releases/download/v12.4-systemd/BLFS-SYSD-BOOK-12.4-pt_BR.pdf>

Formato HTML (fragmentado):
<https://github.com/espindula/br-blfs/releases/download/v12.4-systemd/BLFS-SYSD-BOOK-12.4-pt_BR-HTML.tar.bz2>

Formato HTML (monolítico):
<https://github.com/espindula/br-blfs/releases/download/v12.4-systemd/BLFS-SYSD-BOOK-12.4-pt_BR-NOCHUNKS.html>

Formato de texto simples:
<https://github.com/espindula/br-blfs/releases/download/v12.4-systemd/BLFS-SYSD-BOOK-12.4-pt_BR-NOCHUNKS.txt>

Formato epub:
<https://github.com/espindula/br-blfs/releases/download/v12.4-systemd/BLFS-SYSD-BOOK-12.4-pt_BR.epub>

Somas MD5:
<https://github.com/espindula/br-blfs/releases/download/v12.4-systemd/BLFS-SYSD-BOOK-12.4-pt_BR-MD5SUMS.txt>

Somas SHA1:
<https://github.com/espindula/br-blfs/releases/download/v12.4-systemd/BLFS-SYSD-BOOK-12.4-pt_BR-SHA1SUMS.txt>


Link para o anúncio na lista internacional de discussão:

<https://lists.linuxfromscratch.org/sympa/arc/blfs-dev/2025-09/msg00001.html>

LFS 12.4 traduzido para o português brasileiro

Olá a todos(as).

Estou muito feliz em anunciar o lançamento do livro "Linux From Scratch" (versão 12.4) traduzido para o português brasileiro. Agradeço imensamente ao Julien Lepiller (membro da equipe de tradução francesa) por me ajudar com os arquivos de objetos portáteis (PO) para facilitar o processo de tradução por meio do servidor Weblate. Realmente, o processo de traduzir é mais fácil com o Weblate, porque editar os arquivos XML exige diretamente a inserção do texto traduzido entre o XML MarkUps, tornando-o mais difícil e demorado.

Este é o repositório principal:
https://github.com/espindula/br-lfs

Estes são os secundários (para redundância):
https://gitlab.com/jafesp/br-lfs
https://salsa.debian.org/jamenson/br-lfs

Edição System V
===============

Link para leitura online:
<https://br.linuxfromscratch.org/lfs/view/12.4/>

Links para download:

Formato PDF:
<https://github.com/espindula/br-lfs/releases/download/v12.4-sysv/LFS-SYSV-BOOK-12.4-pt_BR.pdf>

Formato HTML (fragmentado):
<https://github.com/espindula/br-lfs/releases/download/v12.4-sysv/LFS-SYSV-BOOK-12.4-pt_BR-HTML.tar.bz2>

Formato HTML (monolítico):
<https://github.com/espindula/br-lfs/releases/download/v12.4-sysv/LFS-SYSV-BOOK-12.4-pt_BR-NOCHUNKS.html>

Formato de texto simples:
<https://github.com/espindula/br-lfs/releases/download/v12.4-sysv/LFS-SYSV-BOOK-12.4-pt_BR-NOCHUNKS.txt>

Formato epub:
<https://github.com/espindula/br-lfs/releases/download/v12.4-sysv/LFS-SYSV-BOOK-12.4-pt_BR.epub>

Somas MD5:
<https://github.com/espindula/br-lfs/releases/download/v12.4-sysv/LFS-SYSV-BOOK-12.4-pt_BR-MD5SUMS.txt>

Somas SHA1:
<https://github.com/espindula/br-lfs/releases/download/v12.4-sysv/LFS-SYSV-BOOK-12.4-pt_BR-SHA1SUMS.txt>


Edição systemd
==============

Link para leitura online:
<https://br.linuxfromscratch.org/lfs/view/12.4-systemd/>

Links para download:

Formato PDF:
<https://github.com/espindula/br-lfs/releases/download/v12.4-systemd/LFS-SYSD-BOOK-12.4-pt_BR.pdf>

Formato HTML (fragmentado):
<https://github.com/espindula/br-lfs/releases/download/v12.4-systemd/LFS-SYSD-BOOK-12.4-pt_BR-HTML.tar.bz2>

Formato HTML (monolítico):
<https://github.com/espindula/br-lfs/releases/download/v12.4-systemd/LFS-SYSD-BOOK-12.4-pt_BR-NOCHUNKS.html>

Formato de texto simples:
<https://github.com/espindula/br-lfs/releases/download/v12.4-systemd/LFS-SYSD-BOOK-12.4-pt_BR-NOCHUNKS.txt>

Formato epub:
<https://github.com/espindula/br-lfs/releases/download/v12.4-systemd/LFS-SYSD-BOOK-12.4-pt_BR.epub>

Somas MD5:
<https://github.com/espindula/br-lfs/releases/download/v12.4-systemd/LFS-SYSD-BOOK-12.4-pt_BR-MD5SUMS.txt>

Somas SHA1:
<https://github.com/espindula/br-lfs/releases/download/v12.4-systemd/LFS-SYSD-BOOK-12.4-pt_BR-SHA1SUMS.txt>


Link para o anúncio na lista internacional de discussão:

<https://lists.linuxfromscratch.org/sympa/arc/lfs-dev/2025-09/msg00001.html>

sábado, 16 de agosto de 2025

LFS-12.4-rc1 está lançado

A comunidade Linux From Scratch anuncia o lançamento do LFS Versão 12.4-rc1. Ela é um lançamento preliminar do LFS-12.4.

As principais mudanças incluem atualizações do conjunto de ferramentas para binutils-2.45, glibc-2.42 e gcc-15.2.0. No total, 48 pacotes foram atualizados desde o último lançamento. Um pacote, packaging (um módulo Python), foi adicionado e um pacote, check, foi removido. Mudanças no texto também foram feitas ao longo do livro. O núcleo Linux também foi atualizado para a versão 6.16.1.

Nós incentivamos todos(as) os(as) usuários(as) a lerem esse lançamento do livro e a testarem as instruções para que possamos tornar o lançamento final o melhor possível.

Você consegue ler o livro online[0] ou baixá-lo[1] para ler localmente.

Em coordenação com esse lançamento, uma nova versão do LFS usando o pacote systemd também está sendo lançada. Esse pacote implementa o estilo mais recente do systemd de inicialização e controle do sistema e é consistente com o LFS na maioria dos pacotes.

Você consegue ler a versão systemd do livro online[2] ou baixar[3] para ler localmente.

Bruce

[0] http://www.linuxfromscratch.org/lfs/view/12.4-rc1/
[1] http://www.linuxfromscratch.org/lfs/downloads/12.4-rc1/
[2] http://www.linuxfromscratch.org/lfs/view/12.4-systemd-rc1/
[3] http://www.linuxfromscratch.org/lfs/downloads/12.4-systemd-rc1/

terça-feira, 3 de junho de 2025

LFS construído dentro de arquivo e destinado para pendrive bootável

Este texto descreve as etapas para se criar um armazenamento em arquivo e usá-lo como mídia para construir um sistema operacional completo Linux From Scratch (LFS).


Resumo:

Etapa um: criar arquivos a serem usados como armazenamento

Etapa dois: construir o sistema operacional a partir dos pacotes de códigos fonte

Etapa três: copiar o arquivo para uma unidade USB flash


Etapa um: criar arquivos a serem usados como armazenamento

Objetivo: criar dois arquivos, um provisório e outro final, para servirem de armazenamento. O arquivo provisório será onde o sistema operacional LFS inteiro será construído (tamanho mínimo 10 GB). O arquivo final será menor (cerca de 3 GB), para acomodar o sistema com os programas e as bibliotecas já despojados dos símbolos de depuração. Se a intenção for a de produzir uma unidade inicializável maior que 10 GB, então pode-se criar somente o arquivo final (o que exigirá uma unidade USB flash com capacidade de armazenamento maior que 10 GB).

Existem dois métodos: um cria um "arquivo contíguo" e o outro cria um "arquivo esparso". Um deles deverá ser escolhido. Somente um dos comandos abaixo deverá ser escolhido e executado!

Método um (lento): criando um arquivo contíguo

dd if=/dev/zero of=disco-provisorio.img bs=4096B count=3000000 status=progress

A saída gerada pelo comando acima deverá ser semelhante a esta:

12255150080 bytes (12 GB, 11 GiB) copied, 147 s, 83,4 MB/s
3000000+0 records in
3000000+0 records out
12288000000 bytes (12 GB, 11 GiB) copied, 151,031 s, 81,4 MB/s


dd if=/dev/zero of=disco-virtual.img bs=100MB count=30 status=progress

A saída gerada pelo comando acima deverá ser semelhante a esta:

3000000000 bytes (3,0 GB, 2,8 GiB) copied, 27 s, 111 MB/s
30+0 records in
30+0 records out
3000000000 bytes (3,0 GB, 2,8 GiB) copied, 27,0483 s, 111 MB/s


Método dois (rápido): criando um arquivo esparso

fallocate --lenght 12GB disco-provisorio.img

fallocate --lenght 3GB disco-virtual.img

truncate --size=12GB disco-provisorio.img

truncate --size=3GB disco-virtual.img

OBSERVAÇÃO IMPORTANTÍSSIMA: É PROIBIDO (PELO NÚCLEO Linux) USAR ARQUIVOS "ESPARSOS" (ARQUIVOS CUJOS TAMANHO DE BLOCO SEJA IGUAL A ZERO) COMO ÁREA DE TROCA (ARQUIVO DE SWAP).

Resultado: Criado um arquivo ("disco-provisorio.img") cuja capacidade de armazenamento é de 12 GB e um arquivo ("disco-virtual.img") cuja capacidade de armazenamento é de 3 GB.

Próximo passo é o de se criar o sistema de arquivos dentro desses dois arquivos. Anexe esse arquivo ao sistema de arquivos do sistema operacional em execução (o comando abaixo exige privilégios de administração do sistema e só pode ser executado como "root" ou via "sudo"):

losetup --partscan --show --verbose --find disco-provisorio.img
/dev/loop0

losetup --list
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE   DIO LOG-SEC
/dev/loop0         0      0         0  0 disco-provisorio.img   0     512

Com os arquivos (contíguos ou esparsos) criados, agora é a hora de se criar o sistema de arquivos dentro de "disco-provisorio.img" (ainda como "root" ou via "sudo"):

mkfs.ext4 -L prov /dev/loop0

OBSERVAÇÃO IMPORTANTÍSSIMA: O ARQUIVO "disco-provisorio.img" COMO FOI FORMATADO CONSEGUE ABRIGAR A CONSTRUÇÃO DO SISTEMA OPERACIONAL LFS, PORÉM É IMPOSSÍVEL SE INSTALAR O CARREGADOR DE INICIALIZAÇÃO "GRUB" NELE, POIS LHE FALTAM AS PARTIÇÕES ESPECIALIZADAS PARA TAL FINALIDADE. TENTAR INSTALAR O GRUB (POR PADRÃO NO DIRETÓRIO /boot) GERARÁ UM ERRO DE AUSÊNCIA DE SUPORTE A "EMBUTIMENTO" NO SISTEMA DE ARQUIVOS, UMA REFERÊNCIA À ÁREA ENTRE O REGISTRO MESTRE DE INICIALIZAÇÃO E A PRIMEIRA PARTIÇÃO.

Desanexe "disco-provisorio.img"

losetup --detach /dev/loop0


Anexe o arquivo "disco-virtual.img" ao sistema de arquivos do sistema operacional em execução (o comando abaixo exige privilégios de administração do sistema e só pode ser executado como "root" ou via "sudo"):

losetup --partscan --show --verbose --find disco-virtual.img
/dev/loop0

Agora é hora de acessá-lo e de criar as partições especializadas a serem usadas para se instalar o carregador de inicialização e o sistema de arquivos do sistema operacional.

fdisk /dev/loop0

dentro do ambiente interativo do programa "fdisk", teclar "p" (opcional; apenas para imprimir na tela o esquema atual):

Comando (m para ajuda): p
Disco /dev/loop0: 2,79 GiB, 3000000000 bytes, 5859375 setores
Unidades: setor de 1 * 512 = 512 bytes
Tamanho de setor (lógico/físico): 512 bytes / 512 bytes
Tamanho E/S (mínimo/ótimo): 512 bytes / 512 bytes
Tipo de rótulo do disco: dos
Identificador do disco: 0xfe2bdb0d

Comando (m para ajuda):


Teclar "g" para criar um "rótulo de disco" do tipo GPT.

Comando (m para ajuda): g
Criado um novo rótulo de disco GPT (GUID: FAD0BC7D-63C9-C84E-80BD-4070028A9B9E).


Teclar "p" (opcional; apenas para confirmar que o esquema de partições foi criado conforme solicitado).

Comando (m para ajuda): p
Disco /dev/loop0: 2,79 GiB, 3000000000 bytes, 5859375 setores
Unidades: setor de 1 * 512 = 512 bytes
Tamanho de setor (lógico/físico): 512 bytes / 512 bytes
Tamanho E/S (mínimo/ótimo): 512 bytes / 512 bytes
Tipo de rótulo do disco: gpt
Identificador do disco: FAD0BC7D-63C9-C84E-80BD-4070028A9B9E

Comando (m para ajuda):

Observe que o "tipo de rótulo do disco" antes era "dos" e atualmente é "gpt", confirmando a criação (na verdade mudança) do esquema de partições.

Para criar efetivamente as partições no armazenamento, teclar "n".

Comando (m para ajuda): n
Número da partição (1-128, padrão 1):

O programa te solicitará que informe o número da partição, bastando teclar "enter" para aceitar o valor sugerido.

A seguir, o programa solicitará que você informe qual será o primeiro setor (início) da partição.

Primeiro setor (2048-5859341, padrão 2048):

Novamente, basta teclar "enter" e aceitar o valor sugerido. O próximo valor solicitado será o último setor (o final) da partição.

Último setor, +/-setores ou +/-tamanho{K,M,G,T,P} (2048-5859341, padrão 5859327):

Digitar "+5MB" e teclar "enter" para criar uma partição de tamanho cinco (05) mega bytes.

Criada uma nova partição 1 do tipo "Linux filesystem" e de tamanho 5 MiB.

Observação: nessa primeira partição será instalado o estágio "1,5" do GRUB para BIOS. Esse programa, o GRUB, é um carregador de inicialização e exige uma partição de tamanho mínimo de 1 mega byte.

Teclar "p" (opcional; apenas para confirmar que a partição foi criada conforme solicitado).

Comando (m para ajuda): p
Disco /dev/loop0: 2,79 GiB, 3000000000 bytes, 5859375 setores
Unidades: setor de 1 * 512 = 512 bytes
Tamanho de setor (lógico/físico): 512 bytes / 512 bytes
Tamanho E/S (mínimo/ótimo): 512 bytes / 512 bytes
Tipo de rótulo do disco: gpt
Identificador do disco: FAD0BC7D-63C9-C84E-80BD-4070028A9B9E

Dispositivo  Início   Fim Setores Tamanho Tipo
/dev/loop0p1   2048 12287   10240      5M Linux sistema de arquivos

Observação: por pré definição, o tipo da partição será "Linux". Precisamos mudar isso! Teclar "m" e depois "enter" mostrará o menu do programa. A opção para se mudar o tipo da partição é a "t". Tecle "t" e depois "enter" para mudar o tipo da partição. Informe o novo tipo (se não souber qual valor informar, então digite "L" (maiúsculo) para exibir todos os tipos conhecidos pelo programa "fdisk"). O tipo desejado é o "4" (BIOS boot). Teclar "q" para sair da exibição da lista. Teclar "4" e depois "enter" para selecionar o novo tipo, ou seja, "BIOS boot". O programa exibirá uma mensagem informativa, mas sempre é possível teclar-se "p" para imprimir na tela como está atualmente a configuração. Confirme na sexta coluna (rotulada de "Tipo") o tipo atual da partição, que deverá ser "BIOS inicialização". Sugere-se agora teclar "w" e depois "enter" para escrever as mudanças no armazenamento. Como efeito colateral da ação de salvar as mudanças, automaticamente o ambiente interativo será terminado. Sem problemas! Bastar acessar novamente o ambiente interativo do programa.

Atualmente, espera-se que exista somente uma partição, de tamanho 5MB, do tipo "BIOS inicialização". Essa partição servirá para se instalar o carregador de inicialização GRUB destinado especificamente para máquinas BIOS. Para máquinas EFI, será criada outra partição destinada para se instalar o GRUB adequado para tal método de inicialização de sistema operacional. É isso o que agora será feito.

Pressionar e manter pressionada a tecla "Ctrl" enquanto pressiona a tecla "l" "limpa" a tela para melhor visualização. Teclar "n" e depois "enter" para criar uma partição nova. É o mesmo procedimento usado para criar a partição 1. O programa solicitará que seja informado um número para a partição, bastando teclar "enter" para aceitar o valor sugerido. A seguir, será solicitado que seja informado o início da partição (primeiro setor). Novamente, teclar "enter" para aceitar o valor automaticamente sugerido pelo programa. Por último, será solicitado o valor que representa o final da partição (o último setor). Sugere-se informar o tamanho "+50MB" para que seja criada uma partição de tamanho 50 mega bytes. O programa então informará que foi criada uma segunda partição, do tipo "Linux filesystem" (Linux sistema de arquivos) e de tamanho de 48 mibibytes. Pressione e mantenha pressionada a tecla "Ctrl" e tecle "l" para "limpar" a tela e melhorar a visualização e em seguida tecla "p" mais uma vez para imprimir na tela o estado atual do esquema de partições. Mais uma vez a partição 2 deverá ser mudada para ajustar o tipo para o tipo correto destinado a se instalar o GRUB para máquinas EFI. Teclar "t" e depois "enter" para mudar o tipo da partição. O programa informará que a partição 2 já está selecionada para mudanças. Basta teclar "enter" para prosseguir. Agora o valor a ser informado deverá ser aquele que corresponde a partições especializadas para inicializar máquinas EFI. Teclar "L" (maiúsculo) listará todos os tipos conhecidos. O valor "1" deverá ser o valor informado. Teclar "q" para sair da lista. Teclar "1" e depois "enter". O programa informará que o tipo da partição foi mudado de "Linux filesystem" para "EFI System". "Limpe" a tela ("Ctrl" + l) e imprima na tela o estado atual da configuração teclando "p". Confirme se a sexta coluna mostra o tipo da partição como "Sistema EFI". Tecle "w" e depois "enter" para escrever as mudanças. Acesse mais uma vez o ambiente interativo do programa "fdisk". Tecla "p" mais uma vez. Finalmente, a última partição será criada teclando-se "n", depois "enter", depois "enter" novamente para se aceitar o número sugerido para essa nova partição, "enter" para aceitar a sugestão de valor para o início (primeiro setor) da partição e "enter" para aceitar a sugestão de final (último setor) da partição. "Limpe" a tela (com "Ctrl" + "l") para melhorar a visualização e tecle "p" para imprimir na tela o estado atual da configuração. No final, o esquema de partições deverá ser semelhante a este (exceto para o nome do disco "teste3" que deverá ser "disco-virtual.img"):

Comando (m para ajuda): p
Disco /dev/loop0: 2,79 GiB, 3000000000 bytes, 5859375 setores
Unidades: setor de 1 * 512 = 512 bytes
Tamanho de setor (lógico/físico): 512 bytes / 512 bytes
Tamanho E/S (mínimo/ótimo): 512 bytes / 512 bytes
Tipo de rótulo do disco: gpt
Identificador do disco: FAD0BC7D-63C9-C84E-80BD-4070028A9B9E

Dispositivo  Início     Fim Setores Tamanho Tipo
/dev/loop0p1   2048   12287   10240      5M BIOS inicialização
/dev/loop0p2  12288  110591   98304     48M Sistema EFI
/dev/loop0p3 110592 5859327 5748736    2,7G Linux sistema de arquivos

Teclar "w" para escrever as mudanças no arquivo de armazenamento e sair do ambiente interativo do programa "fdisk".

Desanexe "disco-virtual.img" do sistema de arquivos:

losetup --list
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE              DIO LOG-SEC
/dev/loop0         0      0         0  0 disco-virtual.img   0     512

losetup --detach-all

losetup --list


Etapa dois: construir o sistema operacional a partir dos pacotes de códigos fonte

Esta etapa deverá seguir rigorosamente as instruções contidas no livro do projeto LFS (https://www.br.linuxfromscratch.org/), exceto que a mídia usada para armazenagem do sistema de arquivos será "loop0p3" (a partição de 12 GB) criada na etapa um.

Observação: conforme está escrito no livro, "2.4. Criando uma Nova Partição", o sistema operacional LFS completo e mínimo só pode ser construído dentro de uma partição de pelo menos 10 GB de tamanho, embora o sistema final ocupe cerca de 5 GB antes de se despojar os executáveis e as bibliotecas dos símbolos de depuração. Após o despojamento dos símbolos de depuração, o sistema operacional LFS inteiro ocupa cerca de 2,9 GB de espaço de armazenagem.

Em "2.5. Criando um Sistema de Arquivos na Partição", a partição a ser escolhida como mídia de armazenagem para o sistema de arquivos será "loop0p3" (adaptar conforme a saída gerada pelos programas "losetup --list" e "lsblk").

Anexe os dois arquivos ("disco-provisorio.img" e "disco-virtual.img") ao sistema de arquivos do sistema operacional atualmente em execução (como "root" ou via "sudo"):

losetup --partscan --show --verbose --find disco-provisorio.img
/dev/loop0

losetup --partscan --show --verbose --find disco-virtual.img
/dev/loop1

OBSERVAÇÃO IMPORTANTE: ATENTE-SE PARA QUAL DISPOSITIVO DE CICLO ("loop") FOI ATRIBUÍDO A QUAL ARQUIVO. SEMPRE É POSSÍVEL INVOCAR "losetup --list" PARA SE LISTAR OS DISPOSITIVOS DE CICLO VINCULADOS. SUGERE-SE ANEXAR NA ORDEM MOSTRADA.

losetup --list
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                 DIO LOG-SEC
/dev/loop1         0      0         0  0 /tmp/disco-virtual.img      0     512
/dev/loop0         0      0         0  0 /tmp/disco-provisorio.img   0     512

Crie o sistema de arquivos dentro do arquivo "disco-provisorio.img":

mkfs.ext4 -L prov /dev/loop0

A saída gerada pelo comando acima deverá ser semelhante a esta:

mke2fs 1.47.0 (5-Feb-2023)
Discarding device blocks: done                            
Creating filesystem with 3000000 4k blocks and 750720 inodes
Filesystem UUID: 7f7c2aef-da6a-4462-b84d-e2d472b72e33
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done


Crie o sistema de arquivos dentro do arquivo "disco-virtual.img":

mkfs.ext4 -L lfs /dev/loop1p3

A saída gerada pelo comando acima deverá ser semelhante a esta:

mke2fs 1.47.0 (5-Feb-2023)
Discarding device blocks: done                            
Creating filesystem with 718592 4k blocks and 179872 inodes
Filesystem UUID: 03e56950-95c7-4119-8f65-9addf10bd8e4
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done


Etapa três: copiar o arquivo para uma unidade USB flash

Neste ponto existe uma pequena armadilha: a partição existente dentro do arquivo provisório de armazenagem ("disco-provisorio.img") tem o tamanho de 12 GB, enquanto que o sistema operacional LFS inteiro mínimo já despojado dos símbolos de depuração (isso é crucial!) ocupa, como já dito, cerca de 2,9 GB de espaço de armazenamento. Possivelmente (foi o meu caso) a unidade USB ("pendrive") não tenha 12 GB de espaço para armazenar a partição atualmente existente dentro do arquivo de armazenagem. Portanto, é preciso copiar toda a árvore do sistema de arquivos (atualmente residente no arquivo "disco-provisorio.img", 12 GB) para um arquivo menor ("disco-virtual.img", 3 GB) e preparado para essa finalidade.

Mais uma vez, confirme se os dois arquivos estão vinculados aos respectivos dispositivos de ciclo:

losetup --list
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                 DIO LOG-SEC
/dev/loop1         0      0         0  0 /tmp/disco-virtual.img      0     512
/dev/loop0         0      0         0  0 /tmp/disco-provisorio.img   0     512

Com os arquivos já vinculados, monte os dois sistemas de arquivos existentes dentro desses dois arquivos:

mount -v /dev/loop0 /mnt/origem/
mount: /dev/loop0 montada em /mnt/origem.
 
mount -v /dev/loop1p3 /mnt/destino/
mount: /dev/loop1p3 montada em /mnt/destino.

OBSERVAÇÃO: caso se disponha de uma unidade USB flash capaz de armazenar mais que 12 GB, então os próximos passos são opcionais.

Crie um arquivamento provisório para copiar todo o sistema de arquivos do arquivo maior ("disco-provisorio.img"):

cd /mnt/origem/
tar --create --file=/tmp/arquivos.tar --wildcards .

ATENTE-SE PARA O CARACTERE PONTO (".") AO FINAL DO COMANDO. O CARACTERE COMPÕE O COMANDO.


Extraia todos os arquivos dentro do arquivo menor ("disco-virtual.img"):

cd /mnt/destino/
tar --extract --file=/tmp/arquivos.tar

Plugue a unidade USB na entrada USB da máquina. Aguarde alguns segundos para o núcleo Linux identificar as mídias de armazenamento existentes nele (se existirem).

Execute o programa "lsblk" para listar todos os dispositivos de bloco anexados ao sistema operacional em execução.

Identifique qual dispositivo de bloco corresponde à tua unidade USB (geralmente "/dev/sdb").

Para gerar a unidade USB flash inicializável ("pendrive bootável"), executar este comando (como "root" ou via "sudo"):

dd if=disco-virtual.img of=/dev/sdb bs=4M status=progress


Agradecimentos:

Fernando Ferreira Silva, pelo vídeo que inspirou todo esse trabalho: https://youtu.be/j_AxE1_Rl7U.

Paulo Kretcheu, pela palestra ministrada em 2020. https://youtu.be/eZtK1cFHvcQ.

segunda-feira, 14 de abril de 2025

Receitanet supostamente "corrompido" (IRPF 2025 com Debian GNU/Linux 12)

 

Solução:

Observação: todos os comandos seguintes foram executados como "root".


Saída gerada pelo comando "java -version":
openjdk version "17.0.14" 2025-01-21
OpenJDK Runtime Environment (build 17.0.14+7-Debian-1deb12u1)
OpenJDK 64-Bit Server VM (build 17.0.14+7-Debian-1deb12u1, mixed mode, sharing)

Observação: o comando acima mostra se o Ambiente de Tempo de Execução Java está instalado e, se estiver, qual a versão instalada.


Saída gerada pelo comando "apt install openjdk-11-jre":
Lendo listas de pacotes... Pronto
Construindo árvore de dependências... Pronto
Lendo informação de estado... Pronto        
openjdk-11-jre is already the newest version (11.0.25+9-1~deb11u1).
openjdk-11-jre configurado para instalar manualmente.
0 pacotes atualizados, 0 pacotes novos instalados, 0 a serem removidos e 0 não atualizados.

Observação: o comando acima mostra se o pacote de software "openjdk-11-jre" está instalado e, se estiver, qual é a situação atual dele.


Saída gerada pelo comando "update-alternatives --config java":
Existem 2 escolhas para a alternativa java (disponibiliza /usr/bin/java).

  Selecção   Caminho                                      Prioridade Estado
------------------------------------------------------------
* 0            /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1711      modo automático
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java   1111      modo manual
  2            /usr/lib/jvm/java-17-openjdk-amd64/bin/java   1711      modo manual

Pressione <enter> para manter a escolha actual[*], ou digite o número da selecção: 1
update-alternatives: a usar /usr/lib/jvm/java-11-openjdk-amd64/bin/java para disponibilizar /usr/bin/java (java) em modo manual

Observação: o comando acima mostra a situação atual das chamadas "alternativas" do Debian GNU/Linux (inicialmente, todas as versões). Note que existem duas versões do Ambiente de Tempo de Execução Java instaladas: 11 e 17. O "Receitanet" funciona com a versão 11, porém não com a 17. Note, ainda, que é possível elaborar/preencher toda a declaração usando a versão 17, entretanto impossível transmitir, pois, como já dito, o "Receitanet" (programa encarregado de transmitir a declaração) funciona com a versão 11, porém não com a 17.


Saída gerada pelo comando "java -version":
openjdk version "11.0.25" 2024-10-15
OpenJDK Runtime Environment (build 11.0.25+9-post-Debian-1deb11u1)
OpenJDK 64-Bit Server VM (build 11.0.25+9-post-Debian-1deb11u1, mixed mode, sharing)

Observação: considerando que as versões 11 e 17 do Ambiente de Tempo de Execução Java estão instaladas, a versão 11 (opção 1 da lista apresentada pelo comando "update-alternatives") foi escolhida para a finalidade de viabilizar o funcionamento do programa "Receitanet".


Jamenson Ferreira Espindula de Almeida Melo
Jaboatão dos Guararapes, Pernambuco, Brasil
Usuário GNU/Linux nº 166197; LFS ID 24492
Key fingerprint: 234D 1914 4224 7C53 BD13 6855 2AE0 25C0 08A8 6180

domingo, 23 de março de 2025

Declaração de Missão Groff 2014

Declaração de Missão Groff 2014

(texto inteiramente traduzido, e não revisado, do inglês para o português pelo Google Translator)

Como a implementação mais amplamente implantada do troff em uso hoje, o groff ocupa um lugar importante no universo Unix. Frequentemente e erroneamente descartado como um programa legado para formatação de manuais Unix (manpages), o groff é, na verdade, um sistema sofisticado para produzir material tipográfico de alta qualidade, desde correspondência comercial até relatórios técnicos complexos e livros prontos para impressão. Com um histórico impressionante de compatibilidade com versões anteriores, ele continua a evoluir e a desempenhar um papel de liderança no desenvolvimento de software de composição livre.

O desenvolvimento futuro se concentrará nos recursos de composição do groff, com o objetivo de melhorar a formatação automática de documentos sem perda correspondente do controle do usuário sobre detalhes tipográficos. Além do binário principal, onde grande parte do trabalho será feito, o sistema compreende uma linguagem macro, conjuntos de macros pré-construídos, pré e pós-processadores e drivers para saída em vários formatos. O princípio orientador para mudanças nessas partes será melhorar e estender, não alterar, especialmente com relação ao uso estabelecido.

Uma parte fundamental do mandato do projeto será corrigir problemas que historicamente desencorajaram a adoção generalizada do groff. Os problemas incluem a superioridade percebida do TeX para composição tipográfica de uso geral, a longa e um tanto infeliz associação com manpages e a dificuldade de dominar as solicitações de composição tipográfica de baixo nível do groff.

Em termos gerais, o desenvolvimento será canalizado para duas áreas:
* ♦ [1]core groff

* – o backend de composição tipográfica e solicitações de formatação de baixo nível

♦ [2]uso do programa
* – conjuntos de macros de uso geral e manpages

Melhorias e aprimoramentos em outras áreas do sistema continuarão a formar uma parte rotineira do crescimento do groff, com suporte ativo para contribuições fornecidas por uma equipe de especialistas em groff.

Núcleo groff

O backend

Atualmente, o Groff usa um algoritmo guloso para formatar parágrafos uma linha por vez, mas o algoritmo Knuth-Plass, implementado no TeX, Heirloom troff e em outros lugares, otimiza quebras de linha em parágrafos inteiros e obtém um cinza tipográfico mais uniforme. Um dos desafios mais empolgantes que o Groff enfrentará será implementar um algoritmo de formatação aprimorado, sendo o candidato mais provável o Knuth-Plass. É um trabalho grande, mas com a base de código limpa do Groff e a comunidade útil de especialistas, espera-se que desenvolvedores adicionais se apresentem e contribuam com suas habilidades de programação.

Igualmente importante será instituir suporte nativo para TrueType, Open Type e outras fontes PostScript não Type1, e melhorar o suporte Unicode.

Solicitações de formatação de baixo nível

Solicitações de formatação de baixo nível suplementares continuarão a ser adicionadas, e o comportamento de algumas solicitações existentes será revisado, com cuidado para manter a compatibilidade com versões anteriores sempre que modificações forem consideradas valiosas.

No nível de solicitação, o uso de aritmética de inteiros e avaliação linear de expressões por groff remonta à idade da pedra. Embora não seja prioridade máxima, esses e outros empecilhos históricos (leia-se "aborrecimentos") serão abordados — novamente, com um olhar atento para a compatibilidade com versões anteriores.

Uso do programa

Conjuntos de macros de uso geral

Os conjuntos de macros formam a interface de usuário principal para o groff. Conjuntos bem projetados e bem documentados ajudam a tornar o groff acessível aos usuários — novos usuários em particular. A adoção ou rejeição do programa geralmente se baseia em se os conjuntos disponíveis atendem às necessidades do usuário sem exigir o domínio de solicitações de baixo nível. A curva de aprendizado e a facilidade de uso são igualmente importantes.

A área mais ativa do desenvolvimento do groff na última década foi em conjuntos de macros, com [3]mom sozinho adicionando mais de 13.000 linhas de código e 1 MB de documentação ao projeto. O suporte para conjuntos de macros existentes e o design e desenvolvimento de novos, portanto, desempenharão um papel significativo no futuro do groff.

Manpages

A necessidade de manuais Unix renderizarem de forma limpa para múltiplas mídias de saída favorece a marcação estrutural em vez da de apresentação, no entanto, as macros clássicas man(7) permanecem quase exclusivamente de apresentação. O mdoc(7) fornece uma alternativa semanticamente superior, mas o uso do man(7) está profundamente enraizado no Unix.

O trabalho futuro em manpages envolverá a melhoria da clareza semântica das macros man(7), desacoplando-as o máximo possível de solicitações de apresentação de baixo nível. O objetivo será facilitar a conversão de manpages para linguagens de marcação que não dependem do groff para exibição e impressão, por exemplo, XML, preservando a riqueza de apresentação completa das manpages processadas com o groff.

Simultaneamente ao trabalho no man(7), o mdoc(7) será ativamente suportado e seu uso promovido.

Para resumir, o objetivo desta estratégia dupla é promover a marcação de manpage que:
* ♦ renderiza de forma limpa para o terminal
* ♦ respeita a marcação de apresentação quando a saída para PostScript
* ♦ permite análise semântica
* ♦ é portátil

Olhando para frente, olhando para trás

A compatibilidade com versões anteriores de documentos e uso existentes continuará sendo uma prioridade máxima, assim como evitar o inchaço de recursos e o aumento de despesas gerais. A viabilidade e vitalidade do Groff dependem tanto disso quanto do desenvolvimento voltado para o futuro.

Finalmente, espera-se que os usuários e contribuidores do Groff promovam seu uso, fornecendo uma defesa discreta para encorajar uma adoção mais ampla do programa, aumentando assim o grupo de potenciais contribuidores e desenvolvedores e promovendo a causa da boa tipografia.

©2014 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110, EUA

quarta-feira, 5 de março de 2025

Lançamento do LFS e do BLFS Versão 12.3

A comunidade Linux From Scratch tem o prazer de anunciar o lançamento do LFS Versão 12.3, LFS Versão 12.3 (systemd), BLFS Versão 12.3 e BLFS Versão 12.3 (systemd).

Esse lançamento é uma atualização importante para LFS e BLFS.

O lançamento do LFS inclui atualizações para binutils-2.44 e glibc-2.41. No total, 48 pacotes foram atualizados desde o último lançamento e atualizações extensivas no texto foram feitas ao longo do livro para melhorar a legibilidade. O núcleo Linux também foi atualizado para a versão 6.13.4.

No geral, ocorreram mais que 100 submissões para o LFS desde a versão estável anterior do livro. Os pacotes que tem atualizações de segurança incluem: expat, jinja2, Python, openssl e vim. Veja-se https://rivendell.linuxfromscratch.org/lfs/advisories/12.2.html para uma descrição completa das atualizações de segurança desde o último lançamento estável.

No BLFS, novos pacotes que foram adicionados incluem: sysmon3/sysmond, zxing-cpp, kdsoap-ws-discovery-client e plasma-activities-stats para kio-extras, docbook-xsl-ns, libgstgtk4 em suporte ao Snapshot, cargo-c necessário para librsvg, LuaJIT para substituir Lua 5.2 e glslc do shaderc necessário para gtk4.

O pacote qt5 foi removido.

Veja-se https://rivendell.linuxfromscratch.org/blfs/advisories/12.2.html para pacotes do BLFS que foram afetados por atualizações de segurança desde o último lançamento estável.

No geral, aconteceram mais de 862 tíquetes fechados por meio de mais de 1.560 submissões feitas no BLFS.

Por favor, veja-se o Registro das Mudanças no livro para uma lista completa de mudanças.

Agradecimentos por esse lançamento vão para muitos(as) contribuidores(as). Notavelmente:

Douglas Reno
Xi Ruoyao
Thomas Trepl
Pierre Labastie
Rahul Chandra
Zeckma

Você consegue ler os livros online[0]-[3], ou baixar[4]-[7] para ler localmente.

Por favor, direcione quaisquer comentários acerca desse lançamento para a equipe de desenvolvimento do LFS em lfs-dev[8] ou blfs-dev[9]. O registro nas listas de discussão é exigido para evitar lixo eletrônico.

-- Bruce Dubbs
LFS

[0] http://www.linuxfromscratch.org/lfs/view/12.3/
[1] http://www.linuxfromscratch.org/blfs/view/12.3/
[2] http://www.linuxfromscratch.org/lfs/view/12.3-systemd/
[3] http://www.linuxfromscratch.org/blfs/view/12.3-systemd/

[4] http://www.linuxfromscratch.org/lfs/downloads/12.3/
[5] http://www.linuxfromscratch.org/blfs/downloads/12.3/
[6] http://www.linuxfromscratch.org/lfs/downloads/12.3-systemd/
[7] http://www.linuxfromscratch.org/blfs/downloads/12.3-systemd/
[8]lfs-dev@lists.linuxfromscratch.org
[9]blfs-dev@lists.linuxfromscratch.org

Lançamento do LFS Versão 12.3

#FOSS #LFS #GNU #Linux #SoftwareLivre

LFS-12.3 Lançamento
Bruce Dubbs - 2025/03/05
A comunidade Linux From Scratch anuncia o lançamento do LFS Versão 12.3.

As principais mudanças incluem atualizações do conjunto de ferramentas para binutils-2.44 e glibc-2.41. No total, 45 pacotes foram atualizados desde o último lançamento. Mudanças no texto também foram feitas ao longo do livro. O núcleo Linux também foi atualizado para a versão 6.13.2.

Os pacotes que tem atualizações de segurança incluem: jinja2-3.1.5, Python-3.13.1 e vim-9.1.1166.

No total, aconteceram 146 submissões no LFS desde a versão estável anterior do livro.

Você consegue ler o livro online[1] ou baixá-lo[2] para ler localmente.

Você consegue ler a versão systemd do livro online em LFS-systemd[3], ou baixar-systemd[4] para ler localmente.

Por favor, direcione quaisquer comentários acerca desse lançamento para a equipe de desenvolvimento do LFS em lfs-dev[5]. Por favor, observe que o registro na lista de discussão lfs-dev é exigido para evitar lixo eletrônico.

Bruce

[0] http://www.br.linuxfromscratch.org/lfs/view/12.3/
[1] http://www.br.linuxfromscratch.org/lfs/downloads/12.3/
[2] http://www.br.linuxfromscratch.org/lfs/view/12.3-systemd/
[3] http://www.br.linuxfromscratch.org/lfs/downloads/12.3-systemd/
[5] lfs-dev@lists.linuxfromscratch.org

quinta-feira, 27 de fevereiro de 2025

Versão LFS-12.3-rc2

Versão LFS-12.3-rc2
Bruce Dubbs - 2025/02/27
A comunidade Linux From Scratch anuncia o lançamento do LFS Versão 12.3-rc2. É um lançamento preliminar do LFS-12.3.

As principais mudanças a partir do 12.3-rc1 incluem atualizações para systemd e udev a partir do systemd (versão sysV) para incorporar mudanças inconsistentes com o núcleo linux-6.12.4. Atualizações para sete outros pacotes também estão incluídas.

Nós encorajamos todos(as) os(as) usuários(as) a lerem esse lançamento do livro e a testarem as instruções para que consigamos tornar o lançamento final o melhor possível.

Você consegue ler o livro online[0] ou baixar[1] para ler localmente.

Você consegue ler a versão systemd do livro online em LFS-systemd-rc2[2], ou baixar-systemd-rc2[3] para ler localmente.

Por favor, direcione quaisquer comentários a respeito desse lançamento para a equipe de desenvolvimento do LFS em lfs-dev@lists.linuxfromscratch.org[5]. Por favor, observe que o registro na lista de discussão lfs-dev é exigido para evitar lixo eletrônico.

[0] http://www.linuxfromscratch.org/lfs/view/12.3-rc2/
[1] http://www.linuxfromscratch.org/lfs/downloads/12.3-rc2/
[2] http://www.linuxfromscratch.org/lfs/view/12.3-systemd-rc2/
[3] http://www.linuxfromscratch.org/lfs/downloads/12.3-systemd-rc2/
[5] lfs-dev@lists.linuxfromscratch.org

segunda-feira, 17 de fevereiro de 2025

Instalar pacote "po4a" (versão 0.73-2) na Debian GNU/Linux 12 ("bookworm")

# apt-get install /home/jamenson/Downloads/po4a_0.73-2_all.deb -y
Lendo listas de pacotes... Pronto
Construindo árvore de dependências... Pronto
Lendo informação de estado... Pronto        
Note, a seleccionar 'po4a' em vez de '/home/jamenson/Downloads/po4a_0.73-2_all.deb'
The following additional packages will be installed:
  libmime-charset-perl libsgmls-perl libsombok3 libunicode-linebreak-perl libyaml-tiny-perl
Pacotes sugeridos:
  libencode-eucjpascii-perl libencode-hanextra-perl libpod2-base-perl sgmlspl sgmls-doc
Os NOVOS pacotes a seguir serão instalados:
  libmime-charset-perl libsgmls-perl libsombok3 libunicode-linebreak-perl libyaml-tiny-perl po4a
0 pacotes atualizados, 6 pacotes novos instalados, 0 a serem removidos e 0 não atualizados.
É preciso baixar 219 kB/2.375 kB de arquivos.
Depois desta operação, 4.939 kB adicionais de espaço em disco serão usados.
Obter:1 /home/jamenson/Downloads/po4a_0.73-2_all.deb po4a all 0.73-2 [2.155 kB]
Obter:2 https://ftp.debian.org/debian bookworm/main amd64 libmime-charset-perl all 1.013.1-2 [34,0 kB]
Obter:3 https://ftp.debian.org/debian bookworm/main amd64 libsgmls-perl all 1.03ii-38 [23,7 kB]
Obter:4 https://ftp.debian.org/debian bookworm/main amd64 libsombok3 amd64 2.4.0-2+b1 [31,4 kB]
Obter:5 https://ftp.debian.org/debian bookworm/main amd64 libunicode-linebreak-perl amd64 0.0.20190101-1+b5 [97,8 kB]
Obter:6 https://ftp.debian.org/debian bookworm/main amd64 libyaml-tiny-perl all 1.73-1 [32,3 kB]
Baixados 219 kB em 1s (168 kB/s)        
A seleccionar pacote anteriormente não seleccionado libmime-charset-perl.
(Lendo banco de dados ... 159090 ficheiros e diretórios atualmente instalados.)
A preparar para desempacotar .../0-libmime-charset-perl_1.013.1-2_all.deb ...
A descompactar libmime-charset-perl (1.013.1-2) ...
A seleccionar pacote anteriormente não seleccionado libsgmls-perl.
A preparar para desempacotar .../1-libsgmls-perl_1.03ii-38_all.deb ...
A descompactar libsgmls-perl (1.03ii-38) ...
A seleccionar pacote anteriormente não seleccionado libsombok3:amd64.
A preparar para desempacotar .../2-libsombok3_2.4.0-2+b1_amd64.deb ...
A descompactar libsombok3:amd64 (2.4.0-2+b1) ...
A seleccionar pacote anteriormente não seleccionado libunicode-linebreak-perl.
A preparar para desempacotar .../3-libunicode-linebreak-perl_0.0.20190101-1+b5_amd64.deb ...
A descompactar libunicode-linebreak-perl (0.0.20190101-1+b5) ...
A seleccionar pacote anteriormente não seleccionado libyaml-tiny-perl.
A preparar para desempacotar .../4-libyaml-tiny-perl_1.73-1_all.deb ...
A descompactar libyaml-tiny-perl (1.73-1) ...
A seleccionar pacote anteriormente não seleccionado po4a.
A preparar para desempacotar .../5-po4a_0.73-2_all.deb ...
A descompactar po4a (0.73-2) ...
Configurando libsgmls-perl (1.03ii-38) ...
Configurando libsombok3:amd64 (2.4.0-2+b1) ...
Configurando libyaml-tiny-perl (1.73-1) ...
Configurando libmime-charset-perl (1.013.1-2) ...
Configurando po4a (0.73-2) ...
Configurando libunicode-linebreak-perl (0.0.20190101-1+b5) ...
A processar 'triggers' para man-db (2.11.2-2) ...
A processar 'triggers' para libc-bin (2.36-9+deb12u9) ...
N: Download is performed unsandboxed as root as file '/home/jamenson/Downloads/po4a_0.73-2_all.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permissão negada)

# echo "${?}"
0
 

Desinstalar pacote "po4a" (versão 0.69-1) da Debian GNU/Linux 12 ("bookworm")

# apt-get purge po4a -y
Lendo listas de pacotes...
Construindo árvore de dependências...
Lendo informação de estado...
Os seguintes pacotes foram instalados automaticamente e já não são necessários:
  libmime-charset-perl libsgmls-perl libsombok3 libunicode-linebreak-perl
  libyaml-tiny-perl
Utilize 'apt autoremove' para os remover.
Os pacotes a seguir serão REMOVIDOS:
  po4a*
0 pacotes atualizados, 0 pacotes novos instalados, 1 a serem removidos e 0 não atualizados.
Depois desta operação, 4.106 kB de espaço em disco serão liberados.
(Lendo banco de dados ... 159751 ficheiros e diretórios atualmente instalados.)
A remover po4a (0.69-1) ...
A processar 'triggers' para man-db (2.11.2-2) ...

# apt-get autopurge -y
Lendo listas de pacotes... Pronto
Construindo árvore de dependências... Pronto
Lendo informação de estado... Pronto        
Os pacotes a seguir serão REMOVIDOS:
  libmime-charset-perl* libsgmls-perl* libsombok3* libunicode-linebreak-perl* libyaml-tiny-perl*
0 pacotes atualizados, 0 pacotes novos instalados, 5 a serem removidos e 0 não atualizados.
Depois desta operação, 641 kB de espaço em disco serão liberados.
(Lendo banco de dados ... 159167 ficheiros e diretórios atualmente instalados.)
A remover libunicode-linebreak-perl (0.0.20190101-1+b5) ...
A remover libmime-charset-perl (1.013.1-2) ...
A remover libsgmls-perl (1.03ii-38) ...
A remover libsombok3:amd64 (2.4.0-2+b1) ...
A remover libyaml-tiny-perl (1.73-1) ...
A processar 'triggers' para man-db (2.11.2-2) ...
A processar 'triggers' para libc-bin (2.36-9+deb12u9) ...
 

domingo, 16 de fevereiro de 2025

Pacote "po4a" (versão 0.73) na Debian GNU/Linux 12

É possível instalar-se a versão 0.73 do pacote "po4a" em um Debian GNU/Linux 12 ("bookworm"). O comando a ser invocado é este:

apt install /caminho/para/o/diretório/po4a_0.73-2_all.deb

O programa "apt" identificará todas as dependências exigidas para o pacote "po4a" e as baixará automaticamente.


Agradecimentos vão para o Professor Kretcheu pelo auxílio lá no grupo "Curso GNU (Kretcheu)" no Telegram <https://t.me/cursognu/220562>.

sábado, 15 de fevereiro de 2025

Erro (dois) "po4a" no Debian 12

Nova tentativa (depois de instalar uma versão mais recente do pacote "po4a") de renderizar os arquivos XML do livro Beyond Linux From Scratch. O comando executado (em um Debian GNU/Linux 12 - "bookworm") foi este:

( time LC_ALL=C make -j1 V=1 L=pt_BR REV=sysv BASEDIR="${HOME}"/sysv genhtml 2>&1 | tee "${HOME}"/genhtml-sysv.log.txt && exit "${PIPESTATUS}" )

A saída gerada pelo mencionado comando foi esta (parcialmente transcrita; transcrita somente a parte interessante):

python3 set-xml.py pt_BR/general/genlib/libsigsegv.po

mkdir -p $(dirname blfsgen-pt_BR/general/genlib/libsigsegv.xml)

LANG=pt_BR.UTF-8 po4a-translate -k 0 -f docbook -m blfs-en/general/genlib/libsigsegv.xml -l blfsgen-pt_BR/general/genlib/libsigsegv.xml.tmp -p pt_BR/general/genlib/libsigsegv.po -M UTF-8 -L UTF-8

po4a-translate is deprecated. The unified po4a(1) program is more convenient and less error prone. Once configured, `po4a --no-update` can be used as a drop-in replacement to `po4a-translate`.

./sed_pt_BR.sh blfsgen-pt_BR/general/genlib/libsigsegv.xml.tmp

sed '0,/#-#/s|\([^>]*\) #-# \([^<]*\)|\1|' -i blfsgen-pt_BR/general/genlib/libsigsegv.xml.tmp

sed '0,/#-#/s|\([^>]*\) #-# \([^<]*\)|\2|' -i blfsgen-pt_BR/general/genlib/libsigsegv.xml.tmp

sed -e 's|encoding="ISO-8859-1"|encoding="UTF-8"|g' -i blfsgen-pt_BR/general/genlib/libsigsegv.xml.tmp

sed -e 's|encoding="""|encoding="UTF-8"|g' -i blfsgen-pt_BR/general/genlib/libsigsegv.xml.tmp

mv blfsgen-pt_BR/general/genlib/libsigsegv.xml.tmp blfsgen-pt_BR/general/genlib/libsigsegv.xml

mkdir -p $(dirname pt_BR/general/genlib/appstream-glib.po)

LANG=pt_BR.UTF-8 po4a-updatepo -f docbook -m blfs-en/general/genlib/appstream-glib.xml -p pt_BR/general/genlib/appstream-glib.po -M UTF-8

Use of uninitialized value $args[0] in sprintf at /usr/share/perl5/Locale/Po4a/Common.pm line 152.

po4a::pod: The file  declares ISO-8859-1 as encoding, but you provided UTF-8 as master charset. Please change either setting.

 at /usr/bin/po4a-updatepo line 299.

po4a-updatepo is deprecated. The unified po4a(1) program is more convenient and less error prone. Once configured, `po4a --no-translations` can be used as a drop-in replacement to `po4a-updatepo`.

make: *** [include.mk:171: pt_BR/general/genlib/appstream-glib.po] Error 255



Versão do pacote "po4a": 0.73

Erro "po4a" no Debian 12

Tentativa de renderizar os arquivos XML do livro Beyond Linux From Scratch. O comando executado (em um Debian GNU/Linux 12 - "bookworm") foi este:

( time LC_ALL=C make -j1 V=1 L=pt_BR REV=sysv BASEDIR="${HOME}"/sysv genhtml 2>&1 | tee "${HOME}"/genhtml-sysv.log.txt && exit "${PIPESTATUS}" )

A saída gerada pelo mencionado comando foi esta (parcialmente transcrita; transcrita somente a parte interessante):

python3 set-xml.py pt_BR/kde/introduction.po


mkdir -p $(dirname blfsgen-pt_BR/kde/introduction.xml)


LANG=pt_BR.UTF-8 po4a-translate -k 0 -f docbook -m blfs-en/kde/introduction.xml -l blfsgen-pt_BR/kde/introduction.xml.tmp -p pt_BR/kde/introduction.po -M UTF-8 -L UTF-8


po4a-translate is deprecated. The unified po4a(1) program is more convenient and less error prone.


./sed_pt_BR.sh blfsgen-pt_BR/kde/introduction.xml.tmp


sed '0,/#-#/s|\([^>]*\) #-# \([^<]*\)|\1|' -i blfsgen-pt_BR/kde/introduction.xml.tmp


sed '0,/#-#/s|\([^>]*\) #-# \([^<]*\)|\2|' -i blfsgen-pt_BR/kde/introduction.xml.tmp


sed -e 's|encoding="ISO-8859-1"|encoding="UTF-8"|g' -i blfsgen-pt_BR/kde/introduction.xml.tmp


sed -e 's|encoding="""|encoding="UTF-8"|g' -i blfsgen-pt_BR/kde/introduction.xml.tmp


mv blfsgen-pt_BR/kde/introduction.xml.tmp blfsgen-pt_BR/kde/introduction.xml


mkdir -p $(dirname pt_BR/kde/phonon.po)


LANG=pt_BR.UTF-8 po4a-updatepo -f docbook -m blfs-en/kde/phonon.xml -p pt_BR/kde/phonon.po -M UTF-8


Use of uninitialized value in pattern match (m//) at /usr/share/perl5/Locale/Po4a/Po.pm line 1419.


Use of uninitialized value in pattern match (m//) at /usr/share/perl5/Locale/Po4a/Po.pm line 1419.


Unknown encoding '"' at /usr/share/perl5/Locale/Po4a/TransTractor.pm line 995.


po4a-updatepo is deprecated. The unified po4a(1) program is more convenient and less error prone.


make: *** [include.mk:171: pt_BR/kde/phonon.po] Error 255


Versão do pacote "po4a": 0.69-1