Atendendo a pedidos de amigos e clientes, daremos início a uma série de artigos que discutirão tópicos importantes para certificação Linux LPIC-1. Não prometemos abordar todo o conteúdo da certificação por questões de tempo mas prometemos que todo tópico abordado será em profundidade, esclarecendo o máximo possível para que você não apenas domine o básico para passar na prova mas, sim, os conceitos fundamentais sobre o conteúdo.

Este é o 1º artigo da série e não está relacionado à nenhum tópico específico da LPIC, mas forma a base para a compreensão dos tópicos do Objetivo 103.1 do exame: “Work on the command line”.

Para maiores informações, consulte os objetivos oficiais no site do LPI.

1. Um bocado de teoria que não cai na prova mas é importante

Antes de entrarmos no assunto e conteúdo reais deste artigo temos que esclarecer alguns termos que são rotineiramente utilizados quando falamos de Linux – como terminal, console, terminal virtual, emulador de terminal, console virtual, TTY, PTS, PTY, pseudoterminal, shell, linha de comando e outros – mas que ninguém sabe muito bem o que são e qual a diferença entre eles. Você pode pular toda este artigo se quiser, mas só tem a ganhar se estudá-lo também.

Infelizmente essa é uma daquelas áreas que se desenvolveram durante décadas, acompanhando a evolução dos computadores, do Unix e do Linux, e os termos que inicialmente serviam para uma coisa específica acabaram sendo utilizados para outras coisas. Assim temos situações nas quais uma mesma coisa é chamada por vários nomes diferentes, e situações nas quais coisas diferentes são chamadas pelo mesmo nome. Para piorar os desenvolvedores originais utilizavam certos termos que foram depois “esquecidos” pelos novos desenvolvedores e a confusão só aumentou.

Esta seção de teoria que não cai na prova LPIC serve para tentar esclarecer um pouco as coisas. Não pretendo aqui trazer uma resposta definitiva pois, aparentemente, essa resposta definitiva não existe: pergunte para 10 pessoas que têm Linux ao invés de sangue nas veias, e você terá 20 respostas diferentes. Meu objetivo nesta seção é trazer uma definição simples, clara e razoavelmente precisa para que você possa continuar seus estudos sobre Linux de modo mais confortável. E quando digo “razoavelmente precisa” quero dizer que tentei ao máximo ser preciso e objetivo mas não garanto que tudo o que vai aqui está 100% correto (até porque, como já falei, não existe concordância nesta área). Para os corajosos, sugiro a leitura das seguintes fontes:

2. O que é o terminal?

Inicialmente, quando não existiam os computadores pessoais (PC), nem notebooks, mas existiam os grandes mainframes rodando algum tipo de UNIX (ou outro sistema operacional proprietário e específico para o hardware), era necessário utilizar alguma coisa para que o usuário final pudesse interagir com esse mainframe central. Essa “coisa” que foi escolhida foi o TeleTYpe (daí o nome TTY), uma evolução das antigas TelePrinters (Teleprinter na Wikipedia) que já eram utilizadas desde o início do século XX.

teletypes
Teletypes em 1940 (www.linusakesson.net/programming/tty/)

Inúmeros fabricantes, tipos e modelos de teletypes foram utilizados nos primórdios da computação, na década de 1960, até que foram sendo substituídos por outras coisas, como leitoras de cartões perfurados. Mas esse TeleTYpe é que era, na época, o “terminal” do computador: uma maneira de enviar e receber informações para o mainframe. Como TTY era um acrônimo para os teletypes (na época o terminal do mainframe), a sigla TTY passou a ser associada com o “terminal”: a coisa que conseguia enviar e receber informações do mainframe.

A partir da década de 1970 começarama surgir terminais de vídeo para os mainframes, sendo um dos mais famaos o VT-100 da Digital Equipment Corporation (DEC):

