A arte da preparação de GNUs (I) - Base e Fundamento
Este é o primeiro artigo de uma série dedicada à arte de preparar um sistema operacional Unix-like para uso pessoal. Será dada ênfase ao GNU/Linux por ser o sistema operacional em que desenvolvi as competências fundamentais que serão descritas, mas é perfeitamente possível aproveitar bastante coisa que será dita num FreeBSD etc. Neste primeiro artigo trataremos da preparação da base.
Introdução
Esta é a série de artigos que gostaria de ter lido na época em que iniciei a exploração que resultou no sistema operacional que utilizo hoje, ou, sendo mais específico, no sistema operacional que construí com componentes de uma distribuição de GNU com Linux, e que hoje me assiste nas diversas necessidades de computação pessoal.
De saída vou pedir desculpas ao leitor pelo tipo de texto como o do parágrafo anterior. Considere como fruto de uma disciplina que desenvolveu-se em uma circunstância em que nada é dito com clareza e precisão. Como esta é a série que gostaria de ter lido, tentarei articular o que descobri até aqui da melhor maneira possível, dizendo os nomes das coisas e descrevendo as coisas, tentando evitar partir da premissa que o leitor sabe do que estou falando em matéria de computação.
O objetivo desta série é ilustrar os elementos da construção de um sistema operacional GNU/Linux e como eles se relacionam, de modo que o leitor tenha um mapa que o permita conduzir investigações específicas para construir com confiança o próprio sistema operacional.
Só o kernel?
Como tratarei de GNU/Linux, uma limpeza de palavreado é necessária. Falar direito ajuda a pensar direito, e para construir um sistema operacional a clareza de pensamento é necessária em todas as etapas.
Comecemos por entrar em acordo sobre como serão utilizadas algumas palavras.
A idéia de sistema operacional
Vamos começar com a idéia de sistema operacional. Um sistema é necessariamente um conjunto de elementos que, juntos, funcionam de maneira ordenada para algum fim. Pense em sistema respiratório ou sistema digestivo, coisas que estudamos nas aulas de anatomia humana na escola, uma série de formações no corpo como boca, esôfago, estômago, intestinos trabalham de forma ordenada em prol da assimilação do alimento ingerido para nutrir todo o organismo. Já temos uma parte do conceito.
O sistema operacional será necessariamente, em sentido amplo, o conjunto de componentes de software, programas de computador, que tornam o hardware, a máquina, de algum modo operacional e (termo horrível) “operacionalizável”. Sem um sistema operacional a utilização da máquina não é impossível, mas se torna mais complicada, pois será necessário escrever programação para lidar com cada componente eletrônico desejado e disponível no computador. O computador é um sistema também, só que eletrônico. Então o sistema operacional gerencia os elementos do sistema eletrônico que é o computador, e fornece meios para utilização deste sistema eletrônico.
Agora vamos avançar na questão dos meios de utilização. Aqui temos a possibilidade de restrições e ampliações:
- Em uma definição mais restrita de sistema operacional, este seria um sistema que simplesmente realiza o gerenciamento do hardware e disponibiliza uma interface para uso de outros programas de computador, aplicações, que acessarão os recursos do hardware através do sistema operacional.
- Dando um passo adiante, o sistema operacional pode fornecer meios para a criação e execução de programas.
- Mais um passo, o sistema operacional pode fornecer meios para que uma pessoa opere o computador.
- Na maior amplitude, o sistema operacional pode englobar toda a coleção de programas de computador que tornam a máquina útil para uma pessoa, incluindo processador de texto, navegador e assim por diante.
Para a definição nº 1 temos uma outra palavra específica: kernel. Um kernel pode ser encarado como um sistema operacional ou como parte de um sistema operacional, depende do que estamos querendo dizer com o termo sistema operacional, coisa que pode variar conforme o contexto.
Quem pegou outras épocas da computação conheceu computadores que disponibilizavam uma interface para programar em BASIC ou carregar um programa BASIC na memória. Neste caso temos a interação com sistemas operacionais que se encaixam na definição nº 2.
O paradigma de sistema operacional
Nesta série trabalharemos com um sistema operacional Unix-like, o GNU/Linux. Então falemos rapidamente do Unix. Unix é um outro sistema operacional, anterior ao GNU (que vamos comentar mais adiante), que é paradigmático pela forma que foi construído, suas características.
Recorrendo ao “The Unix Programming Environment” de Brian Kernighan e Rob Pike, o primeiro capítulo inicia-se com a seguinte pergunta: o que é “Unix”? Ao que se seguem algumas definições:
- No sentido mais estrito, o kernel, um programa que controla os recursos de um computador e os aloca entre seus usuários, de um sistema operacional multitarefa (de tempo compartilhado em tradução literal).
- Em sentido mais amplo, “Unix” pode incluir não somente o kernel, mas também programas essenciais como compiladores, editores, linguagens de comando, programas para copiar e imprimir arquivos etc.
- Em sentido ainda mais amplo, “Unix” pode incluir programas criados por ti ou outros utilizadores para execução em teu sistema, como ferramentas para preparação de documentos, rotinas para análises estatísticas e programas para geração de gráficos.
Em seguida arremata: “qual desses usos do termo Unix é correto depende de que nível de sistema está sendo considerado”.
Não é tão diferente da lista anterior. Podemos perceber paralelos entre as definições 1 e 1, 3 e 2, 4 e 3.
Adiante, dado o modo como o Unix foi construído, derivou-se uma noção para sistema operacional Unix-like: um sistema constituído de quatro elementos que tornam um computador útil e o dão característica:
- Kernel
- Biblioteca C padrão
- Shell
- Conjunto de utilitários do sistema
Um descendente “vivo” do Unix que temos disponível para utilizar hoje em dia é o FreeBSD, e podemos verificar neste as realidades comentadas. Ao instalar o FreeBSD no computador temos o kernel FreeBSD e demais componentes que completam o sistema operacional FreeBSD, aos quais podemos somar outros programas de computador que podemos criar com os recursos do sistema operacional ou obter de terceiros.
A querela do nome do sistema operacional
De tempos em tempos aparece a questão de se é próprio dizer que um Arch ou um Debian seria um tipo de “Linux”, ou distribuição de “Linux”.
Realizada a etapa de definir a idéia de sistema operacional, com as quatro definições do que pode ser um sistema operacional, podemos dizer com segurança onde se encaixa o Linux: na primeira definição. Não por acaso o site em que o Linux é disponibilizado se chama kernel.org, e está escrito em letras garrafais na homepage o seguinte: The Linux Kernel Archives.
Desta forma é seguro afirmar que um Debian instalado não é um Linux, mas que, se for o caso, tem um Linux. Porque pode sequer ter em algumas ocasiões. Existe instalação de Debian com kernel FreeBSD, e que não constitui um sistema operacional FreeBSD. Da mesma forma que o Android não é um Linux, tem um Linux, o utiliza como kernel junto de outros diversos componentes específicos do para constituir um sistema operacional.
Aqui introduzimos o sistema operacional GNU. Este sistema operacional é um Unix-like (segue o paradigma do Unix) construído com a premissa de ser totalmente constituído de software livre (assunto para outro artigo da série). O detalhe do sistema operacional GNU é que na maior parte das vezes ele não é utilizado com o kernel desenvolvido pelo projeto GNU, o Hurd, mas com outros. O Debian fornece o sistema GNU junto ao kernel Linux ou FreeBSD. Por causa desse tipo de junção do sistema operacional (pela definição própria para sistemas Unix-like) GNU com um kernel de outro projeto apareceu a noção de GNU/Linux, GNU/kFreeBSD e assim por diante.
A querela do nome se deve ao detalhe de que, normalmente, o nome do kernel não é destacado em detrimento do sistema operacional. Como acontece com o Android e o MacOS (cujo kernel se chama Darwin). Mas entre as distribuições de GNU com Linux frequentemente se deixa de lado o nome do sistema operacional em prol do kernel. Isso acontece inclusive com projetos como o Alpine, que não utiliza elementos do sistema operacional GNU e oferece um sistema cuja base é a soma do kernel Linux com a biblioteca musl libc e o Busybox.
O devido nome das coisas
Aparte a querela, para os interesses dessa série de artigos não deixo de notar que a insistência no nome do kernel para nomear o sistema operacional é uma imprecisão que pode enevoar o pensamento. Basta frequentar um fórum de entusiastas e aguardar que logo aparece quem se queixe de algo em que “o Linux” não funciona como deveria, e, quando tu vais verificar o caso, o Linux está funcionando muito bem, mas a pessoa configurou mal o comportamento de uma aplicação qualquer.
Ainda que seja possível chamar o Linux de sistema operacional, conforme o que já foi apresentado até aqui, a definição de sistema operacional em que o Linux se encaixa não faz sentido para o contexto desta série de artigos, que não vai focar em minúcias de programação em baixo nível ou produção de sistemas embarcados com Linux.
O mínimo conceito de sistema operacional adequado para o contexto desta série é de sistema operacional Unix-like, que adere à 3ª definição descrita na idéia de sistema operacional. Assim sendo, Linux é somente o kernel e GNU (porque esta é a escolha de trabalho da série) é o restante do sistema operacional. Por vezes também chamaremos o sistema operacional pelo nome da distribuição, como Arch ou Debian, quando usarmos o termo em sentido ainda mais amplo, avançando para a 4ª definição.
Um sistema operacional básico
Estabelecido o conceito de sistema operacional Unix-like, passemos aos componentes. Já vimos que são quatro. Agora vamos dar algum detalhe do que seria cada um dos quatro.
Do kernel já falamos, ele cumpre as funções da definição mais estrita de sistema operacional descrita na idéia de sistema operacional. Podemos adicionar o detalhe há uma camada de interface para que aplicações interajam com o kernel, essa interface se dá pelas chamadas de sistema (do inglês system calls).
Biblioteca C padrão, ou libc para usar o termo mais curto, não é algo que se discutirá nesta série, mas é um conjunto de funções de uso comum elaborado sobre a estrutura das chamadas de sistema disponibilizado para o uso de aplicações escritas em C, ou que possam utilizar de bibliotecas em liguagem C. É uma outra forma das aplicações interagirem com o kernel, e o programador de cada aplicação pode optar por usar funções da libc ou chamadas de sistema, uma coisa não exclui a outra.
O shell é uma aplicação especial que fornece interface para executar outras aplicações. É através do shell que uma pessoa poderá operar o sistema operacional e o hardware, sendo ele a interface padrão entre homem e máquina.
O conjunto de utilitários do sistema é uma série de pequenos programas que o utilizador pode utilizar através do shell. Em um sistema operacional Unix-like os utilitários são construídos com finalidades bem específicas e de modo que eles possam ser combinados com recursos do shell para servir diversas necessidades de computação do utilizador sem que para isso seja necessário desenvolver uma nova aplicação.
Uma distribuição de sistema operacional
Essa é uma realidade bem característica do ramo GNU/Linux. Existe distribuição de sistema operacional no ramo dos BSDs e outros sistemas operacionais Unix-like também, mas as premissas são diferentes.
Distribuição é uma espécie de projeto em que se toma software livre produzido por terceiros para realizar (capitão óbvio na sala) a distribuição deste software devidamente preparado para execução e uso, por vezes com modificações. Um exemplo seria o projeto Linux libre, que distribui um kernel Linux modificado para eliminar o carregamento de elementos que não se enquadram como software livre.
Mas quando se fala em distribuição geralmente o assunto não é distribuição de kernel, mas de sistemas operacionais.
Uma distribuição de sistema operacional é um projeto em que se toma componentes de sistema operacional produzidos por outras pessoas ou organizações, e se realiza todo um trabalho para distribuir estes componentes de modo que possam ser somados em um computador, ou instalados, e esta soma resulte em um sistema operacional que funcione. Essas poucas palavras estão longe de dizer o quanto isso dá trabalho, porque para isso é necessário alinhar algo na ordem de dezenas de milhares de peças de software de uma forma que funcionem juntas e em harmonia.
Esse fenômeno é bastante característico do ramo GNU/Linux justamente porque veio com as iniciativas de distribuir sistemas constituídos da soma do kernel Linux com os diversos componentes do sistema operacional GNU (libc, shell e utilitários). Isso vem desde a década de 90, após a disponibilização do kernel Linux sob uma licença livre, quando passou a fazer sentido somá-lo ao GNU para então produzir um sistema operacional 100% livre.
Uma instalação de sistema operacional
Se a distribuição é o projeto que fornece diversos componentes de sistema operacional de uma forma que seja possível compor um sistema com eles, a instalação é a composição do sistema operacional “materializada” em um computador.
Uma distribuição tem como base o chamado empacotamento de componentes, que consiste em gerar um arquivo que contém a, ou pode ser desdobrado na, coleção de arquivos necessários e/ou úteis para o funcionamento e uso do software empacotado. Tomando como exemplo o próprio Linux, o kernel em forma útil é frequentemente constituído de inúmeros arquivos, e para simplificar a entrega cria-se um arquivo, um pacote, que contém todos esses arquivos devidamente organizados para que possam ser instalados, isto é: copiados para as devidas posições de modo o conjunto funcione.
Para prosseguirmos o estudo adotaremos o Arch como distribuição por critério de conveniência para o autor da série. Mas todo o entendimento desenvolvido pode ser aplicado ao uso de outra distribuição como o Debian com algumas adaptações.
A instalação básica
Vimos a definição de sistema operacional Unix-like anteriormente. Ao lidar com distribuições teremos uma outra idéia construída sobre esta que é a instalação básica, que consiste no menor conjunto de pacotes que definem a instalação de uma dada distribuição. Pode-se entender que esse conjunto frequentemente vai um pouco além dos quatro elementos de um sistema Unix-like, incorporando pacotes que servem à obtenção de outros pacotes da distribuição por exemplo.
Se retornarmos à idéia de sistema operacional, por mais que uma instalação básica tenha relativamente pouca coisa comparada com o sistema montado para “uso civil ordinário”, tocar um negócio, fazer trabalhos escolares ou acadêmicos etc, o todo pode ser encarado como um sistema operacional aderente com a 3ª definição apontando para a 4ª.
No Arch, a obtenção do mínimo conjunto de pacotes que define uma instalação básica se dá com a instalação do pacote base. Podemos verificar a relação de componentes que define a instalação básica hoje, e são 28 no total:
| Pacotes | Finalidade |
|---|---|
| licenses | Licenças de software |
| pacman archlinux-keyring | Base para gestão de pacotes |
| filesystem | Arquivos fundamentais |
| glibc gcc-libs | libc e outras bibliotecas |
| bash | Shell |
| coreutils | Utilitários fundamentais |
| findutils | Utilitários de localização de arquivos |
| grep gawk sed | Utilitários para processamento de texto |
| gettext | Utilidades para i18n e l10n |
| file | Utilitário para inspeção de tipo de arquivo |
| iproute2 iputils | Utilitários para redes |
| tar xz gzip bzip2 | Utilitários para empacotar e compactar arquivos |
| shadow | Utilitários para gestão de usuários |
| procps-ng psmisc | Utilitários para gestão de processos |
| systemd systemd-sysvcompat | init, mais uma realidade em si mesma |
| pciutils | Utilitários para barramento PCI |
| util-linux | Utilitários para interação com o Linux |
| linux (opcional) | Kernel |
Não abordaremos tudo o que é fornecido em uma instalação básica de Arch, mas alguns elementos serão abordados com algum detalhe nos próximos artigos.
Considerações finais
Este artigo não foi de grandes emoções e experimentos, mas estabeleceu o ponto de partida sem o qual não seria possível continuar.
Em um próximo artigo será abordado o conceito de software livre, que algumas vezes foi citado aqui. Além de significado histórico, esse conceito está na base de realidades que nos afetam até hoje, e esta série de artigos jamais seria escrita sem o software livre. Além disso, traremos uma noção funcional sobre o licenciamento de software.
Para iniciar a visão de como o sistema operacional se articula e movimenta, trataremos do conceito de boot, init e verificaremos um pouco da forma de interação homem-máquina que se dá através de shell.
Tendo a primeira visão de como se dá a interação com o sistema operacional, retomaremos o conceito de pacotes no contexto da gestão de pacotes para entender a idéia de instalação de sistema operacional, e como podemos obter mais recursos para ampliar as possibilidades de utilização do sistema operacional.
Em seguida iniciaremos aquilo que é o objetivo da série: “preparação de GNUs”, visando computadores de uso pessoal, ao contrário de servidores. Para tanto verificaremos as pilhas de áudio e de vídeo, como podemos constituí-las, composição de um ambiente gráfico de trabalho e os pormenores associados.
Referências
- W. Richard Stevens & Stephen A. Rago - Advanced Programming in the UNIX Environment
- Brian W. Kernighan & Rob Pike - The Unix Programming Environment
- Andrew S. Tanenbaum & Herbert Bos - Modern Operating Systems
- Michael Kerrisk - The Linux Programming Interface - A Linux and UNIX System Programming Handbook
Ver também:
- Paulo Kretcheu - Curso GNU
- Blau Araújo - Shell Script Descomplicado