Minha jornada para aprender e entender melhor o Linux começou há mais de uma década, em 1998. Eu tinha acabado de instalar minha primeira distribuição Linux e rapidamente fiquei intrigado com toda a concepção e filosofia pro trás do Linux.
Há diversas maneiras de se realizar uma única tarefa. O mesmo pode ser dito sobre distribuições Linux. Houve muitas ao longo dos anos. Algumas continuam a existir, outras se transformaram em outra coisa, enquanto outras foram relegadas às nossas memórias. Todas fazem coisas diferentes para servirem aos seus públicos-alvo. Por existirem maneiras tão diferentes de atingir o mesmo objetivo, eu comecei a perceber que eu não tinha mais que ser limitado por qualquer implementação que fosse. Antes de descobrir o Linux, nós simplesmente toleramos alguns problemas em outros sistemas operacionais já que não há outra escolha. Era como era, gostando você ou não. Com o Linux, o conceito de escolha começa a surgir. Se você não gosta de algo, você é livre e até incentivado a mudá-lo.
Eu testei várias distribuições e não pude decidir sobre qualquer uma. Eram grandes sistemas em seus limites. Isto passou a não ser uma questão de certo ou errado. Isto passou a ser uma questão de gosto pessoal. Com todas essas opções disponíveis, começou a parecer que não poderia haver um único sistema que fosse perfeito para mim. Então, eu decidi criar meu próprio sistema Linux, que fosse completamente de acordo com as minhas preferências pessoais.
Para verdadeiramente fazer meu próprio sistema, eu resolvi compilar tudo a partir do código-fonte em vez de usar pacotes binários pré-compilados. Esse sistema Linux "perfeito" deveria ter os pontos fortes de vários sistemas sem os pontos fracos já percebidos. Primeiramente, a ideia era bastante assustadora. Mas eu continuava com a ideia de que um sistema poderia ser construído.
Após enfrentar problemas como dependências circulares e erros de tempo de compilação, eu finalmente construí um sistema Linux customizado. Ele era totalmente operacional e perfeitamente utilizável como qualquer outro sistema Linux. Mas era a minha própria criação. Foi bastante satisfatório construir um sistema sozinho. Ecrever cada pedaço de cada programa seria a única coisa melhor do que isso.
Conforme eu compartilhava meus êxitos e experiências com outros membros da comunidade Linux, ficou aparente que havia um interesse firme nessas ideias. Rapidamente ficou claro que uma construção Linux customizada serve não apenas para conhecer as necessidades específicas de cada usuário, mas também serve para uma oportunidade ideal de aprendizagem para programadores e administradores de sistemas reforçarem suas habilidades (já existentes) em Linux. Para além deste objetivo amplo, o projeto Linux do Zero nasceu.
Este livro é o núcleo central desse projeto. Ele provê o conhecimento e as instruções necessárias para você projetar e construir seu próprio sistema. Enquanto este livro fornece um modelo que resulta em um sistema corretamente funcional, você é livre para alterar as instruções para atender a você mesmo, que é, em parte, uma parte importante deste projeto. Você permanece no controle; nós apenas oferecemos uma ajuda para você começar a sua própria jornada.
Eu sinceramente espero que você obtenha êxito em construir seu próprio sistema Linux do Zero e aproveite os inúmeros benefícios de ter um sistema que é verdadeiramente seu.
--
Gerard Beekmans
gerard@linuxfromscratch.org
Há muitas razões pelas quais você dever querer ler este livro. Uma das questões que muita gente levanta é "por que se embananar construindo manualmente um sistema Linux do zero quando você pode apenas baixar e intalar uma dsitribuição já existente?".
Uma razão importante para a existência deste projeto é ajudar você a aprender como um sistema Linux funciona de dentro para fora. Construindo um Linux do zero ajuda a demonstrar o que faz o Linux ser rápido, e como as coisas funcionam em conjunto e dependem umas das outras. Uma das melhores coisas que essa experiência de aprendizagem pode fornecer é a habilidade par acustomizar um sistema Linux para cumprir susas próprias necessidades.
Outro benefício chave do Linux do Zero é permitir que você tenha mais controle sobre o sustema sem depender de alguma implementaão Linux alheia. Com o Linux do Zero você está no controle e é capaz de ditar cada aspecto do sistema.
O Linux do Zero permite que você crie sistemas Linux bastante compactos. Ao instalar uma distribuição regular, geralmente você geralmente é forçado a uma grande quantidade de progrmas que você nunca vai usar ou entender.E estes programas consomem recursos. Você pode dizer que as CPU's e os discos rígidos fazem com que esta não seja uma preocupação importante. Porém, às vezes você precisa sim levar em consideração as limitações de armazenamento, dentre outras. Pense em CD's inicializáveis, pendrives, e sistemas embarcados. São nestas sistuações em quem o Linux do Zero pode ser interessante.
Outra vantagem de uma construção Linux customizada é a segurana. Compilando um sistema inteiro do código-fonte, você tem o poder de inspecionar absolutamente tudo e aplicar todas as correções de segurança que você quiser, não sendo mais necessário esperar que alguém compile pacotes binários que corrijam falahas de segurança. A menos que você examine a correção e implemente-a sozinho, você não tem garantia alguma de que o novo pacote binário foi construído corretamente e corrige o problema da forma adequada.
O objetivo do Linux do Zero é construir um sistema fundamentalmente completo e utilizável. Se você não quer construir seu sistema Linux do zero, você pode não se beneficiar completamente de toda a informação aqui constante.
Existem inúmeras outras boas razões para construir seu próprio sistema Linux do Zero. Ao fim e ao cabo, conhecimento é de longe a razão mais importante. Conforme você prosseguir na experiência Linux do Zero, você vai descobrir o poder que a informação e o conhecimento realmente trazem.
As principais arquiteturas visadas pelo Linux do Zero são as CPU's AMD/Intel x86 (32 bits) e x86_64 (64 bits). Por outro lado, as instruções deste livro também podem funcionar, com algumas modificações, para as CPU's Power PC e ARM. Para construir um sistema que utiliza uma destas CPU's, o principal pré-requisito, junto a outros vistos mais adiante, é um sistema Linux, como um Linux do Zero instalado previamente, Ubuntu, Red Hat/ Fedora, SuSE, ou outra distribuição rodando na arquitetura de destino. Note também que um distribuição de 32 bits pode ser instalada e usada como um sistema anfitrião em um computador AMD/Intel de 64 bits.
Alguns outros fatos sobre sistemas de 64 bits merecem ser aqui mencionados. Quando comparado a um sitema de 64 bits, o tamanho do arquivo executável é consideravelmente maior e a velocidade de execução é levemente mais rápida. Por exemplo, numa construção de testes Linux do Zero 6.5, numa CPU Core 2 Duo, foram obtidas as seguintes estatísticas:
Arquitetura Tempo de construção Tamanho da construção
32-bit 198.5 minutos 648 MB
64-bit 190.6 minutos 709 MB
Como se pode ver, uma construção de 64 bits é apenas 4% mais rápido e 9% maior do que uma construção de 32 bits. O ganho obtido por um sistema de 64 bits é relativamente mínimo. Com efeito, se você tem mais de 4GB de RAM ou quer manipular dados que excedem o tamanho de 4GB, as vantagens de um sistema de 64 bits são substanciais.
Uma construção Linux do Zero padrão de 64 bits é considerada um sistema de 64 bits "puro". Isto é, suporta apenas executáveis de 64 bits. Se for pra cosntruir um sistema "multi-lib", é preciso compilar muitos programas duas vezes: uma para 32 bits e outra para 64 bits. Isto não é diretamente suportado no Linux do Zero porque acabaria afetando o objetivo educacional de prover as instruções necessárias para uma base sólida em sistemas Linux. Você pode consultar o projeto Linux do Zero Cruzado para maiores informações sobre este tópico avançado.
A estrutura do Linux do Zero segue os padrões Linux o máximo quanto possível. os principais são:
Linux Standard Base (LSB) Version 5.0
O Linux do Zero possui quatro padrões separados: Core, Desktop, Runtime Languages, e Imaging. Além dos requisitos genéricos, existem também os requisitos específicos de cada arquitetura. Há também duas áreas para uso experimental: Gtk3 e Graphics. O Linux do Zero procura se enquadrar nas exigências das arquiteturas discutidas na seção anterior.
Muitas pessoas não concordam com os requisitos exigidos pela Linux Standard Base (LSB). A proposta principal em se definir isso é garantir que softwares proprietários estarão aptos a serem instalados e a rodarem corretamente em um sistema compatível. Como o Linux do Zero é se baseia nas fontes, o usuário tem o controle total sobre quais pacotes serão escolhidos e pode optar por não instalar alguns pacotes que são especificados pelo Linux do Zero.
Criar um sistema Linux do Zero capaz de passar nos testes para certificação LSB é possível, mas não sem a adição de pacotes que transcendem o escopo do LFS. Esses pacotes adicionais tem instruções para instalação no BLFS.
|
LSB Core: |
Bash, Bc, Binutils, Coreutils, Diffutils, File, Findutils, Gawk, Grep, Gzip, M4, Man-DB, Ncurses, Procps, Psmisc, Sed, Shadow, Tar, Util-linux, Zlib |
|
LSB Desktop: |
Nenhum |
|
LSB Runtime Languages: |
Perl |
|
LSB Imaging: |
Nenhum |
|
LSB Gtk3 e LSB Graphics (experimentais): |
Nenhum |
|
LSB Core: |
At, Batch (uma parte do At), Cpio, Ed, Fcrontab, Initd-tools, Lsb_release, NSPR, NSS, PAM, Pax, Sendmail (ou Postfix ou Exim), time |
|
LSB Desktop: |
Alsa, ATK, Cairo, Desktop-file-utils, Freetype, Fontconfig, Gdk-pixbuf, Glib2, GTK+2, Icon-naming-utils, Libjpeg-turbo, Libpng, Libtiff, Libxml2, MesaLib, Pango, Qt4, Xdg-utils, Xorg |
|
LSB Runtime Languages: |
Python, Libxml2, Libxslt |
|
LSB Imaging: |
CUPS, Cups-filters, Ghostscript, SANE |
|
LSB Gtk3 e LSB Graphics (experimentais): |
GTK+3 |
|
LSB Core: |
Nenhum |
|
LSB Desktop: |
Nenhum |
|
LSB Runtime Languages: |
Nenhum |
|
LSB Imaging: |
Nenhum |
|
LSB Gtk3 e LSB Graphics (experimentais): |
Nenhum |
Como estabelecido anteriormente, o objetivo do LFS é compilar um sistema básico completo e utilizável. Isso inclui todos os pacotes necessários para replicálo enquenato provê uma base relativamente mínima através da qual seja possível customizar um sistema mais completo de acordo com as escolhas do usuário. Isto não quer dizer que o LFS é o menor sistema possível. Há muitos pacotes importantes inclusos que não são estritamente requeridos. A lista abaixo contém as justificativa para cada pacote incluso neste livro.
Acl
Esse pacote contém utilitários para administrar listas de controle de acesso (Access Control Lists), que são usadas apra definir de maneira mais refinada os direitos de acesso a arquivos e pastas.
Attr
Esse pacote contém programas para administração de atributos extendidos em objetos de sistemas de arquivos.
Autoconf
Esse pacote contém programas para produção de shell scripts que podem configurar automaticamente código-fonte obtidos a partir de um modelo. É frequentemente necessário para recompilar um pacote após atualizações nos procedimentos de compilação.
Automake
Esse pacote contém programas para geração de makefiles a partir de um modelo. É frequentemente necessário para recompilar um pacote após atualizações nos procedimentos de compilação.
Bash
Esse apcote satisfaz um requerimento LSB do tipo Core, fornecendo uma interface Bourne Shell para o sistema. Foi escolhido detre todos os outros pacotes de shell porque é o mais comum e possui mais recursos além das funções básicas de um shell.
Bc
Esse pacote provê uma linguagem de processamento númerico de precisão arbitrária. Satisfaz um requisito necessário quanto se compila o kernel Linux.
Binutils
Esse pacote contém um linker, um assembler, e outras ferramentas para manipulação de arquivos-objeto (object files) Os programas desse pacote são necessários para compilar a maior parte dos pacotes no LFS e no BLFS.
Bison
Esse pacote contém a versão GNU do yacc (Yet Another Compiler Compiler), necessário para compilar outros programas inclusos no LFS.
Bzip2
Esse pacote contpem programas para compressão e extração de arquivos. É requerido para extrair muitos pacotes do LFS.
Check
Esse pacote contém ferramentas de teste para outros programas. É instalado apenas dentre as ferramentas temporárias.
Coreutils
Esse pacote contém programas essenciais para visualização e manipulação de arquivos e pastas. Estes programas são necessários para gerenciamento de arquivos por linha de comando e para os procedimentos de intalação de todos os pacotes do LFS.
DejaGNU
Esse pacote contém uma framework para teste de outros programas. É instalado apenas entre as ferramentas temporárias.
Diffutils
Esse pacote contém programas que mostram as diferenças entre arquivos e pastas. Estes pragramas podem ser utilizados para criar patches e também são usados nos procedimentos de compilação de muitos pacotes.
E2fsprogs
Esse pacote contpem os utilitários para manipulação dos sistemas de arquivos ext2, ext3 e ext4. Este são os mais comuns e mais bem testados sistemas de arquivos nativamente suportados pelo Linux.
Eudev
Esse pacote é um gerenciador de serviços. Ele controla de forma dinâmica as entradas no diretório /dev, conforme os dispositivos são adicionados ou removidos do sistema.
Expat
Esse pacote contém uma bilbioteca de XML parsing relativamente pequena. É requerido pelo módulo XML::Parser Perl.
Expect
Esse pacote possui um programa para executar scripts de diálogos com outros programas interativos. É comumente usado para testas outros pacotes. É intalado apenas entre as ferramentas temporárias.
File
Esse pacote contém um utilitário para determinação do tipo de um arquivo. Poucos pacotes necessitam dele para serem compilados.
Findutils
Esse pacote possui programas para encontrar arquivos em um sitema de arquivos. É usado em scrits de compilação de muitos pacotes.
Flex
Esse pacote contpem um utilitário para gerar programas que reconheçam padrões em textos. É a versão GNU do lex(lexical analyzer). É requisitado para compilação de muitos pacotes do LFS.
Gawk
Esse pacote contém programas para manipulação de arquivos de texto. É a versão GNU do awk(Aho-Weinberg-Kernighan). É usado em scripts de compilação de mutios outros pacotes.
Gcc
Esse pacote é o GNU Compiler Colletion. Ele contém os compiladores de C e C++, bem como muitos outros não compilados pelo LFS.
GDBM
Esse pacote contém a biblioteca GNU Database Manager. É usado um outro pacote do LFS, o Man-DB.
Gettext
Esse pacote contpem utilitários e bibliotecas para internacionalização e localização de vários pacotes.
Glibc
Esse pacite possui a pricipal biblioteca C. Os programas do Linux não podem rodar sem ele.
GMP
Esse pacote contém bibliotecas matemáticas que fornecem funções para precisão aritmética arbitrária. É requerido para compilar o GCC.
Gperf
Esse pacote contém um programa que gera uma função hash perfeita para um conjunto de chaves. É requerido pelo Eudev.
Grep
Esse pacote possui programas para pesquisa através de arquivos. Tais programas são usados por build scripts de muitos pacotes.
Groff
Esse pacote contém programas para processamento e formatação de texto. Uma função importante de tais programs é a formatação de man pages.
GRUB
Esse pacote é o Grand Unified Boot Loader. É um dos vários bootloaders existentes, porém é o mais flexível de todos.
Gzip
Esse pacote contém programas para compressão e extração de arquivos. É necessário para extrair muitos pacotes do LFS e do BLFS.
Iana-etc
Esse pacote provê dados para serviços de rede e protocolos. É necessário para habilitar cpacidades específicas de rede.
Inetutils
Esse pacote contém programas para admnistração básica de rede.
Intltool
Esse pacote contém ferramentas para extrair strings traduzíveis de arquivos-fonte.
IProute2
Esse pacote contpem programas para networking básico e avançado em IPv4 e IPv6. Ele foi escolhido entre outras ferramentas de rede (net-tools) pelas suas capacidades de IPv6.
Kbd
Esse pacote possui arquivos key-table, utilitários para teclados non-US e uma variedade de fontes para console.
Kmod
Esse pacote contém programas necessários para administrar módulos do kernel Linux.
Less
Esse pacote contém um excelente visualizador de arquivos de texto, possibilitando rolar para cima ou para baixo na vizualização de um arquivo. É utilizado também pelo Man-DB para vizualizar manpages.
Libcap
Esse pacote implementa as interfaces do espao de usupario para as capacidades POSIX 1003.1e disponpiveis em kernel's Linux.
Libpipeline
O pacote Libpipeline contém uma biblioteca para manipulação de pipelines de subprocessos de uma forma flexível e conveniente. É requerido pelo pacote Man-DB.
Libtool
Esse pacote contém a biblioteca genérica do GNU para suporte de scripts. Ele transforma a complexidade de se usar bibliotecas compartilhadas em uma consistente e portátil interface. É necessário pela suite de testes de outros pacotes do LFS.
Linux Kernel
Esse pacote é o Sistema Operacional. É o Linux no ambiente GNU/Linux.
M4
Esse pacote contém um processador de textos útil para construão de ferramentas para outros programas.
Make
Esse pacote contém um programa para compilação direta de pacotes. É requerido por quase todos os pacotes do LFS.
Man-DB
Esse pacote contém programas para encontrar e visualizar manpages. Foi escolhido no lugar do pacote man devido às capacidades superiores de internacionalização.
Man-pages
Esse pacote contém o conteúdo atual dos manpages básicos do Linux.
MPC
Esse pacote contém funções para a aritmética de números complexos. É requerido pelo GCC.
MPFR
Esse pacote contém funções para precisão aritmética mútipla. É requerido pelo GCC.
Ncurses
Esse pacote contém bibliotecas para manipulação terminal-independente de caracteres. Ele é usado frequentemente para prover o controle do cursor para um sistema baseado em menus. É necessário para vários pacotes do LFS.
Patch
Esse pacote contém um programa para modificação e crialçao de arquivos através da aplicação de um arquivo patch tipicamente criado pelo programa diff. É necessário para o procedimento de compilação de muitos pacotes do LFS.
Perl
Esse pacote é um intérprete para a linguagem de runtime PERL. É necessário para a instalação e teste de vários pacotes do LFS.
Pkg-config
Esse pacote provê um programa para retornar metadados sobre uma biblioteca ou um pacote instalado.
Procps-NG
Esse pacote contém programas para monitoramento de processos. Esse programas são úteis para administação de sistema e também são usados pelos bootscripts do LFS.
Psmisc
Esse pacote contém programas que mostram informações sobre processos em execução. Esses programas são úteis para administração do sistema.
Readline
Esse pacote é um conjunto de bibliotecas que oferecem recursos para edição e histórico de linhas de comando. É usado pelo Bash.
Sed
Esse pacote permite edição de texto sem que seja preciso abri-lo em um editor. É também requerido pela maioria dos configure scripts dos pacotes do LFS.
Shadow
Esse pacote contém programas para manipulação de senhas de forma segura.
Sysklogd
Esse pacote contém programas para mensagens de logging do sistema, tais como aquelas emitidas pelo kernel ou por processos daemon quando eventos não usuais ocorrem.
Sysvinit
Esse pacote provê o programa init, que é o pai de todos os outros processos no sistema Linux.
Tar
Esse pacote provê recursos para arquivamento e extração de todos os pacotes utilizados no LFS.
Tcl
Esse pacote contém o Tool Command Language (ferramenta de linguagem de comando) utilizado em muitas suites de testes em pacotes do LFS. É o único instalado dentre as ferramentas temporárias.
Texinfo
Esse pacote contém programas para leitura, escrita e conversão de info pages. É utilizado nos procedimentos de instalação de muitos pacotes do LFS.
Util-linux
Esse pacote contém uma miscelânea de utilitários. Entre estes estão utilitários para manipulaão de sistemas de arquivos, consoles, partições e mensagens.
Vim
Esse pacote contém um editor. Foi escolhido pela compatibilidade com o clássico editor vi e seu grande número de capacidades poderosas. Um editor é uma escolha bastante pessoal para muitos usuários e qualquer outro editor pode ser escohido se desejado.
XML::Parser
Esse pacote é um módulo Perl que interage com o Expat.
XZ Utils
Esse pacote contém programas para compressão e extração de arquivos. Ele provê a maior compressão geralmente disponível e é útil para extração de pacotes nos formatos XZ e LZMA.
Zlib
Esse pacote contém rotinas de compressão e descompressão usadas por alguns programas.
Compilar um sistema LFS não é uma tarefa simples. Requer um certo nível de conhecimento de adminsitração de sistemas Unix a fim de resolver problemas e executar corretamente os comandos listados.Em particular, como algo absolutamente mínimo, você deve já possuir a habilidade de usar a linha de comando para copiar ou mover arquivos e pastas, listar conteúdos de pastas e mudar o diretório atual. É também esperado que você tenha um conhecimento razoável sobre utilização e instalação de programas no Linux.
Porque o livro supõe ao menos este nível básico de perícia, os vários fóruns LFS de suporte provavelmente não são aptos a fornecerem a ti ajuda nessas áreas. Você vai perceber que seus questionamentos versando sobre conhecimentos básicos serão ignorados ou respondidos com uma lista de pré-leitura para o LFS.
Antes de compilar um sistema LFS, recomenda-se ler o seguinte:
Como compilar um programa https://artfesg.github.io/linux/lfs/como-compilar.html
Este é um guia compreensivo de como compilar e instalar pacotes Unix genéricos no Linux. Apesar de ter sido escrito há um bom tempo, continua sendo uma boa referência quanto as técnicas básicas necessárias para compilação e instalação de programas.
Beginner's Guide to Installing from Source https://artfesg.github.io/linux/lfs/instalando-da-fonte.html
Este guia provê um bom sumário das habilidades e técnicas básicas necessárias para compilar um programa a partir do código-fonte.