Detalhes deste pacote estão localizados na Seção 8.20.2, “Conteúdo do Binutils.”
Copyright © 1999-2024 Gerard Beekmans
Direitos autorais © 1999-2024, Gerard Beekmans
Todos os direitos reservados.
Este livro é licenciado sob uma Licença da Creative Commons.
As instruções de computador tem permissão para serem extraídas a partir do livro sob a Licença do MIT.
Linux® é uma marca comercial registrada do Linus Torvalds.
Minha jornada para aprender e entender melhor o Linux começou em meados de 1998. Eu havia acabado de instalar minha primeira distribuição do Linux e rapidamente fiquei intrigado com todo o conceito e filosofia por trás do Linux.
Existem sempre muitas maneiras de realizar uma tarefa. O mesmo pode ser dito a respeito das distribuições do Linux. Um grande número existiu ao longo dos anos. Algumas ainda existem; algumas se transformaram em algo mais; e ainda outras foram relegadas às nossas memórias. Todas elas fazem coisas diferentemente para se adequarem às necessidades da audiência alvo delas. Devido a existirem muitíssimas maneiras de realizar o mesmo objetivo final, eu comecei a perceber que não tinha que estar limitado por qualquer uma implementação. Antes de descobrir o Linux, nós simplesmente lidávamos com problemas em outros Sistemas Operacionais como se você não tivesse escolha. A coisa era o que era, não importando se você gostasse ou não. Com o Linux, o conceito de escolha começou a emergir. Se você não gostou de alguma coisa, você seria livre, até encorajado(a), a mudá-la.
Eu tentei várias distribuições e não consegui me decidir por nenhuma. Elas eram grandes sistemas em seu próprio direito. Não era mais uma questão de certo ou errado. Tinha se tornado em uma questão de gosto pessoal. Com todas aquelas escolhas disponíveis, tornou-se aparente que não haveria um sistema que fosse perfeito para mim. Então eu me propus a criar meu próprio sistema Linux, que estaria totalmente em conformidade com minhas preferências pessoais.
Para verdadeiramente torná-lo meu próprio sistema, eu resolvi compilar tudo a partir do código fonte, em vez de usar pacotes pré-compilados de binário. Esse sistema Linux “perfeito” teria a força de vários sistemas sem suas fraquezas visíveis. A princípio, a ideia era bastante amedrontadora. Eu me mantive comprometido com a ideia de que tal sistema poderia ser construído.
Depois de lidar com problemas, tais como dependências circulares e erros em tempo de compilação, eu finalmente construí um sistema Linux feito sob encomenda. Era totalmente operacional e perfeitamente utilizável, como quaisquer dos outros sistemas Linux disponíveis na época. Porém, era minha própria criação. Foi muito gratificante ter montado tal sistema eu mesmo. A única coisa melhor teria sido criar cada pedaço de software eu mesmo. Essa foi a melhor coisa que se seguiu.
Conforme eu compartilhei meus objetivos e experiências com outros(as) membros(as) da comunidade Linux, tornou-se aparente que havia um interesse firme nessas ideias. Logo tornou-se claro que tais sistemas Linux feitos sob encomenda serviam não somente para satisfazer as exigências específicas dos(as) usuários(as), mas também serve como uma oportunidade ideal de aprendizado para programadores(as) e administradores(as) de sistema elevarem as (existentes) habilidades deles(as) com o Linux. Como resultado desse interesse amplo, o Projeto Linux From Scratch nasceu.
Este livro Linux From Scratch é o núcleo em torno desse projeto. Ele provê a base e as instruções necessárias para você projetar e construir seu próprio sistema. Ao tempo em que este livro fornece um modelo que resultará em um sistema que funciona corretamente, você é livre para alterar as instruções para adaptá-las às suas necessidades, o que é, em parte, uma importante parte deste projeto. Você permanece no controle; nós só damos uma mão para ajudá-lo(a) a começar na sua própria jornada.
Eu sinceramente espero que você terá um ótimo tempo trabalhando em seu próprio sistema Linux From Scratch e que aproveitará os numerosos benefícios de ter um sistema que é verdadeiramente seu.
--
Gerard Beekmans
gerard AT linuxfromscratch D0T org
Existem muitas razões pelas quais você desejaria ler este livro. Uma das questões que muitas pessoas levantam é “por que ir ao longo de toda a dificuldade de construir manualmente um sistema Linux desde o zero quando você pode simplesmente baixar e instalar um existente?”
Uma importante razão para a existência desse projeto é para te ajudar a aprender como um sistema Linux funciona de dentro para fora. Construir um sistema LFS ajuda a demonstrar o que torna o Linux de interesse e como as coisas funcionam juntas e dependem umas das outras. Uma das melhores coisas que essa experiência de aprendizado pode fornecer é a habilidade para personalizar um sistema Linux para se ajustar às suas próprias necessidades únicas.
Outro benefício chave do LFS é o de que ele te dá controle do sistema sem confiar na implementação Linux de ninguém. Com o LFS, você está no banco do motorista. Você dita cada aspecto do seu sistema.
O LFS te permite criar sistemas Linux muito compactos. Com outras distribuições, você frequentemente é forçado(a) a instalar grande número de aplicativos, os quais nem usa, nem entende. Esses aplicativos desperdiçam recursos. Você possivelmente argumente que, com as unidades rígidas e CPUs de hoje, recursos desperdiçados não mais são uma consideração. Às vezes, entretanto, você ainda está restrito(a) pelo tamanho do sistema, se nenhuma outra coisa. Pense a respeito de CDs inicializáveis, mídias USB e sistemas embarcados. Essas são áreas onde o LFS pode ser benéfico.
Outra vantagem de um sistema Linux feito sob medida é a da segurança. Ao compilar o sistema inteiro desde o zero, você está empoderado(a) para auditar tudo e aplicar todos os remendos de segurança que queira. Você não tem que aguardar que outra pessoa compile os pacotes binários que consertam uma brecha de segurança. A menos que você examine o remendo e o implemente você mesma(o), você não tem garantias de que o novo pacote binário foi construído corretamente e adequadamente conserta o problema.
A objetivo do Linux From Scratch é o de construir um sistema em nível de fundação completo e utilizável. Se você não deseja construir seu próprio sistema Linux desde o zero, [então] você possivelmente nunca se beneficie das informações neste livro.
Existem muito mais boas razões para construir seu próprio sistema LFS para listá-las todas aqui. No final, educação é, de longe, a mais importante razão. Conforme continue sua experiência LFS, você descobrirá o poder que informação e conhecimento podem trazer.
As arquiteturas alvo primárias do LFS são as CPUs AMD/Intel x86 (32 bits) e x86_64 (64 bits). Por outro lado, as instruções neste livro também são conhecidas por funcionar, com algumas modificações, com as CPUs Power PC e ARM. Para construir um sistema que utiliza uma dessas CPUs alternativas, o principal pré-requisito, em adição àqueles na próxima página, é um sistema Linux existente, como uma instalação prévia do LFS, Ubuntu, Red Hat/Fedora, SuSE ou alguma outra distribuição que atinja essa arquitetura. (Observe que uma distribuição de 32 bits pode ser instalada e usada como um sistema anfitrião em um computador AMD/Intel de 64 bits).
O ganho oriundo da construção em um sistema de 64 bits comparado a um sistema de 32 bits é mínimo. Por exemplo, em uma construção de teste do LFS-9.1 em um sistema baseado na CPU Core i7-4790, usando quatro núcleos, as seguintes estatísticas foram verificadas:
Arquitetura Tempo de Construção Tamanho de Construção
32 bits 239,9 minutos 3,6 GB
64 bits 233,2 minutos 4,4 GB
Como você pode ver, no mesmo hardware, a construção de 64 bits é somente 3% mais rápida (e 22% mais larga) que a construção de 32 bits. Se você planeja usar o LFS como um servidor LAMP, ou como um firewall, [então] uma CPU de 32 bits possivelmente seja boa o suficiente. Por outro lado, vários pacotes no BLFS atualmente precisam de mais que 4 GB de RAM para serem construídos e (ou) para executarem; se você planeja usar o LFS como um desktop, [então] os(as) autores(as) do LFS recomendam construir um sistema de 64 bits.
A construção padrão de 64 bits que resulta do LFS é um sistema de 64 bits “puro”. Ou seja, ele suporta somente executáveis de 64 bits. Construir um sistema “multi biblioteca” exige compilar muitos aplicativos duas vezes, uma vez para um sistema de 32 bits e outra vez para um sistema de 64 bits. Isso não é diretamente suportado no LFS, pois interferiria no objetivo educacional de fornecer as instruções mínimas necessárias para um sistema básico Linux. Alguns(mas) dos(as) editores(as) do LFS/BLFS mantém uma bifurcação multi biblioteca do LFS, acessível em https://www.linuxfromscratch.org/~thomas/multilib/index.html. Porém, esse é um tópico avançado.
Construir um sistema LFS não é uma tarefa simples. Exige um certo nível de conhecimento existente da administração de sistemas Unix para a finalidade de resolver problemas e corretamente executar os comandos listados. Em particular, como um mínimo absoluto, você já deveria saber como usar a linha de comando (shell) para copiar ou mover arquivos e diretórios, listar diretórios e conteúdo de arquivos, e mudar o diretório atual. Também é esperado que você saiba como usar e instalar software Linux.
Por causa do livro LFS assumir pelo menos esse nível básico de habilidades, os vários fóruns de suporte do LFS não são adequados para te fornecer muita assistência nessas áreas. Você vai achar que as suas perguntas relacionadas a tal conhecimento básico não serão respondidas (ou serão simplesmente remetidas à lista de pré-leitura essencial do LFS).
Antes de construir um sistema LFS, nós insistimos que você leia estes artigos:
Software-Building-HOWTO http://www.tldp.org/HOWTO/Software-Building-HOWTO.html
Esse é um guia compreensivo para construir e instalar pacotes de software Unix “genéricos” sob o Linux. Apesar de que foi escrito há algum tempo, ainda fornece um bom resumo das técnicas básicas usadas para construir e instalar software.
Guia do(a) Iniciante para Instalar a partir do Fonte http://moi.vonos.net/linux/beginners-installing-from-source/
Esse guia fornece um bom sumário das habilidades básicas e de técnicas necessárias para construir software a partir do código fonte.
A estrutura do LFS segue os padrões do Linux tão rigorosamente quanto possível. Os padrões primários são:
Linux Standard Base (LSB) Version 5.0 (2015)
O LSB tem quatro especificações separadas: Core, Desktop, Runtime Languages e Imaging. Algumas partes das especificações Core e Desktop são específicas de arquitetura. Existem também duas especificações experimentais: Gtk3 e Graphics. O LFS tenta obedecer às especificações LSB para as arquiteturas IA32 (x86 de 32 bits) ou AMD64 (x86_64) discutidas na sessão anterior.
Muitas pessoas não concordam com essas exigências. O principal propósito do LSB é o de garantir que software proprietário consiga ser instalado e execute em um sistema compatível. Dado que o LFS é baseado no fonte, o(a) usuário(a) tem total controle sobre quais pacotes são desejados; você possivelmente escolha não instalar alguns pacotes que são especificados pelo LSB.
Ao tempo em que é possível criar um sistema completo que passará nos testes de certificação do "LSB" “desde o zero”, isso não pode ser feito sem muitos pacotes adicionais que estão além do escopo do livro LFS. Instruções de instalação para esses pacotes adicionais podem ser encontradas no BLFS.
Núcleo do LSB: |
Bash, Bc, Binutils, Coreutils, Diffutils, File, Findutils, Gawk, Grep, Gzip, M4, Man-DB, Ncurses, Procps, Psmisc, Sed, Shadow, Tar, Util-linux e Zlib |
Área de trabalho do LSB: |
Nenhum |
Linguagens de Tempo de Execução do LSB: |
Perl e Python |
Imagem no LSB: |
Nenhum |
LSB Gtk3 e Gráficos LSB (Uso Experimental): |
Nenhum |
Núcleo do LSB: |
At, Batch (uma parte de At), Cpio, Ed, Fcrontab, LSB-Tools, NSPR, NSS, PAM, Pax, Sendmail (ou Postfix ou Exim), time |
Área de trabalho do LSB: |
Alsa, ATK, Cairo, Desktop-file-utils, Freetype, Fontconfig, Gdk-pixbuf, Glib2, GTK+2, Icon-naming-utils, Libjpeg-turbo, Libpng, Libtiff, Libxml2, MesaLib, Pango, Xdg-utils e Xorg |
Linguagens de Tempo de Execução do LSB: |
Libxml2 e Libxslt |
Imagem no LSB: |
CUPS, Cups-filters, Ghostscript e SANE |
LSB Gtk3 e Gráficos LSB (Uso Experimental): |
GTK+3 |
O objetivo do LFS é o de construir um sistema em nível de fundação completo e utilizável—incluindo todos os pacotes necessários para replicar a ele mesmo—e fornecer uma base relativamente mínima a partir da qual personalizar um sistema mais completo baseado nas escolhas do(a) usuário(a). Isso não significa que o LFS é o menor sistema possível. Vários pacotes importantes estão inclusos que não são, falando estritamente, exigidos. A lista abaixo documenta as razões para cada pacote no livro ter sido incluído.
Acl
Esse pacote contém utilitários para administrar Listas de Controle de Acesso, as quais são usadas para definir direitos de acesso discricionariamente finamente refinados para arquivos e para diretórios.
Attr
Esse pacote contém aplicativos para gerenciar atributos estendidos sobre objetos do sistema de arquivos.
Autoconf
Esse pacote fornece aplicativos para produzir scripts de shell que podem configurar automaticamente o código fonte a partir de um modelo do(a) desenvolvedor(a). Frequentemente é necessário para reconstruir um pacote depois que o procedimento de construção tenha sido atualizado.
Automake
Esse pacote contém aplicativos para gerar arquivos Make a partir de um modelo. Frequentemente é necessário para reconstruir um pacote depois que o procedimento de construção tenha sido atualizado.
Bash
Esse pacote satisfaz uma exigência central do LSB para fornecer uma interface Bourne Shell para o sistema. Foi escolhido em vez de outros pacotes de shell por causa do uso comum e capacidades extensas dele.
Bc
Esse pacote fornece uma linguagem de processamento numérico com precisão arbitrária. Satisfaz uma exigência para construir o núcleo do Linux.
Binutils
Esse pacote fornece um vinculador, um montador e outras ferramentas para manusear arquivos objeto. Os aplicativos nesse pacote são necessários para compilar a maioria dos pacotes em um sistema LFS.
Bison
Esse pacote contém a versão GNU do yacc (Yet Another Compiler Compiler) necessário para construir vários dos aplicativos do LFS.
Bzip2
Esse pacote contém aplicativos para comprimir e descomprimir arquivos. É exigido para descomprimir muitos pacotes do LFS.
Check
Esse pacote fornece um equipamento de teste para outros aplicativos.
Coreutils
Esse pacote contém um número de aplicativos essenciais para visualizar e manipular arquivos e diretórios. Esses aplicativos são necessários para o gerenciamento de arquivos por linha de comando e são necessários para os procedimentos de instalação de cada pacote no LFS.
D-Bus
Esse pacote contém aplicativos para implementar um sistema de barramento de mensagem, uma maneira simples para aplicativos conversarem com um outro.
DejaGNU
Esse pacote fornece uma estrutura para testar outros aplicativos.
Diffutils
Esse pacote contém aplicativos que mostram as diferenças entre arquivos ou diretórios. Esses aplicativos podem ser usados para criar remendos e também são usados em muitos procedimentos de construção dos pacotes.
E2fsprogs
Esse pacote fornece utilitários para manusear os sistemas de arquivos ext2, ext3 e ext4. Esses são os sistemas de arquivos mais comuns e amplamente testados que o Linux suporta.
Expat
Esse pacote produz uma biblioteca de análise relativamente pequena de XML. É exigida pelo módulo do Perl XML::Parser.
Expect
Esse pacote contém um aplicativo para realizar diálogos com scripts com outros aplicativos interativos. É comumente usado para testar outros pacotes.
File
Esse pacote contém um utilitário para determinar o tipo de um dado arquivo ou arquivos. Uns poucos pacotes precisam dele nos scripts de construção deles.
Findutils
Esse pacote fornece aplicativos para encontrar arquivos em um sistema de arquivos. É usado em muitos scripts de construção dos pacotes.
Flex
Esse pacote contém um utilitário para gerar aplicativos que reconhecem padrões em texto. É a versão GNU do aplicativo lex (lexical analyzer). É exigido para construir vários pacotes do LFS.
Gawk
Esse pacote fornece aplicativos para manipular arquivos de texto. É a versão GNU do awk (Aho-Weinberg-Kernighan). É usado em muitos outros scripts de construção dos pacotes.
GCC
Esse é o Gnu Compiler Collection. Contém os compiladores C e C++ assim como vários outros não construídos pelo LFS.
GDBM
Esse pacote contém a biblioteca GNU Database Manager. É usado por um outro pacote do LFS, Man-DB.
Gettext
Esse pacote fornece utilitários e bibliotecas para a internacionalização e localização de muitos pacotes.
Glibc
Esse pacote contém a biblioteca C principal. Aplicativos Linux não executarão sem ela.
GMP
Esse pacote fornece bibliotecas matemáticas que fornecem funções úteis para aritmética de precisão arbitrária. É necessário para construir o GCC.
Gperf
Esse pacote produz um aplicativo que gera uma função perfeita de resumo a partir de um conjunto de chaves. É exigido pelo Systemd.
Grep
Esse pacote contém aplicativos para pesquisar ao longo de arquivos. Esses aplicativos são usados pela maioria dos scripts de construção dos pacotes.
Groff
Esse pacote contribui com aplicativos para processar e formatar texto. Uma função importante desses aplicativos é a de formatar páginas de manual.
GRUB
Esse pacote é o Grand Unified Boot Loader. É o mais flexível dos vários carregadores de inicialização disponíveis.
Gzip
Esse pacote contém aplicativos para comprimir e descomprimir arquivos. É necessário para descomprimir muitos pacotes no LFS.
Iana-etc
Esse pacote fornece dados para serviços e protocolos de rede de comunicação. É necessário para habilitar recursos adequados da rede de comunicação.
Inetutils
Esse pacote fornece aplicativos para administração básica da rede de comunicação.
Intltool
Esse pacote contribui com ferramentas para extrair sequências de caracteres traduzíveis a partir de arquivos fonte.
IProute2
Esse pacote contém aplicativos para redes de comunicação IPv4 e IPv6 básicas e avançadas. Ele foi escolhido em vez dos outros pacotes comuns de ferramentas de rede de comunicação (net-tools) pelos recursos de IPv6 dele.
Jinja2
Esse pacote é um módulo do Python para modelagem de texto. É exigido para construir o Systemd.
Kbd
Esse pacote produz arquivos de tabelas chave, utilitários de teclado para teclados que não sejam estadunidenses e um número de fontes de console.
Kmod
Esse pacote fornece aplicativos necessários para administrar os módulos do núcleo Linux.
Less
Esse pacote contém um visualizador de arquivo de texto muito bom que permite rolar para cima ou para baixo quando se visualiza um arquivo. Muitos pacotes o usam para paginar a saída gerada.
Libcap
Esse pacote implementa as interfaces do espaço de usuário(a) para os recursos POSIX 1003.1e disponíveis nos núcleos Linux.
Libelf
O projeto elfutils fornece bibliotecas e ferramentas para arquivos ELF e dados DWARF. A maior parte dos utilitários nesse pacote está disponível em outros pacotes, porém a biblioteca é necessária para construir o núcleo Linux usando a configuração padrão (e mais eficiente).
Libffi
Esse pacote implementa uma interface de programação portável, de alto nível, para várias convenções de chamada. Alguns aplicativos possivelmente não saibam, ao tempo da compilação, quais argumentos são para serem passados para uma função. Por exemplo, um interpretador possivelmente possa ser informado, ao tempo de execução, acerca do número e dos tipos de argumentos usados para chamar uma dada função. Libffi pode ser usada em tais aplicativos para fornecer uma ponte a partir do aplicativo interpretador para o código compilado.
Libpipeline
O pacote Libpipeline fornece uma biblioteca para manipular pipelines de subprocessos de uma maneira flexível e conveniente. Ele é exigido pelo pacote Man-DB.
Libtool
Esse pacote contém o script GNU de suporte a bibliotecas genéricas. Ele esconde a complexidade do uso de bibliotecas compartilhadas em uma interface consistente e portável. Ele é necessário para as suítes de testes em outros pacotes do LFS.
Libxcrypt
Esse pacote fornece a biblioteca libcrypt
necessária para vários pacotes
(notavelmente, Shadow) para resumir senhas. Ela substitui a
implementação obsoleta libcrypt
na Glibc.
Núcleo Linux
Esse pacote é o Sistema Operacional. Ele é o Linux no ambiente GNU/Linux.
M4
Esse pacote fornece um processador geral de macro de texto, útil como uma ferramenta de construção para outros aplicativos.
Make
Esse pacote contém um aplicativo para direcionar a construção de pacotes. Ele é exigido por quase todos os pacotes no LFS.
MarkupSafe
Esse pacote é um módulo do Python para processar sequências de caracteres em HTML/XHTML/XML com segurança. Jinja2 exige esse pacote.
Man-DB
Esse pacote contém aplicativos para encontrar e visualizar páginas de manual. Ele foi escolhido em vez do pacote man por causa dos recursos superiores de internacionalização dele. Ele fornece o aplicativo man.
Páginas-Manual
Esse pacote fornece o conteúdo atual das páginas de manual básicas do Linux.
Meson
Esse pacote fornece uma ferramenta de software para automatizar a construção de software. O objetivo principal do Meson é o de minimizar a quantidade de tempo que desenvolvedores(as) de software precisam investir configurando um sistema de construção. Ele é exigido para construir o Systemd, bem como muitos pacotes do BLFS.
MPC
Esse pacote fornece funções aritméticas para números complexos. Ele é exigido pelo GCC.
MPFR
Esse pacote contém funções para aritmética de precisão múltipla. Ele é exigido pelo GCC.
Ninja
Esse pacote equipa um sistema pequeno de construção com um foco em velocidade. Ele é projetado para ter os arquivos de entrada gerada dele gerados por um sistema de construção de nível mais alto e para executar construções o mais rápido possível. Esse pacote é exigido pelo Meson.
Ncurses
Esse pacote contém bibliotecas para o manuseio, independente de terminal, de telas de caractere. Frequentemente é usado para fornecer controle de cursor para um sistema com menus. Ele é necessitado por um número de pacotes no LFS.
Openssl
Esse pacote fornece ferramentas e bibliotecas de gerenciamento relacionadas à criptografia. Essas fornecem funções criptográficas para outros pacotes, incluindo o núcleo Linux.
Patch
Esse pacote contém um aplicativo para modificar ou criar arquivos aplicando um arquivo de remendo tipicamente criado pelo aplicativo diff. Ele é necessitado pelo procedimento de construção para vários pacotes do LFS.
Perl
Esse pacote é um interpretador para a linguagem de tempo de execução PERL. Ele é necessário para a instalação e suítes de teste de vários pacotes do LFS.
Pkgconf
Esse pacote contém um aplicativo que ajuda a configurar sinalizadores de compilador e de vinculador para bibliotecas de desenvolvimento. O aplicativo pode ser usado como um substituto imediato do pkg-config, que é necessário para o sistema de construção de muitos pacotes. Ele é mantido mais ativamente e um pouco mais rápido que o pacote Pkg-config original.
Procps-NG
Esse pacote contém aplicativos para monitorar processos. Esses aplicativos são úteis para administração de sistema e também são usados pelos scripts de inicialização do LFS.
Psmisc
Esse pacote produz aplicativos para mostrar informações acerca de processos em execução. Esses aplicativos são úteis para administração de sistema.
Python 3
Esse pacote fornece uma linguagem interpretada que tem uma filosofia de projeto que enfatiza a legibilidade de código.
Readline
Esse pacote é um conjunto de bibliotecas que oferecem recursos de edição e de histórico de linha de comando. Ele é usado pelo Bash.
Sed
Esse pacote permite edição de texto sem abri-lo em um editor de texto. Ele também é necessitado por muitos scripts de configuração dos pacotes do LFS.
Shadow
Esse pacote contém aplicativos para manusear senhas seguramente.
Systemd
Esse pacote fornece um programa init e vários recursos adicionais de inicialização e de controle de sistema como uma alternativa ao SysVinit. Ele é usado por muitas distribuições do Linux.
Tar
Esse pacote fornece recursos de arquivamento e de extração de virtualmente todos os pacotes usados no LFS.
Tcl
Esse pacote contém a Tool Command Language usada em muitas suítes de teste.
Texinfo
Esse pacote fornece aplicativos para ler, escrever e converter páginas info. Ele é usado nos procedimentos de instalação de muitos pacotes do LFS.
Util-linux
Esse pacote contém aplicativos utilitários diversos. Entre eles estão utilitários para manusear sistemas de arquivos, consoles, partições e mensagens.
Vim
Esse pacote fornece um editor. Ele foi escolhido por causa da compatibilidade dele com o clássico editor vi e o número gigante de recursos poderosos dele. Um editor é uma escolha muito pessoal para muitas(os) usuárias(os). Qualquer outro editor pode ser substituído, se você desejar.
Wheel
Esse pacote fornece um módulo do Python que é a implementação de referência do padrão de empacotamento roda do Python.
XML::Parser
Esse pacote é um módulo do Perl que interage com o Expat.
XZ Utils
Esse pacote contém aplicativos para comprimir e descomprimir arquivos. Ele fornece a maior compressão geralmente disponível e é útil para descomprimir pacotes no formato XZ ou LZMA.
Zlib
Esse pacote contém rotinas de compressão e de descompressão usadas por alguns aplicativos.
Zstd
Esse pacote fornece rotinas de compressão e de descompressão usadas por alguns aplicativos. Ele fornece taxas altas de compressão e um intervalo muito amplo de intercâmbios entre compressão / velocidade.
Para tornar as coisas mais fáceis de serem seguidas, existem umas poucas convenções tipográficas usadas ao longo deste livro. Esta seção contém alguns exemplos do formato tipográfico encontrado ao longo do Linux From Scratch.
./configure --prefix=/usr
Essa forma de texto é projetada para ser digitada exatamente como vista, a menos que seja dito o contrário no texto que a envolve. Também é usada nas seções de explicação para identificar quais dos comandos estão sendo referenciados.
Em alguns casos, uma linha lógica é estendida em duas ou mais linhas físicas com uma barra invertida no final da linha.
CC="gcc -B/usr/bin/" ../binutils-2.18/configure \ --prefix=/tools --disable-nls --disable-werror
Observe que a barra invertida precisa ser seguida por uma quebra de linha imediata. Outros caracteres de espaço em branco, como caracteres de espaços ou de tabulação criarão resultados incorretos.
install-info: unknown option '--dir-file=/mnt/lfs/usr/info/dir'
Essa forma de texto (de largura fixa) mostra a saída gerada em
tela, geralmente como o resultado de comandos emitidos. Esse
formato também é usado para mostrar nomes de arquivos, tais como
/etc/ld.so.conf
.
Por favor, configure o seu navegador para exibir texto de
largura fixa com uma boa fonte mono espaçada, com a qual você
possa distinguir claramente os glifos de Il1
ou O0
.
Ênfase
Essa forma de texto é usada para vários propósitos no livro. O propósito principal dela é o de enfatizar pontos ou itens importantes.
https://www.linuxfromscratch.org/
Esse formato é usado para hiperlinks tanto dentro da comunidade do LFS, quanto para páginas externas. Inclui HOWTOs, locais de download e páginas da Internet.
cat > $LFS/etc/group << "EOF"
root:x:0:
bin:x:1:
......
EOF
Esse formato é usado quando da criação de arquivos de
configuração. O primeiro comando diz ao sistema para criar o
arquivo $LFS/etc/group
a partir do
que seja digitado nas linhas seguintes até que a sequência “End
Of File” (EOF) seja encontrada. Portanto, essa seção inteira
geralmente é digitada como é vista.
<TEXTO
SUBSTITUÍDO>
Esse formato é usado para encapsular texto que não é para ser digitado como visto ou para operações de “copiar-e-colar”.
[TEXTO OPCIONAL]
Esse formato é usado para encapsular texto que é opcional.
Esse formato é usado para referir-se a uma página de manual
("man") específica. O número dentro dos parênteses indica uma
seção específica dentro dos manuais. Por exemplo, o "passwd" tem duas páginas de
manual. Conforme as instruções de instalação do LFS, essas duas
páginas de manual estarão localizadas em "/usr/share/man/man1/passwd.1
" e "/usr/share/man/man5/passwd.5
". Quando o livro
usa "passwd(5)" ele está
se referindo especificamente a "/usr/share/man/man5/passwd.5
". "man passwd" imprimirá a
primeira página de manual que achar que corresponde a
“passwd”, a
qual será "/usr/share/man/man1/passwd.1
". Para esse
exemplo, você precisará executar "man 5 passwd" para a finalidade
de ler a página sendo especificada. Observe que a maioria das
páginas de manual não tem nomes duplicados de páginas em
diferentes seções. Portanto, "man
<nome do
aplicativo>
" geralmente é
suficiente. No livro LFS essas referências para páginas de manual
também são hiperlinks, de forma que clicar-se em tal referência
abrirá a página de manual renderizada em "HTML" a partir das
páginas de
manual do Arch Linux.
Este livro é dividido nas seguintes partes.
A Parte I explica umas poucas observações importantes a respeito do como proceder com a instalação do LFS. Essa seção também fornece metainformação a respeito do livro.
A Parte II descreve como se preparar para o processo de construção—criando uma partição, baixando os pacotes e compilando as ferramentas temporárias.
A Parte III fornece instruções para a construção das ferramentas necessárias para construir o sistema LFS final.
A Parte IV guia o(a) leitor(a) ao longo da construção do sistema LFS—compilando e instalando todos os pacotes, um por um, configurando os scripts de inicialização e instalando o núcleo. O sistema Linux resultante é a fundação sobre a qual outros aplicativos podem ser construídos para expandir o sistema conforme desejado. No final deste livro, existe uma referência fácil de usar listando todos os aplicativos, bibliotecas e arquivos importantes que tenham sido instalados.
A Parte V fornece informação acerca do próprio livro incluindo acrônimos e termos, reconhecimentos, dependências de pacotes, uma listagem dos scripts de inicialização do LFS, licenças para a distribuição do livro e um índice compreensível dos pacotes, aplicativos, bibliotecas e scripts.
O software usado para criar um sistema LFS constantemente está sendo atualizado e melhorado. Avisos de segurança e correções de defeitos possivelmente se tornem disponíveis depois que o livro LFS tenha sido lançado. Para verificar se versões dos pacotes ou as instruções neste lançamento do LFS necessitam de quaisquer modificações—para reparar vulnerabilidades de segurança ou para corrigir outros defeitos—por favor visite https://www.linuxfromscratch.org/lfs/errata/12.2-systemd/ antes de continuar com a sua construção. Você deveria observar quaisquer mudanças mostradas e aplicá-las às seções relevantes do livro conforme construa o sistema LFS.
Adicionalmente, os(as) editores(as) do Linux From Scratch mantém uma lista das vulnerabilidades de segurança descobertas depois que um livro tenha sido lançado. Para ler a lista, por favor visite https://www.linuxfromscratch.org/lfs/advisories/ antes de proceder com sua construção. Você deveria aplicar as mudanças sugeridas pelos avisos às seções relevantes do livro conforme construa o sistema LFS. E, se usará o sistema LFS como um desktop real ou um sistema servidor, [então] você deveria continuar a consultar os avisos e a corrigir quaisquer vulnerabilidades de segurança, mesmo quando o sistema LFS tenha sido completamente construído.
O sistema LFS será construído usando uma distribuição Linux já instalada (tal como Debian; o OpenMandriva; Fedora ou openSUSE). Esse sistema Linux existente (o anfitrião) será usado como um ponto de partida para fornecer os aplicativos necessários, incluindo um compilador, um vinculador e um shell para construir o novo sistema. Selecione a opção “desenvolvimento” durante a instalação da distribuição para incluir essas ferramentas.
Existem muitas maneiras de se instalar uma distribuição Linux e os padrões geralmente não são ideais para construir um sistema LFS. Para sugestões a respeito de configurar uma distribuição comercial, veja-se: https://www.linuxfromscratch.org/hints/downloads/files/partitioning-for-lfs.txt.
Como uma alternativa a instalar uma distribuição separada em sua máquina, você possivelmente deseje usar um LiveCD de uma distribuição comercial.
O Capítulo 2 deste livro descreve como criar uma nova partição Linux nativa e sistema de arquivos, onde o novo sistema LFS será compilado e instalado. O Capítulo 3 explica quais pacotes e patches precisam ser baixados para construir um sistema LFS e como armazená-los no novo sistema de arquivos. O Capítulo 4 discute a configuração de um ambiente de trabalho apropriado. Por favor, leia o Capítulo 4 cuidadosamente, uma vez que ele explica vários assuntos importantes a respeito dos quais você deveria estar ciente antes de começar seu trabalho ao longo do Capítulo 5 e além.
O Capítulo 5, explica a instalação do conjunto inicial de ferramentas, (binutils, gcc e glibc) usando técnicas de compilação cruzada para isolar as novas ferramentas das do sistema anfitrião.
O Capítulo 6 te mostra como compilar cruzadamente utilitários básicos usando o recém construído conjunto cruzado de ferramentas.
O Capítulo 7 então entra em um ambiente "chroot" onde nós usamos as novas ferramentas para construir todos o restante das ferramentas necessárias para criar o sistema LFS.
Esse esforço para isolar o sistema novo do sistema anfitrião possivelmente pareça excessivo. Uma explicação técnica completa do porquê isso é feito é fornecida nas Observações Técnicas do Conjunto de Ferramentas.
No Capítulo 8, o sistema LFS completo é construído. Outra vantagem fornecida pelo ambiente chroot é a de que ele te permite continuar usando o sistema anfitrião enquanto o LFS está sendo construído. Enquanto espera por compilações de pacotes completarem, você pode continuar usando seu computador normalmente.
Para finalizar a instalação, a configuração básica do sistema é concluída no Capítulo 9, e o núcleo e carregador de inicialização são criados no Capítulo 10. O Capítulo 11 contém informação sobre como continuar a experiência LFS além deste livro. Após os passos neste capítulo terem sido implementados, o computador estará pronto para reinicializar no novo sistema LFS.
Esse é o processo em poucas palavras. Informação detalhada sobre cada passo é apresentada nos capítulos seguintes. Itens que pareçam complicados agora serão esclarecidos e tudo ficará em seu devido lugar conforme você embarcar na aventura do LFS.
Aqui está uma lista dos pacotes atualizados desde o lançamento anterior do LFS.
Atualizado para:
Automake-1.17
Bash-5.2.32
Bc-6.7.6
Binutils-2.43.1
Coreutils-9.5
E2fsprogs-1.47.1
Expat-2.6.2
Findutils-4.10.0
GCC-14.2.0
GDBM-1.24
Gettext-0.22.5
Glibc-2.40
Iana-Etc-20240806
IPRoute2-6.10.0
Jinja2-3.1.4
Kmod-33
Less-661
Libcap-2.70
Libelf originário do Elfutils-0.191
Libffi-3.4.6
Linux-6.10.5
Lz4-1.10.0
Man-DB-2.12.1
Man-pages-6.9.1
Meson-1.5.1
Ncurses-6.5
Ninja-1.12.1
OpenSSL-3.3.1
Perl-5.40.0
Pkgconf-2.3.0
Psmisc-23.7
Python-3.12.5
Readline-8.2.13
Setuptools-72.2.0
Shadow-4.16.0
Systemd-256.4
Tcl-8.6.14
Util-linux-2.40.2
Vim-9.1.0660
Wheel-0.44.0
Xz-5.6.2
Zstd-1.5.6
Adicionado:
Lz4-1.10.0
Removido:
bash-5.2.21-upstream_fixes-1.patch
readline-8.2-upstream_fixes-3.patch
Esta é a versão 12.2-systemd do livro Linux From Scratch, datada de 1º de setembro de 2024. Se este livro for mais antigo que seis meses, uma versão mais nova e melhor provavelmente já está disponível. Para descobrir, por favor verifique um dos espelhos via https://www.linuxfromscratch.org/mirrors.html.
Abaixo está uma lista das mudanças feitas desde o lançamento anterior do livro.
Entradas do Registro das Mudanças:
2024-09-01
[bdubbs] - LFS-12.2 lançado.
2024-08-17
2024-08-15
2024-08-05
[bdubbs] - Atualizado para bash-5.2.32. Corrige #5532.
[bdubbs] - Atualização para iana-etc-20240801. Endereça #5006.
[bdubbs] - Atualização para to vim-9.1.0660. Endereça #4500.
[bdubbs] - Atualizado para binutils-2.43. Corrige #5535.
[bdubbs] - Atualizado para linux-6.10.3. Corrige #5534.
[bdubbs] - Atualizado para readline-8.2.13. Corrige #5533.
[bdubbs] - Atualizado para wheel-0.44.0. Corrige #5536.
2024-08-01
[bdubbs] - Atualizado para gcc-14.2.0. Corrige #5530.
[bdubbs] - Atualização para iana-etc-20240723. Endereça #5006.
[bdubbs] - Atualizado para glibc-2.40. Corrige #5529.
[bdubbs] - Atualizado para iproute2-6.10.0. Corrige #5523.
[bdubbs] - Atualizado para linux-6.10.2. Corrige #5521.
[bdubbs] - Atualizado para lz4-1.10.0. Corrige #5526.
[bdubbs] - Atualizado para meson-1.5.1. Corrige #5527.
[bdubbs] - Atualizado para setuptools-72.1.0. Corrige #5531.
[bdubbs] - Atualizado para systemd-256.4. Corrige #5518.
2024-07-15
[bdubbs] - Atualização para iana-etc-20240701. Endereça #5006.
[bdubbs] - Atualização para vim-9.1.0580. Endereça #4500.
[bdubbs] - Atualizado para automake-1.17. Corrige #5520.
[bdubbs] - Atualizado para gdbm-1.24. Corrige #5515.
[bdubbs] - Atualizado para linux-6.9.9. Corrige #5517.
[bdubbs] - Atualizado para less-661. Corrige #5513.
[bdubbs] - Atualizado para meson-1.5.0. Corrige #5519.
[bdubbs] - Atualizado para setuptools-70.3.0. Corrige #5514.
[bdubbs] - Atualizado para util-linux-2.40.2. Corrige #5516.
2024-07-01
[bdubbs] - Atualização para iana-etc-20240612. Endereça #5006.
[bdubbs] - Atualizado para bc-6.7.6. Corrige #5506.
[bdubbs] - Atualizado para man-pages-6.9.1. Corrige #5507.
[bdubbs] - Atualizado para linux-6.9.7. Corrige #5508.
[bdubbs] - Atualizado para shadow-4.16.0. Corrige #5510.
[bdubbs] - Atualizado para systemd-256.1. Corrige #5511.
[bdubbs] - Atualizado para setuptools-70.1.1. Corrige #5512.
2024-06-15
[bdubbs] - Atualização para vim-9.1.0478. Endereça #4500.
[bdubbs] - Atualização para iana-etc-20240607. Endereça #5006.
[bdubbs] - Atualizado para systemd-256. Corrige #5504.
[bdubbs] - Atualizado para python3-3.12.4. Corrige #5502.
[bdubbs] - Atualizado para perl-5.40.0. Corrige #5503.
[bdubbs] - Atualização para openssl-3.3.1 (correção de segurança). Corrige #5500.
[bdubbs] - Atualizado para linux-6.9.4. Corrige #5505.
[bdubbs] - Atualizado para findutils-4.10.0. Corrige #5499.
2024-05-31
[bdubbs] - Atualizado para meson-1.4.1. Corrige #5498.
[bdubbs] - Atualizado para xz-5.6.2. Corrige #5471.
[bdubbs] - Adicionar instruções de compatibilidade do linux-6.9.x ao systemd . Corrige #5496.
[bdubbs] - Atualizado para setuptools-70.0.0 (módulo python). Corrige #5491.
[bdubbs] - Atualizado para ninja-1.12.1. Corrige #5489.
[bdubbs] - Atualizado para man-pages-6.8. Corrige #5494.
[bdubbs] - Atualizado para linux-6.9.3. Corrige #5491.
[bdubbs] - Atualizado para libcap-2.70. Corrige #5493.
[bdubbs] - Atualizado para iproute2-6.9.0. Corrige #5492.
[bdubbs] - Atualizado para e2fsprogs-1.47.1. Corrige #5495.
2024-05-13
[xry111] - Sincronizar o remendo i18n do coreutils oriundo do Fedora para corrigir uma falha de construção no x86 de 32 bits e um aviso alarmante do compilador em ambos, x86 de 32 bits e x86_64, com GCC 14.1 ou posterior.
2024-05-11
[bdubbs] - Atualização para vim-9.1.0405. Endereça #4500.
[bdubbs] - Atualizado para util-linux-2.40.1. Corrige #5482.
[bdubbs] - Atualizado para linux-6.8.9. Corrige #5484.
[bdubbs] - Atualizado para jinja2-3.1.4 (módulo Python). Corrige #5485.
[bdubbs] - Atualização para iana-etc-20240502. Endereça #5006.
[bdubbs] - Atualizado para gcc-14.1.0. Corrige #5486.
2024-05-01
2024-04-16
[bdubbs] - Fazer pequenas mudanças no texto da saída gerada do conjunto de comandos sequenciais ifup.
2024-04-15
[bdubbs] - Atualizado para setuptools-69.5.1. Corrige #5478.
[bdubbs] - Atualizado para python3-3.12.3. Corrige #5476.
[bdubbs] - Atualizado para openssl-3.3.0. Corrige #5475.
[bdubbs] - Atualizado para ninja-1.12.0. Corrige #5477.
[bdubbs] - Atualizado para man-db-2.12.1. Corrige #5474.
[bdubbs] - Atualizado para linux-6.8.6. Corrige #5472.
[bdubbs] - Atualização para iana-etc-20240412. Endereça #5006.
[bdubbs] - Atualização para vim-9.1.0330. Endereça #4500.
2024-03-31
[bdubbs] - Atualização para iana-etc-20240318. Endereça #5006.
[bdubbs] - Atualizado para zstd-1.5.6. Corrige #5468.
[bdubbs] - Atualizado para util-linux-2.40. Corrige #5430.
[bdubbs] - Atualizado para shadow-4.15.1. Corrige #5465.
[bdubbs] - Atualizado para pkgconf-2.2.0. Corrige #5469.
[bdubbs] - Atualizado para linux-6.8.2. Corrige #5467.
[bdubbs] - Atualizado para coreutils-9.5. Corrige #5470.
2024-03-29
[bdubbs] - Reverter para xz-5.4.6 devido a comprometimento do fluxo de desenvolvimento.
2024-03-19
2024-03-15
[bdubbs] - Atualizado para wheel-0.43.0. Corrige #5459.
[bdubbs] - Atualizado para setuptools-69.2.0 (módulo Python). Corrige #5462.
[bdubbs] - Atualizado para meson-1.4.0. Corrige #5460.
[bdubbs] - Atualização para expat-2.6.2 (Correção de segurança). Corrige #5461.
[bdubbs] - Atualização para iana-etc-20240305. Endereça #5006.
[bdubbs] - Atualização para vim-9.1.0161. Endereça #4500.
[bdubbs] - Atualizado para xz-5.6.1. Corrige #5457.
[bdubbs] - Atualizado para shadow-4.15.0. Corrige #5456.
[bdubbs] - Atualizado para psmisc-23.7. Corrige #5454.
[bdubbs] - Atualizado para kmod-32. Corrige #5455.
[bdubbs] - Atualizado para elfutils-0.191. Corrige #5451.
2024-03-02
[bdubbs] - Atualização para iana-etc-20240222. Endereça #5006.
[bdubbs] - Atualização para vim-9.1.0145. Endereça #4500.
[bdubbs] - Atualizado para xz-5.6.0. Corrige #5447.
[bdubbs] - Atualizado para tcl-8.6.14. Corrige #5448.
[bdubbs] - Atualizado para shadow-4.14.6. Corrige #5450.
[bdubbs] - Atualizado para setuptools-69.1.1. Corrige #5446.
[bdubbs] - Atualizado para linux-6.7.7. Corrige #5444.
[bdubbs] - Atualizado para libffi-3.4.6. Corrige #5443.
[bdubbs] - Atualizado para gettext-0.22.5. Corrige #5445.
[bdubbs] - Atualizado para expat-2.6.1. Corrige #5449.
2024-03-01
[bdubbs] - LFS-12.1 lançado.
Se durante a construção do sistema LFS você encontrar quaisquer erros, tiver quaisquer perguntas, ou entender que há um erro de digitação no livro, [então], por favor, comece consultando as Perguntas Feitas Frequentemente (FAQ) que estão localizadas em https://www.linuxfromscratch.org/faq/.
O servidor linuxfromscratch.org
hospeda um número de
listas de discussão usadas para o desenvolvimento do projeto
LFS. Essas listas incluem as principais listas de
desenvolvimento e suporte, dentre outras. Se você não
conseguir encontrar uma resposta para o seu problema na
página do FAQ, [então] o próximo passo seria procurar nas
listas de discussão em https://www.linuxfromscratch.org/search.html.
Para informação sobre as diversas listas, como se inscrever, localização de arquivos e informações adicionais, visite https://www.linuxfromscratch.org/mail.html.
Vários membros da comunidade LFS oferecem assistência via
Internet Relay Chat (IRC). Antes de usar esse suporte, por
favor certifique-se de que sua pergunta já não foi respondida
no FAQ do LFS ou nos arquivos das listas de discussão. Você
pode encontrar a rede de comunicação IRC em irc.libera.chat
. O canal de suporte é
chamado de #lfs-support.
O projeto LFS tem um número de espelhos mundo afora para tornar o acesso ao sítio do projeto e o download dos pacotes exigidos mais conveniente. Por favor visite o sítio web do LFS em https://www.linuxfromscratch.org/mirrors.html para uma lista dos espelhos atuais.
Caso você tenha encontrado um problema ao construir um pacote com a instrução do LFS, nós desencorajamos fortemente postar o problema diretamente no canal de suporte do fluxo de desenvolvimento antes de discutir por meio de um canal de suporte do LFS listado em Seção 1.4, “Recursos.” Fazer isso frequentemente é bastante ineficiente porque os(as) mantenedores(as) de fluxo de desenvolvimento raramente estão familiarizados com o procedimento de construção do LFS. Mesmo se você realmente tiver encontrado um problema de fluxo de desenvolvimento, a comunidade LFS ainda consegue ajudar a isolar as informações desejadas pelos(as) mantenedores(as) de fluxo de desenvolvimento e produzir um informe adequado.
Se precisar fazer uma pergunta diretamente por meio de um canal de suporte do(a) desenvolvedor(a), [então] você deveria observar, pelo menos, que muitos projetos de desenvolvedor(a) tem os canais de suporte separados do rastreador de defeitos. Os informes de “defeito” para fazer perguntas são considerados inválidos e podem incomodar os(as) desenvolvedores(as) upstream para esses projetos.
Se um problema ou uma pergunta for encontrado durante o trabalho ao longo deste livro, [então], por favor, verifique a página de Perguntas Frequentes em https://www.linuxfromscratch.org/faq/#generalfaq. Perguntas frequentemente já estão respondidas lá. Se sua pergunta não estiver respondida nessa página, [então], por favor, tente encontrar a origem do problema. A dica seguinte te dará alguma orientação com relação à resolução de problemas: https://www.linuxfromscratch.org/hints/downloads/files/errors.txt.
Se você não conseguir achar seu problema listado nas Perguntas Frequentes, [então] procure nas listas de discussão em https://www.linuxfromscratch.org/search.html.
Nós também temos uma comunidade LFS maravilhosa que está disposta a oferecer assistência por meio das listas de discussão e IRC (veja a seção Seção 1.4, “Recursos” deste livro). Entretanto, nós temos várias perguntas de suporte todos os dias e muitas delas poderiam ter sido facilmente respondidas indo para as Perguntas Frequentes ou procurando nas listas de discussão primeiro. Então, para que nós possamos oferecer a melhor assistência possível, você deveria primeiro fazer alguma pesquisa por conta própria. Isso nos permite focar nas necessidades menos usuais de suporte. Se suas buscas não produzirem uma solução, [então], por favor, inclua todas as informações relevantes (mencionadas abaixo) no seu pedido por ajuda.
Além de uma breve explicação do problema sendo vivenciado, qualquer solicitação por ajuda deveria incluir estas coisas essenciais:
A versão do livro sendo usada (neste caso 12.2-systemd)
A distribuição anfitriã e versão sendo usada para criar o LFS
A saída gerada originária do script Exigências do Sistema Anfitrião
O pacote ou seção onde o problema foi encontrado
A mensagem exata do erro ou uma descrição clara do problema
Observação se você tiver se desviado do livro afinal
Desviar-se deste livro não significa que nós não vamos te ajudar. Afinal de contas, o LFS é acerca de preferência pessoal. Ser sincero a respeito de quaisquer mudanças no procedimento estabelecido nos ajuda a avaliar e determinar possíveis causas do seu problema.
Se algo der errado quando executar o script configure, [então] revise o
arquivo config.log
. Esse
arquivo possivelmente contenha erros encontrados durante o
configure os
quais não foram exibidos na tela. Inclua as linhas
relevantes se você
precisar pedir ajuda.
Tanto a saída gerada da tela quanto o conteúdo de vários arquivos são úteis para determinar a causa de problemas de compilação. A saída gerada da tela originária do script configure e a execução do make podem ser úteis. Não é necessário incluir a saída gerada inteira, mas inclua toda a informação relevante. Aqui está um exemplo do tipo de informação a incluir a partir da saída gerada de tela do make.
gcc -D ALIASPATH=\"/mnt/lfs/usr/share/locale:.\"
-D LOCALEDIR=\"/mnt/lfs/usr/share/locale\"
-D LIBDIR=\"/mnt/lfs/usr/lib\"
-D INCLUDEDIR=\"/mnt/lfs/usr/include\" -D HAVE_CONFIG_H -I. -I.
-g -O2 -c getopt1.c
gcc -g -O2 -static -o make ar.o arscan.o commands.o dir.o
expand.o file.o function.o getopt.o implicit.o job.o main.o
misc.o read.o remake.o rule.o signame.o variable.o vpath.o
default.o remote-stub.o version.o opt1.o
-lutil job.o: In function `load_too_high':
/lfs/tmp/make-3.79.1/job.c:1565: undefined reference
to `getloadavg'
collect2: ld returned 1 exit status
make[2]: *** [make] Error 1
make[2]: Leaving directory `/lfs/tmp/make-3.79.1'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/lfs/tmp/make-3.79.1'
make: *** [all-recursive-am] Error 2
Nesse caso, muitas pessoas incluiriam apenas a seção final:
make [2]: *** [make] Error 1
Essa não é informação suficiente para diagnosticar o problema, pois essa linha apenas mostra que algo deu errado, não o que deu errado. A seção inteira, como no exemplo acima, é o que deveria ser salva, porque ela inclui o comando que foi executado e todas as mensagens de erro associadas.
Um artigo excelente sobre como pedir ajuda na Internet está disponível online em http://catb.org/~esr/faqs/smart-questions.html. Leia esse documento e siga as dicas. Fazer isso aumentará a possibilidade de obter a ajuda que você precisa.
Neste capítulo, as ferramentas do anfitrião necessárias para a construção do LFS são verificadas e, se necessário, instaladas. Então uma partição que hospedará o sistema LFS é preparada. Nós criaremos a própria partição, criaremos um sistema de arquivos nela e a montaremos.
Os(As) editores(as) do LFS recomendam que a CPU do sistema tenha pelo menos quatro núcleos e que o sistema tenha pelo menos oito (08) GB de memória. Os sistemas mais antigos que não atendam a essas exigências ainda funcionarão, porém o tempo para construir os pacotes será significantemente maior que o documentado.
O teu sistema anfitrião deveria ter o seguinte logiciário com
as versões mínimas indicadas. Isso não deveria ser um
problema para a maioria das distribuições modernas do Linux.
Também, observe que muitas distribuições colocarão cabeçalhos
de logiciários dentro de pacotes separados, frequentemente na
forma de
ou <nome-pacote>
-devel
.
Certifique-se de instalá-los se a tua distribuição os
fornecer.
<nome-pacote>
-dev
Versões anteriores dos pacotes de software listados possivelmente funcionem, porém não foram testados.
Bash-3.2 (/bin/sh deveria ser um link simbólico ou real para bash)
Binutils-2.13.1 (Versões maiores que 2.43.1 não são recomendadas dado que elas não foram testadas)
Bison-2.7 (/usr/bin/yacc deveria ser um link para bison ou script pequeno que executa bison)
Coreutils-8.1
Diffutils-2.8.1
Findutils-4.2.31
Gawk-4.0.1 (/usr/bin/awk deveria ser um link para gawk)
GCC-5.2 incluindo o compilador C++, g++ (Versões maiores que 14.2.0 não são recomendadas dado que elas não foram testadas). As bibliotecas C e C++ padrão (com cabeçalhos) também precisam estar presentes, de forma que o compilador C++ possa construir aplicativos hospedados
Grep-2.5.1a
Gzip-1.3.12
Núcleo Linux-4.19
A razão para a exigência da versão do núcleo é a de que nós especificamos essa versão quando da construção da glibc no Capítulo 5 e Capítulo 8, de forma que as soluções alternativas para os núcleos mais antigos não estão habilitadas e a glibc compilada é ligeiramente mais rápida e menor. Em fevereiro de 2024, 4.19 é o lançamento mais antigo do núcleo ainda suportado pelos(as) desenvolvedores(as) do núcleo. Alguns lançamentos de núcleo mais antigos que 4.19 possivelmente ainda sejam suportados por equipes de terceiros, porém não são considerados lançamentos oficiais de desenvolvedor(a) do núcleo; leia-se https://kernel.org/category/releases.html para os detalhes.
Se o núcleo do anfitrião for anterior a 4.19, [então] você precisará substituir o núcleo por uma versão mais atualizada. Existem duas maneiras de você fazer isso. Primeira, veja se seu fornecedor Linux fornece um pacote do núcleo 4.19 ou mais atual. Se sim, [então] você possivelmente deseje instalá-lo. Se seu fornecedor não oferecer um pacote de núcleo aceitável ou você preferisse não instalá-lo, [então] você mesmo(a) pode compilar um núcleo. Instruções para a compilação de núcleo e configuração de carregador de inicialização (presumindo que o anfitrião usa GRUB) estão localizadas no Capítulo 10.
Nós exigimos que o núcleo do anfitrião suporte o pseudo
terminal UNIX 98 (PTY). Ele deveria estar habilitado em
todas as distribuições desktop ou servidor que
embarquem o Linux 4.19 ou um núcleo mais recente. Se
você estiver construindo um núcleo personalizado de
anfitrião, certifique-se de que CONFIG_UNIX98_PTYS
esteja configurada
como y
na configuração do
núcleo.
M4-1.4.10
Make-4.0
Patch-2.5.4
Perl-5.8.8
Python-3.4
Sed-4.1.5
Tar-1.22
Texinfo-5.0
Xz-5.0.0
Perceba que os links simbólicos mencionados acima são exigidos para construir um sistema LFS usando as instruções contidas neste livro. Links simbólicos que apontem para outro software (tais como dash, mawk, etc.) possivelmente funcionem, porém não são testados ou suportados pela equipe de desenvolvimento do LFS e possivelmente exijam ou desvio das instruções ou remendos adicionais para alguns pacotes.
Para ver se o seu sistema anfitrião tem todas as versões apropriadas e a habilidade de compilar aplicativos, execute os seguintes comandos:
cat > version-check.sh << "EOF"
#!/bin/bash
# Um conjunto sequencial de comandos para listar os números de versão de ferramentas críticas de desenvolvimento
# Se você tiver ferramentas instaladas em outros diretórios, [então] ajuste "PATH" aqui E
# em ~lfs/.bashrc (seção 4.4) também.
LC_ALL=C
PATH=/usr/bin:/bin
bail() { echo "FATAL: $1"; exit 1; }
grep --version > /dev/null 2> /dev/null || bail "grep não funciona"
sed '' /dev/null || bail "sed não funciona"
sort /dev/null || bail "sort não funciona"
ver_check()
{
if ! type -p $2 &>/dev/null
then
echo "ERRO: Não conseguiu encontrar $2 ($1)"; return 1;
fi
v=$($2 --version 2>&1 | grep -E -o '[0-9]+\.[0-9\.]+[a-z]*' | head -n1)
if printf '%s\n' $3 $v | sort --version-sort --check &>/dev/null
then
printf "OK: %-9s %-6s >= $3\n" "$1" "$v"; return 0;
else
printf "ERRO: %-9s é MUITO ANTIGO ($3 ou posterior exigido)\n" "$1";
return 1;
fi
}
ver_kernel()
{
kver=$(uname -r | grep -E -o '^[0-9\.]+')
if printf '%s\n' $1 $kver | sort --version-sort --check &>/dev/null
then
printf "OK: núcleo Linux $kver >= $1\n"; return 0;
else
printf "ERRO: núcleo Linux ($kver) é MUITO ANTIGO ($1 ou posterior exigido)\n" "$kver";
return 1;
fi
}
# "Coreutils" primeiro, pois "--version-sort" precisa do "Coreutils" >= 7.0
ver_check Coreutils sort 8.1 || bail "Coreutils muito antigo, pare"
ver_check Bash bash 3.2
ver_check Binutils ld 2.13.1
ver_check Bison bison 2.7
ver_check Diffutils diff 2.8.1
ver_check Findutils find 4.2.31
ver_check Gawk gawk 4.0.1
ver_check GCC gcc 5.2
ver_check "GCC (C++)" g++ 5.2
ver_check Grep grep 2.5.1a
ver_check Gzip gzip 1.3.12
ver_check M4 m4 1.4.10
ver_check Make make 4.0
ver_check Patch patch 2.5.4
ver_check Perl perl 5.8.8
ver_check Python python3 3.4
ver_check Sed sed 4.1.5
ver_check Tar tar 1.22
ver_check Texinfo texi2any 5.0
ver_check Xz xz 5.0.0
ver_kernel 4.19
if mount | grep -q 'devpts on /dev/pts' && [ -e /dev/ptmx ]
then echo "OK: núcleo Linux suporta PTY do UNIX 98";
else echo "ERRO: núcleo Linux NÃO suporta PTY do UNIX 98"; fi
alias_check() {
if $1 --version 2>&1 | grep -qi $2
then printf "OK: %-4s is $2\n" "$1";
else printf "ERRO: %-4s is NOT $2\n" "$1"; fi
}
echo "Aliases:"
alias_check awk GNU
alias_check yacc Bison
alias_check sh Bash
echo "Verificação do compilador:"
if printf "int main(){}" | g++ -x c++ -
then echo "OK: g++ funciona";
else echo "ERRO: g++ NÃO funciona"; fi
rm -f a.out
if [ "$(nproc)" = "" ]; then
echo "ERRO: nproc não está disponível ou ele produz saída gerada vazia"
else
echo "OK: nproc informa que $(nproc) núcleos lógicos estão disponíveis"
fi
EOF
bash version-check.sh
O LFS é projetado para ser construído em uma sessão. Isto é, as instruções assumem que o sistema não será desligado durante o processo. Isso não significa que o sistema tenha de ser construído de uma vez só. O problema é que certos procedimentos precisam ser repetidos depois de uma inicialização quando se retomando o LFS em pontos diferentes.
Esses capítulos executam comandos no sistema anfitrião. Quando da reinicialização, esteja certo(a) de uma coisa:
Os procedimentos realizados como o(a) usuário(a)
root
após a Seção 2.4
precisam ter a variável de ambiente LFS configurada
PARA A(O) USUÁRIA(O)
ROOT.
A partição /mnt/lfs precisa estar montada.
Esses dois capítulos precisam ser feitos como
o(a) usuário(a) lfs
. Um
comando su -
lfs precisa ser emitido antes de
realizar qualquer tarefa nesses capítulos. Se você não
fizer isso, [então] você está no risco de instalar
pacotes no sistema anfitrião e potencialmente torná-lo
inutilizável.
Os procedimentos em Instruções Gerais de Compilação são críticos. Se existir qualquer dúvida se um pacote tiver sido instalado corretamente, [então] certifique-se de que o tarball anteriormente expandido tenha sido removido, então extraia novamente o pacote e complete todas as instruções naquela seção.
A partição /mnt/lfs precisa estar montada.
Umas poucas operações, desde “Mudando o(a)
Dono(a)” até “Entrando no Ambiente
Chroot”, precisam ser feitas como o(a)
usuário(a) "root
", com
a variável de ambiente "LFS" configurada para o(a)
usuário(a) "root
".
Quando entrar em chroot, a variável de ambiente LFS
precisa estar configurada para o(a) root
. A variável LFS não é usada
depois que o ambiente chroot tiver sido acessado.
Os sistemas virtuais de arquivo precisam estar
montados. Isso pode ser feito antes ou depois de entrar
no chroot mudando-se para um terminal virtual do
anfitrião e, como root
,
executando-se os comandos em Seção 7.3.1,
“Montando e Povoando /dev” e
Seção 7.3.2, “Montando Sistemas de Arquivos
Virtuais do Núcleo.”
Como a maior parte dos outros sistemas operacionais, o LFS geralmente é instalado em uma partição dedicada. A abordagem recomendada para construir um sistema LFS é a de usar uma partição disponível vazia ou, se você tiver espaço suficiente não particionado, criar uma.
Um sistema mínimo exige uma partição com cerca de dez (10) gigabytes (GB). Isso é suficiente para armazenar todos os tarballs dos fontes e compilar os pacotes. Entretanto, se o sistema LFS for concebido para ser o sistema Linux principal, [então] aplicativos adicionais provavelmente serão instalados os quais exigirão espaço adicional. Uma partição de trinta (30) GB é um tamanho razoável para permitir o crescimento. O sistema LFS em si não ocupará esse espaço todo. Uma boa parte dessa exigência é para fornecer armazenamento temporário livre suficiente. Adicionalmente, a compilação de pacotes pode exigir um monte de espaço de disco que será recuperado após o pacote ser instalado.
Como nem sempre existe Memória de Acesso Aleatório (RAM)
suficiente disponível para processos de compilação, é uma boa
ideia usar uma pequena partição de disco como espaço de
swap
. Ele é usado pelo kernel
para armazenar dados raramente usados e deixa mais memória
disponível para processos ativos. A partição de swap
para um sistema LFS pode ser a mesma
que aquela usada pelo sistema anfitrião, caso no qual não é
necessário criar outra.
Inicie um aplicativo de particionamento de disco como o
"cfdisk" ou o
"fdisk" com uma
opção de linha de comando indicando o disco rígido no qual a
nova partição será criada—por exemplo "/dev/sda
" para a unidade primária de disco.
Crie uma partição nativa do "Linux" e uma partição
"swap
", se necessária. Por
favor, recorra a "cfdisk(8)" ou a
"fdisk(8)" se você
ainda não sabe como usar os aplicativos.
Para usuários experientes, outros esquemas de partição são possíveis. O novo sistema LFS pode estar em um vetor de software RAID ou em um volume lógico LVM. Entretanto, algumas dessas opções exigem um initramfs, o que é um tópico avançado. Essas metodologias de particionamento não são recomendadas para usuárias(os) do LFS pela primeira vez.
Lembre-se da designação da nova partição (por exemplo,
sda5
). Este livro se referirá a
essa como a partição do LFS. Lembre-se também da designação da
partição swap
. Esses nomes
serão necessários posteriormente para o arquivo /etc/fstab
.
Solicitações de conselhos a respeito de particionamento do sistema frequentemente são postados nas listas de discussão do LFS. Esse é um tópico altamente subjetivo. O padrão para a maioria das distribuições é o de usar a unidade inteira com a exceção de uma pequena partição de swap. Isso não é ideal para o LFS por várias razões. Isso reduz flexibilidade; torna o compartilhamento de dados entre múltiplas distribuições ou construções do LFS mais difícil; torna as cópias de segurança mais demoradas; e podem desperdiçar espaço de disco devido à alocação ineficiente de estruturas do sistema de arquivos.
Uma partição raiz do LFS (não confundir com o diretório
/root
) de vinte (20)
gigabytes é uma boa escolha para a maior parte dos
sistemas. Ela fornece espaço suficiente para construir o
LFS e a maior parte do BLFS, mas é pequena o suficiente de
forma que múltiplas partições podem ser criadas facilmente
para experimentação.
A maioria das distribuições automaticamente cria uma partição swap. Geralmente o tamanho recomendado da partição swap é o de cerca de o dobro da quantidade de RAM física, entretanto isso raramente é necessário. Se o espaço de disco for limitado, [então] mantenha a partição swap com dois (2) gigabytes e monitore a quantidade de troca de disco.
Se você quiser usar o recurso da hibernação do Linux (suspend-to-disk), copia o conteúdo da RAM para a partição swap antes de desligar a máquina. Nesse caso o tamanho da partição swap deveria ser pelo menos tão grande quanto a RAM instalada do sistema.
O uso de swap nunca é bom. Para unidades rígidas mecânicas você geralmente pode dizer se um sistema está usando swap simplesmente monitorando a atividade do disco e observando como o sistema reage a comandos. Com um SSD você não estará apta(o) a monitorar swap, porém você consegue dizer quanto espaço de swap está sendo usado executando os aplicativos top ou free. O uso de um SSD para uma partição swap deveria ser evitado se possível. A primeira reação em caso de uso de swap deveria ser verificar se existe um comando irracional como tentar editar um arquivo de cinco gigabytes. Se o uso de swap se tornar uma ocorrência recorrente, [então] a melhor solução é a de comprar mais RAM para seu sistema.
Se o disco de inicialização tiver sido particionado com a Tabela de Partição GUID (GPT), então uma partição pequena, tipicamente um (1) MB, precisa ser criada se ela já não existir. Essa partição não é formatada, porém precisa estar disponível para o GRUB usar durante a instalação do carregador de inicialização. Essa partição normalmente será rotulada de 'BIOS Boot' se usar o fdisk ou terá um código de EF02 se usar o comando gdisk.
A Partição de Bios Grub precisa estar na unidade que o BIOS usa para inicializar o sistema. Essa não é necessariamente a unidade que mantém a partição raiz do LFS. Os discos em um sistema possivelmente usem tipos diferentes de tabela de partição. A necessidade da partição de Bios Grub depende apenas do tipo de tabela de partição do disco de inicialização.
Existem várias outras partições que não são exigidas, porém deveriam ser consideradas ao se projetar um layout de disco. A lista seguinte não é abrangente, mas é entendida como um guia.
/boot – Altamente recomendada. Use essa partição para armazenar os kerneis e outras informações de inicialização. Para minimizar potenciais problemas de inicialização com discos maiores, torne essa a primeira partição física na sua primeira unidade de disco. Um tamanho de partição de duzentos (200) megabytes é adequado.
/boot/efi – A Partição do Sistema EFI, a qual é necessária para inicializar o sistema com UEFI. Leia-se a página do BLFS para detalhes.
/home – Altamente recomendada. Compartilhe seu diretório home e personalizações de usuário(a) entre múltiplas distribuições ou construções do LFS. O tamanho geralmente é bastante grande e depende do espaço de disco disponível.
/usr – No LFS, /bin
,
/lib
e /sbin
são links simbólicos para
seus homólogos em /usr
.
Assim /usr
contém todos
os binários necessários para o sistema executar. Para
o LFS, uma partição separada para /usr
normalmente não é necessária.
Se, de qualquer maneira, você criá-la, [então] você
deveria tornar uma partição grande o suficiente para
acomodar todos os aplicativos e bibliotecas no
sistema. A partição raiz pode ser bem pequena (talvez
apenas um gigabyte) nessa configuração, de forma que
ela seja adequada para um "thin client" ou estação de
trabalho sem disco (onde /usr
é montado a partir de um
servidor remoto). Entretanto, você deveria estar
ciente de que um initramfs (não coberto pelo LFS)
será necessário para inicializar um sistema com
partição /usr
separada.
/opt – Esse diretório é mais útil para o BLFS onde múltiplos pacotes grandes como o KDE ou o Texlive podem ser instalados sem embutir os arquivos na hierarquia /usr. Se usado, 5 a 10 gigabytes geralmente é adequado.
/tmp – Por padrão, o systemd monta um tmpfs
aqui. Se você quiser
substituir esse comportamento, siga Seção 9.10.3,
“Desabilitando tmpfs para /tmp” quando configurar
o sistema LFS.
/usr/src – Essa partição é muito útil para disponibilizar um local para armazenar os arquivos fonte do BLFS e compartilhá-los entre construções do LFS. Ela também pode ser usada como um local para construir pacotes do BLFS. Uma partição razoavelmente grande de 30 a 50 gigabytes fornece abundância de espaço.
Qualquer partição separada que você queira montada
automaticamente quando o sistema iniciar precisa ser
especificada no arquivo /etc/fstab
. Detalhes a respeito do como
especificar partições serão discutidos na Seção 10.2,
“Criando o Arquivo /etc/fstab”.
Uma partição é apenas um intervalo de setores em uma unidade de disco, delimitados por fronteiras configuradas em uma tabela de partição. Antes do sistema operacional conseguir usar uma partição para armazenar quaisquer arquivos, a partição precisa estar formatada para conter um sistema de arquivos, tipicamente consistindo de um rótulo, blocos de diretório, blocos de dados e um esquema de indexação para localizar um arquivo em particular mediante demanda. O sistema de arquivos também auxilia o SO a manter rastreio do espaço livre na partição; reservar os setores necessários quando um arquivo novo for criado ou um arquivo existente for estendido; e reciclar os segmentos de dados livres criados quando arquivos são deletados. Possivelmente também forneça suporte para redundância de dados e para recuperação dos erros.
O LFS consegue usar qualquer sistema de arquivos reconhecido pelo kernel Linux, mas os tipos mais comuns são ext3 e ext4. A escolha do sistema de arquivos certo pode ser complexa; depende das características dos arquivos e do tamanho da partição. Por exemplo:
é adequado para partições pequenas que são atualizadas com pouca frequência tais como /boot.
é uma atualização do ext2 que inclui um diário para ajudar a recuperar a situação da partição no caso de desligamento inadequado. É comumente usada como sistema de arquivos de propósito geral.
é a versão mais recente da família ext de sistemas de arquivos. Ela fornece várias capacidades novas incluindo carimbos de tempo em nano segundos; criação e uso de arquivos muito grandes (até 16 TB); e melhoramentos de velocidade.
Outros sistemas de arquivos, incluindo FAT32, NTFS, JFS e XFS são úteis para propósitos especializados. Mais informação a respeito desses sistemas de arquivos, e de muitos outros, pode ser encontrada em https://en.wikipedia.org/wiki/Comparison_of_file_systems.
O LFS assume que o sistema de arquivos raiz (/) é do tipo ext4.
Para criar um sistema de arquivos ext4
na partição do LFS, emita o seguinte
comando:
mkfs -v -t ext4 /dev/<xxx>
Substitua <xxx>
pelo nome da partição do LFS.
Se você estiver usando uma partição swap
existente, [então] não há necessidade
de formatá-la. Se uma nova partição swap
foi criada, [então] ela precisará ser
inicializada com este comando:
mkswap /dev/<yyy>
Substitua <yyy>
pelo nome da partição swap
.
Ao longo deste livro, a variável de ambiente LFS
será usada muitas vezes. Você deveria se
assegurar de que essa variável sempre está definida no decorrer
do processo de construção do LFS. Ela deveria ser configurada
para o nome do diretório onde você estará construindo seu
sistema LFS - nós usaremos /mnt/lfs
como um exemplo, porém você
possivelmente escolha qualquer nome de diretório que queira. Se
você está construindo o LFS em uma partição separada, [então]
esse diretório será o ponto de montagem para a partição.
Escolha um local de diretório e configure a variável com o
seguinte comando:
export LFS=/mnt/lfs
Ter essa variável configurada é benéfico naqueles comandos, tais como mkdir -v $LFS/tools, que podem ser digitados literalmente. O shell automaticamente substituirá “$LFS” por “/mnt/lfs” (ou para o que a variável foi configurada) quando processar a linha de comando.
Não se esqueça de verificar se LFS
está configurada sempre que você deixar e entrar novamente no
ambiente atual de trabalho (como quando fizer um su para root
ou outro(a) usuário(a)). Verifique
se a variável LFS
está configurada
apropriadamente com:
echo $LFS
Tenha certeza de que a saída gerada mostra o caminho para o
seu local de construção do sistema LFS, o qual é /mnt/lfs
se o exemplo fornecido foi
seguido. Se a saída gerada estiver incorreta, [então] use o
comando dado anteriormente nesta página para configurar
$LFS
para o nome correto de
diretório.
Uma maneira de assegurar que a variável LFS
sempre esteja configurada é a de editar o
arquivo .bash_profile
tanto em
seu diretório home pessoal quanto em /root/.bash_profile
e inserir o comando
export acima. Adicionalmente, o shell especificado no arquivo
/etc/passwd
para todas(os)
as(os) usuárias(os) que precisam da variável LFS
precisa ser o bash para assegurar que o
arquivo /root/.bash_profile
seja incorporado como parte do processo de login.
Outra consideração é o método que é usado para logar no
sistema anfitrião. Se logando por intermédio de um
gerenciador gráfico de tela, [então] o .bash_profile
do(a) usuário(a) normalmente
não é usado quando um terminal virtual for iniciado. Nesse
caso, adicione o comando export ao arquivo .bashrc
para o(a) usuário(a) e root
. Adicionalmente, algumas
distribuições usam um teste "if" e não executam as instruções
do .bashrc
restantes para uma
invocação não interativa do bash. Certifique-se de colocar o
comando export antes do teste para uso não interativo.
Agora que um sistema de arquivos tenha sido criado, a partição
precisa ser montada, de forma que o sistema anfitrião consiga
acessá-la. Este livro presume que o sistema de arquivos esteja
montado no diretório especificado pela variável de ambiente
LFS
descrita na seção anterior.
Estritamente falando, ninguém consegue “montar uma partição”. A pessoa monta o sistema de arquivos embutido naquela partição. Porém, dado que uma partição não pode conter mais que um sistema de arquivos, as pessoas frequentemente falam da partição e do sistema de arquivos associado como se fossem um e o mesmo.
Crie o ponto de montagem e monte o sistema de arquivos do LFS com estes comandos:
mkdir -pv $LFS
mount -v -t ext4 /dev/<xxx>
$LFS
Substitua <xxx>
pelo nome da partição do LFS.
Se estiver usando múltiplas partições para o LFS (por exemplo,
uma para /
e outra para
/home
), [então] monte-as como
isto:
mkdir -pv $LFS mount -v -t ext4 /dev/<xxx>
$LFS mkdir -v $LFS/home mount -v -t ext4 /dev/<yyy>
$LFS/home
Substitua <xxx>
e <yyy>
pelos
nomes apropriados das partições.
Assegure-se de que essa nova partição não esteja montada com
permissões que sejam restritivas demais (tais como as opções
nosuid
ou nodev
). Execute o comando mount sem quaisquer
parâmetros para ver quais opções estão configuradas para a
partição do LFS montada. Se nosuid
e (ou) nodev
estiverem
configuradas, [então] a partição precisa ser remontada.
As instruções acima assumem que você não estará reiniciando
seu computador no decorrer do processo do LFS. Se você
desligar seu sistema, [então] você ou precisará remontar a
partição do LFS a cada vez que você reiniciar o processo de
construção, ou modificar o arquivo /etc/fstab
do sistema anfitrião para
remontá-la automaticamente quando você reinicializar. Por
exemplo, você poderia acrescentar esta linha ao seu arquivo
/etc/fstab
:
/dev/<xxx>
/mnt/lfs ext4 defaults 1 1
Se você usar partições adicionais opcionais, [então] certifique-se de acrescentá-las também.
Se você estiver usando uma partição swap
, [então] assegure-se de que ela está
habilitada usando o comando swapon:
/sbin/swapon -v /dev/<zzz>
Substitua <zzz>
pelo nome da partição swap
.
Agora que a nova partição do LFS está aberta para negócios, é tempo de baixar os pacotes.
Este capítulo inclui uma lista de pacotes que precisam ser baixados para a finalidade de construir um sistema Linux básico. Os números de versão listados correspondem a versões dos aplicativos que são conhecidos por funcionar e este livro é baseado no uso deles. Nós recomendamos veementemente contra o uso de versões diferentes, pois os comandos de construção para uma versão possivelmente não funcionem com uma versão diferente, a menos que a versão diferente seja especificada por uma errata do LFS ou conselho de segurança. As versões mais novas de pacote possivelmente também tenham problemas que exijam contornos. Esses contornos serão desenvolvidos e estabilizados na versão de desenvolvimento do livro.
Para alguns pacotes, o tarball de lançamento e o tarball instantâneo de repositório (Git ou SVN) para aquele lançamento possivelmente seja publicado com nomes de arquivo semelhantes. Um tarball de lançamento contém arquivos generalizados (por exemplo, um script configure gerado pelo autoconf), em adição ao conteúdo do correspondente instantâneo de repositório. O livro usa tarballs de lançamento sempre que possível. Usar um instantâneo de repositório em vez de um tarball de lançamento especificado pelo livro causará problemas.
Os locais das transferências possivelmente não estejam sempre acessíveis. Se um local de transferência tiver mudado desde quando este livro foi publicado, [então] o Google (http://www.google.com/) fornece um motor de busca útil para a maioria dos pacotes. Se essa busca for mal sucedida, [então] tente um dos meios alternativos de transferência em https://www.linuxfromscratch.org/lfs/mirrors.html#files.
Os pacotes e os remendos baixados precisarão ser armazenados em
algum lugar que esteja convenientemente disponível durante a
construção inteira. Um diretório de trabalho também é exigido
para desempacotar os fontes e construí-los. $LFS/sources
pode ser usado, tanto como o
lugar para armazenar os tarballs e os remendos, quanto como um
diretório de trabalho. Usando esse diretório, os elementos
exigidos estarão localizados na partição do LFS e estarão
disponíveis durante todos os estágios do processo de
construção.
Para criar esse diretório, execute o seguinte comando, como
usuária(o) root
, antes de
começar a sessão de transferência:
mkdir -v $LFS/sources
Torne esse diretório gravável e "sticky". “Sticky” significa que, mesmo se múltiplas(os) usuárias(os) tenham permissão de escrita, só a(o) dona(o) de um arquivo pode deletar o arquivo dentro de um diretório sticky. O seguinte comando habilitará os modos escrita e sticky:
chmod -v a+wt $LFS/sources
Existem muitas maneiras para obter todos os pacotes e remendos necessários para construir o LFS:
Os arquivos podem ser transferidos individualmente conforme descrito nas próximas duas seções.
Para versões estáveis do livro, um tarball de todos os arquivos necessários pode ser transferido a partir de um dos sítios espelhos listados em https://www.linuxfromscratch.org/mirrors.html#files.
Os arquivos podem ser transferidos usando o wget e uma lista wget conforme descrito abaixo.
Para transferir todos os pacotes e os remendos usando a wget-list-systemd como uma entrada gerada para o comando wget, use:
wget --input-file=wget-list-systemd --continue --directory-prefix=$LFS/sources
Adicionalmente, começando com o LFS-7.0, existe um arquivo
separado, md5sums, que
pode ser usado para verificar se todos os pacotes corretos
estão disponíveis antes de prosseguir. Coloque aquele arquivo
em $LFS/sources
e execute:
pushd $LFS/sources md5sum -c md5sums popd
Essa verificação pode ser usada após recuperar os arquivos necessários com qualquer dos métodos listados acima.
Se os pacotes e os remendos forem transferidos como um(a)
usuário(a) não root
, [então]
esses arquivos serão de propriedade do(a) usuário(a). O sistema
de arquivos registra o(a) proprietário(a) pelo UID dele(a) e o
UID de um(a) usuário(a) normal na distribuição anfitriã não é
atribuído no LFS. Assim, os arquivos serão deixados de
propriedade de um UID sem nome no sistema LFS final. Se você
não atribuirá o mesmo UID para o(a) seu(ua) usuário(a) no
sistema LFS, [então] mude os proprietários(as) desses arquivos
para root
agora para evitar
esse problema:
chown root:root $LFS/sources/*
Leia os avisos de segurança antes de transferir os pacotes para descobrir se uma versão mais nova de qualquer pacote deveria ser usada para evitar vulnerabilidades de segurança.
Os fontes do(a) desenvolvedor(a) possivelmente removam lançamentos antigos, especialmente quando esses lançamentos contenham uma vulnerabilidade de segurança. Se um URL abaixo não estiver alcançável, [então] você deveria ler os avisos de segurança primeiro para descobrir se uma versão mais nova (com a vulnerabilidade consertada) deveria ser usada. Se não, [então] tente transferir o pacote removido a partir de um espelho. Apesar de ser possível transferir um lançamento antigo a partir de um espelho, mesmo se esse lançamento tiver sido removido por causa de uma vulnerabilidade, não é uma boa ideia usar um lançamento conhecido por ser vulnerável quando da construção do seu sistema.
Transfira ou de outra forma obtenha os seguintes pacotes:
Página inicial: https://savannah.nongnu.org/projects/acl
Transferência: https://download.savannah.gnu.org/releases/acl/acl-2.3.2.tar.xz
Soma de verificação MD5: 590765dee95907dbc3c856f7255bd669
Página inicial: https://savannah.nongnu.org/projects/attr
Transferência: https://download.savannah.gnu.org/releases/attr/attr-2.5.2.tar.gz
Soma de verificação MD5: 227043ec2f6ca03c0948df5517f9c927
Página inicial: https://www.gnu.org/software/autoconf/
Transferência: https://ftp.gnu.org/gnu/autoconf/autoconf-2.72.tar.xz
Soma de verificação MD5: 1be79f7106ab6767f18391c5e22be701
Página inicial: https://www.gnu.org/software/automake/
Transferência: https://ftp.gnu.org/gnu/automake/automake-1.17.tar.xz
Soma de verificação MD5: 7ab3a02318fee6f5bd42adfc369abf10
Página inicial: https://www.gnu.org/software/bash/
Transferência: https://ftp.gnu.org/gnu/bash/bash-5.2.32.tar.gz
Soma de verificação MD5: f204835b2e06c06e37b5ad776ff907f4
Página inicial: https://git.gavinhoward.com/gavin/bc
Transferência: https://github.com/gavinhoward/bc/releases/download/6.7.6/bc-6.7.6.tar.xz
Soma de verificação MD5: a47aa5e4e7395fbcd159a9228613b97b
Página inicial: https://www.gnu.org/software/binutils/
Transferência: https://sourceware.org/pub/binutils/releases/binutils-2.43.1.tar.xz
Soma de verificação MD5: 9202d02925c30969d1917e4bad5a2320
Página inicial: https://www.gnu.org/software/bison/
Transferência: https://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.xz
Soma de verificação MD5: c28f119f405a2304ff0a7ccdcc629713
Transferência: https://www.sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz
Soma de verificação MD5: 67e051268d0c475ea773822f7500d0e5
Página inicial: https://libcheck.github.io/check
Transferência: https://github.com/libcheck/check/releases/download/0.15.2/check-0.15.2.tar.gz
Soma de verificação MD5: 50fcafcecde5a380415b12e9c574e0b2
Página inicial: https://www.gnu.org/software/coreutils/
Transferência: https://ftp.gnu.org/gnu/coreutils/coreutils-9.5.tar.xz
Soma de verificação MD5: e99adfa059a63db3503cc71f3d151e31
Página inicial: https://www.freedesktop.org/wiki/Software/dbus
Transferência: https://dbus.freedesktop.org/releases/dbus/dbus-1.14.10.tar.xz
Soma de verificação MD5: 46070a3487817ff690981f8cd2ba9376
Página inicial: https://www.gnu.org/software/dejagnu/
Transferência: https://ftp.gnu.org/gnu/dejagnu/dejagnu-1.6.3.tar.gz
Soma de verificação MD5: 68c5208c58236eba447d7d6d1326b821
Página inicial: https://www.gnu.org/software/diffutils/
Transferência: https://ftp.gnu.org/gnu/diffutils/diffutils-3.10.tar.xz
Soma de verificação MD5: 2745c50f6f4e395e7b7d52f902d075bf
Página inicial: https://e2fsprogs.sourceforge.net/
Transferência: https://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.47.1/e2fsprogs-1.47.1.tar.gz
Soma de verificação MD5: 75e6d1353cbe6d5728a98fb0267206cb
Página inicial: https://sourceware.org/elfutils/
Transferência: https://sourceware.org/ftp/elfutils/0.191/elfutils-0.191.tar.bz2
Soma de verificação MD5: 636547248fb3fae58ec48030298d3ef7
Página inicial: https://libexpat.github.io/
Transferência: https://prdownloads.sourceforge.net/expat/expat-2.6.2.tar.xz
Soma de verificação MD5: 0cb75c8feb842c0794ba89666b762a2d
Página inicial: https://core.tcl.tk/expect/
Transferência: https://prdownloads.sourceforge.net/expect/expect5.45.4.tar.gz
Soma de verificação MD5: 00fce8de158422f5ccd2666512329bd2
Página inicial: https://www.darwinsys.com/file/
Transferência: https://astron.com/pub/file/file-5.45.tar.gz
Soma de verificação MD5: 26b2a96d4e3a8938827a1e572afd527a
Página inicial: https://www.gnu.org/software/findutils/
Transferência: https://ftp.gnu.org/gnu/findutils/findutils-4.10.0.tar.xz
Soma de verificação MD5: 870cfd71c07d37ebe56f9f4aaf4ad872
Página inicial: https://github.com/westes/flex
Transferência: https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz
Soma de verificação MD5: 2882e3179748cc9f9c23ec593d6adc8d
Página inicial: https://pypi.org/project/flit-core/
Transferência: https://pypi.org/packages/source/f/flit-core/flit_core-3.9.0.tar.gz
Soma de verificação MD5: 3bc52f1952b9a78361114147da63c35b
Página inicial: https://www.gnu.org/software/gawk/
Transferência: https://ftp.gnu.org/gnu/gawk/gawk-5.3.0.tar.xz
Soma de verificação MD5: 97c5a7d83f91a7e1b2035ebbe6ac7abd
Página inicial: https://gcc.gnu.org/
Transferência: https://ftp.gnu.org/gnu/gcc/gcc-14.2.0/gcc-14.2.0.tar.xz
Soma de verificação MD5: 2268420ba02dc01821960e274711bde0
Página inicial: https://www.gnu.org/software/gdbm/
Transferência: https://ftp.gnu.org/gnu/gdbm/gdbm-1.24.tar.gz
Soma de verificação MD5: c780815649e52317be48331c1773e987
Página inicial: https://www.gnu.org/software/gettext/
Transferência: https://ftp.gnu.org/gnu/gettext/gettext-0.22.5.tar.xz
Soma de verificação MD5: 3ae5580599d84be93e6213930facb2db
Página inicial: https://www.gnu.org/software/libc/
Transferência: https://ftp.gnu.org/gnu/glibc/glibc-2.40.tar.xz
Soma de verificação MD5: b390feef233022114950317f10c4fa97
Os(As) desenvolvedores(as) da Glibc mantém uma ramificação Git contendo remendos considerados valiosos para a Glibc-2.40, porém infelizmente desenvolvidos depois do lançamento da Glibc-2.40. Os(As) editores(as) do LFS emitirão um aviso de segurança se alguma correção de segurança for acrescentada na ramificação, porém nenhuma ação será tomada para outros remendos acrescentados recentemente. Você possivelmente reveja os remendos você mesmo(a) e incorpore alguns remendos se você os considerar importantes.
Página inicial: https://www.gnu.org/software/gmp/
Transferência: https://ftp.gnu.org/gnu/gmp/gmp-6.3.0.tar.xz
Soma de verificação MD5: 956dc04e864001a9c22429f761f2c283
Página inicial: https://www.gnu.org/software/gperf/
Transferência: https://ftp.gnu.org/gnu/gperf/gperf-3.1.tar.gz
Soma de verificação MD5: 9e251c0a618ad0824b51117d5d9db87e
Página inicial: https://www.gnu.org/software/grep/
Transferência: https://ftp.gnu.org/gnu/grep/grep-3.11.tar.xz
Soma de verificação MD5: 7c9bbd74492131245f7cdb291fa142c0
Página inicial: https://www.gnu.org/software/groff/
Transferência: https://ftp.gnu.org/gnu/groff/groff-1.23.0.tar.gz
Soma de verificação MD5: 5e4f40315a22bb8a158748e7d5094c7d
Página inicial: https://www.gnu.org/software/grub/
Transferência: https://ftp.gnu.org/gnu/grub/grub-2.12.tar.xz
Soma de verificação MD5: 60c564b1bdc39d8e43b3aab4bc0fb140
Página inicial: https://www.gnu.org/software/gzip/
Transferência: https://ftp.gnu.org/gnu/gzip/gzip-1.13.tar.xz
Soma de verificação MD5: d5c9fc9441288817a4a0be2da0249e29
Página inicial: https://www.iana.org/protocols
Transferência: https://github.com/Mic92/iana-etc/releases/download/20240806/iana-etc-20240806.tar.gz
Soma de verificação MD5: ea3c37c00d22f1159fc3b7d988de8476
Página inicial: https://www.gnu.org/software/inetutils/
Transferência: https://ftp.gnu.org/gnu/inetutils/inetutils-2.5.tar.xz
Soma de verificação MD5: 9e5a6dfd2d794dc056a770e8ad4a9263
Página inicial: https://freedesktop.org/wiki/Software/intltool
Transferência: https://launchpad.net/intltool/trunk/0.51.0/+download/intltool-0.51.0.tar.gz
Soma de verificação MD5: 12e517cac2b57a0121cda351570f1e63
Página inicial: https://www.kernel.org/pub/linux/utils/net/iproute2/
Transferência: https://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-6.10.0.tar.xz
Soma de verificação MD5: 6282e47de9c5b230e83537fba7181c9c
Página inicial: https://jinja.palletsprojects.com/en/3.1.x/
Transferência: https://pypi.org/packages/source/J/Jinja2/jinja2-3.1.4.tar.gz
Soma de verificação MD5: 02ca9a6364c92e83d14b037bef4732bc
Página inicial: https://kbd-project.org/
Transferência: https://www.kernel.org/pub/linux/utils/kbd/kbd-2.6.4.tar.xz
Soma de verificação MD5: e2fd7adccf6b1e98eb1ae8d5a1ce5762
Página inicial: https://github.com/kmod-project/kmod
Transferência: https://www.kernel.org/pub/linux/utils/kernel/kmod/kmod-33.tar.xz
Soma de verificação MD5: c451c4aa61521adbe8af147f498046f8
Página inicial: https://www.greenwoodsoftware.com/less/
Transferência: https://www.greenwoodsoftware.com/less/less-661.tar.gz
Soma de verificação MD5: 44f54b6313c5d71fa1ac224d8d84766a
Página inicial: https://sites.google.com/site/fullycapable/
Transferência: https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.70.tar.xz
Soma de verificação MD5: df0e20c6eeca849347b87d5d6a8870c0
Página inicial: https://sourceware.org/libffi/
Transferência: https://github.com/libffi/libffi/releases/download/v3.4.6/libffi-3.4.6.tar.gz
Soma de verificação MD5: b9cac6c5997dca2b3787a59ede34e0eb
Página inicial: https://libpipeline.nongnu.org/
Transferência: https://download.savannah.gnu.org/releases/libpipeline/libpipeline-1.5.7.tar.gz
Soma de verificação MD5: 1a48b5771b9f6c790fb4efdb1ac71342
Página inicial: https://www.gnu.org/software/libtool/
Transferência: https://ftp.gnu.org/gnu/libtool/libtool-2.4.7.tar.xz
Soma de verificação MD5: 2fc0b6ddcd66a89ed6e45db28fa44232
Página inicial: https://github.com/besser82/libxcrypt/
Transferência: https://github.com/besser82/libxcrypt/releases/download/v4.4.36/libxcrypt-4.4.36.tar.xz
Soma de verificação MD5: b84cd4104e08c975063ec6c4d0372446
Página inicial: https://www.kernel.org/
Transferência: https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.10.5.tar.xz
Soma de verificação MD5: 276ef1f11ed3713ec5d6f506ff55ac12
O kernel do Linux é atualizado com bastante frequência, muitas vezes devido a descobertas de vulnerabilidades de segurança. A mais recente versão estável do kernel disponível pode ser usada, a menos que a página da errata diga o contrário.
Para usuários(as) com largura de banda de velocidade limitada ou cara que desejem atualizar o kernel Linux, uma versão da linha base do pacote e dos remendos pode ser transferida separadamente. Isso possivelmente economize algum tempo ou custo para uma posterior atualização de nível de remendo contendo um lançamento menor.
Página inicial: https://lz4.org/
Transferência: https://github.com/lz4/lz4/releases/download/v1.10.0/lz4-1.10.0.tar.gz
Soma de verificação MD5: dead9f5f1966d9ae56e1e32761e4e675
Página inicial: https://www.gnu.org/software/m4/
Transferência: https://ftp.gnu.org/gnu/m4/m4-1.4.19.tar.xz
Soma de verificação MD5: 0d90823e1426f1da2fd872df0311298d
Página inicial: https://www.gnu.org/software/make/
Transferência: https://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz
Soma de verificação MD5: c8469a3713cbbe04d955d4ae4be23eeb
Página inicial: https://www.nongnu.org/man-db/
Transferência: https://download.savannah.gnu.org/releases/man-db/man-db-2.12.1.tar.xz
Soma de verificação MD5: 7b044e5020aab89db41ac7ee59d6d84a
Página inicial: https://www.kernel.org/doc/man-pages/
Transferência: https://www.kernel.org/pub/linux/docs/man-pages/man-pages-6.9.1.tar.xz
Soma de verificação MD5: 4d56775b6cce4edf1e496249e7c01c1a
Página inicial: https://palletsprojects.com/p/markupsafe/
Transferência: https://pypi.org/packages/source/M/MarkupSafe/MarkupSafe-2.1.5.tar.gz
Soma de verificação MD5: 8fe7227653f2fb9b1ffe7f9f2058998a
Página inicial: https://mesonbuild.com
Transferência: https://github.com/mesonbuild/meson/releases/download/1.5.1/meson-1.5.1.tar.gz
Soma de verificação MD5: c4f2b3e5ea632685f61ba1b833c4905c
Página inicial: https://www.multiprecision.org/
Transferência: https://ftp.gnu.org/gnu/mpc/mpc-1.3.1.tar.gz
Soma de verificação MD5: 5c9bc658c9fd0f940e8e3e0f09530c62
Página inicial: https://www.mpfr.org/
Transferência: https://ftp.gnu.org/gnu/mpfr/mpfr-4.2.1.tar.xz
Soma de verificação MD5: 523c50c6318dde6f9dc523bc0244690a
Página inicial: https://www.gnu.org/software/ncurses/
Transferência: https://invisible-mirror.net/archives/ncurses/ncurses-6.5.tar.gz
Soma de verificação MD5: ac2d2629296f04c8537ca706b6977687
Página inicial: https://ninja-build.org/
Transferência: https://github.com/ninja-build/ninja/archive/v1.12.1/ninja-1.12.1.tar.gz
Soma de verificação MD5: 6288992b05e593a391599692e2f7e490
Página inicial: https://www.openssl.org/
Transferência: https://www.openssl.org/source/openssl-3.3.1.tar.gz
Soma de verificação MD5: 8a4342b399c18f870ca6186299195984
Página inicial: https://savannah.gnu.org/projects/patch/
Transferência: https://ftp.gnu.org/gnu/patch/patch-2.7.6.tar.xz
Soma de verificação MD5: 78ad9937e4caadcba1526ef1853730d5
Página inicial: https://www.perl.org/
Transferência: https://www.cpan.org/src/5.0/perl-5.40.0.tar.xz
Soma de verificação MD5: cfe14ef0709b9687f9c514042e8e1e82
Página inicial: https://github.com/pkgconf/pkgconf
Transferência: https://distfiles.ariadne.space/pkgconf/pkgconf-2.3.0.tar.xz
Soma de verificação MD5: 833363e77b5bed0131c7bc4cc6f7747b
Página inicial: https://gitlab.com/procps-ng/procps/
Transferência: https://sourceforge.net/projects/procps-ng/files/Production/procps-ng-4.0.4.tar.xz
Soma de verificação MD5: 2f747fc7df8ccf402d03e375c565cf96
Página inicial: https://gitlab.com/psmisc/psmisc
Transferência: https://sourceforge.net/projects/psmisc/files/psmisc/psmisc-23.7.tar.xz
Soma de verificação MD5: 53eae841735189a896d614cba440eb10
Página inicial: https://www.python.org/
Transferência: https://www.python.org/ftp/python/3.12.5/Python-3.12.5.tar.xz
Soma de verificação MD5: 02c7d269e077f4034963bba6befdc715
Transferência: https://www.python.org/ftp/python/doc/3.12.5/python-3.12.5-docs-html.tar.bz2
Soma de verificação MD5: 52274d813236ca4a972fb6988480dc56
Página inicial: https://tiswww.case.edu/php/chet/readline/rltop.html
Transferência: https://ftp.gnu.org/gnu/readline/readline-8.2.13.tar.gz
Soma de verificação MD5: 05080bf3801e6874bb115cd6700b708f
Página inicial: https://www.gnu.org/software/sed/
Transferência: https://ftp.gnu.org/gnu/sed/sed-4.9.tar.xz
Soma de verificação MD5: 6aac9b2dbafcd5b7a67a8a9bcb8036c3
Página inicial: https://pypi.org/project/setuptools/
Transferência: https://pypi.org/packages/source/s/setuptools/setuptools-72.2.0.tar.gz
Soma de verificação MD5: 2e0ffd0f6fc632a11442b79d9b1c68bd
Página inicial: https://github.com/shadow-maint/shadow/
Transferência: https://github.com/shadow-maint/shadow/releases/download/4.16.0/shadow-4.16.0.tar.xz
Soma de verificação MD5: eb70bad3316d08f0d3bb3d4bbeccb3b4
Página inicial: https://www.freedesktop.org/wiki/Software/systemd/
Transferência: https://github.com/systemd/systemd/archive/v256.4/systemd-256.4.tar.gz
Soma de verificação MD5: 03bd1ff158ec0bc55428c77a8f8495bd
Página inicial: https://www.freedesktop.org/wiki/Software/systemd/
Transferência: https://anduin.linuxfromscratch.org/LFS/systemd-man-pages-256.4.tar.xz
Soma de verificação MD5: 8dbcf0ff0d8e5e9d3565f9d2fc153310
A equipe do Linux From Scratch gera o próprio tarball dela das páginas de manual usando o fonte do systemd. Isso é feito com a finalidade de evitar dependências desnecessárias.
Página inicial: https://www.gnu.org/software/tar/
Transferência: https://ftp.gnu.org/gnu/tar/tar-1.35.tar.xz
Soma de verificação MD5: a2d8042658cfd8ea939e6d911eaf4152
Página inicial: https://tcl.sourceforge.net/
Transferência: https://downloads.sourceforge.net/tcl/tcl8.6.14-src.tar.gz
Soma de verificação MD5: c30b57c6051be28fa928d09aca82841e
Transferência: https://downloads.sourceforge.net/tcl/tcl8.6.14-html.tar.gz
Soma de verificação MD5: 5467198f8d57c54835bf80b98ffb0170
Página inicial: https://www.gnu.org/software/texinfo/
Transferência: https://ftp.gnu.org/gnu/texinfo/texinfo-7.1.tar.xz
Soma de verificação MD5: edd9928b4a3f82674bcc3551616eef3b
Página inicial: https://www.iana.org/time-zones
Transferência: https://www.iana.org/time-zones/repository/releases/tzdata2024a.tar.gz
Soma de verificação MD5: 2349edd8335245525cc082f2755d5bf4
Página inicial: https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git/
Transferência: https://www.kernel.org/pub/linux/utils/util-linux/v2.40/util-linux-2.40.2.tar.xz
Soma de verificação MD5: 88faefc8fefced097e58142077a3d14e
Página inicial: https://www.vim.org
Transferência: https://github.com/vim/vim/archive/v9.1.0660/vim-9.1.0660.tar.gz
Soma de verificação MD5: c512a99b3704f193be1a181cc644b2b2
A versão do vim muda diariamente. Para obter a versão mais recente, vá até https://github.com/vim/vim/tags.
Página inicial: https://pypi.org/project/wheel/
Transferência: https://pypi.org/packages/source/w/wheel/wheel-0.44.0.tar.gz
Soma de verificação MD5: 440ff4fe51579b7ed16f02af8f8d9494
Página inicial: https://github.com/chorny/XML-Parser
Transferência: https://cpan.metacpan.org/authors/id/T/TO/TODDR/XML-Parser-2.47.tar.gz
Soma de verificação MD5: 89a8e82cfd2ad948b349c0a69c494463
Página inicial: https://tukaani.org/xz
Transferência: https://github.com//tukaani-project/xz/releases/download/v5.6.2/xz-5.6.2.tar.xz
Soma de verificação MD5: bbf73fb28425cebb854328599f85c4cf
Página inicial: https://zlib.net/
Transferência: https://zlib.net/fossils/zlib-1.3.1.tar.gz
Soma de verificação MD5: 9855b6d802d7fe5b7bd5b196a2271655
Página inicial: https://facebook.github.io/zstd/
Transferência: https://github.com/facebook/zstd/releases/download/v1.5.6/zstd-1.5.6.tar.gz
Soma de verificação MD5: 5a473726b3445d0e5d6296afd1ab6854
Tamanho total desses pacotes: cerca de NaN Mo
Adicionalmente aos pacotes, vários remendos também são exigidos. Esses remendos corrigem alguns erros nos pacotes que deveriam ser consertados pelo(a) Mantenedor(a). Os remendos também fazem pequenas modificações para tornar os pacotes mais fáceis de se trabalhar. Os seguintes remendos serão necessários para construir um sistema LFS:
Transferência: https://www.linuxfromscratch.org/patches/lfs/12.2/bzip2-1.0.8-install_docs-1.patch
Soma de verificação MD5: 6a5ac7e89b791aae556de0f745916f7f
Transferência: https://www.linuxfromscratch.org/patches/lfs/12.2/coreutils-9.5-i18n-2.patch
Soma de verificação MD5: 58961caf5bbdb02462591fa506c73b6d
Transferência: https://www.linuxfromscratch.org/patches/lfs/12.2/expect-5.45.4-gcc14-1.patch
Soma de verificação MD5: 0b8b5ac411d011263ad40b0664c669f0
Transferência: https://www.linuxfromscratch.org/patches/lfs/12.2/glibc-2.40-fhs-1.patch
Soma de verificação MD5: 9a5997c3452909b1769918c759eff8a2
Transferência: https://www.linuxfromscratch.org/patches/lfs/12.2/kbd-2.6.4-backspace-1.patch
Soma de verificação MD5: f75cca16a38da6caa7d52151f7136895
Tamanho total desses remendos: cerca de NaN Mo
Adicionalmente aos remendos exigidos acima, existe um número de remendos opcionais criados pela comunidade do LFS. Esses remendos opcionais solucionam problemas menores ou habilitam funcionalidade que não está habilitada por padrão. Sinta-se à vontade para examinar a base de dados dos remendos localizada em https://www.linuxfromscratch.org/patches/downloads/ e adquirir quaisquer remendos adicionais para atender às necessidades do seu sistema.
Neste capítulo, nós realizaremos umas poucas tarefas adicionais
para preparar para a construção do sistema temporário. Nós
criaremos um conjunto de diretórios em $LFS
(no qual instalaremos as ferramentas
temporárias); adicionaremos uma(m) usuária(o)
desprivilegiada(o); e criaremos um ambiente apropriado de
construção para aquela(e) usuária(o). Nós também explicaremos
as unidades de tempo “UPCs” que usamos para medir quanto tempo
leva para construir od pacotes do LFS e forneceremos alguma
informação acerca de suítes de teste de pacote.
Nesta seção, nós começamos povoando o sistema de arquivos do LFS com os lugares que constituirão o sistema Linux final. O primeiro passo é o de criar uma hierarquia limitada de diretório, de forma que os aplicativos compilados no Capítulo 6 (bem como a glibc e a libstdc++ no Capítulo 5) possam ser instalados no local final deles. Nós fazemos isso, de forma que aqueles aplicativos temporários sejam sobrescritos quando as versões finais sejam reconstruídas no Capítulo 8.
Crie o layout exigido de diretório emitindo os seguintes
comandos como root
:
mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin} for i in bin lib sbin; do ln -sv usr/$i $LFS/$i done case $(uname -m) in x86_64) mkdir -pv $LFS/lib64 ;; esac
Os aplicativos no Capítulo 6
serão compilados com um compilador cruzado (mais detalhes podem
ser encontrados na seção Observações
Técnicas do Conjunto de Ferramentas). Esse compilador
cruzado será instalado em um diretório especial, para separá-lo
de outros aplicativos. Ainda atuando como root
, crie esse diretório com este comando:
mkdir -pv $LFS/tools
Os(As) editores(as) do LFS deliberadamente decidiram não usar
um diretório /usr/lib64
. Vários
passos são tomados para se ter certeza de que o conjunto de
ferramentas não o usará. Se por qualquer razão esse diretório
aparecer (seja porque você cometeu um erro ao seguir as
instruções, seja porque você instalou um pacote binário que o
criou depois de finalizar o LFS), [então} possivelmente
quebre o seu sistema. Você deveria sempre ter certeza de que
esse diretório não existe.
Enquanto logada(o) como usuária(o) root
, cometer um simples erro pode
danificar ou destruir um sistema. Portanto, os pacotes nos
próximos dois capítulos são construídos como uma(m) usuária(o)
sem privilégios. Você poderia usar seu próprio nome de
usuária(o), mas para tornar mais fácil configurar um ambiente
de trabalho limpo, nós criaremos um(a) usuário(a) novo(a)
chamado(a) lfs
como um(a)
membro(a) de um novo grupo (também chamado lfs
) e executar comandos como lfs
durante o processo de instalação. Como
root
, emita os seguintes
comandos para adicionar a(o) novo(a) usuário(a):
groupadd lfs useradd -s /bin/bash -g lfs -m -k /dev/null lfs
Isto é o que as opções da linha de comando significam:
-s
/bin/bash
Isso torna o bash o shell padrão
para o(a) usuário(a) lfs
.
-g
lfs
Essa opção acrescenta o(a) usuário(a) lfs
ao grupo lfs
.
-m
Isso cria um diretório home para lfs
.
-k
/dev/null
Esse parâmetro evita possível cópia de arquivos a partir
de um diretório esqueleto (o padrão é /etc/skel
) mudando o local da entrada
gerada para o dispositivo especial null.
lfs
Esse é o nome do(a) usuário(a) nova(o).
Se quiser logar como lfs
ou
alternar para lfs
a partir de
um(a) usuário(a) não root
(em
oposição a alternar para o(a) usuário(a) lfs
quando estiver logado(a) como
root
, o que não exige que o(a)
usuário(a) lfs
tenha uma
senha), [então] você precisa configurar uma senha para
lfs
. Emita o seguinte comando
como o(a) usuário(a) root
para
configurar a senha:
passwd lfs
Conceda a lfs
acesso total a
todos os diretórios sob $LFS
tornando lfs
a(o) dona(o) do
diretório:
chown -v lfs $LFS/{usr{,/*},lib,var,etc,bin,sbin,tools} case $(uname -m) in x86_64) chown -v lfs $LFS/lib64 ;; esac
Em alguns sistemas anfitriões, o seguinte comando
su não completa
adequadamente e suspende o login para o(a) usuário(a)
lfs
para o segundo plano. Se
o prompt "lfs:~$" não aparecer imediatamente, [então] emitir
o comando fg
corrigirá o problema.
Em seguida, inicie um shell executando como usuária(o)
lfs
. Isso pode ser feito
logando-se como lfs
em um
console virtual ou com o seguinte comando de
substituir/alternar usuária(o):
su - lfs
O “-
” instrui
"su" a iniciar um
"shell" de "login" em vez de um "shell" de não "login". A
diferença entre esses dois tipos de "shells" está descrita em
detalhes em "bash(1)" e
"info bash".
Configure um bom ambiente de trabalho criando dois novos
arquivos de inicialização para o shell bash. Enquanto logada(o) como
usuária(o) lfs
, emita o
seguinte comando para criar um novo .bash_profile
:
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
Enquanto logada(o) como usuária(o) lfs
ou quando alternado para o(a)
usuário(a) lfs
usando um
comando su com a
opção “-
”, o shell inicial
é um shell de login que
lê o /etc/profile
do anfitrião
(provavelmente contendo algumas configurações e variáveis de
ambiente) e então .bash_profile
.
O comando exec env
-i.../bin/bash no arquivo .bash_profile
substitui o shell em execução
por um novo com um ambiente completamente vazio, exceto pelas
variáveis HOME
, TERM
e PS1
. Isso
garante que nenhuma variável de ambiente indesejada e
potencialmente danosa oriunda do sistema anfitrião vaze para o
ambiente de construção.
A nova instância do shell é um shell de não-login, que não lê, e executa, o
conteúdo dos arquivos /etc/profile
ou .bash_profile
, porém, ao invés, lê, e
executa, o arquivo .bashrc
. Crie
o arquivo .bashrc
agora:
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/usr/bin
if [ ! -L /bin ]; then PATH=/bin:$PATH; fi
PATH=$LFS/tools/bin:$PATH
CONFIG_SITE=$LFS/usr/share/config.site
export LFS LC_ALL LFS_TGT PATH CONFIG_SITE
EOF
O significado das configurações em .bashrc
set
+h
O comando set
+h desliga a função hash do bash. “Hashing”
geralmente é uma característica útil—bash usa uma tabela
hash para lembrar o caminho completo para arquivos
executáveis para evitar procurar o PATH
várias vezes para encontrar o mesmo
executável. Entretanto, as novas ferramentas deveriam ser
usadas tão logo sejam instaladas. Alternando para
desligada a função hash força o shell a procurar no
PATH
sempre que um aplicativo
estiver para ser executado. Dessa forma, o shell
encontrará as ferramentas recém compiladas em
$LFS/tools/bin
tão logo
elas estejam disponíveis sem lembrar da versão anterior
do mesmo aplicativo fornecida pela distribuição anfitriã,
em /usr/bin
ou /bin
.
umask
022
Configurar a máscara de criação de arquivos do(a) usuário(a) ("umask") para "022" garante que recém criados arquivos e diretórios sejam escrevíveis somente pelos(as) donos(as) deles, mas sejam legíveis e executáveis por qualquer pessoa (assumindo que os modos padrão sejam usados pela chamada de sistema "open(2)", novos arquivos terminarão com modo de permissão "644" e diretórios com modo "755").
LFS=/mnt/lfs
A variável LFS
deveria ser
configurada para o ponto de montagem escolhido.
LC_ALL=POSIX
A variável LC_ALL
controla a
localização de certos aplicativos, fazendo suas mensagens
seguirem as convenções de um país especificado.
Configurar LC_ALL
para
“POSIX” ou “C” (as duas
são equivalentes) garante que tudo vai funcionar como
esperado no ambiente de compilação cruzada.
LFS_TGT=$(uname
-m)-lfs-linux-gnu
A variável LFS_TGT
configura
uma não padrão, porém compatível descrição de máquina
para uso quando da construção do nosso compilador cruzado
e vinculador e quando da compilação cruzada do nosso
conjunto de ferramentas temporárias. Mais informação é
fornecida pelas Observações
Técnicas do Conjunto de Ferramentas.
PATH=/usr/bin
Muitas distribuições modernas do Linux mesclaram
/bin
e /usr/bin
. Quando esse for o caso, a
variável PATH
padrão deveria
ser configurada para /usr/bin/
para o ambiente do
Capítulo 6. Quando esse não for o caso, a
seguinte linha acrescenta /bin
ao caminho.
if [ ! -L
/bin ]; then PATH=/bin:$PATH; fi
Se /bin
não for um link
simbólico, [então] ele precisa ser acrescentado à
variável PATH
.
PATH=$LFS/tools/bin:$PATH
Ao se colocar $LFS/tools/bin
a frente do PATH
padrão, o compilador cruzado
instalado no início do
Capítulo 5 é pego pelo shell imediatamente
depois da instalação dele. Isso, combinado com a
desativação do hashing, limita o risco de que o
compilador originário do anfitrião seja usado em vez do
compilador cruzado.
CONFIG_SITE=$LFS/usr/share/config.site
No
Capítulo 5 e no
Capítulo 6, se essa variável não estiver
configurada, [então] os scripts configure possivelmente
tentem carregar itens de configuração específicos para
algumas distribuições a partir de /usr/share/config.site
no sistema
anfitrião. Substitua-o para evitar uma potencial
contaminação oriunda do anfitrião.
export
...
Ao tempo que os comandos precedentes tenham configurado algumas variáveis, com a finalidade de torná-las visíveis dentro de quaisquer sub-shells, nós as exportamos.
Muitas distribuições comerciais acrescentam uma instância não
documentada de /etc/bash.bashrc
à inicialização do bash. Esse arquivo tem o
potencial de modificar o ambiente do(a) usuário(a)
lfs
de formas que podem
afetar a construção de pacotes LFS críticos. Para assegurar
que o ambiente do(a) usuário(a) lfs
esteja limpo, verifique a presença de
/etc/bash.bashrc
e, se
presente, mova-o para fora do caminho. Como o(a) usuário(a)
root
, execute:
[ ! -e /etc/bash.bashrc ] || mv -v /etc/bash.bashrc /etc/bash.bashrc.NOUSE
Quando o(a) usuário(a) lfs
não mais for necessária(o) (no início do
Capítulo 7), você pode seguramente restaurar
/etc/bash.bashrc
(se desejado).
Perceba que o pacote Bash do LFS que nós construiremos na
Seção 8.36, “Bash-5.2.32” não é
configurado para carregar ou para executar /etc/bash.bashrc
, de modo que esse arquivo
é inútil em um sistema LFS finalizado.
Para muitos sistemas modernos com múltiplos processadores (ou
núcleos), o tempo de compilação para um pacote pode ser
reduzido executando-se um "make paralelo", informando-se ao
aplicativo "make" quantos processadores estão disponíveis por
meio de uma opção de linha de comando ou de uma variável de
ambiente. Por exemplo, um processador "Intel" "Core i9-13900K"
tem oito (08) núcleos "D" (desempenho) e dezesseis (16) núcleos
"E" (eficiência), e um núcleo "D" consegue executar
simultaneamente duas camadas, de forma que cada núcleo "D" seja
modelado como dois núcleos lógicos pelo núcleo Linux. Como
resultado, existem trinta e dois (32) núcleos lógicos no total.
Uma maneira óbvia de usar todos esses núcleos lógicos é a de
permitir que o "make" gere até trinta e duas
(32) tarefas de construção. Isso pode ser feito passando-se a
opção "-j32
" para o
"make":
make -j32
Ou configure a variável de ambiente "MAKEFLAGS
" e o conteúdo dela será usado
automaticamente por "make" como opções de linha de
comando:
export MAKEFLAGS=-j32
Nunca passe uma opção "-j
" sem um número para
"make" ou
configure tal opção em "MAKEFLAGS
". Fazer isso permitirá que
"make" gere
infinitas tarefas de construção e cause problemas de
estabilidade do sistema.
Para usar todos os núcleos lógicos disponíveis para construir
pacotes em "Capítulo 5"
e "Capítulo 6",
configure "MAKEFLAGS
" agora em
".bashrc
":
cat >> ~/.bashrc << "EOF"
export MAKEFLAGS=-j$(nproc)
EOF
Substitua "$(nproc)
"
pelo número de núcleos lógicos que você deseja usar se não
quiser usar todos os núcleos lógicos.
Finalmente, para garantir que o ambiente esteja totalmente preparado para a construção das ferramentas temporárias, force o shell bash a ler o perfil do(a) novo(a) usuário(a):
source ~/.bash_profile
Muitas pessoas gostariam de saber de antemão aproximadamente quanto tempo leva para compilar e instalar cada pacote. Devido ao Linux From Scratch poder ser construído em muitos sistemas, é impossível fornecer estimativas de tempo absolutas. O maior pacote (gcc) levará aproximadamente cinco (05) minutos nos sistemas mais rápidos, mas poderia levar dias nos sistemas mais lentos! Em vez de fornecer tempos atuais, a medida Unidade Padrão de Construção (UPC) será usada.
A medida UPC funciona como segue. O primeiro pacote a ser compilado é o binutils no Capítulo 5. O tempo necessário para compilar usando um núcleo é o que nós nos referiremos como a Unidade Padrão de Construção ou UPC. Todos os outros tempos de compilação serão expressos relativamente a esse tempo.
Por exemplo, considere um pacote cujo tempo de compilação é de quatro e meio (4,5) UPCs. Isso significa que, se o teu sistema precisou de quatro (04) minutos para compilar e instalar a primeira passagem do binutils, será necessário aproximadamente dezoito (18) minutos para construir o pacote de exemplo. Felizmente, a maioria dos tempos de construção é menor que uma UPC.
As UPCs não são totalmente precisas, pois dependem de muitos fatores, incluindo a versão do GCC do sistema anfitrião. Elas são fornecidas aqui para dar uma estimativa de quanto tempo pode levar para instalar um pacote, mas os números podem variar tanto quanto dúzias de minutos em alguns casos.
Em alguns sistemas mais novos, a placa-mãe é capaz de controlar a velocidade do clock do sistema. Isso pode ser controlado com um comando como powerprofilesctl. Isso não está disponível no LFS, mas pode estar disponível na distribuição anfitriã. Depois que o LFS estiver completo, ele pode ser adicionado a um sistema com os procedimentos na página power-profiles-daemon do BLFS. Antes de mensurar o tempo de construção de qualquer pacote, é aconselhável usar um perfil de eletricidade do sistema configurado para desempenho máximo (e consumo máximo de eletricidade). Caso contrário, o valor da UPC mensurado pode ser impreciso porque o sistema pode reagir diferentemente ao construir binutils-passagem1 ou outros pacotes. Esteja ciente de que uma imprecisão significativa ainda pode aparecer mesmo se o mesmo perfil for usado para ambos os pacotes, porque o sistema pode responder mais lentamente se estiver ocioso ao iniciar o procedimento de construção. Configurar o perfil de eletricidade para “performance” minimizará esse problema. E, obviamente, fazer isso também fará com que o sistema construa o LFS mais rápido.
Se powerprofilesctl estiver
disponível, emita o comando powerprofilesctl set
performance para selecionar o perfil
performance
. Algumas distribuições
fornecem o comando tuned-adm para gerenciar os
perfis em vez de powerprofilesctl; nessas
distribuições emita o comando tuned-adm profile
throughput-performance para selecionar o perfil
throughput-performance
.
Quando múltiplos processadores são usados dessa maneira, as unidades UPC no livro variarão ainda mais do que normalmente aconteceria. Em alguns casos, o passo make simplesmente falhará. Analisar a saída gerada do processo de construção também será mais difícil, pois as linhas originárias de diferentes processos estarão intercaladas. Se você tiver um problema com um passo de construção, [então] retorne para uma construção de processador único para analisar adequadamente as mensagens de erro.
Os tempos apresentados aqui para todos os pacotes (exceto binutils-passagem1, que é baseado em um núcleo) são baseados no uso de quatro núcleos (-j4). Os tempos no Capítulo 8 também incluem o tempo para executar os testes de regressão para o pacote, a menos que especificado de outra forma.
A maioria dos pacotes fornece uma suíte de teste. Executar a suíte de teste para um pacote recém construído é uma boa ideia, pois pode fornecer uma “verificação de sanidade” indicando que tudo compilou corretamente. Uma suíte de teste que ultrapassa o conjunto de verificações dela geralmente prova que o pacote está funcionando como a(o) desenvolvedora(r) pretendia. Não garante, entretanto, que o pacote está totalmente livre de defeitos.
Algumas suítes de teste são mais importantes que outras. Por exemplo, as suítes de teste para o conjunto de ferramentas central—GCC, binutils e glibc—são de máxima importância devido ao papel central delas em um sistema que funcione adequadamente. As suítes de teste para GCC e glibc podem levar bastante tempo para completarem, especialmente em hardware mais lento, mas são fortemente recomendadas.
Executar as suítes de teste no Capítulo 5 e no Capítulo 6 é impossível; dado que os aplicativos de teste são compilados com um compilador cruzado, eles provavelmente não conseguem executar no anfitrião de construção.
Um problema comum com a execução de suítes de teste para o
binutils e o GCC é ficar sem os pseudo terminais (PTYs). Isso
pode resultar em um alto número de testes com falhas. Isso pode
acontecer por muitas razões, mas a causa mais provável é a de
que o sistema anfitrião não tem o sistema de arquivos
devpts
configurado
corretamente. Esse problema é discutido em maiores detalhes em
https://www.linuxfromscratch.org/lfs/faq.html#no-ptys.
Algumas vezes suítes de testes de pacotes falharão por razões as quais as(os) desenvolvedoras(es) estão cientes e consideraram não-críticas. Consulte os registros localizados em https://www.linuxfromscratch.org/lfs/build-logs/12.2/ para verificar quando essas falhas são esperadas ou não. Esse sítio é válido para todas as suítes de teste ao longo deste livro.
Esta parte é dividida em três estágios: primeiro construir um compilador cruzado e suas bibliotecas associadas; segundo, usar esse conjunto de ferramentas cruzado para construir vários utilitários de uma forma que os isola da distribuição anfitriã; terceiro, entrar no ambiente chroot (o qual melhora ainda mais o isolamento do anfitrião) e construir as ferramentas restantes necessárias para construir o sistema final.
Essa é onde o trabalho real de construir um novo sistema inicia. Seja muito cuidadoso(a) em seguir as instruções exatamente conforme o livro as mostra. Você deveria tentar entender o que cada comando faz e, não importa o quão ansioso(a) você estiver para finalizar sua construção, você deveria evitar digitar cegamente os comandos como mostrado. Leia a documentação quando houver algo que você não entenda. Além disso, mantenha um rastreio da sua digitação e da saída gerada de comandos, usando o utilitário tee para enviar a saída gerada pelo terminal para um arquivo. Isso torna a depuração mais fácil se algo der errado.
A próxima seção é uma introdução técnica ao processo de construção, enquanto que a seguinte apresenta instruções gerais muito importantes.
Esta seção explica algumas das razões e detalhes técnicos por trás do método completo de construção. Não tente imediatamente entender tudo nesta seção. A maior parte desta informação ficará mais clara depois de realizar uma construção atual. Volte e releia este capítulo a qualquer tempo durante o processo de construção.
O objetivo geral do Capítulo 5 e do Capítulo 6 é o de produzir uma área temporária que contendo um conjunto de ferramentas que são conhecidas por serem boas e que estão isoladas do sistema anfitrião. Usando-se o comando chroot, as compilações nos capítulos subsequentes estarão isolados naquele ambiente, assegurando uma construção limpa e livre de problemas do sistema LFS alvo. O processo de construção foi projetado para minimizar os riscos para leitores(as) novatos(as) e para prover o maior valor educacional ao mesmo tempo.
O processo de construção é baseado em compilação cruzada. A compilação cruzada normalmente é usada para construir um compilador e o conjunto de ferramentas associadas dele para uma máquina diferente daquela que é usada para a construção. Isso não é estritamente necessário para o LFS, dado que a máquina onde o novo sistema executará é a mesma que aquela usada para a construção. Porém, a compilação cruzada tem a grande vantagem: tudo o que for compilado cruzadamente não pode depender do ambiente do anfitrião.
O livro LFS não é (e não contém) um tutorial geral para construir um conjunto de ferramentas cruzado (ou nativo). Não use os comandos no livro para um conjunto de ferramentas cruzado para algum outro propósito que não construir o LFS, a menos que você realmente entenda o que está fazendo.
Compilação cruzada envolve alguns conceitos que merecem uma seção por si próprios. Apesar que esta seção possivelmente seja omitida em uma primeira leitura, retornar até ela posteriormente te ajudará a ganhar um entendimento mais completo do processo.
Permita-nos primeiro definir alguns termos usados nesse contexto.
é a máquina onde nós construímos aplicativos. Observe que essa máquina também é referenciada como sendo a “anfitriã”.
é a máquina/sistema onde os aplicativos construídos executarão. Observe que esse uso de “host” não é o mesmo que em outras seções.
é usado somente para compiladores. Ele é a máquina para a qual o compilador produz código. Ele possivelmente seja diferente tanto da construtora quanto da anfitriã.
Como um exemplo, permita-nos imaginar o seguinte cenário (de vez em quando referenciado como “Cruzado Canadense”). Nós temos um compilador somente em uma máquina lenta, vamos chamá-la de máquina A, e o compilador de ccA. Nós também temos uma máquina rápida (B), porém nenhum compilador para (B), e nós queremos produzir código para uma terceira, máquina lenta (C). Nós construiremos um compilador para a máquina C em três estágios.
Estágio | Construtora | Anfitriã | Alvo | Ação |
---|---|---|---|---|
1 | A | A | B | Construir compilador cruzado cc1 usando ccA na máquina A. |
2 | A | B | C | Construir compilador cruzado cc2 usando cc1 na máquina A. |
3 | B | C | C | Construir compilador ccC usando cc2 na máquina B. |
Então, todos os aplicativos necessários para a máquina C podem ser compilados usando cc2 na rápida máquina B. Observe que a menos que B possa executar aplicativos produzidos por C, não existe maneira de testar os aplicativos recém construídos até que a própria máquina C esteja em execução. Por exemplo, para executar uma suíte de teste em ccC, nós possivelmente queiramos adicionar um quarto estágio:
Estágio | Construtora | Anfitriã | Alvo | Ação |
---|---|---|---|---|
4 | C | C | C | Reconstruir e testar ccC usando ccC na máquina C. |
No exemplo acima, somente cc1 e cc2 são compiladores cruzados, isto é, eles produzem código para uma máquina diferente daquela na qual estão em execução. Os outros compiladores, ccA e ccC, produzem código para a máquina na qual estão em execução. Tais compiladores são chamados de compiladores nativos.
Todos os pacotes compilados cruzadamente neste livro usam um sistema de construção baseado no autoconf. O sistema de construção baseado no autoconf aceita tipos de sistema na forma cpu-vendor-kernel-os, referenciado como o triplo do sistema. Dado que o campo vendor frequentemente é irrelevante, o autoconf te permite omiti-lo.
Um(a) leitor(a) astuto(a) possivelmente questione porque
“trio” se refere a um nome de quatro
componentes. O campo "kernel" e o campo "os" iniciaram como
um campo único do “sistema”. Tal forma de três campos
ainda é válida atualmente para alguns sistemas, por
exemplo, x86_64-unknown-freebsd
. Porém, dois
sistemas conseguem compartilhar o mesmo núcleo e ainda
serem muito diferentes para usarem o mesmo trio para
descrevê-los. Por exemplo, o Android executando em um
telefone móvel é completamente diferente do Ubuntu
executando em um servidor ARM64, apesar de ambos estarem
executando no mesmo tipo de CPU (ARM64) e usando o mesmo
núcleo (Linux).
Sem uma camada de emulação, você não consegue executar um
executável para um servidor em um telefone móvel ou vice
versa. Assim, o campo “system” foi dividido nos campos
"kernel" e "os" para designar esses sistemas inequívoca. No
nosso exemplo, O sistema Android é designado como
aarch64-unknown-linux-android
e o sistema Ubuntu é designado como aarch64-unknown-linux-gnu
.
A palavra “trio” permanece embutida no léxico.
Uma maneira simples para determinar o seu trio do sistema é
a de executar o script config.guess que vem com
o fonte para muitos pacotes. Desempacote os fontes do
binutils, execute o script ./config.guess
e observe
a saída gerada. Por exemplo, para um processador Intel de
32 bits, a saída gerada será i686-pc-linux-gnu. Em um sistema
de 64 bits, será x86_64-pc-linux-gnu. Na maior
parte dos sistemas Linux, o comando ainda mais simples
gcc
-dumpmachine te dará informação semelhante.
Você também deveria estar ciente do nome do vinculador
dinâmico da plataforma, frequentemente referido como o
carregador dinâmico (não seja confundido com o vinculador
padrão ld que
é parte do binutils). O vinculador dinâmico fornecido pelo
pacote glibc encontra e carrega as bibliotecas
compartilhadas necessárias para um aplicativo, prepara o
aplicativo para execução e então o executa. O nome do
vinculador dinâmico para uma máquina Intel de 32 bits é
ld-linux.so.2
; e é
ld-linux-x86-64.so.2
em
sistemas de 64 bits. Uma maneira infalível para determinar
o nome do vinculador dinâmico é a de inspecionar uma
biblioteca aleatória oriunda do sistema anfitrião
executando: readelf -l
<nome do binário> | grep interpreter
e observar a saída gerada. A referência oficial cobrindo
todas as plataformas está em uma página wiki
da Glibc.
Para a finalidade de falsificar uma compilação cruzada no
LFS, o nome do trio do anfitrião é ligeiramente ajustado
mudando-se o campo "vendor" na variável LFS_TGT
, de forma que diga "lfs". Nós também
usamos a opção --with-sysroot
quando da
construção do vinculador cruzado e do compilador cruzado para
informá-los onde encontrar os arquivos necessários do
anfitrião. Isso assegura que nenhum dos outros aplicativos
construídos no
Capítulo 6 consegue se vincular a bibliotecas na
máquina de construção. Somente dois estágios são obrigatórios
e mais um para testes.
Estágio | Construtora | Anfitriã | Alvo | Ação |
---|---|---|---|---|
1 | pc | pc | lfs | Construir compilador cruzado cc1 usando cc-pc em pc. |
2 | pc | lfs | lfs | Construir compilador cc-lfs usando cc1 em pc. |
3 | lfs | lfs | lfs | Reconstruir e testar cc-lfs usando cc-lfs em lfs. |
Na tabela precedente, “em pc” significa que os comandos são executados em uma máquina usando a distribuição já instalada. “Em lfs” significa que os comandos são executados em um ambiente chroot.
Esse não é ainda o fim da estória. A linguagem C não é apenas um compilador; também define uma biblioteca padrão. Neste livro, a biblioteca GNU C, chamada de glibc, é usada (existe uma alternativa, "musl"). Essa biblioteca precisa ser compilada para a máquina LFS; isto é, usando o compilador cruzado cc1. Porém, o próprio compilador usa uma biblioteca interna fornecendo sub rotinas complexas para funções não disponíveis no conjunto de instruções do montador. Essa biblioteca interna é chamada de libgcc e precisa ser vinculada à biblioteca glibc para ser completamente funcional. Além disso, a biblioteca padrão para C++ (libstdc++) também precisa estar vinculada com a glibc. A solução para esse problema de ovo e galinha é a de primeiro construir uma libgcc degradada baseada em cc1, faltando algumas funcionalidades, tais como camadas e manuseio de exceções, e então construir a glibc usando esse compilador degradado (a própria glibc não é degradada), e também construir a libstdc++. Essa última biblioteca carecerá de algumas das funcionalidades da libgcc.
O resultado do parágrafo precedente é o de que cc1 é inapto para construir uma libstdc++ completamente funcional com a libgcc degradada, porém cc1 é o único compilador disponível para construir as bibliotecas C/C++ durante o estágio 2. Existem duas razões pelas quais nós não usamos imediatamente o compilador construído no estágio 2, cc-lfs, para construir essas bibliotecas.
Falando genericamente, cc-lfs não consegue executar em pc (o sistema anfitrião). Ainda que os trios para pc e lfs sejam compatíveis entre si, um executável para lfs precisa depender da glibc-2.40; a distribuição anfitriã possivelmente utilize ou uma implementação diferente da libc (por exemplo, musl), ou um lançamento anterior da glibc (por exemplo, glibc-2.13).
Ainda se cc-lfs conseguisse executar em pc, usá-la em pc criaria um risco de vinculação às bibliotecas de pc, dado que cc-lfs é um compilador nativo.
Assim, quando nós construirmos gcc estágio 2, nós instruímos o sistema de construção a reconstruir libgcc e libstdc++ com cc1, porém nós vinculamos libstdc++ à libgcc reconstruída recentemente, em vez da antiga, degradada construção. Isso torna a libstdc++ reconstruída completamente funcional.
No Capítulo 8 (ou “estágio 3”), todos os pacotes necessários para o sistema LFS são construídos. Ainda se um pacote já tenha sido instalado no sistema LFS em um capítulo anterior, nós ainda reconstruímos o pacote. A razão principal para reconstruir esses pacotes é a de torná-los estáveis: se nós reinstalarmos um pacote LFS em um sistema LFS completo, [então] o conteúdo reinstalado do pacote deveria ser o mesmo que o conteúdo do mesmo pacote quando primeiro instalado no Capítulo 8. Os pacotes temporários instalados no Capítulo 6 ou no Capítulo 7 não conseguem satisfazer essa exigência, pois alguns deles são construídos sem dependências opcionais e o autoconf não consegue realizar algumas verificações de recursos no Capítulo 6, por causa da compilação cruzada, causando nos pacotes temporários a falta de recursos opcionais ou o uso de rotinas sub ótimas de código. Adicionalmente, uma razão menor para reconstruir os pacotes é a de executar as suítes de teste.
O compilador cruzado será instalado em um diretório
$LFS/tools
separado, dado que
ele não será parte do sistema final.
O Binutils é instalado primeiro, pois as execuções do configure de ambos gcc e glibc realizam vários testes de recursos no montador e no vinculador para determinar quais recursos de software habilitar ou desabilitar. Isso é mais importante do que, inicialmente, alguém possa perceber. Um gcc ou uma glibc configurado incorretamente pode resultar em um conjunto de ferramentas sutilmente quebrado, onde o impacto de tal quebra talvez não se manifeste até próximo do final da construção de uma distribuição inteira. Uma falha de suíte de teste normalmente destacará tal erro antes que muito mais trabalho adicional seja realizado.
O Binutils instala o montador e o vinculador dele em dois
locais, $LFS/tools/bin
e
$LFS/tools/$LFS_TGT/bin
. As
ferramentas em um local são rigidamente vinculadas às outras.
Uma faceta importante do vinculador é a ordem de procura de
biblioteca dele. Informação detalhada pode ser obtida do
ld passando-lhe
a flag --verbose
. Por
exemplo, $LFS_TGT-ld --verbose
| grep SEARCH exibirá os caminhos atuais de
procura e a ordem deles. (Observe que esse exemplo pode ser
executado como mostrado somente enquanto logado(a) como
usuário(a) lfs
. Se você
retornar a esta página posteriormente, [então] substitua
$LFS_TGT-ld por
ld).
O próximo pacote instalado é o gcc. Um exemplo do que pode ser visto durante a execução dele do configure é:
checking what assembler to use... /mnt/lfs/tools/i686-lfs-linux-gnu/bin/as
checking what linker to use... /mnt/lfs/tools/i686-lfs-linux-gnu/bin/ld
Isso é importante pelas razões mencionadas acima. Também demonstra que o script de configuração do gcc não procura nos diretórios do PATH para encontrar quais ferramentas usar. Entretanto, durante a operação atual do próprio gcc, os mesmos caminhos de procura não são necessariamente usados. Para descobrir qual vinculador padrão o gcc usará, execute: $LFS_TGT-gcc -print-prog-name=ld. (Novamente, remova o prefixo $LFS_TGT- se retornar a isso posteriormente).
Informação detalhada pode ser obtida do gcc passando-se a opção de
linha de comando -v
enquanto compilar um aplicativo. Por exemplo, $LFS_TGT-gcc -v example.c
(ou
sem $LFS_TGT-
se retornar posteriormente) exibirá informação detalhada
acerca do preprocessador, compilação e estágios da montagem,
incluindo os caminhos de procura do gcc para cabeçalhos
inclusos e a ordem deles.
Em seguida: cabeçalhos sanitizados da API do Linux. Eles permitem que a biblioteca C padrão (glibc) interaja com os recursos que o núcleo Linux fornecerá.
Em seguida vem a glibc. As considerações mais importantes
para construir glibc são o compilador, as ferramentas
binárias e os cabeçalhos do núcleo. O compilador e as
ferramentas binárias geralmente não são um problema, pois a
glibc sempre passará aqueles relacionados ao parâmetro
--host
para o script
de configuração dela; por exemplo, em nosso caso, o
compilador será $LFS_TGT-gcc e a ferramenta
readelf será
$LFS_TGT-readelf. Os
cabeçalhos do núcleo podem ser um pouco mais complicados.
Portanto, nós não assumimos riscos e usamos a chave de
configuração disponível para impor a seleção correta. Depois
da execução do configure, verifique o
conteúdo do arquivo config.make
no diretório build
para todos
os detalhes importantes. Esses itens destacam um aspecto
importante do pacote glibc—ele é muito autossuficiente em
termos do maquinário dele de construção e geralmente não
depende de padrões do conjunto de ferramentas.
Como mencionado acima, a biblioteca C++ padrão é compilada
depois, seguida no
Capítulo 6 por outros aplicativos que precisam ser
compilados cruzadamente para quebrar dependências circulares
em tempo de construção. A etapa de instalação de todos
aqueles pacotes usa a variável DESTDIR
para forçar a instalação no sistema de
arquivos do LFS.
Ao final do
Capítulo 6 o compilador nativo do LFS é instalado.
Primeiro binutils passagem 2 é construído, no mesmo diretório
DESTDIR
que os outros aplicativos,
então a segunda passagem do gcc é construída, omitindo
algumas bibliotecas não críticas. Devido a algumas lógicas
estranhas no script configure do gcc, CC_FOR_TARGET
termina como cc quando o anfitrião for o
mesmo que o alvo, porém for diferente do sistema de
construção. Essa é a razão pela qual CC_FOR_TARGET=$LFS_TGT-gcc
é
declarado explicitamente como uma das opções de configuração.
Uma vez dentro do ambiente chroot no Capítulo 7, as instalações temporárias de aplicativos necessários para a operação apropriada do conjunto de ferramentas são realizadas. Deste ponto em diante, o conjunto central de ferramentas está auto-contido e auto-hospedado. No Capítulo 8, as versões finais de todos os pacotes necessários para um sistema completamente funcional são construídas, testadas e instaladas.
Durante um ciclo de desenvolvimento do LFS, as instruções no livro frequentemente são modificadas para se adaptarem a uma atualização de pacote ou para tirar vantagem de novos recursos a partir de pacotes atualizados. Misturar as instruções de diferentes versões do livro LFS pode causar quebras sutis. Esse tipo de problema geralmente é resultado da reutilização de algum script criado para um lançamento anterior do LFS. Tal reutilização é fortemente desencorajada. Se você estiver reutilizando scripts para um lançamento anterior do LFS por qualquer motivo, [então] você precisará ter muito cuidado para atualizar os scripts para corresponderem à versão atual do livro do LFS.
Aqui estão algumas coisas que você deveria saber a respeito de construir cada pacote:
Vários pacotes são remendados antes da compilação, porém somente quando o remendo for necessário para contornar um problema. Um remendo frequentemente é necessário tanto neste quanto nos capítulos seguintes, porém às vezes, quando o mesmo pacote é construído mais que uma vez. o remendo não é necessário imediatamente. Portanto, não se preocupe se as instruções para um remendo baixado pareçam estar ausentes. Mensagens de aviso acerca de offset ou fuzz também possivelmente sejam encontradas quando da aplicação de um remendo. Não se preocupe com esses alertas; o remendo ainda foi aplicado com sucesso.
Durante a compilação da maior parte dos pacotes, alguns avisos rolarão na tela. Esses são normais e seguramente podem ser ignorados. Esses alertas usualmente são a respeito do uso de sintaxe C ou C++ obsoleta, porém não inválida. Padrões C mudam com ampla frequência e alguns pacotes ainda não foram atualizados. Esse não é um problema sério, porém causa o aparecimento dos avisos.
Verifique uma última vez se a variável de ambiente
LFS
está configurada
adequadamente:
echo $LFS
Certifique-se de que a saída gerada mostra o caminho para
o ponto de montagem da partição do LFS, que é
/mnt/lfs
, usando nosso
exemplo.
Finalmente, dois itens importantes precisam ser enfatizados:
As instruções de construção assumem que as Exigências do Sistema Anfitrião, incluindo links simbólicos, tenham sido configuradas adequadamente:
bash é o shell em uso.
sh é um link simbólico para bash.
/usr/bin/awk é um link simbólico para gawk.
/usr/bin/yacc é um link simbólico para bison ou um script pequeno que executa bison.
Aqui está uma sinopse do processo de construção.
Coloque todos os pacotes e os remendos em um
diretório que estará acessível a partir do
ambiente chroot, tal como /mnt/lfs/sources/
.
Mude para o diretório /mnt/lfs/sources/
.
Usando o aplicativo tar, extraia o pacote para ser construído. Em Capítulo 5 e Capítulo 6, certifique-se de que você seja o(a) usuário(a) lfs quando extrair o pacote.
Não use nenhum método, exceto o comando tar, para extrair o código fonte. Notadamente, usar o comando cp -R para copiar a árvore do código fonte para outro lugar pode destruir carimbos de tempo na árvore do fonte e causar falha de construção.
Mude para o diretório criado quando o pacote foi extraído.
Siga as instruções para construir o pacote.
Mude de volta para o diretório dos fontes quando a construção estiver completa.
Delete o diretório do fonte extraído, a menos que instruído(a) do contrário.
Este capítulo mostra como construir um compilador cruzado e as ferramentas associadas dele. Apesar de aqui a compilação cruzada ser falseada, os princípios são os mesmos que aqueles para um conjunto de ferramentas cruzado real.
Os aplicativos compilados neste capítulo serão instalados sob o
diretório $LFS/tools
para
mantê-los separados dos arquivos instalados nos capítulos
seguintes. As bibliotecas, por outro lado, são instaladas no
lugar final delas, dado que elas pertencem ao sistema que
queremos construir.
O pacote Binutils contém um vinculador, um montador e outras ferramentas para manusear arquivos objeto.
Volte e releia as observações na seção intitulada Instruções Gerais de Compilação. Entender as observações rotuladas como importantes pode salvar você de um monte de problemas depois.
É importante que o Binutils seja o primeiro pacote compilado, pois ambos a Glibc e o GCC realizam vários testes sobre o vinculador e o montador disponíveis para determinar quais dos próprios recursos deles habilitar.
A documentação do Binutils recomenda construir o Binutils em um diretório dedicado à construção:
mkdir -v build cd build
Para a finalidade de que os valores da UPC listados no
resto do livro sejam de algum uso, meça o tempo que leva
para construir esse pacote desde a configuração até, e
incluindo, a primeira instalação. Para fazer isso
facilmente, encapsule os comandos em um comando
time desta
forma: time { ../configure
... && make && make install;
}
.
Agora prepare o Binutils para compilação:
../configure --prefix=$LFS/tools \ --with-sysroot=$LFS \ --target=$LFS_TGT \ --disable-nls \ --enable-gprofng=no \ --disable-werror \ --enable-new-dtags \ --enable-default-hash-style=gnu
O significado das opções do configure:
--prefix=$LFS/tools
Isso diz para o script configure para preparar para
instalar os aplicativos do Binutils no diretório
$LFS/tools
.
--with-sysroot=$LFS
Para compilação cruzada, isso diz ao sistema de construção para procurar em $LFS pelas bibliotecas alvo de sistema conforme necessário.
--target=$LFS_TGT
Por causa da descrição de máquina na variável
LFS_TGT
ser ligeiramente
diferente do valor retornado pelo script config.guess, essa
chave dirá ao script configure para
ajustar o sistema de construção do binutils para
construir um vinculador cruzado.
--disable-nls
Isso desabilita internacionalização, uma vez que i18n não é necessária para as ferramentas temporárias.
--enable-gprofng=no
Isso desabilita a construção do gprofng o qual não é necessário para as ferramentas temporárias.
--disable-werror
Isso evita que a construção pare no caso de existirem alertas originários do compilador do anfitrião.
--enable-new-dtags
Isso faz com que o vinculador use a etiqueta “runpath” para incorporar caminhos de pesquisa de biblioteca em executáveis e em bibliotecas compartilhadas, em vez da tradicional etiqueta “rpath”. Ela torna mais fácil depurar executáveis vinculados dinamicamente e contorna possíveis problemas na suíte de teste de alguns pacotes.
--enable-default-hash-style=gnu
Por padrão, o vinculador geraria a tabela "hash" no estilo "GNU" e a tabela "hash" "ELF" clássica para bibliotecas compartilhadas e executáveis vinculados dinamicamente. As tabelas "hash" destinam-se somente a um vinculador dinâmico para realizar a pesquisa de símbolos. No LFS, o vinculador dinâmico (fornecido pelo pacote "Glibc") sempre usará a tabela "hash" no estilo "GNU", que é mais rápida de consultar. Portanto, a tabela "hash" "ELF" clássica é completamente inútil. Isso faz com que o vinculador gere somente a tabela "hash" estilo "GNU" por padrão, de forma que possamos evitar desperdiçar tempo para gerar a tabela "hash" "ELF" clássica quando construirmos os pacotes ou desperdiçar espaço em disco para armazená-la.
Continue compilando o pacote:
make
Instale o pacote:
make install
Detalhes deste pacote estão localizados na Seção 8.20.2, “Conteúdo do Binutils.”
O pacote GCC contém a GNU Compiler Collection, a qual inclui os compiladores C e C++.
O GCC exige os pacotes GMP, MPFR e MPC. Uma vez que esses pacotes talvez não estejam incluídos na sua distribuição anfitriã, eles serão construídos com o GCC. Desempacote cada pacote dentro do diretório de fonte do GCC e renomeie os diretórios resultantes, de forma que os procedimentos de construção do GCC automaticamente os usarão:
Existem mal-entendidos frequentes a respeito deste capítulo. Os procedimentos são os mesmos que todos os outros capítulos, conforme explicados anteriormente (Instruções de construção de pacote). Primeiro, extraia o tarball gcc-14.2.0 a partir do diretório dos fontes e então mude para o diretório criado. Somente então deveria você prosseguir com as instruções abaixo.
tar -xf ../mpfr-4.2.1.tar.xz mv -v mpfr-4.2.1 mpfr tar -xf ../gmp-6.3.0.tar.xz mv -v gmp-6.3.0 gmp tar -xf ../mpc-1.3.1.tar.gz mv -v mpc-1.3.1 mpc
Em anfitriões x86_64, configure o nome padrão de diretório para bibliotecas de 64 bits para “lib”:
case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;; esac
A documentação do GCC recomenda construir o GCC em um diretório de construção dedicado:
mkdir -v build cd build
Prepare o GCC para compilação:
../configure \ --target=$LFS_TGT \ --prefix=$LFS/tools \ --with-glibc-version=2.40 \ --with-sysroot=$LFS \ --with-newlib \ --without-headers \ --enable-default-pie \ --enable-default-ssp \ --disable-nls \ --disable-shared \ --disable-multilib \ --disable-threads \ --disable-libatomic \ --disable-libgomp \ --disable-libquadmath \ --disable-libssp \ --disable-libvtv \ --disable-libstdcxx \ --enable-languages=c,c++
O significado das opções do configure:
--with-glibc-version=2.40
Essa opção especifica a versão da Glibc que será usada no alvo. Ela não é relevante para a libc da distribuição anfitriã, pois tudo compilado pela passagem 1 do GCC executará no ambiente chroot, o qual é isolado da libc da distribuição anfitriã.
--with-newlib
Uma vez que uma biblioteca C funcional ainda não está disponível, isso assegura que a constante inhibit_libc esteja definida quando da construção de libgcc. Isso evita a compilação de qualquer código que exija suporte à libc.
--without-headers
Quando da criação de um compilador cruzado completo, o GCC exige cabeçalhos padrão compatíveis com o sistema alvo. Para nossos propósitos esses cabeçalhos não serão necessários. Essa chave evita que o GCC procure por eles.
--enable-default-pie e
--enable-default-ssp
Essas chaves permitem que o GCC compile aplicativos com alguns recursos de segurança reforçados (mais informação a respeito delas na observação a respeito de PIE e SSP no capítulo 8) por padrão. Elas não são estritamente necessárias neste estágio, pois o compilador produzirá apenas executáveis temporários. Mas, é mais limpo ter os pacotes temporários o mais próximo possível dos finais.
--disable-shared
Essa chave força o GCC a vincular as bibliotecas internas dele estaticamente. Nós precisamos disso, pois as bibliotecas compartilhadas exigem a Glibc, que ainda não está instalada no sistema alvo.
--disable-multilib
Em x86_64, o LFS não suporta uma configuração multi bibliotecas. Essa chave é inofensiva para x86.
--disable-threads, --disable-libatomic,
--disable-libgomp, --disable-libquadmath,
--disable-libssp, --disable-libvtv e
--disable-libstdcxx
Essas chaves desabilitam o suporte para threading, libatomic, libgomp, libquadmath, libssp, libvtv e à biblioteca padrão C++ respectivamente. Esses recursos possivelmente falhem para compilar quando da construção de um compilador cruzado e não são necessários para a tarefa de compilar cruzadamente a libc temporária.
--enable-languages=c,c++
Essa opção garante que apenas os compiladores C e C++ sejam construídos. Essas são as únicas linguagens necessárias agora.
Compile o GCC executando:
make
Instale o pacote:
make install
Essa construção do GCC instalou um par de cabeçalhos internos
de sistema. Normalmente um deles, limits.h
, sequencialmente incluiria o
correspondente cabeçalho de sistema limits.h
, nesse caso, $LFS/usr/include/limits.h
. Entretanto, ao
tempo dessa construção do GCC, $LFS/usr/include/limits.h
não existe, de
forma que o cabeçalho interno que tenha sido instalado é um
arquivo parcial, auto-contido, e não inclui os recursos
estendidos do cabeçalho de sistema. Isso é adequado para a
construção da Glibc, porém o cabeçalho interno completo será
necessário posteriormente. Crie uma versão completa do
cabeçalho interno usando um comando que é idêntico ao que o
sistema de construção do GCC faz em circunstâncias normais:
O comando abaixo mostra um exemplo da substituição de
comando aninhada usando dois métodos: aspas invertidas e
uma construção $()
. Poderia
ser reescrito usando o mesmo método para ambas as
substituições, porém é mostrado dessa maneira para
demonstrar o como eles podem ser misturados. Geralmente o
método $()
é preferido.
cd .. cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include/limits.h
Detalhes acerca deste pacote estão localizados na Seção 8.29.2, “Conteúdo do GCC.”
Os Cabeçalhos da API do Linux (em linux-6.10.5.tar.xz) expõem a API do kernel para uso pela Glibc.
O kernel Linux precisa expor uma Interface de Programação de Aplicativos (API) para a biblioteca C do sistema (Glibc no LFS) usar. Isso é feito por meio de sanitizar vários arquivos de cabeçalho C que são embarcados no tarball do fonte do kernel Linux.
Certifique-se de que não existem arquivos obsoletos embutidos no pacote:
make mrproper
Agora extraia os cabeçalhos de kernel visíveis para o(a)
usuário(a) a partir do fonte. O alvo recomendado do make
“headers_install” não pode ser usado,
pois ele exige rsync, que
possivelmente não esteja disponível. Os cabeçalhos são
primeiro colocados em ./usr
,
então copiados para o local necessário.
make headers find usr/include -type f ! -name '*.h' -delete cp -rv usr/include $LFS/usr
Os cabeçalhos ASM da API do Linux |
|
Os cabeçalhos genéricos ASM da API do Linux |
|
Os cabeçalhos DRM da API do Linux |
|
Os cabeçalhos Linux da API do Linux |
|
Os cabeçalhos diversos da API do Linux |
|
Os cabeçalhos MTD da API do Linux |
|
Os cabeçalhos RDMA da API do Linux |
|
Os cabeçalhos SCSI da API do Linux |
|
Os cabeçalhos de som da API do Linux |
|
Os cabeçalhos de vídeo da API do Linux |
|
Os cabeçalhos Xen da API do Linux |
O pacote Glibc contém a principal biblioteca C. Essa biblioteca fornece as rotinas básicas para alocação de memória, busca em diretórios, abertura e fechamento de arquivos, leitura e escrita de arquivos, manuseio de sequências de caracteres, correspondência de padrões, aritmética, e daí por diante.
Primeiro, crie um link simbólico para conformidade com a LSB. Adicionalmente, para x86_64, crie um link simbólico de compatibilidade exigido para a operação adequada do carregador dinâmico de biblioteca:
case $(uname -m) in i?86) ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3 ;; x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64 ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3 ;; esac
O comando acima está correto. O comando "ln" tem várias versões sintáticas, de forma que tenha certeza de verificar "info coreutils ln" e "ln(1)" antes de informar o que possivelmente aparente ser um erro.
Alguns dos aplicativos Glibc usam o diretório não conforme
com a FHS /var/db
para
armazenar os dados em tempo de execução deles. Aplique o
seguinte remendo para fazer com que tais aplicativos
armazenem os dados em tempo de execução deles nos locais
conformes com a FHS:
patch -Np1 -i ../glibc-2.40-fhs-1.patch
A documentação da Glibc recomenda construir a Glibc em um diretório dedicado à construção:
mkdir -v build cd build
Assegure que os utilitários ldconfig e sln sejam instalados em
/usr/sbin
:
echo "rootsbindir=/usr/sbin" > configparms
A seguir, prepare a Glibc para compilação:
../configure \ --prefix=/usr \ --host=$LFS_TGT \ --build=$(../scripts/config.guess) \ --enable-kernel=4.19 \ --with-headers=$LFS/usr/include \ --disable-nscd \ libc_cv_slibdir=/usr/lib
O significado das opções do configure:
--host=$LFS_TGT,
--build=$(../scripts/config.guess)
O efeito combinado dessas chaves é o de que o sistema
de construção da Glibc se autoconfigura para ser
compilado cruzadamente, usando o vinculador cruzado e o
compilador cruzado em $LFS/tools
.
--enable-kernel=4.19
Isso diz para a Glibc para compilar a biblioteca com suporte para núcleos Linux 4.19 e posteriores. Contornos para núcleos mais antigos não estão habilitados.
--with-headers=$LFS/usr/include
Isso diz para a Glibc para compilar a si mesma contra os cabeçalhos recentemente instalados no diretório $LFS/usr/include, de forma que ela saiba exatamente quais recursos o núcleo tem e possa otimizar-se adequadamente.
libc_cv_slibdir=/usr/lib
Isso garante que a biblioteca seja instalada em /usr/lib em vez do padrão /lib64 em máquinas de 64 bits.
--disable-nscd
Não construa o processo de segundo plano de armazenamento temporário do serviço de nomes, o qual não mais é usado.
Durante este estágio o seguinte aviso pode aparecer:
configure: WARNING: *** These auxiliary programs are missing or *** incompatible versions: msgfmt *** some features will be disabled. *** Check the INSTALL file for required versions.
O ausente ou incompatível aplicativo msgfmt geralmente é inofensivo. Esse aplicativo msgfmt é parte do pacote Gettext, que a distribuição anfitriã deveria fornecer.
Tem havido informes de que esse pacote possivelmente falhe
quando construir-se como um “make paralelo”.
Se isso ocorrer, [então] reexecute o comando "make" com a
opção "-j1
".
Compile o pacote:
make
Instale o pacote:
Se LFS
não estiver adequadamente
configurada, e a despeito das recomendações, você estiver
construindo como root
,
[então] o próximo comando instalará a recém construída
Glibc em seu sistema anfitrião, o que quase certamente o
tornará inutilizável. Portanto, verifique duas vezes se o
ambiente está corretamente configurado e que você não é
o(a) root
antes de executar
o seguinte comando.
make DESTDIR=$LFS install
O significado da opção make install:
DESTDIR=$LFS
A variável DESTDIR
de make é
usada por quase todos os pacotes para definir o local
onde o pacote deveria ser instalado. Se ela não estiver
configurada, [então] o padrão é o diretório raiz
(/
). Aqui nós
especificamos que o pacote seja instalado em
$LFS
, que se tornará o
diretório raiz na Seção 7.4,
“Entrando no Ambiente Chroot”.
Corrija caminho codificado rigidamente para o carregador de executável no script ldd:
sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd
Neste ponto, é imperativo parar e certificar-se de que as funções básicas (compilar e lincar) do novo conjunto de ferramentas estão funcionando como esperado. Para realizar uma verificação de sanidade, execute os seguintes comandos:
echo 'int main(){}' | $LFS_TGT-gcc -xc - readelf -l a.out | grep ld-linux
Se tudo estiver funcionando corretamente, [então] não deveriam existir quaisquer erros e a saída do comando final será na forma:
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
Observe que, para máquinas de 32 bits, o nome do
interpretador será /lib/ld-linux.so.2
.
Se a saída gerada não for mostrada como acima ou não existir saída gerada nenhuma, então alguma coisa está errada. Investigue e refaça os passos para descobrir onde está o problema e corrija-o. Esse problema precisa ser resolvido antes de continuar.
Uma vez que tudo esteja bem, limpe o arquivo de teste:
rm -v a.out
Construir os pacotes no próximo capítulo servirá como uma verificação adicional de que o conjunto de ferramentas foi construído adequadamente. Se algum pacote, especialmente o Binutils-passagem 2 ou o GCC-passagem 2, falhar na construção, [então] isso é uma indicação de que alguma coisa deu errado com as instalações anteriores doe Binutils, GCC ou da Glibc.
Detalhes acerca desse pacote estão localizados na Seção 8.5.3, “Conteúdo do Glibc.”
Libstdc++ é a biblioteca padrão C++. Ela é necessária para compilar código C++ (parte de GCC é escrito em C++), porém nós tivemos que adiar a instalação dela quando construímos gcc-pass1, pois a Libstdc++ depende da Glibc, que ainda não estava disponível no diretório alvo.
Libstdc++ é parte dos
fontes do GCC. Você deveria primeiro desempacotar o tarball
do GCC e mudar para o diretório gcc-14.2.0
.
Crie um diretório separado de construção para a Libstdc++ e entre nele:
mkdir -v build cd build
Prepare a Libstdc++ para compilação:
../libstdc++-v3/configure \ --host=$LFS_TGT \ --build=$(../config.guess) \ --prefix=/usr \ --disable-multilib \ --disable-nls \ --disable-libstdcxx-pch \ --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/14.2.0
O significado das opções do configure:
--host=...
Especifica que o compilador cruzado que nós acabamos de
construir deveria ser usado em vez daquele em
/usr/bin
.
--disable-libstdcxx-pch
Essa chave evita a instalação de arquivos pré-compilados include, os quais não são necessários neste estágio.
--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/14.2.0
Isso especifica o diretório de instalação para arquivos
include. Por causa da Libstdc++ ser a biblioteca padrão
C++ para o LFS, esse diretório deveria corresponder com
o local onde o compilador C++ ($LFS_TGT-g++)
procuraria pelos arquivos padrão include C++ . Em uma
construção normal, essa informação é automaticamente
passada para as opções configure da
Libstdc++ a partir do diretório de nível de topo. Em
nosso caso, essa informação precisa ser explicitamente
dada. O compilador C++ precederá o caminho raiz do
sistema $LFS
(especificado quando da construção do GCC passagem 1)
para o caminho de pesquisa de arquivo include, de forma
que ele atualmente pesquisará em $LFS/tools/$LFS_TGT/include/c++/14.2.0
.
A combinação da variável DESTDIR
(no comando
make
install abaixo) e essa chave causa os
cabeçalhos serem instalados lá.
Compile a Libstdc++ executando:
make
Instale a biblioteca:
make DESTDIR=$LFS install
Remova os arquivos de arquivamento do libtool, pois eles são danosos para compilação cruzada:
rm -v $LFS/usr/lib/lib{stdc++{,exp,fs},supc++}.la
Detalhes acerca deste pacote estão localizados na Seção 8.29.2, “Conteúdo do GCC.”
Este capítulo mostra como compilar cruzadamente utilitários básicos usando o recém construído conjunto de ferramentas cruzados. Esses utilitários são instalados no local final deles, porém ainda não podem ser usados. Tarefas básicas ainda dependem das ferramentas do anfitrião. Apesar disso, as bibliotecas instaladas são usadas quando da vinculação.
Usar os utilitários será possível no próximo capítulo após entrada no ambiente “chroot”. Porém, todos os pacotes construídos no presente capítulo precisam ser construídos antes que façamos isso. Dessa forma nós ainda não podemos ficar independentes do sistema anfitrião.
Uma vez mais, permita-nos relembrar que a configuração
inapropriada de LFS
junto com a
construção como root
,
possivelmente torne teu computador não usável. Este capítulo
inteiro precisa ser feito como usuário(a) lfs
, com o ambiente conforme descrito na
Seção 4.4, “Configurando o
Ambiente.”
O pacote M4 contém um processador de macro.
Prepare o M4 para compilação:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess)
Compile o pacote:
make
Instale o pacote:
make DESTDIR=$LFS install
Detalhes acerca deste pacote estão localizados na Seção 8.13.2, “Conteúdo de M4.”
O pacote Ncurses contém bibliotecas para manuseio independente de terminal das telas de caracteres .
Primeiro, assegure que gawk é encontrado primeiro durante a configuração:
sed -i s/mawk// configure
Então, execute os seguintes comandos para construir o aplicativo “tic” no anfitrião de construção:
mkdir build pushd build ../configure make -C include make -C progs tic popd
Prepare o Ncurses para compilação:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(./config.guess) \ --mandir=/usr/share/man \ --with-manpage-format=normal \ --with-shared \ --without-normal \ --with-cxx-shared \ --without-debug \ --without-ada \ --disable-stripping
O significado das novas opções de configuração:
--with-manpage-format=normal
Isso evita que o "Ncurses" instale páginas de manual comprimidas, o que possivelmente aconteça se a própria distribuição anfitriã tiver páginas de manual comprimidas.
--with-shared
Isso faz com que o Ncurses construa e instale bibliotecas C compartilhadas.
--without-normal
Isso evita que o "Ncurses" construa e instale bibliotecas "C" estáticas.
--without-debug
Isso evita que o "Ncurses" construa e instale bibliotecas de depuração.
--with-cxx-shared
Isso faz com que o Ncurses construa e instale vínculos C++ compartilhados. Também evita a construção e instalação de vínculos C++ estáticos.
--without-ada
Isso assegura que o Ncurses não construa suporte para o compilador Ada, o qual possivelmente esteja presente no anfitrião, porém não estará disponível até que nós entremos no ambiente chroot.
--disable-stripping
Essa chave impede o sistema de construção de usar o aplicativo strip oriundo do anfitrião. Usar ferramentas do anfitrião em aplicativos compilados cruzadamente pode causar falha.
Compile o pacote:
make
Instale o pacote:
make DESTDIR=$LFS TIC_PATH=$(pwd)/build/progs/tic install ln -sv libncursesw.so $LFS/usr/lib/libncurses.so sed -e 's/^#if.*XOPEN.*$/#if 1/' \ -i $LFS/usr/include/curses.h
O significado das opções do install:
TIC_PATH=$(pwd)/build/progs/tic
Nós precisamos passar o caminho do recém construído aplicativo tic que executa na máquina de construção, de forma que a base de dados de terminal possa ser criada sem erros.
A biblioteca "libncurses.so
" é necessária para uns
poucos pacotes que nós construiremos breve. Nós criamos
esse link simbólico para usar a "libncursesw.so
" como uma substituta.
O arquivo de cabeçalho "curses.h
" contém a definição de
várias estruturas de dados do "Ncurses". Com diferentes
definições de macro de pré processador, dois conjuntos
de definição de estrutura de dados podem ser usados: a
definição de oito bits é compatível com a "libncurses.so
" e a definição de
caracteres largos é compatível com a "libncursesw.so
". Como estamos usando
a "libncursesw.so
" como
uma substituta da "libncurses.so
", edite o arquivo de
cabeçalho de forma que ele sempre usará a definição de
estrutura de dados de caracteres largos compatível com
a "libncursesw.so
".
Detalhes acerca deste pacote estão localizados na Seção 8.30.2, “Conteúdo do Ncurses.”
O pacote Bash contém o Bourne-Again SHell.
Prepare o Bash para compilação:
./configure --prefix=/usr \ --build=$(sh support/config.guess) \ --host=$LFS_TGT \ --without-bash-malloc \ bash_cv_strtold_broken=no
O significado das opções do configure:
--without-bash-malloc
Essa opção desliga o uso da função de alocação de
memória do Bash (malloc
)
a qual é conhecida por causar falhas de segmentação. Ao
se desligar essa opção, o Bash usará as funções
malloc
originárias da
Glibc que são mais estáveis.
Compile o pacote:
make
Instale o pacote:
make DESTDIR=$LFS install
Faça um link para os aplicativos que usam sh para um shell:
ln -sv bash $LFS/bin/sh
Detalhes acerca deste pacote estão localizados na Seção 8.36.2, “Conteúdo do Bash.”
O pacote Coreutils contém aplicativos utilitários básicos necessitados por cada sistema operacional.
Prepare o Coreutils para compilação:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) \ --enable-install-program=hostname \ --enable-no-install-program=kill,uptime
O significado das opções do configure:
--enable-install-program=hostname
Isso habilita o binário hostname para ser construído e instalado – ele é desabilitado por padrão, porém é exigido pela suíte de teste do Perl.
Compile o pacote:
make
Instale o pacote:
make DESTDIR=$LFS install
Mova aplicativos para os locais finais deles esperados. Apesar de isso não ser necessário neste ambiente temporário, nós precisamos fazer isso, pois alguns aplicativos codificam rigidamente locais de executável:
mv -v $LFS/usr/bin/chroot $LFS/usr/sbin mkdir -pv $LFS/usr/share/man/man8 mv -v $LFS/usr/share/man/man1/chroot.1 $LFS/usr/share/man/man8/chroot.8 sed -i 's/"1"/"8"/' $LFS/usr/share/man/man8/chroot.8
Detalhes acerca deste pacote estão localizados na Seção 8.58.2, “Conteúdo do Coreutils.”
O pacote Diffutils contém aplicativos que mostram as diferenças entre arquivos ou diretórios.
Prepare o Diffutils para compilação:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(./build-aux/config.guess)
Compile o pacote:
make
Instale o pacote:
make DESTDIR=$LFS install
Detalhes acerca deste pacote estão localizados na Seção 8.60.2, “Conteúdo do Diffutils.”
O pacote File contém um utilitário para determinar o tipo de um dado arquivo ou arquivos.
O comando file no anfitrião de construção precisa ser da mesma versão que aquele que nós estamos construindo com a finalidade de criar o arquivo de assinatura. Execute os seguintes comandos para produzir uma cópia temporária do comando file:
mkdir build pushd build ../configure --disable-bzlib \ --disable-libseccomp \ --disable-xzlib \ --disable-zlib make popd
O significado da nova opção do configure:
--disable-*
O script de configuração tenta usar alguns pacotes originários da distribuição anfitriã se os arquivos de biblioteca correspondentes existirem. Isso possivelmente cause falha de compilação se um arquivo de biblioteca existir, porém os arquivos de cabeçalhos correspondentes não. Essas opções evitam usar essas capacidades desnecessárias oriundas do anfitrião.
Prepare o File para compilação:
./configure --prefix=/usr --host=$LFS_TGT --build=$(./config.guess)
Compile o pacote:
make FILE_COMPILE=$(pwd)/build/src/file
Instale o pacote:
make DESTDIR=$LFS install
Remova o arquivo de arquivamento do libtool pois ele é danoso para compilação cruzada:
rm -v $LFS/usr/lib/libmagic.la
Detalhes acerca deste pacote estão localizados na Seção 8.11.2, “Conteúdo do File.”
O pacote Findutils contém aplicativos para encontrar arquivos. Os aplicativos são fornecidos para procurar ao longo de todos os arquivos em uma árvore de diretórios e para criar, manter e buscar uma base de dados (geralmente mais rápido que o find recursivo, porém não é confiável, a menos que a base de dados tenha sido atualizada recentemente). O Findutils também abastece o aplicativo xargs, o qual pode ser usado para executar um comando especificado sobre cada arquivo selecionado por uma pesquisa.
Prepare o Findutils para compilação:
./configure --prefix=/usr \ --localstatedir=/var/lib/locate \ --host=$LFS_TGT \ --build=$(build-aux/config.guess)
Compile o pacote:
make
Instale o pacote:
make DESTDIR=$LFS install
Detalhes acerca deste pacote estão localizados na Seção 8.62.2, “Conteúdo do Findutils.”
O pacote Gawk contém aplicativos para manipular arquivos de texto.
Primeiro, garanta que alguns arquivos desnecessários não sejam instalados:
sed -i 's/extras//' Makefile.in
Prepare o Gawk para compilação:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess)
Compile o pacote:
make
Instale o pacote:
make DESTDIR=$LFS install
Detalhes acerca deste pacote estão localizados na Seção 8.61.2, “Conteúdo do Gawk.”
O pacote Grep contém aplicativos para procura ao longo do conteúdo de arquivos.
Prepare o Grep para compilação:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(./build-aux/config.guess)
Compile o pacote:
make
Instale o pacote:
make DESTDIR=$LFS install
Detalhes acerca deste pacote estão localizados na Seção 8.35.2, “Conteúdo do Grep.”
O pacote Gzip contém aplicativos para comprimir e descomprimir arquivos.
Prepare o Gzip para compilação:
./configure --prefix=/usr --host=$LFS_TGT
Compile o pacote:
make
Instale o pacote:
make DESTDIR=$LFS install
Detalhes acerca deste pacote estão localizados na Seção 8.65.2, “Conteúdo do Gzip.”
O pacote Make contém um aplicativo para controlar a geração de executáveis e outros arquivos não fonte de um pacote a partir de arquivos fonte.
Prepare o Make para compilação:
./configure --prefix=/usr \ --without-guile \ --host=$LFS_TGT \ --build=$(build-aux/config.guess)
O significado da nova opção do configure:
--without-guile
Apesar de nós estarmos compilando cruzadamente, o configure tenta usar o guile oriundo do anfitrião de construção se encontrá-lo. Isso provoca falha de compilação, de forma que essa chave evita usá-lo.
Compile o pacote:
make
Instale o pacote:
make DESTDIR=$LFS install
Detalhes acerca deste pacote estão localizados na Seção 8.69.2, “Conteúdo do Make.”
O pacote Patch contém um aplicativo para modificar ou criar arquivos por aplicação de um arquivo “remendo” tipicamente criado pelo aplicativo diff.
Prepare o Patch para compilação:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess)
Compile o pacote:
make
Instale o pacote:
make DESTDIR=$LFS install
Detalhes acerca deste pacote estão localizados na Seção 8.70.2, “Conteúdo do Patch.”
O pacote Sed contém um editor de fluxo.
Prepare o Sed para compilação:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(./build-aux/config.guess)
Compile o pacote:
make
Instale o pacote:
make DESTDIR=$LFS install
Detalhes acerca deste pacote estão localizados na Seção 8.31.2, “Conteúdo do Sed.”
O pacote Tar fornece a habilidade para criar arquivamentos tar bem como para realizar vários outros tipos de manipulação de arquivamento. Tar pode ser usado sobre arquivamentos previamente criados para extrair arquivos, para armazenar arquivos adicionais ou para atualizar ou listar arquivos que já foram armazenados.
Prepare o Tar para compilação:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess)
Compile o pacote:
make
Instale o pacote:
make DESTDIR=$LFS install
Detalhes acerca deste pacote estão localizados na Seção 8.71.2, “Conteúdo do Tar.”
O pacote Xz contém aplicativos para comprimir e descomprimir arquivos. Ele fornece recursos para os formatos de compressão lzma e o mais novo xz. Comprimir arquivos de texto com xz gera uma melhor percentagem de compressão que com os tradicionais comandos gzip ou bzip2.
Prepare o Xz para compilação:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) \ --disable-static \ --docdir=/usr/share/doc/xz-5.6.2
Compile o pacote:
make
Instale o pacote:
make DESTDIR=$LFS install
Remova o arquivo de arquivamento do libtool pois ele é danoso para compilação cruzada:
rm -v $LFS/usr/lib/liblzma.la
Detalhes acerca deste pacote estão localizados na Seção 8.8.2, “Conteúdo do Xz.”
O pacote Binutils contém um vinculador, um montador e outras ferramentas para manusear arquivos objeto.
O sistema de construção do "Binutils" depende de uma cópia enviada da "libtool" para vincular-se a bibliotecas estáticas internas, mas as cópias "libiberty" e "zlib" enviadas no pacote não usam a "libtool". Essa inconsistência possivelmente cause binários produzidos vinculados erroneamente a bibliotecas originárias da distribuição anfitriã. Contorne esse problema:
sed '6009s/$add_dir//' -i ltmain.sh
Crie um diretório de construção separado novamente:
mkdir -v build cd build
Prepare o Binutils para compilação:
../configure \ --prefix=/usr \ --build=$(../config.guess) \ --host=$LFS_TGT \ --disable-nls \ --enable-shared \ --enable-gprofng=no \ --disable-werror \ --enable-64-bit-bfd \ --enable-new-dtags \ --enable-default-hash-style=gnu
O significado das novas opções de configuração:
--enable-shared
Constrói libbfd
como uma
biblioteca compartilhada.
--enable-64-bit-bfd
Habilita suporte de 64 bits (em anfitriões com tamanhos de palavra mais estreitos). Isso possivelmente não seja necessário em sistemas de 64 bits, porém não causa dano.
Compile o pacote:
make
Instale o pacote:
make DESTDIR=$LFS install
Remova os arquivos de arquivamento da libtool, pois eles são danosos para compilação cruzada e remove bibliotecas estáticas desnecessárias:
rm -v $LFS/usr/lib/lib{bfd,ctf,ctf-nobfd,opcodes,sframe}.{a,la}
Detalhes deste pacote estão localizados na Seção 8.20.2, “Conteúdo do Binutils.”
O pacote GCC contém a GNU Compiler Collection, a qual inclui os compiladores C e C++.
Como na primeira construção do GCC, os pacotes GMP, MPFR e MPC são exigidos. Desempacote os tarballs e mova-os para os diretórios exigidos:
tar -xf ../mpfr-4.2.1.tar.xz mv -v mpfr-4.2.1 mpfr tar -xf ../gmp-6.3.0.tar.xz mv -v gmp-6.3.0 gmp tar -xf ../mpc-1.3.1.tar.gz mv -v mpc-1.3.1 mpc
Se construir em x86_64, [então] mude o nome padrão de diretório para bibliotecas de 64 bits para “lib”:
case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;; esac
Substitua a regra de construção dos cabeçalhos da libgcc e da libstdc++ para permitir construir essas bibliotecas com suporte a camadas POSIX:
sed '/thread_header =/s/@.*@/gthr-posix.h/' \ -i libgcc/Makefile.in libstdc++-v3/include/Makefile.in
Crie um diretório de construção separado novamente:
mkdir -v build cd build
Antes de iniciar a construção do GCC, lembre-se de desconfigurar quaisquer variáveis de ambiente que substituam os sinalizadores de otimização padrão.
Agora prepare o GCC para compilação:
../configure \ --build=$(../config.guess) \ --host=$LFS_TGT \ --target=$LFS_TGT \ LDFLAGS_FOR_TARGET=-L$PWD/$LFS_TGT/libgcc \ --prefix=/usr \ --with-build-sysroot=$LFS \ --enable-default-pie \ --enable-default-ssp \ --disable-nls \ --disable-multilib \ --disable-libatomic \ --disable-libgomp \ --disable-libquadmath \ --disable-libsanitizer \ --disable-libssp \ --disable-libvtv \ --enable-languages=c,c++
O significado das novas opções de configuração:
--with-build-sysroot=$LFS
Normalmente, usar --host
garante que um
compilador cruzado seja usado para construir o GCC e
que o compilador sabe que tem que procurar por
cabeçalhos e por bibliotecas em $LFS
. Porém, o sistema de construção
para o GCC usa outras ferramentas, que não estão
cientes desse local. Essa chave é necessária, de forma
que tais ferramentas procurarão pelos arquivos
necessários em $LFS
, e
não no anfitrião.
--target=$LFS_TGT
Nós estamos compilando cruzadamente o GCC, de forma que
é impossível construir bibliotecas alvo (libgcc
e libstdc++
) com os binários do GCC
compilados nesta passagem—esses binários não
executariam no anfitrião. O sistema de construção do
GCC tentará usar os compiladores C e C++ do anfitrião
como uma solução alternativa por padrão. Construir as
bibliotecas alvo do GCC com uma versão diferente do GCC
não é suportado, de forma que usar os compiladores do
anfitrião possivelmente cause falha de construção. Esse
parâmetro assegura que as bibliotecas sejam construídas
pelo GCC passagem 1.
LDFLAGS_FOR_TARGET=...
Permite que libstdc++
use
o libgcc
sendo construído
nessa passagem, em vez da versão anterior construída em
gcc-pass1. A versão
anterior não pode suportar adequadamente o tratamento
de exceções C++ porque foi construída sem suporte a
libc.
--disable-libsanitizer
Desabilita as bibliotecas sanitizadoras de tempo de
execução do GCC. Elas não são necessárias para a
instalação temporária. Em gcc-pass1 estava
implícito por --disable-libstdcxx
e
agora temos que passá-lo explicitamente.
Compile o pacote:
make
Instale o pacote:
make DESTDIR=$LFS install
Como um toque final, crie um link simbólico utilitário. Muitos aplicativos e scripts executam cc em vez de gcc, o que é usado para manter genéricos os aplicativos e, assim, utilizáveis em todos os tipos de sistemas UNIX onde o compilador GNU C nem sempre está instalado. Executar cc deixa o(a) administrador(a) do sistema livre para decidir qual compilador C instalar:
ln -sv gcc $LFS/usr/bin/cc
Detalhes acerca deste pacote estão localizados na Seção 8.29.2, “Conteúdo do GCC.”
Este capítulo mostra como construir os bits ausentes finais do sistema temporário: as ferramentas necessárias para construir os vários pacotes. Agora que todas as dependências circulares foram resolvidas, um ambiente “chroot”, completamente isolado do sistema operacional anfitrião (exceto pelo núcleo em execução), pode ser usado para a construção.
Para a operação adequada do ambiente isolado, alguma comunicação com o núcleo em execução precisa ser estabelecida. Isso é feito por meio dos assim chamados Sistemas de Arquivos Virtuais do Núcleo, que serão montados antes da entrada no ambiente chroot. Você possivelmente queira verificar se eles estão montados emitindo o comando findmnt.
Até a Seção 7.4, “Entrando no
Ambiente Chroot”, os comandos precisam ser executados como
root
, com a variável
LFS
configurada. Após a entrada no
chroot, todos os comandos são executados como root
, por sorte sem acesso ao SO do
computador no qual que você construiu o LFS. Seja cuidadoso(a)
de qualquer maneira, dado que é fácil destruir o sistema LFS
inteiro com comandos mau formados.
Os comandos no resto deste livro precisam ser realizados
enquanto logado(a) como usuário(a) root
e não mais como usuário(a)
lfs
. Também, verifique
duplamente se $LFS
está
configurada no ambiente do(a) root
.
Atualmente, a hierarquia de diretório inteira em $LFS
é de propriedade do(a) usuário(a)
lfs
, um(a) usuário(a) que
existe somente no sistema anfitrião. Se os diretórios e os
arquivos sob $LFS
forem mantidos
como estão, [então] eles serão de propriedade de um ID de
usuária(o) sem uma conta correspondente. Isso é perigoso, pois
uma conta de usuária(o) criada posteriormente poderia obter
esse mesmo ID de usuária(o) e se tornaria proprietária(o) de
todos os arquivos sob $LFS
, dessa
forma expondo esses arquivos a possível manipulação maliciosa.
Para endereçar esse problema, mude a propriedade dos diretórios
$LFS/*
para usuária(o)
root
executando o seguinte
comando:
chown --from lfs -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools} case $(uname -m) in x86_64) chown --from lfs -R root:root $LFS/lib64 ;; esac
Os aplicativos executando no espaço do(a) usuário(a) utilizam vários sistemas de arquivos criados pelo núcleo para comunicar com o próprio núcleo. Esses sistemas de arquivos são virtuais: nenhum espaço em disco é usado por eles. O conteúdo desses sistemas de arquivos reside em memória. Esses sistemas de arquivos precisam estar montados na árvore de diretórios $LFS, de modo que os aplicativos consigam encontrá-los no ambiente chroot.
Comece criando os diretórios nos quais esses sistemas de arquivos virtuais serão montados:
mkdir -pv $LFS/{dev,proc,sys,run}
Durante uma inicialização normal de um sistema LFS, o núcleo
automaticamente monta o sistema de arquivos devtmpfs
no diretório /dev
; o núcleo cria nós de dispositivo
naquele sistema de arquivos virtuais durante o processo de
inicialização ou quando um dispositivo for primeiro detectado
ou acessado. O daemon udev possivelmente mude a propriedade
ou as permissões dos nós de dispositivo criados pelo núcleo e
crie novos nós de dispositivo ou links simbólicos para
facilitar o trabalho dos(as) mantenedores(as) de distribuição
e de administradores(as) de sistema. (Veja-se o Seção 9.3.2.2,
“Criação de Nó de Dispositivo” para detalhes). Se o
núcleo do anfitrião suportar devtmpfs
, [então] nós podemos
simplesmente montar um devtmpfs
em $LFS/dev
e confiar no núcleo para povoá-lo.
Porém, alguns núcleos de anfitrião carecem de suporte a
devtmpfs
; essas distribuições
anfitriãs usam métodos diferentes para criar o conteúdo do
/dev
. Assim, a única maneira
agnóstica ao anfitrião para povoar o diretório $LFS/dev
é a de montar vinculadamente o
diretório /dev
do sistema
anfitrião. Uma montagem vinculada é um tipo especial de
montagem que produz uma sub árvore de diretórios ou de um
arquivo visível em algum outro local. Use o seguinte comando
para fazer isso.
mount -v --bind /dev $LFS/dev
Agora monte os restantes sistemas de arquivos virtuais do núcleo:
mount -vt devpts devpts -o gid=5,mode=0620 $LFS/dev/pts mount -vt proc proc $LFS/proc mount -vt sysfs sysfs $LFS/sys mount -vt tmpfs tmpfs $LFS/run
O significado das opções de montagem para devpts:
gid=5
Isso garante que todos os nós de dispositivos criados
pelo devpts são titularizados pelo ID de grupo 5. Esse
é o ID que usaremos mais tarde para o grupo
tty
. Nós usamos o ID de
grupo em vez de um nome, pois o sistema anfitrião pode
usar um ID diferente para o grupo tty
dele.
mode=0620
Isso garante que todos os nós de dispositivos criados pelo devpts tenham o modo 0620 (legível e escrevível por usuário(a), escrevível por grupo). Juntamente com a opção acima, isso garante que o devpts criará nós de dispositivos que atendam às exigências de grantpt(), significando que o binário auxiliar da Glibc pt_chown (que não é instalado por padrão) não é necessário.
Em alguns sistemas anfitriões, /dev/shm
é um link simbólico para um
diretório, tipicamente /run/shm
. O tmpfs do /run foi montado
acima, de modo que, nesse caso, somente um diretório precisa
ser criado com as permissões corretas.
Em outros sistemas anfitriões, /dev/shm
é um ponto de montagem para um
tmpfs. Nesse caso, a montagem do /dev acima somente criará
/dev/shm como um diretório no ambiente chroot. Nessa
situação, nós precisamos montar explicitamente um tmpfs:
if [ -h $LFS/dev/shm ]; then install -v -d -m 1777 $LFS$(realpath /dev/shm) else mount -vt tmpfs -o nosuid,nodev tmpfs $LFS/dev/shm fi
Agora que todos os pacotes que são exigidos para construir o
resto das ferramentas necessárias estão no sistema, é tempo de
entrar no ambiente chroot e finalizar a instalação das
ferramentas temporárias. Esse ambiente também será usado para
instalar o sistema final. Como usuária(o) root
, execute o seguinte comando para
entrar no ambiente que é, neste momento, povoado apenas com as
ferramentas temporárias:
chroot "$LFS" /usr/bin/env -i \ HOME=/root \ TERM="$TERM" \ PS1='(lfs chroot) \u:\w\$ ' \ PATH=/usr/bin:/usr/sbin \ MAKEFLAGS="-j$(nproc)
" \ TESTSUITEFLAGS="-j$(nproc)
" \ /bin/bash --login
Se você não quiser usar todos os núcleos lógicos disponíveis,
[então] substitua "$(nproc)
" pelo número de
núcleos lógicos que você deseja usar para construir pacotes
neste capítulo e nos capítulos seguintes. As suítes de teste de
alguns pacotes (notadamente "Autoconf", "Libtool" e "Tar") no
Capítulo 8
não são afetadas por "MAKEFLAGS
"; em
vez disso, elas usam uma variável de ambiente "TESTSUITEFLAGS
". Nós configuramos isso aqui
também para executar essas suítes de teste com vários núcleos.
A opção -i
dada para o
comando env
limpará todas as variáveis no ambiente chroot. Depois disso,
somente as variáveis HOME
,
TERM
, PS1
, e PATH
são
configuradas novamente. A construção TERM=$TERM
configura a variável
TERM
dentro do chroot para o mesmo
valor que fora do chroot. Essa variável é necessária, de modo
que aplicativos como o vim e o less possam operar
adequadamente. Se outras variáveis forem desejadas, tais como
CFLAGS
ou CXXFLAGS
, [então] esse é um bom lugar para
configurá-las.
Deste ponto em diante, não existe mais necessidade de usar a
variável LFS
, pois todo o trabalho
estará restrito ao sistema de arquivos do LFS; o comando
chroot executa o
shell Bash com o diretório raiz (/
) configurado para $LFS
.
Observe que /tools/bin
não está
no PATH
. Isso significa que o
conjunto de ferramentas cruzadas não mais será usado.
Observe também que o "prompt" do "bash" dirá "I have no name!
" Isso é normal porque o
arquivo "/etc/passwd
" ainda não
foi criado.
É importante que todos os comandos até o final deste capítulo e nos capítulos seguintes sejam executados de dentro do ambiente chroot. Se você deixar esse ambiente por qualquer razão (reinicializar, por exemplo), [então] certifique-se de que os sistemas de arquivos virtuais do núcleo estejam montados como explicado no Seção 7.3.1, “Montando e Povoando /dev” e no Seção 7.3.2, “Montando Sistemas de Arquivos Virtuais do Núcleo” e entre no chroot novamente antes de continuar com a instalação.
É tempo de criar a estrutura completa de diretórios no sistema de arquivos do LFS.
Alguns dos diretórios mencionados nesta seção possivelmente já tenham sido criados anteriormente com instruções explícitas ou quando da instalação de alguns pacotes. Elas estão repetidas abaixo para completude.
Crie alguns diretórios de nível de raiz que não estão no conjunto limitado exigido nos capítulos anteriores emitindo o seguinte comando:
mkdir -pv /{boot,home,mnt,opt,srv}
Crie o conjunto exigido de subdiretórios abaixo do nível de raiz emitindo os seguintes comandos:
mkdir -pv /etc/{opt,sysconfig} mkdir -pv /lib/firmware mkdir -pv /media/{floppy,cdrom} mkdir -pv /usr/{,local/}{include,src} mkdir -pv /usr/lib/locale mkdir -pv /usr/local/{bin,lib,sbin} mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man} mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo} mkdir -pv /usr/{,local/}share/man/man{1..8} mkdir -pv /var/{cache,local,log,mail,opt,spool} mkdir -pv /var/lib/{color,misc,locate} ln -sfv /run /var/run ln -sfv /run/lock /var/lock install -dv -m 0750 /root install -dv -m 1777 /tmp /var/tmp
Diretórios são, por padrão, criados com modo de permissão 755,
mas isso não é desejável em todos os lugares. Nos comandos
acima, duas mudanças são feitas—uma para o diretório home do(a)
usuário(a) root
e outra para os
diretórios para arquivos temporários.
A primeira mudança de modo assegura que nem toda pessoa possa
entrar no diretório "/root
"—o
mesmo que um(a) usuário(a) normal faria com o próprio diretório
"home" dele ou dela. A segunda mudança de modo garante que
qualquer usuário(a) consiga escrever nos diretórios
"/tmp
" e "/var/tmp
", mas não consiga remover deles os
arquivos de outros(as) usuários(as). A última é proibida pelo
assim chamado “sticky
bit”, o bit mais alto (1) na máscara de bits
1777.
Essa árvore de diretórios é baseada no Padrão de Hierarquia
de Sistema de Arquivos (Filesystem Hierarchy Standard - FHS)
(disponível em https://refspecs.linuxfoundation.org/fhs.shtml).
O FHS também especifica a existência opcional de diretórios
adicionais, tais como /usr/local/games
e /usr/share/games
. No LFS, nós criamos
apenas os diretórios que são realmente necessários.
Entretanto, sinta-se livre para criar mais diretórios, se
você desejar.
O FHS não impõe a existência do diretório /usr/lib64
e os(as) editores(as) do LFS
decidiram não usá-lo. Para as instruções no LFS e no BLFS
funcionarem corretamente, é imperativo que esse diretório
seja não existente. De tempos em tempos você deveria
verificar se ele não existe, pois é fácil criá-lo
inadvertidamente e isso provavelmente quebrará o seu
sistema.
Historicamente, o Linux manteve uma lista dos sistemas de
arquivos montados no arquivo /etc/mtab
. Os Núcleos modernos mantém essa
lista internamente e a expõem para o(a) usuário(a) via sistema
de arquivos /proc
. Para
satisfazer utilitários que esperam encontrar o /etc/mtab
, crie o seguinte link simbólico:
ln -sv /proc/self/mounts /etc/mtab
Crie um arquivo /etc/hosts
básico
para ser referenciado em algumas suítes de teste e em um dos
arquivos de configuração do Perl também:
cat > /etc/hosts << EOF
127.0.0.1 localhost $(hostname)
::1 localhost
EOF
Para que o(a) usuário(a) root
seja capaz de logar e para que o nome “root” seja
reconhecido, precisam existir entradas relevantes nos arquivos
/etc/passwd
e /etc/group
.
Crie o arquivo /etc/passwd
executando o seguinte comando:
cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/usr/bin/false
daemon:x:6:6:Daemon User:/dev/null:/usr/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/run/dbus:/usr/bin/false
systemd-journal-gateway:x:73:73:systemd Journal Gateway:/:/usr/bin/false
systemd-journal-remote:x:74:74:systemd Journal Remote:/:/usr/bin/false
systemd-journal-upload:x:75:75:systemd Journal Upload:/:/usr/bin/false
systemd-network:x:76:76:systemd Network Management:/:/usr/bin/false
systemd-resolve:x:77:77:systemd Resolver:/:/usr/bin/false
systemd-timesync:x:78:78:systemd Time Synchronization:/:/usr/bin/false
systemd-coredump:x:79:79:systemd Core Dumper:/:/usr/bin/false
uuidd:x:80:80:UUID Generation Daemon User:/dev/null:/usr/bin/false
systemd-oom:x:81:81:systemd Out Of Memory Daemon:/:/usr/bin/false
nobody:x:65534:65534:Unprivileged User:/dev/null:/usr/bin/false
EOF
A senha atual para root
será
configurada posteriormente.
Crie o arquivo /etc/group
executando o seguinte comando:
cat > /etc/group << "EOF"
root:x:0:
bin:x:1:daemon
sys:x:2:
kmem:x:3:
tape:x:4:
tty:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
cdrom:x:15:
adm:x:16:
messagebus:x:18:
systemd-journal:x:23:
input:x:24:
mail:x:34:
kvm:x:61:
systemd-journal-gateway:x:73:
systemd-journal-remote:x:74:
systemd-journal-upload:x:75:
systemd-network:x:76:
systemd-resolve:x:77:
systemd-timesync:x:78:
systemd-coredump:x:79:
uuidd:x:80:
systemd-oom:x:81:
wheel:x:97:
users:x:999:
nogroup:x:65534:
EOF
Os grupos criados não são parte de nenhum padrão—eles são
grupos decididos em parte pelas exigências da configuração do
Udev no Capítulo 9 e em parte pelas convenções comuns
empregadas por um número de distribuições Linux existentes.
Adicionalmente, algumas suítes de teste dependem de
usuárias(os) ou grupos específicas(os). A Linux Standard Base
(LSB, disponível em http://refspecs.linuxfoundation.org/lsb.shtml)
somente recomenda que, além do grupo root
com um ID de Grupo (GID) de 0, um
grupo bin
com um GID de 1
esteja presente. O GID de 5 é amplamente usado para o grupo
tty
e o número 5 também é usado
no systemd para o sistema de
arquivos devpts
. Todos os
outros nomes de grupo e GIDs podem ser escolhidos livremente
pelo(a) administrador(a) do sistema, uma vez que aplicativos
bem escritos não dependem de números de GID, mas sim usam o
nome do grupo.
O ID 65534 é usado pelo núcleo para NFS e espaços de nome de
usuário(a) separados para usuários(as) e grupos não
mapeados(as) (aqueles(as) existem no servidor NFS ou no espaço
de nome de usuário pai, porém “não existem” na máquina local ou no
espaço de nome separado). Nós atribuímos nobody
e nogroup
para evitar um ID não nomeado.
Porém, outras distribuições possivelmente tratem esse ID
diferentemente, de forma que qualquer aplicativo portável não
deveria depender dessa atribuição.
Alguns pacotes precisam de um código de idioma.
localedef -i C -f UTF-8 C.UTF-8
Alguns testes no Capítulo 8 precisam de um(a) usuário(a) regular. Nós adicionamos esse(a) usuário(a) aqui e deletamos essa conta ao final daquele capítulo.
echo "tester:x:101:101::/home/tester:/bin/bash" >> /etc/passwd echo "tester:x:101:" >> /etc/group install -o tester -d /home/tester
Para remover o prompt “I have no name!”, inicie um novo shell.
Uma vez que os arquivos /etc/passwd
e /etc/group
tenham sido criados, a resolução
de nome de usuária(o) e nome de grupo agora funcionará:
exec /usr/bin/bash --login
Os aplicativos login, agetty e init (e outros) usam um número de arquivos de registro para registrar informação, tais como quem esteve logada(o) no sistema e quando. Entretanto, esses aplicativos não escreverão nos arquivos de registro se eles já não existirem. Inicialize os arquivos de registro e dê a eles permissões adequadas:
touch /var/log/{btmp,lastlog,faillog,wtmp} chgrp -v utmp /var/log/lastlog chmod -v 664 /var/log/lastlog chmod -v 600 /var/log/btmp
O arquivo /var/log/wtmp
registra
todos os logins e logouts. O arquivo /var/log/lastlog
registra quando cada
usuária(o) se logou pela última vez. O arquivo /var/log/faillog
registra tentativas de login
falhas. O arquivo /var/log/btmp
registra tentativas de login inválidas.
Os arquivos wtmp
, btmp
e lastlog
usam números inteiros de 32 bits
para carimbo de tempo e eles serão fundamentalmente quebrados
depois do ano 2038. Muitos pacotes pararam de usá-los e
outros pacotes pararão de usá-los. Não confie no conteúdo
deles para nada. Provavelmente é melhor considerá-los
obsoletos.
O pacote Gettext contém utilitários para internacionalização e localização. Eles permitem que aplicativos sejam compilados com Suporte ao Idioma Nativo (Native Language Support - NLS), habilitando-os a emitir mensagens no idioma nativo do(a) usuário(a).
Para nosso conjunto temporário de ferramentas, nós precisamos somente instalar três aplicativos originários do Gettext.
Prepare o Gettext para compilação:
./configure --disable-shared
O significado da opção de configure:
--disable-shared
Nós não precisamos instalar quaisquer das bibliotecas compartilhadas do Gettext nesta ocasião, assim não existe necessidade de construí-las.
Compile o pacote:
make
Instale os aplicativos msgfmt, msgmerge e xgettext:
cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin
Detalhes acerca deste pacote estão localizados na Seção 8.33.2, “Conteúdo do Gettext.”
O pacote Bison contém um gerador de analisador.
Prepare o Bison para compilação:
./configure --prefix=/usr \ --docdir=/usr/share/doc/bison-3.8.2
O significado da nova opção do configure:
--docdir=/usr/share/doc/bison-3.8.2
Isso diz ao sistema de construção para instalar a documentação do bison em um diretório versionado.
Compile o pacote:
make
Instale o pacote:
make install
Detalhes acerca deste pacote estão localizados na Seção 8.34.2, “Conteúdo do Bison.”
O pacote Perl contém o Practical Extraction and Report Language.
Prepare o Perl para compilação:
sh Configure -des \ -D prefix=/usr \ -D vendorprefix=/usr \ -D useshrplib \ -D privlib=/usr/lib/perl5/5.40/core_perl \ -D archlib=/usr/lib/perl5/5.40/core_perl \ -D sitelib=/usr/lib/perl5/5.40/site_perl \ -D sitearch=/usr/lib/perl5/5.40/site_perl \ -D vendorlib=/usr/lib/perl5/5.40/vendor_perl \ -D vendorarch=/usr/lib/perl5/5.40/vendor_perl
O significado das opções do "Configure":
-des
Essa é uma combinação de três opções: -d usa padrões para todos os itens; -e assegura completamento de todas as tarefas; -s silencia saída gerada não essencial.
-D
vendorprefix=/usr
Isso garante que perl saiba como dizer aos pacotes onde eles deveriam instalar os módulos "Perl" deles.
-D
useshrplib
Construa a libperl
,
necessária para alguns módulos "Perl", como uma
biblioteca compartilhada, em vez de uma biblioteca
estática.
-D
privlib,-D archlib,-D sitelib,...
Essas configurações definem onde o "Perl" procura os módulos instalados. Os(As) editores(as) do LFS optaram por colocá-los em uma estrutura de diretórios baseada na versão PRINCIPAL.SECUNDÁRIA do "Perl" (5.40) que permite atualizar o "Perl" para níveis de remendo mais recentes (o nível de remendo é a última parte separada por pontos na sequência completa de caracteres da versão, como 5.40.0) sem reinstalar todos os módulos.
Compile o pacote:
make
Instale o pacote:
make install
Detalhes acerca deste pacote estão localizados na Seção 8.43.2, “Conteúdo do Perl.”
O pacote Python 3 contém o ambiente de desenvolvimento do Python. Ele é útil para programação orientada a objeto, escrita de scripts, prototipagem de aplicativos grandes e desenvolvimento de aplicações inteiras. Python é uma linguagem interpretada de computador.
Existem dois arquivos de pacotes cujos nomes se iniciam com
o prefixo “python”. Aquele a se extrair a partir
dele é Python-3.12.5.tar.xz
(perceba a primeira letra maiúscula).
Prepare o Python para compilação:
./configure --prefix=/usr \ --enable-shared \ --without-ensurepip
O significado da opção de configure:
--enable-shared
Essa chave impede a instalação de bibliotecas estáticas.
--without-ensurepip
Essa chave desabilita o instalador de pacote do Python, o qual não é necessário neste estágio.
Compile o pacote:
make
Alguns módulos do Python 3 não podem ser construídos agora,
pois as dependências não estão instaladas ainda. Para o
módulo ssl
, uma mensagem
Python requires a OpenSSL
1.1.1 or newer
é gerada. A mensagem deveria ser
ignorada. Apenas tenha certeza de que o comando de nível
superior make
não tenha falhado. Os módulos opcionais não são necessários
agora e eles serão construídos no Capítulo 8.
Instale o pacote:
make install
Detalhes acerca deste pacote estão localizados na Seção 8.52.2, “Conteúdo do Python 3.”
O pacote Texinfo contém aplicativos para leitura, escrita e conversão de páginas info.
Prepare o Texinfo para compilação:
./configure --prefix=/usr
Compile o pacote:
make
Instale o pacote:
make install
Detalhes acerca deste pacote estão localizados na Seção 8.72.2, “Conteúdo do Texinfo.”
O pacote Util-linux contém diversos aplicativos utilitários.
O FHS recomenda usar o diretório /var/lib/hwclock
em vez do usual diretório
/etc
como o local para o
arquivo adjtime
. Crie esse
diretório com:
mkdir -pv /var/lib/hwclock
Prepare o Util-linux para compilação:
./configure --libdir=/usr/lib \ --runstatedir=/run \ --disable-chfn-chsh \ --disable-login \ --disable-nologin \ --disable-su \ --disable-setpriv \ --disable-runuser \ --disable-pylibmount \ --disable-static \ --disable-liblastlog2 \ --without-python \ ADJTIME_PATH=/var/lib/hwclock/adjtime \ --docdir=/usr/share/doc/util-linux-2.40.2
O significado das opções do configure:
ADJTIME_PATH=/var/lib/hwclock/adjtime
Isso configura o local do arquivo gravando informação acerca do relógio de hardware de acordo com o FHS. Isso não é estritamente necessário para essa ferramenta temporária, porém impede a criação de um arquivo em outro local, o qual não seria sobrescrito ou removido quando da construção do pacote util-linux final.
--libdir=/usr/lib
Essa chave assegura que os links simbólicos
.so
apontem para o
arquivo de biblioteca compartilhada no mesmo diretório
(/usr/lib
) diretamente.
--disable-*
Essas chaves evitam avisos acerca de componentes de construção que exigem pacotes que não estão no LFS ou ainda não estão instalados.
--without-python
Essa chave desabilita o uso do Python. Ela evita tentar construir ligações desnecessárias.
runstatedir=/run
Essa chave configura corretamente o local do soquete
usado por uuidd e libuuid
.
Compile o pacote:
make
Instale o pacote:
make install
Detalhes acerca deste pacote estão localizados na Seção 8.80.2, “Conteúdo do Util-linux.”
Primeiro, remova a documentação atualmente instalada para evitar que ela termine no sistema final e para salvar cerca de 35 MB:
rm -rf /usr/share/{info,man,doc}/*
Segundo, em um sistema moderno Linux, os arquivos libtool.la somente são úteis para a libltdl. Nenhuma biblioteca no LFS é carregada pela libltdl e é sabido que alguns arquivos .la podem causar falhas de pacote do BLFS. Remova tais arquivos agora:
find /usr/{lib,libexec} -name \*.la -delete
O tamanho atual do sistema é agora de cerca de 3 GB, entretanto o diretório /tools não mais é necessário. Ele usa cerca de 1 GB de espaço de disco. Delete ele agora:
rm -rf /tools
Neste ponto, os aplicativos e bibliotecas essenciais foram criados e o seu sistema LFS atual está em um bom estado. Seu sistema agora pode ser copiado para posterior reuso. Em caso de falhas fatais nos capítulos subsequentes, frequentemente acontece que remover tudo e começar de novo (mais cuidadosamente) é a melhor maneira para recuperar. Infelizmente, todos os arquivos temporários serão removidos, também. Para evitar desperdiçar tempo extra para refazer tudo o que tenha sido feito com sucesso, criar uma cópia de segurança do sistema LFS atual possivelmente se prove útil.
Todos os passos restantes nesta seção são opcionais. Apesar disso, tão logo você comece a instalar pacotes no Capítulo 8, os arquivos temporários serão sobrescritos. Assim, possivelmente seja uma boa ideia fazer uma cópia de segurança do sistema atual conforme descrito abaixo.
Os passos seguintes são realizados a partir do lado de fora
do ambiente chroot. Isso significa que você tem de deixar o
ambiente chroot primeiro antes de continuar. A razão para
isso é a de conseguir acesso a locais do sistema de arquivos
do lado de fora do ambiente chroot para armazenar/ler o
arquivamento da cópia de segurança, o qual convém não ser
colocado dentro da hierarquia do $LFS
.
Se você decidiu fazer uma cópia de segurança, [então] deixe o ambiente chroot:
exit
Todas as instruções seguintes são executadas pelo(a)
root
no seu sistema
anfitrião. Tome cuidado extra acerca dos comandos que você
vai executar, uma vez que erros cometidos aqui podem
modificar seu sistema anfitrião. Esteja ciente de que a
variável de ambiente LFS
está
configurada para usuário(a) lfs
por padrão, porém possivelmente
não esteja
configurada para root
.
Sempre que comandos forem ser executados por root
, tenha certeza de que você
configurou LFS
.
Isso foi discutido na Seção 2.6, “Configurando a Variável $LFS.”
Antes de fazer uma cópia de segurança, desmonte os sistemas de arquivos virtuais:
mountpoint -q $LFS/dev/shm && umount $LFS/dev/shm umount $LFS/dev/pts umount $LFS/{sys,proc,run,dev}
Tenha certeza de que tem pelo menos um (01) GB de espaço livre no disco (os tarballs do fonte serão incluídos no arquivamento da cópia de segurança) no sistema de arquivos contendo o diretório onde você criar o arquivamento da cópia de segurança.
Observe que as instruções abaixo especificam o diretório home
do(a) usuário(a) root
do
sistema anfitrião, o qual tipicamente é encontrado no sistema
de arquivos raiz. Substitua $HOME
por um diretório da sua escolha se não quiser ter a cópia de
segurança armazenada no diretório home do(a)root
.
Crie o arquivamento da cópia de segurança executando o seguinte comando:
Por causa de que o arquivamento da cópia de segurança é comprimido, dura um tempo relativamente longo (mais que dez (10) minutos) mesmo em um sistema razoavelmente rápido.
cd $LFS tar -cJpf $HOME/lfs-temp-tools-12.2-systemd.tar.xz .
Se continuar para o capítulo 8, [então] não se esqueça de entrar novamente no ambiente chroot conforme explicado na caixa “Importante” abaixo.
No caso de alguns erros tiverem sido cometidos e você
precisar começar de novo, você pode usar essa cópia de
segurança para restaurar o sistema e economizar algum tempo
de recuperação. Desde que os fontes estão localizados sob
$LFS
, eles são incluídos no
arquivamento da cópia de segurança também, de forma que não
precisam ser transferidos novamente. Após verificar se
$LFS
está configurada
adequadamente, você consegue restaurar a cópia de segurança
executando os seguintes comandos:
Os seguintes comandos são extremamente perigosos. Se você
executar rm -rf
./* como o(a) usuário(a) root
e você não mudar para o diretório
$LFS ou a variável de ambiente LFS
não estiver configurada para o(a)
usuário(a) root
, [então]
isso destruirá seu sistema anfitrião inteiro. VOCÊ ESTÁ
AVISADO(A).
cd $LFS
rm -rf ./*
tar -xpf $HOME/lfs-temp-tools-12.2-systemd.tar.xz
Novamente, verifique duplamente se o ambiente foi configurado adequadamente e continue construindo o resto do sistema.
Se você deixou o ambiente chroot para criar uma cópia de segurança ou reiniciar a construção usando um restauro, [então] lembre-se de verificar se os sistemas de arquivos virtuais ainda estão montados (findmnt | grep $LFS). Se eles não estiverem montados, [então] remonte-os agora conforme descrito na Seção 7.3, “Preparando Sistemas de Arquivos Virtuais do Núcleo” e entre novamente no ambiente chroot (veja-se a Seção 7.4, “Entrando no Ambiente Chroot”) antes de continuar.
Neste capítulo, nós começamos a construir o sistema LFS pra valer.
A instalação desse software é direta. Embora em muitos casos as instruções de instalação pudessem ser mais curtas e mais genéricas, nós optamos por fornecer as instruções completas para cada pacote para minimizar as possibilidades de erros. A chave para aprender o que faz um sistema Linux funcionar é a de saber para que cada pacote é usado e porque você (ou o sistema) possivelmente precise dele.
Nós não recomendamos usar otimizações personalizadas. Elas
podem fazer com que um aplicativo execute ligeiramente mais
rápido, mas elas também possivelmente causem dificuldades de
compilação e problemas quando executar o aplicativo. Se um
pacote se recusar a compilar com uma otimização personalizada,
[então] tente compilá-lo sem otimização e veja se isso corrige
o problema. Mesmo se o pacote compilar quando usar uma
otimização personalizada, existe o risco de que ele
possivelmente tenha sido compilado incorretamente devido às
complexas interações entre o código e as ferramentas de
construção. Observe também que as opções -march
e -mtune
usando valores não especificados no livro não foram testadas.
Isso possivelmente cause problemas com os pacotes do conjunto
de ferramentas (Binutils, GCC e Glibc). Os pequenos ganhos
potenciais alcançados personalizando-se otimizações de
compilador frequentemente são superados pelos riscos.
Construtoras(es) de primeira vez do LFS são encorajadas(os) a
construir sem otimizações personalizadas.
Por outro lado, nós mantemos as otimizações habilitadas pela
configuração padrão dos pacotes. Adicionalmente, as vezes, nós
explicitamente habilitamos uma configuração otimizada fornecida
por um pacote, porém não habilitada por padrão. Os(As)
mantenedores(as) do pacote já testaram essas configurações e as
consideraram seguras, de modo que não é provável que elas
quebrariam a construção. Geralmente, a configuração padrão já
habilita O2
ou O3
, de forma que o sistema resultante ainda
executará muito rápido sem qualquer otimização personalizada e
será estável ao mesmo tempo.
Antes das instruções de instalação, cada página de instalação fornece informação a respeito do pacote, incluindo uma descrição concisa do que ele contém, aproximadamente quando tempo levará para construir, e quanto espaço de disco é exigido durante esse processo de construção. Seguindo as instruções de instalação, existe uma lista de aplicativos e de bibliotecas (juntamente com breves descrições) que o pacote instala.
Os valores da UPC e espaço em disco exigido incluem dados da suíte de teste para todos os pacotes aplicáveis no Capítulo 8. Os valores da UPC foram calculados usando quatro núcleos da CPU (-j4) para todas as operações, a menos que especificado do contrário.
Em geral, as(os) editoras(es) do LFS desencorajam construir e instalar bibliotecas estáticas. A maior parte das bibliotecas estáticas tem sido tornada obsoleta em um sistema moderno Linux. Além disso, vincular uma biblioteca estática a um aplicativo pode ser prejudicial. Se uma atualização para a biblioteca for necessária para remover um problema de segurança, [então] cada aplicativo que usar a biblioteca estática precisará ser vinculado novamente à nova biblioteca. Como o uso de bibliotecas estáticas nem sempre é óbvio, os aplicativos relevantes (e os procedimentos necessários para fazer a vinculação) possivelmente nem mesmo sejam conhecidos.
Os procedimentos neste capítulo removem ou desabilitam a
instalação da maioria das bibliotecas estáticas. Usualmente
isso é feito passando-se uma opção --disable-static
para o configure. Em outros casos,
meios alternativos são necessários. Em uns poucos casos,
especialmente Glibc e GCC, o uso de bibliotecas estáticas
permanece um recurso essencial do processo de construção do
pacote.
Para uma discussão mais completa acerca de bibliotecas, veja-se Bibliotecas: Estática ou compartilhada? no livro BLFS.
Gerenciamento de Pacote é uma adição frequentemente solicitada ao Livro LFS. Um Gerenciador de Pacote rastreia a instalação de arquivos, tornando mais fácil remover e atualizar pacotes. Um bom gerenciador de pacote também lidará com os arquivos de configuração, especialmente para manter a configuração do(a) usuário(a) quando o pacote for reinstalado ou atualizado. Antes que você comece a questionar, NÃO—esta seção não falará nem recomendará qualquer gerenciador de pacote em particular. O que ela fornece é um resumo acerca das técnicas mais populares e como elas funcionam. O gerenciador de pacote perfeito para você possivelmente esteja entre essas técnicas ou possivelmente seja uma combinação de duas ou mais dessas técnicas. Esta seção menciona brevemente problemas que possivelmente surjam quando da atualização de pacotes.
Algumas razões porque nenhum gerenciador de pacote é mencionado no LFS ou no BLFS incluem:
Lidar com gerenciamento de pacote retira o foco das finalidades desses livros—ensinar como um sistema Linux é construído.
Existem múltiplas soluções para gerenciamento de pacote, cada uma tendo seus pontos fortes e fracos. Encontrar uma solução que satisfaça todas as audiências é difícil.
Existem algumas dicas escritas no tópico do gerenciamento de pacote. Visite o Hints Project e veja se uma delas se adéqua às suas necessidades.
Um Gerenciador de Pacote torna fácil atualizar para versões mais novas quando elas são liberadas. Geralmente as instruções nos livros LFS e BLFS podem ser usadas para atualizar para as versões mais novas. Aqui estão alguns pontos que você deveria estar ciente quando da atualização de pacotes, especialmente em um sistema em execução.
Se o núcleo Linux precisar ser atualizado (por exemplo, de 5.10.17 para 5.10.18 ou 5.11.1), [então] nada mais precisa ser reconstruído. O sistema seguirá funcionando bem graças à interface bem definida entre o núcleo e o espaço de usuária(o). Especificamente, os cabeçalhos da API do Linux não precisam ser atualizados juntamente com o núcleo. Você meramente precisará reiniciar o teu sistema para usar o núcleo atualizado.
Se a Glibc precisar ser atualizada para uma versão mais recente (por exemplo, da Glibc-2.36 para a Glibc-2.40), [então] algumas etapas extras serão necessárias para evitar quebrar o sistema. Leia-se Seção 8.5, “Glibc-2.40” para detalhes.
Se um pacote contendo uma biblioteca compartilhada for
atualizado e se o nome da biblioteca mudar, então
quaisquer pacotes dinamicamente vinculados à biblioteca
precisam ser recompilados, para vincular contra a
biblioteca mais nova. (Observe que não existe
correlação entre a versão de pacote e o nome da
biblioteca). Por exemplo, considere um pacote foo-1.2.3
que instala uma biblioteca compartilhada com o nome
libfoo.so.1
. Suponha que
você atualize o pacote para uma versão mais nova
foo-1.2.4 que instala uma biblioteca compartilhada com
o nome libfoo.so.2
. Nesse
caso, quaisquer pacotes que estiverem dinamicamente
vinculados à libfoo.so.1
precisam ser recompilados para vincular contra
libfoo.so.2
com a
finalidade de usar a nova versão da biblioteca. Você
não deveria remover as bibliotecas antigas até que
todos os pacotes dependentes tenham sido recompilados.
Se um pacote estiver (direta ou indiretamente)
vinculado aos nomes antigo e novo de uma biblioteca
compartilhada (por exemplo, o pacote aponta para
libfoo.so.2
e
libbar.so.1
, enquanto o
último se vincula a libfoo.so.3
), [então] o pacote
possivelmente funcione mal, pois as diferentes revisões
da biblioteca compartilhada apresentam definições
incompatíveis para alguns nomes de símbolo. Isso pode
ser causado pela recompilação de alguns, mas não todos,
dos pacotes vinculados à antiga biblioteca
compartilhada depois que o pacote que fornece a
biblioteca compartilhada for atualizado. Para evitar o
problema, os(as) usuários(as) precisarão reconstruir
cada pacote vinculado a uma biblioteca compartilhada
com uma revisão atualizada (por exemplo, libfoo.so.2
para libfoo.so.3) o mais rápido possível.
Se um pacote contendo uma biblioteca compartilhada for
atualizado e o nome da biblioteca não mudar, porém o
número de versão do arquivo da biblioteca
decrescer (por exemplo, a biblioteca ainda é chamada de
libfoo.so.1
, porém o nome
do arquivo da biblioteca for mudado de libfoo.so.1.25
para libfoo.so.1.24
), [então] você deveria
remover o arquivo da biblioteca originário da versão
previamente instalada (libfoo.so.1.25
nesse caso). Do
contrário, um comando ldconfig (invocado
por você mesmo(a) a partir da linha de comando ou pela
instalação de algum pacote) reconfigurará o link
simbólico libfoo.so.1
para apontar para o antigo arquivo da biblioteca, pois
ele aparenta ser uma versão “mais nova”;
o número de versão dele é mais largo. Essa situação
possivelmente surge se você tiver que desatualizar um
pacote ou se os(as) autores(as) mudarem o esquema de
versionamento para arquivos de biblioteca.
Se um pacote contendo uma biblioteca compartilhada for
atualizado e o nome da biblioteca não mudar, porém um
problema severo (especialmente, uma vulnerabilidade de
segurança) for corrigido, [então] todos os aplicativos
em execução vinculados à biblioteca compartilhada
deveriam ser reiniciados. O seguinte comando, executado
como root
depois que a
atualização estiver completa, listará quais processos
estão usando as versões antigas daquelas bibliotecas
(substitua libfoo
pelo nome da
biblioteca):
grep -l 'libfoo
.*deleted' /proc/*/maps | tr -cd 0-9\\n | xargs -r ps u
Se o OpenSSH estiver sendo usado para acessar o sistema e ele estiver vinculado à biblioteca atualizada, [então] você precisa reiniciar o serviço sshd, então deslogar-se, logar-se novamente e executar o comando precedente novamente para confirmar se nada ainda está usando as bibliotecas deletadas.
Se o daemon systemd (executando
como o PID 1) for vinculado à biblioteca atualizada,
[então] você pode reiniciá-lo sem reinicializar
executando systemctl
daemon-reexec como o(a) usuário(a)
root
.
Se um aplicativo executável ou uma biblioteca compartilhada for sobrescrito, [então] os processos usando o código ou os dados naquele aplicativo ou biblioteca possivelmente quebrem. A maneira correta para atualizar um aplicativo ou uma biblioteca compartilhada sem causar quebra ao processo é a de removê-lo primeiro, então instalar a versão nova. O comando install fornecido por coreutils já implementou isso e a maioria dos pacotes usa esse comando para instalar arquivos binários e bibliotecas. Isso significa que você não estaria encrencada(o) por esse problema a maior parte do tempo. Entretanto, o processo de instalação de alguns pacotes (notadamente "SpiderMonkey" no BLFS) apenas sobrescreve o arquivo se ele existir; isso causa uma quebra. Assim, é mais seguro salvar seu trabalho e fechar processos em execução desnecessários antes de atualizar um pacote.
As seguintes são algumas técnicas comuns de gerenciamento de pacote. Antes de se decidir acerca de um gerenciador de pacote, pesquise sobre as várias técnicas, particularmente os pontos fracos de cada esquema em particular.
Sim, essa é uma técnica de gerenciamento de pacote. Algumas pessoas não necessitam de um gerenciador de pacote, pois elas conhecem os pacotes intimamente e sabem quais arquivos estão instalados por cada pacote. Alguns(mas) usuários(as) também não precisam de qualquer gerenciamento de pacote, pois eles(as) planejam reconstruir o sistema inteiro sempre que um pacote for mudado.
Essa é uma técnica simplista de gerenciamento de pacotes
que não precisa de um aplicativo especial para gerenciar os
pacotes. Cada pacote é instalado em um diretório separado.
Por exemplo, o pacote "foo-1.1" é instalado em
"/opt/foo-1.1
" e um link
simbólico é feito de "/opt/foo
" para "/opt/foo-1.1
". Quando uma nova versão
"foo-1.2" surge, ela é instalada em "/opt/foo-1.2
" e o link simbólico anterior
é substituído por um link simbólico para a nova versão.
Variáveis de ambiente, como "PATH
", "MANPATH
",
"INFOPATH
", "PKG_CONFIG_PATH
", "CPPFLAGS
", "LDFLAGS
", e o arquivo de configuração
"/etc/ld.so.conf
",
possivelmente precisem ser expandidas para incluir os
subdiretórios correspondentes em "/opt/foo -x.y
".
Esse esquema é usado pelo livro BLFS para instalar alguns pacotes muito grandes para facilitar a atualização deles. Se você instalar mais que alguns pacotes, [então] esse esquema se tornará ingerenciável. E alguns pacotes (por exemplo, os cabeçalhos de "API" do "Linux" e "Glibc") possivelmente não funcionem bem com esse esquema. Nunca use esse esquema em todo o sistema.
Essa é uma variação da técnica de gerenciamento de pacote
anterior. Cada pacote é instalado como no esquema anterior.
Mas, em vez de fazer o link simbólico via um nome genérico
de pacote, cada arquivo é simbolicamente vinculado à
hierarquia /usr
. Isso remove
a necessidade de expandir as variáveis de ambiente. Ainda
que os links simbólicos possam ser criados pelo(a)
usuário(a), muitos gerenciadores de pacote usam essa
abordagem e automatizam a criação dos links simbólicos.
Alguns dos populares inclui Stow, Epkg, Graft, e Depot.
O script de instalação precisa ser falseado, de modo que o
pacote pense que está instalado em /usr
, ainda que, na realidade, ele esteja
instalado na hierarquia /usr/pkg
. Instalar dessa maneira
geralmente não é uma tarefa trivial. Por exemplo, suponha
que você está instalando um pacote libfoo-1.1. As seguintes
instruções possivelmente não instalem adequadamente o
pacote:
./configure --prefix=/usr/pkg/libfoo/1.1 make make install
A instalação funcionará, mas os pacotes dependentes
possivelmente não se vinculem à libfoo conforme você
esperaria. Se você compilar um pacote que se vincula contra
a libfoo, [então] você possivelmente perceba que ele está
vinculado a /usr/pkg/libfoo/1.1/lib/libfoo.so.1
em
vez de /usr/lib/libfoo.so.1
como você esperaria. A abordagem correta é a de usar a
variável DESTDIR
para direcionar
a instalação. Essa abordagem funciona como se segue:
./configure --prefix=/usr make make DESTDIR=/usr/pkg/libfoo/1.1 install
A maioria dos pacotes suporta essa abordagem, mas existem
alguns que não. Para os pacotes não conformes, você
possivelmente ou precise instalar manualmente o pacote, ou
você possivelmente ache que é mais fácil instalar alguns
pacotes problemáticos em /opt
.
Nessa técnica, um arquivo é carimbado temporalmente antes da instalação do pacote. Depois da instalação, um simples uso do comando find com as opções apropriadas consegue gerar um registro de todos os arquivos instalados após o arquivo de carimbo de tempo ser criado. Um gerenciador de pacote que use essa abordagem é instalação-registro.
Ainda que esse esquema tenha a vantagem de ser simples, ele tem duas desvantagens. Se, durante a instalação, os arquivos forem instalados com algum outro carimbo de tempo que não a hora atual, [então] aqueles arquivos não serão rastreados pelo gerenciador de pacote. Além disso, esse esquema pode ser usado apenas quando um pacote for instalado de cada vez. Os registros não são confiáveis se dois pacotes forem instalados simultaneamente a partir de dois consoles.
Nessa abordagem, os comandos que os scripts de instalação realizam são gravados. Existem duas técnicas que se pode usar:
A variável de ambiente LD_PRELOAD
pode ser configurada para apontar
para uma biblioteca a ser pré-carregada antes da
instalação. Durante a instalação, essa biblioteca rastreia
os pacotes que estão sendo instalados anexando-se a vários
executáveis, tais como o cp, o installe o mv, e rastreando as
chamadas de sistema que modificam o sistema de arquivos.
Para essa abordagem funcionar, todos os executáveis
precisam ser dinamicamente vinculados sem o bit suid ou
sgid. Pré-carregar a biblioteca possivelmente cause alguns
efeitos colaterais indesejados durante a instalação.
Portanto, é uma boa ideia realizar alguns testes para
garantir que o gerenciador de pacote não quebre nada e que
ele registre todos os arquivos adequados.
Outra técnica é a de usar o strace, que registra todas as chamadas de sistema feitas durante a execução dos scripts de instalação.
Nesse esquema, a instalação do pacote é falseada em uma árvore separada como descrito previamente na seção do gerenciamento de pacote estilo Link Simbólico. Depois da instalação, um arquivamento de pacote é criado usando os arquivos instalados. Esse arquivamento é então usado para instalar o pacote na máquina local ou até mesmo em outras máquinas.
Essa abordagem é a usada pela maioria dos gerenciadores de pacote encontrados nas distribuições comerciais. Exemplos de gerenciadores de pacote que seguem essa abordagem são RPM (o qual, incidentalmente, é exigido pela Linux Standard Base Specification), pkg-utils, apt do Debian, e sistema Portage do Gentoo. Uma dica descrevendo como adotar esse estilo de gerenciamento de pacote para sistemas LFS está localizada em https://www.linuxfromscratch.org/hints/downloads/files/fakeroot.txt.
A criação de arquivos de pacote que incluem informação de dependência é complexa e além do escopo do LFS.
O Slackware usa um sistema baseado em tar para arquivamentos de pacote. Esse sistema intencionalmente não manuseia dependências de pacote como gerenciadores de pacote mais complexos fazem. Para detalhes de gerenciamento de pacote do Slackware, veja-se http://www.slackbook.org/html/package-management.html.
Esse esquema, único para LFS, foi concebido por Matthias Benkmann e está disponível a partir do Hints Project. Nesse esquema, cada pacote é instalado como uma(m) usuária(o) separada(o) nos locais padrão. Arquivos pertencentes a um pacote são facilmente identificados checando o ID de usuária(o). As características e deficiências dessa abordagem são muito complexas para serem descritas nesta seção. Para os detalhes, por favor veja-se a dica em https://www.linuxfromscratch.org/hints/downloads/files/more_control_and_pkg_man.txt.
Uma das vantagens de um sistema LFS é a de que não existem
arquivos que dependam da posição de arquivos em um sistema de
disco. Clonar uma construção do LFS para outro computador com
a mesma arquitetura que a do sistema base é tão simples
quanto usar tar
na partição do LFS que contém o diretório raiz (cerca de
900MB descomprimido para uma construção básica do LFS),
copiando aquele arquivo via transferência de rede ou
CD-ROM/stick USB para o novo sistema e expandindo-o. Depois
disso, uns poucos arquivos de configuração terão que ser
mudados. Arquivos de configuração que possivelmente precisem
ser atualizados incluem: /etc/hosts
, /etc/fstab
, /etc/passwd
, /etc/group
, /etc/shadow
e
/etc/ld.so.conf
.
Um núcleo personalizado possivelmente seja necessário para o novo sistema, dependendo das diferenças no hardware do sistema e a configuração original do núcleo.
Tem havido alguns relatos de problemas quando da cópia entre arquiteturas similares, porém não idênticas. Por exemplo, o conjunto de instruções para um sistema Intel não é idêntico às instruções do processador AMD, e versões posteriores de alguns processadores possivelmente forneçam instruções que estão indisponíveis em versões anteriores.
Finalmente, o novo sistema tem de ser tornado inicializável via Seção 10.4, “Usando o GRUB para Configurar o Processo de Inicialização”.
O pacote Man-pages contém mais que 2.400 páginas de manual.
Remova duas páginas de manual para funções de resumo de senha. Libxcrypt fornecerá uma versão melhor dessas páginas de manual:
rm -v man3/crypt*
Instale as Páginas de Manual executando:
make prefix=/usr install
O pacote Iana-Etc fornece dados para serviços e protocolos de rede de comunicação.
Para esse pacote, nós precisamos somente copiar os arquivos para o lugar:
cp services protocols /etc
O pacote Glibc contém a principal biblioteca C. Essa biblioteca fornece as rotinas básicas para alocação de memória, busca em diretórios, abertura e fechamento de arquivos, leitura e escrita de arquivos, manuseio de sequências de caracteres, correspondência de padrões, aritmética, e daí por diante.
Alguns dos aplicativos Glibc usam o diretório não conforme
com o FHS /var/db
para
armazenar os dados em tempo de execução deles. Aplique o
seguinte remendo para fazer com que tais aplicativos
armazenem os dados em tempo de execução deles nos locais
conformes com o FHS:
patch -Np1 -i ../glibc-2.40-fhs-1.patch
A documentação da Glibc recomenda construir a Glibc em um diretório dedicado à construção:
mkdir -v build cd build
Garanta que os utilitários ldconfig e sln serão instalados no
/usr/sbin
:
echo "rootsbindir=/usr/sbin" > configparms
Prepare a Glibc para compilação:
../configure --prefix=/usr \ --disable-werror \ --enable-kernel=4.19 \ --enable-stack-protector=strong \ --disable-nscd \ libc_cv_slibdir=/usr/lib
O significado das opções do configure:
--disable-werror
Essa opção desabilita a opção -Werror passada para o GCC. Isso é necessário para executar a suíte de teste.
--enable-kernel=4.19
Essa opção diz ao sistema de construção que esta Glibc possivelmente seja usada com núcleos tão antigos quanto 4.19. Isso significa que a geração de contornos, no caso de uma chamada de sistema introduzida em uma versão posterior, não pode ser usada.
--enable-stack-protector=strong
Essa opção aumenta a segurança do sistema adicionando
código extra para verificar estouros de buffer, como
ataques de esmagamento de pilha. Observe que a Glibc
sempre substitui explicitamente o padrão do GCC, de
forma que essa opção ainda é necessária mesmo que já
tenhamos especificado --enable-default-ssp
para GCC.
--disable-nscd
Não construa o processo de segundo plano de armazenamento temporário do serviço de nomes, o qual não mais é usado.
libc_cv_slibdir=/usr/lib
Essa variável configura a biblioteca correta para todos os sistemas. Nós não queremos que a lib64 seja usada.
Compile o pacote:
make
Nesta seção, a suíte de teste para a Glibc é considerada crítica. Não pule-a sob qualquer circunstância.
Geralmente uns poucos testes não passam. As falhas de teste listadas abaixo usualmente são seguras ignorar.
make check
Você possivelmente veja algumas falhas de teste. A suíte de teste da Glibc é de alguma forma dependente do sistema anfitrião. Umas poucas falhas saídas de mais que 5.000 testes geralmente podem ignoradas. Esta é uma lista dos problemas mais comuns vistos para versões recentes do LFS:
io/tst-lchmod é conhecido por falhar no ambiente chroot do LFS.
Alguns testes, por exemplo nss/tst-nss-files-hosts-multi e nptl/tst-thread-affinity* são conhecidos por falharem devido a um tempo limite (especialmente quando o sistema está relativamente lento e (ou) executando a suíte de teste com várias tarefas make paralelas). Esses testes podem ser identificados com:
grep "Timed out" $(find -name \*.out)
É possível reexecutar um teste com tempo limite
aumentado com TIMEOUTFACTOR=<fator>
make test
t=<nome do
teste>
. Por exemplo,
TIMEOUTFACTOR=10 make
test t=nss/tst-nss-files-hosts-multi
reexecutará nss/tst-nss-files-hosts-multi
com dez vezes o tempo limite original.
Além disso, alguns testes possivelmente falhem com um modelo de CPU relativamente antigo (por exemplo elf/tst-cpu-features-cpuinfo) ou versão do núcleo do anfitrião (por exemplo stdlib/tst-arc4random-thread).
Mesmo sendo uma mensagem inofensiva, o estágio de instalação
da Glibc reclamará acerca da ausência do /etc/ld.so.conf
. Evite esse aviso com:
touch /etc/ld.so.conf
Corrija o Makefile para pular uma verificação de sanidade desatualizada que falha com uma configuração moderna da Glibc:
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
Se atualizar a Glibc para uma nova versão secundária (por exemplo, da Glibc-2.36 para a Glibc-2.40) em um sistema LFS em execução, [então] você precisará tomar algumas precauções extras para evitar quebrar o sistema:
Atualizar a Glibc em um sistema LFS anterior ao 11.0 (exclusivo) não é suportado. Reconstrua o LFS se você estiver executando um sistema LFS antigo, mas precisar de uma Glibc mais recente.
Se atualizar em um sistema LFS anterior a 12.0
(exclusivo), [então] instale a Libxcrypt seguindo a Seção 8.27,
“Libxcrypt-4.4.36.” Além de uma instalação normal
da Libxcrypt,
você DEVE seguir a
observação na seção Libxcrypt para instalar a
libcrypt.so.1*
(substituindo libcrypt.so.1
originária da
instalação anterior da Glibc).
Se atualizar em um sistema LFS anterior ao 12.1 (exclusivo), [então] remova o aplicativo nscd:
rm -f /usr/sbin/nscd
Se esse sistema (anterior ao LFS 12.1, exclusivo) for baseado em Systemd, [então] também é necessário desabilitar e parar o serviço nscd agora:
systemctl disable --now nscd
Atualize o núcleo e reinicialize se ele for mais antigo que 4.19 (verifique a versão atual com uname -r) ou se quiser atualizá-lo mesmo assim, seguindo a Seção 10.3, “Linux-6.10.5.”
Atualize os cabeçalhos da API do núcleo se forem mais
antigos que 4.19 (verifique a versão atual com
cat
/usr/include/linux/version.h) ou se
quiser atualizá-los mesmo assim, seguindo a Seção 5.4,
“Cabeçalhos da API do Linux-6.10.5” (mas
removendo $LFS
do comando
cp).
Realize uma instalação DESTDIR
e atualize as bibliotecas
compartilhadas da Glibc no sistema usando um comando
simples install:
make DESTDIR=$PWD/dest install install -vm755 dest/usr/lib/*.so.* /usr/lib
É obrigatório seguir rigorosamente essas etapas acima, a menos que você entenda completamente o que está fazendo. Qualquer desvio inesperado possivelmente torne o sistema completamente desusável. VOCÊ ESTÁ AVISADO(A).
Em seguida, continue a executar o comando make install, o comando
sed contra o
/usr/bin/ldd
e os comandos
para instalar as localidades. Assim que estiverem
finalizados, reinicialize o sistema imediatamente.
Instale o pacote:
make install
Corrija um caminho codificado rigidamente para o carregador de executável no script ldd:
sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd
Em seguida, instale as localidades que podem fazer o sistema responder em um idioma diferente. Nenhuma dessas localidades é exigida, mas se algumas delas estiverem ausentes, as suítes de teste de alguns pacotes pularão importantes casos de teste.
Localidades individuais podem ser instaladas usando-se o
programa localedef. Por exemplo, o
segundo comando localedef abaixo combina a
definição de localidade independente do conjunto de
caracteres /usr/share/i18n/locales/cs_CZ
com a
definição de mapa de caracteres /usr/share/i18n/charmaps/UTF-8.gz
e
adiciona o resultado ao arquivo /usr/lib/locale/locale-archive
. As
seguintes instruções instalarão o conjunto mínimo de
localidades necessário para a cobertura ótima de testes:
localedef -i C -f UTF-8 C.UTF-8 localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8 localedef -i de_DE -f ISO-8859-1 de_DE localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro localedef -i de_DE -f UTF-8 de_DE.UTF-8 localedef -i el_GR -f ISO-8859-7 el_GR localedef -i en_GB -f ISO-8859-1 en_GB localedef -i en_GB -f UTF-8 en_GB.UTF-8 localedef -i en_HK -f ISO-8859-1 en_HK localedef -i en_PH -f ISO-8859-1 en_PH localedef -i en_US -f ISO-8859-1 en_US localedef -i en_US -f UTF-8 en_US.UTF-8 localedef -i es_ES -f ISO-8859-15 es_ES@euro localedef -i es_MX -f ISO-8859-1 es_MX localedef -i fa_IR -f UTF-8 fa_IR localedef -i fr_FR -f ISO-8859-1 fr_FR localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro localedef -i fr_FR -f UTF-8 fr_FR.UTF-8 localedef -i is_IS -f ISO-8859-1 is_IS localedef -i is_IS -f UTF-8 is_IS.UTF-8 localedef -i it_IT -f ISO-8859-1 it_IT localedef -i it_IT -f ISO-8859-15 it_IT@euro localedef -i it_IT -f UTF-8 it_IT.UTF-8 localedef -i ja_JP -f EUC-JP ja_JP localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true localedef -i ja_JP -f UTF-8 ja_JP.UTF-8 localedef -i nl_NL@euro -f ISO-8859-15 nl_NL@euro localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R localedef -i ru_RU -f UTF-8 ru_RU.UTF-8 localedef -i se_NO -f UTF-8 se_NO.UTF-8 localedef -i ta_IN -f UTF-8 ta_IN.UTF-8 localedef -i tr_TR -f UTF-8 tr_TR.UTF-8 localedef -i zh_CN -f GB18030 zh_CN.GB18030 localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS localedef -i zh_TW -f UTF-8 zh_TW.UTF-8
Adicionalmente, instale a localidade para teu próprio país, idioma e conjunto de caracteres.
Alternativamente, instale todas as localidades listadas no
arquivo glibc-2.40/localedata/SUPPORTED
(inclui
cada localidade listada acima e muitas mais) de uma vez com o
seguinte comando consumidor de tempo:
make localedata/install-locales
Então, use o comando localedef para criar e
instalar localidades não listadas no arquivo glibc-2.40/localedata/SUPPORTED
quando você
precisar delas. Por exemplo, as seguintes duas localidades
são necessárias para alguns testes posteriormente neste
capítulo:
localedef -i C -f UTF-8 C.UTF-8 localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
A Glibc agora usa a libidn2 quando resolver nomes internacionalizados de domínio. Essa é uma dependência de tempo de execução. Se essa capacidade for necessária, as instruções para instalar a libidn2 estão na página da libidn2 do BLFS.
O arquivo /etc/nsswitch.conf
precisa ser criado, pois os padrões da Glibc não funcionam
bem em um ambiente de rede de comunicação.
Crie um novo arquivo /etc/nsswitch.conf
executando o seguinte:
cat > /etc/nsswitch.conf << "EOF"
# Inicia /etc/nsswitch.conf
passwd: files systemd
group: files systemd
shadow: files systemd
hosts: mymachines resolve [!UNAVAIL=return] files myhostname dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# Termina /etc/nsswitch.conf
EOF
Instale e configure os dados de fuso horário com o seguinte:
tar -xf ../../tzdata2024a.tar.gz ZONEINFO=/usr/share/zoneinfo mkdir -pv $ZONEINFO/{posix,right} for tz in etcetera southamerica northamerica europe africa antarctica \ asia australasia backward; do zic -L /dev/null -d $ZONEINFO ${tz} zic -L /dev/null -d $ZONEINFO/posix ${tz} zic -L leapseconds -d $ZONEINFO/right ${tz} done cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO zic -d $ZONEINFO -p America/New_York unset ZONEINFO
O significado dos comandos zic:
zic -L
/dev/null ...
Isso cria fusos horários posix sem quaisquer segundos
bissextos. É convencional colocá-los em ambos
zoneinfo
e zoneinfo/posix
. É necessário
colocar os fusos horários POSIX em zoneinfo
, do contrário várias
suítes de teste reportarão erros. Em um sistema
embarcado, onde o espaço é apertado e você não
pretende nunca atualizar os fusos horários, você
poderia economizar 1,9 MB não usando o diretório
posix
, mas alguns
aplicativos ou suítes de teste poderiam produzir
algumas falhas.
zic -L
leapseconds ...
Isso cria fusos horários corretos, incluindo segundos
bissextos. Em um sistema embarcado, onde o espaço é
apertado e você não pretende nunca atualizar os fusos
horários ou se importa com a hora correta, você
poderia economizar 1,9 MB omitindo o diretório
right
.
zic ...
-p ...
Isso cria o arquivo posixrules
. Nós usamos New York,
pois POSIX exige que as regras de horário de verão
estejam de acordo com regras dos Estados Unidos da
América do Norte.
Uma maneira para determinar o fuso horário local é a de executar o seguinte conjunto de comandos sequenciais:
tzselect
Depois de responder à umas poucas perguntas a respeito do
local, o conjunto de comandos sequenciais retornará o nome
do fuso horário (por exemplo, America/Edmonton). Existem
também alguns outros possíveis fusos horários listados em
/usr/share/zoneinfo
, tais
como Canada/Eastern
ou EST5EDT que não
são identificados pelo conjunto de comandos sequenciais,
mas podem ser usados.
Então crie o arquivo /etc/localtime
executando:
ln -sfv /usr/share/zoneinfo/<xxx>
/etc/localtime
Substitua <xxx>
pelo nome do
fuso horário selecionado (por exemplo, Canada/Eastern).
Por padrão, o carregador dinâmico (/lib/ld-linux.so.2
) procura em
/usr/lib
por bibliotecas
dinâmicas que são necessárias para aplicativos assim que
são executados. Entretanto, se existirem bibliotecas em
outros diretórios diferentes do /usr/lib
, esses precisam ser adicionados
ao arquivo /etc/ld.so.conf
para a finalidade de que o carregador dinâmico encontre
elas. Dois diretórios que são comumente conhecidos por
conterem bibliotecas adicionais são /usr/local/lib
e /opt/lib
; então adicione esses diretórios
ao caminho de busca do carregador dinâmico.
Crie um novo arquivo /etc/ld.so.conf
executando o seguinte:
cat > /etc/ld.so.conf << "EOF"
# Inicia /etc/ld.so.conf
/usr/local/lib
/opt/lib
EOF
Se desejado, o carregador dinâmico também pode pesquisar um diretório e incluir o conteúdo de arquivos encontrados lá. Geralmente os arquivos nesse diretório include são uma linha especificando o caminho de biblioteca desejado. Para adicionar essa capacidade, execute os seguintes comandos:
cat >> /etc/ld.so.conf << "EOF"
# Adiciona um diretório de inclusão
include /etc/ld.so.conf.d/*.conf
EOF
mkdir -pv /etc/ld.so.conf.d
Gera catálogos de mensagem |
|
Exibe os valores de configuração de sistema para variáveis específicas do sistema de arquivos |
|
Obtém entradas a partir de uma base de dados administrativa |
|
Realiza conversão de conjuntos de caracteres |
|
Cria arquivos de configuração de módulos de carregamento rápido do iconv |
|
Configura as ligações de tempo de execução do vinculador dinâmico |
|
Reporta quis bibliotecas compartilhadas são exigidas por cada dado aplicativo ou biblioteca compartilhada |
|
Auxilia o ldd com arquivos objeto. Isso não existe em arquiteturas mais novas como x86_64 |
|
Imprime várias informações a respeito da localidade atual |
|
Compila especificações de localidade |
|
Cria um banco de dados simples a partir de uma entrada gerada textual |
|
Lê e interpreta um arquivo de rastreamento de memória e exibe um resumo em formato legível por humanos |
|
Despeja informação gerada pelos perfis do PC |
|
Lista objetos dinâmicos compartilhados usados por processos em execução |
|
Um aplicativo ln vinculado estaticamente |
|
Rastreia chamadas de procedimentos de bibliotecas compartilhadas de um comando especificado |
|
Lê e exibe dados de perfil de objetos compartilhados |
|
Pergunta ao(à) usuário(a) a respeito do local do sistema e relata a correspondente descrição de fuso horário |
|
Rastreia a execução de um aplicativo exibindo a função atualmente executada |
|
O despejador de fuso horário |
|
O compilador de fuso horário |
|
O aplicativo auxiliar para executáveis de bibliotecas compartilhadas |
|
Usado internamente pela Glibc como um hack
grosseiro para executar aplicativos quebrados (por
exemplo, alguns aplicativos Motif). Vejam-se
comentários em |
|
Biblioteca fictícia que não contém funções.
Anteriormente era a biblioteca assíncrona de
pesquisa de nome, cujas funções agora estão em
|
|
A biblioteca principal C |
|
Liga verificação de alocação de memória quando pré-carregada |
|
Biblioteca fictícia que não contém funções.
Anteriormente era a biblioteca de interface do
vinculador dinâmico, cujas funções agora estão em
|
|
Biblioteca fictícia que não contém funções. Anteriormente era uma biblioteca de tempo de execução para g++ |
|
A biblioteca matemática |
|
A biblioteca de vetor matemático, vinculada
conforme necessária quando |
|
Liga verificação de alocação de memória quando vinculada para |
|
Usado por memusage para ajudar a coletar informação a respeito do uso de memória de um aplicativo |
|
A biblioteca de serviços de rede de comunicação, agora obsoleta |
|
Os módulos de Name Service Switch, contendo funções
para resolução de nomes de dispositivos, nomes de
usuárias(os), nomes de grupos, pseudônimos,
serviços, protocolos, etc. Carregados pela
|
|
Pode ser pré-carregada para PC perfilar um executável |
|
Biblioteca fictícia que não contém funções.
Anteriormente continha funções fornecendo a maioria
das interfaces especificadas pelas Extensões de
Camadas POSIX.1c e as interfaces de semáforos
especificadas pelas Extensões de Tempo Real
POSIX.1b; agora as funções estão em |
|
Contém funções para criação, envio e interpretação de pacotes para os servidores de nomes de domínio da Internet |
|
Contém funções fornecendo a maior parte das interfaces especificadas pelas Extensões de Tempo Real POSIX.1b |
|
Contém funções úteis para construir depuradores para aplicativos de múltiplas camadas |
|
Biblioteca fictícia que não contém funções.
Anteriormente continha código para funções
“padrão” usadas em muitos
utilitários Unix. Essas funções agora estão na
|
O pacote Zlib contém rotinas de compressão e descompressão usadas por alguns aplicativos.
Prepare o Zlib para compilação:
./configure --prefix=/usr
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
Remova uma biblioteca estática inútil:
rm -fv /usr/lib/libz.a
O pacote Bzip2 contém aplicativos para comprimir e descomprimir arquivos. Comprimir arquivos de texto com bzip2 gera uma muito melhor percentagem de compressão que com o tradicional gzip.
Aplique um remendo que instalará a documentação para esse pacote:
patch -Np1 -i ../bzip2-1.0.8-install_docs-1.patch
O seguinte comando garante que a instalação de links simbólicos sejam relativos:
sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile
Garanta que as páginas de manual sejam instaladas no local correto:
sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile
Prepare o Bzip2 para compilação com:
make -f Makefile-libbz2_so make clean
O significado do parâmetro do make:
-f
Makefile-libbz2_so
Isso causará Bzip2 ser construído usando um arquivo
Makefile
diferente, nesse
caso o arquivo Makefile-libbz2_so
, o qual cria uma
biblioteca dinâmica libbz2.so
e vincula os utilitários do
Bzip2 contra ela.
Compile e teste o pacote:
make
Instale os aplicativos:
make PREFIX=/usr install
Instale a biblioteca compartilhada:
cp -av libbz2.so.* /usr/lib ln -sv libbz2.so.1.0.8 /usr/lib/libbz2.so
Instale o binário compartilhado bzip2 no diretório
/usr/bin
e substitua duas
cópias do bzip2
por links simbólicos:
cp -v bzip2-shared /usr/bin/bzip2 for i in /usr/bin/{bzcat,bunzip2}; do ln -sfv bzip2 $i done
Remova uma biblioteca estática inútil:
rm -fv /usr/lib/libbz2.a
Descomprime arquivos compactados com bzip |
|
Descomprime para a saída padrão |
|
Executa cmp em arquivos compactados com bzip |
|
Executa diff em arquivos compactados com bzip |
|
Executa egrep em arquivos compactados com bzip |
|
Executa fgrep em arquivos compactados com bzip |
|
Executa grep em arquivos compactados com bzip |
|
Comprime arquivos usando o algoritmo de compressão de texto de classificação de blocos Burrows-Wheeler com codificação Huffman; a taxa de compressão é melhor que aquela obtida por compressores mais convencionais usando algoritmos “Lempel-Ziv”, como o gzip |
|
Tenta recuperar dados a partir de arquivos danificados comprimidos com bzip |
|
Executa less em arquivos compactados com bzip |
|
Executa more em arquivos compactados com bzip |
|
A biblioteca que implementa compressão de dados de classificação de blocos sem perdas, usando o algoritmo Burrows-Wheeler |
O pacote Xz contém aplicativos para comprimir e descomprimir arquivos. Ele fornece recursos para os formatos de compressão lzma e o mais novo xz. Comprimir arquivos de texto com xz gera uma melhor percentagem de compressão que com os tradicionais comandos gzip ou bzip2.
Prepare Xz para compilação com:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/xz-5.6.2
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
Descomprime para a saída padrão |
|
Executa cmp em arquivos comprimidos LZMA |
|
Executa diff em arquivos comprimidos LZMA |
|
Executa egrep em arquivos comprimidos LZMA |
|
Executa fgrep em arquivos comprimidos LZMA |
|
Executa grep em arquivos comprimidos LZMA |
|
Executa less em arquivos comprimidos LZMA |
|
Comprime ou descomprime arquivos usando o formato LZMA |
|
Um decodificador pequeno e rápido para arquivos comprimidos LZMA |
|
Exibe informação armazenada no cabeçalho de arquivo comprimido com LZMA |
|
Executa more em arquivos comprimidos LZMA |
|
Descomprime arquivos usando o formato LZMA |
|
Descomprime arquivos usando o formato XZ |
|
Comprime ou descomprime arquivos usando o formato XZ |
|
Descomprime para a saída padrão |
|
Executa cmp em arquivos comprimidos XZ |
|
Um decodificador pequeno e rápido para arquivos comprimidos XZ |
|
Executa diff em arquivos comprimidos XZ |
|
Executa egrep em arquivos comprimidos XZ |
|
Executa fgrep em arquivos comprimidos XZ |
|
Executa grep em arquivos comprimidos XZ |
|
Executa less em arquivos comprimidos XZ |
|
Executa more em arquivos comprimidos XZ |
|
A biblioteca que implementa compressão de dados de classificação de blocos, sem perdas, usando o algoritmo de cadeia Lempel-Ziv-Markov |
Lz4 é um algoritmo de compressão sem perdas, fornecendo velocidade de compressão superior a 500 MB/s por elemento de processamento. Ele tem um decodificador extremamente rápido, com velocidade de vários GB/s por elemento de processamento. Lz4 pode trabalhar com Zstandard para permitir que ambos os algoritmos comprimam dados mais rapidamente.
Compile o pacote:
make BUILD_STATIC=no PREFIX=/usr
Para testar os resultados, emita:
make -j1 check
Instale o pacote:
make BUILD_STATIC=no PREFIX=/usr install
Zstandard é um algoritmo de compressão em tempo real, fornecendo taxas altas de compressão. Ele oferece um intervalo muito amplo de combinações de compressão/velocidade, enquanto é apoiado por um decodificador muito rápido.
Compile o pacote:
make prefix=/usr
Na saída gerada do teste existem vários lugares que indicam 'failed'. Essas são esperadas e apenas 'FAIL' é uma atual falha de teste. Não deveriam existir falhas de teste.
Para testar os resultados, emita:
make check
Instale o pacote:
make prefix=/usr install
Remova a biblioteca estática:
rm -v /usr/lib/libzstd.a
O pacote File contém um utilitário para determinar o tipo de um dado arquivo ou arquivos.
Prepare o File para compilação:
./configure --prefix=/usr
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
O pacote Readline é um conjunto de bibliotecas que oferecem recursos de edição de linha de comando e de histórico.
Reinstalar Readline causará as bibliotecas antigas serem movidas para <nomebiblioteca>.old. Ao tempo em que isso normalmente não seja um problema, em alguns casos isso pode deflagrar um defeito de vinculação no ldconfig. Isso pode ser evitado emitindo-se os seguintes dois seds:
sed -i '/MV.*old/d' Makefile.in sed -i '/{OLDSUFF}/c:' support/shlib-install
Evite caminhos de pesquisa de biblioteca de codificação rígida (rpath) dentro das bibliotecas compartilhadas. Esse pacote não precisa do rpath para uma instalação no local padrão, e o rpath às vezes pode causar efeitos indesejados ou até mesmo problemas de segurança:
sed -i 's/-Wl,-rpath,[^ ]*//' support/shobj-conf
Prepare Readline para compilação:
./configure --prefix=/usr \ --disable-static \ --with-curses \ --docdir=/usr/share/doc/readline-8.2.13
O significado da nova opção do configure:
--with-curses
Essa opção diz ao Readline que ela pode encontrar as
funções da biblioteca termcap na biblioteca curses, não
uma biblioteca termcap separada. Isso gerará o arquivo
readline.pc
correto.
Compile o pacote:
make SHLIB_LIBS="-lncursesw"
O significado da opção do make:
SHLIB_LIBS="-lncursesw"
Essa opção força o Readline a vincular contra a
biblioteca libncursesw
.
Esse pacote não vem com uma suíte de teste.
Instale o pacote:
make SHLIB_LIBS="-lncursesw" install
Se desejado, instale a documentação:
install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-8.2.13
O pacote M4 contém um processador de macro.
Prepare o M4 para compilação:
./configure --prefix=/usr
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
Copia os arquivos dados enquanto expande as macros que eles contém. Essas macros são ou nativas ou definidas pelo(a) usuário(a) e podem receber qualquer número de argumentos. Além de executar expansão de macro, m4 tem funções nativas para incluir arquivos nomeados, executar comandos Unix, realizar aritmética de inteiros, manipular texto, recursão, etc. O aplicativo m4 pode ser usado ou como um front-end para um compilador ou como um processador de macro independente |
O pacote Bc contém uma linguagem de processamento numérica de precisão arbitrária.
Prepare Bc para compilação:
CC=gcc ./configure --prefix=/usr -G -O3 -r
O significado das opções do configure:
CC=gcc
Esse parâmetro especifica o compilador a usar.
-G
Omite partes da suíte de teste que não funcionariam até que o aplicativo bc tenha sido instalado.
-O3
Especifica a optimização a usar.
-r
Habilita o uso de Readline para melhorar o recurso de edição de linha do bc.
Compile o pacote:
make
Para testar bc, execute:
make test
Instale o pacote:
make install
O pacote Flex contém um utilitário para gerar aplicativos que reconhecem padrões em texto.
Prepare Flex para compilação:
./configure --prefix=/usr \ --docdir=/usr/share/doc/flex-2.6.4 \ --disable-static
Compile o pacote:
make
Para testar os resultados (cerca de 0,5 UPC), emita:
make check
Instale o pacote:
make install
Uns poucos aplicativos não sabem acerca do flex ainda e tentam
executar o predecessor dele, lex. Para suportar esses
aplicativos, crie um link simbólico chamado lex
que executa o flex
no modo de emulação lex, e também crie a página
de manual do lex como um link simbólico:
ln -sv flex /usr/bin/lex ln -sv flex.1 /usr/share/man/man1/lex.1
Uma ferramenta para gerar aplicativos que reconhecem padrões em texto; ela permite, para a versatilidade, especificar as regras para encontrar padrões, erradicando a necessidade de desenvolver um aplicativo especializado |
|
Uma extensão do flex, é usada para gerar código e classes C++. É um link simbólico para flex |
|
Um link simbólico que executa o flex no modo de emulação lex |
|
A biblioteca |
O pacote Tcl contém a Tool Command Language, uma linguagem de script robusta de propósito geral. O pacote Expect é escrito em Tcl (pronunciada "tickle").
Esse pacote e os próximos dois (Expect e DejaGNU) são instalados para suportar a execução das suítes de teste para Binutils, GCC e outros pacotes. Instalar três pacotes para propósitos de teste possivelmente pareça excessivo, mas é muito assegurador, se não essencial, saber que as ferramentas mais importantes estão funcionando adequadamente.
Prepare Tcl para compilação:
SRCDIR=$(pwd) cd unix ./configure --prefix=/usr \ --mandir=/usr/share/man \ --disable-rpath
O significado dos novos parâmetros de configuração:
--disable-rpath
Esse parâmetro evita caminhos de pesquisa de biblioteca de codificação rígida (rpath) dentro dos arquivos binários executáveis e das bibliotecas compartilhadas. Esse pacote não precisa do rpath para uma instalação no local padrão, e o rpath às vezes pode causar efeitos indesejados ou até mesmo problemas de segurança.
Construa o pacote:
make sed -e "s|$SRCDIR/unix|/usr/lib|" \ -e "s|$SRCDIR|/usr/include|" \ -i tclConfig.sh sed -e "s|$SRCDIR/unix/pkgs/tdbc1.1.7|/usr/lib/tdbc1.1.7|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.7/generic|/usr/include|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.7/library|/usr/lib/tcl8.6|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.7|/usr/include|" \ -i pkgs/tdbc1.1.7/tdbcConfig.sh sed -e "s|$SRCDIR/unix/pkgs/itcl4.2.4|/usr/lib/itcl4.2.4|" \ -e "s|$SRCDIR/pkgs/itcl4.2.4/generic|/usr/include|" \ -e "s|$SRCDIR/pkgs/itcl4.2.4|/usr/include|" \ -i pkgs/itcl4.2.4/itclConfig.sh unset SRCDIR
As várias instruções “sed” depois do comando “make” removem referências ao diretório de construção dos arquivos de configuração e as substituem pelo diretório de instalação. Isso não é obrigatório para o restante do LFS, porém possivelmente seja necessário se um pacote construído posteriormente usar a Tcl.
Para testar os resultados, emita:
make test
Instale o pacote:
make install
Torne as bibliotecas instaladas graváveis, de modo que símbolos de depuração possam ser removidos posteriormente:
chmod -v u+w /usr/lib/libtcl8.6.so
Instale os cabeçalhos da Tcl. O próximo pacote, Expect, exige elas.
make install-private-headers
Agora faça um link simbólico necessário:
ln -sfv tclsh8.6 /usr/bin/tclsh
Renomeie uma página de manual que conflita com uma página de manual do Perl:
mv /usr/share/man/man3/{Thread,Tcl_Thread}.3
Opcionalmente, instale a documentação emitindo os seguintes comandos:
cd .. tar -xf ../tcl8.6.14-html.tar.gz --strip-components=1 mkdir -v -p /usr/share/doc/tcl-8.6.14 cp -v -r ./html/* /usr/share/doc/tcl-8.6.14
O pacote Expect contém ferramentas para automatizar, via diálogos com script, aplicativos interativos, tais como o telnet, ftp, passwd, fsck, rlogin e tip. Expect também é útil para testar esses mesmos aplicativos, bem como para facilitar todos os tipos de tarefas que são proibitivamente difíceis com qualquer outra coisa. A estrutura subjacente da DejaGnu é escrita em Expect.
Expect precisa de PTYs para funcionar. Verifique se os PTYs estão funcionando corretamente dentro do ambiente chroot realizando um teste simples:
python3 -c 'from pty import spawn; spawn(["echo", "ok"])'
Esse comando deveria gerar ok
. Se, em vez disso, a saída gerada
incluir OSError: out of pty
devices
, então o ambiente não está configurado para
operação adequada de PTY. Você precisa sair do ambiente
chroot, ler Seção 7.3,
“Preparando Sistemas de Arquivos Virtuais do Núcleo”
novamente e garantir que o sistema de arquivos devpts
(e outros sistemas de arquivos
virtuais do núcleo) foi montado corretamente. Em seguida,
entre novamente no ambiente chroot seguindo Seção 7.4, “Entrando
no Ambiente Chroot”. Esse problema precisa ser resolvido
antes de continuar ou as suítes de teste que exigem o Expect
(por exemplo, as suítes de teste do Bash, Binutils, GCC, GDBM
e, com certeza, a próprio Expect) falharão catastroficamente
e outras falhas sutis possivelmente também aconteçam.
Agora, faça algumas mudanças para permitir o pacote com gcc-14.1 ou posterior:
patch -Np1 -i ../expect-5.45.4-gcc14-1.patch
Prepare Expect para compilação:
./configure --prefix=/usr \ --with-tcl=/usr/lib \ --enable-shared \ --disable-rpath \ --mandir=/usr/share/man \ --with-tclinclude=/usr/include
O significado das opções do configure:
--with-tcl=/usr/lib
Esse parâmetro é necessário para dizer ao configure onde o script tclConfig.sh está localizado.
--with-tclinclude=/usr/include
Isso explicitamente diz a Expect onde encontrar os cabeçalhos internos da Tcl.
Construa o pacote:
make
Para testar os resultados, emita:
make test
Instale o pacote:
make install ln -svf expect5.45.4/libexpect5.45.4.so /usr/lib
O pacote DejaGnu contém uma estrutura subjacente para executar suítes de teste em ferramentas GNU. Ele é escrito em expect, a qual usa ela própria a Tcl (Tool Command Language).
A(O) desenvolvedora(r) recomenda construir DejaGNU em um diretório dedicado à construção:
mkdir -v build cd build
Prepare DejaGNU para compilação:
../configure --prefix=/usr makeinfo --html --no-split -o doc/dejagnu.html ../doc/dejagnu.texi makeinfo --plaintext -o doc/dejagnu.txt ../doc/dejagnu.texi
Para testar os resultados, emita:
make check
Instale o pacote:
make install install -v -dm755 /usr/share/doc/dejagnu-1.6.3 install -v -m644 doc/dejagnu.{html,txt} /usr/share/doc/dejagnu-1.6.3
O pacote pkgconf é um sucessor do pkg-config e contém uma ferramenta para passar o caminho "include" e(ou) caminhos de biblioteca para construir ferramentas durante as fases "configure" e "make" de instalações de pacotes.
Prepare Pkgconf para compilação:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/pkgconf-2.3.0
Compile o pacote:
make
Instale o pacote:
make install
Para manter a compatibilidade com o Pkg-config original, crie dois links simbólicos:
ln -sv pkgconf /usr/bin/pkg-config ln -sv pkgconf.1 /usr/share/man/man1/pkg-config.1
Retorna metainformações para a biblioteca ou pacote especificada |
|
Gera uma Lista de Materiais do Software a partir de arquivos ".pc" do "pkg-config" |
|
Contém a maior parte da funcionalidade do "pkgconf", enquanto permite que outras ferramentas, como "IDEs" e compiladores, usem a estrutura essencial de suporte dele |
O pacote Binutils contém um vinculador, um montador e outras ferramentas para manusear arquivos objeto.
A documentação do Binutils recomenda construir o Binutils em um diretório dedicado à construção:
mkdir -v build cd build
Prepare o Binutils para compilação:
../configure --prefix=/usr \ --sysconfdir=/etc \ --enable-gold \ --enable-ld=default \ --enable-plugins \ --enable-shared \ --disable-werror \ --enable-64-bit-bfd \ --enable-new-dtags \ --with-system-zlib \ --enable-default-hash-style=gnu
O significado dos novos parâmetros de configuração:
--enable-gold
Constrói o vinculador gold e o instala como ld.gold (juntamente com o vinculador padrão).
--enable-ld=default
Constrói o vinculador bfd original e o instala como ambos ld (o vinculador padrão) e ld.bfd.
--enable-plugins
Habilita suporte de plugin para o vinculador.
--with-system-zlib
Usa a biblioteca zlib instalada em vez de construir a versão incluída.
Compile o pacote:
make tooldir=/usr
O significado do parâmetro do make:
tooldir=/usr
Normalmente, o tooldir (o diretório onde os executáveis
ultimamente estarão localizados) é configurado para
$(exec_prefix)/$(target_alias)
. Por
exemplo, máquinas x86_64 expandiriam isso para
/usr/x86_64-pc-linux-gnu
.
Por causa que este é um sistema personalizado, esse
diretório alvo específico em /usr
não é exigido. $(exec_prefix)/$(target_alias)
seria
usado se o sistema fosse usado para compilar
cruzadamente (por exemplo, compilar um pacote em uma
máquina Intel que gera código que pode ser executado em
máquinas PowerPC).
A suíte de teste para Binutils nesta seção é considerada crítica. Não a pule sob quaisquer circunstâncias.
Teste os resultados:
make -k check
Para uma lista de testes falhos, execute:
grep '^FAIL:' $(find -name '*.log')
Doze testes falham na suíte de teste gold quando as opções
--enable-default-pie
e
--enable-default-ssp
são passadas
para o GCC.
Instale o pacote:
make tooldir=/usr install
Remova bibliotecas estáticas inúteis:
rm -fv /usr/lib/lib{bfd,ctf,ctf-nobfd,gprofng,opcodes,sframe}.a
Traduz endereços de aplicativos para nomes de arquivo e números de linha; dado um endereço e o nome de um executável, ele usa a informação de depuração no executável para determinar qual arquivo fonte e número de linha estão associados com o endereço |
|
Cria, modifica e extrai a partir de arquivamentos |
|
Um montador que monta a saída gerada do gcc para dentro de arquivos objeto |
|
Usado pelo vinculador para desmembrar símbolos C++ e Java e para impedir que funções sobrecarregadas entrem em conflito |
|
O utilitário de empacotamento DWARF |
|
Atualiza o cabeçalho ELF de arquivos ELF |
|
Exibe dados do perfil de gráfico de chamada |
|
Coleta e analisa dados de desempenho |
|
Um vinculador que combina um número de objetos e arquivos de arquivamento em um arquivo, realocando os dados deles e vinculando referências de símbolos |
|
Uma versão reduzida do ld que suporta somente o formato de arquivo objeto elf |
|
Um link rígido para o ld |
|
Lista os símbolos ocorrentes em um dado arquivo objeto |
|
Traduz um tipo de arquivo objeto em outro |
|
Exibe informação a respeito do dado arquivo objeto, com opções controlando a informação particular a exibir; a informação mostrada é útil para programadores(as) que estão trabalhando nas ferramentas de compilação |
|
Gera um índice do conteúdo de um arquivamento e o armazena no arquivamento; o índice lista todos os símbolos definidos pelos membros do arquivamento que são arquivos objeto realocáveis |
|
Exibe informação a respeito de binários do tipo ELF |
|
Lista os tamanhos de seção e o tamanho total para os arquivos objeto dados |
|
Exibe, para cada arquivo dado, as sequências de caracteres imprimíveis que são, no mínimo, do comprimento especificado (padronizado para quatro); para arquivos objeto, ele imprime, por padrão, somente as sequências de caracteres a partir das seções de inicialização e carregamento enquanto que para outros tipos de arquivos, ele escaneia o arquivo inteiro |
|
Descarta símbolos originários de arquivos objeto |
|
A biblioteca de Descritor de Arquivo Binário |
|
A biblioteca de suporte de depuração Compat ANSI-C Type Format |
|
Uma variante da libctf que não usa funcionalidade da libbfd |
|
Uma biblioteca contendo a maioria das rotinas usadas pelo gprofng |
|
Uma biblioteca para lidar com opcodes—as versões de “texto legível” de instruções para o processador; é usada para construir utilitários como o objdump |
|
Uma biblioteca para suportar retrocesso em linha usando um desbobinador simples |
O pacote GMP contém bibliotecas matemáticas. Essas tem funções úteis para aritmética de precisão arbitrária.
Se você estiver construindo para x86 de 32 bits, mas tem
uma CPU que seja capaz de executar código de 64 bits
e você especificou
CFLAGS
no ambiente, [então] o
script configure tentará configurar para 64 bits e falhará.
Impeça isso invocando o comando do configure abaixo com
ABI=32
./configure ...
As configurações padrão do "GMP" produzem bibliotecas
otimizadas para o processador anfitrião. Se bibliotecas
adequadas para processadores menos capazes que a CPU do
anfitrião forem desejadas, [então] bibliotecas genéricas
podem ser criadas anexando a opção --host=none-linux-gnu
ao comando
configure.
Prepare GMP para compilação:
./configure --prefix=/usr \ --enable-cxx \ --disable-static \ --docdir=/usr/share/doc/gmp-6.3.0
O significado das novas opções de configuração:
--enable-cxx
Esse parâmetro habilita suporte a C++
--docdir=/usr/share/doc/gmp-6.3.0
Essa variável especifica o lugar correto para a documentação.
Compile o pacote e gere a documentação HTML:
make make html
A suíte de teste para o GMP nesta seção é considerada crítica. Não a pule sob quaisquer circunstâncias.
Teste os resultados:
make check 2>&1 | tee gmp-check-log
O código em "gmp" é altamente otimizado para o processador
onde ele seja construído. Ocasionalmente, o código que
detecta o processador identifica erroneamente os recursos
do sistema e existirão erros nos testes ou em outros
aplicativos usando as bibliotecas "gmp" com a mensagem
Illegal instruction
.
Nesse caso, o "gmp" deveria ser reconfigurado com a opção
"--host=none-linux-gnu
" e
reconstruído.
Certifique-se de que pelo menos 199 testes na suíte de teste passaram. Verifique os resultados emitindo o seguinte comando:
awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log
Instale o pacote e a documentação dele:
make install make install-html
O pacote MPFR contém funções para matemática de precisão múltipla.
Prepare MPFR para compilação:
./configure --prefix=/usr \ --disable-static \ --enable-thread-safe \ --docdir=/usr/share/doc/mpfr-4.2.1
Compile o pacote e gere a documentação HTML:
make make html
A suíte de teste para o MPFR nesta seção é considerada crítica. Não a pule sob quaisquer circunstâncias.
Teste os resultados e certifique-se de que todos os 198 testes passaram:
make check
Instale o pacote e a documentação dele:
make install make install-html
O pacote MPC contém uma biblioteca para a aritmética de números complexos com precisão arbitrariamente alta e arredondamento correto do resultado.
Prepare MPC para compilação:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/mpc-1.3.1
Compile o pacote e gere a documentação HTML:
make make html
Para testar os resultados, emita:
make check
Instale o pacote e a documentação dele:
make install make install-html
O pacote Attr contém utilitários para administrar os atributos estendidos dos objetos do sistema de arquivos.
Prepare Attr para compilação:
./configure --prefix=/usr \ --disable-static \ --sysconfdir=/etc \ --docdir=/usr/share/doc/attr-2.5.2
Compile o pacote:
make
Os testes precisam ser executados sobre um sistema de arquivos que suporte atributos estendidos, tais como os sistemas de arquivos ext2, ext3 ou ext4. Para testar os resultados, emita:
make check
Instale o pacote:
make install
O pacote Acl contém utilitários para administrar Listas de Controle de Acesso, as quais são usadas para definir direitos de acesso discricionários refinados para arquivos e diretórios.
Prepare Acl para compilação:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/acl-2.3.2
Compile o pacote:
make
Os testes do Acl precisam ser executados sobre um sistema de arquivos que suporte controles de acesso, porém não até que o pacote Coreutils tenha sido construído, usando as bibliotecas do Acl. Se desejado, retorne a esse pacote e execute make check depois que o pacote Coreutils tiver sido construído.
Instale o pacote:
make install
O pacote Libcap implementa a interface do espaço de usuária(o) para os recursos POSIX 1003.1e disponíveis em núcleos Linux. Esses recursos particionam o todo poderoso privilégio de root em um conjunto de privilégios distintos.
Impeça bibliotecas estáticas de serem instaladas:
sed -i '/install -m.*STA/d' libcap/Makefile
Compile o pacote:
make prefix=/usr lib=lib
O significado da opção do make:
lib=lib
Esse parâmetro configura o diretório de biblioteca para
/usr/lib
em vez de
/usr/lib64
em x86_64. Ele
não tem efeito em x86.
Para testar os resultados, emita:
make test
Instale o pacote:
make prefix=/usr lib=lib install
Um encapsulador de shell para explorar e restringir suporte a recurso |
|
Examina recursos do arquivo |
|
Exibe os recursos do(s) processo(s) consultado(s) |
|
Configura recursos do arquivo |
|
Contém as funções de biblioteca para manipular recursos POSIX 1003.1e |
|
Contém funções para suportar semântica POSIX para chamadas de sistema associadas com a biblioteca pthread |
O pacote Libxcrypt contém uma biblioteca moderna para hash unidirecional de senhas.
Prepare Libxcrypt para compilação:
./configure --prefix=/usr \ --enable-hashes=strong,glibc \ --enable-obsolete-api=no \ --disable-static \ --disable-failure-tokens
O significado das novas opções de configuração:
--enable-hashes=strong,glibc
Constrói algoritmos fortes de resumo recomendados para
casos de uso de segurança e os algoritmos de resumo
fornecidos pela tradicional libcrypt
da "Glibc" para
compatibilidade.
--enable-obsolete-api=no
Desabilita as funções obsoletas da API. Elas não são necessárias para um sistema moderno Linux construído a partir do fonte.
--disable-failure-tokens
Desabilita o recurso de ficha de falha. É necessário para compatibilidade com as bibliotecas tradicionais de resumo de algumas plataformas, mas um sistema Linux baseado na "Glibc" não precisa dele.
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
As instruções acima desabilitaram funções obsoletas da API, pois nenhum pacote instalado por compilação a partir dos fontes se vincularia a elas em tempo de execução. No entanto, os únicos aplicativos somente binários conhecidos que se vinculam a essas funções exigem ABI versão 1. Se você precisar ter tais funções devido a algum aplicativo somente binário ou para estar conforme com a "LSB", [então] construa o pacote novamente com os seguintes comandos:
make distclean ./configure --prefix=/usr \ --enable-hashes=strong,glibc \ --enable-obsolete-api=glibc \ --disable-static \ --disable-failure-tokens make cp -av --remove-destination .libs/libcrypt.so.1* /usr/lib
O pacote Shadow contém aplicativos para manusear senhas de uma maneira segura.
Se você tiver instalado o Linux-PAM, você deveria seguir a página shadow do BLFS em vez desta página para construir (ou reconstruir ou atualizar) shadow.
Se você gostaria de reforçar o uso de senhas fortes,
[então] recorra a
https://www.linuxfromscratch.org/blfs/view/stable-systemd/postlfs/cracklib.html
para instalar o CrackLib antes de construir o Shadow. Então
adicione --with-libcrack
ao comando
configure
abaixo.
Desabilite a instalação do aplicativo groups e as páginas de manual dele, uma vez que o Coreutils fornece uma versão melhor. Também, impeça a instalação de páginas de manual que já foram instaladas no Seção 8.3, “Man-pages-6.9.1”:
sed -i 's/groups$(EXEEXT) //' src/Makefile.in find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \; find man -name Makefile.in -exec sed -i 's/getspnam\.3 / /' {} \; find man -name Makefile.in -exec sed -i 's/passwd\.5 / /' {} \;
Em vez
de usar o método padrão crypt, use o método muito mais
seguro YESCRYPT de
encriptação de senha, que também permite senhas com mais de
oito (08) caracteres. Também é necessário mudar o local
obsoleto /var/spool/mail
para
as caixas de correio de usuário(a) que o Shadow usa por
padrão para o local /var/mail
usado atualmente. E, remova /bin
e /sbin
do PATH
, pois eles são
simplesmente links simbólicos para seus contrapartes em
/usr
.
Se você deseja incluir /bin
e
(ou) /sbin
no PATH
por alguma razão, [então] modifique a
PATH
no .bashrc
depois que o LFS tiver sido
construído.
sed -e 's:#ENCRYPT_METHOD DES:ENCRYPT_METHOD YESCRYPT:' \ -e 's:/var/spool/mail:/var/mail:' \ -e '/PATH=/{s@/sbin:@@;s@/bin:@@}' \ -i etc/login.defs
Se você escolher construir o Shadow com suporte a CrackLib, [então] emita este comando:
sed -i 's:DICTPATH.*:DICTPATH\t/lib/cracklib/pw_dict:' etc/login.defs
Prepare o Shadow para compilação:
touch /usr/bin/passwd ./configure --sysconfdir=/etc \ --disable-static \ --with-{b,yes}crypt \ --without-libbsd \ --with-group-name-max-length=32
O significado das novas opções de configuração:
O arquivo /usr/bin/passwd
precisa existir, pois o local dele é codificado
rigidamente em alguns aplicativos; se ele já não
existir, [então] o conjunto de comandos sequenciais de
instalação o criará no lugar errado.
--with-{b,yes}crypt
O shell expande isso para duas chaves, --with-bcrypt
e
--with-yescrypt
.
Elas permitem que o shadow use os algoritmos Bcrypt e
Yescrypt implementados pelo Libxcrypt para resumir senhas.
Esses algoritmos são mais seguros (em particular, muito
mais resistentes a ataques baseados em GPU) que os
algoritmos SHA tradicionais.
--with-group-name-max-length=32
O nome de usuário(a) mais longo permissível é o de trinta e dois (32) caracteres. Torne o comprimento máximo de um nome de grupo o mesmo.
--without-libbsd
Não use a função "readpassphrase" originária da "libbsd" a qual não está no LFS. Use a cópia interna.
Compile o pacote:
make
Esse pacote não vem com uma suíte de teste.
Instale o pacote:
make exec_prefix=/usr install make -C man install-man
Esse pacote contém utilitários para adicionar, modificar e
deletar usuários(as) e grupos; configurar e modificar as
senhas deles(as); e realizar outras tarefas administrativas.
Para uma explicação completa do que sombreamento de senha significa,
veja-se o arquivo doc/HOWTO
dentro da árvore desempacotada do fonte. Se usar suporte ao
Shadow, [então] tenha na mente que aplicativos que necessitem
verificar senhas (gerenciadores de tela, aplicativos de FTP,
processos de segundo plano pop3, etc.) precisam ser
conformantes com o Shadow. Isto é, eles precisam ser capazes
de funcionar com senhas sombreadas.
Para habilitar senhas sombreadas, execute o seguinte comando:
pwconv
Para habilitar senhas sombreadas de grupo, execute:
grpconv
A configuração padrão do "Shadow" para o utilitário
"useradd"
precisa de alguma explicação. Primeiro, a ação padrão para o
utilitário "useradd" é a de criar o(a)
usuário(a) e um grupo com o mesmo nome que o(a) usuário(a).
Por padrão, os números de "ID" de usuário(a) ("UID") e "ID"
de grupo ("GID") iniciarão em 1000. Isso significa que, se
você não passar parâmetros extras para o "useradd", [então] cada
usuário(a) será um(a) membro(a) de um grupo único no sistema.
Se esse comportamento for indesejável, [então] você precisará
passar, ou o parâmetro "-g
", ou o "-N
" para o "useradd", ou, do contrário,
mudar a configuração de "USERGROUPS_ENAB
" em
"/etc/login.defs
". Veja-se
"useradd(8)"
para mais informação.
Segundo, para mudar os parâmetros padrão, o arquivo
/etc/default/useradd
precisa
ser criado e adaptado para se adequar às tuas necessidades
particulares. Crie-o com:
mkdir -p /etc/default useradd -D --gid 999
Explicações do parâmetro do /etc/default/useradd
GROUP=999
Esse parâmetro configura o início dos números de grupo
usados no arquivo /etc/group
. O valor específico 999
vem do parâmetro --gid
acima. Você
possivelmente o configure para qualquer valor desejado.
Observe que useradd nunca reusará
um UID ou um GID. Se o número identificado nesse
parâmetro estiver usado, ele usará o próximo número
disponível. Observe também que, se você não tiver um
grupo com um ID igual a esse número em teu sistema,
então na primeira vez que você usar o useradd sem o
parâmetro -g
,
uma mensagem de erro será gerada—useradd: unknown GID 999
, ainda
que a conta tenha sido criada corretamente. Esse é o
motivo pelo qual nós criamos o grupo users
com esse ID de grupo no
Seção 7.6,
“Criando Arquivos Essenciais e Links Simbólicos.”
CREATE_MAIL_SPOOL=yes
Esse parâmetro faz com que o useradd crie um
arquivo de caixa de correio para cada novo(a)
usuário(a). O useradd atribuirá a
propriedade de grupo desse arquivo para o grupo
mail
com permissões
0660. Se você, em vez disso, não quisesse criar esses
arquivos, [então] emita o seguinte comando:
sed -i '/MAIL/s/yes/no/' /etc/default/useradd
Escolha uma senha para o(a) usuário(a) root e configure-a executando:
passwd root
Usado para mudar o número máximo de dias entre mudanças obrigatórias de senha |
|
Usado para mudar um nome completo do(a) usuário(a) e outra informação |
|
Usado para atualizar senhas de grupo em modo de lote |
|
Usado para atualizar senhas de usuária(o) em modo de lote |
|
Usado para mudar um shell de login padrão do(a) usuário(a) |
|
Verifica e reforça a política atual de expiração de senha |
|
É Usado para examinar o registro de falhas de login, configurar um número máximo de falhas antes que uma conta seja bloqueada ou zerar a contagem de falhas |
|
É usado para listar os intervalos subordinados de id para um(a) usuário(a) |
|
É usado para adicionar e deletar membros(as) e administradores(as) a grupos |
|
Cria um grupo com o nome dado |
|
Deleta o grupo com o nome dado |
|
Permite que um(a) usuário(a) administre a própria lista de filiação de grupo dele/dela sem a exigência de privilégios de superusuário(a). |
|
É usado para modificar o nome ou GID do grupo dado |
|
Verifica a integridade dos arquivos de grupo
|
|
Cria ou atualiza o arquivo de grupo de sombra a partir do arquivo de grupo normal |
|
Atualiza |
|
É usado pelo sistema para permitir usuárias(os) logar |
|
É um processo em segundo plano usado para reforçar restrições sobre horário de logon e portas |
|
É usado para configurar o mapeamento gid de um espaço de nome de usuária(o) |
|
É usado para mudar o GID atual durante uma sessão de login |
|
É usado para configurar o mapeamento uid de um espaço de nome de usuária(o) |
|
É usado para criar ou atualizar uma série inteira de contas de usuárias(os) |
|
Exibe uma mensagem dizendo que uma conta não está disponível; é projetado para ser usado como o shell padrão para contas desabilitadas |
|
É usado para mudar a senha para uma conta de usuária(o) ou grupo |
|
Verifica a integridade dos arquivos de senha
|
|
Cria ou atualiza o arquivo de senha de sombra a partir do arquivo de senha normal |
|
Atualiza |
|
Executa um comando dado enquanto o GID do(a) usuário(a) estiver configurado para aquele do grupo dado |
|
Executa um shell com IDs de usuária(o) e grupo substitutos |
|
Cria um(a) usuário(a) novo(a) com o nome dado ou atualiza a informação padrão de novo(a) usuário(a) |
|
Deleta a conta de usuária(o) especificada |
|
É usado para modificar o nome de login do(a) usuário(a) dada(o), identificação de usuária(o) (UID), shell, grupo inicial, diretório home, etc. |
|
Edita os arquivos |
|
Edita os arquivos |
|
Biblioteca para lidar com intervalos subordinados de id para usuárias(os) e grupos |
O pacote GCC contém a GNU Compiler Collection, a qual inclui os compiladores C e C++.
Se construir em x86_64, [então] mude o nome padrão de diretório para bibliotecas de 64 bits para “lib”:
case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;; esac
A documentação do GCC recomenda construir o GCC em um diretório de construção dedicado:
mkdir -v build cd build
Prepare o GCC para compilação:
../configure --prefix=/usr \ LD=ld \ --enable-languages=c,c++ \ --enable-default-pie \ --enable-default-ssp \ --enable-host-pie \ --disable-multilib \ --disable-bootstrap \ --disable-fixincludes \ --with-system-zlib
O GCC suporta sete linguagens computacionais, porém os pré-requisitos para a maior parte delas ainda não foram instalados. Veja-se a página do GCC do Livro BLFS para instruções a respeito do como construir todas as linguagens suportadas do GCC.
O significado dos novos parâmetros de configuração:
LD=ld
Esse parâmetro induz o script configure a usar o aplicativo ld instalado pelo pacote Binutils, construído anteriormente neste capítulo, em vez da versão construída cruzadamente, a qual de outra maneira seria usada.
--disable-fixincludes
Por padrão, durante a instalação do GCC alguns cabeçalhos de sistema seriam “corrigidos” para serem usados com o GCC. Isso não é necessário para um sistema moderno Linux e potencialmente danoso se um pacote for reinstalado depois de instalar o GCC. Essa chave evita que o GCC “corrija” os cabeçalhos.
--with-system-zlib
Essa chave diz ao GCC para vincular à cópia instalada do sistema da biblioteca Zlib, em vez da própria cópia interna dele.
PIE (position-independent executables) são aplicativos binários que conseguem ser carregados em qualquer lugar em memória. Sem PIE, o recurso de segurança chamado de ASLR (Address Space Layout Randomization) consegue ser aplicado para as bibliotecas compartilhadas, porém não para os próprios executáveis. Habilitar PIE permite ASLR para os executáveis em adição às bibliotecas compartilhadas e mitiga alguns ataques baseados em endereços fixos de código ou dados sensível(is) nos executáveis.
SSP (Stack Smashing Protection) é uma técnica para garantir que a pilha de parâmetros não está corrompida. A corrupção da pilha consegue, por exemplo, alterar o endereço de retorno de uma sub-rotina, dessa forma transferindo controle para algum código perigoso (existente no aplicativo ou nas bibliotecas compartilhadas; ou injetado pelo(a) atacante de alguma maneira).
Compile o pacote:
make
Nesta seção, a suíte de teste para o GCC é considerada importante, porém ela toma um tempo longo. Construtoras(es) de primeira vez são encorajadas(os) a executar a suíte de teste. O tempo para executar os testes pode ser reduzido significantemente adicionando-se -jx ao comando make -k check abaixo, onde x é o número de núcleos da CPU em seu sistema.
O GCC pode precisar de mais espaço de pilha para compilar alguns padrões de código extremamente complexos. Como precaução para as distribuições anfitriãs com um limite de pilha apertado, configure explicitamente o limite rígido do tamanho da pilha como infinito. Na maioria das distribuições anfitriãs (e no sistema LFS final), o limite rígido é infinito por padrão, mas não há mal algum em configurá-lo explicitamente. Não é necessário mudar o limite flexível do tamanho da pilha porque o GCC o configurará automaticamente para um valor apropriado, desde que o valor não exceda o limite rígido:
ulimit -s -H unlimited
Agora remova/corrija várias falhas conhecidas de teste:
sed -e '/cpython/d' -i ../gcc/testsuite/gcc.dg/plugin/plugin.exp sed -e 's/no-pic /&-no-pie /' -i ../gcc/testsuite/gcc.target/i386/pr113689-1.c sed -e 's/300000/(1|300000)/' -i ../libgomp/testsuite/libgomp.c-c++-common/pr109062.c sed -e 's/{ target nonpic } //' \ -e '/GOTPCREL/d' -i ../gcc/testsuite/gcc.target/i386/fentryname3.c
Teste os resultados como um(a) usuário(a) não privilegiado(a), porém não pare em erros:
chown -R tester . su tester -c "PATH=$PATH make -k check"
Para extrair um sumário dos resultados da suíte de teste, execute:
../contrib/test_summary
Para filtrar somente os sumários, entube a saída gerada por
grep -A7
Summ
.
Os resultados podem ser comparados com aqueles localizados em https://www.linuxfromscratch.org/lfs/build-logs/12.2/ e https://gcc.gnu.org/ml/gcc-testresults/.
Umas poucas falhas inesperadas não podem ser evitadas sempre. A menos que os resultados do teste sejam amplamente diferentes daqueles na URL acima, é seguro continuar.
Instale o pacote:
make install
O diretório de construção do GCC é de propriedade de
tester
agora e a propriedade
do diretório do cabeçalho instalado (e o conteúdo dele) está
incorreto. Mude a propriedade para o(a) usuário(a) e grupo
root
:
chown -v -R root:root \ /usr/lib/gcc/$(gcc -dumpmachine)/14.2.0/include{,-fixed}
Crie um link simbólico exigido pelo FHS por razões "históricas".
ln -svr /usr/bin/cpp /usr/lib
Muitos pacotes usam o nome cc para chamar o compilador C. Já criamos cc como um link simbólico em gcc-passagem2; crie a página de manual dele como um link simbólico também:
ln -sv gcc.1 /usr/share/man/man1/cc.1
Adicione um link simbólico de compatibilidade para habilitar a construção de aplicativos com Link Time Optimization (LTO):
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/14.2.0/liblto_plugin.so \ /usr/lib/bfd-plugins/
Agora que nosso conjunto de ferramentas final está no lugar, é importante certificar-se novamente de que compilação e vinculação funcionarão como esperado. Nós fazemos isso realizando algumas verificações de sanidade:
echo 'int main(){}' > dummy.c cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'
Não deveriam existir erros e a saída gerada do último comando será (permitindo diferenças específicas de plataforma no nome do vinculador dinâmico):
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
Agora tenha certeza de que nós estamos configurados para usar os arquivos de início corretos:
grep -E -o '/usr/lib.*/S?crt[1in].*succeeded' dummy.log
A saída gerada do último comando deveria ser:
/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.0/../../../../lib/Scrt1.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.0/../../../../lib/crti.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.0/../../../../lib/crtn.o succeeded
Dependendo da arquitetura da sua máquina, o acima
possivelmente difira ligeiramente. A diferença será o nome do
diretório depois de /usr/lib/gcc
. A coisa importante a se olhar
aqui é que o gcc tenha encontrado todos
os três arquivos crt*.o
sob o
diretório /usr/lib
.
Verifique se o compilador está procurando os arquivos de cabeçalho corretos:
grep -B4 '^ /usr/include' dummy.log
Esse comando deveria retornar a seguinte saída gerada:
#include <...> search starts here:
/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.0/include
/usr/local/include
/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.0/include-fixed
/usr/include
Novamente, o diretório nomeado depois do seu trio alvo possivelmente seja diferente do acima, dependendo da arquitetura do seu sistema.
Agora, verifique se o novo vinculador está sendo usado com os caminhos de procura corretos:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
As referências a caminhos que tem componentes com '-linux-gnu' deveriam ser ignoradas, porém, do contrário, a saída gerada do último comando deveria ser:
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64")
SEARCH_DIR("/usr/local/lib64")
SEARCH_DIR("/lib64")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
Um sistema de 32 bits possivelmente use uns poucos outros diretórios. Por exemplo, aqui está a saída gerada originária de uma máquina i686:
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib32")
SEARCH_DIR("/usr/local/lib32")
SEARCH_DIR("/lib32")
SEARCH_DIR("/usr/lib32")
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
Em seguida, tenha certeza de que nós estamos usando a libc correta:
grep "/lib.*/libc.so.6 " dummy.log
A saída gerada do último comando deveria ser:
attempt to open /usr/lib/libc.so.6 succeeded
Tenha certeza de que o GCC está usando o vinculador dinâmico correto:
grep found dummy.log
A saída gerada do último comando deveria ser (permitindo diferenças específicas de plataforma no nome do vinculador dinâmico):
found ld-linux-x86-64.so.2 at /usr/lib/ld-linux-x86-64.so.2
Se a saída gerada não aparecer como mostrada acima ou não for recebida de jeito nenhum, então alguma coisa está seriamente errada. Investigue e refaça os passos para descobrir onde o problema está e corrigi-lo. Quaisquer problemas deveriam ser resolvidos antes de continuar com o processo.
Uma vez que tudo esteja funcionando corretamente, remova os arquivos de teste:
rm -v dummy.c a.out dummy.log
Finalmente, mova um arquivo mal colocado:
mkdir -pv /usr/share/gdb/auto-load/usr/lib mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib
O compilador C++ |
|
O compilador C |
|
O preprocessador C; é usado pelo compilador para expandir as diretivas #include, #define e similares nos arquivos fonte |
|
O compilador C++ |
|
O compilador C |
|
Um encapsulador em torno de ar que adiciona um plugin à linha de comando. Esse aplicativo é usado somente para adicionar "link time optimization" e não é útil com as opções padrão de construção. |
|
Um encapsulador em torno de nm que adiciona um plugin à linha de comando. Esse aplicativo é usado somente para adicionar "link time optimization" e não é útil com as opções padrão de construção. |
|
Um encapsulador em torno de ranlib que adiciona um plugin à linha de comando. Esse aplicativo é usado somente para adicionar "link time optimization" e não é útil com as opções padrão de construção. |
|
Uma ferramenta de testagem de cobertura; usada para analisar aplicativos para determinar onde as otimizações terão o maior efeito |
|
Ferramenta de despejo de perfil offline gcda e gcno |
|
Ferramenta de processamento de perfil offline gcda |
|
Ferramenta para despejar arquivos objeto produzidos pelo GCC com LTO habilitado |
|
A biblioteca de tempo de execução Address Sanitizer |
|
Biblioteca de tempo de execução integrada atômica do GCC |
|
Uma biblioteca que permite ao "GDB" fazer uso do "GCC" |
|
Contém suporte de tempo de execução para o gcc |
|
Essa biblioteca é vinculada a um aplicativo quando o GCC for instruído a habilitar criação de perfil |
|
Implementação GNU da API OpenMP para programação paralela de memória compartilhada multiplataforma em C/C++ e Fortran |
|
A biblioteca de tempo de execução do Address Sanitizer assistida por hardware |
|
A biblioteca de memória transacional GNU |
|
A biblioteca de tempo de execução Leak Sanitizer |
|
Plugin LTO do GCC permite ao Binutils processar arquivos objeto produzidos pelo GCC com LTO habilitado |
|
API da Biblioteca GCC Quad Precision Math |
|
Contém rotinas suportantes da funcionalidade de proteção contra esmagamento de pilha do GCC. |
|
A biblioteca padrão C++ |
|
Biblioteca Experimental de Contratos C++ |
|
Biblioteca de Sistema de Arquivos ISO/IEC TS 18822:2015 |
|
Fornece rotinas suportantes para a linguagem de programação C++ |
|
A biblioteca de tempo de execução Thread Sanitizer |
|
A biblioteca de tempo de execução Undefined Behavior Sanitizer |
O pacote Ncurses contém bibliotecas para manuseio independente de terminal das telas de caracteres .
Prepare o Ncurses para compilação:
./configure --prefix=/usr \ --mandir=/usr/share/man \ --with-shared \ --without-debug \ --without-normal \ --with-cxx-shared \ --enable-pc-files \ --with-pkg-config-libdir=/usr/lib/pkgconfig
O significado das novas opções de configuração:
--with-shared
Isso faz com que o Ncurses construa e instale bibliotecas C compartilhadas.
--without-normal
Isso evita que o Ncurses construa e instale bibliotecas C estáticas.
--without-debug
Isso evita que o Ncurses construa e instale bibliotecas de depuração.
--with-cxx-shared
Isso faz com que o Ncurses construa e instale vínculos C++ compartilhados. Também evita a construção e instalação de vínculos C++ estáticos.
--enable-pc-files
Essa chave gera e instala arquivos .pc para o pkg-config.
Compile o pacote:
make
Esse pacote tem uma suíte de teste, entretanto ela só pode
ser executada depois que o pacote tiver sido instalado. Os
testes residem no diretório test/
. Veja-se o arquivo README
naquele diretório para maiores
detalhes.
A instalação desse pacote sobrescreverá libncursesw.so.6.5
no local. Isso
possivelmente quebre o processo de shell que esteja usando
código e dados oriundo do arquivo da biblioteca. Instale o
pacote com DESTDIR
e substitua o
arquivo da biblioteca corretamente usando o comando
install (o
cabeçalho curses.h
também é
editado para garantir que a ABI de caracteres largos seja
usada como fizemos em Seção 6.3,
“Ncurses-6.5”):
make DESTDIR=$PWD/dest install install -vm755 dest/usr/lib/libncursesw.so.6.5 /usr/lib rm -v dest/usr/lib/libncursesw.so.6.5 sed -e 's/^#if.*XOPEN.*$/#if 1/' \ -i dest/usr/include/curses.h cp -av dest/* /
Muitos aplicativos ainda esperam que o vinculador seja capaz
de encontrar bibliotecas "Ncurses" de caracteres não largos.
Engane esses aplicativos para se vincularem a bibliotecas de
caracteres largos por meio de links simbólicos (observe que
os links ".so
" só são seguros
com "curses.h
" editado para
sempre usar a "ABI" de caracteres largos):
for lib in ncurses form panel menu ; do ln -sfv lib${lib}w.so /usr/lib/lib${lib}.so ln -sfv ${lib}w.pc /usr/lib/pkgconfig/${lib}.pc done
Finalmente, certifique-se de que aplicativos antigos que
procuram por -lcurses
em tempo
de construção ainda sejam construíveis:
ln -sfv libncursesw.so /usr/lib/libcurses.so
Se desejado, [então] instale a documentação do Ncurses:
cp -v -R doc -T /usr/share/doc/ncurses-6.5
As instruções acima não criam bibliotecas Ncurses de caracteres não largos, uma vez que nenhum pacote instalado por compilação a partir dos fontes se vincularia a elas em tempo de execução. Entretanto, os únicos aplicativos somente binário conhecidos que se vinculam à bibliotecas Ncurses de caracteres não largos exigem a versão 5. Se você precisa ter tais bibliotecas, por causa de algum aplicativo somente binário ou para estar conforme com a LSB, [então] construa o pacote novamente com os seguintes comandos:
make distclean ./configure --prefix=/usr \ --with-shared \ --without-normal \ --without-debug \ --without-cxx-binding \ --with-abi-version=5 make sources libs cp -av lib/lib*.so.5* /usr/lib
Converte uma descrição termcap em uma descrição terminfo |
|
Limpa a tela, se possível |
|
Compara ou imprime descrições terminfo |
|
Converte uma descrição terminfo em uma descrição termcap |
|
Fornece informação de configuração para o ncurses |
|
Reinicializa um terminal para valores padrão dele |
|
Limpa e configura paradas de tabulação em um terminal |
|
O compilador de descrição de entrada do terminfo que traduz um arquivo terminfo do formato fonte para o formato binário necessário para as rotinas de biblioteca do ncurses [Um arquivo terminfo contém informação a respeito dos recursos de um certo terminal]. |
|
Lista todos os tipos de terminal disponíveis, dando o nome primário e descrição para cada |
|
Torna os valores de recursos dependentes de terminal disponíveis para o shell; também pode ser usado para reconfigurar ou inicializar um terminal ou informar o nome longo dele |
|
Pode ser usado para inicializar terminais |
|
Contém funções para exibir texto em muitas maneiras complexas em uma tela de terminal; um bom exemplo do uso dessas funções é o menu exibido durante o make menuconfig do núcleo |
|
Contém vinculamentos C++ para outras bibliotecas nesse pacote |
|
Contém funções para implementar formulários |
|
Contém funções para implementar menus |
|
Contém funções para implementar painéis |
O pacote Sed contém um editor de fluxo.
Prepare o Sed para compilação:
./configure --prefix=/usr
Compile o pacote e gere a documentação HTML:
make make html
Para testar os resultados, emita:
chown -R tester . su tester -c "PATH=$PATH make check"
Instale o pacote e a documentação dele:
make install install -d -m755 /usr/share/doc/sed-4.9 install -m644 doc/sed.html /usr/share/doc/sed-4.9
O pacote Psmisc contém aplicativos para exibir informação a respeito de processos em execução.
Prepare Psmisc para compilação:
./configure --prefix=/usr
Compile o pacote:
make
Para executar a suíte de teste, execute:
make check
Instale o pacote:
make install
Informa os IDs de Processos (PIDs) de processos que usam os arquivos ou sistemas de arquivos dados |
|
Mata processos pelo nome; envia um sinal para todos os processos executando quaisquer dos comandos dados |
|
Dê uma olhada nos descritores de arquivo de um processo em execução, dado seu PID |
|
Imprime informação a respeito de um processo |
|
Informa o caminho atual de registros de um processo |
|
Exibe processos em execução como uma árvore |
|
O mesmo que pstree, exceto que ele espera por confirmação antes de sair |
O pacote Gettext contém utilitários para internacionalização e localização. Eles permitem que aplicativos sejam compilados com Suporte ao Idioma Nativo (Native Language Support - NLS), habilitando-os a emitir mensagens no idioma nativo do(a) usuário(a).
Prepare o Gettext para compilação:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/gettext-0.22.5
Compile o pacote:
make
Para testar os resultados (isso toma um tempo longo, em torno de 3 UPCs), emita:
make check
Instale o pacote:
make install chmod -v 0755 /usr/lib/preloadable_libintl.so
Copia arquivos de infraestrutura padrão do Gettext para um pacote fonte |
|
Substitui variáveis de ambiente em sequências de caracteres de formato de shell |
|
Traduz uma mensagem natural de idioma para o idioma do(a) usuário(a) procurando a tradução em um catálogo de mensagens |
|
Primariamente serve como uma biblioteca de função de shell para o gettext |
|
Copia todos os arquivos padrão do Gettext para o diretório de nível superior fornecido de um pacote para começar a internacionalizá-lo |
|
Filtra as mensagens de um catálogo de tradução de acordo com os atributos delas e manipula os atributos |
|
Concatena e mescla os arquivos |
|
Compara dois arquivos |
|
Encontra as mensagens que são comuns aos arquivos
|
|
Converte um catálogo de tradução para uma codificação de caracteres diferente |
|
Cria um catálogo de tradução em inglês |
|
Aplica um comando a todas as traduções de um catálogo de tradução |
|
Aplica um filtro a todas as traduções de um catálogo de tradução |
|
Gera um catálogo de mensagem binária a partir de um catálogo de tradução |
|
Extrai todas as mensagens de um catálogo de tradução que correspondem a um determinado padrão ou pertencem a alguns arquivos fonte fornecidos |
|
Cria um novo arquivo |
|
Combina duas traduções cruas em arquivo único |
|
Descompila um catálogo de mensagem binário em texto de tradução cru |
|
Unifica traduções duplicadas em um catálogo de tradução |
|
Exibe traduções no idioma nativo de uma mensagem textual cuja forma gramatical depende de um número |
|
Re-codifica texto sérvio do cirílico para alfabeto latino |
|
Extrai as linhas de mensagem traduzíveis dos arquivos fonte fornecidos para fazer o primeiro modelo de tradução |
|
Define a classe autosprintf, que torna as rotinas de saída gerada formatada em C utilizáveis em aplicativos C++, para uso com as sequências de caracteres <string> e os fluxos <iostream> |
|
Contém rotinas comuns usadas pelos vários aplicativos do Gettext; elas não são destinadas para uso geral |
|
Usada para escrever aplicativos especializados que
processam arquivos |
|
Fornece rotinas comuns usadas pelos vários aplicativos do Gettext; elas não são destinadas para uso geral |
|
Biblioteca de estilização de texto |
|
Uma biblioteca, destinada a ser usada por
LD_PRELOAD que auxilia a |
O pacote Bison contém um gerador de analisador.
Prepare o Bison para compilação:
./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.8.2
Compile o pacote:
make
Para testar os resultados (cerca de 5,5 UPCs), emita:
make check
Instale o pacote:
make install
Gera, a partir de uma série de regras, um aplicativo para analisar a estrutura de arquivos de texto; Bison é uma substituição ao Yacc (Yet Another Compiler Compiler) |
|
Um encapsulador para bison, destinado
a aplicativos que ainda chamam yacc em vez de
bison; ele chama
bison
com a opção |
|
A biblioteca Yacc contendo implementações de
funções compatíveis com Yacc |
O pacote Grep contém aplicativos para procura ao longo do conteúdo de arquivos.
Primeiro, remova um aviso a respeito de usar egrep e fgrep que induz os testes em alguns pacotes a falharem:
sed -i "s/echo/#echo/" src/egrep.sh
Prepare o Grep para compilação:
./configure --prefix=/usr
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
Imprime linhas correspondentes a uma expressão regular estendida. Isso está obsoleto; use grep -E em vez disso |
|
Imprime linhas correspondentes a uma lista de sequências de caracteres fixas. Isso está obsoleto; use grep -F em vez disso |
|
Imprime linhas correspondentes a expressão regular básica |
O pacote Bash contém o Bourne-Again SHell.
Prepare o Bash para compilação:
./configure --prefix=/usr \ --without-bash-malloc \ --with-installed-readline \ bash_cv_strtold_broken=no \ --docdir=/usr/share/doc/bash-5.2.32
O significado da nova opção do configure:
--with-installed-readline
Essa opção diz ao Bash para usar a biblioteca
readline
que já está
instalada no sistema em vez de usar a própria versão
dele da readline.
Compile o pacote:
make
Pule para “Instale o pacote” se não executar a suíte de teste.
Para preparar os testes, garanta que o(a) usuário(a)
tester
consegue escrever na
árvore dos fontes:
chown -R tester .
A suíte de teste desse pacote é projetada para ser executada
como um(a) usuário(a) não root
que é proprietário(a) do terminal
conectado à entrada padrão. Para satisfazer a exigência, gere
um novo pseudo terminal usando o Expect e execute os testes como o(a)
usuário(a) tester
:
su -s /usr/bin/expect tester << "EOF" set timeout -1 spawn make tests expect eof lassign [wait] _ _ _ value exit $value EOF
A suíte de teste usa o diff para detectar a
diferença entre a saída gerada do script de teste e a saída
gerada esperada. Qualquer saída gerada oriunda do
diff (prefixada
com <
e >
) indica uma falha de teste, a
menos que exista uma mensagem dizendo que a diferença pode
ser ignorada. Um teste chamado run-builtins
é conhecido por falhar em
algumas distribuições anfitriãs com uma diferença na primeira
linha da saída gerada.
Instale o pacote:
make install
Execute o aplicativo recém compilado bash (substituindo o que está sendo executado atualmente):
exec /usr/bin/bash --login
Um interpretador de comandos vastamente usado; ele realiza muitos tipos de expansões e substituições sobre uma dada linha de comando antes de executá-la, portanto fazendo desse interpretador uma ferramenta poderosa |
|
Um script de shell para ajudar o(a) usuário(a) a compor e enviar relatórios de defeitos formatados padrão concernentes ao bash |
|
Um link simbólico para o aplicativo bash; quando invocado como sh, o bash tenta imitar o comportamento de inicialização de versões históricas do sh o mais próximo possível, enquanto conformante ao padrão POSIX também |
O pacote Libtool contém o script de suporte à biblioteca genérica GNU. Ele torna o uso de bibliotecas compartilhadas mais simples com uma interface consistente, portável.
Prepare Libtool para compilação:
./configure --prefix=/usr
Compile o pacote:
make
Para testar os resultados, emita:
make -k check
Cinco testes são conhecidos por falharem no ambiente de construção do LFS, devido a uma dependência circular, porém esses testes passam se verificados novamente depois que o "automake" tiver siso instalado. Adicionalmente, com o "grep-3.8" ou mais recente, dois testes deflagrarão um aviso para expressões regulares não "POSIX" e falharão.
Instale o pacote:
make install
Remova uma biblioteca estática inútil:
rm -fv /usr/lib/libltdl.a
O pacote GDBM contém o GNU Database Manager. Ele é uma biblioteca de funções de base de dados que usa hash extensível e funciona semelhante ao dbm UNIX padrão. A biblioteca fornece primitivos para armazenar pares de chave/dados, pesquisar e recuperar os dados pela sua chave deles e deletar uma chave junto com os dados dela.
Prepare GDBM para compilação:
./configure --prefix=/usr \ --disable-static \ --enable-libgdbm-compat
O significado da opção de configure:
--enable-libgdbm-compat
Essa chave habilita construir a biblioteca de compatibilidade libgdbm. Alguns pacotes fora do LFS possivelmente exijam as rotinas DBM mais antigas que ela fornece.
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
Gperf gera uma função de hash perfeita a partir de um conjunto de chaves.
Prepare Gperf para compilação:
./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.1
Compile o pacote:
make
Os testes são conhecidos por falharem se executar múltiplos testes simultâneos (opção -j maior que 1). Para testar os resultados, emita:
make -j1 check
Instale o pacote:
make install
O pacote Expat contém uma biblioteca C orientada a fluxo para analisar XML.
Prepare Expat para compilação:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/expat-2.6.2
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
Se desejado, instale a documentação:
install -v -m644 doc/*.{html,css} /usr/share/doc/expat-2.6.2
O pacote Inetutils contém aplicativos para operação interativa básica de dispositivos via rede de comunicação.
Primeiro, faça a construção do pacote com gcc-14.1 ou posterior::
sed -i 's/def HAVE_TERMCAP_TGETENT/ 1/' telnet/telnet.c
Prepare Inetutils para compilação:
./configure --prefix=/usr \ --bindir=/usr/bin \ --localstatedir=/var \ --disable-logger \ --disable-whois \ --disable-rcp \ --disable-rexec \ --disable-rlogin \ --disable-rsh \ --disable-servers
O significado das opções do configure:
--disable-logger
Essa opção impede que o Inetutils instale o aplicativo logger, o qual é usado por scripts para passar mensagens para o System Log Daemon. Não o instale, pois o Util-linux instala uma versão mais recente.
--disable-whois
Essa opção desabilita a construção do cliente whois do Inetutils, o qual está desatualizado. Instruções para um cliente whois melhor estão no livro BLFS.
--disable-r*
Esses parâmetros desabilitam a construção de aplicativos obsoletos que não deveriam ser usados devido a problemas de segurança. As funções fornecidas por esses aplicativos podem ser fornecidas pelo pacote openssh no livro BLFS.
--disable-servers
Isso desabilita a instalação dos vários servidores de rede de comunicação incluídos como parte do pacote Inetutils. Esses servidores são considerados inadequados em um sistema LFS básico. Alguns são inseguros por natureza e só são considerados seguros em redes de comunicação confiáveis. Observe que substituições melhores estão disponíveis para muitos desses servidores.
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
Mova um aplicativo para o local adequado:
mv -v /usr/{,s}bin/ifconfig
Mostra o nome de domínio DNS do sistema |
|
É o aplicativo do protocolo de transferência de arquivos |
|
Informa ou configura o nome do dispositivo |
|
Gerencia interfaces da rede de comunicação |
|
Envia pacotes de solicitação de echo e informa quanto tempo as respostas demoram |
|
Uma versão do ping para redes de comunicação IPv6 |
|
É usado para conversar com outro(a) usuário(a) |
|
Uma interface para o protocolo TELNET |
|
Um aplicativo de transferência de arquivos trivial |
|
Traça a rota que seus pacotes fazem a partir do dispositivo no qual você está trabalhando para outro dispositivo em uma rede de comunicação, mostrando todos os saltos intermediários (gateways) ao longo do caminho |
O pacote Less contém um visualizador de arquivos de texto.
Prepare Less para compilação:
./configure --prefix=/usr --sysconfdir=/etc
O significado das opções do configure:
--sysconfdir=/etc
Essa opção diz aos aplicativos criados pelo pacote para
procurarem em /etc
pelos
arquivos de configuração.
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
Um visualizador de arquivos ou paginador; ele exibe o conteúdo do arquivo dado, permitindo que o(a) usuário(a) role, encontre sequências de caracteres e pule para marcas |
|
Necessário para expandir meta caracteres, tais como * e ?, em nomes de arquivos em sistemas Unix |
|
Usado para especificar os atalhos de tecla para o less |
O pacote Perl contém o Practical Extraction and Report Language.
Essa versão do Perl constrói os módulos Compress::Raw::Zlib e Compress::Raw::BZip2. Por padrão, Perl usará uma cópia interna dos fontes para a construção. Emita o seguinte comando de modo que o Perl usará as bibliotecas instaladas no sistema:
export BUILD_ZLIB=False export BUILD_BZIP2=0
Para ter controle completo sobre a maneira como o Perl é configurado, você pode remover as opções “-des” do comando seguinte e escolher manualmente a maneira como esse pacote é construído. Alternativamente, use o comando exatamente como mostrado abaixo para usar os padrões que o Perl detecta automaticamente:
sh Configure -des \ -D prefix=/usr \ -D vendorprefix=/usr \ -D privlib=/usr/lib/perl5/5.40/core_perl \ -D archlib=/usr/lib/perl5/5.40/core_perl \ -D sitelib=/usr/lib/perl5/5.40/site_perl \ -D sitearch=/usr/lib/perl5/5.40/site_perl \ -D vendorlib=/usr/lib/perl5/5.40/vendor_perl \ -D vendorarch=/usr/lib/perl5/5.40/vendor_perl \ -D man1dir=/usr/share/man/man1 \ -D man3dir=/usr/share/man/man3 \ -D pager="/usr/bin/less -isR" \ -D useshrplib \ -D usethreads
O significado das novas opções do "Configure":
-D
pager="/usr/bin/less -isR"
Isso garante que o less
seja usado em
vez do more
.
-D
man1dir=/usr/share/man/man1 -D
man3dir=/usr/share/man/man3
Uma vez que o Groff ainda não está instalado, Configure não criará páginas de manual para o Perl. Esses parâmetros substituem esse comportamento.
-D
usethreads
Constrói O Perl com suporte para camadas.
Compile o pacote:
make
Para testar os resultados (aproximadamente 11 UPCs), emita:
TEST_JOBS=$(nproc) make test_harness
Instale o pacote e limpe:
make install unset BUILD_ZLIB BUILD_BZIP2
Uma estrutura de interação direta com o(a) usuário(a) por linha de comando para Module::CoreList |
|
Interage com a Comprehensive Perl Archive Network (CPAN) a partir da linha de comando |
|
Constrói uma extensão do Perl para o módulo Encode a partir tanto de Mapeamentos de Caracteres Unicode quanto de Arquivos de Codificação da Tcl |
|
Advinha o tipo de codificação de um ou vários arquivos |
|
Converte arquivos de cabeçalho C |
|
Converte arquivos de cabeçalho C |
|
Script de shell para examinar módulos do Perl instalados; consegue criar um tarball a partir de um módulo instalado |
|
Converte dados entre certos formatos de entrada gerada e de saída gerada |
|
Pode ser usado para configurar o módulo do Perl
|
|
Combina alguns dos melhores recursos do C, sed, awk e sh em uma linguagem canivete suíço única |
|
Um link rígido para perl |
|
Usado para gerar informes de defeitos a respeito do Perl ou dos módulos que vem como ele, e enviá-los por correio |
|
Exibe um pedaço da documentação em formato pod que está embutida na árvore de instalação do Perl ou em um script do Perl |
|
O Procedimento de Verificação de Instalação do Perl; pode ser usado para verificar se o Perl e as bibliotecas dele foram instalados corretamente |
|
Usado para gerar mensagens de agradecimento para enviar para os(as) desenvolvedores(as) do Perl |
|
Uma versão Perl do conversor de codificação de caracteres iconv |
|
Uma ferramenta rudimentar para converter arquivos
Perl4 |
|
Converte arquivos do formato pod para o formato HTML |
|
Converte dados pod para entrada gerada formatada *roff |
|
Converte dados pod para texto formatado ASCII |
|
Imprime mensagens de uso a partir de documentos pod embutidos em arquivos |
|
Verifica a sintaxe de arquivos de documentação do formato pod |
|
Exibe seções selecionadas da documentação pod |
|
Ferramenta de linha de comando para executar testes contra o módulo Test::Harness |
|
Um aplicativo similar ao tar escrito em Perl |
|
Um aplicativo Perl que compara um arquivamento extraído com um não extraído |
|
Um aplicativo Perl que aplica correspondência de padrão ao conteúdo de arquivos em um arquivamento tar |
|
Imprime ou verifica somas de verificação SHA |
|
É usado para forçar diagnósticos verbosos de aviso em Perl |
|
Converte código Perl XS em código C |
|
Exibe detalhes a respeito da estrutura interna de um arquivo Zip |
O módulo XML::Parser é uma interface Perl para o analisador de XML do James Clark, Expat.
Prepare XML::Parser para compilação:
perl Makefile.PL
Compile o pacote:
make
Para testar os resultados, emita:
make test
Instale o pacote:
make install
O Intltool é uma ferramenta de internacionalização usada para extrair sequências de caracteres traduzíveis a partir de arquivos fonte.
Primeiro, corrija um aviso que é causado por perl-5.22 e posteriores:
sed -i 's:\\\${:\\\$\\{:' intltool-update.in
A expressão regular acima parece incomum por causa de todas as contra barras. O que ela faz é adicionar uma contra barra antes do carácter abre chave na sequência '\${' resultando em '\$\{'.
Prepare Intltool para compilação:
./configure --prefix=/usr
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install install -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTO
Prepara um pacote para usar intltool |
|
Gera arquivos de cabeçalho que podem ser lidos por gettext |
|
Mescla sequência de caracteres traduzidos em vários tipos de arquivos |
|
Atualiza arquivos pot e os mescla com arquivos de tradução |
|
Atualiza os arquivos de modelo po e os mescla com as traduções |
O pacote Autoconf contém aplicativos para produzir scripts de shell que conseguem configurar automaticamente código fonte.
Prepare Autoconf para compilação:
./configure --prefix=/usr
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
Produz scripts de shell que configuram automaticamente pacotes de código fonte de aplicativos para adaptar a muitos tipos de sistemas semelhantes a Unix; os scripts de configuração que ele produz são independentes—executá-los não exige o aplicativo autoconf |
|
Uma ferramenta para criar arquivos de modelo de declarações #define da C para o configure usar |
|
Um encapsulador para o processador de macro M4 |
|
Automaticamente executa autoconf, autoheader, aclocal, automake, gettextize e libtoolize na ordem correta para economizar tempo quando mudanças são feitas para arquivos de modelo autoconf e automake |
|
Ajuda a criar um arquivo |
|
Modifica um arquivo |
|
Ajuda ao escrever arquivos |
O pacote Automake contém aplicativos para gerar arquivos Make para uso com o Autoconf.
Prepare Automake para compilação:
./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.17
Compile o pacote:
make
Usar-se quatro tarefas paralelas acelera os testes, mesmo em sistemas com menos núcleos lógicos, devido a atrasos internos em testes individuais. Para testar os resultados, emita:
make -j$(($(nproc)>4?$(nproc):4))
check
Substitua "$((...))
" pelo número de
núcleos lógicos que você deseja usar se não quiser usar
todos.
Instale o pacote:
make install
Gera arquivos |
|
Um link rígido para aclocal |
|
Uma ferramenta para gerar automaticamente arquivos
|
|
Um link rígido para automake |
O pacote OpenSSL contém ferramentas de gerenciamento e bibliotecas relacionadas à criptografia. Essas são úteis para fornecer funções criptográficas para outros pacotes, tais como o OpenSSH, aplicativos de correio eletrônico e navegadores de rede (para acessar sítios HTTPS).
Prepare OpenSSL para compilação:
./config --prefix=/usr \ --openssldir=/etc/ssl \ --libdir=lib \ shared \ zlib-dynamic
Compile o pacote:
make
Para testar os resultados, emita:
HARNESS_JOBS=$(nproc)
make test
Um teste, 30-test_afalg.t, é conhecido por falhar se o núcleo
do anfitrião não tiver CONFIG_CRYPTO_USER_API_SKCIPHER
habilitado ou
não tiver quaisquer opções fornecendo um AES com
implementação CBC (por exemplo, a combinação de CONFIG_CRYPTO_AES
e CONFIG_CRYPTO_CBC
; ou CONFIG_CRYPTO_AES_NI_INTEL
se a CPU suportar
AES-NI) habilitado. Se falhar, pode ser seguramente ignorado.
Instale o pacote:
sed -i '/INSTALL_LIBS/s/libcrypto.a libssl.a//' Makefile make MANSUFFIX=ssl install
Adicione a versão ao nome de diretório de documentação, para ser consistente com outros pacotes:
mv -v /usr/share/doc/openssl /usr/share/doc/openssl-3.3.1
Se desejado, instale alguma documentação adicional:
cp -vfr doc/* /usr/share/doc/openssl-3.3.1
Você deveria atualizar o OpenSSL quando uma versão nova que
corrige vulnerabilidades for anunciada. Desde o OpenSSL
3.0.0, o esquema de versionamento do OpenSSL segue o
formato MAIOR.MENOR.REMENDO. Compatibilidade de API/ABI é
garantida para o mesmo número de versão MAIOR. Por causa de
que o LFS instala somente as bibliotecas compartilhadas,
não existe necessidade de recompilar pacotes que se
vinculem à libcrypto.so
ou à
libssl.so
quando atualizar para uma versão com o mesmo
número de versão MAIOR.
Entretanto, quaisquer aplicativos em execução vinculados àquelas bibliotecas precisam ser parados e reiniciados. Leiam-se as entradas relacionadas em Seção 8.2.1, “Problemas de Atualização” para detalhes.
é um script Perl que escaneia todos os arquivos em um diretório e adiciona links simbólicos para os valores de hash deles. O uso do c_rehash é considerado obsoleto e deveria ser substituído pelo comando openssl rehash |
|
é uma ferramenta de linha de comando para usar as várias funções criptográficas da biblioteca de criptografia do "OpenSSL" a partir do "shell". Ela pode ser usada para várias funções que estão documentadas em "openssl(1)" |
|
implementa um intervalo amplo de algoritmos criptográficos usados em vários padrões da Internet. Os serviços fornecidos por essa biblioteca são usados pelas implementações OpenSSL do SSL, TLS e S/MIME e eles também tem sido usados para implementar OpenSSH, OpenPGP e outros padrões criptográficos |
|
implementa o protocolo "Transport Layer Security" ("TLS v1"). Ela fornece uma "API" rica, documentação a respeito da qual pode ser encontrada em "ssl(7)" |
O pacote Kmod contém bibliotecas e utilitários para carregar módulos de núcleo
Prepare Kmod para compilação:
./configure --prefix=/usr \ --sysconfdir=/etc \ --with-openssl \ --with-xz \ --with-zstd \ --with-zlib \ --disable-manpages
O significado das opções do configure:
--with-openssl
Essa opção habilita o Kmod a lidar com assinaturas PKCS7 para módulos de núcleo.
--with-xz
, --with-zlib
e --with-zstd
Essas opções habilitam o Kmod a lidar com módulos comprimidos de núcleo.
--disable-manpages
Essa opção desabilita gerar as páginas de manual, o que exige um programa externo.
Compile o pacote:
make
A suíte de teste desse pacote exige cabeçalhos crus de núcleo (não os cabeçalhos “sanitizados” de núcleo instalados anteriormente), os quais estão além do escopo do LFS.
Instale o pacote e recrie alguns links simbólicos para
compatibilidade com Module-Init-Tools (o pacote que
anteriormente manuseava os módulos de núcleo do Linux). O
sistema de construção criará todos esses links simbólicos em
/usr/bin
, mas queremos somente
lsmod lá e
todos os outros links simbólicos em /usr/sbin
em vez disso:
make install for target in depmod insmod modinfo modprobe rmmod; do ln -sfv ../bin/kmod /usr/sbin/$target rm -fv /usr/bin/$target done
Cria um arquivo de dependência baseado nos símbolos que ele encontrar no conjunto existente de módulos; esse arquivo de dependência é usado pelo modprobe para carregar automaticamente os módulos exigidos |
|
Instala um módulo carregável no núcleo em execução |
|
Carrega e descarrega módulos de núcleo |
|
Lista módulos atualmente carregados |
|
Examina um arquivo objeto associado com um módulo de núcleo e exibe qualquer informação que ele consiga coletar |
|
Usa um arquivo de dependência, criado pelo depmod, para carregar automaticamente módulos relevantes |
|
Descarrega módulos a partir do núcleo em execução |
|
Essa biblioteca é usada por outros aplicativos para carregar e descarregar módulos de núcleo |
Libelf é uma biblioteca para lidar com arquivos ELF (Executable and Linkable Format).
Libelf é parte do pacote elfutils-0.191. Use o arquivo elfutils-0.191.tar.bz2 como o tarball fonte.
Prepare Libelf para compilação:
./configure --prefix=/usr \ --disable-debuginfod \ --enable-libdebuginfod=dummy
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale somente o Libelf:
make -C libelf install install -vm644 config/libelf.pc /usr/lib/pkgconfig rm /usr/lib/libelf.a
A biblioteca Libffi fornece uma interface de programação portável e de alto nível para várias convenções de chamada. Isso permite a um(a) programador(a) chamar qualquer função especificada por uma descrição de interface de chamada em tempo de execução.
FFI significa Foreign Function Interface. Uma FFI permite a um aplicativo escrito em uma linguagem chamar um aplicativo escrito em outra linguagem. Especificamente, Libffi consegue fornecer uma ponte entre um interpretador, como Perl ou Python, e sub-rotinas da biblioteca compartilhada escrita em C, ou em C++.
Semelhante a GMP, Libffi constrói com otimizações
específicas para o processador em uso. Se construir para
outro sistema, [então] mude o valor do parâmetro --with-gcc-arch=
no seguinte
comando para um nome de arquitetura completamente
implementada pela CPU naquele sistema. Se isso não for
feito, [então] todos os aplicativos que se vincularem a
libffi
deflagrarão Erros de
Operação Ilegal.
Prepare Libffi para compilação:
./configure --prefix=/usr \ --disable-static \ --with-gcc-arch=native
O significado da opção de configure:
--with-gcc-arch=native
Garante que o GCC otimize para o sistema atual. Se isso não for especificado, [então] o sistema é presumido e o código gerado possivelmente não esteja correto. Se o código gerado será copiado de um sistema nativo para um sistema menos capaz, [então] use o sistema menos capaz como um parâmetro. Para detalhes acerca de tipos alternativos de sistema, vejam-se as opções de x86 no manual do GCC.
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
O pacote Python 3 contém o ambiente de desenvolvimento do Python. Ele é útil para programação orientada a objeto, escrita de scripts, prototipagem de aplicativos grandes e desenvolvimento de aplicações inteiras. Python é uma linguagem interpretada de computador.
Prepare o Python para compilação:
./configure --prefix=/usr \ --enable-shared \ --with-system-expat \ --enable-optimizations
O significado das opções do configure:
--with-system-expat
Essa chave habilita vinculação contra a versão de sistema do Expat.
--enable-optimizations
Essa chave habilita etapas extensivas, porém consumidoras de tempo, de otimização. O interpretador é construído duas vezes; testes realizados na primeira construção são usados para melhorar a versão otimizada final.
Compile o pacote:
make
Alguns testes são conhecidos por travarem, ocasionalmente, indefinidamente. Portanto, para testar os resultados, execute a suíte de teste, mas configure um limite de tempo de dois minutos para cada caso de teste:
make test TESTOPTS="--timeout 120"
Para um sistema relativamente lento, você possivelmente precise aumentar o limite de tempo e 1 UPC (medido ao construir a passagem 1 do Binutils com um elemento de processamento da CPU) deveria ser suficiente. Alguns testes são instáveis, de forma que a suíte de teste automaticamente reexecutará os testes falhos. Se um teste falhou, mas então passou quando reexecutado, ele deveria ser considerado como passado.
Instale o pacote:
make install
Nós usamos o comando pip3 para instalar os
aplicativos e módulos do Python 3 para todos(as) os(as)
usuários(as) como root
em
vários lugares neste livro. Isso conflita com a recomendação
dos(as) desenvolvedores(as) do Python: instalar pacotes no
ambiente virtual ou no diretório home de um(a) usuário(a)
regular (executando pip3 como esse(a)
usuário(a)). Um aviso multi linhas é deflagrado sempre que
pip3 for
emitido pelo(a) usuário(a) root
.
A razão principal para a recomendação é para evitar conflitos com o gerenciador de pacote do sistema (dpkg, por exemplo). O LFS não tem um gerenciador de pacote abrangente ao sistema, de modo que isso não é um problema. Também, o pip3 verificará se existe uma nova versão dele próprio sempre for executado. Uma vez que a resolução de nome de domínio ainda não está configurada no ambiente chroot do LFS, o pip3 não consegue verificar se existe uma nova versão dele próprio e produzirá um aviso.
Depois que nós inicializarmos o sistema LFS e configurarmos uma conexão de rede de comunicação, um aviso diferente será emitido, informando para o(a) usuário(a) atualizar o pip3 a partir de uma roda pré-construída em PyPI (sempre que uma nova versão estiver disponível). Porém, o LFS considera que o pip3 é uma parte do Python 3, de forma que ele não deveria ser atualizado separadamente. Além disso, uma atualização a partir de uma roda pré-construída se desviaria do nosso objetivo: construir um sistema Linux a partir do código fonte. Assim, o aviso a respeito da nova versão do pip3 deveria ser ignorado também. Se desejar, você pode suprimir todos esses avisos executando o seguinte comando, o qual cria um arquivo de configuração:
cat > /etc/pip.conf << EOF
[global]
root-user-action = ignore
disable-pip-version-check = true
EOF
No LFS e no BLFS normalmente nós construímos e instalamos
módulos do Python com o comando pip3. Por favor, tenha
certeza de que os comandos pip3 install em ambos os
livros sejam executados como o(a) usuário(a) root
(a menos que seja para um ambiente
virtual do Python). Executar um pip3 install como um(a)
usuário(a) não root
possivelmente aparente funcionar, porém causará o módulo
instalado ficar inacessível por outros(as) usuários(as).
O pip3
install não reinstalará um módulo já
instalado automaticamente. Quando usar o comando
pip3 install
para atualizar um módulo (por exemplo, de meson-0.61.3 para
meson-0.62.0), insira a opção --upgrade
na linha de
comando. Se realmente for necessário desatualizar um módulo
ou reinstalar a mesma versão por alguma razão, [então]
insira --force-reinstall
--no-deps
na linha de comando.
Se desejado, então instale a documentação pré-formatada:
install -v -dm755 /usr/share/doc/python-3.12.5/html tar --no-same-owner \ -xvf ../python-3.12.5-docs-html.tar.bz2 cp -R --no-preserve=mode python-3.12.5-docs-html/* \ /usr/share/doc/python-3.12.5/html
O significado dos comandos de instalação da documentação:
--no-same-owner
("tar") e --no-preserve=mode
("cp")
Garanta que os arquivos instalados tenham a titularidade de propriedade e as permissões corretas. Sem essas opções, o "tar" instalará os arquivos de pacote com os valores do(a) criador(a) desenvolvedor(a) e os arquivos teriam permissões restritivas.
é um aplicativo Python que lê código fonte Python 2.x e aplica uma série de correções para transformá-lo em código Python 3.x válido |
|
é um script encapsulador que abre um editor GUI ciente do Python. Para esse script executar, você precisa ter instalado Tk antes do Python, de forma que o módulo Tkinter do Python seja construído. |
|
O instalador de pacote para Python. Você pode usar pip para instalar pacotes originários do Python Package Index e outros índices. |
|
é a ferramenta de documentação do Python |
|
é o interpretador para o Python, uma linguagem de programação orientada a objeto, interativa e interpretada |
Flit-core são as partes de construção de distribuição do Flit (uma ferramenta de empacotamento para módulos simples do Python).
Construa o pacote:
pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
Instale o pacote:
pip3 install --no-index --no-user --find-links dist flit_core
O significado das opções e comandos de configuração do pip3:
Esse comando constrói o arquivamento wheel para este pacote.
-w
dist
Instrui o pip a colocar a roda criada no diretório
dist
.
--no-cache-dir
Impede que o "pip" copie a roda criada para o diretório
/root/.cache/pip
.
Esse comando instala o pacote.
--no-build-isolation
,
--no-deps
e
--no-index
Essas opções impedem a busca de arquivos do repositório de pacotes online (PyPI). Se os pacotes fossem instalados na ordem correta, o pip não precisaria buscar nenhum arquivo em primeiro lugar; essas opções adicionam alguma segurança em caso de erro do(a) usuário(a).
--find-links dist
Instrui o pip a procurar por arquivamentos wheel no
diretório dist
.
Wheel é uma biblioteca do Python que é a implementação de referência do padrão de empacotamento de roda do Python.
Compile Wheel com o seguinte comando:
pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
Instale Wheel com o seguinte comando:
pip3 install --no-index --find-links=dist wheel
"Setuptools" é uma ferramenta usada para baixar, construir, instalar, atualizar e desinstalar pacotes "Python".
Construa o pacote:
pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
Instale o pacote:
pip3 install --no-index --find-links dist setuptools
Ninja é um sistema de construção pequeno com um foco em velocidade.
Quando executado, ninja normalmente utiliza o maior número possível de processos em paralelo. Por padrão, esse é o número de núcleos no sistema, mais dois. Isso possivelmente superaqueça a CPU ou faça o sistema ficar sem memória. Quando ninja é invocado a partir da linha de comando, passar o parâmetro -jN limitará o número de processos paralelos. Alguns pacotes embutem a execução do ninja e não passam o parâmetro -j para ele.
Usar o procedimento opcional abaixo permite que um(a) usuário(a) limite o número de processos paralelos via uma variável de ambiente, NINJAJOBS. Por exemplo, configurar:
export NINJAJOBS=4
limitará ninja a quatro processos paralelos.
Se desejado, [então] faça o ninja reconhecer a variável de ambiente NINJAJOBS executando o editor de fluxo:
sed -i '/int Guess/a \ int j = 0;\ char* jobs = getenv( "NINJAJOBS" );\ if ( jobs != NULL ) j = atoi( jobs );\ if ( j > 0 ) return j;\ ' src/ninja.cc
Construa Ninja com:
python3 configure.py --bootstrap
O significado da opção de construção:
--bootstrap
Esse parâmetro força Ninja a reconstruir ele próprio para o sistema atual.
Os testes do pacote não podem executar no ambiente chroot. Eles exigem cmake.
Instale o pacote:
install -vm755 ninja /usr/bin/ install -vDm644 misc/bash-completion /usr/share/bash-completion/completions/ninja install -vDm644 misc/zsh-completion /usr/share/zsh/site-functions/_ninja
Meson é um sistema de construção de código fonte aberto projetado para ser ambos extremamente rápido e tão amigável para o(a) usuário(a) quanto possível.
Compile Meson com o seguinte comando:
pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
A suíte de teste exige alguns pacotes fora do escopo do LFS.
Instale o pacote:
pip3 install --no-index --find-links dist meson install -vDm644 data/shell-completions/bash/meson /usr/share/bash-completion/completions/meson install -vDm644 data/shell-completions/zsh/_meson /usr/share/zsh/site-functions/_meson
O significado dos parâmetros do install:
-w
dist
Coloca as rodas criadas no diretório dist
.
--find-links dist
Instala as rodas a partir do diretório dist
.
O pacote Coreutils contém aplicativos utilitários básicos necessitados por cada sistema operacional.
POSIX exige que aplicativos originários do Coreutils reconheçam limites de carácter corretamente, mesmo em localidades multi bytes. O seguinte remendo corrige essa não-conformidade e outros defeitos relacionados à internacionalização.
patch -Np1 -i ../coreutils-9.5-i18n-2.patch
Muitos defeitos tem sido encontrados nesse remendo. Quando informar novos defeitos para os(as) mantenedores(as) do Coreutils, por favor, verifique primeiro para ver se tais defeitos são reproduzíveis sem esse remendo.
Agora prepare Coreutils para compilação:
autoreconf -fiv FORCE_UNSAFE_CONFIGURE=1 ./configure \ --prefix=/usr \ --enable-no-install-program=kill,uptime
O significado das opções do configure:
O remendo para internacionalização modificou o sistema de construção, de forma que os arquivos de configuração precisam ser regenerados.
FORCE_UNSAFE_CONFIGURE=1
Essa variável de ambiente permite que o pacote seja
construído pelo(a) usuário(a) root
.
--enable-no-install-program=kill,uptime
O propósito dessa chave é o de impedir que o Coreutils instale aplicativos que serão instalados por outros pacotes.
Compile o pacote:
make
Pule para “Instale o pacote” se não executar a suíte de teste.
Agora a suíte de teste está pronta para ser executada.
Primeiro, execute os testes que são destinados a serem
executados como usuário(a) root
:
make NON_ROOT_USERNAME=tester check-root
Nós vamos executar o resto dos testes como o(a) usuário(a)
tester
. Certos testes exigem
que o(a) usuário(a) seja um(a) membro(a) de mais que um
grupo. Portanto, para que esses testes não sejam pulados,
adicione um grupo temporário e torne o(a) usuário(a)
tester
uma parte dele:
groupadd -g 102 dummy -U tester
Corrija algumas das permissões, de modo que o(a) usuário(a)
não root
possa compilar e
executar os testes:
chown -R tester .
Agora execute os testes (usando /dev/null
para a entrada padrão, ou dois
testes possivelmente sejam quebrados se construir o LFS em um
terminal gráfico ou uma sessão em SSH ou GNU Screen porque a
entrada padrão é conectada a um PTY a partir da distribuição
anfitriã, e o nó de dispositivo para tal PTY não pode ser
acessado a partir do ambiente chroot do LFS):
su tester -c "PATH=$PATH make -k RUN_EXPENSIVE_TESTS=yes check" \ < /dev/null
Remova o grupo temporário:
groupdel dummy
Dois testes, tests/cp/preserve-mode.sh
e tests/mv/acl.sh
, são conhecidos por
falharem no ambiente chroot, mas passam em um sistema
completo.
Instale o pacote:
make install
Mova aplicativos para os locais especificados pelo FHS:
mv -v /usr/bin/chroot /usr/sbin mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8 sed -i 's/"1"/"8"/' /usr/share/man/man8/chroot.8
É um comando atual, /usr/bin/[; é um sinônimo para o comando test |
|
Codifica e decodifica dados de acordo com a especificação base32 (RFC 4648) |
|
Codifica e decodifica dados de acordo com a especificação base64 (RFC 4648) |
|
Imprime ou verifica somas de verificação BLAKE2 (512 bits) |
|
Remove qualquer caminho e um dado sufixo de um nome de arquivo |
|
Codifica ou decodifica dados usando vários algoritmos |
|
Concatena arquivos para saída gerada padrão |
|
Muda contexto de segurança para arquivos e diretórios |
|
Muda a propriedade do grupo de arquivos e diretórios |
|
Muda as permissões de cada arquivo para o modo dado; o modo pode ser ou uma representação simbólica das mudanças a serem feitas ou um número octal representando as novas permissões |
|
Muda a propriedade de usuário(a) e (ou) de grupo de arquivos e dos diretórios |
|
Executa um comando com o diretório especificado
como o diretório |
|
Imprime a soma de verificação Cyclic Redundancy Check (CRC) e as contagens de bytes de cada arquivo especificado |
|
Compara dois arquivos ordenados, produzindo em três colunas as linhas que são únicas e as linhas que são comuns |
|
Copia arquivos |
|
Divide um dado arquivo em vários novos arquivos, separando-os de acordo com padrões dados ou números de linha e produzindo a contagem de bytes de cada novo arquivo |
|
Imprime seções de linhas, selecionando as partes de acordo com campos ou posições dados |
|
Exibe a data e hora atual no formato dado ou configura a data e hora do sistema |
|
Copia um arquivo usando o tamanho de bloco e a contagem dado, enquanto opcionalmente realiza conversões sobre ele |
|
Informa a quantidade de espaço em disco disponível (e usada) em todos os sistemas de arquivos montados ou somente nos sistemas de arquivos contendo os arquivos selecionados |
|
Lista o conteúdo de cada diretório dado (o mesmo que o comando ls) |
|
Produz comandos para configurar a variável de
ambiente |
|
Extrai a(s) porção(ões) de diretório(s) do(s) nome(s) dado(s) |
|
Informa a quantidade de espaço em disco usado pelo diretório atual, por cada dos diretórios dados (incluindo todos os subdiretórios) ou por cada dos arquivos dados |
|
Exibe as sequências de caracteres dadas |
|
Executa um comando em um ambiente modificado |
|
Converte tabulação para espaços |
|
Avalia expressões |
|
Imprime os fatores primos dos inteiros especificados |
|
Não faz nada, sem sucesso; sempre sai com um código de status indicando falha |
|
Reformata os parágrafos nos arquivos dados |
|
Quebra as linhas nos arquivos dados |
|
Informa as associações de grupo de um(a) usuário(a) |
|
Imprime as primeiras dez linhas (ou o número de linhas dado) de cada arquivo dado |
|
Informa o identificador numérico (em hexadecimal) do dispositivo |
|
Informa o efetivo ID de usuária(o), ID de grupo e as associações de grupo do(a) usuário(a) atual ou usuária(o) especificada(o) |
|
Copia arquivos enquanto configura os modos de permissão deles e, se possível, proprietário e grupo deles |
|
Junta as linhas que tenham idênticos campos de junção a partir de dois arquivos |
|
Cria um link rígido (com o nome dado) para um arquivo |
|
Faz links rígidos ou links flexíveis (simbólicos) entre arquivos |
|
Informa o nome de login do(a) usuário(a) atual |
|
Lista o conteúdo de cada diretório dado |
|
Informa ou verifica somas de verificação Message Digest 5 (MD5) |
|
Cria diretórios com os nomes dados |
|
Cria First-In, First-Outs (FIFOs), "tubos nomeado" na linguagem UNIX, com os nomes dados |
|
Cria nós de dispositivo com os nomes dados; um nó de dispositivo é um arquivo especial de caractere, um arquivo especial de bloco ou um FIFO |
|
Cria arquivos temporários de uma maneira segura; é usado em conjuntos de comandos sequenciais |
|
Move ou renomeia arquivos ou diretórios |
|
Executa um aplicativo com prioridade de agendamento modificada |
|
Numera as linhas a partir dos arquivos dados |
|
Executa um comando imune a interrupções, com a saída gerada dele redirecionada para um arquivo de registro |
|
Imprime o número de unidades de processamento disponíveis para um processo |
|
Converte números para ou oriundos de sequências de caracteres legíveis por humanos |
|
Despeja arquivos em octal e outros formatos |
|
Mescla os arquivos dados, unindo linhas sequencialmente correspondentes lado a lado, separadas por caracteres de tabulação |
|
Verifica se nomes de arquivos são válidos ou portáveis |
|
É um cliente de dedo leve; ele informa alguma informação a respeito das(os) usuárias(os) dadas(os) |
|
Pagina e coluna arquivos para impressão |
|
Imprime o ambiente |
|
Imprime os argumentos dados de acordo com o formato dado, muito parecido com a função printf do C |
|
Produz um índice permutado a partir do conteúdo dos arquivos dados, com cada palavra-chave no contexto dela |
|
Informa o nome do diretório de trabalho atual |
|
Informa o valor do link simbólico dado |
|
Imprime o caminho resolvido |
|
Remove arquivos ou diretórios |
|
Remove diretórios se eles estiverem vazios |
|
Executa um comando com contexto de segurança especificado |
|
Imprime uma sequência de números dentro de um dado intervalo e com um dado incremento |
|
Imprime ou verifica somas de verificação do Secure Hash Algorithm 1 (SHA1) 160 bits |
|
Imprime ou verifica somas de verificação do Secure Hash Algorithm de 224 bits |
|
Imprime ou verifica somas de verificação do Secure Hash Algorithm de 256 bits |
|
Imprime ou verifica somas de verificação do Secure Hash Algorithm de 384 bits |
|
Imprime ou verifica somas de verificação do Secure Hash Algorithm de 512 bits |
|
Sobrescreve os arquivos dados repetidamente com padrões complexos, tornando difícil recuperar os dados |
|
Embaralha linhas do texto |
|
Pausa pelo período de tempo dado |
|
Ordena as linhas a partir dos arquivos dados |
|
Divide o arquivo dado em pedaços, por tamanho ou por número de linhas |
|
Exibe a situação de arquivo ou sistema de arquivos |
|
Executa comandos com operações de buffer alteradas para fluxos padrão deles |
|
Configura ou informa configurações de linha de terminal |
|
Imprime soma de verificação e contagens de blocos para cada arquivo dado |
|
Libera buffers do sistema de arquivos; isso força blocos modificados para o disco e atualiza o super bloco |
|
Concatena os arquivos dados em ordem reversa |
|
Imprime as últimas dez linhas (ou o número dado de linhas) de cada arquivo dado |
|
Lê a partir da entrada gerada padrão enquanto escreve tanto para a saída gerada padrão quanto para os arquivos dados |
|
Compara valores e verifica tipos de arquivos |
|
Executa um comando com um limite de tempo |
|
Muda carimbos de tempo de arquivo, definindo os horários de acesso e modificação dos arquivos dados para o horário atual; arquivos que não existem são criados com tamanho zero |
|
Traduz, comprime e deleta os caracteres dados a partir da entrada gerada padrão |
|
Não faz nada, com sucesso; sempre sai com um código de situação indicando sucesso |
|
Reduz ou expande um arquivo para o tamanho especificado |
|
Realiza uma ordenação topológica; ele escreve uma lista completamente ordenada de acordo com a ordenação parcial em um arquivo dado |
|
Informa o nome de arquivo do terminal conectado à entrada gerada padrão |
|
Informa informação de sistema |
|
Converte espaços para tabulação |
|
Descarta todas, exceto uma das sucessivas linhas idênticas |
|
Remove o arquivo dado |
|
Informa os nomes das(os) usuárias(os) atualmente logadas(os) |
|
É o mesmo que ls -l |
|
Informa o número de linhas, palavras e bytes para cada arquivo dado, bem como totais gerais quando mais que um arquivo for dado |
|
Informa quem está logado(a) |
|
Informa o nome de usuária(o) associado com o ID efetivo de usuária(o) atual |
|
Repetidamente produz |
|
Biblioteca usada por stdbuf |
Check é uma estrutura de teste de unidade para C.
Prepare Check para compilação:
./configure --prefix=/usr --disable-static
Construa o pacote:
make
A compilação agora está completa. Para executar a suíte de teste do Check, emita o seguinte comando:
make check
Instale o pacote:
make docdir=/usr/share/doc/check-0.15.2 install
O pacote Diffutils contém aplicativos que mostram as diferenças entre arquivos ou diretórios.
Prepare o Diffutils para compilação:
./configure --prefix=/usr
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
O pacote Gawk contém aplicativos para manipular arquivos de texto.
Primeiro, garanta que alguns arquivos desnecessários não sejam instalados:
sed -i 's/extras//' Makefile.in
Prepare o Gawk para compilação:
./configure --prefix=/usr
Compile o pacote:
make
Para testar os resultados, emita:
chown -R tester . su tester -c "PATH=$PATH make check"
Instale o pacote:
rm -f /usr/bin/gawk-5.3.0 make install
O significado do comando:
O sistema de construção não recriará o link rígido
gawk-5.3.0
se ele já
existir. Remova-o para garantir que o link rígido
anterior instalado na Seção 6.9, “Gawk-5.3.0” seja
atualizado aqui.
O processo de instalação já criou awk como um link simbólico para gawk; crie a página de manual dele como um link simbólico também:
ln -sv gawk.1 /usr/share/man/man1/awk.1
Se desejado, instale a documentação:
mkdir -pv /usr/share/doc/gawk-5.3.0 cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-5.3.0
O pacote Findutils contém aplicativos para encontrar arquivos. Os aplicativos são fornecidos para procurar ao longo de todos os arquivos em uma árvore de diretórios e para criar, manter e buscar uma base de dados (geralmente mais rápido que o find recursivo, porém não é confiável, a menos que a base de dados tenha sido atualizada recentemente). O Findutils também abastece o aplicativo xargs, o qual pode ser usado para executar um comando especificado sobre cada arquivo selecionado por uma pesquisa.
Prepare o Findutils para compilação:
./configure --prefix=/usr --localstatedir=/var/lib/locate
O significado das opções do configure:
--localstatedir
Essa opção move a base de dados locate para
/var/lib/locate
, o qual é
o local conforme com FHS.
Compile o pacote:
make
Para testar os resultados, emita:
chown -R tester . su tester -c "PATH=$PATH make check"
Instale o pacote:
make install
Pesquisa nas árvores de diretórios dadas por arquivos correspondendo a critérios especificados |
|
Pesquisa em uma base de dados de nomes de arquivo e informa os nomes que contém uma sequência de caracteres dada ou correspondem a um padrão dado |
|
Atualiza a base de dados locate; ele escaneia o sistema de arquivos inteiro (incluindo outros sistemas de arquivos que estejam montados atualmente, a menos que dito o contrário) e coloca cada nome de arquivo que ele encontrar na base de dados |
|
Pode ser usado para aplicar um comando dado a uma lista de arquivos |
O pacote Groff contém aplicativos para processar e formatar texto e imagens.
Groff espera que a variável de ambiente PAGE
contenha o tamanho padrão de papel. Para
usuárias(os) nos Estados Unidos da América do Norte,
PAGE=letter
é
apropriado. Em outros lugares, PAGE=A4
possivelmente seja mais
adequado. Embora o tamanho padrão do papel seja configurado
durante a compilação, ele pode ser substituído posteriormente
ecoando ou “A4” ou “letter” para o
arquivo /etc/papersize
.
Prepare Groff para compilação:
PAGE=<tamanho_papel>
./configure --prefix=/usr
Construa o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
Lê um arquivo de fonte troff e acrescenta alguma informação de métrica de fonte adicional que é usada pelo sistema groff |
|
Cria um arquivo de fonte para uso com groff e grops |
|
Preprocessador Groff para produzir diagramas de estrutura química |
|
Compila descrições de equações embutidas em arquivos de entrada gerada do troff em comandos que são entendidos pelo troff |
|
Converte uma EQN (equação) do troff em uma imagem recortada |
|
Marca diferenças entre arquivos groff/nroff/troff |
|
Transforma partituras escritas na linguagem lilypond na linguagem groff |
|
Preprocessador para groff, permitindo a inserção de código perl em arquivos groff |
|
Preprocessador para groff, permitindo a inserção do Pinyin (Chinês Mandarim escrito com o alfabeto romano) em arquivos groff. |
|
Converte um arquivo do aplicativo grap em uma imagem recortada bitmap (grap é uma linguagem de programação antiga do Unix para criar diagramas) |
|
Um preprocessador groff para arquivos gremlin |
|
Um controlador para groff que produz arquivos de saída gerada do formato dvi do TeX |
|
Uma estrutura de interação direta com o(a) usuário(a) para o sistema de formatação de documentos groff; ele executa o aplicativo troff e um pós-processador apropriado para o dispositivo selecionado |
|
Exibe arquivos groff e páginas de manual em terminais X e tty |
|
Lê arquivos e advinha quais das opções do
groff
|
|
É um controlador groff para impressoras Canon CAPSL (impressoras a laser séries LBP-4 e LBP-8) |
|
É um controlador para groff que produz saída gerada no formato PCL5 adequado para uma impressora HP LaserJet 4 |
|
Traduz a saída gerada do GNU troff para PDF |
|
Traduz a saída gerada do GNU troff para PostScript |
|
Traduz a saída gerada do GNU troff em uma forma adequada para dispositivos semelhantes a máquina de escrever |
|
Cria um arquivo de fonte para uso com groff -Tlj4 a partir de um arquivo de métrica de fonte rotulada HP |
|
Cria um índice invertido para as bases de dados bibliográficas com um arquivo especificado para uso com refer, lookbib e lkbib |
|
Pesquisa em bases de dados bibliográficas por referências que contenham chaves especificadas e informa quaisquer referências encontradas |
|
Imprime um prompt na saída de erro padrão (a menos que a entrada gerada padrão não seja um terminal); lê uma linha contendo um conjunto de palavras chave a partir da entrada gerada padrão; pesquisa nas bases de dados bibliográficas, em um arquivo especificado, por referências contendo aquelas palavras chave; imprime quaisquer referências encontradas na saída gerada padrão; e repete esse processo até o final da entrada gerada |
|
Um preprocessador simples para groff |
|
Formata equações para saída gerada American Standard Code for Information Interchange (ASCII) |
|
Um script que emula o comando nroff usando groff |
|
É um encapsulador em torno do groff que facilita a produção de documentos PDF a partir de arquivos formatados com as macros mom. |
|
Cria documentos pdf usando groff |
|
Traduz uma fonte PostScript em formato |
|
Compila descrições de imagens embutidas em arquivos de entrada gerada troff ou TeX em comandos entendidos pelo TeX ou troff |
|
Converte um diagrama PIC em uma imagem recortada |
|
Traduz a saída gerada do GNU troff para HTML |
|
Converte codificação de arquivos de entrada gerada para alguma coisa que o GNU troff entenda |
|
Traduz a saída gerada do GNU troff para HTML |
|
Copia o conteúdo de um arquivo para a saída gerada padrão, exceto aquelas linhas entre .[ e .] que são interpretadas como citações e linhas entre .R1 e .R2 que são interpretadas como comandos para como citações são para serem processadas |
|
Transforma arquivos roff para o formato DVI |
|
Transforma arquivos roff para o formato HTML |
|
Transforma arquivos roff em PDFs |
|
Transforma arquivos roff para arquivos ps |
|
Transforma arquivos roff para arquivos de texto |
|
Transforma arquivos roff para outros formatos |
|
Lê arquivos e substitui linhas da forma .so arquivo pelo conteúdo do arquivo mencionado |
|
Compila descrições de tabelas embutidas em arquivos de entrada gerada do troff em comandos que são entendidos pelo troff |
|
Cria um arquivo fonte para uso com groff -Tdvi |
|
É altamente compatível com o troff do Unix; ele usualmente deveria ser invocado usando o comando groff, o qual também executará preprocessadores e pós-processadores na ordem apropriada e com as opções apropriadas |
O pacote GRUB contém o GRand Unified Bootloader.
Se o teu sistema tem suporte UEFI e você desejar inicializar o LFS com UEFI, você precisa instalar o GRUB com suporte UEFI (e as dependências dele) seguindo as instruções na página BLFS. Você pode ignorar esse pacote ou instalar esse pacote e o pacote GRUB para UEFI do BLFS sem conflito (a página BLFS fornece instruções para ambos os casos).
Desconfigure quaisquer variáveis de ambiente que possivelmente afetem a construção:
unset {C,CPP,CXX,LD}FLAGS
Não tente “ajustar” esse pacote com sinalizadores personalizados de compilação. Esse pacote é um carregador de inicialização. As operações de baixo nível no código fonte possivelmente sejam quebradas por otimização agressiva.
Adicione um arquivo ausente a partir do "tarball" de lançamento:
echo depends bli part_gpt
> grub-core/extra_deps.lst
Prepare GRUB para compilação:
./configure --prefix=/usr \ --sysconfdir=/etc \ --disable-efiemu \ --disable-werror
O significado das novas opções de configuração:
--disable-werror
Isso permite que a construção complete com avisos introduzidos por versões mais recentes do Flex.
--disable-efiemu
Essa opção minimiza o que é construído desabilitando um recurso e eliminando alguns aplicativos de teste não necessários para o LFS.
Compile o pacote:
make
A suíte de teste para esse pacote não é recomendada. A maioria dos testes depende de pacotes que não estão disponíveis no ambiente limitado do LFS. Para executar os testes mesmo assim, execute make check.
Instale o pacote:
make install mv -v /etc/bash_completion.d/grub /usr/share/bash-completion/completions
Tornar teu sistema LFS inicializável com GRUB será discutido no Seção 10.4, “Usando o GRUB para Configurar o Processo de Inicialização.”
É um aplicativo auxiliar para grub-install |
|
Uma ferramenta para editar o bloco ambiente |
|
Verifica para ver se o arquivo dado é do tipo especificado |
|
Ferramenta para depurar o controlador do sistema de arquivos |
|
Cola binários de 32 bits e de 64 bits em um arquivo (para máquinas Apple) |
|
Instala o GRUB na sua unidade |
|
É um script que converte um esquema xkb em um reconhecido pelo GRUB |
|
É o bless ao estilo Mac para os sistemas de arquivos HFS ou HFS+ (bless é peculiar às máquinas Apple; torna um dispositivo inicializável) |
|
Converte um |
|
Gera um arquivo |
|
Faz uma imagem inicializável do GRUB |
|
Gera um arquivo de esquema de teclado do GRUB |
|
Prepara um diretório do GRUB de inicialização de rede de comunicação |
|
Gera uma senha encriptada PBKDF2 para uso no menu de inicialização |
|
Torna um nome de caminho de sistema relativo à raiz dele |
|
Faz uma imagem inicializável do GRUB adequada para um disquete, CDROM/DVD ou uma unidade USB |
|
Gera uma imagem independente |
|
É um aplicativo auxiliar que imprime o caminho para um dispositivo do GRUB |
|
Sonda informação de dispositivo para um caminho ou dispositivo dado |
|
Configura a entrada padrão de inicialização para o GRUB para a próxima inicialização somente |
|
Renderiza .disk_label da Apple para Macs da Apple |
|
Verifica script de configuração do GRUB para erros de sintaxe |
|
Configura a entrada padrão de inicialização para o GRUB |
|
É um aplicativo auxiliar para grub-setup |
|
Transforma um arquivo de configuração syslinux para o formato grub.cfg |
O pacote Gzip contém aplicativos para comprimir e descomprimir arquivos.
Prepare o Gzip para compilação:
./configure --prefix=/usr
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
Descomprime arquivos gzipados |
|
Cria arquivos executáveis auto-descomprimíveis |
|
Comprime os arquivos dados usando codificação Lempel-Ziv (LZ77) |
|
Descomprime arquivos comprimidos |
|
Descomprime os arquivos gzipados dados para a saída gerada padrão |
|
Executa cmp em arquivos gzipados |
|
Executa diff em arquivos gzipados |
|
Executa egrep em arquivos gzipados |
|
Executa fgrep em arquivos gzipados |
|
Força uma extensão |
|
Executa grep em arquivos gzipados |
|
Executa less em arquivos gzipados |
|
Executa more em arquivos gzipados |
|
Re-comprime arquivos oriundos do formato
compress para o
formato gzip— |
O pacote IPRoute2 contém aplicativos para operação interativa básica e avançada de dispositivos via rede de comunicação baseada em IPV4.
O aplicativo arpd incluído nesse pacote não será construído, dado que ele é dependente do Berkeley DB, o qual não é instalado no LFS. Entretanto, um diretório e uma página de manual para o arpd ainda serão instalados. Impeça isso executando os comandos mostrados abaixo.
sed -i /ARPD/d Makefile rm -fv man/man8/arpd.8
Compile o pacote:
make NETNS_RUN_DIR=/run/netns
Esse pacote não tem uma suíte de teste funcional.
Instale o pacote:
make SBINDIR=/usr/sbin install
Se desejado, instale a documentação:
mkdir -pv /usr/share/doc/iproute2-6.10.0 cp -v COPYING README* /usr/share/doc/iproute2-6.10.0
Configura pontes de redes de comunicação |
|
Utilitário de situação de conexão |
|
Estrutura genérica de interação direta com o(a) usuário(a) do utilitário de link de rede de comunicação |
|
Mostra as estatísticas de interface, incluindo o número de pacotes transmitidos e recebidos, por interface |
|
O executável principal. Ele tem várias funções, incluindo estas:
ip link ip addr permite que usuários(as) olhem para endereços e propriedades deles, adicionem novos endereços e deletem os antigos ip neighbor permite que usuários(as) olhem para vínculos de vizinho e propriedades deles, adicionem novas entradas de vizinho e deletem as antigas ip rule permite que usuários(as) olhem para as políticas de roteamento e as mudem ip route permite que usuários(as) olhem para a tabela de roteamento e mudem regras da tabela de roteamento ip tunnel permite que usuários(as) olhem para os tuneis IP e propriedades deles e as mudem ip maddr permite que usuários(as) olhem para os endereços multicast e propriedades deles e as mudem ip mroute permite que usuários(as) configurem, mudem ou deletem o roteamento multicast ip monitor permite que usuários(as) continuamente monitorem o estado de dispositivos, endereços e rotas |
|
Fornece estatísticas de rede de comunicação do Linux; ele é uma substituição difundida e mais completa de recursos para o antigo aplicativo rtstat |
|
Mostra estatísticas da rede de comunicação |
|
Um componente do ip route para listar as tabelas de roteamento |
|
Exibe o conteúdo de |
|
Utilitário de monitoramento de rota |
|
Converte a saída gerada de ip -o em um formato legível |
|
Utilitário de situação de rota |
|
Similar ao comando netstat; exibe conexões ativas |
|
Controle de Tráfego para implementações de Quality Of Service (QOS) e Class Of Service (COS) tc qdisc permite que usuários(as) configurem a disciplina de enfileiramento tc class permite que usuários(as) configurem classes baseadas no agendamento da disciplina de enfileiramento tc filter permite que usuários(as) configurem a filtragem de pacote QoS/CoS tc monitor pode ser usado para visualizar mudanças feitas para o Traffic Control no núcleo. |
O pacote Kbd contém arquivos de tabelas de teclas, fontes de console e utilitários de teclado.
O comportamento das teclas backspace e delete não é consistente ao longo dos mapas de teclas no pacote Kbd. O seguinte remendo corrige esse problema para mapas de tecla i386:
patch -Np1 -i ../kbd-2.6.4-backspace-1.patch
Após remendar, a tecla backspace gera o carácter com código 127 e a tecla delete gera uma sequência de escape bem conhecida.
Remova o aplicativo redundante resizecons (ele exige que a defunta svgalib forneça os arquivos de modo de vídeo - para uso normal setfont dimensiona o console adequadamente) juntamente com a página de manual dele.
sed -i '/RESIZECONS_PROGS=/s/yes/no/' configure sed -i 's/resizecons.8 //' docs/man/man8/Makefile.in
Prepare Kbd para compilação:
./configure --prefix=/usr --disable-vlock
O significado da opção de configure:
--disable-vlock
Essa opção evita que o utilitário vlock seja construído, pois ele exige a biblioteca PAM, a qual não está disponível no ambiente chroot.
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
Para alguns idiomas (por exemplo, Bielorrusso) o pacote Kbd não fornece um mapa de tecla útil onde o mapa de tecla “by” regular supõe a codificação ISO-8859-5 e o mapa de tecla CP1251 normalmente é usado. Usuários(as) de tais idiomas tem que transferir mapas de tecla funcionais separadamente.
Se desejado, instale a documentação:
cp -R -v docs/doc -T /usr/share/doc/kbd-2.6.4
Muda o terminal virtual de primeiro plano |
|
Desaloca terminais virtuais não usados |
|
Despeja as tabelas de tradução de teclado |
|
Imprime o número do terminal virtual ativo |
|
Imprime a tabela de mapeamento de código de escaneamento para código de tecla do núcleo |
|
Obtém informação a respeito da situação de um console |
|
Informa ou configura o modo de teclado |
|
Configura as taxas de repetição e de atraso do teclado |
|
Carrega as tabelas de tradução do teclado |
|
Carrega a tabela de mapeamento Unicode para fonte do núcleo |
|
Um aplicativo obsoleto que costumava carregar uma tabela de mapeamento de caractere de saída gerada definida pelo(a) usuário(a) para dentro do controlador de console; isso é feito agora por setfont |
|
Inicia um aplicativo em um novo terminal virtual (VT) |
|
Adiciona uma tabela de carácter Unicode para uma fonte de console |
|
Extrai a tabela de carácter Unicode embutida a partir de uma fonte de console |
|
Remove a tabela de carácter Unicode embutida a partir de uma fonte de console |
|
Lida com tabelas de carácter Unicode para fontes de console |
|
Muda as fontes Enhanced Graphic Adapter (EGA) e Video Graphics Array (VGA) no console |
|
Carrega entradas de tabela de mapeamento de código de escaneamento para código de tecla do núcleo; isso é útil se existirem teclas incomuns no teclado |
|
Configura os sinalizadores de teclado e Light Emitting Diodes (LEDs) |
|
Define o manuseio de meta tecla do teclado |
|
Configura o mapa de cor do console em todos os terminais virtuais |
|
Exibe a fonte de tela atual do console EGA/VGA |
|
Informa os códigos de escaneamento, códigos de tecla e códigos ASCII das teclas pressionadas no teclado |
|
Põe o teclado e o console em modo UNICODE [Não use esse aplicativo, a menos que seu arquivo de mapa de tecla esteja na codificação ISO-8859-1. Para outras codificações, esse utilitário produz resultados incorretos]. |
|
Reverte teclado e console do modo UNICODE |
O pacote Libpipeline contém uma biblioteca para manipular pipelines de subprocessos de uma maneira flexível e conveniente.
Prepare Libpipeline para compilação:
./configure --prefix=/usr
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
O pacote Make contém um aplicativo para controlar a geração de executáveis e outros arquivos não fonte de um pacote a partir de arquivos fonte.
Prepare o Make para compilação:
./configure --prefix=/usr
Compile o pacote:
make
Para testar os resultados, emita:
chown -R tester . su tester -c "PATH=$PATH make check"
Instale o pacote:
make install
O pacote Patch contém um aplicativo para modificar ou criar arquivos por aplicação de um arquivo “remendo” tipicamente criado pelo aplicativo diff.
Prepare o Patch para compilação:
./configure --prefix=/usr
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
O pacote Tar fornece a habilidade para criar arquivamentos tar bem como para realizar vários outros tipos de manipulação de arquivamento. Tar pode ser usado sobre arquivamentos previamente criados para extrair arquivos, para armazenar arquivos adicionais ou para atualizar ou listar arquivos que já foram armazenados.
Prepare o Tar para compilação:
FORCE_UNSAFE_CONFIGURE=1 \ ./configure --prefix=/usr
O significado da opção de configure:
FORCE_UNSAFE_CONFIGURE=1
Isso força o teste para mknod
ser executado como root
. Geralmente é considerado
perigoso executar esse teste como o(a) usuário(a)
root
, porém, como ele
está sendo executado em um sistema que foi construído
somente parcialmente, substitui-lo está OK.
Compile o pacote:
make
Para testar os resultados, emita:
make check
Um teste, "capabilities: binary store/restore", é conhecido por falhar se for executado, pois o LFS carece de "selinux"; porém, será pulado se o núcleo do anfitrião não suportar atributos estendidos ou rótulos de segurança no sistema de arquivos usado para construir o LFS.
Instale o pacote:
make install make -C doc install-html docdir=/usr/share/doc/tar-1.35
O pacote Texinfo contém aplicativos para leitura, escrita e conversão de páginas info.
Prepare o Texinfo para compilação:
./configure --prefix=/usr
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
Opcionalmente, instale os componentes pertencentes a uma instalação do TeX:
make TEXMF=/usr/share/texmf install-tex
O significado do parâmetro do make:
TEXMF=/usr/share/texmf
A variável de arquivo make TEXMF
mantém o local da raiz da árvore
do TeX se, por exemplo, um pacote do TeX será instalado
posteriormente.
O sistema de documentação Info usa um arquivo de texto plano
para manter a lista de entradas de menu dele. O arquivo está
localizado em /usr/share/info/dir
. Infelizmente, devido a
problemas ocasionais nos arquivos Make de vários pacotes, ele
pode às vezes sair de sincronia com as páginas info
instaladas no sistema. Se o arquivo /usr/share/info/dir
alguma vez precisar ser
recriado, [então] os seguintes comandos opcionais realizarão
a tarefa:
pushd /usr/share/info rm -v dir for f in * do install-info $f dir 2>/dev/null done popd
Usado para ler páginas info as quais são similares a páginas de manual, porém frequentemente vão muito mais fundo que somente explicar todas as opções de linha de comando disponíveis [Por exemplo, compare man bison e info bison]. |
|
Usado para instalar páginas info; ele atualiza entradas no arquivo de índice info |
|
Traduz os documentos fonte do Texinfo dados para páginas info, texto plano ou HTML |
|
Usado para formatar o documento do Texinfo dado em um arquivo Portable Document Format (PDF) |
|
Converte Pod para formato Texinfo |
|
Traduz documentação fonte do Texinfo para vários outros formatos |
|
Usado para formatar o documento do Texinfo dado em um arquivo independente de dispositivo que pode ser impresso |
|
Usado para formatar o documento do Texinfo dado em um arquivo Portable Document Format (PDF) |
|
Usado para ordenar arquivos de índice do Texinfo |
O pacote Vim contém um editor poderoso de texto.
Se você preferir outro editor—como o Emacs, Joe ou Nano—por favor, consulte https://www.linuxfromscratch.org/blfs/view/stable-systemd/postlfs/editors.html para instruções sugeridas de instalação.
Primeiro, mude o local padrão do arquivo de configuração
vimrc
para /etc
:
echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
Prepare o Vim para compilação:
./configure --prefix=/usr
Compile o pacote:
make
Para preparar os testes, garanta que o(a) usuário(a)
tester
possa escrever na
árvore do fonte:
chown -R tester .
Agora execute os testes como usuário(a) tester
:
su tester -c "TERM=xterm-256color LANG=en_US.UTF-8 make -j1 test" \ &> vim-test.log
A suíte de teste emite um monte de dados binários para a
tela. Isso pode causar problemas com as configurações do
terminal atual (especialmente enquanto estivermos
substituindo a variável TERM
para
satisfazer algumas suposições da suíte de teste). O problema
pode ser evitado redirecionando-se a saída gerada para um
arquivo de registro conforme mostrado acima. Um teste bem
sucedido resultará nas palavras ALL DONE
no arquivo de registro ao
completar.
Instale o pacote:
make install
Muitos(as) usuários(as) reflexivamente digitam vi em vez de vim. Para permitir a execução do vim quando usuários(as) habitualmente digitarem vi, crie um link simbólico para ambos, o binário e a página de manual, nos idiomas fornecidos:
ln -sv vim /usr/bin/vi for L in /usr/share/man/{,*/}man1/vim.1; do ln -sv vim.1 $(dirname $L)/vi.1 done
Por padrão, a documentação do Vim é instalada em /usr/share/vim
. O seguinte link simbólico
permite que a documentação seja acessada via /usr/share/doc/vim-9.1.0660
, tornando-a
consistente com o local da documentação para outros pacotes:
ln -sv ../vim/vim91/doc /usr/share/doc/vim-9.1.0660
Se um X Window System vai ser instalado no sistema LFS, [então] possivelmente seja necessário recompilar o Vim depois que instalar o X. O Vim vem com uma versão GUI do editor que exige que o X e algumas bibliotecas adicionais seja instalado. Para mais informação a respeito desse processo, consulte a documentação do Vim e a página de instalação do Vim no livro BLFS em https://www.linuxfromscratch.org/blfs/view/stable-systemd/postlfs/vim.html.
Por padrão, vim executa em modo incompatível com vi. Isso possivelmente seja novo para usuários(as) que tenham usado outros editores no passado. A configuração “nocompatible” está incluída abaixo para destacar o fato de que um novo comportamento está sendo usado. Ela também lembra àqueles(as) que mudariam para o modo “compatible” que essa deveria ser a primeira configuração no arquivo de configuração. Isso é necessário, pois ela muda outras configurações e substituições precisam vir depois dessa configuração. Crie um arquivo de configuração padrão do vim executando o seguinte:
cat > /etc/vimrc << "EOF"
" Início do /etc/vimrc
" Certifique-se de que os padrões sejam configurados antes de personalizar as configurações, não depois
source $VIMRUNTIME/defaults.vim
let skip_defaults_vim=1
set nocompatible
set backspace=2
set mouse=
syntax on
if (&term == "xterm") || (&term == "putty")
set background=dark
endif
" Fim do /etc/vimrc
EOF
A configuração set
nocompatible
faz com que vim se comporte de uma
maneira mais útil (o padrão) que a maneira compatível com vi.
Remova o “no” para manter o comportamento antigo
do vi. A
configuração set
backspace=2
permite retroceder sobre quebras de
linha, auto recuos e o início de uma inserção. O parâmetro
syntax on
habilita o
destaque de sintaxe do Vim. A configuração set mouse=
habilita adequada
colagem de texto com o mouse quando trabalhar em chroot ou
por meio de uma conexão remota. Finalmente, a declaração
if com a configuração
set background=dark
corrige a suposição do vim a respeito da cor de
segundo plano de alguns emuladores de terminal. Isso dá ao
destaque um esquema de cores melhor para uso no segundo plano
preto desses aplicativos.
Documentação para outras opções disponíveis pode ser obtida executando o seguinte comando:
vim -c ':options'
Por padrão, o Vim instala somente arquivos de verificador
ortográfico para o idioma inglês. Para instalar arquivos de
verificador ortográfico para seu idioma preferido, copie os
arquivos .spl
e,
opcionalmente, os .sug
para
seu idioma e codificação de carácter a partir de
runtime/spell
para
/usr/share/vim/vim91/spell/
.
Para usar esses arquivos de verificador ortográfico, alguma
configuração em /etc/vimrc
é
necessária, por exemplo:
set spelllang=en,ru
set spell
Para mais informação, veja-se runtime/spell/README.txt
.
Inicia vim em modo ex |
|
É uma versão restrita do view; nenhum comando de shell pode ser iniciado e view não pode ser suspenso |
|
É uma versão restrita do vim; nenhum comando de shell pode ser iniciado e vim não pode ser suspenso |
|
Link para vim |
|
Inicia vim em modo somente leitura |
|
É o editor |
|
Edita duas ou três versões de um arquivo com vim e exibe diferenças |
|
Ensina as teclas e comandos básicas do vim |
|
Cria um despejo hexadecimal do arquivo dado; ele também pode realizar a operação inversa, de forma que ele pode ser usado para remendamento de binário |
MarkupSafe é um módulo do Python que implementa uma sequência de caracteres segura de marcação XML/HTML/XHTML.
Compile MarkupSafe com o seguinte comando:
pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
Esse pacote não vem com uma suíte de teste.
Instale o pacote:
pip3 install --no-index --no-user --find-links dist Markupsafe
Jinja2 é um módulo do Python que implementa uma linguagem simples de modelo pitônico.
Construa o pacote:
pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
Instale o pacote:
pip3 install --no-index --no-user --find-links dist Jinja2
O pacote systemd contém aplicativos para controlar a inicialização, execução e desligamento do sistema.
Remova dois grupos desnecessários, render
e sgx
, das regras padrão do "udev":
sed -i -e 's/GROUP="render"/GROUP="video"/' \ -e 's/GROUP="sgx", //' rules.d/50-udev-default.rules.in
Prepare systemd para compilação:
mkdir -p build cd build meson setup .. \ --prefix=/usr \ --buildtype=release \ -D default-dnssec=no \ -D firstboot=false \ -D install-tests=false \ -D ldconfig=false \ -D sysusers=false \ -D rpmmacrosdir=no \ -D homed=disabled \ -D userdb=false \ -D man=disabled \ -D mode=release \ -D pamconfdir=no \ -D dev-kvm-mode=0660 \ -D nobody-group=nogroup \ -D sysupdate=disabled \ -D ukify=disabled \ -D docdir=/usr/share/doc/systemd-256.4
O significado das opções "meson":
--buildtype=release
Essa chave substitui o tipo de construção padrão (“debug”), que produz binários não otimizados.
-D
default-dnssec=no
Essa chave desliga o suporte experimental a DNSSEC.
-D
firstboot=false
Essa chave impede a instalação de serviços do systemd responsáveis por configurar o sistema pela primeira vez. Eles não são úteis no LFS, pois tudo é feito manualmente.
-D
install-tests=false
Essa chave impede a instalação dos testes compilados.
-D
ldconfig=false
Essa chave impede a instalação de uma unidade do systemd que executa ldconfig ao inicializar; isso não é útil para distribuições de fonte, tais como o LFS, e torna o tempo de inicialização mais longo. Remova essa opção para habilitar a execução de ldconfig ao inicializar.
-D
sysusers=false
Essa chave impede a instalação de serviços do systemd
responsáveis por configurar os arquivos /etc/group
e /etc/passwd
. Ambos os arquivos foram
criados no capítulo anterior. Esse processo de segundo
plano não é útil em um sistema LFS dado que contas de
usuário(a) são criadas manualmente.
-D
rpmmacrosdir=no
Essa chave desabilita a instalação das Macros RPM para uso com o systemd, pois o LFS não suporta RPM.
-D
homed=disabled
and -D userdb=false
Remova dois processos de segundo plano com dependências que não se encaixam no escopo do LFS.
-D
man=disabled
Impeça a geração de páginas de manual para evitar dependências extras. Nós instalaremos páginas de manual pré-geradas para o systemd a partir de um tarball.
-D
mode=release
Desabilite alguns recursos considerados experimentais pelo(a) desenvolvedor(a).
-D
pamconfdir=no
Evita a instalação de um arquivo de configuração do PAM não funcional no LFS.
-D
dev-kvm-mode=0660
A regra padrão do "udev" permitiria que todos(as)
os(as) usuários(as) acessassem /dev/kvm
. Os(As) editores(as) a
consideram perigosa. Essa opção a substitui.
-D
nobody-group=nogroup
Informe ao pacote que o nome do grupo com GID 65534 é
nogroup
.
-D
sysupdate=disabled
Não instale a ferramenta "systemd-sysupdate". Ela foi projetada para atualizar automaticamente distribuições binárias, de forma que é inútil para um sistema básico do Linux construído a partir do fonte. E informará erros na inicialização se estiver habilitada, mas não configurada corretamente.
-D
ukify=disabled
Não instale o conjunto de comandos sequenciais "systemd-ukify". Em tempo de execução, esse conjunto de comandos sequenciais exige o módulo do "Python" "pefile" que nem o LFS nem o BLFS fornecem.
Compile o pacote:
ninja
Alguns testes precisam de um arquivo básico /etc/os-release
. Para testar os resultados,
emita:
echo 'NAME="Linux From Scratch"' > /etc/os-release ninja test
Um teste chamado: systemd:core /
test-namespace
é conhecido por falhar no ambiente
chroot do LFS. Alguns outros testes possivelmente falhem
porque dependem de várias opções de configuração do núcleo.
Instale o pacote:
ninja install
Instale as páginas de manual:
tar -xf ../../systemd-man-pages-256.4.tar.xz \ --no-same-owner --strip-components=1 \ -C /usr/share/man
Crie o arquivo /etc/machine-id
necessitado pelo systemd-journald:
systemd-machine-id-setup
Configure a estrutura básica alvo:
systemctl preset-all
É usado para introspecção e monitoramento do barramento D-Bus |
|
É usado para recuperar despejos da memória principal a partir do diário do systemd |
|
Normalmente invoca shutdown com a
opção |
|
É usado para consultar e mudar o nome de dispositivo do sistema e configurações relacionadas |
|
É o primeiro processo a ser iniciado depois que o núcleo tenha inicializado o hardware; init assume o processo de inicialização e inicia os processos especificados pelos arquivos de configuração dele; nesse caso, ele inicia o systemd |
|
É usado para consultar o conteúdo do diário do systemd |
|
É usado para adicionar e remover imagens de núcleo e de initramfs para e de /boot; no LFS, isso é feito manualmente |
|
É usado para consultar e mudar as configurações de locale e esquema de teclado do sistema |
|
É usado para introspectar e controlar o estado do Login Manager do systemd |
|
É usado para introspectar e controlar o estado do Virtual Machine e do Container Registration Manager do systemd |
|
É usado para introspectar e configurar o estado dos links da rede de comunicação configurados pelo systemd-networkd |
|
Controla o processo de segundo plano Out Of Memory do systemd |
|
É usado para anexar ou desanexar serviços portáveis a partir do sistema local |
|
Instrui o núcleo a parar o sistema e desligar o computador (veja-se halt) |
|
Instrui o núcleo a reinicializar o sistema (veja-se halt) |
|
Registra a configuração do servidor de DNS e domínio com systemd-resolved |
|
Envia comandos de controle para o gerenciador de resolução de nome da rede de comunicação ou resolve nomes de domínio, endereços IPv4 e IPv6, registros DNS e serviços |
|
Emite o nível de execução anterior e o atual,
conforme anotado no registro mais recente do nível
de execução em |
|
Desativa o sistema de uma maneira segura e protegida, sinalizando para todos os processos e notificando todos(as) os(as) usuários(as) logados(as) |
|
É usado para introspectar e controlar o estado do gerenciador de sistema e serviço do systemd |
|
Informa se o sistema está conectado a uma fonte externa de eletricidade. |
|
É usado para analisar o desempenho da inicialização do sistema, bem como para identificar unidades problemáticas do systemd |
|
É usado para consultar uma palavra secreta ou frase secreta do sistema a partir do(a) usuário(a), usando uma mensagem especificada na linha de comando do Linux |
|
É usado para conectar as saídas geradas STDOUT e STDERR de um processo com o diário do systemd |
|
Recursivamente mostra o conteúdo da hierarquia do grupo de controle selecionado do Linux em uma árvore |
|
Mostra os grupos de controle superiores da hierarquia do grupo de controle local do Linux, ordenados pela carga de CPU, memória e entradas/saídas de disco deles |
|
Exibe e processa credenciais |
|
É usado para identificar e comparar arquivos de
configuração em |
|
Detecta se o sistema está sendo executado em um ambiente virtual e ajusta o Udev de acordo |
|
É usado para inspecionar imagens de disco de SO |
|
É usado para escapar sequências de caracteres para inclusão em nomes de unidade do systemd |
|
É usado para gerenciar a base de dados de hardware (hwdb) |
|
Gera e imprime sequências de caracteres id128 (UUID) |
|
É usado para executar um aplicativo com um bloqueio de inibição de desligamento, suspensão ou inatividade, impedindo uma ação tal como um desligamento do sistema até que o processo seja completado |
|
É usado por ferramentas de instalador do sistema
para inicializar o ID de máquina armazenado em
|
|
É usado para montar temporariamente ou automontar discos |
|
É usado por scripts do processo de segundo para notificar o sistema init acerca de mudanças de situação |
|
É usado para executar um comando ou um OS inteiro, em um contêiner de espaço de nome peso leve |
|
É usado para consultar caminhos de sistema e usuário(a) |
|
É usado para aumentar e adicionar partições à uma tabela de partição quando o systemd for usado com uma imagem de SO (por exemplo, um contêiner) |
|
É usado para resolver nomes de domínio, endereços IPV4 e IPv6, registros de recurso DNS e serviços |
|
É usado para criar e iniciar uma unidade transitória .service ou uma .scope e executar o comando especificado nela; isso é útil para validar unidades do systemd |
|
É usado para ouvir em dispositivos de soquete e iniciar um processo depois de uma conexão bem sucedida com o soquete |
|
Ativa imagens de extensão de sistema |
|
Cria, deleta e limpa arquivos e diretórios voláteis
e temporários, baseado no formato de arquivo de
configuração e local especificado em diretórios
|
|
Desmonta pontos de montagem |
|
É usado para listar e (ou) processar solicitações pendentes de senha do systemd |
|
Informa ao init para qual nível de execução mudar |
|
É usado para consultar e mudar o relógio do sistema e as configurações dele |
|
É uma ferramenta genérica de administração do Udev que controla o processo de segundo plano udevd, fornece informação a partir da base de dados de hardware do Udev, monitora uevents, aguarda que uevents finalizem, testa a configuração do Udev e deflagra uevents para um dispositivo dado |
|
É a biblioteca principal de utilitário do systemd |
|
É uma biblioteca para acessar informação de dispositivo do Udev |
D-Bus é um sistema de barramento de mensagem, uma maneira simples para aplicativos conversarem entre si. D-Bus fornece ambos um processo de segundo plano de sistema (para eventos tais como "novo dispositivo de hardware adicionado" ou "fila de impressora mudou") e um processo de segundo plano de sessão de login de usuário(a) (para necessidades gerais de IPC entre aplicativos de usuário(a)). Também, o barramento de mensagem é construído no topo de uma estrutura geral de envio de mensagem um-a-um, a qual pode ser usada por quaisquer dois aplicativos para se comunicarem diretamente (sem transitar pelo processo de segundo plano do barramento de mensagem).
Prepare D-Bus para compilação:
./configure --prefix=/usr \ --sysconfdir=/etc \ --localstatedir=/var \ --runstatedir=/run \ --enable-user-session \ --disable-static \ --disable-doxygen-docs \ --disable-xml-docs \ --docdir=/usr/share/doc/dbus-1.14.10 \ --with-system-socket=/run/dbus/system_bus_socket
O significado das opções do configure:
--runstatedir=/run
e
--with-system-socket=/run/dbus/system_bus_socket
Essas causam o arquivo de PID e o soquete do barramento
de sistema estarem em /run
, em vez do obsoleto /var/run
.
--enable-user-session
Isso garante que o serviço "D-Bus" por usuário(a) e os arquivos de unidade de soquete sejam instalados para o "Systemd". Eles não são úteis (mas inofensivos) em uma instalação básica do LFS, no entanto, eles podem ser usados uma vez que o "systemd" seja reconstruído com suporte a "PAM" no BLFS.
Compile o pacote:
make
Para testar os resultados, emita:
make check
Muitos testes são desabilitados, pois eles exigem pacotes adicionais que não estão inclusos no LFS. Instruções para executar a suíte completa de teste podem ser encontradas no livro BLFS.
Instale o pacote:
make install
Crie um link simbólico, de forma que D-Bus e systemd possam
usar o mesmo arquivo machine-id
:
ln -sfv /etc/machine-id /var/lib/dbus
é usado para remover soquetes restantes em um diretório |
|
É o processo de segundo plano do barramento de mensagem do D-Bus |
|
Inicia dbus-daemon a partir de um script de shell |
|
Monitora mensagens transitando ao longo de um barramento de mensagem do D-Bus |
|
Inicia uma instância de barramento de sessão do dbus-daemon a partir de um script de shell e inicia um aplicativo especificado naquela sessão |
|
Envia uma mensagem para um barramento de mensagem do D-Bus |
|
É uma ferramenta para auxiliar pacotes a testarem o D-Bus |
|
Atualiza variáveis de ambiente que serão configuradas para serviços de sessão do D-Bus |
|
Gera um ID único universalmente |
|
Contém funções de API usadas para comunicar com o barramento de mensagem do D-Bus |
O pacote Man-DB contém aplicativos para encontrar e visualizar páginas de manual.
Prepare Man-DB para compilação:
./configure --prefix=/usr \ --docdir=/usr/share/doc/man-db-2.12.1 \ --sysconfdir=/etc \ --disable-setuid \ --enable-cache-owner=bin \ --with-browser=/usr/bin/lynx \ --with-vgrind=/usr/bin/vgrind \ --with-grap=/usr/bin/grap
O significado das opções do configure:
--disable-setuid
Isso desabilita tornar o aplicativo man setuid para o(a)
usuário(a) man
.
--enable-cache-owner=bin
Isso muda a propriedade dos arquivos de cache de
abrangência ao sistema para o(a) usuário(a)
bin
.
--with-...
Esses três parâmetros são usados para configurar alguns aplicativos padrão. lynx é um navegador da web baseado em texto (veja-se o BLFS para instruções de instalação); vgrind converte fontes de aplicativo para entrada gerada do Groff; e grap é útil para tipografar gráficos em documentos do Groff. Os aplicativos vgrind e grap normalmente não são necessários para visualizar páginas de manual. Eles não são parte do LFS ou do BLFS, mas você deveria ser capaz de instalá-los você mesmo(a) depois de terminar o LFS, se desejar fazer isso.
Compile o pacote:
make
Para testar os resultados, emita:
make check
Instale o pacote:
make install
A seguinte tabela mostra o conjunto de caracteres que o
Man-DB supõe que as páginas de manual instaladas sob
/usr/share/man/<ll>
estarão codificadas. Em adição a isso, o Man-DB determina
corretamente se páginas de manual instaladas naquele
diretório estão codificadas em UTF-8.
Tabela 8.1. Codificação de caracteres esperada das páginas de manual legadas de 8 bits
Idioma (código) | Codificação | Idioma (código) | Codificação |
---|---|---|---|
Dinamarquês (da) | ISO-8859-1 | Croata (hr) | ISO-8859-2 |
Alemão (de) | ISO-8859-1 | Húngaro (hu) | ISO-8859-2 |
Inglês (en) | ISO-8859-1 | Japonês (ja) | EUC-JP |
Espanhol (es) | ISO-8859-1 | Coreano (ko) | EUC-KR |
Estoniano (et) | ISO-8859-1 | Lituano (lt) | ISO-8859-13 |
Finlandês (fi) | ISO-8859-1 | Letão (lv) | ISO-8859-13 |
Francês (fr) | ISO-8859-1 | Macedônio (mk) | ISO-8859-5 |
Irlandês (ga) | ISO-8859-1 | Polonês (pl) | ISO-8859-2 |
Galego (gl) | ISO-8859-1 | Romeno (ro) | ISO-8859-2 |
Indonésio (id) | ISO-8859-1 | Grego (el) | ISO-8859-7 |
Islandês (is) | ISO-8859-1 | Eslovaco (sk) | ISO-8859-2 |
Italiano (it) | ISO-8859-1 | Esloveno (sl) | ISO-8859-2 |
Bokmal norueguês (nb) | ISO-8859-1 | Latim sérvio (sr@latin) | ISO-8859-2 |
Holandês (nl) | ISO-8859-1 | Sérvio (sr) | ISO-8859-5 |
Nynorsk norueguês (nn) | ISO-8859-1 | Turco (tr) | ISO-8859-9 |
Norueguês (no) | ISO-8859-1 | Ucraniano (uk) | KOI8-U |
Português (pt) | ISO-8859-1 | Vietnamita (vi) | TCVN5712-1 |
Sueco (sv) | ISO-8859-1 | Chinês simplificado (zh_CN) | GBK |
Bielorrusso (be) | CP1251 | Chinês simplificado, Singapura (zh_SG) | GBK |
Búlgaro (bg) | CP1251 | Chinês tradicional, Hong Kong (zh_HK) | BIG5HKSCS |
Tcheco (cs) | ISO-8859-2 | Chinês tradicional (zh_TW) | BIG5 |
Páginas de manual em idiomas que não estão na lista não são suportadas.
Despeja o conteúdo da base de dados whatis em formato legível por humanos |
|
Pesquisa na base de dados whatis e exibe as descrições curtas dos comandos de sistema que contém uma sequência de caracteres dada |
|
Cria ou atualiza páginas de manual pré-formatadas |
|
Exibe informação de sumário em uma linha a respeito de uma página de manual dada |
|
Formata e exibe a página de manual solicitada |
|
Converte páginas de manual para outra codificação |
|
Cria ou atualiza a base de dados whatis |
|
Exibe o conteúdo de $MANPATH ou (se $MANPATH não estiver configurada) um caminho de busca adequado baseado nas configurações em man.conf e no ambiente do(a) usuário(a) |
|
Pesquisa na base de dados whatis e exibe as descrições curtas de comandos do sistema que contenham a palavra chave dada como uma palavra separada |
|
Contém suporte em tempo de execução para o man |
|
Contém suporte em tempo de execução para o man |
O pacote Procps-ng contém aplicativos para monitorar processos.
Prepare procps-ng para compilação:
./configure --prefix=/usr \ --docdir=/usr/share/doc/procps-ng-4.0.4 \ --disable-static \ --disable-kill \ --with-systemd
O significado da opção de configure:
--disable-kill
Essa chave desabilita a construção do comando kill; ele será instalado a partir do pacote Util-linux.
Compile o pacote:
make src_w_LDADD='$(LDADD) -lsystemd'
Para executar a suíte de teste, execute:
chown -R tester . su tester -c "PATH=$PATH make check"
Um teste chamado ps com sinalizador de
saída bsdtime,cputime,etime,etimes
é conhecido por
falhar se o núcleo do anfitrião não for construído com
CONFIG_BSD_PROCESS_ACCT
habilitado.
Instale o pacote:
make install
Informa a quantidade de memória livre e usada (ambas memória física e de troca) no sistema |
|
Procura por processos baseado nos nomes deles e outros atributos |
|
Informa os PIDs dos aplicativos dados |
|
Sinaliza processos baseado nos nomes deles e outros atributos |
|
Informa o mapeamento de memória do processo dado |
|
Lista os processos em execução atualmente |
|
Informa o diretório atual de trabalho de um processo |
|
Exibe informação detalhada do cache slab do núcleo em tempo real |
|
Modifica parâmetros do núcleo em tempo de execução |
|
Imprime um gráfico da média atual da carga do sistema |
|
Exibe uma lista dos processos mais intensivos da CPU; ele fornece uma visão contínua da atividade do processador em tempo real |
|
Informa há quanto tempo o sistema está executando, quantos(as) usuários(as) estão logados(as) e as médias de carga do sistema |
|
Informa estatísticas de memória virtual, dando informação a respeito de processos, memória, paginação, Entrada/Saída (E/S) de bloco, armadilhas e atividade da CPU |
|
Mostra quais usuários(as) estão atualmente logados(as), onde e desde quando |
|
Executa um comando dado repetidamente, exibindo a primeira tela cheia da saída gerada dele; isso permite que um(a) usuário(a) observe a mudança de saída gerada ao longo do tempo |
|
Contém as funções usadas pela maioria dos aplicativos nesse pacote |
O pacote Util-linux contém aplicativos utilitários diversos. Entre eles estão utilitários para lidar com sistemas de arquivos, consoles, partições e mensagens.
Prepare o Util-linux para compilação:
./configure --bindir=/usr/bin \ --libdir=/usr/lib \ --runstatedir=/run \ --sbindir=/usr/sbin \ --disable-chfn-chsh \ --disable-login \ --disable-nologin \ --disable-su \ --disable-setpriv \ --disable-runuser \ --disable-pylibmount \ --disable-liblastlog2 \ --disable-static \ --without-python \ ADJTIME_PATH=/var/lib/hwclock/adjtime \ --docdir=/usr/share/doc/util-linux-2.40.2
As opções --disable e --without impedem avisos acerca de construir componentes que ou exigem pacotes ausentes no LFS ou são inconsistentes com aplicativos instalados por outros pacotes.
Compile o pacote:
make
Se desejado, crie um arquivo fictício /etc/fstab
para satisfazer dois testes e
execute a suíte de teste como um(a) usuário(a)
não-root
:
Executar a suíte de teste como o(a) usuário(a) root
pode ser danoso para o seu
sistema. Para executá-lo, a opção CONFIG_SCSI_DEBUG para o
núcleo precisa estar disponível no sistema em execução
atualmente e precisa ser construída como um módulo.
Construí-la dentro do núcleo impedirá a inicialização. Para
cobertura completa, outros pacotes do BLFS precisam ser
instalados. Se desejado, esse teste pode ser executado
reinicializando-se no sistema completo LFS e executando:
bash tests/run.sh --srcdir=$PWD --builddir=$PWD
touch /etc/fstab chown -R tester . su tester -c "make -k check"
Os testes de hardlink
falharão se o núcleo do anfitrião não tiver a opção
CONFIG_CRYPTO_USER_API_HASH
habilitada ou não tiver quaisquer opções fornecendo uma
implementação SHA256 (por exemplo, CONFIG_CRYPTO_SHA256
; ou CONFIG_CRYPTO_SHA256_SSSE3
, se a CPU suportar
Suplemento SSE3) habilitada. Além disso, o teste lsfd:
inotify falhará se a opção de núcleo CONFIG_NETLINK_DIAG
não estiver habilitada.
Instale o pacote:
make install
Informa ao núcleo Linux das novas partições |
|
Abre uma porta tty, solicita um nome de login e então invoca o aplicativo login |
|
Descarta setores em um dispositivo |
|
Um utilitário de linha de comando para localizar e imprimir atributos de dispositivo de bloco |
|
É usado para gerenciar dispositivos zoneados de armazenamento de bloco |
|
Permite a usuários(as) chamarem ioctls de dispositivo de bloco a partir da linha de comando |
|
Exibe um calendário simples |
|
Manipula a tabela de partição do dispositivo dado |
|
Modifica o estado de CPUs |
|
Configura memória |
|
Exibe e ajusta placares OOM-Killer, usados para determinar quais processos matar primeiro quando o Linux estiver Fora da Memória |
|
Manipula atributos de tempo real de um processo |
|
Filtra feeds de linha reversa |
|
Filtra saída gerada do nroff para terminais que carecem de alguns recursos, tais como overstriking e half-lines |
|
Filtra as colunas dadas |
|
Formata um arquivo dado em colunas múltiplas |
|
Configura a função da combinação de teclas Ctrl+Alt+Del para uma reconfiguração rígida ou uma flexível |
|
Pede ao núcleo Linux para remover uma partição |
|
Despeja as mensagens de inicialização do núcleo |
|
Ejeta mídia removível |
|
Pré-aloca espaço para um arquivo |
|
Manipula a tabela de partição do dispositivo dado |
|
Conta páginas de conteúdo de arquivo em núcleo |
|
Encontra um sistema de arquivos, ou pelo rótulo ou pelo Universally Unique Identifier (UUID) |
|
É uma interface de linha de comando para a biblioteca libmount para funcionar com mountinfo, fstab e arquivos mtab |
|
Adquire uma trava de arquivo e então executa um comando com a trava mantida |
|
É usado para verificar, e opcionalmente reparar, sistemas de arquivos |
|
Realiza uma verificação de consistência no sistema de arquivos Cramfs no dispositivo dado |
|
Realiza uma verificação de consistência no sistema de arquivos Minix no dispositivo dado |
|
É um encapsulador muito simples em torno de operações FIFREEZE/FITHAW do controlador ioctl de núcleo |
|
Descarta blocos não usados em um sistema de arquivos montado |
|
Analisa opções na linha de comando dada |
|
Consolida arquivos duplicados criando links rígidos |
|
Despeja o arquivo dado em hexadecimal, decimal, octal ou ASCII |
|
Lê ou configura o relógio de hardware do sistema, também chamado de Real-Time Clock (RTC) ou de relógio do Basic Input-Output System (BIOS) |
|
Um link simbólico para setarch |
|
Obtém ou configura a classe de agendamento de IO e prioridade para um aplicativo |
|
Cria vários recursos IPC |
|
Remove o dado recurso de Inter-Process Communication (IPC) |
|
Fornece informação de situação de IPC |
|
Exibe informação de contador de interrupção do núcleo em visão estilo "top(1)" |
|
Informa o tamanho de um sistema de arquivos iso9660 |
|
Envia sinais para processos |
|
Mostra quais usuários(as) logaram-se (e
deslogaram-se) mais recentemente, pesquisando de
volta ao longo do arquivo |
|
Exibe as tentativas falhas de login, conforme
registrado em |
|
Anexa uma disciplina de linha à uma linha serial |
|
Um link simbólico para setarch |
|
Um link simbólico para setarch |
|
Adiciona a mensagem dada ao registro do sistema |
|
Exibe linhas que começam com a sequência de caracteres dada |
|
Configura e controla dispositivos de loop |
|
Lista informação a respeito de todos ou de dispositivos de bloco selecionados em um formato semelhante a árvore |
|
Imprime informação de arquitetura da CPU |
|
Exibe informação a respeito de arquivos abertos; substitui o lsof |
|
Imprime informação acerca de facilidades de IPC empregadas atualmente no sistema |
|
Exibe informação do contador de interrupção do núcleo |
|
Lista travas locais de sistema |
|
Lista informação acerca de contas de usuários(as), de grupos e de sistema |
|
Lista os intervalos de memória disponível com a situação online deles |
|
Lista espaços de nome |
|
Gera cookies mágicos (números hexadecimais aleatórios de 128 bits) para o xauth |
|
Controla se outros(as) usuários(as) podem enviar mensagens para o terminal atual do(a) usuário(a) |
|
Constrói um sistema de arquivos em um dispositivo (geralmente uma partição de disco rígido) |
|
Cria um sistema de arquivos Santa Cruz Operations (SCO) bfs |
|
Cria um sistema de arquivos cramfs |
|
Cria um sistema de arquivos Minix |
|
Inicializa dispositivo ou arquivo dado para ser usado como uma área de troca |
|
Um filtro para paginar ao longo de texto uma tela de cada vez |
|
Anexa o sistema de arquivos no dispositivo dado a um diretório especificado na árvore do sistema de arquivos |
|
Verifica se o diretório é um ponto de montagem |
|
Mostra os links simbólicos nos caminhos dados |
|
Executa um aplicativo com espaços de nome de outros processos |
|
Informa ao núcleo a respeito da presença e numeração de partições no disco |
|
Torna o sistema de arquivos dado o novo sistema de arquivos raiz do processo atual |
|
Obtém e configura um limite de recursos do processo |
|
Lê informação de perfil do núcleo |
|
Renomeia os arquivos dados, substituindo uma sequência de caracteres dada por outra |
|
Altera a prioridade de processos em execução |
|
Pede ao núcleo Linux para redimensionar uma partição |
|
Inverte as linhas de um arquivo dado |
|
Ferramenta para habilitar e desabilitar dispositivos sem fios |
|
Usado para entrar em um estado de suspensão do sistema até o horário de ativação especificado |
|
Cria um texto datilografado de uma sessão de terminal |
|
Reexecuta textos datilografados de sessão usando informação de tempo |
|
Reproduz textos datilografados usando informação de tempo |
|
Muda a arquitetura informada em um novo ambiente de aplicativo e configura sinalizadores de personalidade |
|
Executa o aplicativo dado em uma nova sessão |
|
Configura atributos do terminal |
|
Um manipulador de tabela de partição de disco |
|
Permite |
|
Faz mudanças para o UUID e rótulo da área de troca |
|
Desabilita dispositivos e arquivos para paginação e troca |
|
Habilita dispositivos e arquivos para paginação e troca e lista os dispositivos e arquivos atualmente em uso |
|
Alterna para outro sistema de arquivos como a raiz da árvore de montagem |
|
Recupera ou configura uma afinidade de CPU do processo |
|
Manipula os atributos de fixação de utilização do sistema ou de um processo |
|
Um filtro para traduzir sublinhados em sequências de escape indicando sublinhamento para o terminal em uso |
|
Desconecta um sistema de arquivos da árvore de arquivos do sistema |
|
Um link simbólico para setarch |
|
Executa um aplicativo com alguns espaços de nome não compartilhados oriundos do(a) ancestral |
|
Exibe o conteúdo do arquivo de login dado em um formato amigável para o(a) usuário(a) |
|
Um processo de segundo plano usado pela biblioteca UUID para gerar UUIDs baseados em horário em uma forma segura e garantidamente única |
|
Cria novos "UUIDs". Cada novo "UUID" é um número aleatório considerado ser único entre todos os "UUIDs" criados, no sistema local e em outros sistemas, no passado e no futuro, com probabilidade extremamente alta (2128 "UUIDs" são possíveis) |
|
Um utilitário para analisar identificadores únicos |
|
Exibe o conteúdo de um arquivo ou, por padrão, a entrada gerada padrão dele, nos terminais de todos(as) os(as) usuários(as) logados(as) atualmente |
|
Mostra a situação do vigilante de hardware |
|
Informa o local do binário, fonte e arquivos de página de manual para o comando dado |
|
Limpa uma assinatura de sistema de arquivos a partir de um dispositivo |
|
Um link simbólico para setarch |
|
Um aplicativo para configurar e controlar dispositivos zram (disco ram comprimido) |
|
Contém rotinas para identificação de dispositivo e extração de token |
|
Contém rotinas para manipular tabelas de partição |
|
Contém rotinas para montagem e desmontagem de dispositivo de bloco |
|
Contém rotinas para auxiliar a saída gerada de tela em forma tabular |
|
Contém rotinas para gerar identificadores únicos para objetos que possivelmente sejam acessíveis além do sistema local |
O pacote E2fsprogs contém os utilitários para lidar com o
sistema de arquivos ext2
. Ele
também suporta os sistemas de arquivos de registro em diário
ext3
e ext4
.
A documentação do E2fsprogs recomenda que o pacote seja construído em um subdiretório da árvore do fonte:
mkdir -v build cd build
Prepare E2fsprogs para compilação:
../configure --prefix=/usr \ --sysconfdir=/etc \ --enable-elf-shlibs \ --disable-libblkid \ --disable-libuuid \ --disable-uuidd \ --disable-fsck
O significado das opções do configure:
--enable-elf-shlibs
Isso cria as bibliotecas compartilhadas as quais alguns aplicativos nesse pacote usam.
--disable-*
Isso evita construir e instalar as bibliotecas
libuuid
e libblkid
, o processo de segundo
plano uuidd
e o
encapsulador fsck; util-linux
instala versões mais recentes.
Compile o pacote:
make
Para executar os testes, emita:
make check
Um teste chamado m_assume_storage_prezeroed
é conhecido por
falhar.
Instale o pacote:
make install
Remova bibliotecas estáticas inúteis:
rm -fv /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a
Esse pacote instala um arquivo gzipado .info
, mas não atualiza o arquivo
abrangente ao sistema dir
.
Descompacte esse arquivo e então atualize o arquivo do
sistema dir
usando os seguintes
comandos:
gunzip -v /usr/share/info/libext2fs.info.gz install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info
Se desejado, crie e instale alguma documentação adicional emitindo os seguintes comandos:
makeinfo -o doc/com_err.info ../lib/et/com_err.texinfo install -v -m644 doc/com_err.info /usr/share/info install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info
/etc/mke2fs.conf
contém o valor
padrão de várias opções de linha de comando do mke2fs. Você possivelmente
edite o arquivo para tornar os valores padrão convenientes
para as suas necessidades. Por exemplo, alguns utilitários
(não no LFS ou no BLFS) não conseguem reconhecer um sistema
de arquivos ext4
com o
recurso metadata_csum_seed
habilitado. Se
você precisar de tal utilitário, [então] você possivelmente
remova o recurso da lista padrão de recurso do ext4
com o comando:
sed 's/metadata_csum_seed,//' -i /etc/mke2fs.conf
Leia-se a página de manual "mke2fs.conf(5)" para detalhes.
Pesquisa em um dispositivo (geralmente uma partição de disco) por blocos ruins |
|
Muda os atributos de arquivos em sistemas de
arquivos |
|
Um compilador de tabela de erro; ele converte uma
tabela de nomes e mensagens dos códigos de erros em
um arquivo fonte C adequado para uso com a
biblioteca |
|
Um depurador de sistema de arquivo; ele pode ser
usado para examinar e mudar o estado de sistemas de
arquivos |
|
Imprime a informação de superblocos e de grupo de blocos para o sistema de arquivos presente em um dispositivo dado |
|
Informa informação de fragmentação de espaço livre |
|
É usado para verificar e opcionalmente reparar
sistema de arquivos |
|
É usado para salvar dados críticos do sistema de
arquivos |
|
Exibe ou muda o rótulo do sistema de arquivos no
sistema de arquivos |
|
Verifica a situação da MMP (Multiple Mount
Protection) de um sistema de arquivos |
|
Verifica o conteúdo de um sistema de arquivos
|
|
Verifica todos os sistemas de arquivos |
|
Repete o registro de desfazer para um sistema de
arquivos |
|
Utilitário de encriptação do sistema de arquivos
|
|
Desfragmentador em linha para sistema de arquivos
|
|
Informa o quão mau fragmentado um arquivo específico pode estar |
|
Por padrão verifica sistemas de arquivo
|
|
Por padrão verifica sistemas de arquivo
|
|
Por padrão verifica sistemas de arquivo
|
|
Salva a saída gerada de um comando em um arquivo de registro |
|
Lista os atributos de arquivos em um sistema de arquivos segundo estendido |
|
Converte uma tabela de nomes de comando e mensagens
de ajuda em um arquivo fonte C adequado para uso
com a biblioteca de subsistema |
|
Cria um sistema de arquivos |
|
Por padrão cria sistemas de arquivos |
|
Por padrão cria sistemas de arquivos |
|
Por padrão cria sistemas de arquivos |
|
Cria um diretório |
|
Pode ser usado para alargar ou estreitar sistema de
arquivos |
|
Ajusta parâmetros ajustáveis do sistema de arquivos
em sistema de arquivos |
|
A rotina comum de exibição de erro |
|
Usado por dumpe2fs, chattr e lsattr |
|
Contém rotinas para habilitar aplicativos de nível
de usuário(a) para manipular sistemas de arquivos
|
|
Usado por debugfs |
A maioria dos aplicativos e bibliotecas é, por padrão,
compilado com símbolos de depuração inclusos (com a opção
-g
do gcc). Isso significa que
quando depurar um aplicativo ou biblioteca que foi compilado
com informação de depuração, o depurador consegue fornecer não
apenas endereços de memória, mas também os nomes das rotinas e
variáveis.
A inclusão desses símbolos de depuração alarga um aplicativo ou biblioteca significativamente. Aqui estão dois exemplos da quantidade de espaço que esses símbolos ocupam:
Um binário bash com símbolos de depuração: 1200 KB
Um binário bash sem símbolos de depuração: 480 KB (60% menor)
Arquivos da Glibc e do GCC (/lib
e /usr/lib
) com símbolos de depuração: 87
MB
Arquivos da Glibc e do GCC sem símbolos de depuração: 16 MB (82% menor)
Os tamanhos variarão dependendo de qual compilador e biblioteca C foi usado, porém um aplicativo que tenha sido despojado dos símbolos de depuração usualmente é algo como 50% a 80% menor que o homônimo não despojado dele. Como a maioria dos(as) usuários(as) nunca usará um depurador no software do sistema deles(as), um monte de espaço em disco pode ser recuperado removendo-se esses símbolos. A próxima seção mostra como despojar todos os símbolos de depuração dos aplicativos e bibliotecas.
Esta seção é opcional. Se o(a) pretenso(a) usuário(a) não for um(a) programador(a) e não planeja fazer qualquer depuração do software do sistema, [então] o tamanho do sistema pode ser reduzido em cerca de 2 GB removendo-se os símbolos de depuração, e algumas entradas desnecessárias da tabela de símbolo, de binários e de bibliotecas. Isso não causa nenhum inconveniente real para um(a) usuário(a) típico(a) do Linux.
A maioria das pessoas que usa os comandos mencionados abaixo não experiencia quaisquer dificuldades. Entretanto, é fácil cometer um erro e tornar o novo sistema inutilizável. Portanto, antes de executar os comandos strip, é uma boa ideia produzir uma cópia de segurança do sistema LFS no estado atual dele.
Um comando strip
com a opção --strip-unneeded
remove todos os
símbolos de depuração de um binário ou de uma biblioteca.
Também remove todas as entradas da tabela de símbolo não
necessitadas pelo vinculador (para bibliotecas estáticas) ou
pelo vinculador dinâmico (para binários vinculados
dinamicamente e bibliotecas compartilhadas).
Os símbolos de depuração oriundos de bibliotecas selecionadas são comprimidos com Zlib e preservados em arquivos separados. Essa informação de depuração é necessária para se executar testes de regressão com valgrind ou gdb posteriormente, no BLFS.
Observe que o strip sobrescreverá o binário
ou arquivo de biblioteca que ele estiver processando. Isso pode
quebrar os processos usando código ou dados oriundos do
arquivo. Se o processo executando o strip for afetado, [então] o
binário ou biblioteca sendo despojado pode ser destruído; isso
pode tornar o sistema completamente inutilizável. Para evitar
esse problema, nós copiamos algumas bibliotecas e binários para
/tmp
, despojamos elas lá e as
reinstalamos com o comando install. (A entrada
relacionada em Seção 8.2.1,
“Problemas de Atualização” dá a justificativa para usar o
comando install
aqui).
O nome do carregador de "ELF" é "ld-linux-x86-64.so.2" em
sistemas de 64 bits e "ld-linux.so.2" em sistemas de 32 bits.
A construção abaixo seleciona o nome correto para a
arquitetura atual, excluindo qualquer coisa terminada com
g
, no caso dos comandos abaixo
já tiverem sido executados.
Se existir algum pacote cuja versão seja diferente da versão
especificada pelo livro (ou seguindo um aviso de segurança ou
satisfazendo preferência pessoal), [então] possivelmente seja
necessário atualizar o nome de arquivo da biblioteca em
save_usrlib
ou online_usrlib
. Falhar em fazer isso possivelmente torne o
sistema completamente inutilizável.
save_usrlib="$(cd /usr/lib; ls ld-linux*[^g]) libc.so.6 libthread_db.so.1 libquadmath.so.0.0.0 libstdc++.so.6.0.33 libitm.so.1.0.0 libatomic.so.1.2.0" cd /usr/lib for LIB in $save_usrlib; do objcopy --only-keep-debug --compress-debug-sections=zlib $LIB $LIB.dbg cp $LIB /tmp/$LIB strip --strip-unneeded /tmp/$LIB objcopy --add-gnu-debuglink=$LIB.dbg /tmp/$LIB install -vm755 /tmp/$LIB /usr/lib rm /tmp/$LIB done online_usrbin="bash find strip" online_usrlib="libbfd-2.43.1.so libsframe.so.1.0.0 libhistory.so.8.2 libncursesw.so.6.5 libm.so.6 libreadline.so.8.2 libz.so.1.3.1 libzstd.so.1.5.6 $(cd /usr/lib; find libnss*.so* -type f)" for BIN in $online_usrbin; do cp /usr/bin/$BIN /tmp/$BIN strip --strip-unneeded /tmp/$BIN install -vm755 /tmp/$BIN /usr/bin rm /tmp/$BIN done for LIB in $online_usrlib; do cp /usr/lib/$LIB /tmp/$LIB strip --strip-unneeded /tmp/$LIB install -vm755 /tmp/$LIB /usr/lib rm /tmp/$LIB done for i in $(find /usr/lib -type f -name \*.so* ! -name \*dbg) \ $(find /usr/lib -type f -name \*.a) \ $(find /usr/{bin,sbin,libexec} -type f); do case "$online_usrbin $online_usrlib $save_usrlib" in *$(basename $i)* ) ;; * ) strip --strip-unneeded $i ;; esac done unset BIN LIB save_usrlib online_usrbin online_usrlib
Um número grande de arquivos será sinalizado como erros, por causa do formato de arquivo deles não é reconhecido. Esses avisos podem ser seguramente ignorados. Eles indicam que aqueles arquivos são scripts, não binários.
Finalmente, limpe alguns arquivos extras deixados pela execução de testes:
rm -rf /tmp/{*,.*}
Existem também vários arquivos nos diretórios /usr/lib e /usr/libexec com uma extensão de nome de arquivo de .la. Esses são arquivos "libtool archive". Em um sistema moderno Linux, os arquivos .la da libtool somente são úteis para a libltdl. Nenhuma biblioteca no LFS é esperada ser carregada pela libltdl e é sabido que alguns arquivos .la conseguem quebrar construções de pacote do BLFS. Remova aqueles arquivos agora:
find /usr/lib /usr/libexec -name \*.la -delete
Para mais informação acerca de arquivos libtool archive, veja-se a seção do BLFS "About Libtool Archive (.la) files".
O compilador construído em Capítulo 6 e Capítulo 7 ainda está instalado parcialmente e não é mais necessário. Remova-o com:
find /usr -depth -name $(uname -m)-lfs-linux-gnu\* | xargs rm -rf
Finalmente, remova a conta temporária do(a) usuário(a) 'tester' criada no início do capítulo anterior.
userdel -r tester
Este capítulo discute arquivos de configuração e serviços do systemd. Primeiro, os arquivos gerais de configuração necessários para configurar a rede de comunicação são apresentados.
Segundo, problemas que afetam a configuração adequada de dispositivos são discutidos.
Terceiro, configurar o relógio do sistema e esquema de teclado é mostrado.
Quarto, uma introdução breve aos scripts e arquivos de configuração usados quando o(a) usuário(a) se loga no sistema é apresentado.
E finalmente, configurar o comportamento do systemd é discutido.
Esta seção somente se aplica se uma placa de rede de comunicação for para ser configurada.
Iniciando com a versão 209, o systemd embarca um processo de
segundo plano de configuração da rede de comunicação chamado
systemd-networkd o qual
pode ser usado para configuração básica da rede de
comunicação. Adicionalmente, desde a versão 213, resolução de
nome DNS pode ser lidada por systemd-resolved no lugar
de um arquivo estático /etc/resolv.conf
. Ambos os serviços são
habilitados por padrão.
Se você não usará o systemd-networkd para configuração da rede de comunicação (por exemplo, quando o sistema não estiver conectado à rede de comunicação ou você desejar usar outro utilitário, como o NetworkManager para configuração da rede de comunicação), [então] desabilite um serviço para evitar uma mensagem de erro durante a inicialização:
systemctl disable systemd-networkd-wait-online
Arquivos de configuração para "systemd-networkd" (e
"systemd-resolved") podem
ser colocados em "/usr/lib/systemd/network
" ou "/etc/systemd/network
". Arquivos em
"/etc/systemd/network
" tem uma
prioridade mais alta que aqueles em "/usr/lib/systemd/network
". Existem três
tipos de arquivos de configuração: arquivos ".link
", ".netdev
" e ".network
". Para descrições detalhadas e
conteúdo de exemplo desses arquivos de configuração,
consultem-se as páginas de manual "systemd-link(5)",
"systemd-netdev(5)"
e "systemd-network(5)".
O Udev normalmente atribui nomes de interface da placa de rede de comunicação baseados em características físicas do sistema, tais como enp2s1. Se não tiver certeza acerca do que é o nome da sua interface, [então] você sempre pode executar ip link depois que tiver inicializado seu sistema.
Os nomes de interface dependem da implementação e configuração do processo de segundo plano Udev em execução no sistema. O processo de segundo plano Udev para o LFS (systemd-udevd, instalado na Seção 8.76, “Systemd-256.4”), não executará, a menos que o sistema LFS seja inicializado. Assim, não é confiável determinar os nomes de interface sendo usados no sistema LFS executando aqueles comandos na distribuição anfitriã, mesmo que você esteja no ambiente chroot.
Para a maioria dos sistemas, existe somente uma interface de rede de comunicação para cada tipo de conexão. Por exemplo, o nome clássico de interface para uma conexão com fios é eth0. Uma conexão sem fios usualmente terá o nome wifi0 ou wlan0.
Se você preferir usar os nomes clássicos ou personalizados da interface de rede de comunicação, [então] existem três caminhos alternativos para fazer isso:
Mascarar o arquivo .link
do Udev para a política
padrão:
ln -s /dev/null /etc/systemd/network/99-default.link
Criar um esquema manual de nomenclatura, por exemplo
nomeando as interfaces com alguma coisa como
"internet0
",
"dmz0
" ou "lan0
". Para fazer isso, crie
arquivos ".link
" em
"/etc/systemd/network/" que selecionem um nome
explícito ou um esquema melhor de nomenclatura para
as tuas interfaces de rede de comunicação. Por
exemplo:
cat > /etc/systemd/network/10-ether0.link << "EOF"
[Match]
# Muda o endereço MAC conforme apropriado para o seu dispositivo de rede de comunicação
MACAddress=12:34:45:78:90:AB
[Link]
Name=ether0
EOF
Veja-se "systemd.link(5)" para mais informações.
Em "/boot/grub/grub.cfg", passe a opção "net.ifnames=0
" na linha de comando do
núcleo.
O comando abaixo cria um arquivo básico de configuração para uma configuração de IP Estático (usando ambos systemd-networkd e systemd-resolved):
cat > /etc/systemd/network/10-eth-static.network << "EOF"
[Match]
Name=<nome-dispositivo-rede-de-comunicação>
[Network]
Address=192.168.0.2/24
Gateway=192.168.0.1
DNS=192.168.0.1
Domains=<Seu Nome de Domínio>
EOF
Múltiplas entradas de DNS podem ser adicionadas se você
tiver mais que um servidor de DNS. Não inclua entradas de
DNS ou de Domínios se você pretende usar um arquivo
estático /etc/resolv.conf
.
Se o sistema será conectado à Internet, [então] ele precisará
de alguns meios de resolução de nome do Domain Name Service
(DNS) para resolver nomes de domínio da Internet para
endereços de IP e vice versa. Isso é melhor alcançado
colocando-se o endereço de IP do servidor de DNS, disponível
a partir do ISP ou do(a) administrador(a) da rede de
comunicação, no /etc/resolv.conf
.
Se usar métodos incompatíveis com systemd-resolved para
configurar suas interfaces da rede de comunicação
(exemplo: ppp, etc.); ou se usar qualquer tipo de
resolvedor local (exemplo: bind, dnsmasq, unbound, etc.);
ou qualquer outro aplicativo que gere um /etc/resolv.conf
(exemplo: um
aplicativo resolvconf outro
diferente daquele fornecido pelo systemd), [então] o
serviço systemd-resolved não
deveria ser usado.
Para desabilitar systemd-resolved, emita o seguinte comando:
systemctl disable systemd-resolved
Quando usar o systemd-resolved para
configuração do DNS, ele cria o arquivo /run/systemd/resolve/stub-resolv.conf
. E,
se /etc/resolv.conf
não
existir, [então] ele será criado pelo systemd-resolved como um
link simbólico para /run/systemd/resolve/stub-resolv.conf
.
Então, é desnecessário criar um /etc/resolv.conf
manualmente.
Se um /etc/resolv.conf
estático for desejado, [então] crie-o executando o seguinte
comando:
cat > /etc/resolv.conf << "EOF"
# Início do /etc/resolv.conf
domain <Seu Nome de Domínio>
nameserver <Endereço de IP do seu servidor primário de nome>
nameserver <Endereço de IP do seu servidor secundário de nome>
# Fim do /etc/resolv.conf
EOF
A declaração domain
pode ser
omitida ou substituída por uma declaração search
. Veja-se a página de manual para
resolv.conf para mais detalhes.
Substitua <Endereço de IP
do servidor de nome>
pelo endereço de IP do
servidor DNS mais apropriado para a sua configuração.
Frequentemente existirá mais que uma entrada (exigências
demandam servidores secundários para capacidade de
substituto). Se você precisa ou quer somente um servidor
DNS, [então] remova a segunda linha servidor de nome do arquivo. O
endereço de IP também possivelmente seja um roteador na
rede local de comunicação. Outra opção é a de usar o
serviço de DNS Google Public usando os endereços de IP
abaixo como servidores de nome.
Os endereços DNS IPv4 do Google Public são 8.8.8.8
e 8.8.4.4
para IPv4; e
2001:4860:4860::8888
e
2001:4860:4860::8844
para
IPv6.
Durante o processo de inicialização, o arquivo /etc/hostname
é usado para estabelecer o
nome de dispositivo do sistema.
Crie o arquivo /etc/hostname
e
informe um nome de dispositivo executando:
echo "<lfs>
" > /etc/hostname
<lfs>
precisa
ser substituído pelo nome dado para o computador. Não informe
o Fully Qualified Domain Name (FQDN) aqui. Essa informação é
colocada no arquivo /etc/hosts
.
Decida acerca de um "Fully-Qualified Domain Name" ("FQDN"), e
possíveis apelidos para uso no arquivo /etc/hosts
. Se usar endereços estáticos de
IP, [então] você também precisará decidir acerca de um
endereço de IP. A sintaxe para uma entrada de arquivo "hosts"
é:
Endereços_IP meuhost.exemplo.org apelidos
A menos que o computador seja para estar visível para a Internet (por exemplo, existe um domínio registrado e um bloco válido de endereços atribuídos de IP—a maioria dos(as) usuários(as) não tem isso), assegure-se de que o endereço de IP está no intervalo de endereço privado de IP da rede de comunicação. Intervalos válidos são:
Intervalo de Endereço Privado de Rede Prefixo Normal
10.0.0.1 - 10.255.255.254 8
172.x.0.1 - 172.x.255.254 16
192.168.y.1 - 192.168.y.254 24
x pode ser qualquer número no intervalo 16-31. y pode ser qualquer número no intervalo 0-255.
Um endereço de IP privado válido poderia ser 192.168.1.1.
Se o computador for para estar visível para a Internet, [então] um "FQDN" válido pode ser o próprio nome de domínio ou uma sequência de caracteres resultante da concatenação de um prefixo (geralmente o nome do dispositivo) e o nome de domínio com um caractere “.”. E você precisa contactar o provedor de domínio para resolver o "FQDN" para seu endereço de IP público.
Mesmo se o computador não estiver visível para a Internet, um
"FQDN" ainda é necessário para determinados programas, tais
como "MTAs", funcionarem corretamente. Um "FQDN" especial,
localhost.localdomain
, pode ser
usado para essa finalidade.
Crie o arquivo /etc/hosts
usando o seguinte comando:
cat > /etc/hosts << "EOF"
# Começo /etc/hosts
<192.168.0.2>
<FQDN>
[apelido1] [apelido2] ...
::1 ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# Fim /etc/hosts
EOF
Os valores <192.168.0.2>
e
<FQDN>
precisam ser mudados para usuários(as) ou exigências
específicos(as) (se atribuído um endereço de IP por um(a)
administrador(a) de rede de comunicação/sistema e a máquina
estará conectada a uma rede existente de comunicação). O(s)
nome(s) de apelido(s) opcional(is) pode(m) ser omitido(s) e a
linha <192.168.0.2>
pode ser
omitida se você estiver usando uma conexão configurada com
"DHCP" ou autoconfiguração de "IPv6" ou usando localhost.localdomain
como o "FQDN".
O "/etc/hostname
" não contém
entradas para "localhost
",
"localhost.localdomain
" ou o
nome do dispositivo (sem um domínio) porque eles são
manuseados pelo módulo "NSS" "myhostname
"; leia-se a página de manual
"nss-myhostname(8)"
para detalhes.
A entrada ::1 é o homônimo "IPv6" do 127.0.0.1 e representa a interface de "loopback" "IPv6".
No Capítulo 8, nós instalamos o processo de segundo plano Udev quando systemd foi construído. Antes de entrarmos nos detalhes referentes a como o Udev funciona, um histórico breve dos métodos anteriores de manuseio de dispositivos é oportuno.
Sistemas Linux em geral tradicionalmente usavam um método
estático de criação de dispositivo, pelo qual um grande número
de nós de dispositivo era criado sob /dev
(às vezes literalmente milhares de nós),
independente de se os dispositivos de hardware correspondentes
atualmente existissem. Isso tipicamente era feito via um script
MAKEDEV, o qual
continha um número de chamadas ao aplicativo mknod com os números
relevantes de dispositivo maior e menor para cada dispositivo
possível que pudesse existir no mundo.
Usando o método Udev, nós de dispositivo somente são criados
para aqueles dispositivos que são detectados pelo núcleo. Esses
nós de dispositivo são criados a cada vez que o sistema
inicializa; eles serão armazenados em um sistema de arquivos
devtmpfs
(um sistema de
arquivos virtuais que reside inteiramente na memória do
sistema). Nós de dispositivo não exigem muito espaço, de forma
que a memória que é usada é insignificante.
Em fevereiro de 2000, um novo sistema de arquivos chamado
devfs
foi mesclado no núcleo
2.3.46 e foi tornado disponível durante as séries 2.4 de
núcleos estáveis. Embora ele estivesse presente no próprio
fonte do núcleo, esse método de criar dispositivos
dinamicamente nunca recebeu suporte decisivo dos(as)
desenvolvedores(as) centrais do núcleo.
O problema principal com a abordagem adotada pelo
devfs
era a maneira como ele
lidava com detecção, criação e nomenclatura de dispositivo. O
último problema, esse da nomenclatura de nó de dispositivo,
era talvez o mais crítico. Geralmente é aceito que, se nomes
de dispositivo forem configuráveis, [então] a política de
nomenclatura de dispositivo deveria ser escolhida pelos(as)
administradores(as) do sistema e não imposta a eles(as)
pelos(as) desenvolvedores(as). O sistema de arquivos
devfs
também sofria com
algumas condições que eram inerentes ao projeto dele; essas
não poderiam ser corrigidas sem uma revisão substancial do
núcleo. O devfs
ficou marcado
como obsoleto por um longo tempo, e finalmente foi removido
do núcleo em junho de 2006.
Com o desenvolvimento da árvore do núcleo instável 2.5,
liberada posteriormente como a série 2.6 dos núcleos
estáveis, um novo sistema de arquivos virtuais chamado
sysfs
veio a existir. O
trabalho do sysfs
é o de
fornecer informação a respeito da configuração de hardware do
sistema para processos do espaço de usuário(a). Com essa
representação visível ao espaço de usuário(a), tornou-se
possível desenvolver um substituto de espaço de usuário(a)
para o devfs
.
O sistema de arquivos sysfs
foi brevemente mencionado acima. Alguém possivelmente
questione como o sysfs
sabe
a respeito dos dispositivos presentes em um sistema e quais
números de dispositivo deveriam ser usados para eles.
Controladores que tenham sido compilados internamente no
núcleo registram os objetos deles em sysfs
(devtmpfs internamente) assim que
são detectados pelo núcleo. Para controladores compilados
como módulos, o registro acontece quando o módulo for
carregado. Assim que o sistema de arquivos sysfs
for montado (em /sys
), os dados os quais os controladores
tenham registrado com sysfs
ficam disponíveis para os processos de espaço de usuário(a)
e para o udevd para processamento (incluindo modificações
para nós de dispositivo).
Arquivos de dispositivo são criados pelo núcleo no sistema
de arquivos devtmpfs
.
Qualquer controlador que deseje registrar um nó de
dispositivo usará o devtmpfs
(via núcleo do controlador)
para fazê-lo. Quando uma instância do devtmpfs
é montada em /dev
, o nó de dispositivo inicialmente
será exposto para o espaço de usuário(a) com um nome,
permissões e proprietário(a) fixos.
Pouco tempo depois, o núcleo enviará um uevent para
udevd.
Baseado nas regras especificadas nos arquivos dentro dos
diretórios /etc/udev/rules.d
,
/usr/lib/udev/rules.d
e
/run/udev/rules.d
,
udevd criará
links simbólicos adicionais para o nó de dispositivo ou
mudará as permissões, proprietário(a) ou grupo deles, ou
modificará a entrada interna (nome) de base de dados do
udevd para
aquele objeto.
As regras nesses três diretórios são numeradas e todos os
três diretórios são mesclados. Se udevd não puder encontrar
uma regra para o dispositivo que ele esteja criando,
[então] ele deixará as permissões e propriedade no que
devtmpfs
usou inicialmente.
Controladores de dispositivo compilados como módulos
possivelmente tenham apelidos construídos dentro deles.
Apelidos são visíveis na saída gerada do aplicativo
"modinfo" e
geralmente estão relacionados aos identificadores
específicos ao barramento dos dispositivos suportados por
um módulo. Por exemplo, o controlador "snd-fm801" suporta dispositivos
"PCI" com "ID" de fornecedor "0x1319" e "ID" de dispositivo
"0x0801" e tem um apelido de "pci:v00001319d00000801sv*sd*bc04sc01i*
".
Para a maioria dos dispositivos, o controlador de
barramento exporta o apelido do controlador que lidaria com
o dispositivo via "sysfs
".
Por exemplo, o arquivo "/sys/bus/pci/devices/0000:00:0d.0/modalias
"
pode conter a sequência de caracteres "pci:v00001319d00000801sv00001319sd00001319bc04sc01i00
".
As regras padrão fornecidas com o "Udev" causarão o
"udevd"
chamar "/sbin/modprobe" com o
conteúdo da variável de ambiente do "uevent" "MODALIAS
" (o qual deveria ser o mesmo que o
conteúdo do arquivo "modalias
" em "sysfs"), dessa forma
carregando todos os módulos cujos apelidos correspondam a
essa sequência de caracteres depois da expansão de carácter
curinga.
Nesse exemplo, isso significa que, em adição a snd-fm801, o obsoleto (e indesejado) controlador forte será carregado se ele estiver disponível. Veja-se abaixo para maneiras nas quais o carregamento de controladores indesejados pode ser evitado.
O próprio núcleo também é capaz de carregar módulos para protocolos de rede de comunicação, sistemas de arquivos e suporte NLS sob demanda.
Existem uns poucos possíveis problemas quando se trata de criar automaticamente nós de dispositivos.
O Udev só carregará um módulo se ele tiver um apelido
específico de barramento e o controlador de barramento
exportar adequadamente os apelidos necessários para
sysfs
. Em outros casos,
deve-se organizar o carregamento de módulo por outros
meios. Com o Linux-6.10.5, o Udev é conhecido por carregar
controladores escritos adequadamente para dispositivos
INPUT, IDE, PCI, USB, SCSI, SERIO e FireWire.
Para determinar se o controlador de dispositivo que você
exige tem o suporte necessário para o Udev, execute
modinfo com o
nome do módulo como o argumento. Agora tente localizar o
diretório do dispositivo sob /sys/bus
e verifique se existe um arquivo
modalias
lá.
Se o arquivo modalias
existir
em sysfs
, [então] o
controlador suporta o dispositivo e pode falar com ele
diretamente, mas não tem o apelido, isso é um defeito no
controlador. Carregue o controlador sem a ajuda do Udev e
espere que o problema seja corrigido posteriormente.
Se não existir arquivo modalias
no diretório relevante sob
/sys/bus
, [então] isso
significa que os(as) desenvolvedores(as) do núcleo ainda
não adicionaram suporte modalias para esse tipo de
barramento. Com o Linux-6.10.5, esse é o caso com
barramentos ISA. Espere que esse problema seja corrigido em
versões posteriores do núcleo.
O Udev não é destinado para carregar controladores “encapsuladores”, tais como snd-pcm-oss, e controladores de não hardware, tais como loop, de maneira alguma.
Se o módulo “encapsulador” somente aprimora a
funcionalidade fornecida por algum outro módulo (por
exemplo, snd-pcm-oss
aprimora a funcionalidade de snd-pcm tornando as placas de
som disponíveis para aplicações OSS), [então] configure o
modprobe para
carregar o encapsulador depois que o Udev carregar o módulo
encapsulado. Para fazer isso, adicione uma linha
“softdep” ao arquivo /etc/modprobe.d/
correspondente. Por exemplo:
<nome_arquivo>
.conf
softdep snd-pcm post: snd-pcm-oss
Observe que o comando “softdep” também permite dependências
"pre:
", ou uma mistura de
ambas as dependências "pre:
" e
"post:
". Veja-se a página de
manual "modprobe.d(5)"
para mais informação a respeito da sintaxe e recursos do
“softdep”.
Ou não construa o módulo, ou coloque-o na lista negra em um
arquivo /etc/modprobe.d/blacklist.conf
como feito
com o módulo forte
no exemplo abaixo:
blacklist forte
Módulos em listas negras ainda podem ser carregados manualmente com o comando explícito modprobe.
Isso geralmente acontece se uma regra inesperadamente corresponder com um dispositivo. Por exemplo, uma regra mal escrita pode corresponder com ambos um disco SCSI (como desejado) e o dispositivo genérico SCSI correspondente (incorretamente) por fornecedor(a). Encontre a regra infratora e torne-a mais específica, com a ajuda do comando udevadm info.
Isso possivelmente seja outra manifestação do problema
anterior. Se não, e sua regra usar atributos do
sysfs
, [então] isso
possivelmente seja um problema de temporização do núcleo, a
ser corrigido em núcleos posteriores. Por hora, você pode
contorná-lo criando uma regra que aguarda o atributo usado
do sysfs
e o adiciona ao
arquivo /etc/udev/rules.d/10-wait_for_sysfs.rules
(crie esse arquivo se ele não existir). Por favor,
notifique a lista LFS Development se você o fizer e isso
ajudar.
Primeiro, esteja certo(a) de que o driver está construído internamente no núcleo ou já carregado como um módulo e que o Udev não está criando um dispositivo mal nomeado.
Se um controlador do núcleo não exportar os dados dele para
o sysfs
, [então] o Udev
carece da informação necessária para criar um nó de
dispositivo. Isso é mais provável de acontecer com
controladores terceirizados oriundos de fora da árvore do
núcleo. Crie um nó de dispositivo estático em /usr/lib/udev/devices
com os números
maior/menor apropriados (veja-se o arquivo devices.txt
dentro da documentação do
núcleo ou a documentação fornecida pelo(a) fornecedor(a) do
controlador terceirizado). O nó de dispositivo estático
será copiado para /dev
pelo
udev.
Isso é devido ao fato de o "Udev", pelo projeto, lidar com "uevents" e carregar módulos em paralelo e, assim, em uma ordem imprevisível. Isso nunca será “corrigido”. Você não deveria confiar nos nomes de dispositivos do núcleo sendo estáveis. Em vez disso, crie as tuas próprias regras que fazem links simbólicos com nomes estáveis baseados em alguns atributos estáveis do dispositivo, tais como um número de série ou a saída gerada dos vários utilitários "*_id" instalados pelo "Udev". Veja-se a "Seção 9.4, “Gerenciando Dispositivos”" e "Seção 9.2, “Configuração Geral da Rede de Comunicação”" para exemplos.
Documentação útil adicional está disponível nos seguintes sítios:
Uma implementação de espaço de usuário(a) do
devfs
http://www.kroah.com/linux/talks/ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf
O Sistema de Arquivos sysfs
http://www.kernel.org/pub/linux/kernel/people/mochel/doc/papers/ols-2005/mochel.pdf
Como explicado na Seção 9.3,
“Visão Geral do Manuseio de Dispositivo e de Módulo,” a
ordem na qual dispositivos com a mesma função aparecem em
/dev
é essencialmente
aleatória. Por exemplo, se você tiver uma câmera web USB e um
sintonizador de TV, às vezes /dev/video0
se referirá à câmera e
/dev/video1
se referirá ao
sintonizador; e às vezes depois de uma reinicialização a
ordem mudará. Para todas as classes de hardware, exceto
placas de som e placas de rede de intercomunicação, isso é
corrigível criando-se regras do udev para criar links
simbólicos persistentes. O caso das placas de rede de
intercomunicação está abrangido separadamente na Seção 9.2,
“Configuração Geral da Rede de Comunicação,” e
configuração de placa de som pode ser encontrado no
BLFS.
Para cada um dos seus dispositivos que é provável ter esse
problema (mesmo que o problema não exista em sua distribuição
atual Linux), encontre o diretório correspondente sob
/sys/class
ou /sys/block
. Para dispositivos de vídeo,
isso possivelmente seja /sys/class/video4linux/video
. Descubra os
atributos que identificam o dispositivo de maneira única
(geralmente, IDs de fornecedor(a) e produto e (ou) números
seriais funcionam):
X
udevadm info -a -p /sys/class/video4linux/video0
Então escreva regras que criam os links simbólicos, por exemplo:
cat > /etc/udev/rules.d/83-duplicate_devs.rules << "EOF"
# Links simbólicos persistentes para webcam e sintonizador
KERNEL=="video*", ATTRS{idProduct}=="1910", ATTRS{idVendor}=="0d81", SYMLINK+="webcam"
KERNEL=="video*", ATTRS{device}=="0x036f", ATTRS{vendor}=="0x109e", SYMLINK+="tvtuner"
EOF
O resultado é que os dispositivos /dev/video0
e /dev/video1
ainda se referem aleatoriamente
ao sintonizador e à câmera web (e, portanto, nunca deveriam
ser usados diretamente), mas existem links simbólicos
/dev/tvtuner
e /dev/webcam
que sempre apontam para o
dispositivo correto.
Esta seção discute como configurar o serviço de sistema systemd-timedated, o qual configura o relógio e fuso horário do sistema.
Se você não conseguir se lembrar se ou não o relógio do
hardware está configurado para UTC, [então] descubra executando
o comando hwclock --localtime
--show
. Isso mostrará o que a hora atual é de
acordo com o relógio do hardware. Se essa hora corresponder à
que o seu relógio diz, então o relógio do hardware está
configurado para hora local. Se a saída gerada originária do
hwclock não for a
hora local, [então] as chances são as de que ele esteja
configurado para hora UTC. Verifique isso adicionando ou
subtraindo a quantidade apropriada de horas para o fuso horário
à (da) hora mostrada pelo hwclock. Por exemplo, se você
estiver atualmente no fuso horário MST, o qual é conhecido
também como GMT -0700, [então] adicione sete horas à hora
local.
O systemd-timedated lê
/etc/adjtime
e, dependendo do
conteúdo do arquivo, configura o relógio para ou UTC ou hora
local.
Crie o arquivo /etc/adjtime
com o
seguinte conteúdo se seu relógio do hardware estiver
configurado para hora local:
cat > /etc/adjtime << "EOF"
0.0 0 0.0
0
LOCAL
EOF
Se /etc/adjtime
não estiver
presente na primeira inicialização, [então] systemd-timedated assumirá
que o relógio do hardware está configurado para UTC e ajustará
o arquivo de acordo com isso.
Você também pode usar o utilitário timedatectl para dizer ao systemd-timedated se o seu relógio do hardware está configurado para UTC ou hora local:
timedatectl set-local-rtc 1
O timedatectl também pode ser usado para mudar a hora e fuso horário do sistema.
Para mudar sua atual hora do sistema, emita:
timedatectl set-time YYYY-MM-DD HH:MM:SS
O relógio do hardware também será atualizado de acordo.
Para mudar seu fuso horário atual, emita:
timedatectl set-timezone FUSO_HORÁRIO
Você consegue obter uma lista dos fusos horários disponíveis executando:
timedatectl list-timezones
Por favor, observe que o comando timedatectl não funciona no ambiente chroot. Ele somente pode ser usado depois que o sistema LFS for inicializado com o systemd.
Iniciando com a versão 213, o systemd embarca um processo de segundo plano chamado systemd-timesyncd o qual pode ser usado para sincronizar a hora do sistema com servidores remotos do NTP.
O processo de segundo plano não é destinado como um substituto para o bem estabelecido processo de segundo plano do NTP, porém como uma implementação somente cliente do protocolo SNTP, o qual pode ser usado para tarefas menos avançadas e em sistemas de recurso limitado.
Iniciando com o systemd versão 216, o processo de segundo plano systemd-timesyncd está habilitado por padrão. Se você desejar desabilitá-lo, [então] emita o seguinte comando:
systemctl disable systemd-timesyncd
O arquivo /etc/systemd/timesyncd.conf
pode ser usado
para mudar os servidores do NTP que o systemd-timesyncd
sincroniza com.
Por favor, observe que, quando o relógio do sistema estiver configurado para Hora Local, [então] o systemd-timesyncd não atualizará o relógio do hardware.
Esta seção discute como configurar o serviço de sistema systemd-vconsole-setup, o qual configura a fonte do console virtual e mapa de teclas do console.
O serviço systemd-vconsole-setup lê o
arquivo /etc/vconsole.conf
para
informação de configuração. Decida qual mapa de teclas e fonte
de tela será usada. Vários HOWTOs específicos de idioma também
podem ajudar com isso, veja-se https://tldp.org/HOWTO/HOWTO-INDEX/other-lang.html.
Examine a saída gerada de localectl list-keymaps para
uma lista dos mapas válidos de teclas do console. Olhe no
diretório /usr/share/consolefonts
para fontes válidas de tela.
O arquivo "/etc/vconsole.conf
"
deveria conter linhas da forma: VARIÁVEL=valor
. As seguintes variáveis são
reconhecidas:
Essa variável especifica a tabela de mapeamento de tecla
para o teclado. Se desconfigurada, [então] ela padroniza
para us
.
Essa variável pode ser usada para configurar um segundo mapa de alternância de teclas e é desconfigurada por padrão.
Essa variável especifica a fonte usada pelo console virtual.
Essa variável especifica o mapa de console para ser usado.
Essa variável especifica o mapa de fonte Unicode.
Usaremos C.UTF-8
como localidade
para sessões interativas no console do Linux na Seção 9.7,
“Configurando a Localidade do Sistema.” As fontes do
console fornecidas pelo pacote Kbd contendo os glifos para todos os
caracteres provenientes das mensagens do aplicativo na
localidade C.UTF-8
são
LatArCyrHeb*.psfu.gz
,
LatGrkCyr*.psfu.gz
, Lat2-Terminus16.psfu.gz
e pancyrillic .f16.psfu.gz
em /usr/share/consolefonts
(as outras fontes de
console fornecidas carecem de glifos de alguns caracteres, como
as aspas esquerda/direita do Unicode e o Traço inglês do
Unicode). Portanto, configure uma delas, por exemplo
Lat2-Terminus16.psfu.gz
como
fonte padrão do console:
echo FONT=Lat2-Terminus16
> /etc/vconsole.conf
Um exemplo para um teclado e console alemão é dado abaixo:
cat > /etc/vconsole.conf << "EOF"
KEYMAP=de-latin1
FONT=Lat2-Terminus16
EOF
Você consegue mudar o valor de KEYMAP em tempo de execução usando o utilitário localectl:
localectl set-keymap MAPA
Por favor, observe que o comando localectl não funciona no ambiente chroot. Ele somente pode ser usado depois que o sistema LFS for inicializado com o systemd.
Você também consegue usar o utilitário localectl com os parâmetros correspondentes para mudar o esquema, modelo, variante e opções de teclado do X11:
localectl set-x11-keymap ESQUEMA [MODELO] [VARIANTE] [OPÇÕES]
Para listar valores possíveis para os parâmetros do localectl set-x11-keymap, execute localectl com os parâmetros listados abaixo:
Mostra os modelos conhecidos de mapeamento de teclado do X11.
Mostra esquemas conhecidos de mapeamento de teclado do X11.
Mostra variantes conhecidas de mapeamento de teclado do X11.
Mostra opções conhecidas de mapeamento de teclado do X11.
Usar quaisquer dos parâmetros listados acima exige o pacote XKeyboard-Config originário do BLFS.
Algumas variáveis de ambiente são necessárias para suporte ao idioma nativo. Configurá-las adequadamente resulta em:
A saída gerada de aplicativos sendo traduzida para seu idioma nativo
A classificação correta dos caracteres em letras, dígitos e outras classes. Isso é necessário para o bash aceitar adequadamente caracteres não ASCII em linhas de comando em localidades não inglesas
A sequência de ordenação alfabética correta para o país
O apropriado tamanho padrão de papel
A formatação correta dos valores monetário, hora e data
Substitua <ll>
abaixo pelo código de duas letras para teu idioma desejado (por
exemplo, en
) e <CC>
pelo código de duas
letras para o país apropriado (por exemplo, GB
). <charmap>
deveria ser
substituído pelo mapa de caracteres canônico para a tua
localidade escolhida. Modificadores opcionais, tais como
@euro
, também podem estar
presentes.
A lista de todas as localidades suportadas pela Glibc pode ser obtida executando-se o seguinte comando:
locale -a
Mapas de caracteres podem ter um número de apelidos, por
exemplo, ISO-8859-1
também é
referenciado como iso8859-1
e
iso88591
. Alguns aplicativos não
conseguem lidar com os vários sinônimos corretamente (por
exemplo, exigem que UTF-8
seja
escrito como UTF-8
, não
utf8
), de forma que é mais seguro,
na maioria dos casos, escolher o nome canônico para uma
localidade específica. Para determinar o nome canônico, execute
o seguinte comando, onde <nome
da localidade>
é a saída gerada dada por
locale -a para a
tua localidade preferida (en_GB.iso88591
no nosso exemplo).
LC_ALL=<nome da localidade>
mapa de caracteres da localidade
Para a localidade en_GB.iso88591
,
o comando acima imprimirá:
ISO-8859-1
Isso resulta em uma configuração final de localidade de
en_GB.ISO-8859-1
. É importante que
a localidade encontrada usando-se a heurística acima seja
testada antes que seja adicionada aos arquivos de iniciação do
Bash:
LC_ALL=<nome da localidade> locale language LC_ALL=<nome da localidade> locale charmap LC_ALL=<nome da localidade> locale int_curr_symbol LC_ALL=<nome da localidade> locale int_prefix
Os comandos acima deveriam imprimir o nome do idioma, a codificação de caracteres usada pela localidade, a moeda local, e o prefixo para discar antes do número de telefone para a finalidade de se alcançar o país. Se quaisquer dos comandos acima falhar com uma mensagem similar àquela mostrada abaixo, isso significa que tua localidade ou não foi instalada no Capítulo 8 ou não é suportada pela instalação padrão da Glibc.
locale: Cannot set LC_* to default locale: No such file or directory
Se isso acontecer, você deveria ou instalar a localidade desejada usando o comando localedef, ou considerar escolher uma localidade diferente. As instruções posteriores assumem que não existem tais mensagens de erro originárias da Glibc.
Outros pacotes também podem funcionar incorretamente (mas, possivelmente não necessariamente exibam quaisquer mensagens de erro) se o nome da localidade não corresponder às expectativas deles. Nesses casos, investigar-se como outras distribuições do Linux suportam tua localidade poderia fornecer alguma informação útil.
Uma vez que as configurações adequadas de localidade tenham
sido determinadas, crie o arquivo /etc/locale.conf
:
cat > /etc/locale.conf << "EOF"
LANG=<ll>_<CC>.<mapa_caracteres><@modificadores>
EOF
O aplicativo de shell /bin/bash (aqui chamado de
“o
shell”) usa uma coleção de arquivos de iniciação
para ajudar a criar o ambiente para execução. Cada arquivo tem
um uso específico e pode afetar o login e os ambientes
interativos diferentemente. Os arquivos no diretório
/etc
fornecem configurações
globais. Se arquivos equivalentes existirem no diretório
inicial, eles poderão substituir as configurações globais.
Um shell interativo de login é iniciado depois de um login
bem-sucedido, usando /bin/login, lendo o arquivo
/etc/passwd
. Um shell interativo
sem login é iniciado na linha de comando (por exemplo,
[prompt]$
/bin/bash). Um shell não
interativo geralmente está presente quando um conjunto de
comandos sequenciais de shell está em execução. Não é
interativo porque está processando um conjunto de comandos
sequenciais e não aguardando a entrada do(a) usuário(a) entre
os comandos.
Os shells de login geralmente não são
afetados pelas configurações em /etc/locale.conf
. Crie o /etc/profile
para ler as
configurações de localidade a partir de /etc/locale.conf
e exportá-las, mas
defina a localidade C.UTF-8
se
executar no console do Linux (para evitar que aplicativos
emitam caracteres que o console do Linux não consiga
renderizar):
cat > /etc/profile << "EOF"
# Inicia /etc/profile
for i in $(locale); do
unset ${i%=*}
done
if [[ "$TERM" = linux ]]; then
export LANG=C.UTF-8
else
source /etc/locale.conf
for i in $(locale); do
key=${i%=*}
if [[ -v $key ]]; then
export $key
fi
done
fi
# Termina /etc/profile
EOF
Observe que você consegue modificar o /etc/locale.conf
com o utilitário
localectl do
systemd. Para usar o localectl para o exemplo
acima, execute:
localectl set-locale LANG="<ll>_<CC>.<mapa_caracteres><@modificadores>
"
Você também pode especificar outras variáveis de ambiente
específicas de idioma, tais como LANG
; LC_CTYPE
;
LC_NUMERIC
; ou qualquer outra
variável de ambiente oriunda da saída gerada de locale. Apenas separe-as com
um espaço. Um exemplo onde LANG
é
configurada como en_US.UTF-8, porém LC_CTYPE
é configurada apenas como en_US é:
localectl set-locale LANG="en_US.UTF-8" LC_CTYPE="en_US"
Por favor, observe que o comando localectl não funciona no ambiente chroot. Ele somente pode ser usado depois que o sistema LFS for inicializado com o systemd.
As localidades C
(padrão) e
en_US
(aquele recomendado para
usuários(as) do inglês dos Estados Unidos da América do Norte)
são diferentes. C
usa o conjunto
de caracteres de 7 bits US-ASCII e trata bytes com o bit de
ordem alta configurado como caracteres inválidos. Esse é o
porquê, por exemplo, do comando ls substitui-los por pontos
de interrogação nessa localidade. Também, uma tentativa de
enviar mensagem com tais caracteres a partir do Mutt ou do Pine
resulta em mensagens de não conformidade com RFC sendo enviadas
(o conjunto de caracteres na mensagem de saída é indicado como
unknown 8-bit
). É sugerido
que você use a localidade C
somente se tiver certeza de que nunca precisará de caracteres
de 8 bits.
O arquivo inputrc
é o arquivo de
configuração para a biblioteca readline, a qual fornece
recursos de edição enquanto o(a) usuário(a) estiver digitando
uma linha a partir do terminal. Ele funciona traduzindo
entradas geradas do teclado em ações específicas. Readline é
usada pelo Bash e pela maioria dos outros shells, bem como
muitos outros aplicativos.
A maioria das pessoas não necessita de funcionalidade
específica de usuário(a), de forma que o comando abaixo cria um
/etc/inputrc
global usado por
qualquer um(a) que se logue. Se posteriormente decidir que
precisa sobrepor os padrões em uma base por usuário(a), [então]
você pode criar um arquivo .inputrc
no diretório lar do(a) usuário(a)
com os mapeamentos modificados.
Para mais informação a respeito de como editar o arquivo
inputrc
, veja-se info bash sob a seção
Readline Init File.
info readline
também é uma boa fonte de informação.
Abaixo está um inputrc
global
genérico junto com comentários para explicar o que as várias
opções fazem. Observe que os comentários não podem estar na
mesma linha que os comandos. Crie o arquivo usando o seguinte
comando:
cat > /etc/inputrc << "EOF"
# Início do /etc/inputrc
# Modificado por Chris Lynn <roryo@roryo.dynup.net>
# Permite ao prompt de comando passar para a próxima linha
set horizontal-scroll-mode Off
# Habilita entrada gerada de 8 bits
set meta-flag On
set input-meta On
# Desliga o despojamento do oitavo bit
set convert-meta Off
# Mantém o oitavo bit para exibir
set output-meta On
# nada, visível ou audível
set bell-style none
# Tudo do seguinte mapeia a sequência de escape do valor contido no
# primeiro argumento para as funções específicas do readline
"\eOd": backward-word
"\eOc": forward-word
# Para o console do Linux
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[3~": delete-char
"\e[2~": quoted-insert
# Para o xterm
"\eOH": beginning-of-line
"\eOF": end-of-line
# Para o Konsole
"\e[H": beginning-of-line
"\e[F": end-of-line
# Fim do /etc/inputrc
EOF
O arquivo shells
contém uma lista
dos shells de login no sistema. Os aplicativos usam esse
arquivo para determinar quando um shell é válido. Para cada
shell, uma linha única deveria estar presente, consistindo do
caminho do shell relativo à raiz da estrutura de diretórios
(/).
Por exemplo, esse arquivo é consultado pelo chsh para determinar quando um(a) usuário(a) desprivilegiado(a) possa mudar o shell de login para a própria conta dele(a). Se o nome de comando não estiver listado, [então] o(a) usuário(a) terá negada a habilidade de mudar shells.
É uma exigência para aplicativos, tais como GDM, o qual não povoa o navegador de face
se ele não puder encontrar /etc/shells
ou processos de segundo plano do
FTP, os quais tradicionalmente proíbem acesso a usuários(as)
com shells não incluídos nesse arquivo.
cat > /etc/shells << "EOF"
# Início do /etc/shells
/bin/sh
/bin/bash
# Fim do /etc/shells
EOF
O arquivo "/etc/systemd/system.conf
" contém um
conjunto de opções para controlar as operações básicas do
"systemd". O arquivo padrão tem todas as entradas comentadas
com as configurações padrão indicadas. Esse arquivo é onde o
nível de registro pode ser mudado, bem como algumas
configurações básicas de registro. Veja-se a página de manual
"systemd-system.conf(5)"
para detalhes a respeito de cada opção de configuração.
O comportamento normal para o systemd é o de limpar a tela ao final da sequência de inicialização. Se desejado, esse comportamento possivelmente seja mudado executando o seguinte comando:
mkdir -pv /etc/systemd/system/getty@tty1.service.d
cat > /etc/systemd/system/getty@tty1.service.d/noclear.conf << EOF
[Service]
TTYVTDisallocate=no
EOF
As mensagens de inicialização sempre podem ser revistas
usando-se o comando journalctl -b
como o(a)
usuário(a) root
.
Por padrão, /tmp
é criado como
um tmpfs. Se isso não for desejado, [então] ele pode ser
sobreposto executando-se o seguinte comando:
ln -sfv /dev/null /etc/systemd/system/tmp.mount
Alternativamente, se uma partição separada para /tmp
for desejada, [então] especifique essa
partição em uma entrada do /etc/fstab
.
Não crie o link simbólico acima se uma partição separada
for usada para o /tmp
. Isso
impedirá o sistema de arquivos raiz (/) de ser remontado
leitura/escrita e tornará o sistema inutilizável quando
inicializado.
Existem vários serviços que criam ou deletam arquivos ou diretórios:
systemd-tmpfiles-clean.service
systemd-tmpfiles-setup-dev.service
systemd-tmpfiles-setup.service
O local de sistema para os arquivos de configuração é
"/usr/lib/tmpfiles.d/*.conf
".
Os arquivos locais de configuração estão em "/etc/tmpfiles.d
". Os arquivos em
"/etc/tmpfiles.d
" substituem os
arquivos com o mesmo nome em "/usr/lib/tmpfiles.d
". Veja-se a página de
manual "tmpfiles.d(5)"
para detalhes do formato do arquivo.
Observe que a sintaxe para os arquivos /usr/lib/tmpfiles.d/*.conf
pode ser
confusa. Por exemplo, a deleção padrão de arquivos no
diretório /tmp está localizada em /usr/lib/tmpfiles.d/tmp.conf
com a linha:
q /tmp 1777 root root 10d
O campo tipo, q, indica a criação de um sub volume com cotas, o qual realmente é aplicável somente para sistemas de arquivos btrfs. Ele referencia tipo v, o qual sequencialmente referencia tipo d (diretório). Isso então cria o diretório especificado se ele não estiver presente e ajusta as permissões e propriedade como especificado. O conteúdo do diretório estará sujeito a limpeza baseada em hora se o argumento idade for especificado.
Se os parâmetros padrão não forem desejados, então o arquivo
deveria ser copiado para /etc/tmpfiles.d
e editado conforme
desejado. Por exemplo:
mkdir -p /etc/tmpfiles.d cp /usr/lib/tmpfiles.d/tmp.conf /etc/tmpfiles.d
Os parâmetros de uma unidade podem ser sobrepostos criando-se
um diretório e um arquivo de configuração em /etc/systemd/system
. Por exemplo:
mkdir -pv /etc/systemd/system/foobar.service.d
cat > /etc/systemd/system/foobar.service.d/foobar.conf << EOF
[Service]
Restart=always
RestartSec=30
EOF
Veja-se a página de manual "systemd.unit(5)"
para mais informação. Depois de criar o arquivo de
configuração, execute "systemctl daemon-reload
" e
"systemctl restart
foobar
" para ativar as mudanças para um
serviço.
Em vez de scripts planos de shell usados nos sistemas de inicialização estilo SysVinit ou BSD, o systemd usa um formato unificado para tipos diferentes dos arquivos de inicialização (ou unidades). O comando systemctl é usado para habilitar; desabilitar; controlar estado; e obter a situação dos arquivos de unidade. Aqui estão alguns exemplos dos comandos frequentemente usados:
systemctl list-units -t
<serviço>
[--all]: lista os arquivos carregados
de unidade do tipo serviço.
systemctl list-units -t
<alvo>
[--all]: lista os arquivos carregados
de unidade do tipo alvo.
systemctl show -p Wants
<multi-user.target>
:
mostra todas as unidades que dependem do alvo
multi-user. Alvos são arquivos especiais de unidade que
são análogos a níveis de execução sob o SysVinit.
systemctl status
<nome_serviço.service>
:
mostra a situação do serviço nome_serviço. A extensão
.service pode ser omitida se não existirem outros
arquivos de unidade com o mesmo nome, tais como
arquivos .socket (os quais criam um soquete de escuta
que fornece funcionalidade similar ao inetd/xinetd).
O registro em um sistema inicializado com o systemd é manuseado com o systemd-journald (por padrão), em vez de um processo de segundo plano típico do Unix syslog. Você também pode adicionar um processo de segundo plano normal syslog e ter ambos operando lado a lado se desejado. O aplicativo systemd-journald armazena entradas de diário em um formato binário, em vez de um arquivo plano de registro de texto. Para auxiliar na análise do arquivo, o comando journalctl é fornecido. Aqui estão alguns exemplos dos comandos frequentemente usados:
journalctl -r: mostra todo o conteúdo do diário em ordem cronológica reversa.
journalctl -u UNIDADE
:
mostra as entradas de diário associadas com o arquivo
especificado de UNIDADE.
journalctl -b[=ID] -r: mostra as entradas de diário desde a mais recente inicialização bem sucedida (ou para a ID de inicialização) em ordem cronológica reversa.
journalctl -f: fornece funcionalidade similar ao tail -f (seguir).
Despejos de núcleo são úteis para depurar aplicativos
quebrados, especialmente quando um processo de aplicativo de
segundo plano quebra. Em sistemas inicializados do systemd, o
despejamento de núcleo é manuseado pelo systemd-coredump. Ele
registrará o despejo de núcleo no diário e armazenará o
próprio despejo de núcleo em /var/lib/systemd/coredump
. Para recuperar e
processar despejos de núcleo, a ferramenta coredumpctl é fornecida.
Aqui estão alguns exemplos de comandos frequentemente usados:
coredumpctl -r: lista todos os despejos de núcleo em ordem cronológica reversa.
coredumpctl -1 info: mostra a informação a partir do mais recente despejo de núcleo.
coredumpctl -1 debug: carrega o mais recente despejo de núcleo no GDB.
Despejos de núcleo possivelmente usem um monte de espaço em
disco. O espaço máximo em disco usado por despejos de núcleo
pode ser limitado criando-se um arquivo de configuração em
/etc/systemd/coredump.conf.d
.
Por exemplo:
mkdir -pv /etc/systemd/coredump.conf.d
cat > /etc/systemd/coredump.conf.d/maxuse.conf << EOF
[Coredump]
MaxUse=5G
EOF
Vejam-se as páginas de manual "systemd-coredump(8)"; "coredumpctl(1)"; e "coredump.conf.d(5)" para mais informação.
Iniciando com o systemd-230, todos os processos de usuário(a)
são finalizados quando uma sessão de usuário(a) for
terminada, mesmo se nohup for usado ou o processo usar as
funções daemon()
ou
setsid()
. Isso é uma mudança
deliberada de um ambiente historicamente permissivo para um
mais restritivo. O novo comportamento possivelmente cause
problemas se você depender de aplicativos de execução longa
(por exemplo, screen ou tmux) para continuarem
ativos depois de terminar sua sessão de usuário(a). Existem
três maneiras de habilitar processos persistentes para
continuarem depois que uma sessão de usuário(a) for
terminada.
Habilitar persistência de
processo somente para usuários(as)
selecionados(as): Usuários(as) normais tem
permissão para habilitar persistência de processo com o
comando loginctl
enable-linger para os(as) próprios(as)
usuários(as) deles(as). Administradores(as) do sistema
podem usar o mesmo comando com um argumento user
ao habilitar para
um(a) usuário(a). Esse(a) usuário(a) consegue então
usar o comando systemd-run para
iniciar processos de execução longa. Por exemplo:
systemd-run --scope
--user /usr/bin/screen. Se você
habilitar a persistência para seu(ua) usuário(a),
[então] a user@.service continuará, mesmo depois que
todas as sessões de login forem fechadas e
automaticamente iniciará na inicialização do sistema.
Isso tem a vantagem de explicitamente permitir e
proibir processos para execução depois que a sessão de
usuário(a) tenha terminado, porém quebra
retrocompatibilidade com ferramentas como nohup e utilitários
que usam daemon()
.
Habilitar persistência de
processo abrangente ao sistema: Você pode
configurar KillUserProcesses=no
em
/etc/systemd/logind.conf
para habilitar a persistência de processo globalmente
para todos(as) os(as) usuários(as). Isso tem o
benefício de deixar o método antigo disponível para
todos(as) os(as) usuários(as) à custa do controle
explícito.
Desabilitar em tempo de
construção: Você pode desabilitar a
persistência por padrão enquanto construir o systemd
adicionando a chave -D
default-kill-user-processes=false
ao
comando meson para o systemd.
Isso desabilita completamente a habilidade do systemd
para finalizar processos de usuário(a) ao fim da
sessão.
É hora de tornar o sistema LFS inicializável. Este capítulo
discute a criação do arquivo /etc/fstab
; construção de um núcleo para o
novo sistema LFS; e instalação do carregador de inicialização
GRUB, de modo que o sistema LFS possa ser selecionado para
iniciar durante a inicialização.
O arquivo /etc/fstab
é usado por
alguns aplicativos para determinar onde sistemas de arquivos
são para serem montados por padrão; em qual ordem; e quais
precisam ser verificados (para erros de integridade) antes da
montagem. Crie uma nova tabela de sistemas de arquivos como
esta:
cat > /etc/fstab << "EOF"
# Início de /etc/fstab
# sistema de arquivos ponto de montagem tipo opções despejo ordem do
# fsck
/dev/<xxx>
/ <fff>
defaults 1 1
/dev/<yyy>
swap swap pri=1 0 0
# Fim do /etc/fstab
EOF
Substitua "<xxx>
"; "<yyy>
"; e "<fff>
" pelos valores
apropriados para o sistema, por exemplo, "sda2
"; "sda5
";
e "ext4
". Para detalhes a
respeito dos seis campos nesse arquivo, veja-se "fstab(5)".
Sistemas de arquivos com origem MS-DOS ou Windows (isto é,
vfat, ntfs, smbfs, cifs, iso9660, udf) precisam de uma opção
especial, utf8, para a finalidade de caracteres não ASCII nos
nomes de arquivo serem interpretados corretamente. Para locales
não UTF-8, o valor de iocharset
deveria ser configurado para ser o mesmo que o conjunto de
caracteres do locale, ajustado de tal maneira que o núcleo o
entenda. Isso funciona se a definição relevante de conjunto de
caracteres (encontrada sob File systems -> Native Language
Support quando da configuração do núcleo) tenha sido compilada
no núcleo ou construída como um módulo. Entretanto, se o
conjunto de caracteres do locale for UTF-8, [então] a
correspondente opção iocharset=utf8
tornaria o sistema de arquivos sensível a maiúsculas e
minúsculas. Para corrigir isso, use a opção especial
utf8
em vez de iocharset=utf8
, para locales UTF-8. A opção
“codepage” também é necessária para
sistemas de arquivos vfat e smbfs. Ela deveria ser configurada
para o número da página de código usada sob MS-DOS em seu país.
Por exemplo, para a finalidade de montar unidades USB flash,
um(a) usuário(a) do ru_RU.KOI8-R precisaria do seguinte na
porção de opções da linha mount dele em /etc/fstab
:
noauto,user,quiet,showexec,codepage=866,iocharset=koi8r
O correspondente fragmento das opções para usuários(as) do ru_RU.UTF-8 é:
noauto,user,quiet,showexec,codepage=866,utf8
Observe que usar iocharset
é o
padrão para iso8859-1
(a qual
mantém o sistema de arquivos insensível a maiúsculas e
minúsculas) e a opção utf8
diz ao
núcleo para converter os nomes de arquivo usando UTF-8, de
forma que eles podem ser interpretados no locale UTF-8.
É possível também especificar os valores padrão de página de
código e iocharset para alguns sistemas de arquivos durante a
configuração do núcleo. Os parâmetros relevantes são chamados
de “Default NLS
Option” (CONFIG_NLS_DEFAULT
); “Default Remote NLS
Option” (CONFIG_SMB_NLS_DEFAULT
); “Default codepage for
FAT” (CONFIG_FAT_DEFAULT_CODEPAGE
); e “Default iocharset for
FAT” (CONFIG_FAT_DEFAULT_IOCHARSET
). Não existe
maneira de especificar essas configurações para o sistema de
arquivos NTFS em tempo de compilação do núcleo.
É possível tornar o sistema de arquivos ext3 confiável em casos
de falhas de eletricidade para alguns tipos de disco rígido.
Para fazer isso, adicione a opção de montagem barrier=1
à entrada apropriada em /etc/fstab
. Para verificar se a unidade de
disco suporta essa opção, execute
hdparm na unidade de disco aplicável. Por exemplo, se:
hdparm -I /dev/sda | grep NCQ
retornar saída gerada não vazia, [então] a opção é suportada.
Observe: partições baseadas em Logical Volume Management (LVM)
não podem usar a opção barrier
.
O pacote Linux contém o núcleo Linux.
Construir o núcleo envolve uns poucos passos—configuração;
compilação; e instalação. Leia-se o arquivo README
na árvore do fonte do núcleo para
métodos alternativos à maneira que este livro configura o
núcleo.
Construir o núcleo Linux pela primeira vez é uma das tarefas mais desafiadoras no LFS. Acertar depende do hardware específico para o sistema alvo e de tuas necessidades específicas. Existem quase 12.000 itens de configuração que estão disponíveis para o núcleo, embora somente cerca de um terço deles sejam necessários para a maioria dos computadores. Os(As) editores(as) do LFS recomendam que os(as) usuários(as) não familiarizados(as) com esse processo sigam os procedimentos abaixo bastante de perto. O objetivo é o de obter um sistema inicial em um ponto onde você consiga se logar na linha de comando quando reinicializar posteriormente na Seção 11.3, “Reinicializando o Sistema.” Nesse ponto, otimização e personalização não é um objetivo.
Para informação geral a respeito da configuração do núcleo, veja-se https://www.linuxfromscratch.org/hints/downloads/files/kernel-configuration.txt. Informação adicional acerca de configurar e construir o núcleo podem ser encontradas em https://anduin.linuxfromscratch.org/LFS/kernel-nutshell/. Essas referências estão um pouco desatualizadas, mas ainda fornecem uma visão geral razoável do processo.
Se tudo mais falhar, você consegue pedir ajuda na lista de discussão lfs-support. Observe que a assinatura é exigida para a finalidade de que a lista evite mensagens indesejadas.
Prepare para compilação executando o seguinte comando:
make mrproper
Isso garante que a árvore do núcleo esteja absolutamente limpa. A equipe do núcleo recomenda que esse comando seja emitido antes de cada compilação do núcleo. Não confie que a árvore do fonte esteja limpa depois de descompactar.
Existem várias maneiras para configurar as opções do núcleo. Usualmente, isso é feito por meio de uma interface orientada por menus, por exemplo:
make menuconfig
O significado das variáveis opcionais de ambiente do make:
LANG=<host_LANG_value>
LC_ALL=
Isso estabelece a configuração do locale para aquela usada no anfitrião. Isso possivelmente seja necessário para um adequado desenho de linha da interface ncurses do menuconfig em um console de texto UTF-8 do Linux.
Se usada, [então] assegure-se de substituir <host_LANG_value>
pelo valor da variável $LANG
oriunda do seu anfitrião. Você pode, alternativamente,
usar, em vez disso, o valor do anfitrião de
$LC_ALL
ou $LC_CTYPE
.
Isso lança uma interface ncurses controlada por menu. Para outras (gráficas) interfaces, digite make help.
Um bom lugar de partida para configurar a configuração do núcleo é executar make defconfig. Isso configurará a configuração base para um bom estado que leve a sua atual arquitetura de sistema em conta.
Assegure-se de habilitar/desabilitar/configurar os seguintes recursos ou o sistema poderia não funcionar corretamente ou inicializar de jeito nenhum:
General setup ---> [ ] Compile the kernel with warnings as errors [WERROR] CPU/Task time and stats accounting ---> [*] Pressure stall information tracking [PSI] [ ] Require boot parameter to enable pressure stall information tracking ... [PSI_DEFAULT_DISABLED] < > Enable kernel headers through /sys/kernel/kheaders.tar.xz [IKHEADERS] [*] Control Group support ---> [CGROUPS] [*] Memory controller [MEMCG] [ /*] CPU controller ---> [CGROUP_SCHED] # This may cause some systemd features malfunction: [ ] Group scheduling for SCHED_RR/FIFO [RT_GROUP_SCHED] [ ] Configure standard kernel features (expert users) ---> [EXPERT] Processor type and features ---> [*] Build a relocatable kernel [RELOCATABLE] [*] Randomize the address of the kernel image (KASLR) [RANDOMIZE_BASE] General architecture-dependent options ---> [*] Stack Protector buffer overflow detection [STACKPROTECTOR] [*] Strong Stack Protector [STACKPROTECTOR_STRONG] [*] Networking support ---> [NET] Networking options ---> [*] TCP/IP networking [INET] <*> The IPv6 protocol ---> [IPV6] Device Drivers ---> Generic Driver Options ---> [ ] Support for uevent helper [UEVENT_HELPER] [*] Maintain a devtmpfs filesystem to mount at /dev [DEVTMPFS] [*] Automount devtmpfs at /dev, after the kernel mounted the rootfs ... [DEVTMPFS_MOUNT] Firmware loader ---> < /*> Firmware loading facility [FW_LOADER] [ ] Enable the firmware sysfs fallback mechanism ... [FW_LOADER_USER_HELPER] Firmware Drivers ---> [*] Export DMI identification via sysfs to userspace [DMIID] Graphics support ---> < /*/M> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) ---> ... [DRM] # If [DRM] is selected as * or M, this must be selected: [ /*] Enable legacy fbdev support for your modesetting driver ... [DRM_FBDEV_EMULATION] Console display driver support ---> # If [DRM] is selected as * or M, this must be selected: [ /*] Framebuffer Console support [FRAMEBUFFER_CONSOLE] File systems ---> [*] Inotify support for userspace [INOTIFY_USER] Pseudo filesystems ---> [*] Tmpfs virtual memory file system support (former shm fs) [TMPFS] [*] Tmpfs POSIX Access Control Lists [TMPFS_POSIX_ACL]
Habilite alguns recursos adicionais se você estiver
construindo um sistema de 64 bits. Se você estiver usando o
menuconfig, [então] habilite-as na ordem de CONFIG_PCI_MSI
primeiro;
então CONFIG_IRQ_REMAP
; e
finalmente CONFIG_X86_X2APIC
, pois uma
opção somente aparece depois que as dependências dela forem
selecionadas.
Processor type and features ---> [*] Support x2apic [X86_X2APIC] Device Drivers ---> [*] PCI support ---> [PCI] [*] Message Signaled Interrupts (MSI and MSI-X) [PCI_MSI] [*] IOMMU Hardware Support ---> [IOMMU_SUPPORT] [*] Support for Interrupt Remapping [IRQ_REMAP]
Se você estiver construindo um sistema de 32 bits executando em um hardware com RAM mais que 4 GB, ajuste a configuração, de modo que o núcleo consiga usar até 64 GB de RAM física:
Processor type and features ---> High Memory Support ---> (X) 64GB [HIGHMEM64G]
Se a partição para o sistema LFS estiver em um SSD NVME
(isto é, o nó do dispositivo para a partição for
/dev/nvme*
, em vez de
/dev/sd*
), habilite o suporte
a NVME ou o sistema LFS não inicializaria:
Device Drivers ---> NVME Support ---> <*> NVM Express block device [BLK_DEV_NVME]
Enquanto que "The IPv6 Protocol" não é estritamente exigido, ela é altamente recomendada pelos(as) desenvolvedores(as) do systemd.
Existem várias outras opções que possivelmente sejam desejadas, dependendo das exigências para o sistema. Para uma lista das opções necessárias para pacotes do BLFS, veja-se o Índice do BLFS das Configurações do Núcleo.
Se seu hardware do anfitrião estiver usando UEFI e você desejar inicializar o sistema LFS com ela, [então] você deveria ajustar alguma configuração do núcleo seguindo a página do BLFS, mesmo se você usará o carregador de inicialização UEFI da distribuição anfitriã.
A justificativa para os itens de configuração acima:
Torne
aleatório o endereço da imagem do núcleo
(KASLR)
Habilita ASLR para imagem do núcleo, para mitigar alguns ataques baseados em endereços fixos de dados ou código sensíveis no núcleo.
Compila o
núcleo com avisos como erros
Isso possivelmente cause falha de construção se o compilador e (ou) a configuração forem diferentes daqueles dos(as) desenvolvedores(as) do núcleo.
Habilita
cabeçalhos do núcleo por meio de
/sys/kernel/kheaders.tar.xz
Isso exigirá cpio ao se construir o núcleo. cpio não é instalado pelo LFS.
Configurar
recursos padrão do núcleo (usuários(as)
experientes)
Isso fará com que algumas opções apareçam na interface de configuração, mas alterar essas opções possivelmente seja perigoso. Não use isso, a menos que você saiba o que está fazendo.
Protetor
Forte da Pilha
Habilita SSP para o núcleo. Nós o habilitamos para o
espaço inteiro de usuário(a) com --enable-default-ssp
ao
configurar o GCC, porém o núcleo não usa a configuração
padrão do GCC para SSP. Nós o habilitamos
explicitamente aqui.
Suporte a
auxiliar do uevent
Ter essa opção configurada possivelmente interfira com o gerenciamento de dispositivo quando se usar o Udev.
Mantém um
devtmpfs
Isso criará nós automatizados de dispositivos, os quais são povoados pelo núcleo, mesmo sem o Udev executando. O Udev então executa no topo disso, gerenciando permissões e adicionando links simbólicos. Esse item de configuração é exigido para todos(as) os(as) usuários(as) do Udev.
Automonta
devtmpfs em /dev
Isso montará a visão do núcleo dos dispositivos em /dev assim que alternar para o sistema de arquivos raiz pouco antes de iniciar o init.
Enable
legacy fbdev support for your modesetting
driver
e Framebuffer Console
support
Esses são necessários para exibir o console do Linux em
uma "GPU" controlada por um controlador "Direct
Rendering Infrastructure" ("DRI"). Se "CONFIG_DRM
" ("Direct Rendering
Manager") estiver habilitado, [então] você deveria
habilitar essas duas opções também ou verá uma tela em
branco quando o controlador "DRI" for carregado.
Suporte a
x2apic
Suporta executar o controlador de interrupção dos processadores x86 de 64 bits em modo x2APIC. O x2APIC possivelmente seja habilitado por firmware em sistemas x86 de 64 bits e um núcleo sem essa opção habilitada dará pânico na inicialização se o x2APIC for habilitado por firmware. Essa opção não tem efeito, porém também não danifica, se o x2APIC for desabilitado pelo firmware.
Alternativamente, make
oldconfig possivelmente seja mais apropriado
em algumas situações. Veja-se o arquivo README
para mais informação.
Se desejado, [então] pule a configuração do núcleo copiando o
arquivo config do núcleo, .config
, a partir do sistema anfitrião
(assumindo que ele esteja disponível) para o diretório
linux-6.10.5
desempacotado.
Entretanto, nós não recomendamos essa opção. Frequentemente é
melhor explorar todos os menus de configuração e criar a
configuração do núcleo a partir do zero.
Compile a imagem do núcleo e módulos:
make
Se usar módulos do núcleo, [então] a configuração do módulo
em "/etc/modprobe.d
"
possivelmente seja exigida. Informação pertinente à
configuração de módulos e núcleo está localizada na
"Seção 9.3,
“Visão Geral do Manuseio de Dispositivo e de Módulo”" e
na documentação do núcleo no diretório "linux-6.10.5/Documentation
". Também,
"modprobe.d(5)"
possivelmente seja de interesse.
A menos que o suporte a módulo tenha sido desabilitado na configuração do núcleo, instale os módulos com:
make modules_install
Depois que a compilação do núcleo estiver completa, passos
adicionais são exigidos para completar a instalação. Alguns
arquivos precisam ser copiados para o diretório /boot
.
Se você tiver decidido usar uma partição /boot
separada para o sistema LFS (talvez
compartilhando uma partição /boot
com a distribuição anfitriã),
[então] os arquivos copiados abaixo deveriam ir para lá. A
maneira mais fácil de fazer isso é a de criar a entrada
para /boot
em /etc/fstab
primeiro (leia-se a seção
anterior para detalhes), então emitir o seguinte comando
como o(a) usuário(a) root
dentro do ambiente
chroot:
mount /boot
O caminho para o nó de dispositivo está omitido no comando,
pois mount
consegue lê-lo a partir de /etc/fstab
.
O caminho para a imagem do núcleo possivelmente varie, dependendo da plataforma sendo usada. O nome de arquivo abaixo pode ser mudado para se adequar ao seu gosto, porém o tronco do nome de arquivo deveria ser vmlinuz para ser compatível com a configuração automática do processo de inicialização descrito na próxima seção. O seguinte comando assume uma arquitetura x86:
cp -iv arch/x86/boot/bzImage /boot/vmlinuz-6.10.5-lfs-12.2-systemd
System.map
é um arquivo de
símbolo para o núcleo. Ele mapeia os pontos de entrada de
função de cada função na API do núcleo, bem como os endereços
das estruturas de dados do núcleo para o núcleo em execução.
Ele é usado como um recurso quando se investigar problemas do
núcleo. Emita o seguinte comando para instalar o arquivo de
mapa:
cp -iv System.map /boot/System.map-6.10.5
O arquivo de configuração do núcleo .config
produzido pelo passo make menuconfig acima
contém todas as seleções de configuração para o núcleo que
foi recém compilado. É uma boa ideia manter esse arquivo para
futura referência:
cp -iv .config /boot/config-6.10.5
Instale a documentação para o núcleo Linux:
cp -r Documentation -T /usr/share/doc/linux-6.10.5
É importante observar que os arquivos no diretório do fonte do núcleo não são de propriedade do(a) root. Sempre que um pacote é desempacotado como o(a) usuário(a) root (como nós fizemos dentro do chroot), os arquivos tem os IDs de usuário(a) e de grupo do que quer que fossem no computador do(a) empacotador(a). Isso geralmente não é um problema para qualquer outro pacote ser instalado, pois a árvore do fonte é removida depois da instalação. Entretanto, a árvore do fonte do Linux frequentemente é mantida por um longo tempo. Devido a isso, existe uma chance de que qualquer ID de usuário(a) que o(a) empacotador(a) usou seja atribuído para alguém na máquina. Essa pessoa então teria acesso de escrita ao fonte do núcleo.
Em muitos casos, a configuração do núcleo precisará ser atualizada para pacotes que serão instalados posteriormente no BLFS. Diferente de outros pacotes, não é necessário remover a árvore do fonte do núcleo depois que o recém construído núcleo for instalado.
Se a árvore do fonte do núcleo será mantida, [então]
execute chown -R
0:0 no diretório linux-6.10.5
para assegurar que todos os
arquivos sejam de propriedade do(a) usuário(a) root.
Alguma documentação do núcleo recomenda criar um link
simbólico a partir de /usr/src/linux
apontando para o diretório
do fonte do núcleo. Isso é específico para núcleos
anteriores à série 2.6 e precisa
não ser criado em um sistema LFS, uma vez que
ele pode causar problemas para pacotes que você
possivelmente deseje construir tão logo seu sistema base
LFS esteja completo.
Os cabeçalhos no diretório include
do sistema (/usr/include
) deveriam sempre ser aqueles contra os
quais a Glibc foi compilada, isto é, os cabeçalhos
sanitizados instalados na Seção 5.4,
“Cabeçalhos da API do Linux-6.10.5”. Portanto, eles
nunca deveriam ser
substituídos nem pelos cabeçalhos crus do núcleo nem por
quaisquer outros cabeçalhos sanitizados do núcleo.
Na maior parte do tempo, os módulos do Linux são carregados
automaticamente, porém algumas vezes precisa-se de alguma
direção específica. O aplicativo que carrega os módulos,
modprobe ou o
insmod, usa
/etc/modprobe.d/usb.conf
para
esse propósito. Esse arquivo precisa ser criado, de forma
que, se os controladores do USB (ehci_hcd, ohci_hcd e
uhci_hcd) tiverem sido construídos como módulos, [então] eles
sejam carregados na ordem correta; ehci_hcd precisa ser
carregado antes de ohci_hcd e uhci_hcd para a finalidade de
evitar um aviso sendo produzido em tempo de inicialização.
Crie um novo arquivo /etc/modprobe.d/usb.conf
executando o
seguinte:
install -v -m755 -d /etc/modprobe.d
cat > /etc/modprobe.d/usb.conf << "EOF"
# Início do /etc/modprobe.d/usb.conf
install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true
install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true
# Fim do /etc/modprobe.d/usb.conf
EOF
Contém todas as seleções de configuração para o núcleo |
|
O motor do sistema Linux. Quando se liga o computador, o núcleo é a primeira parte do sistema operacional que se torna carregada. Ele detecta e inicializa todos os componentes do hardware do computador, então torna esses componentes disponíveis como uma árvore de arquivos para o software e transforma uma CPU individual em uma máquina multitarefa capaz de executar dezenas de aplicativos aparentemente ao mesmo tempo |
|
Uma lista de endereços e símbolos; ele mapeia os pontos de entrada e endereços de todas as funções e estruturas de dados no núcleo |
Se o seu sistema tem suporte UEFI e você deseja inicializar o
LFS com UEFI, [então] você deveria pular as instruções nesta
página, mas ainda assim aprender a sintaxe do grub.cfg
e o método para especificar uma
partição no arquivo a partir desta página e configurar o GRUB
com suporte UEFI usando as instruções fornecidas na
página BLFS.
Configurar o GRUB incorretamente pode tornar seu sistema inoperável sem um dispositivo alternativo de inicialização, como um CD-ROM ou unidade USB inicializável. Esta seção não é exigida para inicializar seu sistema LFS. Você possivelmente apenas queira modificar seu carregador de inicialização atual, por exemplo, Grub-Legacy, GRUB2 ou LILO.
Certifique-se de que um disco de inicialização de emergência
esteja pronto para “resgatar” o computador se o computador
se tornar inutilizável (não inicializável). Se você ainda não
tiver um dispositivo de inicialização, [então] você pode
criar um. Para a finalidade de que o procedimento abaixo
funcione, você precisa saltar para a frente para o BLFS e
instalar xorriso
oriundo do pacote
libisoburn.
cd /tmp grub-mkrescue --output=grub-img.iso xorriso -as cdrecord -v dev=/dev/cdrw blank=as_needed grub-img.iso
O GRUB usa estrutura de nomenclatura própria dele para
unidades e partições na forma de (hdn,m), onde n é o número da unidade rígida e
m é o número da
partição. Os números da unidade rígida começam do zero, porém
os números da partição começam do um para partições normais
(do cinco para partições estendidas). Observe que isso é
diferente de versões anteriores, onde ambos os números
começavam do zero. Por exemplo, a partição sda1
é (hd0,1) para o GRUB e sdb3
é (hd1,3). Em contraste com o Linux,
GRUB não considera unidades de CD-ROM como unidades rígidas.
Por exemplo, se usar um CD em hdb
e uma segunda unidade rígida em
hdc
, [então] aquela segunda
unidade rígida ainda seria (hd1).
O GRUB funciona escrevendo dados na a primeira trilha física do disco rígido. Essa área não é parte de nenhum sistema de arquivos. Os aplicativos lá acessam módulos do GRUB na partição de inicialização. O local padrão é /boot/grub/.
O local da partição de inicialização é uma escolha do(a)
usuário(a) que afeta a configuração. Uma recomendação é ter
uma partição pequena (tamanho sugerido é 200 MB) separada
somente para informação de inicialização. Dessa forma, cada
construção, seja LFS ou alguma distribuição comercial,
consegue acessar os mesmos arquivos de inicialização e o
acesso pode ser feito a partir de qualquer sistema
inicializado. Se você escolher fazer isso, [então] você
precisará montar a partição separada, mover todos os arquivos
no diretório /boot
atual (por
exemplo, o núcleo Linux que você recém construiu na seção
anterior) para a nova partição. Você então precisará
desmontar a partição e remontá-la como /boot
. Se você fizer isso, [então] tenha
certeza de atualizar /etc/fstab
.
Deixar /boot
na partição LFS
atual também funcionará, porém a configuração para múltiplos
sistemas é mais complicada.
Usando a informação acima, determine o designador apropriado
para a partição raiz (ou partição de inicialização, se uma
separada for usada). Para o exemplo seguinte, é assumido que
a partição raiz (ou inicialização separada) é sda2
.
Instale os arquivos do GRUB em /boot/grub
e configure a trilha de
inicialização:
O seguinte comando sobrescreverá o carregador de inicialização atual. Não execute o comando de isso não for desejado, por exemplo, se usar um gerenciador de inicialização de terceiro para gerenciar o Master Boot Record (MBR).
grub-install /dev/sda
Se o sistema tiver sido inicializado usando UEFI, [então] o
grub-install
tentará instalar arquivos para o alvo x86_64-efi, porém aqueles
arquivos não foram instalados no Capítulo 8.
Se esse for o caso, [então] adicione --target i386-pc
ao comando acima.
Gere o /boot/grub/grub.cfg
:
cat > /boot/grub/grub.cfg << "EOF"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5
insmod part_gpt
insmod ext2
set root=(hd0,2)
menuentry "GNU/Linux, Linux 6.10.5-lfs-12.2-systemd" {
linux /boot/vmlinuz-6.10.5-lfs-12.2-systemd root=/dev/sda2 ro
}
EOF
Os comandos insmod carregam os módulos
GRUB chamados part_gpt
e ext2
. Apesar da nomenclatura, ext2
na verdade suporta sistemas de
arquivos ext2
, ext3
e ext4
. O comando grub-install incorporou
alguns módulos na imagem principal do GRUB (instalada no "MBR" ou na partição
"BIOS" do GRUB) para acessar os outros módulos (em
/boot/grub/i386-pc
) sem um
problema de galinha ou ovo, de modo que, com uma configuração
típica, esses dois módulos já estão incorporados e esses dois
comandos insmod
não farão nada. Mas eles não fazem mal de qualquer maneira e
possivelmente sejam necessários com algumas configurações
raras.
A partir da perspectiva do GRUB, os arquivos do núcleo estão relativos à partição usada. Se você usou uma partição /boot separada, [então] remova /boot da linha linux acima. Você também precisará mudar a linha set root para apontar para a partição de inicialização.
O designador do GRUB para uma partição possivelmente mude
se você adicionou ou removeu alguns discos (incluindo
discos removíveis, como dispositivos USB miniatura). A
mudança possivelmente cause falha de inicialização, pois o
grub.cfg
se refere a alguns
designadores “antigos”. Se você deseja evitar tal
problema, [então] você possivelmente use o UUID de uma
partição e o UUID de um sistema de arquivos, em vez de um
designador do GRUB para especificar um dispositivo. Execute
lsblk -o
UUID,PARTUUID,PATH,MOUNTPOINT para exibir
os UUIDs dos seus sistemas de arquivos (na coluna
UUID
) e das suas partições (na
coluna PARTUUID
). Então
substitua set root=(hdx,y)
por
search --set=root --fs-uuid
; e substitua <UUID do sistema de
arquivos onde o núcleo está
instalado>
root=/dev/sda2
por root=PARTUUID=
.
<UUID da partição onde o LFS está
construído>
Observe que o UUID de uma partição é completamente
diferente do UUID do sistema de arquivos nessa partição.
Alguns recursos online possivelmente instruam você a usar o
root=UUID=
, em vez do <UUID do sistema de
arquivos>
root=PARTUUID=
, porém fazer isso exigirá
um initramfs, o qual está além do escopo do LFS.
<UUID da
partição>
O nome do nó de dispositivo para uma partição em
/dev
também possivelmente
mude (isso é menos provável que uma mudança do designador
do GRUB). Você também pode substituir caminhos para nós de
dispositivo, como /dev/sda1
,
por PARTUUID=
, em <UUID da
partição>
/etc/fstab
, para evitar uma potencial
falha de inicialização no caso do nome do nó de dispositivo
tiver mudado.
O GRUB é um aplicativo extremamente poderoso e ele fornece um tremendo número de opções para inicializar a partir de uma ampla variedade de dispositivos, sistemas operacionais e tipos de partição. Existem também muitas opções para personalização, tais como telas gráficas de abertura; reprodução de sons; entrada gerada de mouse; etc. Os detalhes dessas opções estão além do escopo desta introdução.
Existe um comando, grub-mkconfig, que consegue escrever um arquivo de configuração automaticamente. Ele usa um conjunto de scripts em /etc/grub.d/ e destruirá quaisquer personalizações que você fizer. Esses scripts são projetados primariamente para distribuições não fonte e não são recomendados para o LFS. Se você instalar uma distribuição comercial do Linux, [então] existe uma boa chance de que esse aplicativo seja executado. Tenha certeza de produzir uma cópia de segurança do seu arquivo grub.cfg.
Muito bem! O novo sistema LFS está instalado! Nós desejamos a você muito sucesso com seu novo e brilhante sistema Linux construído sob medida.
Possivelmente seja uma boa ideia criar um arquivo /etc/lfs-release
. Tendo esse arquivo, é muito
fácil para você (e para nós se você precisar pedir ajuda em
algum ponto) descobrir qual versão do LFS está instalada no
sistema. Crie esse arquivo executando:
echo 12.2-systemd > /etc/lfs-release
Dois arquivos descrevendo o sistema instalado possivelmente sejam usados por pacotes que podem ser instalados no sistema posteriormente, ou em forma de binário ou construindo-os.
O primeiro deles mostra a situação do seu novo sistema com respeito ao Linux Standards Base (LSB). Para criar esse arquivo, execute:
cat > /etc/lsb-release << "EOF" DISTRIB_ID="Linux From Scratch" DISTRIB_RELEASE="12.2-systemd" DISTRIB_CODENAME="<seu nome aqui>" DISTRIB_DESCRIPTION="Linux From Scratch" EOF
O segundo deles contém aproximadamente a mesma informação e é usado pelo systemd e alguns ambientes gráficos de área de trabalho. Para criar esse arquivo, execute:
cat > /etc/os-release << "EOF" NAME="Linux From Scratch" VERSION="12.2-systemd" ID=lfs PRETTY_NAME="Linux From Scratch 12.2-systemd" VERSION_CODENAME="<seu nome aqui>" HOME_URL="https://www.linuxfromscratch.org/lfs/" EOF
Tenha certeza de personalizar os campos 'DISTRIB_CODENAME' e 'VERSION_CODENAME' para tornar o sistema unicamente seu.
Agora que você terminou o livro, você quer ser contado(a) como um(a) usuário(a) do LFS? Vá para https://www.linuxfromscratch.org/cgi-bin/lfscounter.php e registre-se como um(a) usuário(a) do LFS fornecendo seu nome e a primeira versão do LFS que você usou.
Vamos reinicializar no LFS agora.
Agora que todo o software foi instalado, é tempo de reinicializar seu computador. Entretanto, ainda existem umas poucas coisas a verificar. Aqui estão algumas sugestões:
Instale qualquer firmware necessário, se o controlador do núcleo para o seu hardware exigir alguns arquivos de firmware para funcionar adequadamente.
Certifique-se de que uma senha seja definida para o(a)
usuário(a) root
.
Uma revisão dos seguintes arquivos de configuração também é apropriada neste ponto.
/etc/bashrc
/etc/dircolors
/etc/fstab
/etc/hosts
/etc/inputrc
/etc/profile
/etc/resolv.conf
/etc/vimrc
/root/.bash_profile
/root/.bashrc
Agora que nós dissemos isso, vamos em frente para inicializar nossa brilhante e nova instalação do LFS pela primeira vez! Primeiro saia do ambiente chroot:
logout
Então desmonte os sistemas virtuais de arquivos:
umount -v $LFS/dev/pts mountpoint -q $LFS/dev/shm && umount -v $LFS/dev/shm umount -v $LFS/dev umount -v $LFS/run umount -v $LFS/proc umount -v $LFS/sys
Se múltiplas partições foram criadas, [então] desmonte as outras partições antes de desmontar a principal, como isto:
umount -v $LFS/home umount -v $LFS
Desmonte o próprio sistema de arquivos do LFS:
umount -v $LFS
Agora, reinicialize o sistema.
Assumindo que o carregador de inicialização GRUB foi configurado como destacado anteriormente, o menu está configurado para inicializar o LFS 12.2-systemd automaticamente.
Quando a reinicialização estiver completa, o sistema LFS estará pronto para uso. O que você verá é um prompt simples “login: ”. Neste ponto, você pode prosseguir para o Livro BLFS onde você pode adicionar mais software para atender às suas necessidades.
Se a sua reinicialização não for bem-sucedida, é hora de solucionar o problema. Para dicas a respeito de como solucionar problemas iniciais da inicialização, veja-se https://www.linuxfromscratch.org/lfs/troubleshooting.html.
Obrigado por você ler este livro LFS. Nós esperamos que você tenha achado este livro útil e tenha aprendido mais a respeito do processo de criação do sistema.
Agora que o sistema LFS está instalado, você possivelmente esteja questionando: “E agora?” Para responder a essa pergunta, nós compilamos uma lista de recursos para você.
Manutenção
Defeitos e avisos de segurança são informados regularmente para todo software. Uma vez que um sistema LFS é compilado a partir do fonte, cabe a você se manter a par de tais informativos. Existem vários recursos online que rastreiam tais informativos, alguns dos quais estão mostrados abaixo:
Essa é uma lista de vulnerabilidades de segurança descobertas no livro LFS depois que ele é publicado.
Lista de Discussão de Segurança de Código Aberto
Essa é uma lista de discussão para discussão de falhas de segurança, conceitos e práticas na comunidade do Fonte Aberto.
Dicas do LFS
As Dicas do LFS são uma coleção de documentos educacionais submetidos por voluntários(as) na comunidade do LFS. As dicas estão disponíveis em https://www.linuxfromscratch.org/hints/downloads/files/.
Listas de discussão
Existem várias listas de discussão do LFS que você possivelmente assine se estiver necessitado(a) de ajuda; quiser se manter atualizado(a) com os mais recentes desenvolvimentos; quiser contribuir para o projeto; e mais. Veja-se Capítulo 1 - Listas de Discussão para mais informação.
The Linux Documentation Project
O objetivo do The Linux Documentation Project (TLDP) é o de colaborar em todos os problemas de documentação do Linux. O TLDP apresenta uma grande coleção de HOWTOs, guias e páginas de manual. Ele está localizado em http://www.tldp.org/.
Agora que o LFS está completo e você tem um sistema inicializável, o que você faz? O próximo passo é o de decidir como usá-lo. Geralmente, existem duas grandes categorias a considerar: estação de trabalho ou servidor. De fato, essas categorias não são mutuamente exclusivas. Os aplicativos necessários para cada categoria podem ser combinados em um sistema, mas vamos vê-los separadamente por enquanto.
Um servidor é a categoria mais simples. Geralmente, isso consiste de um servidor da Web, como o Servidor HTTP Apache e um servidor de base de dados, como MariaDB. No entanto, outros serviços são possíveis. O sistema operacional embutido em um dispositivo de uso único se enquadra nessa categoria.
Por outro lado, uma estação de trabalho é muito mais complexa. Geralmente exige um ambiente gráfico de usuário(a), como LXDE, XFCE, KDE ou Gnome, baseado em um ambiente gráfico básico e vários aplicativos baseados em gráficos, como o navegador da Web Firefox , cliente de correio eletrônico Thunderbird ou suíte de escritório LibreOffice. Esses aplicativos exigem muitos (várias centenas, dependendo dos recursos desejados) mais pacotes de aplicativos e bibliotecas de suporte.
Além do acima, existe um conjunto de aplicativos para gerenciamento de sistemas para todos os tipos de sistemas. Esses aplicativos estão todos no livro BLFS. Nem todos os pacotes são necessários em todos os ambientes. Por exemplo dhcpcd, normalmente não é apropriado para um servidor e wireless_tools, normalmente são úteis somente para um sistema de laptop.
Quando inicializa inicialmente no LFS, você tem todas as ferramentas internas para construir pacotes adicionais. Infelizmente, o ambiente de usuário(a) é bastante esparso. Existem algumas maneiras de melhorar isso:
Esse método fornece um ambiente gráfico completo onde um navegador completo e recursos de copiar/colar estão disponíveis. Esse método permite usar aplicativos, como a versão do anfitrião do Wget, para baixar os fontes do pacote para um local disponível ao se trabalhar no ambiente "chroot".
Para a finalidade de construir adequadamente pacotes no chroot, você também precisará se lembrar de montar os sistemas virtuais de arquivos, se eles ainda não estiverem montados. Uma maneira de fazer isso é a de criar um script no sistema ANFITRIÃO:
cat > ~/mount-virt.sh << "EOF"
#!/bin/bash
function mountbind
{
if ! mountpoint $LFS/$1 >/dev/null; then
$SUDO mount --bind /$1 $LFS/$1
echo $LFS/$1 mounted
else
echo $LFS/$1 already mounted
fi
}
function mounttype
{
if ! mountpoint $LFS/$1 >/dev/null; then
$SUDO mount -t $2 $3 $4 $5 $LFS/$1
echo $LFS/$1 mounted
else
echo $LFS/$1 already mounted
fi
}
if [ $EUID -ne 0 ]; then
SUDO=sudo
else
SUDO=""
fi
if [ x$LFS == x ]; then
echo "LFS not set"
exit 1
fi
mountbind dev
mounttype dev/pts devpts devpts -o gid=5,mode=620
mounttype proc proc proc
mounttype sys sysfs sysfs
mounttype run tmpfs run
if [ -h $LFS/dev/shm ]; then
install -v -d -m 1777 $LFS$(realpath /dev/shm)
else
mounttype dev/shm tmpfs tmpfs -o nosuid,nodev
fi
#mountbind usr/src
#mountbind boot
#mountbind home
EOF
Observe que os últimos três comandos no script são comentados. Eles são úteis se aqueles diretórios forem montados como partições separadas no sistema anfitrião e serão montados quando inicializar o sistema LFS/BLFS completo.
O script pode ser executado com bash ~/mount-virt.sh como
ou um(a) usuário(a) comum (recomendado) ou como
root
. Se executado como
um(a) usuário(a) comum, o sudo é exigido no sistema
anfitrião.
Outro problema apontado pelo script é o de onde armazenar os arquivos baixados do pacote. Esse local é arbitrário. Ele pode estar em um diretório lar de usuário(a) comum, como ~/sources ou em um local global, como /usr/src. Nossa recomendação é a de não misturar fontes BLFS e fontes LFS em (a partir do ambiente chroot) /sources. Em qualquer caso, os pacotes precisam estar acessíveis dentro do ambiente chroot.
Um último recurso de conveniência apresentado aqui é o de simplificar o processo de entrada no ambiente chroot. Isso pode ser feito com um apelido colocado em um arquivo ~/.bashrc de usuário(a) no sistema anfitrião:
alias lfs='sudo /usr/sbin/chroot /mnt/lfs /usr/bin/env -i HOME=/root TERM="$TERM" PS1="\u:\w\\\\$ "
PATH=/bin:/usr/bin:/sbin:/usr/sbin /bin/bash --login'
Esse apelido é um pouco complicado, por causa das aspas e dos níveis dos caracteres de barra invertida. Precisa estar tudo em uma linha. O comando acima foi dividido em dois para propósitos de apresentação.
Esse método também fornece um ambiente completo gráfico, mas primeiro exige a instalação de sshd no sistema LFS, geralmente em "chroot". Também exige um segundo computador. Esse método tem a vantagem de ser simples, por não exigir a complexidade do ambiente "chroot". Ele também usa seu núcleo do LFS construído para todos os pacotes adicionais e ainda fornece um sistema completo para instalar pacotes.
Você possivelmente use o comando scp para carregar os fontes dos pacotes a serem construídos no sistema LFS. Se você quiser baixar os fontes diretamente no sistema LFS, [então] instale libtasn1, p11-kit, make-ca e wget em "chroot" (ou carregue os fontes deles usando scp depois de inicializar o sistema LFS).
Esse método exige instalar libtasn1, p11-kit, make-ca, wget, gpm e links (ou lynx) no chroot e, em seguida, reinicializar no novo sistema LFS. Neste ponto, o sistema padrão tem seis consoles virtuais. Alternar consoles é tão fácil quanto usar as combinações de teclas Alt+Fx, onde Fx está entre F1 e F6. As combinações Alt+← e Alt+→ também mudarão o console.
Neste ponto, você pode logar-se em dois consoles virtuais e executar o navegador Links ou o Lynx em um console e o Bash no outro. O GPM então permite copiar comandos a partir do navegador com o botão esquerdo do mouse, alternar consoles e colar no outro console.
Como uma observação lateral, alternância de consoles virtuais também pode ser feita a partir de uma instância do X Window com a combinação de teclas Ctrl+Alt+Fx, mas a operação de cópia do mouse não funciona entre a interface gráfica e um console virtual. Você pode retornar para exibição do X Window com a combinação Ctrl+Alt+Fx, onde Fx geralmente é F1, mas possivelmente seja F7.
ABI |
Application Binary Interface |
ALFS |
Automated Linux From Scratch |
API |
Application Programming Interface |
ASCII |
American Standard Code for Information Interchange |
BIOS |
Basic Input/Output System |
BLFS |
Beyond Linux From Scratch |
BSD |
Berkeley Software Distribution |
chroot |
change root |
CMOS |
Complementary Metal Oxide Semiconductor |
COS |
Class Of Service |
CPU |
Central Processing Unit |
CRC |
Cyclic Redundancy Check |
CVS |
Concurrent Versions System |
DHCP |
Dynamic Host Configuration Protocol |
DNS |
Domain Name Service |
EGA |
Enhanced Graphics Adapter |
ELF |
Executable and Linkable Format |
EOF |
End of File |
EQN |
equation |
ext2 |
sistema de arquivos segundo estendido |
ext3 |
sistema de arquivos terceiro estendido |
ext4 |
sistema de arquivos quarto estendido |
FAQ |
Frequently Asked Questions |
FHS |
Filesystem Hierarchy Standard |
FIFO |
First-In, First Out |
FQDN |
Fully Qualified Domain Name |
FTP |
File Transfer Protocol |
GB |
Gigabytes |
GCC |
GNU Compiler Collection |
GID |
Group Identifier |
GMT |
Greenwich Mean Time |
HTML |
Hypertext Markup Language |
IDE |
Integrated Drive Electronics |
IEEE |
Institute of Electrical and Electronic Engineers |
IO |
Input/Output |
IP |
Internet Protocol |
IPC |
Inter-Process Communication |
IRC |
Internet Relay Chat |
ISO |
International Organization for Standardization |
ISP |
Internet Service Provider |
KB |
Kilobytes |
LED |
Light Emitting Diode |
LFS |
Linux From Scratch |
LSB |
Linux Standard Base |
MB |
Megabytes |
MBR |
Master Boot Record |
MD5 |
Message Digest 5 |
NIC |
Network Interface Card |
NLS |
Native Language Support |
NNTP |
Network News Transport Protocol |
NPTL |
Native POSIX Threading Library |
OSS |
Open Sound System |
PCH |
Pre-Compiled Headers |
PCRE |
Perl Compatible Regular Expression |
PID |
Process Identifier |
PTY |
pseudo terminal |
QOS |
Quality Of Service |
RAM |
Random Access Memory |
RPC |
Remote Procedure Call |
RTC |
Real Time Clock |
SBU |
Standard Build Unit |
SCO |
The Santa Cruz Operation |
SHA1 |
Secure-Hash Algorithm 1 |
TLDP |
The Linux Documentation Project |
TFTP |
Trivial File Transfer Protocol |
TLS |
Thread-Local Storage |
UID |
User Identifier |
umask |
máscara de usuário(a) de criação de arquivo |
USB |
Universal Serial Bus |
UTC |
Coordinated Universal Time |
UUID |
Universally Unique Identifier |
VC |
Virtual Console |
VGA |
Video Graphics Array |
VT |
Virtual Terminal |
Nós gostaríamos de agradecer às seguintes pessoas e organizações pelas contribuições delas para o Linux From Scratch Project.
Gerard Beekmans <gerard AT linuxfromscratch D0T org> – Criador do LFS
Bruce Dubbs <bdubbs AT linuxfromscratch D0T org> – Editor-chefe do LFS
Jim Gifford <jim AT linuxfromscratch D0T org> – Colíder do Projeto CLFS
Pierre Labastie <pierre AT linuxfromscratch D0T org> – Editor do BLFS e Líder do ALFS
DJ Lucas <dj AT linuxfromscratch D0T org> – Editor do LFS e BLFS
Ken Moffat <ken AT linuxfromscratch D0T org> – Editor do BLFS
Incontáveis outras pessoas nas várias listas de discussão do LFS e do BLFS que ajudaram a tornar este livro possível dando as sugestões delas; testando o livro; e submetendo relatórios de defeitos; instruções; e suas experiências com a instalação de vários pacotes.
Manuel Canales Esparcia <macana AT macana-es D0T com> – Projeto de tradução do LFS para espanhol
Johan Lenglet <johan AT linuxfromscratch D0T org> – Projeto de tradução do LFS para francês até 2008
Jean-Philippe Mengual <jmengual AT linuxfromscratch D0T org> – Projeto de tradução do LFS para francês 2008-2016
Julien Lepiller <jlepiller AT linuxfromscratch D0T org> – Projeto de tradução do LFS para francês 2017-presente
Anderson Lizardo <lizardo AT linuxfromscratch D0T org> – Histórico do projeto de tradução LFS para o português
Jamenson Espindula <jafesp AT gmail D0T com> – Projeto de tradução do LFS para o português 2022-presente
Thomas Reitelbach <tr AT erdfunkstelle D0T de> – Projeto de tradução do LFS para alemão
Scott Kveton <scott AT osuosl D0T org> – espelho lfs.oregonstate.edu
William Astle <lost AT l-w D0T net> – espelho ca.linuxfromscratch.org
Eujon Sellers <jpolen@rackspace.com> – espelho lfs.introspeed.com
Justin Knierim <tim@idge.net> – espelho lfs-matrix.net
Manuel Canales Esparcia <manuel AT linuxfromscratch D0T org> – espelho lfsmirror.lfs-es.info
Luis Falcon <Luis Falcon> – espelho torredehanoi.org
Guido Passet <guido AT primerelay D0T net> – espelho nl.linuxfromscratch.org
Bastiaan Jacques <baafie AT planet D0T nl> – espelho lfs.pagefault.net
Sven Cranshoff <sven D0T cranshoff AT lineo D0T be> – espelho lfs.lineo.be
Scarlet Belgium – espelho lfs.scarlet.be
Sebastian Faulborn <info AT aliensoft D0T org> – espelho lfs.aliensoft.org
Stuart Fox <stuart AT dontuse D0T ms> – espelho lfs.dontuse.ms
Ralf Uhlemann <admin AT realhost D0T de> – espelho lfs.oss-mirror.org
Antonin Sprinzl <Antonin D0T Sprinzl AT tuwien D0T ac D0T at> – espelho at.linuxfromscratch.org
Fredrik Danerklint <fredan-lfs AT fredan D0T org> – espelho se.linuxfromscratch.org
Franck <franck AT linuxpourtous D0T com> – espelho lfs.linuxpourtous.com
Philippe Baque <baque AT cict D0T fr> – espelho lfs.cict.fr
Vitaly Chekasin <gyouja AT pilgrims D0T ru> – espelho lfs.pilgrims.ru
Benjamin Heil <kontakt AT wankoo D0T org> – espelho lfs.wankoo.org
Anton Maisak <info AT linuxfromscratch D0T org D0T ru> – espelho linuxfromscratch.org.ru
Satit Phermsawang <satit AT wbac D0T ac D0T th> – espelho lfs.phayoune.org
Shizunet Co.,Ltd. <info AT shizu-net D0T jp> – espelho lfs.mirror.shizu-net.jp
Jason Andrade <jason AT dstc D0T edu D0T au> – espelho au.linuxfromscratch.org
Christine Barczak <theladyskye AT linuxfromscratch D0T org> – Editor do Livro LFS
Archaic <archaic@linuxfromscratch.org> – Escritor/Editor Técnico do LFS (Dicas e Patches); Líder do Projeto HLFS; Editor do BLFS; Mantenedor do Projeto Dicas e Patches
Matthew Burgess <matthew AT linuxfromscratch D0T org> – Líder de Projeto do LFS; Escritor/Editor Técnico do LFS
Nathan Coulson <nathan AT linuxfromscratch D0T org> – Mantenedor de Scripts de Inicialização do LFS
Timothy Bauscher
Robert Briggs
Ian Chilton
Jeroen Coumans <jeroen AT linuxfromscratch D0T org> – Desenvolvedor de Sítio da Web; Mantenedor de FAQ
Manuel Canales Esparcia <manuel AT linuxfromscratch D0T org> – Mantenedor de XML e XSL do LFS/BLFS/HLFS
Alex Groenewoud – Escritor Técnico do LFS
Marc Heerdink
Jeremy Huntwork <jhuntwork AT linuxfromscratch D0T org> – Escritor Técnico do LFS; Mantenedor de LiveCD do LFS
Bryan Kadzban <bryan AT linuxfromscratch D0T org> – Escritor Técnico do LFS
Mark Hymers
Seth W. Klein – Mantenedor do FAQ
Nicholas Leippe <nicholas AT linuxfromscratch D0T org> – Mantenedor da Wiki
Anderson Lizardo <lizardo AT linuxfromscratch D0T org> – Mantenedor de Scripts de Infraestrutura de Sítio Web
Randy McMurchy <randy AT linuxfromscratch D0T org> – Líder de Projeto do BLFS; Editor do LFS
Dan Nicholson <dnicholson AT linuxfromscratch D0T org> – Editor do LFS e BLFS
Alexander E. Patrakov <alexander AT linuxfromscratch D0T org> – Escritor Técnico do LFS; Editor de Internacionalização do LFS; Mantenedor de Live CD do LFS
Simon Perreault
Scot Mc Pherson <scot AT linuxfromscratch D0T org> – Mantenedor do Gateway NNTP do LFS
Douglas R. Reno <renodr AT linuxfromscratch D0T org> – Editor do Systemd
Ryan Oliver <ryan AT linuxfromscratch D0T org> – Colíder de Projeto do CLFS
Greg Schafer <gschafer AT zip D0T com D0T au> – Escritor Técnico do LFS e Arquiteto do Método de Construção de Habilitação de 64 bits de Próxima Geração
Jesse Tie-Ten-Quee – Escritor Técnico do LFS
James Robertson <jwrober AT linuxfromscratch D0T org> – Mantenedor do Bugzilla
Tushar Teredesai <tushar AT linuxfromscratch D0T org> – Editor do Livro BLFS; Líder de Projeto de Dicas e Patches
Jeremy Utley <jeremy AT linuxfromscratch D0T org> – Escritor Técnico do LFS; Mantenedor do Bugzilla; Mantenedor de Scripts de Inicialização do LFS
Zack Winkles <zwinkles AT gmail D0T com> – Escritor Técnico do LFS
Cada pacote construído no LFS depende de um ou mais outros pacotes para a finalidade de construir e instalar adequadamente. Alguns pacotes até participam em dependências circulares, isto é, o primeiro pacote depende do segundo o qual, na sequência, depende do primeiro. Por causa dessas dependências, a ordem na qual pacotes são construídos no LFS é muito importante. O propósito desta página é o de documentar as dependências de cada pacote construído no LFS.
Para cada pacote que é construído, existem três, e às vezes até cinco tipos de dependências listadas abaixo. A primeira lista que outros pacotes necessitam estar disponíveis para a finalidade de compilar e instalar o pacote em questão. A segunda lista os pacotes que precisam estar disponíveis quando quaisquer aplicativos ou bibliotecas oriundos do pacote forem usados em tempo de execução. A terceira lista que pacotes, em adição àqueles na primeira lista, necessitam estar disponíveis para a finalidade de executar as suítes de teste. A quarta lista de dependências são pacotes que exigem que esse pacote esteja construído e instalado no local final dele antes que eles sejam construídos e instalados.
A última lista de dependências são pacotes opcionais que não são endereçados no LFS, porém poderiam ser úteis para o(a) usuário(a). Esses pacotes possivelmente tenham dependências adicionais obrigatórias ou opcionais deles próprios. Para essas dependências, a prática recomendada é a de instalá-las depois de completar o livro LFS e então voltar e reconstruir o pacote LFS. Em muitos casos, a reinstalação é endereçada no BLFS.
Este livro está licenciado sob a Licença Creative Commons Atribuição-Uso Não Comercial-Compartilhamento pela mesma licença 2.0.
As instruções de computador podem ser extraídas a partir do livro sob a Licença do MIT.
Código Jurídico da Creative Commons
Atribuição - Uso não-Comercial - Compartilhamento pela mesma licença 2.0
A INSTITUIÇÃO CREATIVE COMMONS NÃO É UM ESCRITÓRIO DE ADVOCACIA E NÃO PRESTA SERVIÇOS JURÍDICOS. A DISTRIBUIÇÃO DESTA LICENÇA NÃO ESTABELECE QUALQUER RELAÇÃO ADVOCATÍCIA. A CREATIVE COMMONS DISPONIBILIZA ESTA INFORMAÇÃO "NO ESTADO EM QUE SE ENCONTRA". A CREATIVE COMMONS NÃO FAZ QUALQUER GARANTIA QUANTO ÀS INFORMAÇÕES DISPONIBILIZADAS E SE EXONERA DE QUALQUER RESPONSABILIDADE POR DANOS RESULTANTES DO SEU USO.
Licença
A OBRA (CONFORME DEFINIDA ABAIXO) É DISPONIBILIZADA DE ACORDO COM OS TERMOS DESTA LICENÇA PÚBLICA CREATIVE COMMONS ("CCPL" OU "LICENÇA"). A OBRA É PROTEGIDA POR DIREITO AUTORAL E (OU) OUTRAS LEIS APLICÁVEIS. QUALQUER USO DA OBRA QUE NÃO O AUTORIZADO SOB ESTA LICENÇA OU PELA LEGISLAÇÃO AUTORAL É PROIBIDO.
AO EXERCER QUAISQUER DOS DIREITOS À OBRA AQUI CONCEDIDOS, VOCÊ ACEITA E CONCORDA FICAR OBRIGADO(A) NOS TERMOS DESTA LICENÇA. O LICENCIANTE CONCEDE A VOCÊ OS DIREITOS AQUI CONTIDOS EM CONTRAPARTIDA À SUA ACEITAÇÃO DESTES TERMOS E CONDIÇÕES.
Definições
"Obra Coletiva" significa uma obra, tal como uma edição periódica, antologia ou enciclopédia, na qual a Obra em sua totalidade e de forma inalterada, em conjunto com um número de outras contribuições, constituindo obras independentes e separadas em si mesmas, são agregadas em um trabalho coletivo. Uma obra que constitua uma Obra Coletiva não será considerada Obra Derivada (conforme definido abaixo) para os propósitos desta licença.
"Obra Derivada" significa uma obra baseada sobre a Obra ou sobre a Obra e outras obras pré existentes, tal como uma tradução, arranjo musical, dramatização, romantização, versão de filme, gravação de som, reprodução de obra artística, resumo, condensação ou qualquer outra forma na qual a Obra possa ser refeita, transformada ou adaptada, com a exceção de que uma obra que constitua uma Obra Coletiva não será considerada Obra Derivada para fins desta licença. Para evitar dúvidas, quando a Obra for uma composição musical ou gravação de som, a sincronização da Obra em relação cronometrada com uma imagem em movimento ("synching") será considerada uma Obra Derivada para os propósitos desta licença.
"Licenciante" significa a pessoa física ou a jurídica que oferece a Obra sob os termos desta Licença.
"Autor(a) Original" significa a pessoa física ou jurídica que criou a Obra.
"Obra" significa a obra autoral, passível de proteção pelo direito autoral, oferecida sob os termos desta Licença.
"Você" significa a pessoa física ou jurídica exercendo direitos sob esta Licença que não tenha previamente violado os termos desta Licença com relação à Obra, ou que tenha recebido permissão expressa do(a) Licenciante para exercer direitos sob esta Licença apesar de uma violação prévia.
"Elementos da Licença" significa os principais atributos da licença correspondente, conforme escolhidos pelo(a) Licenciante e indicados no título desta Licença: Atribuição, Não-comercial, Compartilhamento pela Mesma Licença.
Direitos de Uso Legítimo. Nada nesta licença é destinado a reduzir, limitar ou restringir quaisquer direitos emergentes do uso legítimo, primeira venda ou outras limitações sobre os direitos exclusivos do titular de direitos autorais sob a legislação autoral ou quaisquer outras leis aplicáveis.
Concessão da Licença. Sujeita aos termos e condições desta Licença, o(a) Licenciante concede a Você uma licença de abrangência mundial, sem royalties, não-exclusiva, perpétua (pela duração do direito autoral aplicável), para exercer os direitos sobre a Obra definidos abaixo:
reproduzir a Obra, incorporar a Obra em uma ou mais Obras Coletivas e reproduzir a Obra quando incorporada em Obra Coletiva;
para criar e reproduzir Obras Derivadas;
para distribuir cópias ou gravações da Obra, exibir publicamente, executar publicamente e executar publicamente por meio de uma transmissão de áudio digital a Obra, inclusive quando incorporada em Obras Coletivas;
para distribuir cópias ou gravações de Obras Derivadas, exibir publicamente, executar publicamente e executar publicamente por meio de uma transmissão digital de áudio Obras Derivadas;
Os direitos acima podem ser exercidos em todas as mídias e formatos, independente de serem conhecidos agora ou concebidos posteriormente. Os direitos acima incluem o direito de fazer modificações que forem tecnicamente necessárias para exercer os direitos em outras mídias, meios e formatos. Todos os direitos não concedidos expressamente pelo(a) Licenciante ficam aqui reservados, incluindo, mas não se limitando, os direitos definidos nas Seções 4(e) e 4(f).
Restrições. A licença concedida na Seção 3 acima está expressamente sujeita e limitada aos seguintes termos:
Você pode distribuir, exibir publicamente, executar publicamente ou executar publicamente digitalmente a Obra somente sob os termos desta Licença, e Você precisa incluir uma cópia de, ou o Uniform Resource Identifier para, esta Licença com cada cópia ou fonograma da Obra que Você distribuir, exibir publicamente, executar publicamente ou executar publicamente digitalmente. Você não pode oferecer ou impor quaisquer termos sobre a Obra que alterem ou restrinjam os termos desta Licença ou o exercício dos(as) destinatários(as) dos direitos aqui concedidos. Você não pode sublicenciar a Obra. Você precisa manter intactos todos os avisos que se referem a esta Licença e à isenção de garantias. Você não pode distribuir, exibir publicamente, executar publicamente ou executar publicamente digitalmente a Obra com quaisquer medidas tecnológicas que controlem o acesso ou uso da Obra de uma maneira inconsistente com os termos deste Contrato de Licença. O acima se aplica para a Obra conforme incorporada em uma Obra Coletiva, mas isso não exige que a Obra Coletiva, além da própria Obra, seja submetida aos termos desta Licença. Se Você criar uma Obra Coletiva, mediante notificação originária de qualquer Licenciante, Você precisará, na medida do possível, remover da Obra Coletiva qualquer referência para tal Licenciante ou para o(a) Autor(a) Original, conforme solicitado. Se Você criar uma Obra Derivada, mediante notificação originária de qualquer Licenciante, Você precisará, na medida do possível, remover da Obra Derivada qualquer referência para tal Licenciante ou para o(a) Autor(a) Original, conforme solicitado.
Você pode distribuir, exibir publicamente, executar publicamente ou executar publicamente por meios digitais uma Obra Derivada somente sob os termos desta Licença, ou de uma versão posterior desta licença com os mesmos Elementos da Licença desta licença, ou de uma licença do internacional da Creative Commons (iCommons) que contenha os mesmos Elementos da Licença desta Licença (por exemplo, Atribuição, Uso Não Comercial, Compartilhamento pela Mesma Licença Japão). Você deve incluir uma cópia desta licença ou de outra licença especificada na sentença anterior, ou o Identificador Uniformizado de Recursos (Uniform Resource Identifier) para esta licença ou de outra licença especificada na sentença anterior, com cada cópia ou gravação de cada Obra Derivada que Você distribuir, exibir publicamente, executar publicamente ou executar publicamente por meios digitais. Você não poderá oferecer ou impor quaisquer termos sobre a Obra Derivada que alterem ou restrinjam os termos desta Licença ou o exercício dos direitos aqui concedidos para os(as) destinatários(as), e Você deverá manter intactas todas as informações que se refiram a esta Licença e à exclusão de garantias. Você não poderá distribuir, exibir publicamente, executar publicamente ou executar publicamente por meios digitais a Obra Derivada com qualquer medida tecnológica que controle o acesso ou o uso da Obra de maneira inconsistente com os termos deste Acordo de Licença. O disposto acima se aplica à Obra Derivada quando incorporada em uma Obra Coletiva, mas isso não requer que a Obra Coletiva, à parte da Obra em si, esteja sujeita aos termos desta Licença.
Você não poderá exercer nenhum dos direitos acima concedidos a Você na Seção 3 de qualquer maneira que seja predominantemente intencionada ou direcionada à obtenção de vantagem comercial ou compensação monetária privada. A troca da Obra por outros materiais protegidos por direito autoral por intermédio de compartilhamento digital de arquivos ou de outras formas não deverá ser considerada como intencionada ou direcionada à obtenção de vantagens comerciais ou compensação monetária privada, desde que não haja pagamento de nenhuma compensação monetária com relação à troca de obras protegidas por direito de autor.
Se Você distribuir, exibir publicamente, executar publicamente ou executar publicamente por meios digitais a Obra ou qualquer Obra Derivada ou Obra Coletiva, Você deve manter intactas todas as informações relativas a direitos autorais sobre a Obra e atribuir para o(a) Autor(a) Original crédito razoável com relação ao meio ou mídia que Você está utilizando, por intermédio da veiculação do nome (ou pseudônimo, se for o caso) do(a) Autor(a) Original, se fornecido; o título da Obra, se fornecido; na medida do razoável, o Identificador Uniformizado de Recursos (URI) que o(a) Licenciante especificar para estar associado à Obra, se houver, exceto se o URI não se referir ao aviso de direitos autorais ou à informação sobre o regime de licenciamento da Obra; e no caso de Obra Derivada, crédito identificando o uso da Obra na Obra Derivada (exemplo: "Tradução Francesa da Obra de Autor(a) Original", ou "Roteiro baseado na Obra original de Autor(a) Original"). Tal crédito pode ser implementado de qualquer forma razoável; entretanto, no caso de Obra Derivada ou Obra Coletiva, esse crédito aparecerá no mínimo onde qualquer outro crédito comparável de autoria aparece e de modo ao menos tão proeminente quanto esse outro crédito de autoria comparável.
Para evitar dúvidas, quando a Obra for uma composição musical:
Royalties de Desempenho Sob Licenças Gerais. O(A) Licenciante reserva-se o direito exclusivo de cobrar, seja individualmente ou por meio de uma sociedade de direitos de execução (por exemplo, ASCAP, BMI, SESAC), royalties pela execução pública ou pela execução digital pública (por exemplo, webcast) da Obra, se essa execução for destinada principalmente ou dirigida em direção a vantagens comerciais ou compensação monetária privada.
Direitos Mecânicos e Royalties Estatutários. O(A) Licenciante reserva-se o direito exclusivo de cobrar, seja individualmente ou por meio de uma agência de direitos musicais ou agente designado (por exemplo, Agência Harry Fox), royalties por qualquer gravação fonográfica que Você criar a partir da Obra (versão cover) e distribuir, sujeita à licença compulsória criada pela 17 USC Seção 115 da Lei de Direitos Autorais dos Estados Unidos da América do Norte (ou equivalente em outras jurisdições), se a distribuição de tal versão cover for principalmente destinada ou direcionada a vantagens comerciais ou compensação monetária privada. 6. Direitos de Webcasting e Royalties Estatutários. Para evitar dúvidas, quando a Obra for uma gravação de som, o(a) Licenciante reserva-se o direito exclusivo de cobrar, seja individualmente ou por intermédio de uma sociedade de direitos de execução (por exemplo, SoundExchange), royalties pela execução digital pública (por exemplo, webcast) da Obra, sujeito à licença compulsória criada pela 17 USC Seção 114 da Lei de Direitos Autorais dos Estados Unidos da América do Norte (ou equivalente em outras jurisdições), se a Tua execução digital pública for principalmente destinada ou direcionada a vantagens comerciais ou compensação monetária privada.
Direitos de Webcast e Royalties Estatutários. Para evitar dúvidas, quando a Obra for uma gravação de som, o(a) Licenciante reserva-se o direito exclusivo de coletar, seja individualmente ou por meio de uma sociedade de direitos de execução (por exemplo, SoundExchange), royalties pela execução digital pública (por exemplo, webcast) da Obra, sujeita à licença compulsória criada pela 17 USC Seção 114 da Lei de Direitos Autorais dos Estados Unidos da América do Norte (ou equivalente em outras jurisdições), se a Tua execução digital pública for principalmente destinada ou direcionada para vantagem comercial ou compensação monetária privada.
Declarações, Garantias e Isenção de Responsabilidade
EXCETO QUANDO FOR DE OUTRA FORMA MUTUAMENTE ACORDADO PELAS PARTES POR ESCRITO, O(A) LICENCIANTE OFERECE A OBRA NO ESTADO EM QUE SE ENCONTRA (AS IS) E NÃO PRESTA QUAISQUER GARANTIAS OU DECLARAÇÕES DE QUALQUER ESPÉCIE RELATIVAS À OBRA, SEJAM ELAS EXPRESSAS OU IMPLÍCITAS, DECORRENTES DA LEI OU QUAISQUER OUTRAS, INCLUINDO, SEM LIMITAÇÃO, QUAISQUER GARANTIAS SOBRE A TITULARIDADE DA OBRA, ADEQUAÇÃO PARA QUAISQUER PROPÓSITOS, NÃO-VIOLAÇÃO DE DIREITOS, OU INEXISTÊNCIA DE QUAISQUER DEFEITOS LATENTES, ACURACIDADE, PRESENÇA OU AUSÊNCIA DE ERROS, SEJAM ELES APARENTES OU OCULTOS. EM JURISDIÇÕES QUE NÃO ACEITEM A EXCLUSÃO DE GARANTIAS IMPLÍCITAS, ESSAS EXCLUSÕES PODEM NÃO SE APLICAR A VOCÊ.
Limitação de Responsabilidade. EXCETO NA EXTENSÃO EXIGIDA PELA LEI APLICÁVEL, EM NENHUMA CIRCUNSTÂNCIA O(A) LICENCIANTE SERÁ RESPONSÁVEL PARA COM VOCÊ POR QUAISQUER DANOS, ESPECIAIS, INCIDENTAIS, CONSEQUENCIAIS, PUNITIVOS OU EXEMPLARES, ORIUNDOS DESTA LICENÇA OU DO USO DA OBRA, MESMO QUE O(A) LICENCIANTE TENHA SIDO AVISADO(A) SOBRE A POSSIBILIDADE DE TAIS DANOS.
Terminação
Esta Licença e os direitos aqui concedidos terminarão automaticamente no caso de qualquer violação dos termos desta Licença por Você. Pessoas físicas ou jurídicas que tenham recebido Obras Derivadas ou Obras Coletivas de Você sob esta Licença, entretanto, não terão suas licenças terminadas desde que tais pessoas físicas ou jurídicas permaneçam em total cumprimento com essas licenças. As Seções 1, 2, 5, 6, 7 e 8 subsistirão a qualquer terminação desta Licença.
Sujeito aos termos e condições dispostos acima, a licença aqui concedida é perpétua (pela duração do direito autoral aplicável à Obra). Não obstante o disposto acima, o(a) Licenciante reserva-se o direito de difundir a Obra sob termos diferentes de licença ou de cessar a distribuição da Obra a qualquer momento; desde que, no entanto, quaisquer destas ações não sirvam como meio de retratação desta Licença (ou de qualquer outra licença que tenha sido concedida sob os termos desta Licença, ou que deva ser concedida sob os termos desta Licença) e esta Licença continuará válida e eficaz a não ser que seja terminada de acordo com o disposto acima.
Outras Disposições
Cada vez que Você distribuir ou executar publicamente por meios digitais a Obra ou uma Obra Coletiva, o(a) Licenciante oferece ao destinatário uma licença da Obra nos mesmos termos e condições que a licença concedida a Você sob esta Licença.
Cada vez que Você distribuir ou executar publicamente por meios digitais uma Obra Derivada, o(a) Licenciante oferece ao destinatário uma licença à Obra original nos mesmos termos e condições que foram concedidos a Você sob esta Licença.
Se qualquer disposição desta Licença for tida como inválida ou não-executável sob a lei aplicável, isso não afetará a validade ou a possibilidade de execução do restante dos termos desta Licença e, sem a necessidade de qualquer ação adicional das partes deste acordo, tal disposição será reformada na mínima extensão necessária para tal disposição tornar-se válida e executável.
Nenhum termo ou disposição desta Licença será considerado renunciado e nenhuma violação será considerada consentida, a não ser que tal renúncia ou consentimento seja feita por escrito e assinada pela parte que será afetada por tal renúncia ou consentimento.
Esta Licença representa o acordo integral entre as partes com respeito à Obra aqui licenciada. Não há entendimentos, acordos ou declarações relativas à Obra que não estejam especificadas aqui. O(A) Licenciante não será obrigado(a) por nenhuma disposição adicional que possa aparecer em quaisquer comunicações provenientes de Você. Esta Licença não pode ser modificada sem o mútuo acordo, por escrito, entre o(a) Licenciante e Você.
A Creative Commons não é uma parte desta Licença e não presta qualquer garantia relacionada à Obra. A Creative Commons não será responsável perante Você ou qualquer outra parte por quaisquer danos, incluindo, sem limitação, danos gerais, especiais, incidentais ou consequentes, originados com relação a esta licença. Não obstante as duas frases anteriores, se a Creative Commons tiver expressamente se identificado como a Licenciante, ela deverá ter todos os direitos e obrigações de Licenciante.
Exceto para o propósito delimitado de indicar ao público que a Obra é licenciada sob a CCPL (Licença Pública Creative Commons), nenhuma parte deverá utilizar a marca Creative Commons ou qualquer outra marca ou logo relacionado à Creative Commons sem consentimento prévio e por escrito da Creative Commons. Qualquer uso permitido deverá ser de acordo com as diretrizes da Creative Commons de utilização da marca então válidas, conforme sejam publicadas no sítio da web dela ou de outro modo disponibilizadas periodicamente mediante solicitação.
A Creative Commons pode ser contactada em http://creativecommons.org/.
Direitos autorais © 1999-2024 Gerard Beekmans
Permissão é aqui concedida, gratuitamente, para qualquer pessoa que obtenha uma cópia deste software e arquivos de documentação associados (o "Software"), para lidar com o Software sem restrição, incluindo, sem limitação, os direitos para usar, copiar, modificar, mesclar, publicar, distribuir, sublicenciar, e (ou) vender cópias do Software, e para permitir para as pessoas para quem o Software for fornecido para fazer o mesmo, sujeito às seguintes condições:
O aviso de direitos autorais acima e este aviso de permissão deveria ser incluído em todas as cópias ou porções substanciais do Software.
O SOFTWARE É FORNECIDO “NO ESTADO EM QUE SE ENCONTRA”, SEM GARANTIAS DE QUALQUER ESPÉCIE, EXPLÍCITAS OU IMPLÍCITAS, INCLUINDO, PORÉM NÃO LIMITADA A, AS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO PARA UM PROPÓSITO PARTICULAR E NÃO-VIOLAÇÃO. EM NENHUMA CIRCUNSTÂNCIA OS AUTORES OU TITULARES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUAISQUER ALEGAÇÕES, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, OU EM CONEXÃO COM, O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.