dec_vt100_terminal
VT-100 (https://en.wikipedia.org/wiki/VT100)

Esses equpamentos, terminais de vídeo, também eram uma forma de enviar e receber informações ao mainframe, e também eram conhecidos por terminais. Na verdade os terminais de vídeo passaram a ser os TERMINAIS de fato dos mainframes, mas a nomenclatura TTY, da época dos teletypes, continuou. O fluxo de trabalho com os terminais era o seguinte:

terminal_flow
Fluxo em um TERMINAL físico (www.linusakesson.net/programming/tty/)

O terminal, que era um teletype ou um terminal de vídeo, se conectava ao mainframe através de uma linha física, interagindo com o Kernel do UNIX (que ficava responsável pelos detalhes de baixo nível, como o baud rate, parity control, etc.) que usava um “Driver TTY” para interagir com os processos do usuário. Nessa época o terminal era uma coisa separada do mainframe.

Com a evolução e o surgimento das computadores pessoais, o modo de interação com o computador passou a ser integrado no próprio computador: o teclado, o mouse e o vídeo. Passamos para um mundo onde o teletype e os terminais de vídeo não existem mais. Assim, todos os terminais que você vê hoje em dia nos computadores UNIX/Linux, são TERMINAIS EMULADOS por algum EMULADOR DE TERMINAL, algo que mimetiza os antigos terminais de vídeos reais (com muitas outras funções agregadas para a facilidade do usuário). Também são chamados de TERMINAIS VIRTUAIS.

Vamos fazer uma pausa nessa discussão sobre os terminais agora para introduzir outro assunto básico: o console. Depois voltaremos ao assunto dos terminais e consoles.

3. O que é o console?

Novamente vamos para a história. Antigamente um console era um hardware específico para o controle de um mainframe. Os terminais de antigamente (teletypes ou terminais de vídeo) não serviam para controlar o mainframe. Para isso era necessário um equipamento especial, o console, que era conectado ao mainframe para controlá-lo:

ibm_1620_model_1
Console do IBM 1620 (https://en.wikipedia.org/wiki/System_console)

Esse console (também chamado de console do sistema, console do computador, console root ou console do operador) era utilizado para a administração do mainframe. Posteriormente terminais de vídeo também passaram a ser utilizados como console e para a exibição de mensagens de importância administrativa como mensagens do Kernel, da BIOS, do Boot Loader, do processo de init ou do system logger, entre outros.

Assim, o CONSOLE passou a significar algo conectado diretamente ao computador ou mainframe (através de portas seriais ou outros mecanismos) para receber mensagens administrativas e realizar tarefas no sistema, exceto as tarefas do usuários que continuavam a ser realizadas nos terminais de vídeo. O console funciona assim:

terminal_virtual1
Modo de operação do console (www.linusakesson.net/programming/tty/)

Um hardware conectado diretamente ao computador interage com o Kernel através do vídeo e o teclado; o Kernel utiliza então um emulador de terminais e um driver TTY para interagir com os processos do usuário.

Novamente, com a evolução dos computadores o CONSOLE deixou de ser algo externo conectado diretamente ao computador e passou a ser interno ao próprio sistema, acessado simplesmente com o teclado e o monitor de vídeo dos computadores/servidores atuais.

Note duas coisas importantes aqui: o console é a interface de administração do sistema, e é ele é acessado através de um emulador de terminais utilizando-se drivers TTY.

E no UNIX/Linux, onde fica o CONSOLE DO SISTEMA responsável pela administração do computador/servidor? Já falamos que com a evolução da computação o console deixou de ser algo externo conectado ao computador e passou a ser interno ao sistema. O mesmo ocorre no Linux: o console é um sistema interno do Kernel que recebe todas as mensagens e avisos do Kernel, do sistema de logs, etc., e fornece um meio para o usuário administrar o computador. Também já falamos que como o console passou a ser interno, é acessado pelo teclado e vídeo do computador. Mas então, onde está o console no Linux?

O Linux trabalha com o conceito de CONSOLES VIRTUAIS, que são consoles de administração logicamente separados mas acessados pelo mesmo par teclado/vídeo. Geralmente o Linux formece 6 consoles virtuais de administração com um emulador de terminais prontos para uso, acessados atravé da combinação de teclas Alt+F1 até Alt+F6 (se o computador está em modo texto) ou Ctrl+Alt+F1 até Ctrl+Alt+F6 (se o computador está em modo gráfico).

O console não serve apenas para a administração do sistema: um usuário pode escrever um texto e enviá-lo por e-mail usando somente o console e alguns utilitários Linux mas, geralmente, quem acessa um console virtual através do teclado e vídeo do computador/servidor é o administrador do sistema.

Outro ponto interessanto do console é que ele não é obrigatório: algumas distribuições embarcadas de Linux não disponibilizam o console mas, sim, outra interface para a administração (geralmente uma interface web).

4. E o terminal/console na interface gráfica?

Podemos usar o Linux durante muito tempo somente na interface gráfica, nunca necessitando abrir o console ou um terminal emulado na interface gráfica. Mas as vezes isso é necessário. E isso é feito, novamente, através de emuladores de terminais que podem ser iniciados a partir da própria interface gráfica (Gnome, KDE, etc.).

Existem vários emuladores de terminais disponíveis nas interfaces gráficas (xterm, Konsole, Gnome-Terminal, Terminator, aterm, guake, MacOS Terminal, rxvt, Xfce Terminal, etc.) mas todos fazem a mesma coisa: abrem uma janela gráfica com um terminal emulado que pode ser utilizado tanto para a administração do sistema (como um console puro) como para tarefas do usuário.

Aqui vemos que o antigo terminal (teletype ou terminal de vídeo) e os consoles virtuais de administração podem ser acessados como uma coisa só através de um emulador de terminais.

Mas existe uma diferença entre o terminal emulado a partir da interface gráfica e o terminal emulado a partir dos consoles virtuais. Os terminais emulados para os consoles virtuais são gerenciados diretamente pelo Kernel usando um driver TTY.

Já os terminais emulados na interface gráfica são diferentes pois a emulação do terminal é feita no espaço do usuário e não pelo Kernel. E para manter todo o subsistema TTY do Kernel intacto, foram criados os PSEUDOTERMINAIS. A coisa funciona assim (exemplificado com o emulador xterm):

terminal_virtual2
Emuladores de terminais gráficos e pseudoterminais (www.linusakesson.net/programming/tty/)

Como o terminal emulado não fica no Kernel e sim no espaço do usuário, o Kernel utiliza um PSEUDOTERMINAL MASTER (PTY master) para interagir com o emulador de terminais do usuário, e utiliza os drivers TTY como um PSEUDOTERMINAL SLAVE (PTY slave) para interagir com os demais processos que o usuário inicia no terminal emulado gráfico.

Para o usuário toda essa coisa é transparente: ele não sabe se está interagindo com um emulador de terminais no espaço do usuário e um pseudoterminal no Kernel, ou se está interagindo com um emulador de terminais diretamente no Kernel. A funcionalidade é a mesma (exceto talvez por algumas coisas que podem ser configuradas no terminal gráfico, como cores, título das janelas, funcionalidades de copiar e colar, etc.).

O terminal emulado pela interface gráfica é chamado comumente de JANELA DE TERMINAL.

5. Linha de comando

Essa é fácil. Também conhecida como CLI (Command Line Interface), é toda interface de interação com o usuário que aceita somente input via texto, e só retorna output via texto também. Você não pode ver um vídeo na linha de comando (quer dizer, poder até pode mas o resultado não é o que você está esperando: Stupid Geek Tricks: Watch Movies in Your Linux Terminal Window).

6. Resumindo tudo até aqui

  • TERMINAL: é algo que não existe mais, era um hardware (teletype ou terminal de vídeo) que os usuários utilizavam para se conectar ao mainframe
  • EMULADOR DE TERMINAIS: é a coisa que consegue emular um terminal para que o usuário possa trabalhar, usando o próprio vídeo e teclado do computador. Pode ser o próprio Kernel ou algum outro emulador de terminais (xterm, Konsole, etc.)
  • CONSOLE: também é algo que não existe mais, era um hardware que os usuários conectavam no computador para administrá-lo
  • CONSOLE VIRTUAL: é a interface de administração do Linux, que transformou o antigo console em vários consoles virtuais, separados logicamente mas acessados pelo mesmo par teclado/vídeo. Utiliza o emulador de terminal do Kernel.
  • PSEUDOTERMINAL: é o par de terminais master/slave que o Kernel utiliza para se comunicar com um emulador de terminais que roda no espaço do usuário, em alguma interface gráfica, e não no próprio Kernel.
  • JANELA DE TERMINAL: é a apresentação na interface gráfica do emulador de terminal (Konsole, Gnome Terminal, xterm, etc.).
  • LINHA DE COMANDO: é a interface que recebe comandos e inputs e retorna outputs só via texto.

Entendeu? Então veja se consegue acompanhar o seguinte raciocínio:

  1. Um console virtual é uma interface de administração acessada pelo par vídeo/teclado do computador, que apresenta uma linha de comando para o usuário, utilizando um emulador de terminal próprio do Kernel e drivers TTY para interagir com os processos do usuário.
  2. Uma janela de terminal é uma janela gráfica acessada pelo vídeo/teclado do computador, que apresenta uma linha de comando para o usuário, utilizando um emulador de terminal externo ao Kernel, e pseudoterminais master/slave para interagir com os processos do usuário.

Veja um exemplo de meu laptop:

janela_terminal

A janela acima é um print-screen de uma JANELA DE TERMINAL em meu laptop, que apresenta uma LINHA DE COMANDO com o prompt “[abrantesasf@laptop04 ~]$ ” (ignore esse prompt por enquanto). Eu forneci um comando para mostrar os usuários logados no sistema e o TERMINAL VIRTUAL (emulador de terminal) utilizado. Temos a seguinte situação:

  • Usuário abrantesasf logado no terminal virtual (pseudoterminal) pts/0: é o terminal da interface gráfica em si
  • Usuário abrantesasf logado no terminal virtual (pseudoterminal) pts/1: é a primeira aba da janela de terminal
  • Usuário abrantesasf logado no terminal virtual (pseudoterminal) pts/2: é a segunda aba da janela de terminal
  • Usuário abrantesasf logado no terminal virtual tty2: mostra que além do que está visível na interface gráfica, o usuário abrantesasf também está logado no console virtual acessível pelo terminal virtual TTY2, e pode ser acessado pelo comando Ctrl+Alt+F2
  • Usuário root logado no terminal virtual tty3: mostra que o usuário root também está logado em outro console virtual acessível pelo terminal virtual TTY3, e pode ser acessado pelo comando Ctrl+Alt+F3

Note que os terminais emulados pelo Kernel são chamados de TTY e os pseudoterminais utilizados pelo Kernel para interagir com um emulador de terminal externo são chamados de PTS.

Vamos ficar por aqui. Pense sobre os conceitos discutidos acima e veja se você realmente entendeu a diferença entre terminal, console, linha de comando, terminal virtual e console virtual. Esses conceitos não são exigidos na LPIC mas conhecimento nunca é demais, não é?

Classificado como: