0% acharam este documento útil (0 voto)
11 visualizações556 páginas

Apostila 4linux

O documento é um guia de preparação para as certificações LPI-101 e LPI-102, utilizando materiais oficiais da LPI.org. Ele inclui quizzes, exemplos aprofundados, aulas em vídeo e simulados para ajudar os alunos a se prepararem adequadamente. O conteúdo abrange tópicos como configuração de hardware, inicialização do sistema, gerenciamento de partições e instalação de gerenciadores de inicialização.

Enviado por

fabiotourist
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
11 visualizações556 páginas

Apostila 4linux

O documento é um guia de preparação para as certificações LPI-101 e LPI-102, utilizando materiais oficiais da LPI.org. Ele inclui quizzes, exemplos aprofundados, aulas em vídeo e simulados para ajudar os alunos a se prepararem adequadamente. O conteúdo abrange tópicos como configuração de hardware, inicialização do sistema, gerenciamento de partições e instalação de gerenciadores de inicialização.

Enviado por

fabiotourist
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Fabio Gonçalves De Melo Santana / fabio.en.ptbr@gmail.

com
Fabio Gonçalves De Melo Santana / [email protected]

Olá aluno(a),

Para que você se prepare da melhor maneira para as suas cert ificações LPI-101 e
LPI-102, o nosso curso foi criado a part ir dos mat eriais oficiais de est udos para
prova da LPI, disponibilizados pela LPI.org no endereço:
ht t ps:/ / learning.lpi.org/ pt / learning-mat erials/ learning-mat erials/
Ut ilizamos est e mat erial como base, adicionando quizzes, novos exemplos
aprofundados, muit as aulas em vídeo abordando t odos os t ópicos das provas, e
um super simulado.
Fabio Gonçalves De Melo Santana / [email protected]

Sumário
1 101.1 Determinar e definir configurações de hardware 19
1.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.2 Ativação do dispositivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.3 Inspeção de dispositivos no Linux . . . . . . . . . . . . . . . . . . . . . . . . 20
1.4 Comandos para inspeção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.5 Arquivos de informação e de dispositivo . . . . . . . . . . . . . . . . . . . . . 26
1.6 Dispositivos de armazenamento . . . . . . . . . . . . . . . . . . . . . . . . . 27

2 Resumo 29
2.1 Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

3 Inicialização do Sistema 31
3.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2 BIOS ou UEFI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.3 O bootloader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.4 Inicialização do sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.5 Inspeção da inicialização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.6 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.7 Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

4 Alterar níveis de execução e destinos de inicialização e desligar ou reiniciar o


sistema 40
4.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.2 SysVinit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.3 systemd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.4 Upstart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.5 Desligar e reiniciar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.6 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.7 Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

5 102.1: Definir o esquema de partições do disco rígido 50

3
4 Sumário
Fabio Gonçalves De Melo Santana / [email protected]

5.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.2 Pontos de montagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.3 Mantendo as coisas separadas . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.4 A partição de inicialização (/boot) . . . . . . . . . . . . . . . . . . . . . . . 52
5.5 A partição do sistema EFI (ESP) . . . . . . . . . . . . . . . . . . . . . . . . 53
5.6 A partição /home . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.7 Dados variáveis (/var) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.8 Swap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.9 LVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.10 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.11 Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

6 Instalar um gerenciador de inicialização 58


6.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.2 GRUB Legacy e GRUB 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.3 A partição /boot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.4 Conteúdo da partição de inicialização . . . . . . . . . . . . . . . . . . . . . . 60

7 GRUB 2 61
7.1 Instalando o GRUB 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
7.2 Configurando o GRUB 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
7.3 Administrando as entradas de menu . . . . . . . . . . . . . . . . . . . . . . . 63
7.4 Interagindo com o GRUB 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
7.5 Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

8 102.3: Gerenciar Bibliotecas Compartilhadas 67


8.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
8.1.1 Conceito de Bibliotecas Compartilhadas . . . . . . . . . . . . . . . . . 67
8.1.2 Bibliotecas estáticas . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
8.1.3 Bibliotecas compartilhadas (ou dinâmicas) . . . . . . . . . . . . . . . 68
8.2 Convenções de nomenclatura de arquivo de objeto compartilhado . . . . . . . 68
8.3 Configuração de caminhos de biblioteca compartilhada . . . . . . . . . . . . . 69
8.4 Pesquisando as dependências de um determinado executável . . . . . . . . . . 72
8.5 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
8.6 Comandos usados nesta aula: . . . . . . . . . . . . . . . . . . . . . . . . . . 73
8.7 Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

9 Gerenciamento de pacotes em distribuições Debian 75


9.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
9.2 A Ferramenta de Pacotes Debian (dpkg) . . . . . . . . . . . . . . . . . . . . 76
9.3 Lidando com Dependências . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
9.4 Removendo Pacotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5 Sumário
Fabio Gonçalves De Melo Santana / [email protected]

9.5 Obtendo informações sobre o pacote . . . . . . . . . . . . . . . . . . . . . . 78


9.6 Listando Pacotes Instalados e Conteúdo do Pacote . . . . . . . . . . . . . . . 79
9.7 Descobrindo qual pacote possui um arquivo específico . . . . . . . . . . . . . 79
9.8 Reconfigurando Pacotes Instalados . . . . . . . . . . . . . . . . . . . . . . . 80
9.9 Ferramenta de Pacote Avançado (apt) . . . . . . . . . . . . . . . . . . . . . 80
9.10 Atualizando o Índice de Pacotes . . . . . . . . . . . . . . . . . . . . . . . . . 81
9.11 Instalando e removendo pacotes . . . . . . . . . . . . . . . . . . . . . . . . . 82
9.12 Corrigindo Dependências Quebradas . . . . . . . . . . . . . . . . . . . . . . . 83
9.13 Atualizando Pacotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
9.14 O Cache Local . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
9.15 Procurando por Pacotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
9.16 A Lista de Fontes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
9.17 O diretório /etc/apt/sources.list.d . . . . . . . . . . . . . . . . . . . . . . . . 87
9.18 Listando o conteúdo do pacote e encontrando arquivos . . . . . . . . . . . . . 87
9.19 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
9.20 Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
9.21 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
9.22 O RPM Package Manager (rpm) . . . . . . . . . . . . . . . . . . . . . . . . 91
9.23 Instalando, atualizando e removendo pacotes . . . . . . . . . . . . . . . . . . 91
9.24 Como gerenciar as dependências . . . . . . . . . . . . . . . . . . . . . . . . . 92
9.25 Listando os pacotes instalados . . . . . . . . . . . . . . . . . . . . . . . . . . 92
9.25.1 Obtendo informações sobre um pacote . . . . . . . . . . . . . . . . . 93
9.26 Descobrindo qual pacote possui um arquivo específico . . . . . . . . . . . . . 94
9.27 YellowDog Updater Modified (YUM) . . . . . . . . . . . . . . . . . . . . . . 94
9.28 Buscando pacotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
9.29 Instalando, atualizando e removendo pacotes . . . . . . . . . . . . . . . . . . 95
9.30 Como encontrar o pacote que fornece um arquivo específico . . . . . . . . . . 96
9.30.1 Obtendo informações sobre um pacote . . . . . . . . . . . . . . . . . 97
9.31 Administrando os repositórios de software . . . . . . . . . . . . . . . . . . . . 97
9.32 DNF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
9.33 Administrando os repositórios de software . . . . . . . . . . . . . . . . . . . . 100
9.34 Zypper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
9.35 Atualizando o índice do pacote . . . . . . . . . . . . . . . . . . . . . . . . . 100
9.36 Buscando pacotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
9.37 Instalando, atualizando e removendo pacotes . . . . . . . . . . . . . . . . . . 102
9.38 Descobrindo quais pacotes possuem um arquivo específico . . . . . . . . . . . 103
9.39 Obtendo informações sobre um pacote . . . . . . . . . . . . . . . . . . . . . 103
9.40 Administrando os repositórios de software . . . . . . . . . . . . . . . . . . . . 104
9.40.1 Adicionando e removendo repositórios . . . . . . . . . . . . . . . . . . 105

10 Resumo 106
6 Sumário
Fabio Gonçalves De Melo Santana / [email protected]

10.1 Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

11 102.6: Linux como um convidado de virtualizacao 109


11.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
11.2 Visão geral da virtualização . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
11.3 Tipos de máquinas virtuais . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
11.3.1 Totalmente Virtualizado . . . . . . . . . . . . . . . . . . . . . . . . . 110
11.3.2 Paravirtualizado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
11.3.3 Híbrido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
11.4 Trabalhando com modelos de máquina virtual . . . . . . . . . . . . . . . . . . 111
11.5 O D-Bus Machine ID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
11.6 Pré-configurando sistemas em nuvem . . . . . . . . . . . . . . . . . . . . . . 112
11.7 Contêineres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

12 Talvez isso possa te ajudar. . . 114

13 Introdução 115
13.1 Obtendo informações sobre o sistema . . . . . . . . . . . . . . . . . . . . . . 115
13.2 Obtendo informações sobre comandos . . . . . . . . . . . . . . . . . . . . . . 116
13.3 Usando o histórico de comandos . . . . . . . . . . . . . . . . . . . . . . . . . 118
13.4 Encontrando suas variáveis de ambiente . . . . . . . . . . . . . . . . . . . . . 119
13.5 Criando novas variáveis de ambiente . . . . . . . . . . . . . . . . . . . . . . . 120
13.6 Removendo as variáveis de ambiente . . . . . . . . . . . . . . . . . . . . . . 121
13.7 Usando aspas para escapar dos caracteres especiais . . . . . . . . . . . . . . . 122

14 Resumo 124

15 Talvez isso possa te ajudar. . . 126

16 103.2: Processar fluxos de texto usando filtros 129


16.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
16.2 Uma revisão rápida sobre redirecionamentos e pipes . . . . . . . . . . . . . . 129
16.3 Processando fluxos de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
16.3.1 Lendo um arquivo compactado . . . . . . . . . . . . . . . . . . . . . 131
16.4 Visualizando um arquivo no paginador . . . . . . . . . . . . . . . . . . . . . . 133
16.5 Obtendo uma parte de um arquivo de texto . . . . . . . . . . . . . . . . . . . 134
16.6 Noções básicas de sed, o editor de fluxo . . . . . . . . . . . . . . . . . . . . . 136
16.7 Um olhar mais aprofundado nos arquivos . . . . . . . . . . . . . . . . . . . . 139
16.8 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

17 103.3: Gerenciamento_básico_de_arquivos 143


17.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
7 Sumário
Fabio Gonçalves De Melo Santana / [email protected]

17.2 Manipulação de arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144


17.2.1 Usando ls para listar arquivos . . . . . . . . . . . . . . . . . . . . . . 144
17.3 Criar, copiar, mover e remover arquivos . . . . . . . . . . . . . . . . . . . . . 146
17.3.1 Criando arquivos com touch . . . . . . . . . . . . . . . . . . . . . . . 146
17.3.2 Copiando arquivos com cp . . . . . . . . . . . . . . . . . . . . . . . . 146
17.3.3 Movendo arquivos com o mv . . . . . . . . . . . . . . . . . . . . . . 148
17.3.4 Removendo arquivos com rm . . . . . . . . . . . . . . . . . . . . . . 149
17.4 Criando e removendo diretórios . . . . . . . . . . . . . . . . . . . . . . . . . 150
17.4.1 Criando diretórios com mkdir . . . . . . . . . . . . . . . . . . . . . . 150
17.5 Removendo diretórios com o rmdir . . . . . . . . . . . . . . . . . . . . . . . 151
17.6 Manipulação recursiva de arquivos e diretórios . . . . . . . . . . . . . . . . . 152
17.7 Listagem recursiva com ls -R . . . . . . . . . . . . . . . . . . . . . . . . . . 152
17.8 Cópia recursiva com cp -r . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
17.9 Remoção recursiva com rm -r . . . . . . . . . . . . . . . . . . . . . . . . . . 153
17.10Globbing de arquivos e caracteres curinga . . . . . . . . . . . . . . . . . . . . 154
17.11Tipos de caracteres curinga . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
17.12O asterisco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
17.13O ponto de interrogação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
17.14Caracteres entre colchetes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
17.15Combinando caracteres curinga . . . . . . . . . . . . . . . . . . . . . . . . . 157
17.16Como encontrar arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
17.17Usando critérios para acelerar a pesquisa . . . . . . . . . . . . . . . . . . . . 159
17.18Localizando arquivos por hora de modificação . . . . . . . . . . . . . . . . . . 159
17.19Localizando arquivos por tamanho . . . . . . . . . . . . . . . . . . . . . . . . 160
17.20O que fazer com os resultados . . . . . . . . . . . . . . . . . . . . . . . . . . 160
17.21Usando o grep para filtrar por arquivos com base no conteúdo . . . . . . . . . 161
17.22Empacotamento de arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
17.23Criando um arquivo de pacote . . . . . . . . . . . . . . . . . . . . . . . . . . 162
17.24Extraindo um pacote . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
17.25Compactando com o tar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
17.26O comando cpio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
17.27O comando dd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
17.28Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
17.29Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168

18 103.4 Usando fluxos, pipes e redirecionamentos 169


18.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
18.2 Redirecionamentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
18.3 Here Document e Here String . . . . . . . . . . . . . . . . . . . . . . . . . . 172
18.4 Pipes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
18.5 Substituição de comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
8 Sumário
Fabio Gonçalves De Melo Santana / [email protected]

19 Resumo 177
19.1 Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

20 103.5: Criar, monitorar e eliminar processos 181


20.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
20.2 Controle de jobs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
20.3 Especificação do trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
20.4 Status do trabalho: suspensão, primeiro plano e segundo plano . . . . . . . . 184
20.5 Trabalhos desvinculados: nohup . . . . . . . . . . . . . . . . . . . . . . . . . 185
20.6 Monitoramento de processos . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
20.7 Enviando sinais para processos: kill . . . . . . . . . . . . . . . . . . . . . . . 187
20.8 top e ps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
20.8.1 Interação com top . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
20.8.2 Explicação da saída de top . . . . . . . . . . . . . . . . . . . . . . . . 190
20.9 Recursos dos multiplexadores de terminal . . . . . . . . . . . . . . . . . . . . 194
20.10Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
20.11Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196

21 103.6 Modificar as prioridades de execução do processo 198


21.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
21.2 O Linux Scheduler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
21.3 Prioridades de leitura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
21.4 Niceness do processo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
21.5 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
21.6 Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
21.7 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
21.8 Expressão de colchetes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
21.9 Chaves . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
21.10Pesquisas com expressões regulares . . . . . . . . . . . . . . . . . . . . . . . 205
21.11O localizador de padrões: grep . . . . . . . . . . . . . . . . . . . . . . . . . 205
21.12O editor de fluxo: sed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
21.13Combinando grep e sed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
21.14Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
21.15Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
21.16Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
21.17Modo de inserção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
21.18Modo normal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
21.19Comandos de dois pontos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
21.20Editores Alternativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
21.21Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
21.22Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
9 Sumário
Fabio Gonçalves De Melo Santana / [email protected]

21.23Entendendo MBR e GPT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220


21.24Gerenciando partições MBR com o FDISK . . . . . . . . . . . . . . . . . . . 220
21.24.1 Imprimindo a tabela de partição atual . . . . . . . . . . . . . . . . . . 221
21.24.2 Partições primárias e estendidas . . . . . . . . . . . . . . . . . . . . . 222
21.24.3 Criando uma partição . . . . . . . . . . . . . . . . . . . . . . . . . . 222
21.24.4 Verificando o espaço não alocado . . . . . . . . . . . . . . . . . . . . 223
21.24.5 Removendo partições . . . . . . . . . . . . . . . . . . . . . . . . . . 223
21.24.6 Lacunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
21.24.7 Mudando o tipo da partição . . . . . . . . . . . . . . . . . . . . . . . 224
21.25Gerenciando partições GUID com o GDISK . . . . . . . . . . . . . . . . . . . 225
21.25.1 Imprimindo a tabela de partição atual . . . . . . . . . . . . . . . . . . 225
21.25.2 Criando uma partição . . . . . . . . . . . . . . . . . . . . . . . . . . 225
21.25.3 Removendo uma partição . . . . . . . . . . . . . . . . . . . . . . . . 226
21.25.4 Lacuna? Que lacuna? . . . . . . . . . . . . . . . . . . . . . . . . . . 226
21.25.5 Opções de recuperação . . . . . . . . . . . . . . . . . . . . . . . . . 227
21.26Criando sistemas de arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . 227
21.27Criando um sistema de arquivos ext2/ext3/ext4 . . . . . . . . . . . . . . . . 227
21.28Criando um sistema de arquivos XFS . . . . . . . . . . . . . . . . . . . . . . 229
21.29Criando um sistema de arquivos FAT ou VFAT . . . . . . . . . . . . . . . . . 230
21.30Criando um sistema de arquivos exFAT . . . . . . . . . . . . . . . . . . . . . 231
21.31Conhecendo melhor o sistema de arquivos Btrfs . . . . . . . . . . . . . . . . . 232
21.31.1 Criando um sistema de arquivos Btrfs . . . . . . . . . . . . . . . . . . 233
21.32Gerenciando Partições com o GNU Parted . . . . . . . . . . . . . . . . . . . 233
21.33Selecionando discos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
21.34Obtendo informações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
21.35Criando uma tabela de partição em um disco vazio . . . . . . . . . . . . . . . 236
21.36Criando uma partição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
21.37Removendo uma partição . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
21.38Recuperando partições . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
21.39Criando partições de troca . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
21.40Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
21.41Tavez isso possa te ajudar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240

22 104.2: Manutenção da integridade dos sistemas de arquivos 241


22.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
22.2 Verificando o uso de disco . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
22.3 Em busca de espaço livre . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
22.4 Manutenção de sistemas de arquivos ext2, ext3 e ext4 . . . . . . . . . . . . . 247
22.5 Ajustando um sistema de arquivos ext . . . . . . . . . . . . . . . . . . . . . . 249
22.6 Manutenção de sistema de arquivos XFS . . . . . . . . . . . . . . . . . . . . 251
22.7 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
10 Sumário
Fabio Gonçalves De Melo Santana / [email protected]

22.8 Tavez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253

23 104.3: Controlar a montagem e desmontagem dos sistema de arquivos 254

24 Introdução 255
24.1 Montando e desmontando sistemas de arquivos . . . . . . . . . . . . . . . . . 255
24.2 Listando sistemas de arquivos montados . . . . . . . . . . . . . . . . . . . . 256
24.3 Parâmetros adicionais da linha de comando . . . . . . . . . . . . . . . . . . . 257
24.4 Como lidar com arquivos abertos . . . . . . . . . . . . . . . . . . . . . . . . 257
24.5 Onde montar? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
24.6 Montagem de sistemas de arquivos na inicialização . . . . . . . . . . . . . . . 258
24.7 Usando UUIDs e rótulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
24.8 Montando discos com Systemd . . . . . . . . . . . . . . . . . . . . . . . . . 261
24.9 Montagem automática de uma unidade de montagem . . . . . . . . . . . . . 263
24.10Tavez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264

25 104.5: Gerenciar permissões e propriedade de arquivos 265


25.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
25.2 Consulta de informações sobre arquivos e diretórios . . . . . . . . . . . . . . . 265
25.2.1 E quanto aos diretórios? . . . . . . . . . . . . . . . . . . . . . . . . . 266
25.3 Exibindo arquivos ocultos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
25.4 Entendendo os tipos de arquivos . . . . . . . . . . . . . . . . . . . . . . . . . 268
25.5 Entendendo as permissões . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
25.6 Permissões de arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
25.7 Permissões em diretórios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
25.8 Modificando as permissões de arquivos . . . . . . . . . . . . . . . . . . . . . 270
25.9 Modo simbólico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
25.10Modo octal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
25.11Modificando o proprietário de um arquivo . . . . . . . . . . . . . . . . . . . . 274
25.12Consultando os grupos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
25.13Permissões padrão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
25.14Permissões especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
25.15Sticky Bit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
25.15.1 Set GID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
25.16Set UID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
25.17Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
25.17.1 Tavez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . 282

26 104.6: Criar e alterar links simbólicos e hardlinks 283


26.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
26.2 Arquivos temporários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
26.3 Localização dos arquivos temporários . . . . . . . . . . . . . . . . . . . . . . 283
11 Sumário
Fabio Gonçalves De Melo Santana / [email protected]

26.4 Permissões em arquivos temporários . . . . . . . . . . . . . . . . . . . . . . . 284


26.5 Compreendendo os links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
26.6 Links simbólicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
26.7 Links físicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
26.8 Trabalhando com links físicos . . . . . . . . . . . . . . . . . . . . . . . . . . 286
26.8.1 Criando links físicos . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
26.8.2 Gerenciando os links físicos . . . . . . . . . . . . . . . . . . . . . . . 286
26.8.3 Movendo e removendo links físicos . . . . . . . . . . . . . . . . . . . 287
26.9 Links simbólicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
26.9.1 Criando links simbólicos . . . . . . . . . . . . . . . . . . . . . . . . . 287
26.9.2 Gerenciando links simbólicos . . . . . . . . . . . . . . . . . . . . . . . 288
26.9.3 Movendo e removendo links simbólicos . . . . . . . . . . . . . . . . . 288
26.10Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
26.11Tavez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290

27 104.7: Encontrar arquivos de sistema e conhecer sua localização correta 291


27.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291

28 O Filesystem Hierarchy Standard 292


28.1 Busca de arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
28.2 Buscando por atributos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
28.3 Busca por tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
28.4 Usando locate e updatedb . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
28.4.1 Controlando o comportamento de updatedb . . . . . . . . . . . . . . 298
28.5 Encontrando binários, páginas de manual e código-fonte . . . . . . . . . . . . 298
28.6 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
28.7 Tavez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301

29 105.1 Personalizar e usar o ambiente do shell 302


29.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
29.2 Tipos de shell: Interativo x Não-interativo e Login vs sem login . . . . . . . . 302
29.3 Abrindo um terminal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
29.4 Lançando shells com o bash . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
29.5 Iniciando shells com su e sudo . . . . . . . . . . . . . . . . . . . . . . . . . . 304
29.6 Qual o meu tipo de shell? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
29.7 Quantos shells nós temos? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
29.8 De onde os shells obtêm sua configuração: arquivos de inicialização . . . . . . 306
29.8.1 Shell de login interativo . . . . . . . . . . . . . . . . . . . . . . . . . 306
29.8.2 Explorando os arquivos de configuração do shell de login interativo . . 307
29.8.3 Shell interativo sem login . . . . . . . . . . . . . . . . . . . . . . . . 308
29.8.4 Explorando arquivos de configuração de shell interativo sem login . . . 308
29.8.5 Shell de login não interativo . . . . . . . . . . . . . . . . . . . . . . . 308
12 Sumário
Fabio Gonçalves De Melo Santana / [email protected]

29.8.6 Shell não-interativo sem login . . . . . . . . . . . . . . . . . . . . . . 310


29.9 A origem dos arquivos de inicialização do shell: SKEL . . . . . . . . . . . . . 310
29.10Variáveis: atribuição e referência . . . . . . . . . . . . . . . . . . . . . . . . 312
29.11Nomes de variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
29.12Valores das variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
29.13Variáveis locais ou do Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
29.14Variáveis globais ou de ambiente . . . . . . . . . . . . . . . . . . . . . . . . 319
29.15Variáveis de ambiente comuns . . . . . . . . . . . . . . . . . . . . . . . . . . 321
29.16Criando aliases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
29.17Expansão e avaliação de aspas em aliases . . . . . . . . . . . . . . . . . . . . 329
29.18Persistência de aliases: scripts de inicialização . . . . . . . . . . . . . . . . . 330
29.19Variáveis integradas especiais do Bash . . . . . . . . . . . . . . . . . . . . . . 330
29.20Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333

30 105.2 Personalizar ou criar scripts simples 334


30.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
30.2 Executando o script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
30.3 Usando os números . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
30.4 Usando a estrutura se . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
30.5 A variável $? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
30.6 O comando test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
30.6.1 Testando strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
30.6.2 Testando expressões matemáticas . . . . . . . . . . . . . . . . . . . . 338
30.6.3 Testando expressões em arquivos . . . . . . . . . . . . . . . . . . . . 338
30.7 Usando a estrutura se . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
30.8 Utilizando a estrutura if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
30.9 Exemplos de script com IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
30.9.1 Exemplo 1: Verifica se um determinado usuário está logado no sistema: 339
30.9.2 Exemplo 2: Pesquisa uma palavra dentro de um arquivo: . . . . . . . . 340
30.10Utilizando a estrutura case . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
30.10.1 Exemplo 1: Executar comandos dependendo do usuário digitado: . . . 340
30.10.2 Exemplo 2: Script que exibe informações do sistema: . . . . . . . . . . 340
30.10.3 Exemplo 1: Verificar se um site está no ar: . . . . . . . . . . . . . . . 341
30.10.4 Exemplo 2: Cria quantos arquivos você indicar com uma determinada
extensão: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
30.11Utilizando a estrutura for . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
30.11.1 Exemplo 1: Compactar todos os arquivos do diretório atual: . . . . . . 342
30.11.2 Exemplo 2: Apaga todos os arquivos de uma determinada extensão: . . 342
30.12Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343

31 106.1_Instalar_e_configurar_o_X11/ 344
13 Sumário
Fabio Gonçalves De Melo Santana / [email protected]

31.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344


31.2 A arquitetura do X Window System . . . . . . . . . . . . . . . . . . . . . . . 344
31.3 Configuração do servidor X . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
31.4 Criando um arquivo de configuração básico do Xorg . . . . . . . . . . . . . . 351
31.5 Wayland . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
31.6 Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353

32 106.2_Areas_de_trabalho_graficas/ 354
32.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
32.2 X Window System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
32.3 Ambiente de trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
32.4 Aplicativos relacionados ao sistema . . . . . . . . . . . . . . . . . . . . . . . 356
32.5 Ambientes de trabalho populares . . . . . . . . . . . . . . . . . . . . . . . . 356
32.6 Interoperabilidade da área de trabalho . . . . . . . . . . . . . . . . . . . . . . 358
32.7 Acesso não-local . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358

33 106.3 Acessibilidade 361


33.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
33.2 Configurações de acessibilidade . . . . . . . . . . . . . . . . . . . . . . . . . 361
33.3 Assistente de teclado e mouse . . . . . . . . . . . . . . . . . . . . . . . . . . 362
33.4 Deficiências visuais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
33.5 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
33.6 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
33.7 Adicionando contas de usuário . . . . . . . . . . . . . . . . . . . . . . . . . . 366
33.8 Modificando contas de usuário . . . . . . . . . . . . . . . . . . . . . . . . . . 367
33.9 Excluindo contas de usuário . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
33.10Adicionando, modificando e excluindo grupos . . . . . . . . . . . . . . . . . . 369
33.11O diretório de esqueleto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
33.12O arquivo /etc/login.defs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
33.13O comando passwd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
33.14O comando chage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
33.15/etc/passwd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
33.16/etc/group . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
33.17/etc/shadow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
33.18/etc/gshadow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
33.19Como filtrar os bancos de dados de senha e grupo . . . . . . . . . . . . . . . 374
33.20Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375

34 107.2 Automatizar tarefas de administração do sistema agendando trabalhos376


34.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
34.2 Como agendar jobs com o cron . . . . . . . . . . . . . . . . . . . . . . . . . 376
34.3 Crontabs de usuário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
14 Sumário
Fabio Gonçalves De Melo Santana / [email protected]

34.4 Crontabs de sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378


34.5 Especificações de tempo particulares . . . . . . . . . . . . . . . . . . . . . . 378
34.6 Variáveis no crontab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
34.7 Criando cron jobs de usuário . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
34.8 Criando cron jobs do sistema . . . . . . . . . . . . . . . . . . . . . . . . . . 380
34.9 Configurando o acesso ao agendamento de trabalhos . . . . . . . . . . . . . . 381
34.10Uma alternativa ao cron . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
34.11Agendamento de trabalhos com at . . . . . . . . . . . . . . . . . . . . . . . 383
34.12Listar jobs programados com atq . . . . . . . . . . . . . . . . . . . . . . . . 384
34.13Excluir jobs com atrm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
34.14Configurando o acesso ao agendamento de trabalhos . . . . . . . . . . . . . . 385
34.15Especificações de tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
34.16Uma alternativa ao at . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385

35 107.3 Localização e internacionalização 387


35.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
35.2 Fusos horários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
35.3 Horário de verão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
35.4 Idioma e codificação de caracteres . . . . . . . . . . . . . . . . . . . . . . . . 392
35.5 Conversão de codificação . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
35.6 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
35.7 Hora local e hora universal . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
35.8 Date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
35.9 Relógio do hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
35.10timedatectl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
35.11Configurando a hora com timedatectl . . . . . . . . . . . . . . . . . . . . . . 399
35.12Definindo o fuso horário com timedatectl . . . . . . . . . . . . . . . . . . . . 399
35.13Desativando o NTP com timedatectl . . . . . . . . . . . . . . . . . . . . . . 400
35.14Definindo o fuso horário sem timedatectl . . . . . . . . . . . . . . . . . . . . 400

36 Configurando data e hora sem timedatectl 402


36.1 Usando date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
36.2 Usando hwclock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
36.3 timedatectl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
36.4 Daemon NTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
36.5 ntpdate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
36.6 ntpq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
36.7 chrony . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407

37 108.2 Registro de eventos do sistema 411


37.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
37.2 Logs do sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
15 Sumário
Fabio Gonçalves De Melo Santana / [email protected]

37.3 Tipos de log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412


37.4 Lendo logs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
37.5 Como as mensagens são transformadas em logs . . . . . . . . . . . . . . . . . 416
37.6 Recursos, prioridades e ações . . . . . . . . . . . . . . . . . . . . . . . . . . 417
37.7 O mecanismo de rotação do log . . . . . . . . . . . . . . . . . . . . . . . . . 420
37.8 O diário do sistema: systemd-journald . . . . . . . . . . . . . . . . . . . . . . 423
37.9 Consultando o conteúdo do diário . . . . . . . . . . . . . . . . . . . . . . . . 423
37.9.1 Navegando e pesquisando no diário . . . . . . . . . . . . . . . . . . . 425
37.10Filtrando os dados do diário . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
37.10.1 1. Número de inicialização: . . . . . . . . . . . . . . . . . . . . . . . 426
37.10.2 2. Prioridade: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
37.10.3 3. Intervalo de tempo: . . . . . . . . . . . . . . . . . . . . . . . . . . 427
37.11Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428

38 108.3 Noções básicas do Mail Transfer Agent MTA 429


38.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
38.2 MTA local e remoto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
38.3 MTAs do Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
38.4 O comando mail e Mail User Agents (MUA) . . . . . . . . . . . . . . . . . . 436
38.5 Entrega personalizada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437

39 108.4 Gerenciamento de impressoras e impressão 441


39.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
39.2 O serviço CUPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
39.3 Usando a interface web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
39.4 Instalando uma impressora . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
39.5 Talvez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446

40 Introdução 447
40.1 IP (Internet Protocol) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
40.2 Classes de endereço . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
40.3 IPs públicos e privados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
40.4 Convertendo o formato decimal em binário . . . . . . . . . . . . . . . . . . . 448
40.5 Convertendo o formato binário em decimal . . . . . . . . . . . . . . . . . . . 450
40.6 Netmask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
40.7 Identificando os endereços de rede e de transmissão . . . . . . . . . . . . . . 453
40.8 Rota padrão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
40.9 Portas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
40.10Transmission Control Protocol (TCP) . . . . . . . . . . . . . . . . . . . . . . 456
40.11User Datagram Protocol (UDP) . . . . . . . . . . . . . . . . . . . . . . . . . 456
40.12Internet Control Message Protocol (ICMP) . . . . . . . . . . . . . . . . . . . 456
40.13IPv6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
16 Sumário
Fabio Gonçalves De Melo Santana / [email protected]

40.14Abreviações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
40.15Tipos de endereço IPv6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
40.16Diferenças entre IPv4 e IPv6 . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
40.17Talves isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459

41 109.2 Configuração de rede persistente 461

42 Introdução 462
42.1 A Interface de Rede . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
42.2 Nomes de interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
42.3 Gerenciamento da interface . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
42.4 Nomes locais e remotos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466

43 109.3 Resolução de problemas básicos de rede 471

44 Introdução 472
44.1 Sobre o comando ip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
44.2 Máscara de rede e revisão de roteamento . . . . . . . . . . . . . . . . . . . . 473
44.3 Configurando uma interface . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
44.4 Configurando opções de baixo nível . . . . . . . . . . . . . . . . . . . . . . . 476
44.5 A tabela de roteamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
44.5.1 Exemplo de IPv4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
44.5.2 Exemplo de IPv6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
44.6 Gerenciando as rotas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
44.7 Testando conexões com ping . . . . . . . . . . . . . . . . . . . . . . . . . . 479
44.8 Traçando Rotas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
44.9 Encontrando MTUs com tracepath . . . . . . . . . . . . . . . . . . . . . . . 482
44.10Criando Conexões Arbitrárias . . . . . . . . . . . . . . . . . . . . . . . . . . 483
44.11Visualizando conexões atuais e listeners . . . . . . . . . . . . . . . . . . . . . 484
44.12Tavez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486

45 109.4 Configurar o DNS do lado do cliente 487

46 Introdução 488
46.1 O processo de resolução de nome . . . . . . . . . . . . . . . . . . . . . . . . 488
46.2 Classes DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
46.3 Entendendo /etc/nsswitch.conf . . . . . . . . . . . . . . . . . . . . . . . . . 489
46.4 O arquivo /etc/resolv.conf . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
46.5 O arquivo /etc/hosts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
46.6 systemd-resolved . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
46.7 Ferramentas de resolução de nomes . . . . . . . . . . . . . . . . . . . . . . . 492
46.8 O comando getent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
17 Sumário
Fabio Gonçalves De Melo Santana / [email protected]

46.9 O comando host . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493


46.10O comando dig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
46.11Tavez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497

47 Introdução 499
47.1 Verificando Arquivos com SUID e SGID . . . . . . . . . . . . . . . . . . . . . 499
47.2 Gerenciamento e validade das senhas . . . . . . . . . . . . . . . . . . . . . . 502
47.3 Descobrindo portas abertas . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
47.4 Limites em logins de usuário, processos e uso de memória . . . . . . . . . . . 510
47.5 Lidando com usuários conectados . . . . . . . . . . . . . . . . . . . . . . . . 513
47.6 Configuração e uso básicos do sudo . . . . . . . . . . . . . . . . . . . . . . . 515
47.7 O arquivo /etc/sudoers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
47.8 Tavez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519

48 110.2 Configurar a segurança do host 521


48.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
48.2 Melhorar a segurança da autenticação com senhas ocultas . . . . . . . . . . . 521
48.3 Como usar um superdaemon para ouvir conexões de rede de entrada . . . . . 523
48.4 Em busca de daemons desnecessários nos serviços . . . . . . . . . . . . . . . 527
48.5 Usando TCP wrappers como uma espécie de firewall simples . . . . . . . . . . 529
48.6 Tavez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530

49 110.3 Proteção de dados com criptografia 531

50 Introdução 532
50.1 Visão geral do SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
50.2 Como funciona o SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
50.3 Como o SSH autentica usuários . . . . . . . . . . . . . . . . . . . . . . . . . 533
50.4 Gerando um par de chaves SSH . . . . . . . . . . . . . . . . . . . . . . . . . 534
50.5 Gerando um par de chaves SSH com um número maior de bits . . . . . . . . . 535
50.6 Removendo ou Alterando a Senha em uma Chave Privada . . . . . . . . . . . 535
50.7 Exibindo a impressão digital da chave SSH . . . . . . . . . . . . . . . . . . . 536
50.8 Copiando sua chave SSH pública para um servidor com SSH-Copy-ID . . . . . 537
50.9 Copiando sua chave SSH pública para um servidor sem SSH-Copy-ID . . . . . 538
50.10Copiando sua chave SSH pública para um servidor manualmente . . . . . . . . 538
50.11Instruções básicas de conexão . . . . . . . . . . . . . . . . . . . . . . . . . . 539
50.12Conectando-se a um servidor remoto . . . . . . . . . . . . . . . . . . . . . . 539
50.13Executando um único comando em um servidor remoto . . . . . . . . . . . . 540
50.14Login em um servidor com uma porta diferente . . . . . . . . . . . . . . . . . 540
50.15Adicionando suas chaves SSH a um agente SSH para evitar digitar a frase secreta541
50.16Encaminhando suas credenciais SSH para uso em um servidor . . . . . . . . . 542
50.17Opções de configuração do lado do servidor . . . . . . . . . . . . . . . . . . . 542
18 Sumário
Fabio Gonçalves De Melo Santana / [email protected]

50.17.1 Desativando autenticação de senha . . . . . . . . . . . . . . . . . . . 543


50.18Alterando a porta em que o SSH Daemon é executado . . . . . . . . . . . . . 543
50.19Limitando os usuários que podem se conectar por meio de SSH . . . . . . . . 544
50.20Túneis de porta SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
50.21Túnel de porta local . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
50.22Túnel de porta remota . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
50.23Túneis X11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
50.24GPG, ou GNU Privacy Guard . . . . . . . . . . . . . . . . . . . . . . . . . . 548
50.25Como funciona a criptografia de chave pública . . . . . . . . . . . . . . . . . 548
50.25.1 Certifique-se de que apenas a parte pretendida pode ler . . . . . . . . 548
50.25.2 Validar a identidade do remetente . . . . . . . . . . . . . . . . . . . . 548
50.26Configurar Chaves GPG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
50.27Criar um certificado de revogação . . . . . . . . . . . . . . . . . . . . . . . . 549
50.28Como importar chaves públicas de outros usuários . . . . . . . . . . . . . . . 550
50.29Como verificar e assinar chaves . . . . . . . . . . . . . . . . . . . . . . . . . 551
50.29.1 Verifique a identidade da outra pessoa . . . . . . . . . . . . . . . . . 551
50.30Assine a chave deles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552
50.31Como tornar sua chave pública altamente disponível . . . . . . . . . . . . . . 553
50.32Criptografar e descriptografar mensagens com GPG . . . . . . . . . . . . . . . 554
50.32.1 Criptografar mensagens . . . . . . . . . . . . . . . . . . . . . . . . . 554
50.32.2 Descriptografar mensagens . . . . . . . . . . . . . . . . . . . . . . . 555
50.33Manutenção Chave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
50.34Tavez isso possa te ajudar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
Fabio Gonçalves De Melo Santana / [email protected]

1
101.1 Determinar e definir
configurações de hardware

Introdução
Desde os primórdios da computação, os fabricantes de computadores vêm integrando uma série
de peças de hardware em suas máquinas. Essas peças, por sua vez, devem ser suportadas pelo
sistema operacional. Por isso, é preciso que existam padrões estabelecidos para os conjuntos de
instruções e a comunicação dos dispositivos. Esses padrões facilitam a criação e a manutenção
de um sistema operacional não vinculado a um modelo de hardware específico. Porém, a
complexidade do hardware, às vezes, requer ajustes na maneira como os recursos devem ser
expostos ao sistema operacional, para que ele possa ser instalado e funcionar corretamente.

É possível realizar alguns desses ajustes mesmo sem um sistema operacional instalado. A
maioria das máquinas oferece um utilitário de configuração que pode ser executado quando a
máquina é ligada. Até meados dos anos 2000, o utilitário de configuração era implementado
na BIOS (Basic Input/Output System), o padrão de firmware contendo as rotinas básicas
de configuração para as placas-mãe x86. A partir do final da primeira década dos anos
2000, as máquinas baseadas na arquitetura x86 começaram a substituir a BIOS por uma
nova implementação chamada UEFI (Unified Extensible Firmware Interface), que tem recursos
mais sofisticados para identificação, teste, configuração e atualização de firmware. Apesar da
mudança, não é incomum que se chame o utilitário de configuração de BIOS, já que ambas
as implementações cumprem o mesmo objetivo básico.

19
20 1. 101.1 Determinar e definir configurações de hardware
Fabio Gonçalves De Melo Santana / [email protected]

Ativação do dispositivo
O utilitário de configuração do sistema aparece quando pressionamos uma tecla específica ao
ligar o computador. Essa tecla varia de fabricante para fabricante, mas geralmente é Del
ou uma das teclas de função, como F2 ou F12. A combinação de teclas a ser usada é
frequentemente exibida na tela inicial.

No utilitário de configuração da BIOS, é possível ativar e desativar os periféricos integra-


dos, ativar a proteção básica contra erros e alterar configurações de hardware como o IRQ
(solicitação de interrupção) e o DMA (acesso direto à memória). Nas máquinas modernas,
é raro que seja necessário alterar essas configurações, mas às vezes é preciso fazer ajustes
para solucionar problemas específicos. Algumas CPUs oferecem recursos que às vezes não
são necessários para aquela instalação específica, podendo assim ser desativados. Isso reduz
o consumo de energia e contribui para aumentar a proteção do sistema, já que os recursos da
CPU que contenham bugs conhecidos também podem ser desativados.

Se a máquina estiver equipada com vários dispositivos de armazenamento, é importante definir


qual deles possui o carregador de inicialização correto e deve ser o primeiro na ordem de
inicialização do dispositivo. O sistema operacional pode não carregar se o dispositivo incorreto
aparecer primeiro na lista de verificações de inicialização da BIOS.

Inspeção de dispositivos no Linux


Uma vez que os dispositivos são corretamente identificados, cabe ao sistema operacional
associar os componentes de software correspondentes exigidos por eles. Quando um recurso
de hardware não está funcionando como esperado, é importante identificar onde exatamente
está o problema. Quando uma peça de hardware não é detectada pelo sistema operacional,
é mais provável que o defeito esteja na peça ou na porta à qual está conectada. Quando
a peça é detectada, mas não funciona corretamente, pode haver um problema no lado do
sistema operacional. Portanto, uma das primeiras etapas ao lidar com problemas relacionados
a hardware é verificar se o sistema operacional está detectando corretamente o dispositivo.
Existem duas maneiras básicas de identificar recursos de hardware em um sistema Linux: usar
comandos especializados ou consultar arquivos específicos em sistemas de arquivos especiais.

Comandos para inspeção


Os dois comandos chaves para identificar dispositivos conectados em um sistema Linux são:

• lspci: Mostra todos os dispositivos atualmente conectados ao barramento PCI (Periph-


eral Component Interconnect). Os dispositivos PCI podem ser um componente conec-
tado à placa-mãe, como um controlador de disco, ou uma placa de expansão instalada
21 1. 101.1 Determinar e definir configurações de hardware
Fabio Gonçalves De Melo Santana / [email protected]

em um slot PCI, como uma placa de vídeo externa.


• lsusb: Lista os dispositivos USB (Universal Serial Bus) atualmente conectados à máquina.
Embora existam dispositivos USB para praticamente qualquer finalidade imaginável, a
interface USB é amplamente usada para conectar dispositivos de entrada, dispositivos
apontadores e mídias de armazenamento removíveis.

A saída dos comandos lspci e lsusb consiste em uma lista de todos os dispositivos PCI e USB
identificados pelo sistema operacional. No entanto, o dispositivo pode não estar totalmente
operacional ainda, porque cada peça de hardware requer um componente de software para
controlar o dispositivo correspondente. Esse componente de software é chamado de módulo
do kernel e pode fazer parte do kernel oficial do Linux ou ser adicionado separadamente. Os
módulos do kernel do Linux relacionados a dispositivos de hardware também são chamados
de drivers, como em outros sistemas operacionais. Os drivers para Linux, no entanto, nem
sempre são fornecidos pelo fabricante do dispositivo. Enquanto alguns fabricantes fornecem
seus próprios drivers binários para serem instalados separadamente, muitos drivers são criados
por desenvolvedores independentes. Historicamente, dispositivos que funcionam no Windows,
por exemplo, podem não ter um módulo de kernel equivalente para Linux. Atualmente, os
sistemas operacionais baseados em Linux têm um forte suporte de hardware e a maioria dos
dispositivos funciona sem dar trabalho.

Os comandos diretamente relacionados ao hardware geralmente requerem privilégios de root


para serem executados, exibindo apenas informações limitadas quando executados por um
usuário normal; portanto, pode ser necessário fazer login como root ou executar o comando
com sudo. A seguinte saída do comando lspci, por exemplo, mostra alguns dispositivos iden-
tificados:

root@debian10:/home/debian# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:02.0 VGA compatible controller: VMware SVGA II Adapter
00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02)
00:04.0 System peripheral: InnoTek Systemberatung GmbH VirtualBox Guest Service
00:05.0 Multimedia audio controller: Intel Corporation 82801AA AC'97 Audio Controller (rev
01)
00:06.0 USB controller: Apple Inc. KeyLargo/Intrepid USB
00:07.0 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
00:0d.0 SATA controller: Intel Corporation 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [
AHCI mode] (rev 02)

A saída desses comandos pode ter dezenas de linhas, de forma que o exemplo anterior e o
seguinte incluem apenas as partes que nos interessam. Os números hexadecimais no início
de cada linha são o endereço exclusivo do dispositivo PCI correspondente. O comando lspci
mostra mais detalhes sobre um dispositivo específico se seu endereço for fornecido com a
22 1. 101.1 Determinar e definir configurações de hardware
Fabio Gonçalves De Melo Santana / [email protected]

opção -s, acompanhada da opção -v:

root@debian10:/home/debian# lspci -s 00:06.0 -v


00:06.0 USB controller: Apple Inc. KeyLargo/Intrepid USB (prog-if 10 [OHCI])
Flags: bus master, fast devsel, latency 64, IRQ 22
Memory at f0804000 (32-bit, non-prefetchable) [size=4K]
Kernel driver in use: ohci-pci
Kernel modules: ohci_pci

A saída agora mostra muito mais detalhes sobre o dispositivo no endereço 00:06.0.

De todas as informações coletadas, é correto supor que:

1. O dispositivo foi identificado;


2. Um módulo do kernel correspondente foi carregado;
3. O dispositivo deve estar pronto para uso.

Outra maneira de verificar qual módulo do kernel está sendo usado para o dispositivo especi-
ficado seria usar a opção -k, disponível nas versões mais recentes do lspci:

root@debian10:/home/debian# lspci -s 00:06.0 -k


00:06.0 USB controller: Apple Inc. KeyLargo/Intrepid USB
Kernel driver in use: ohci-pci
Kernel modules: ohci_pci

O comando lsusb é semelhante a lspci, mas lista exclusivamente as informações relativas à


USB:

root@debian10:/home/debian# lsusb
Bus 001 Device 002: ID 80ee:0021 VirtualBox USB Tablet
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

O comando lsusb mostra os canais USB disponíveis e os dispositivos conectados a eles. Como
no caso do lspci, a opção -v exibe uma saída mais detalhada. Um dispositivo específico pode
ser selecionado para inspeção, bastando fornecer seu ID com a opção -d:

root@debian10:/home/debian# lsusb -v -d 80ee:0021

Bus 001 Device 002: ID 80ee:0021 VirtualBox USB Tablet


Device Descriptor:
bLength 18
bDescriptorType 1
23 1. 101.1 Determinar e definir configurações de hardware
Fabio Gonçalves De Melo Santana / [email protected]

bcdUSB 1.10
bDeviceClass 0
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x80ee VirtualBox
idProduct 0x0021 USB Tablet
bcdDevice 1.00
iManufacturer 1 VirtualBox
iProduct 3 USB Tablet
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x0022
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.10
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 85
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 10
can't get debug descriptor: Resource temporarily unavailable
Device Status: 0x0000
(Bus Powered)

Com a opção -t, o comando lsusb mostra os mapeamentos do dispositivo USB atual na forma
de árvore hierárquica:
24 1. 101.1 Determinar e definir configurações de hardware
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# lsusb -t
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/12p, 12M
|__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M

É possível que nem todos os dispositivos tenham um módulo correspondente associado. A


comunicação com determinados dispositivos pode ser feita diretamente pelo aplicativo, sem
a intermediação de um módulo. Ainda assim, existem informações importantes na saída de
lsusb -t. Quando existe um módulo correspondente, seu nome aparece no final da linha do
dispositivo, como em Driver=usbhid. O dispositivo Class identifica a categoria geral, como
Human Interface Device, Wireless, Vendor Specific Class, Mass Storage, dentre outros. Para
verificar qual dispositivo está usando o módulo btusb, presente na lista anterior, os números
de Bus e Dev devem ser fornecidos à opção -s do comando lsusb:

root@debian10:/home/debian# lsusb -s 01:2


Bus 001 Device 002: ID 80ee:0021 VirtualBox USB Tablet

É comum que haja um grande conjunto de módulos de kernel carregados em um sistema


Linux padrão a qualquer momento. Para interagir com eles, o melhor jeito é usar os comandos
fornecidos pelo pacote kmod, um conjunto de ferramentas para realizar tarefas comuns com
os módulos do kernel Linux, como inserir, remover, listar, verificar propriedades, resolver
dependências e aliases. O comando lsmod, por exemplo, mostra todos os módulos carregados
no momento:

root@debian10:/home/debian# lsmod
Module Size Used by
binfmt_misc 20480 1
fuse 122880 3
vboxvideo 49152 0
rfkill 28672 3
crct10dif_pclmul 16384 0
crc32_pclmul 16384 0
ghash_clmulni_intel 16384 0
intel_rapl_perf 16384 0
snd_intel8x0 45056 3
snd_ac97_codec 147456 1 snd_intel8x0
joydev 24576 0
ac97_bus 16384 1 snd_ac97_codec
snd_pcm 114688 2 snd_intel8x0,snd_ac97_codec
pcspkr 16384 0
serio_raw 16384 0
snd_timer 36864 1 snd_pcm
vboxguest 352256 6
snd 94208 10 snd_intel8x0,snd_timer,snd_ac97_codec,snd_pcm
sg 36864 0
soundcore 16384 1 snd
battery 20480 0
25 1. 101.1 Determinar e definir configurações de hardware
Fabio Gonçalves De Melo Santana / [email protected]

ac 16384 0
evdev 28672 10
ip_tables 28672 0
x_tables 45056 1 ip_tables
autofs4 49152 2
ext4 745472 5
crc16 16384 1 ext4
mbcache 16384 1 ext4
jbd2 122880 1 ext4

A saída do comando lsmod é dividida em três colunas:

• Module: Nome do módulo;


• Size: Quantidade de RAM utilizada pelo módulo, em bytes;
• Used by: Módulos dependentes.

Alguns módulos exigem que outros módulos funcionem corretamente, como é o caso dos
módulos para dispositivos de áudio:

root@debian10:/home/debian# lsmod | fgrep -i snd


snd_intel8x0 45056 3
snd_ac97_codec 147456 1 snd_intel8x0
ac97_bus 16384 1 snd_ac97_codec
snd_pcm 114688 2 snd_intel8x0,snd_ac97_codec
snd_timer 36864 1 snd_pcm
snd 94208 10 snd_intel8x0,snd_timer,snd_ac97_codec,snd_pcm
soundcore 16384 1 snd

A terceira coluna, Used by, mostra os módulos que exigem que o módulo na primeira coluna
funcione corretamente. Muitos módulos da arquitetura de som do Linux, prefixados por snd,
são interdependentes. Ao procurar por problemas durante um diagnóstico do sistema, pode
ser útil descarregar módulos específicos atualmente carregados. O comando modprobe pode
ser usado para carregar e descarregar módulos do kernel: para descarregar um módulo e seus
módulos relacionados, desde que não estejam sendo usados por um processo em execução, use
o comando modprobe -r. Por exemplo, para descarregar o módulo snd_intel8x0 (o módulo
para um dispositivo de áudio HDA Intel) e outros módulos relacionados ao sistema de som:

root@debian10:/home/debian# modprobe -r snd_intel8x0

Usando o nome do módulo como único argumento, o comando modinfo mostra uma descrição,
o arquivo, o autor, a licença, a identificação, as dependências e os parâmetros disponíveis para
o módulo fornecido. Para que os parâmetros personalizados de um módulo se tornem persis-
tentes, inclua-os no arquivo /etc/modprobe.conf ou em arquivos individuais com a extensão
26 1. 101.1 Determinar e definir configurações de hardware
Fabio Gonçalves De Melo Santana / [email protected]

.conf no diretório /etc/modprobe.d/. A opção -p fará com que o comando modinfo exiba
todos os parâmetros disponíveis e ignore as outras informações:

root@debian10:/home/debian# modinfo -p nouveau


vram_pushbuf:Create DMA push buffers in VRAM (int)
tv_norm:Default TV norm.
Supported: PAL, PAL-M, PAL-N, PAL-Nc, NTSC-M, NTSC-J,
hd480i, hd480p, hd576i, hd576p, hd720p, hd1080i.
Default: PAL
*NOTE* Ignored for cards with external TV encoders. (charp)
nofbaccel:Disable fbcon acceleration (int)
fbcon_bpp:fbcon bits-per-pixel (default: auto) (int)
mst:Enable DisplayPort multi-stream (default: enabled) (int)
tv_disable:Disable TV-out detection (int)
ignorelid:Ignore ACPI lid status (int)
duallink:Allow dual-link TMDS (default: enabled) (int)
hdmimhz:Force a maximum HDMI pixel clock (in MHz) (int)
config:option string to pass to driver core (charp)
debug:debug string to pass to driver core (charp)
noaccel:disable kernel/abi16 acceleration (int)
modeset:enable driver (default: auto, 0 = disabled, 1 = enabled, 2 = headless) (int)
atomic:Expose atomic ioctl (default: disabled) (int)
runpm:disable (0), force enable (1), optimus only default (-1) (int)

Se um módulo estiver causando problemas, o arquivo /etc/modprobe.d/blacklist.conf pode


ser usado. Por exemplo, para impedir o carregamento automático do módulo nouveau, a linha
blacklist nouveau deve ser adicionada ao arquivo /etc/modprobe.d/blacklist.conf. Essa ação
é necessária quando o módulo proprietário nvidia é instalado e o módulo padrão nouveau deve
ser posto de lado.

É possível modificar o arquivo /etc/modprobe.d/blacklist.conf que já existe no sistema


por padrão. Porém, a melhor opção é criar um arquivo de configuração separado,
/etc/modprobe.d/.conf, contendo ajustes específicos àquele módulo do kernel em
particular.

Arquivos de informação e de dispositivo


Os comandos lspci, lsusb e lsmod atuam como front-ends para ler as informações de hard-
ware armazenadas pelo sistema operacional. Este tipo de informação é mantido em arquivos
especiais nos diretórios /proc e /sys. Esses diretórios são pontos de montagem para sistemas
de arquivos que não estão presentes em uma partição de dispositivo, mas somente no espaço
de RAM usado pelo kernel para armazenar a configuração do tempo de execução e informações
sobre os processos em execução. Esses sistemas de arquivos não se destinam ao armazena-
mento convencional de arquivos e, portanto, são chamados de pseudosistemas de arquivos e
existem apenas enquanto o sistema estiver em execução. O diretório /proc contém arquivos
27 1. 101.1 Determinar e definir configurações de hardware
Fabio Gonçalves De Melo Santana / [email protected]

com informações sobre processos em execução e recursos de hardware. Alguns dos arquivos
importantes em /proc para a inspeção de hardware são:

• /proc/cpuinfo: Lista informações detalhadas sobre a(s) CPU(s) encontradas pelo sis-
tema operacional;
• /proc/interrupts: Uma lista de números de interrupções por dispositivo de entrada e
saída em cada CPU;
• /proc/ioports: Lista as regiões de portas de Entrada/Saída registradas atualmente e
em uso;
• /proc/dma: Lista os canais registrados de DMA (acesso direto à memória) em uso.

Os arquivos dentro do diretório /sys têm funções semelhantes às do /proc. No entanto,


o diretório /sys tem o objetivo específico de armazenar informações do dispositivo e dados
do kernel relacionados ao hardware, ao passo que /proc também contém informações sobre
diversas estruturas de dados do kernel, incluindo processos em execução e configurações.

Outro diretório diretamente relacionado aos dispositivos em um sistema Linux padrão é o


/dev. Cada arquivo dentro de /dev é associado a um dispositivo do sistema, particularmente
dispositivos de armazenamento. Um disco rígido IDE legado, por exemplo, quando conectado
ao primeiro canal IDE da placa-mãe, é representado pelo arquivo /dev/hda. Cada partição
desse disco será identificada por /dev/hda1, /dev/hda2 e assim por diante, até a última
partição encontrada.

Os dispositivos removíveis são manipulados pelo subsistema udev, que cria os dispositivos
correspondentes em /dev. O kernel do Linux captura o evento de detecção de hardware e o
passa para o processo udev, que por sua vez identifica o dispositivo e cria dinamicamente os
arquivos correspondentes em /dev, usando regras predefinidas.

Nas distribuições Linux atuais, o udev é responsável pela identificação e configuração dos
dispositivos já presentes durante a inicialização da máquina (detecção coldplug) e dos dispos-
itivos identificados enquanto o sistema está em execução (detecção hotplug). O Udev utiliza
o SysFS, o pseudosistema de arquivos montado em /sys para informações relacionadas ao
hardware.

À medida que novos dispositivos são detectados, o udev pesquisa uma regra correspondente nas
regras predefinidas armazenadas no diretório /etc/udev/rules.d/. As regras mais importantes
são fornecidas pela distribuição, mas é possível adicionar novas para casos específicos.

Dispositivos de armazenamento
No Linux, os dispositivos de armazenamento são genericamente chamados de dispositivos de
bloco, porque os dados que contêm são lidos em blocos de dados armazenados em buffer com
28 1. 101.1 Determinar e definir configurações de hardware
Fabio Gonçalves De Melo Santana / [email protected]

diferentes tamanhos e posições. Cada dispositivo de bloco é identificado por um arquivo no


diretório /dev, sendo que o nome do arquivo depende do tipo de dispositivo (IDE, SATA, SCSI,
etc.) e de suas partições. Os dispositivos de CD/DVD e de disquete, por exemplo, receberão
nomes específicos em /dev: uma unidade de CD/DVD conectada ao segundo canal IDE será
identificada como /dev/hdc (/dev/hda e /dev/hdb são reservados para os dispositivos mestre
e escravo no primeiro canal IDE) e uma unidade de disquete antiga será identificada como
/dev/fdO, /dev/fd1, etc.

A partir da versão 2.4 do kernel Linux em diante, a maioria dos dispositivos de armazenamento
passou a ser identificada como dispositivos SCSI, independentemente do tipo de hardware. Os
dispositivos de bloco IDE, SSD e USB são prefixados com sd. Para os discos IDE, o prefixo
sd é usado, mas a terceira letra é escolhida dependendo da unidade ser mestre ou escrava (no
primeiro canal IDE, o mestre será sda e o escravo será sdb). As partições são listadas em
ordem numérica. Os caminhos /dev/sda1, /dev/sda2, etc. são usados para a primeira e
a segunda partições do dispositivo de bloco identificado primeiro e /dev/sdb1, /dev/sdb2,
etc. identificam a primeira e a segunda partições do dispositivo de bloco identificado a seguir.

A exceção a esse padrão ocorre com cartões de memória (cartões SD) e dispositivos NVMe
(SSD conectados ao barramento PCI Express). Para os cartões SD, os caminhos /dev/mm-
cblk0p1, /dev/mmcblk0p2 etc. são usados para a primeira e a segunda partições do dis-
positivo identificado primeiro e /dev/mmcblk1p1, /dev/mmcblk1p2, etc. identificam a
primeira e a segunda partições do dispositivo identificado em segundo lugar. Os dispositivos
NVMe recebem o prefixo nvme, como em /dev/nvme0n1p1 e /dev/nvme0n1p2.
Fabio Gonçalves De Melo Santana / [email protected]

2
Resumo
Esta lição aborda os conceitos gerais de como o kernel do Linux lida com recursos de hardware,
principalmente na arquitetura x86. A lição inclui os seguintes tópicos:

• Como as configurações definidas nos utilitários de configuração da BIOS ou UEFI podem


afetar a interação do sistema operacional com o hardware;
• Como usar as ferramentas fornecidas por um sistema Linux padrão para obter infor-
mações sobre o hardware;
• Como identificar dispositivos de armazenamento permanentes e removíveis no sistema
de arquivos.

Os comandos e procedimentos abordados foram: - Comandos para inspecionar o hardware de-


tectado: lspci e lsusb; - Comandos para gerenciar os módulos do kernel: lsmod e modprobe;
- Arquivos especiais relacionados ao hardware, seja os arquivos encontrados no diretório /dev/
ou nos pseudosistemas de arquivos /proc/ e /sys/.

29
30 2. Resumo
Fabio Gonçalves De Melo Santana / [email protected]

Talvez isso possa te ajudar. . .

Fig. 2.1: PROCSYS

• Fonte: - https://devops-notes.readthedocs.io/en/latest/File-Systems.html
Fabio Gonçalves De Melo Santana / [email protected]

3
Inicialização do Sistema

Introdução
Sabemos que o Kernel e o componente principal do sistema operacional para controlar a
máquina, e sabemos também que o mesmo deve ser carregado por um programa chamado
bootloader (carregador de inicialização), que por sua vez é carregado por um firmware pré-
instalado, como a BIOS ou a UEFI. O carregador de inicialização pode ser personalizado para
passar parâmetros para o kernel, como a partição que contém o sistema de arquivos raiz ou
em qual modo o sistema operacional deve ser executado. Então, uma vez carregado, o kernel
dá seguimento ao processo de inicialização, identificando e configurando o hardware. Por fim,
o kernel chama o utilitário responsável por iniciar e gerenciar os serviços do sistema.

BIOS ou UEFI
A BIOS, abreviação de Basic Input/Output System, é um programa armazenado em um chip
de memória não volátil conectado à placa-mãe, executado sempre que o computador é ligado.
Esse tipo de programa é chamado firmware, e seu local de armazenamento é separado dos
outros dispositivos de armazenamento do sistema. A BIOS pressupõe que os primeiros 440
bytes no primeiro dispositivo de armazenamentosão o primeiro estágio do bootloader (também
chamado de bootstrap). Os primeiros 512 bytes de um dispositivo de armazenamento são o
que se chama de MBR (Master Boot Record) dos dispositivos de armazenamento que usam o
esquema de partição DOS padrão e, além do primeiro estágio do gerenciador de inicialização,
eles contêm a tabela de partições. Se o MBR não contiver os dados corretos, o sistema não

31
32 3. Inicialização do Sistema
Fabio Gonçalves De Melo Santana / [email protected]

poderá inicializar, a menos que um método alternativo seja empregado.

De um modo geral, as etapas pré-operacionais para inicializar um sistema equipado com BIOS
são:

1. O processo POST (power-on self-test) é executado para identificar falhas simples de


hardware assim que a máquina é ligada;
2. A BIOS ativa os componentes básicos para carregar o sistema, como a saída de vídeo,
o teclado e as mídias de armazenamento;
3. A BIOS carrega o primeiro estágio do bootloader a partir do MBR (os primeiros 440
bytes do primeiro dispositivo, conforme definido no utilitário de configuração da BIOS);
4. O primeiro estágio do bootloader chama o segundo estágio, responsável por apresentar
as opções de inicialização e carregar o kernel.

A UEFI, abreviação de Unified Extensible Firmware Interface, difere da BIOS em alguns pontos-
chave. Como a BIOS, a UEFI também é um firmware, mas pode identificar partições e ler
muitos sistemas de arquivos nelas. A UEFI não depende do MBR, levando em consideração
apenas as configurações armazenadas na memória não-volátil (NVRAM) conectada à placa-
mãe. Essas definições indicam a localização dos programas compatíveis com a UEFI, chamados
aplicativos EFI, que serão executados automaticamente ou chamados a partir de um menu de
inicialização. Os aplicativos EFI podem ser carregadores de inicialização, seletores de sistema
operacional, ferramentas para diagnóstico e reparo do sistema etc. Eles devem estar em uma
partição de um dispositivo de armazenamento convencional e em um sistema de arquivos
compatível. Os sistemas de arquivos compatíveis padrão são FAT12, FAT16 e FAT32 para
dispositivos de bloco e ISO-9660 para mídia ótica. Essa abordagem permite a implementação
de ferramentas muito mais sofisticadas do que as que seriam possíveis com a BIOS.

A partição que contém os aplicativos EFI é chamada de Partição de Sistema EFI ou apenas
ESP. Essa partição não deve ser compartilhada com outros sistemas de arquivos do sistema,
como o sistema de arquivos raiz ou os sistemas de arquivos de dados do usuário. O diretório
EFI na partição ESP contém os aplicativos apontados pelas entradas salvas na NVRAM.

De maneira geral, as etapas de inicialização do pré-sistema operacional em um sistema com


UEFI são:

1. O processo POST (power-on self-test) é executado para identificar falhas simples de


hardware assim que a máquina é ligada;
2. A UEFI ativa os componentes básicos para carregar o sistema, como a saída de vídeo,
o teclado e as mídias de armazenamento;
3. O firmware da UEFI lê as definições armazenadas na NVRAM para executar o aplicativo
EFI predefinido armazenado no arquivo de sistemas da partição ESP. Normalmente, o
aplicativo EFI predefinido é um bootloader;
33 3. Inicialização do Sistema
Fabio Gonçalves De Melo Santana / [email protected]

4. Se o aplicativo EFI predefinido for um bootloader, ele carrega o kernel para iniciar o
sistema operacional.

O padrão UEFI também suporta um recurso chamado Inicialização Segura, que permite apenas
a execução de aplicativos EFI assinados, ou seja, aplicativos EFI autorizados pelo fabricante
do hardware. Esse recurso aumenta a proteção contra software malicioso, mas pode dificultar
a instalação de sistemas operacionais não cobertos pela garantia do fabricante.

O bootloader
O carregador de inicialização mais popular para Linux na arquitetura x86 é o GRUB (Grand
Unified Bootloader). Assim que é chamado pela BIOS ou pela UEFI, o GRUB exibe uma
lista de sistemas operacionais disponíveis para inicialização. Às vezes, a lista não aparece
automaticamente, mas ela pode ser invocada pressionando Shift enquanto o GRUB está sendo
chamado pela BIOS. Nos sistemas UEFI, a tecla a ser usada é Esc.

No menu do GRUB, é possível escolher qual dos kernels instalados deve ser carregado e passar
novos parâmetros para ele. A maioria dos parâmetros do kernel segue o padrão opção=valor.
Alguns dos parâmetros mais úteis do kernel são:

• acpi: Ativa/desativa o suporte a ACPI. acpi=off desabilita o suporte a ACPI;


• init: Define um iniciador de sistema alternativo. Por exemplo, init=/bin/bash define o
shell Bash como iniciador. Assim, uma sessão do shell será iniciada logo após o processo
de inicialização do kernel;
• systemd.unit: Define o destino do systemd a ser ativado. Por exemplo, systemd.unit=graph-
ical.target. O systemd também aceita os níveis de execução numéricos definidos para
SysV. Para ativar o nível de execução 1, por exemplo, é necessário apenas incluir o
número 1 ou a letra S (abreviação de “single”) como parâmetro do kernel;
• mem: Define a quantidade de RAM disponível para o sistema. Este parâmetro é útil
para limitar a RAM disponível para cada convidado em uma máquina virtual. Assim,
mem=512M limita a 512 megabytes a quantidade de RAM disponível para um sistema
convidado em particular;
• maxcpus: Limita o número de processadores (ou núcleos de processador) visíveis ao
sistema em máquinas multiprocessador simétricas. Também é útil para máquinas vir-
tuais. Um valor de 0 desativa o suporte a máquinas multiprocessador e tem o mesmo
efeito do parâmetro do kernel nosmp. O parâmetro maxcpus=2 limita a dois o número
de processadores disponíveis para o sistema operacional;
• quiet: Oculta a maioria das mensagens de inicialização;
• vga: Seleciona um modo de vídeo. O parâmetro vga=ask mostra uma lista dos modos
disponíveis a escolher;
• root: Define a partição raiz, diferente da que está configurada no bootloader. Por
34 3. Inicialização do Sistema
Fabio Gonçalves De Melo Santana / [email protected]

exemplo, root=/dev/sda3;
• rootflags: Opções de montagem para o arquivo de sistemas raiz;
• ro: Torna somente para leitura a montagem inicial do arquivo de sistemas raiz;
• rw: Permite escrever no arquivo de sistemas raiz durante a montagem inicial.

Geralmente não é necessário alterar os parâmetros do kernel, mas isso pode ser útil para
detectar e resolver problemas relacionados ao sistema operacional. Os parâmetros do kernel
devem ser adicionados ao arquivo /etc/default/grub na linha GRUB_CMDLINE_LINUX
para que persistam após a inicialização. É necessário gerar um novo arquivo de configuração
para o carregador de inicialização a cada vez que /etc/default/grub é alterado, o que é feito
com o comando grub-mkconfig -o /boot/grub/grub.cfg. Quando o sistema operacional
estiver rodando, os parâmetros do kernel usados para carregar a sessão ficam disponíveis para
leitura no arquivo /proc/cmdline.

Inicialização do sistema
Além do kernel, o sistema operacional depende de outros componentes que fornecem os recur-
sos esperados. Muitos desses componentes são carregados durante o processo de inicialização
do sistema e vão de simples scripts de shell a programas de serviços mais complexos. Os scripts
geralmente são usados para executar tarefas de curta duração que serão finalizadas durante
o processo de inicialização. Os serviços, também conhecidos como daemons, podem ficar
ativos o tempo todo, pois muitas vezes são responsáveis por aspectos específicos do sistema
operacional.

Existe uma enorme diversidade de maneiras de incorporar scripts de inicialização e daemons


com as mais diferentes características em uma distribuição Linux. Esse fato, historicamente,
impediu o desenvolvimento de uma solução única que atenda às expectativas dos mantenedores
e usuários de todas as distribuições Linux. No entanto, qualquer ferramenta escolhida pelos
mantenedores de distribuições para executar esta função será capaz de pelo menos iniciar,
interromper e reiniciar os serviços do sistema. Essas ações geralmente são executadas pelo
próprio sistema após uma atualização de software, por exemplo, mas o administrador do
sistema quase sempre precisa reiniciar o serviço manualmente após fazer modificações em seu
arquivo de configuração.

Também é conveniente que um administrador do sistema possa ativar um conjunto específico


de daemons, dependendo das circunstâncias. Por exemplo, deve ser possível executar apenas
um conjunto mínimo de serviços para executar tarefas de manutenção do sistema.

A inicialização do sistema operacional começa quando o carregador de inicialização carrega o


kernel na RAM. Nesse momento, o kernel assume o controle da CPU e começa a detectar e
configurar os aspectos fundamentais do sistema operacional, como a configuração básica de
35 3. Inicialização do Sistema
Fabio Gonçalves De Melo Santana / [email protected]

hardware e o endereçamento de memória.

O kernel abre então o initramfs (initial RAM filesystem). O initramfs é um arquivo que contém
um sistema de arquivos raiz temporário usado durante o processo de inicialização. O principal
objetivo de um arquivo initramfs é fornecer os módulos necessários para que o kernel possa
acessar o sistema de arquivos raiz “de verdade” do sistema operacional.

Logo que o sistema de arquivos raiz fica disponível, o kernel monta todos os sistemas de
arquivos configurados em /etc/fstab e, em seguida, executa o primeiro programa, um utilitário
chamado init. O programa init é responsável por executar todos os scripts de inicialização
e daemons do sistema. Existem implementações distintas desses iniciadores de sistema além
do tradicional init, como o systemd e o Upstart. Depois que o programa init é carregado, o
initramfs é removido da RAM.

• Padrão SysV: Um gerenciador de serviços baseado no padrão SysVinit controla quais


daemons e recursos estarão disponíveis, empregando o conceito de níveis de execução.
Os níveis de execução são numerados de 0 a 6 e são projetados pelos mantenedores
da distribuição para atender a propósitos específicos. As únicas definições de nível de
execução compartilhadas entre todas as distribuições são os níveis 0, 1 e 6.
• systemd: O systemd é um gerenciador de sistemas e serviços moderno, com uma ca-
mada de compatibilidade para os comandos e níveis de execução do SysV. O systemd
possui uma estrutura concorrente, emprega sockets e D-Bus para a ativação de serviços,
execução de daemon sob demanda, monitoramento de processos com cgroups, snapshot
support, recuperação da sessão do sistema, controle de ponto de montagem e um con-
trole de serviços baseado em dependências. Nos últimos anos, a maioria das grandes
distribuições Linux adotou gradualmente o systemd como seu gerenciador de sistema
padrão.
• Upstart: Como o systemd, o Upstart é um substituto para o init. O foco do Upstart
é acelerar o processo de inicialização, paralelizando o processo de carregamento dos
serviços do sistema. O Upstart foi usado pelas distribuições baseadas no Ubuntu em
versões anteriores, mas hoje deu lugar ao systemd.

Inspeção da inicialização
Às vezes ocorrem erros durante o processo de inicialização, mas nem sempre eles são críticos a
ponto de interromper completamente o sistema operacional. Não obstante, esses erros podem
comprometer o comportamento esperado do sistema. Todos os erros resultam em mensagens
que podem ser usadas para investigações futuras, pois elas contêm informações valiosas sobre
quando e como o erro ocorreu. Mesmo quando nenhuma mensagem de erro é gerada, as
informações coletadas durante o processo de inicialização podem ser úteis para fins de ajuste
e configuração.
36 3. Inicialização do Sistema
Fabio Gonçalves De Melo Santana / [email protected]

O espaço de memória em que o kernel armazena suas mensagens, incluindo as mensagens


de inicialização, é chamado de buffer do kernel. As mensagens são mantidas nesse buffer
mesmo quando não são exibidas durante o processo de inicialização (por exemplo, quando
uma animação é exibida em vez da mensagem). No entanto, o buffer do kernel perde todas
as mensagens quando o sistema é desligado ou se o comando dmesg –clear for executado.
Sem opções, o comando dmesg exibe as mensagens atuais no buffer do kernel:

root@debian10:/home/debian# dmesg
[ 5.223753] ACPI: AC Adapter [AC] (on-line)
[ 5.242275] battery: ACPI: Battery Slot [BAT0] (battery present)
[ 5.295824] sr 1:0:0:0: Attached scsi generic sg0 type 5
[ 5.298089] sd 2:0:0:0: Attached scsi generic sg1 type 0
[ 5.309545] vboxguest: loading out-of-tree module taints kernel.
[ 5.315225] vboxguest: module verification failed: signature and/or required key missing
- tainting kernel
[ 5.331754] vgdrvHeartbeatInit: Setting up heartbeat to trigger every 2000 milliseconds
[ 5.331970] input: Unspecified device as /devices/pci0000:00/0000:00:04.0/input/input7
[ 5.332534] vboxguest: Successfully loaded version 6.1.16
[ 5.332561] vboxguest: misc device minor 58, IRQ 20, I/O port d040, MMIO at 00000000
f0400000 (size 0x400000)
[ 5.332562] vboxguest: Successfully loaded version 6.1.16 (interface 0x00010004)
[ 5.354518] input: PC Speaker as /devices/platform/pcspkr/input/input8
[ 5.426200] RAPL PMU: API unit is 2^-32 Joules, 4 fixed counters, 10737418240 ms ovfl
timer
[ 5.426202] RAPL PMU: hw unit of domain pp0-core 2^-0 Joules
[ 5.426203] RAPL PMU: hw unit of domain package 2^-0 Joules
[ 5.426205] RAPL PMU: hw unit of domain dram 2^-0 Joules
[ 5.426206] RAPL PMU: hw unit of domain pp1-gpu 2^-0 Joules
[ 6.105038] Adding 999420k swap on /dev/mapper/debian10--vg-swap_1. Priority:-2 extents
:1 across:999420k FS
[ 8.535214] snd_intel8x0 0000:00:05.0: white list rate for 1028:0177 is 48000
[ 8.785886] EXT4-fs (dm-3): mounted filesystem with ordered data mode. Opts: (null)
[ 8.842016] EXT4-fs (dm-2): mounted filesystem with ordered data mode. Opts: (null)
[ 8.891303] systemd-journald[255]: Received request to flush runtime journal from PID 1
[ 8.916576] EXT4-fs (dm-4): mounted filesystem with ordered data mode. Opts: (null)
[ 9.153022] EXT4-fs (sda1): mounting ext2 file system using the ext4 subsystem
[ 9.158538] EXT4-fs (sda1): mounted filesystem without journal. Opts: (null)

A saída do dmesg pode ter centenas de linhas, portanto a listagem anterior contém apenas o
trecho que mostra o kernel chamando o gerenciador de serviços systemd. Os valores no início
das linhas são a quantidade de segundos desde o início do carregamento do kernel.

Nos sistemas baseados em systemd, o comando journalctl mostra as mensagens de inicial-


ização com as opções -b, –boot, -k ou –dmesg. O comando journalctl –list-boots mostra
uma lista de números de inicialização relativos à inicialização atual, seu hash de identificação
e os registros de data e hora da primeira e última mensagens correspondentes:

root@debian10:/home/debian# journalctl --list-boots


0 2dfc67e221c5480d88cce149a5dd87da Wed 2021-06-30 12:01:51 —CDTWed 2021-06-30 19:04:28 CDT
37 3. Inicialização do Sistema
Fabio Gonçalves De Melo Santana / [email protected]

Os logs de inicialização anteriores também são preservados nos sistemas baseados no systemd,
sendo assim possível inspecionar as mensagens de sessões anteriores do sistema operacional.

root@debian10:/home/debian# journalctl -b 0
-- Logs begin at Wed 2021-06-30 12:01:51 CDT, end at Wed 2021-06-30 19:04:28 CDT. --
Jun 30 12:01:51 debian10.linuxvmimages.local kernel: Linux version 4.19.0-13-amd64 (debian-
[email protected]) (gcc version 8.3.0 (Debian 8.3.0-6)) #1 SMP Debian 4.19.160-2
(2020-11-28)
Jun 30 12:01:51 debian10.linuxvmimages.local kernel: Command line: BOOT_IMAGE=/vmlinuz
-4.19.0-13-amd64 root=/dev/mapper/debian10--vg-root ro quiet
Jun 30 12:01:51 debian10.linuxvmimages.local kernel: x86/fpu: Supporting XSAVE feature 0
x001: 'x87 floating point registers'
Jun 30 12:01:51 debian10.linuxvmimages.local kernel: x86/fpu: Supporting XSAVE feature 0
x002: 'SSE registers'
Jun 30 12:01:51 debian10.linuxvmimages.local kernel: x86/fpu: Supporting XSAVE feature 0
x004: 'AVX registers'
Jun 30 12:01:51 debian10.linuxvmimages.local kernel: x86/fpu: xstate_offset[2]: 576,
xstate_sizes[2]: 256

As mensagens sobre a inicialização, e outras emitidas pelo sistema operacional, são ar-
mazenadas em arquivos dentro do diretório /var/log/. Se ocorrer um erro crítico e o sistema
operacional for incapaz de continuar o processo de inicialização depois de carregar o kernel
e o initramfs, uma mídia de inicialização alternativa pode ser usada para iniciar o sistema e
acessar o arquivo de sistemas correspondente. Depois disso, os arquivos em /var/log/ po-
dem ser consultados em busca das razões causaram a interrupção do processo de inicialização.
As opções -D ou –directory do comando journalctl servem para ler mensagens de log em
diretórios diferentes de /var/log/journal/, que é a localização padrão para as mensagens de
log do systemd. Como as mensagens de log do sistema não são armazenadas em texto puro,
o comando journalctl é necessário para que fiquem legíveis.

Resumo
Esta aula aborda a sequência de inicialização em um sistema Linux padrão. O conhecimento
adequado de como funciona o processo de inicialização de um sistema Linux ajuda a evitar
erros que podem tornar o sistema inacessível. A lição tratou dos seguintes tópicos:

• Diferença entre os métodos de inicialização da BIOS e da UEFI;


• Estágios típicos da inicialização do sistema;
• Recuperação de mensagens de inicialização.

Os comandos e procedimentos abordados foram:

• Parâmetros comuns do kernel;


• Comandos para ler mensagens de inicialização: dmesg e journalctl.
38 3. Inicialização do Sistema
Fabio Gonçalves De Melo Santana / [email protected]

Talvez isso possa te ajudar. . .

Fig. 3.1: BIOSxUEFI

Fig. 3.2: BIOSxUEFI


39 3. Inicialização do Sistema
Fabio Gonçalves De Melo Santana / [email protected]

• Fonte: - https://vulnerablelife.wordpress.com/2016/01/31/uefi-vs-bios/
Fabio Gonçalves De Melo Santana / [email protected]

4
Alterar níveis de execução e
destinos de inicialização e desligar
ou reiniciar o sistema

Introdução
Uma característica comum entre os sistemas operacionais que seguem os princípios de design
do Unix é o emprego de processos separados para controlar funções distintas do sistema.
Esses processos, chamados daemons ou serviços, também são responsáveis pelos recursos do
sistema operacional, como serviços de aplicativos de rede (servidor HTTP, compartilhamento
de arquivos, email. . . ), bancos de dados, configuração sob demanda etc. Embora o Linux
utilize um kernel monolítico, muitos aspectos de baixo nível do sistema operacional são afetados
por daemons, como o balanceamento de carga e a configuração do firewall.

Os daemons que devem estar ativos dependem da finalidade do sistema. O conjunto de


daemons ativos também deve ser modificável em tempo de execução, para que os serviços
possam ser iniciados e interrompidos sem a necessidade de se reiniciar o sistema inteiro. Para
resolver esse problema, todas as principais distribuições Linux oferecem algum tipo de utilitário
de gerenciamento de serviços para controlar o sistema.

Os serviços podem ser controlados por scripts do shell ou por um programa e seus arquivos
de configuração. O primeiro método é implementado pelo padrão SysVinit, também con-
hecido como System V ou apenas SysV. O segundo método é implementado por systemd e

40
41 4. Alterar níveis de execução e destinos de inicialização e desligar ou reiniciar o sistema
Fabio Gonçalves De Melo Santana / [email protected]

Upstart. Historicamente, os gerenciadores de serviços baseados em SysV eram os mais uti-


lizados pelas distribuições Linux. Hoje, os gerenciadores de serviços baseados no systemd são
os mais frequentes na maioria das distribuições Linux. O gerenciador de serviços é o primeiro
programa lançado pelo kernel durante o processo de inicialização, portanto seu PID (número
de identificação do processo) é sempre 1.

SysVinit
Um gerenciador de serviços baseado no padrão SysVinit fornece conjuntos predefinidos de
estados do sistema, chamados níveis de execução, além dos arquivos correspondentes de script
dos serviços a serem executados. Os níveis de execução são numerados de 0 a 6, geralmente
atribuídos às seguintes finalidades:

• Nível de execução 0: Encerramento do sistema;


• Nível de execução 1, s ou single: Modo de usuário único, sem rede e outros recursos
não-essenciais (modo de manutenção);
• Nível de execução 2, 3 ou 4: Modo multiusuário. Os usuários podem se logar via
console ou pela rede. Os níveis de execução 2 e 4 não são usados com frequência;
• Nível de execução 5: Modo multiusuário. Equivale ao nível 3, mais o login em modo
gráfico;
• Nível de execução 6: Reinicialização do sistema.

O programa responsável pelo gerenciamento de níveis de execução e daemons/recursos as-


sociados é /sbin/init. Durante a inicialização do sistema, o programa init identifica o nível
de execução solicitado, definido por um parâmetro do kernel ou no arquivo /etc/inittab, e
carrega os scripts associados listados ali para o nível de execução especificado. Cada nível
de execução pode ter diversos arquivos de serviço associados, geralmente scripts no diretório
/etc/init.d/. Como nem todos os níveis de execução se equivalem nas diferentes distribuições
Linux, uma breve descrição do objetivo do nível de execução também pode ser encontrada nas
distribuições baseadas em SysV.

A sintaxe do arquivo /etc/inittab usa o seguinte formato:

id:runlevels:action:process

O primeiro termo id é um nome genérico de até quatro caracteres, usado para identificar a
entrada. O item runlevels é uma lista de números dos níveis de execução nos quais uma
ação especificada deve ser executada. O termo action define como init executará o processo
indicado pelo termo process. As ações disponíveis são:
42 4. Alterar níveis de execução e destinos de inicialização e desligar ou reiniciar o sistema
Fabio Gonçalves De Melo Santana / [email protected]

• boot: O processo será executado durante a inicialização do sistema. O campo runlevels


é ignorado;
• bootwait: O processo será ignorado durante a inicialização do sistema e o init aguardará
sua conclusão para continuar. O campo runlevels é ignorado;
• sysinit: O processo será executado após a inicialização do sistema, qualquer que seja o
nível de execução. O campo runlevels é ignorado;
• wait: O processo será executado nos níveis de execução dados e init aguardará sua
conclusão para continuar;
• respawn: O processo será reiniciado caso seja encerrado;
• ctrlaltdel: O processo será executado quando o processo init receber o sinal SIGINT,
disparado quando o atalho de teclado Ctrl+Alt+Del for pressionado.

O nível de execução padrão também é definido em /etc/inittab, na entrada id: x :initde-


fault. x é o número do nível de execução padrão. Esse número nunca deve ser 0 ou 6, pois
isso faria com que o sistema desligasse ou reiniciasse ao final do processo de inicialização. Um
arquivo /etc/inittab típico é mostrado abaixo:

# Default runlevel
id:3:initdefault:

# Configuration script executed during boot


si::sysinit:/etc/init.d/rcS

# Action taken on runlevel S (single user)


~:S:wait:/sbin/sulogin

# Configuration for each execution level


l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6

# Action taken upon ctrl+alt+del keystroke


ca::ctrlaltdel:/sbin/shutdown -r now

# Enable consoles for runlevels 2 and 3


1:23:respawn:/sbin/getty tty1 VC linux
2:23:respawn:/sbin/getty tty2 VC linux
3:23:respawn:/sbin/getty tty3 VC linux
4:23:respawn:/sbin/getty tty4 VC linux

# For runlevel 3, also enable serial


# terminals ttyS0 and ttyS1 (modem) consoles
S0:3:respawn:/sbin/getty -L 9600 ttyS0 vt320
S1:3:respawn:/sbin/mgetty -x0 -D ttyS1

Temos também o comando telinit q, que deve ser executado a cada vez que o arquivo
43 4. Alterar níveis de execução e destinos de inicialização e desligar ou reiniciar o sistema
Fabio Gonçalves De Melo Santana / [email protected]

/etc/inittab é modificado. O argumento q (ou Q) pede que o init recarregue sua configu-
ração. Essa etapa é importante para evitar uma parada do sistema devido a uma configuração
incorreta em /etc/inittab.

Os scripts usados pelo init para configurar cada nível de execução ficam armazenados no di-
retório /etc/init.d/. Cada nível de execução tem um diretório associado em /etc/, chamado
/etc/rc0.d/, /etc/rc1.d/, /etc/rc2.d/, etc., com os scripts que devem ser executados
quando cada nível de execução é iniciado. Como o mesmo script pode ser usado por diferentes
níveis de execução, os arquivos nesses diretórios são apenas links simbólicos para os scripts
reais em /etc/init.d/.

Além disso, a primeira letra do nome do arquivo do link no diretório do nível de execução
indica se o serviço deve ser iniciado ou encerrado no nível de execução correspondente. Um
nome de arquivo iniciado com a letra K determina que o serviço será encerrado ao entrar no
nível de execução (kill). Se começar com a letra S, o serviço será iniciado ao ingressar no nível
de execução (start). O diretório /etc/rc1.d/, por exemplo, terá muitos links para scripts de
rede iniciados com a letra K, considerando que o nível de execução 1 é o nível do usuário
único, sem conectividade de rede.

O comando runlevel mostra o atual nível de execução do sistema. Esse comando exibe dois
valores: o primeiro é o nível de execução anterior, o segundo o atual:

root@debian10:/home/debian# runlevel
N 5

A letra N na saída mostra que o nível de execução não mudou desde a última inicialização.
No exemplo, runlevel 5 é o nível de execução atual do sistema.

O mesmo programa init pode ser usado para alternar entre níveis de execução em um sistema
em execução sem a necessidade de reiniciar. O comando telinit também permite alternar
entre níveis de execução. Por exemplo, os comandos telinit 1, telinit s ou telinit S mudarão
o sistema para o nível de execução 1.

systemd
Atualmente, o systemd é o conjunto de ferramentas mais usado para gerenciar recursos e
serviços do sistema, chamados de unidades (units) pelo systemd. Uma unidade consiste em um
nome, um tipo e um arquivo de configuração correspondente. Por exemplo, a unidade para um
processo de servidor httpd (como o servidor web Apache) será httpd.service nas distribuições
baseadas no Red Hat e seu arquivo de configuração também será chamado httpd.service (nas
44 4. Alterar níveis de execução e destinos de inicialização e desligar ou reiniciar o sistema
Fabio Gonçalves De Melo Santana / [email protected]

distribuições baseadas em Debian, essa unidade é chamada apache2.service).

Existem sete tipos distintos de unidades systemd:

• service: O tipo de unidade mais comum, para recursos ativos do sistema que podem
ser iniciados, interrompidos e recarregados;
• socket: O tipo de unidade socket pode ser um socket de sistema de arquivos ou um
socket de rede. Todas as unidades socket possuem uma unidade de serviço correspon-
dente, carregada quando o socket recebe uma solicitação;
• device: Uma unidade de dispositivo está associada a um dispositivo de hardware iden-
tificado pelo kernel. Um dispositivo só será considerado como uma unidade systemd
se existir uma regra udev para isso. Uma unidade de dispositivo pode ser usada para
resolver dependências de configuração quando determinado hardware é detectado, uma
vez que as propriedades da regra udev podem ser usadas como parâmetros para a unidade
de dispositivo;
• mount: Uma unidade de montagem é uma definição de ponto de montagem no sistema
de arquivos, semelhante a uma entrada em /etc/fstab;
• automount: Uma unidade de montagem automática também é uma definição de ponto
de montagem no sistema de arquivos, mas nesse caso montada automaticamente. Cada
unidade de montagem automática possui uma unidade de montagem correspondente,
que é iniciada quando o ponto de montagem automática é acessado;
• target: Uma unidade de destino é um agrupamento de outras unidades, gerenciadas
como uma única unidade;
• snapshot: Uma unidade snapshot é um estado salvo do gerenciador do systemd (não
disponível em todas as distribuições Linux).

O principal comando para controlar as unidades do systemd é systemctl. O comando sys-


temctl é usado para executar todas as tarefas relacionadas à ativação, desativação, execução,
interrupção e monitoramento da unidade, entre outras. Para uma unidade ficcional chamada
unit.service, por exemplo, as ações mais comuns do systemctl serão:

• systemctl start unit.service: Inicia unit;


• systemctl stop unit.service: Interrompe unit;
• systemctl restart unit.service: Reinicia unit;
• systemctl status unit.service: Mostra o estado de unit, incluindo se está ou não em
execução;
• systemctl is-active unit.service: Exibe active se unit estiver rodando, ou inactive se
não estiver;
• systemctl enable unit.service: Habilita unit, ou seja, unit será carregado durante a
inicialização do sistema;
• systemctl disable unit.service: unit não será iniciado com o sistema;
• systemctl is-enabled unit.service: Verifica se unit é iniciado com o sistema. A
45 4. Alterar níveis de execução e destinos de inicialização e desligar ou reiniciar o sistema
Fabio Gonçalves De Melo Santana / [email protected]

resposta é armazenada na variável $?. O valor 0 indica que unit inicia com o sistema e
o valor 1 indica que não.

O comando systemctl isolate alterna entre diferentes destinos. Assim, para alternar manual-
mente para o destino multi-user:

root@debian10:/home/debian# systemctl isolate multi-user.target

Existem destinos correspondentes aos níveis de execução do SysV, desde runlevel0.target até
runlevel6.target. Todavia, o systemd não usa o arquivo /etc/inittab. Para alterar o destino
padrão do sistema, a opção systemd.unit pode ser adicionada à lista de parâmetros do kernel.
Por exemplo, para usar multi-user.target como destino padrão, o parâmetro do kernel deve
ser systemd.unit=multi-user.target. Todos os parâmetros do kernel podem ser tornados
persistentes alterando-se a configuração do gerenciador de inicialização.

Outra maneira de alterar o destino padrão é modificar o link simbólico /etc/systemd/sys-


tem/default.target para que ele aponte para o destino desejado. A redefinição do link pode
ser feita com o próprio comando systemctl:

root@debian10:/home/debian# systemctl set-default multi-user.target

Da mesma forma, podemos determinar o destino de inicialização padrão do sistema com o


seguinte comando:

root@debian10:/home/debian# systemctl get-default


graphical.target

Como nos sistemas que adotam o SysV, o destino padrão nunca deve apontar para shut-
down.target, pois ele corresponde ao nível de execução 0 (encerramento).

Upstart
Os scripts de inicialização usados pelo Upstart estão localizados no diretório /etc/init/. Os
serviços do sistema podem ser listados com o comando initctl list, que também mostra o
estado atual dos serviços e, se disponível, seu número PID.

root@ubuntu:/home/ubuntu# initctl list


46 4. Alterar níveis de execução e destinos de inicialização e desligar ou reiniciar o sistema
Fabio Gonçalves De Melo Santana / [email protected]

avahi-cups-reload stop/waiting
avahi-daemon start/running, process 1123
mountall-net stop/waiting
mountnfs-bootclean.sh start/running
nmbd start/running, process 3085
passwd stop/waiting
rc stop/waiting
rsyslog start/running, process 1095
tty4 start/running, process 1761
udev start/running, process 1073
upstart-udev-bridge start/running, process 1066
console-setup stop/waiting
irqbalance start/running, process 1842
plymouth-log stop/waiting
smbd start/running, process 1457
tty5 start/running, process 1764
failsafe stop/waiting

Cada uma das ações do Upstart tem seu próprio comando independente. Por exemplo, o
comando start pode ser usado para iniciar um sexto terminal virtual:

root@ubuntu:/home/ubuntu# start tty6

O estado atual de um recurso pode ser verificado com o comando status:

root@ubuntu:/home/ubuntu# status tty6


tty6 start/running, process 3030

E a interrupção de um serviço é feita com o comando stop:

root@ubutu:/home/ubuntu# stop tty6

O Upstart não usa o arquivo /etc/inittab para definir os níveis de execução, mas os comandos
antigos runlevel e telinit ainda podem ser usados para verificar e alternar entre níveis de
execução.

O Upstart foi desenvolvido para a distribuição Ubuntu Linux para facilitar a inicial-
ização paralela dos processos. O Ubuntu parou de usar o Upstart em 2015, quando
migrou do Upstart para o systemd.
47 4. Alterar níveis de execução e destinos de inicialização e desligar ou reiniciar o sistema
Fabio Gonçalves De Melo Santana / [email protected]

Desligar e reiniciar
Um comando muito tradicional usado para desligar ou reiniciar o sistema é o shutdown. O
comando shutdown adiciona funções extras ao processo de desligamento: ele notifica auto-
maticamente todos os usuários conectados com uma mensagem em suas sessões do shell e
impede novos logins.

Após o shutdown ser executado, todos os processos recebem o sinal SIGTERM, seguido pelo
sinal SIGKILL, e o sistema é encerrado ou muda seu nível de execução. Por padrão, quando
as opções -h ou -r não são usadas, o sistema alterna para o nível de execução 1, ou seja,
o modo de usuário único. Para alterar as opções padrão de shutdown, o comando deve ser
executado com a seguinte sintaxe:

root@ubuntu:/home/ubuntu$ shutdown [option] time [message]

Somente o parâmetro time é obrigatório. Esse parâmetro define quando a ação solicitada será
executada, aceitando os seguintes formatos:

• hh:mm: Este formato especifica o tempo de execução em horas e minutos;


• +m: Este formato especifica quantos minutos esperar antes da execução;
• now ou +0: Este formato determina a execução imediata.

O parâmetro message é o texto de aviso enviado a todas as sessões de terminal dos usuários
logados.

A implementação do SysV permite limitar os usuários que poderão reiniciar a máquina pres-
sionando Ctrl+Alt+Del. Para isso, incluímos a opção -a no comando shutdown presente
na linha referente a ctrlaltdel no arquivo /etc/inittab. Ao fazer isso, somente usuários cujos
nomes de usuário constem do arquivo /etc/shutdown.allow poderão reiniciar o sistema com
o atalho de teclado Ctrl+Alt+Del.

O comando systemctl também pode ser usado para desligar ou reiniciar a máquina em
sistemas que empregam o systemd. Para reiniciar o sistema, usamos o comando systemctl
reboot. Para desligar o sistema, o comando é systemctl poweroff. Ambos os comandos
requerem privilégios de root para serem executados, pois usuários comuns não podem realizar
esses procedimentos.

Nem todas as atividades de manutenção exigem que o sistema seja desligado ou reiniciado.
No entanto, quando é necessário alterar o estado do sistema para o modo de usuário único, é
importante avisar os usuários conectados para que não sejam prejudicados pelo encerramento
abrupto de suas atividades.
48 4. Alterar níveis de execução e destinos de inicialização e desligar ou reiniciar o sistema
Fabio Gonçalves De Melo Santana / [email protected]

Como no caso do comando shutdown ao desligar ou reiniciar o sistema, o comando wall pode
enviar uma mensagem para as sessões de terminal de todos os usuários logados. Para isso, o
administrador do sistema só precisa fornecer um arquivo ou escrever diretamente a mensagem
como um parâmetro para o comando wall.

Resumo
Esta aula aborda os principais utilitários usados como gerenciadores de serviços pelas dis-
tribuições Linux. Os utilitários SysVinit, systemd e Upstart têm sua abordagem própria
para controlar serviços e estados do sistema. A lição inclui os seguintes tópicos:

• O que são os serviços do sistema e qual seu papel no sistema operacional;


• Conceitos e utilização básica dos comandos do SysVinit, systemd e Upstart;
• Como iniciar, interromper e reiniciar apropriadamente os serviços do sistema e o próprio
sistema.

Os comandos e procedimentos abordados foram:

• Comandos e arquivos relacionados ao SysVinit, como init, /etc/inittab e telinit;


• O comando principal do systemd: systemctl.
• Comandos do Upstart: initctl, status, start, stop;
• Comandos tradicionais de gerenciamento do sistema, como shutdown e o comando
wall.
49 4. Alterar níveis de execução e destinos de inicialização e desligar ou reiniciar o sistema
Fabio Gonçalves De Melo Santana / [email protected]

Talvez isso possa te ajudar. . .

Fig. 4.1: SystemD vs SystemV

• Fonte: https://linoxide.com/systemd-vs-sysvinit-cheatsheet/
Fabio Gonçalves De Melo Santana / [email protected]

5
102.1: Definir o esquema de
partições do disco rígido

Introdução
Um disco é um recipiente físico para seus dados.

Antes de poder ser usado por um computador, ele precisa ser particionado. Uma partição é um
subconjunto lógico do disco físico. O particionamento é uma maneira de “compartimentar” as
informações armazenadas no disco, separando, por exemplo, os dados do sistema operacional
dos dados do usuário.

Todo disco precisa de pelo menos uma partição, mas é possível definir várias partições se
necessário, e as informações a respeito delas são armazenadas em uma tabela de partições.
Essa tabela inclui informações sobre o primeiro e o último setores da partição e seu tipo, além
de detalhes adicionais sobre cada partição.

Dentro de cada partição existe um sistema de arquivos. O sistema de arquivos descreve a


maneira como as informações estão de fato armazenadas no disco; por exemplo, o modo
como os diretórios são organizados, qual a relação entre eles, onde estão os dados para cada
arquivo etc.

As partições não podem abranger vários discos. Porém, usando o Gerenciador de Volumes
Lógicos (Logic Volume Manager ou LVM), podemos combinar várias partições, mesmo entre

50
51 5. 102.1: Definir o esquema de partições do disco rígido
Fabio Gonçalves De Melo Santana / [email protected]

discos, para formar um único volume lógico.

Os volumes lógicos abstraem as limitações dos dispositivos físicos e permitem trabalhar com
“pools” de espaço em disco que podem ser combinados ou distribuídos de maneira muito
mais flexível do que as partições tradicionais permitiriam. O LVM é útil em situações em
que é necessário adicionar mais espaço a uma partição sem precisar migrar os dados para um
dispositivo maior.

Pontos de montagem
Antes que um sistema de arquivos possa ser acessado no Linux, ele precisa ser montado.
Isso significa vincular o sistema de arquivos a um ponto específico na árvore de diretórios do
sistema, chamado ponto de montagem.

Quando montado, o conteúdo do sistema de arquivos estará disponível no ponto de montagem.


Por exemplo, imagine que você tenha uma partição com os dados pessoais de seus usuários (o
diretório pessoal deles), contendo os diretórios /joatham, /pedro e /qualteupapo. Quando
montados em /home, o conteúdo desses diretórios estará disponível em /home/joatham,
/home/pedro e /home/qualteupapo.

O ponto de montagem deve existir antes de o sistema de arquivos ser montado. Não é possível
montar uma partição em /mnt/dadosdousuario se esse diretório não existir. No entanto, se
o diretório existir e contiver arquivos, esses arquivos ficarão indisponíveis até você desmontar
o sistema de arquivos. Ao listar o conteúdo do diretório, veremos os arquivos armazenados no
sistema de arquivos montado, não o conteúdo original do diretório.

Os sistemas de arquivos podem ser montados em qualquer lugar que você desejar. No entanto,
certas práticas são recomendadas para facilitar a administração do sistema.

Tradicionalmente, todos os dispositivos externos eram montados no diretório /mnt. Ali existia
uma série de pontos de ancoragem pré-configurados para os dispositivos mais comuns, como
drives de CD-ROM (/mnt/cdrom) e de disquete (/mnt/floppy).

Ele foi substituído por /media, que agora é o ponto de montagem padrão para qualquer mídia
removível (como discos externos, drives flash USB, leitores de cartão de memória, discos óticos
etc.) conectada ao sistema.

E na maioria das distribuições Linux e ambientes de desktop modernos, os dispositivos re-


movíveis são montados automaticamente em /media/USER/LABEL quando conectados
ao sistema, sendo USER o nome de usuário e LABEL o nome do dispositivo. Por exemplo,
um drive flash USB com o nome FlashDrive conectado pelo usuário joatham seria montado
em /media/joatham/FlashDrive/. A maneira como isso é feito varia de acordo com o
52 5. 102.1: Definir o esquema de partições do disco rígido
Fabio Gonçalves De Melo Santana / [email protected]

ambiente de desktop.

Dito isto, sempre que for preciso montar manualmente um sistema de arquivos, é recomendável
montá-lo em /mnt. Os comandos específicos para controlar a montagem e desmontagem de
sistemas de arquivos no Linux serão discutidos em outra lição.

Mantendo as coisas separadas


No Linux, existem alguns diretórios que é melhor manter em partições separadas. Há muitas
razões para isso: por exemplo, ao manter os arquivos relacionados ao carregador de inicialização
(armazenado em /boot) em uma partição boot, garantimos que o sistema ainda poderá
inicializar em caso de falha no sistema de arquivos raiz.

Também é mais fácil reinstalar o sistema sem o risco de afetar os dados dos usuários se
os diretórios pessoais (em /home) estiverem em uma partição separada. Da mesma forma,
manter os dados relacionados a um servidor web ou banco de dados (normalmente em /var)
em uma partição separada (ou mesmo um disco à parte) facilita a administração do sistema
caso seja necessário adicionar mais espaço em disco para esses casos de uso.

Há também razões de desempenho para manter determinados diretórios em partições sepa-


radas. Você pode querer manter o sistema de arquivos raiz (/) em uma unidade SSD rápida,
e diretórios maiores como /home e /var em discos rígidos mais lentos, que oferecem muito
mais espaço por um preço bem menor.

A partição de inicialização (/boot)


A partição de inicialização contém arquivos usados pelo gerenciador de inicialização para
carregar o sistema operacional. Nos sistemas Linux, o gerenciador de inicialização costuma ser
o GRUB2 ou, em sistemas mais antigos, o GRUB Legacy. A partição geralmente é montada
em /boot e seus arquivos são armazenados em /boot/grub.

Tecnicamente, uma partição de inicialização não é necessária, pois na maioria dos casos o
GRUB pode montar a partição raiz (/) e carregar os arquivos a partir de um diretório /boot
separado.

No entanto, uma partição de inicialização separada pode ser interessante, seja por segurança
(garantindo que o sistema seja inicializado mesmo em caso de falha no sistema de arquivos
raiz), ou se você desejar usar um sistema de arquivos que o carregador de inicialização não
pode entender na partição raiz, ou se usar um método não suportado de criptografia ou
compactação.

A partição de inicialização geralmente é a primeira partição no disco. Isso ocorre porque a


53 5. 102.1: Definir o esquema de partições do disco rígido
Fabio Gonçalves De Melo Santana / [email protected]

IBM PC BIOS original endereçava os discos usando cilindros, cabeças e setores (CHS), com
um máximo de 1024 cilindros, 256 cabeças e 63 setores, resultando em um tamanho máximo
de disco de 528 MB (504 MB no MS-DOS). Isso significa que qualquer coisa além dessa marca
não estaria acessível em sistemas legados, a menos que um esquema de endereçamento de
disco diferente (como o Endereçamento de bloco lógico, LBA) fosse usado.

Portanto, para obter compatibilidade máxima, a partição de inicialização geralmente está


localizada no início do disco e termina antes do cilindro 1024 (528 MB), garantindo que,
aconteça o que acontecer, a máquina sempre poderá carregar o kernel.

Como a partição de inicialização armazena apenas os arquivos necessários para o carregador


de inicialização, o disco RAM inicial e as imagens do kernel, ela pode ser bem pequena para
os padrões atuais. Um bom tamanho é de cerca de 300 MB.

A partição do sistema EFI (ESP)


A partição do sistema EFI (ESP) é usada por máquinas baseadas na UEFI (Unified Extensible
Firmware Interface) para armazenar gerenciadores de inicialização e imagens do kernel para os
sistemas operacionais instalados.

Essa partição é formatada em um sistema de arquivos baseado em FAT. Em um disco parti-


cionado com uma tabela de partição GUID, ela possui o identificador global único C12A7328-
F81F-11D2-BA4B-00A0C93EC93B. Se o disco tiver sido formatado no esquema de particiona-
mento do MBR, o ID da partição será 0xEF.

Em máquinas com Microsoft Windows, essa partição geralmente é a primeira no disco, embora
isso não seja obrigatório. O ESP é criado (ou preenchido) pelo sistema operacional após a
instalação e, em um sistema Linux, é montado em /boot/efi.

A partição /home
Cada usuário do sistema possui um diretório inicial para armazenar arquivos pessoais e prefer-
ências. A maioria deles está localizada em /home. O diretório inicial costuma ter o mesmo
nome que o usuário, assim, o usuário joatham teria seu diretório em /home/joatham.

Porém há exceções, por exemplo, o diretório inicial do usuário root é /root e alguns serviços
do sistema podem ter usuários associados com diretórios pessoais em outros lugares.
54 5. 102.1: Definir o esquema de partições do disco rígido
Fabio Gonçalves De Melo Santana / [email protected]

Dados variáveis (/var)


Este diretório contém “dados variáveis”, ou arquivos e diretórios nos quais o sistema deve
poder escrever durante a operação. Dentre eles estão os logs do sistema (em /var/log), os
arquivos temporários (/var/tmp) e os dados de aplicativos em cache (em /var/cache).

/var/www/html também é o diretório padrão para os arquivos de dados do Apache Web


Server e /var/lib/mysql é o local padrão para os arquivos de banco de dados do servidor
MySQL. Porém, ambos podem ser alterados.

Swap
A partição de troca (ou swap) é usada para passar as páginas de memória da RAM para o
disco conforme necessário. Esta partição precisa ser de um tipo específico e configurada com
um utilitário apropriado chamado mkswap antes de poder ser usada.

A partição de troca não pode ser montada como as outras, o que significa que não é possível
acessá-la como um diretório normal e visualizar seu conteúdo.

Um sistema pode ter diversas partições de troca (embora isso seja incomum), e o Linux
também suporta o uso de arquivos de troca em vez de partições, o que pode ser útil para
aumentar rapidamente o espaço de troca quando necessário.

O tamanho da partição de troca é um tema controverso. A regra antiga dos primeiros dias
do Linux (“duas vezes a quantidade de RAM”) nem sempre se aplica, dependendo de como o
sistema está sendo usado e da quantidade de RAM física instalada.

Na documentação do Red Hat Enterprise Linux 7, a Red Hat recomenda o seguinte:

Quantidade de Tamanho de troca Tamanho de troca recomendado com


RAM recomendado hibernação
< 2 GB de 2x a quantidade de RAM 3x a quantidade de RAM
RAM
2-8 GB de Igual à quantidade de 2x a quantidade de RAM
RAM RAM
8-64 GB de No mínimo 4 GB 1.5x a quantidade de RAM
RAM
> 64 GB de No mínimo 4 GB Não recomendado
RAM

Obviamente, a quantidade de troca pode depender da carga de trabalho. Se a máquina estiver


55 5. 102.1: Definir o esquema de partições do disco rígido
Fabio Gonçalves De Melo Santana / [email protected]

executando um serviço crítico, como um banco de dados, servidor Web ou SAP, é aconselhável
verificar o valor recomendado na documentação desses serviços.

LVM
Já discutimos como os discos são organizados em uma ou mais partições, com cada partição
contendo um sistema de arquivos que descreve como os arquivos e os metadados associados são
armazenados. Uma das desvantagens do particionamento é que o administrador do sistema
deve decidir antecipadamente como o espaço em disco disponível em um dispositivo será
distribuído. Isso pode ser problemático mais tarde, se uma partição exigir mais espaço do que
o originalmente planejado. Claro que as partições podem ser redimensionadas, mas isso nem
sempre é possível (se, por exemplo, não houver mais espaço livre no disco).

O Gerenciamento de Volumes Lógicos (LVM) é uma forma de virtualização do armazenamento


que oferece aos administradores de sistema um método mais flexível do que o particionamento
tradicional para gerenciar o espaço em disco. O objetivo do LVM é facilitar a gestão das
necessidades de armazenamento de seus usuários finais. A unidade básica é o Volume Físico
(PV), que é um dispositivo de bloco no sistema, como uma partição de disco ou uma matriz
RAID.

Os PVs são agrupados em Grupos de Volumes (VG), que abstraem os dispositivos subjacentes
e são vistos como um único dispositivo lógico, com a capacidade de armazenamento combinada
dos PVs do componente.

Cada volume em um Grupo de Volumes é subdividido em partes de tamanho fixo chamadas


extensões. As extensões em um PV são chamadas Extensões Físicas (PE), enquanto as do
volume lógico são Extensões Lógicas (LE). De maneira geral, cada extensão lógica é mapeada
para uma extensão física, mas isso pode mudar se forem usados recursos como o espelhamento
de disco.

Os Grupos de Volumes podem ser subdivididos em Volumes Lógicos (LVs), com funcionalidade
semelhante à das partições, mas com mais flexibilidade.

O tamanho de um Volume Lógico, conforme especificado durante a sua criação, é na verdade


definido pelo tamanho das extensões físicas (por padrão, 4 MB) multiplicado pelo número de
extensões no volume. Com isso, é fácil entender que para aumentar um Volume Lógico, por
exemplo, basta adicionar mais extensões do pool disponível no Grupo de Volumes. Da mesma
forma, as extensões podem ser removidas para reduzir o LV.

Após sua criação, um Volume Lógico é visto pelo sistema operacional como um dispositivo
de bloco normal. Um dispositivo será criado em /dev, com o nome /dev/VGNAME/LV-
NAME, em que VGNAME é o nome do Grupo de Volumes e LVNAME o nome do Volume
56 5. 102.1: Definir o esquema de partições do disco rígido
Fabio Gonçalves De Melo Santana / [email protected]

Lógico.

Esses dispositivos podem ser formatados com o sistema de arquivos desejado usando utilitários
padrão (como o mkfs.ext4, por exemplo) e montados com os métodos usuais, seja manual-
mente, com o comando mount, ou automaticamente, adicionando-os ao arquivo /etc/fstab.

Resumo
Nesta aula, falamos sobre particionamento e explicamos quais diretórios geralmente são man-
tidos em partições separadas e por quê. Além disso, demos uma visão geral do LVM (Geren-
ciamento Lógico de Volumes) e como ele pode oferecer uma maneira mais flexível de alocar
os dados e o espaço em disco em comparação com o particionamento tradicional.

Os seguintes arquivos, termos e utilitários foram discutidos:

• /: O sistema de arquivos raiz do Linux;


• /var: O local padrão dos “dados variáveis”, ou seja, dados que podem encolher ou
aumentar com o tempo;
• /home: O diretório pai padrão para as pastas iniciais dos usuários regulares de um
sistema;
• /boot: O local padrão dos arquivos do gerenciador de inicialização, kernel do Linux e
disco de RAM inicial;
• Partição do Sistema EFI (ESP): Usada pelos sistemas que têm UEFI implementada
para o armazenamento dos arquivos de inicialização do sistema;
• Espaço de troca: Usado para trocar páginas de memória do kernel quando a RAM
está sendo muito solicitada;
• Pontos de montagem: Locais em um diretório nos quais um dispositivo (como um
disco rígido) será montado;
• Partições: Divisões em um disco rígido.
57 5. 102.1: Definir o esquema de partições do disco rígido
Fabio Gonçalves De Melo Santana / [email protected]

Talvez isso possa te ajudar. . .

Fig. 5.1: LAYOUT DO DISCO

• Fonte: - https://brunopontes.com.br/ensino/semestres/2018.1/soredes_info4v/aulas/roteiro_aula_1
Fabio Gonçalves De Melo Santana / [email protected]

6
Instalar um gerenciador de
inicialização

Introdução
Quando um computador é ligado, o primeiro software a ser executado é o gerenciador de
inicialização. O único objetivo desse código é carregar o kernel de um sistema operacional e
entregar o controle a ele. O kernel então carrega os drivers necessários, inicializa o hardware
e, em seguida, carrega o restante do sistema operacional.

O GRUB é o gerenciador de inicialização usado na maioria das distribuições Linux. Ele pode
carregar o kernel do Linux ou outros sistemas operacionais, como o Windows, além de lidar
com diversas imagens e parâmetros do kernel como entradas de menu separadas. A seleção do
kernel na inicialização é feita por meio de uma interface acionada por teclado. Existe também
uma interface de linha de comando para editar as opções e parâmetros de inicialização.

A maioria das distribuições Linux instala e configura o GRUB (na verdade, o GRUB 2) au-
tomaticamente, para que um usuário comum não precise pensar nisso. No entanto, como
administrador do sistema, é essencial saber controlar o processo de inicialização para ser pos-
sível recuperar o sistema no caso de uma falha na inicialização—por exemplo, se houver um
erro na atualização do kernel.

58
59 6. Instalar um gerenciador de inicialização
Fabio Gonçalves De Melo Santana / [email protected]

GRUB Legacy e GRUB 2


A versão original do GRUB (Grand Unified Bootloader), agora conhecida como GRUB Legacy,
foi desenvolvida em 1995 como parte do projeto GNU Hurd e, mais tarde, adotada como
o gerenciador de inicialização padrão de muitas distribuições Linux, substituindo alternativas
anteriores, como o LILO.

O GRUB 2 é uma remodelagem completa do GRUB com o objetivo de deixá-lo mais limpo,
seguro, robusto e poderoso. Dentre as muitas vantagens em relação ao GRUB Legacy estão
um arquivo de configuração muito mais flexível.

Também há suporte para temas e menus gráficos de inicialização com telas de abertura, a
possibilidade de inicializar ISOs LiveCD diretamente a partir do disco rígido, melhor suporte
para arquiteturas não-x86, suporte universal para UUIDs (facilitando a identificação de discos
e partições) e muito mais.

O GRUB Legacy não está mais em desenvolvimento ativo (a última versão foi a 0.97, em 2005),
e hoje a maioria das principais distribuições Linux vem com o GRUB 2 como gerenciador de
inicialização padrão. No entanto, ainda podemos encontrar sistemas usando o GRUB Legacy;
portanto, é importante saber como usá-lo e em que ele difere do GRUB 2.

A partição /boot
No Linux, os arquivos necessários para o processo de inicialização geralmente são armazena-
dos em uma partição de inicialização montada no sistema de arquivos raiz e coloquialmente
chamada de /boot.

Uma partição de inicialização não é imprescindível nos sistemas atuais, já que os carregadores
de inicialização como o GRUB geralmente são capazes de montar o sistema de arquivos raiz e
procurar os arquivos necessários dentro de um diretório /boot. Porém, seu uso é aconselhável,
pois ela separa os arquivos necessários ao processo de inicialização do restante do sistema de
arquivos.

Portanto, para garantir uma compatibilidade máxima, a partição /boot geralmente está local-
izada no início do disco e termina antes do cilindro 1024 (528 MB), garantindo que a máquina
sempre possa carregar o kernel. O tamanho recomendado para essa partição em uma máquina
atual é de 300 MB.

Outras razões para uma partição /boot separada são a criptografia e a compactação, já que
alguns métodos ainda não são suportados pelo GRUB 2, ou ainda se a partição raiz do sistema
(/) precisar ser formatada usando um sistema de arquivos não suportado.
60 6. Instalar um gerenciador de inicialização
Fabio Gonçalves De Melo Santana / [email protected]

Conteúdo da partição de inicialização


O conteúdo da partição /boot pode variar de acordo com a arquitetura do sistema ou o geren-
ciador de inicialização usado, mas em um sistema baseado em x86 geralmente encontramos
os arquivos abaixo. A maioria deles recebe o sufixo -VERSION, onde -VERSION é a versão
correspondente do kernel do Linux. Assim, por exemplo, o arquivo de configuração para a
versão do kernel do Linux 4.15.0-65-generic seria chamado de config-4.15.0-65-generic.

• Arquivo de configuração: Este arquivo, geralmente chamado config-VERSION@, ar-


mazena parâmetros de configuração para o kernel do Linux. Este arquivo é gerado
automaticamente quando um novo kernel é compilado ou instalado e não deve ser dire-
tamente modificado pelo usuário;
• Mapa do sistema: Este arquivo é uma tabela de consulta que articula nomes de
símbolos (como variáveis ou funções) com sua posição correspondente na memória.
Isso é útil ao se corrigir um tipo de falha do sistema conhecida como kernel panic
(pânico do kernel), pois permite ao usuário saber qual variável ou função estava sendo
chamada quando ocorreu a falha. Como no caso do arquivo de configuração, o nome
geralmente é System.map-VERSION (por exemplo, System.map-4.15.0-65-generic);
• Kernel do Linux: Este é o kernel do sistema operacional propriamente dito. Seu nome
é geralmente vmlinux-VERSION (por exemplo, vmlinux-4.15.0-65-generic);
• Disco RAM inicial: Geralmente se chama initrd.img-VERSION e contém um sistema
de arquivos raiz mínimo carregado em um disco RAM, contendo os utilitários e módulos
de kernel necessários para que o kernel possa montar o sistema de arquivos raiz real;
• Arquivos relacionados ao gerenciador de inicialização: Em sistemas com o GRUB
instalado, eles costumam estar localizados em /boot/grub e incluem o arquivo de con-
figuração (/boot/grub/grub.cfg para o GRUB 2 ou /boot/grub/menu.lst no caso do
GRUB Legacy), módulos (em /boot/grub/i386-pc), arquivos de tradução (em /boot/-
grub/locale) e fontes (em /boot/grub/fonts) do GRUB.
Fabio Gonçalves De Melo Santana / [email protected]

7
GRUB 2

Instalando o GRUB 2
O GRUB 2 pode ser instalado usando o utilitário grub-install. Se seu sistema se recusa a
inicializar, você precisará inicializá-lo usando um Live CD ou um disco de recuperação, descobrir
qual é a partição de inicialização do seu sistema, montá-la e executar o utilitário.

O primeiro disco de um sistema é geralmente o dispositivo de inicialização. Pode ser necessário


saber se existe uma partição de inicialização no disco. Para isso existe o utilitário fdisk. Para
listar todas as partições no primeiro disco da sua máquina, use:

Código 7.1: Listar partições com o fdisk

root@debian10:/home/debian# fdisk -l /dev/sda


Disk /dev/sda: 512 GiB, 549755813888 bytes, 1073741824 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd22a97f0

Device Boot Start End Sectors Size Id Type


/dev/sda1 * 2048 999423 997376 487M 83 Linux
/dev/sda2 1001470 1073739775 1072738306 511.5G 5 Extended
/dev/sda5 1001472 1073739775 1072738304 511.5G 8e Linux LVM

61
62 7. GRUB 2
Fabio Gonçalves De Melo Santana / [email protected]

A partição de inicialização é identificada com o * na coluna boot. No exemplo acima, ela é


/dev/sda1.

A seguir, crie um diretório temporário em /mnt e monte a partição nele:

Código 7.2: Criar e montar a partição /dev/sda1 no diretório /mnt/tmp/

root@debian10:/home/debian# mkdir /mnt/tmp


root@debian10:/home/debian# mount /dev/sda1 /mnt/tmp/

Depois execute grub-install, apontando-o para o dispositivo de inicialização (não a partição) e


o diretório em que a partição de inicialização está montada. Se o sistema possuir uma partição
de inicialização dedicada, o comando será:

Código 7.3: instalação do GRUB legacy

root@debian10:/home/debian# grub-install --boot-directory=/mnt/tmp/ /dev/sda1

Caso esteja instalando em um sistema que não possui uma partição de inicialização, mas
apenas um diretório /boot no sistema de arquivos raiz, aponte-o em grub-install. Nesse caso,
o comando é:

root@debian10:/home/debian# grub-install --boot-directory=/boot /dev/sda1

Configurando o GRUB 2
O arquivo de configuração padrão do GRUB 2 é /boot/grub/grub.cfg. Esse arquivo é gerado
automaticamente e não se recomenda editá-lo à mão. Para fazer alterações na configuração do
GRUB, é preciso editar o arquivo /etc/default/grub e depois executar o utilitário update-
grub para gerar um arquivo compatível.

update-grub normalmente é um atalho para grub-mkconfig -o /boot/grub/grub.cfg,


de modo que eles produzem os mesmos resultados.

Existem algumas opções no arquivo /etc/default/grub para controlar o comportamento do


GRUB 2, como o kernel padrão de inicialização, tempo limite, parâmetros extras da linha de
comando etc. Os mais importantes são:
63 7. GRUB 2
Fabio Gonçalves De Melo Santana / [email protected]

• GRUB_DEFAULT=: A entrada de menu padrão para a inicialização. Pode ser um


valor numérico (como 0, 1, etc.), o nome de um item de menu (como debian) ou saved,
que é usado em conjunto com GRUB_SAVEDEFAULT=, explicado abaixo. Lembre-se
de que as entradas de menu começam com zero, de forma que a primeira é 0, a segunda
é 1 e assim por diante;
• GRUB_SAVEDEFAULT=: Se esta opção estiver definida como true e GRUB_DE-
FAULT= como saved, a opção padrão de inicialização sempre será a última selecionada
no menu de inicialização;
• GRUB_TIMEOUT=: O tempo limite, em segundos, para que a entrada do menu
padrão seja selecionada. Se definido como 0, o sistema inicializará a entrada padrão
sem exibir um menu. Se definido como -1, o sistema aguardará até que o usuário
selecione uma opção, não importa quanto tempo leve;
• GRUB_CMDLINE_LINUX=: Lista as opções de linha de comando que serão adi-
cionadas às entradas do kernel do Linux;
• GRUB_CMDLINE_LINUX_DEFAULT=: Por padrão, duas entradas de menu são
geradas para cada kernel do Linux, uma com as opções padrão e uma entrada para
recuperação. Com esta opção, você pode incluir parâmetros extras que serão adicionados
apenas à entrada padrão;
• GRUB_ENABLE_CRYPTODISK=: Se definido como y, comandos como grub-
mkconfig, update-grub e grub-install procuram por discos criptografados e adicionam
os comandos necessários para acessá-los durante a inicialização. Assim, a inicialização
automática é desabilitada (GRUB_TIMEOUT= com valor diferente de -1) porque uma
senha será exigida para descriptografar os discos antes que possam ser acessados.

Administrando as entradas de menu


Quando rodamos o update-grub, o GRUB 2 busca por kernels e sistemas operacionais na
máquina e gera as entradas de menu correspondentes no arquivo /boot/grub/grub.cfg.
É possível adicionar novas entradas manualmente aos arquivos de script dentro do diretório
/etc/grub.d.

Esses arquivos devem ser executáveis e são processados em ordem numérica pelo update-grub.
Portanto, 05_debian_theme é processado antes de 10_linux e assim por diante. As entradas
de menu personalizadas são geralmente adicionadas ao arquivo 40_custom.

A sintaxe básica de uma entrada de menu é mostrada abaixo:

menuentry "Default OS" {


set root=(hd0,1)
linux /vmlinuz root=/dev/sda1 ro quiet splash
initrd /initrd.img
}
64 7. GRUB 2
Fabio Gonçalves De Melo Santana / [email protected]

A primeira linha sempre começa com menuentry e termina com {. O texto entre aspas será
mostrado como o rótulo da entrada no menu de inicialização do GRUB 2.

O parâmetro set root define o disco e a partição em que o sistema de arquivos raiz do sistema
operacional está localizado. Note que no GRUB 2 os discos são numerados a partir de zero,
então hd0 é o primeiro disco (sda no Linux), hd1 o segundo e assim por diante. As partições,
por sua vez, são numeradas a partir de um. No exemplo acima, o sistema de arquivos raiz
está localizado no primeiro disco (hd0), primeira partição (,1) ou sda1.

Em vez de especificar diretamente o dispositivo e a partição, também podemos pedir que o


GRUB 2 busque por um sistema de arquivos com um rótulo ou UUID (Universally Unique
Identifier) específico. Para isso, use o parâmetro search –set=root seguido por –label e o
rótulo do sistema de arquivos a buscar, ou –fs-uuid seguido pelo UUID do sistema de arquivos.

Use o comando abaixo para encontrar o UUID de um sistema de arquivos:

Código 7.4: Encontar UUID de um dispositivo de bloco

root@debian10:/home/debian# ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 Jun 30 12:01 39bdcf39-9858-4d47-8f0f-dadfad509571 -> ../../dm-1
lrwxrwxrwx 1 root root 10 Jun 30 12:01 46ca5297-6ca0-45a0-b30a-c00dce00fe8e -> ../../dm-4
lrwxrwxrwx 1 root root 10 Jun 30 12:01 475d0289-b393-4af6-9ad1-63749b29e0b3 -> ../../dm-0
lrwxrwxrwx 1 root root 10 Jun 30 12:01 aeae66be-f0c2-470d-8481-884427924c77 -> ../../dm-2
lrwxrwxrwx 1 root root 10 Jun 30 12:01 b1199388-b7a3-44ed-bd41-b814cd8989c1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jun 30 12:01 dd1abd55-aad0-46ad-8047-8177d00da412 -> ../../dm-3

No exemplo acima, o UUID de /dev/sda1 é b1199388-b7a3-44ed-bd41-b814cd8989c1. Se


quisermos defini-lo como dispositivo raiz do GRUB 2, o comando seria search –set=root –fs-
uuid b1199388-b7a3-44ed-bd41-b814cd8989c1.

Ao usar o comando search, é comum adicionar o parâmetro –no-floppy para que o GRUB não
perca tempo buscando em disquetes.

A linha linux indica onde está localizado o kernel do sistema operacional (neste caso, o arquivo
vmlinuz na raiz do sistema de arquivos). Depois disso, podemos passar parâmetros na linha
de comando para o kernel.

No exemplo acima, especificamos a partição root (root=/dev/sda1) e passamos três parâmet-


ros do kernel: a partição root deve ser montada com acesso apenas de leitura (ro), a maioria
das mensagens de log deve ser desabilitada (quiet) e uma tela de boas-vindas deve ser exibida
(splash).

A linha initrd indica onde está localizado o disco de RAM inicial. No exemplo acima, o arquivo
65 7. GRUB 2
Fabio Gonçalves De Melo Santana / [email protected]

é initrd.img, localizado na raiz do sistema de arquivos.

A maioria das distribuições Linux não coloca de fato o kernel e o initrd no diretório
raiz do sistema de arquivos raiz. Em vez disso, esses são links para os arquivos reais
dentro do diretório ou partição /boot.

A última linha de uma entrada do menu deve conter apenas o caractere }.

Interagindo com o GRUB 2


Ao inicializar um sistema com o GRUB 2, teremos na tela um menu de opções. Use as setas do
teclado para selecionar uma opção e Enter para confirmar e inicializar a entrada selecionada.

Se você vir apenas uma contagem regressiva, mas não um menu, pressione Shift para
exibir o menu.

Para editar uma opção, selecione-a com as setas e pressione E. Será exibida uma janela de
editor com o conteúdo da menuentry associada àquela opção, confirme definido em /boot/-
grub/grub.cfg.

Depois de editar uma opção, digite Ctrl+X ou F10 para inicializar, ou ainda Esc para retornar
ao menu.

Para entrar no shell do GRUB 2, pressione C na tela do menu (ou Ctrl+C) na janela de edição.
Aparecerá um prompt de comando como este: grub >

Digite help para ver uma lista de todos os comandos disponíveis ou pressione Esc para sair do
shell e retornar à tela do menu.

Lembre-se de que esse menu não aparecerá se GRUB_TIMEOUT estiver definido com
0 em /etc/default/grub.
66 7. GRUB 2
Fabio Gonçalves De Melo Santana / [email protected]

Talvez isso possa te ajudar. . .

Fig. 7.1: GRUB vs GRUB2

• Fonte: - https://borosan.gitbook.io/lpic1-exam-guide/1011-determine-and-configure-
hardware-settings
Fabio Gonçalves De Melo Santana / [email protected]

8
102.3: Gerenciar Bibliotecas
Compartilhadas

Introdução
Conceito de Bibliotecas Compartilhadas

Bibliotecas são coleções de código que se destinam a ser usadas por muitos programas difer-
entes; assim como as bibliotecas físicas mantêm livros e outros recursos para serem usados
por muitas pessoas diferentes.

Para construir um arquivo executável a partir do código-fonte de um programa, duas etapas


importantes são necessárias. Primeiro, o compilador transforma o código-fonte em código de
máquina que é armazenado nos chamados arquivos-objeto. Em segundo lugar, o vinculador
combina os arquivos-objeto e os vincula a bibliotecas para gerar o arquivo executável final.
Essa vinculação pode ser feita de forma estática ou dinâmica.

Bibliotecas estáticas

Uma biblioteca estática é mesclada com o programa no momento do link. Uma cópia do
código da biblioteca é incorporada ao programa e se torna parte dele. Assim, o programa
não tem dependências da biblioteca em tempo de execução porque o programa já contém o
código da biblioteca. Não ter dependências pode ser visto como uma vantagem, pois você
não precisa se preocupar em ter certeza de que as bibliotecas usadas estão sempre disponíveis.

67
68 8. 102.3: Gerenciar Bibliotecas Compartilhadas
Fabio Gonçalves De Melo Santana / [email protected]

Por outro lado, os programas estaticamente vinculados são mais pesados.

Bibliotecas compartilhadas (ou dinâmicas)

No caso de bibliotecas compartilhadas, o vinculador simplesmente cuida para que o programa


faça referência às bibliotecas corretamente. O vinculador, entretanto, não copia nenhum
código de biblioteca para o arquivo de programa. No tempo de execução, porém, a biblioteca
compartilhada deve estar disponível para satisfazer as dependências do programa. Esta é uma
abordagem econômica para gerenciar os recursos do sistema, pois ajuda a reduzir o tamanho
dos arquivos do programa e apenas uma cópia da biblioteca é carregada na memória, mesmo
quando é usada por vários programas.

Convenções de nomenclatura de arquivo de objeto compartilhado


O nome de uma biblioteca compartilhada, também conhecida como soname, segue um padrão
composto por três elementos:

• Nome da biblioteca (normalmente prefixado por lib);


• so (que significa “objeto compartilhado”);
• Número da versão da biblioteca.

Aqui está um exemplo: libpthread.so.0

Por outro lado, os nomes das bibliotecas estáticas terminam em .a, por exemplo, libpthread.a.

Como os arquivos que contêm bibliotecas compartilhadas devem estar disponíveis


quando o programa é executado, a maioria dos sistemas Linux contém bibliotecas
compartilhadas. Como as bibliotecas estáticas são necessárias apenas em um arquivo
dedicado quando um programa está vinculado, elas podem não estar presentes em um
sistema de usuário final.

glibc (biblioteca GNU C) é um bom exemplo de biblioteca compartilhada. Em um sistema


Debian GNU/Linux 9.9, seu arquivo é denominado libc.so.6. Esses nomes de arquivo bastante
gerais são normalmente links simbólicos que apontam para o arquivo real que contém uma
biblioteca, cujo nome contém o número de versão exato. No caso da glibc, este link simbólico
se parece com este:

Código 8.1: glibc

root@debian10:/home/debian# ls -l /lib/x86_64-linux-gnu/libc.so.6
lrwxrwxrwx 1 root root 12 May 1 2019 /lib/x86_64-linux-gnu/libc.so.6 -> libc-2.28.so
69 8. 102.3: Gerenciar Bibliotecas Compartilhadas
Fabio Gonçalves De Melo Santana / [email protected]

Este padrão de referenciar arquivos de biblioteca compartilhada nomeados por uma versão
específica por nomes de arquivo mais gerais é uma prática comum.

Outros exemplos de bibliotecas compartilhadas incluem libreadline (que permite aos usuários
editar linhas de comando à medida que são digitadas e inclui suporte para os modos de edição
Emacs e vi), libcrypt (que contém funções relacionadas à criptografia, hashing e codificação)
ou libcurl ( que é uma biblioteca de transferência de arquivos multiprotocolo).

Os locais comuns para bibliotecas compartilhadas em um sistema Linux são:

• /lib
• /lib32
• /lib64
• /usr/lib
• /usr/local/lib

O conceito de bibliotecas compartilhadas não é exclusivo do Linux. No Windows, por


exemplo, eles são chamados de DLL, que significa bibliotecas vinculadas dinâmicas.

Configuração de caminhos de biblioteca compartilhada


As referências contidas em programas vinculados dinamicamente são resolvidas pelo vincu-
lador dinâmico (ld.so ou ld-linux.so) quando o programa é executado. O vinculador dinâmico
procura bibliotecas em vários diretórios. Esses diretórios são especificados pelo caminho da
biblioteca. O caminho da biblioteca é configurado no diretório /etc, nomeadamente no ar-
quivo /etc/ld.so.conf e, mais comum hoje em dia, em arquivos que residem no diretório
/etc/ld.so.conf.d. Normalmente, o primeiro inclui apenas uma única linha de inclusão para
arquivos * .conf no último:

Código 8.2: O arquivo /etc/ld.so.conf em distribuições Debian

root@debian10:/home/debian# cat /etc/ld.so.conf


include /etc/ld.so.conf.d/*.conf

O diretório /etc/ld.so.conf.d contém arquivos * .conf:

Código 8.3: O diretório /etc/ld.so.conf.d/

root@debian10:/home/debian# ls /etc/ld.so.conf.d/
fakeroot-x86_64-linux-gnu.conf libc.conf x86_64-linux-gnu.conf
70 8. 102.3: Gerenciar Bibliotecas Compartilhadas
Fabio Gonçalves De Melo Santana / [email protected]

Esses arquivos * .conf devem incluir os caminhos absolutos para os diretórios da biblioteca
compartilhada:

Código 8.4: exemplo de um arquivo .conf no diretório /etc/ld.so.conf.d/

root@debian10:/home/debian# cat /etc/ld.so.conf.d/x86_64-linux-gnu.conf


# Multiarch support
/usr/local/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

O comando ldconfig se encarrega de ler esses arquivos de configuração, criando o conjunto


mencionado de links simbólicos que ajudam a localizar as bibliotecas individuais e, finalmente,
atualizando o arquivo de cache /etc/ld.so.cache. Portanto, ldconfig deve ser executado
sempre que arquivos de configuração são adicionados ou atualizados.

As opções úteis para ldconfig são:

• -v, –verbose: Exibe os números da versão da biblioteca, o nome de cada diretório e os


links que são criados:

Código 8.5: ldconfig com parametro –verbose

root@debian10:/home/debian# ldconfig -v
/usr/lib/x86_64-linux-gnu/libfakeroot:
libfakeroot-0.so -> libfakeroot-tcp.so
/usr/local/lib:
/lib/x86_64-linux-gnu:
libgcc_s.so.1 -> libgcc_s.so.1
libdevmapper.so.1.02.1 -> libdevmapper.so.1.02.1
libpcprofile.so -> libpcprofile.so
libmariadb.so.3 -> libmariadb.so.3
libicutu.so.63 -> libicutu.so.63.1
libgstmpegts-1.0.so.0 -> libgstmpegts-1.0.so.0.1404.0
libcrypto.so.1.1 -> libcrypto.so.1.1

• -p, –print-cache: Imprime as listas de diretórios e bibliotecas candidatas armazenadas


no cache atual:

Código 8.6: ldconfig com parametro –print-cache

root@debian10:/home/debian# ldconfig -p | grep libicutu


libicutu.so.63 (libc6,x86-64) => /lib/x86_64-linux-gnu/libicutu.so.63
71 8. 102.3: Gerenciar Bibliotecas Compartilhadas
Fabio Gonçalves De Melo Santana / [email protected]

Se listarmos /lib/x86_64-linux-gnu/libicutu.so.63, encontraremos a referência ao arquivo de


objeto compartilhado real libicutu.so.63.1 que está armazenado no mesmo diretório:

Código 8.7: Inspecionando a bilbioteca libicutu.so.63

root@debian10:/home/debian# ls -l /lib/x86_64-linux-gnu/libicutu.so.63
lrwxrwxrwx 1 root root 16 Mar 13 2020 /lib/x86_64-linux-gnu/libicutu.so.63 -> libicutu.so
.63.1

Além dos arquivos de configuração descritos acima, a variável de ambiente LD_LIBRARY_PATH


pode ser usada para adicionar novos caminhos para bibliotecas compartilhadas temporaria-
mente. É composto por um conjunto de diretórios separados por dois pontos (:) onde as
bibliotecas são pesquisadas. Por exemplo, para adicionar /usr/local/mylib ao caminho da
biblioteca na sessão shell atual, você pode digitar:

Código 8.8: Adicionando um caminho de bibliteca compartilhada

root@debian10:/home/debian# LD_LIBRARY_PATH=/usr/local/mylib

Agora você pode verificar seu valor:

root@debian10:/home/debian# echo $LD_LIBRARY_PATH


/usr/local/mylib

Para adicionar /usr/local/mylib ao caminho da biblioteca na sessão de shell atual e exportá-


lo para todos os processos filhos gerados a partir desse shell, você digitaria:

Código 8.9: Exportando a variável de ambiente

root@debian10:/home/debian# export LD_LIBRARY_PATH=/usr/local/mylib

Para remover a variável de ambiente LD_LIBRARY_PATH, basta digitar:

Código 8.10: Deletar a variável de ambiente

root@debian10:/home/debian# unset LD_LIBRARY_PATH


72 8. 102.3: Gerenciar Bibliotecas Compartilhadas
Fabio Gonçalves De Melo Santana / [email protected]

Para tornar as alterações permanentes, você pode escrever a linha

Código 8.11: Persistir informações de variável de ambiente

root@debian10:/home/debian# export LD_LIBRARY_PATH=/usr/local/mylib

em um dos scripts de inicialização do Bash, como /etc/bash.bashrc ou ~/.bashrc.

Pesquisando as dependências de um determinado executável


Para pesquisar as bibliotecas compartilhadas exigidas por um programa específico, use o co-
mando ldd seguido pelo caminho absoluto para o programa. A saída mostra o caminho do
arquivo de biblioteca compartilhada, bem como o endereço de memória hexadecimal no qual
ele é carregado:

Código 8.12: Listar dependências de um utilitário com o comando ldd

root@debian10:/home/debian# ldd /usr/bin/ls


linux-vdso.so.1 (0x00007ffe54560000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f3eba1b6000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3eb9ff5000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f3eb9f81000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f3eb9f7c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3eba41c000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f3eb9f5b000)

Da mesma forma, usamos o ldd para pesquisar as dependências de um objeto compartilhado:

Código 8.13: Listar dependências de bibliotecas compartilhadas com ldd

root@debian10:/home/debian# ldd /lib/x86_64-linux-gnu/libc.so.6


/lib64/ld-linux-x86-64.so.2 (0x00007fe29a8e7000)
linux-vdso.so.1 (0x00007ffc70fc4000)

Com a opção -u (ou –unused), ldd imprime as dependências diretas não utilizadas (se exis-
tirem):

Código 8.14: Listar dependências diretas não utilizadas

root@debian10:/home/debian# ldd -u /usr/bin/git


Unused direct dependencies:
/lib/x86_64-linux-gnu/libz.so.1
/lib/x86_64-linux-gnu/libpthread.so.0
73 8. 102.3: Gerenciar Bibliotecas Compartilhadas
Fabio Gonçalves De Melo Santana / [email protected]

/lib/x86_64-linux-gnu/librt.so.1

O motivo de ter essas dependências não utilizadas está relacionado às opções usadas pelo
vinculador ao construir o binário. Embora o programa não precise de uma biblioteca não
utilizada, ele ainda estava vinculado e rotulado como NECESSÁRIO nas informações sobre o
arquivo-objeto. Você pode investigar isso usando comandos como readelf ou objdump, que
você usará em breve no exercício exploratório.

Resumo
Nesta aula você aprendeu:

• O que é uma biblioteca compartilhada (ou dinâmica);


• As diferenças entre bibliotecas compartilhadas e estáticas;
• Os nomes das bibliotecas compartilhadas (sonames);
• Os locais preferidos para bibliotecas compartilhadas em um sistema Linux, como /lib
ou /usr/lib;
• O objetivo do vinculador dinâmico ld.so (ou ld-linux.so);
• Como configurar caminhos de biblioteca compartilhada por meio de arquivos em /etc/
como ld.so.conf ou aqueles no diretório ld.so.conf.d;
• Como configurar caminhos de biblioteca compartilhada por meio da variável de ambiente
LD_LIBRARY_PATH;
• Como procurar dependências de bibliotecas executáveis e compartilhadas.

Comandos usados nesta aula:


• ls: Lista o conteúdo do diretório;
• cat: Concatene arquivos e imprima na saída padrão;
• sudo: Faça com que o superusuário execute o comando com privilégios administrativos;
• ldconfig: Configure ligações de tempo de execução do vinculador dinâmico;
• echo: Exibe o valor da variável de ambiente;
• export: Exporte o valor da variável de ambiente para shells filho;
• unset: Remova a variável de ambiente;
• ldd: Imprime dependências de objetos compartilhados de um programa;
• readelf: Exibe informações sobre arquivos ELF (ELF significa formato executável e
vinculável);
• objdump: Imprima informações de arquivos de objeto.
74 8. 102.3: Gerenciar Bibliotecas Compartilhadas
Fabio Gonçalves De Melo Santana / [email protected]

Talvez isso possa te ajudar. . .

Fig. 8.1: static vs dynamic

• Fonte: - https://medium.com/@valentina.rua123/static-and-dynamic-library-in-c-fc4f168ae71d
Fabio Gonçalves De Melo Santana / [email protected]

9
Gerenciamento de pacotes em
distribuições Debian

Introdução
Era uma vez. . . quando o Linux ainda era uma criança, a maneira mais comum de distribuir
software era um arquivo compactado (geralmente um arquivo .tar.gz) com código-fonte, que
você mesmo descompactava e compilava.

Só que conforme a quantidade e a complexidade do software aumentaram, a necessidade de


uma maneira de distribuir software pré-compilado tornou-se real. Afinal, nem todos tinham
os recursos, tanto em tempo quanto em capacidade de computação, para compilar grandes
projetos como o kernel Linux.

Com isso, os esforços para padronizar uma maneira de distribuir esses “pacotes” de software
aumentaram e os primeiros gerenciadores de pacotes nasceram. Essas ferramentas tornaram
muito mais fácil instalar, configurar ou remover programas de um sistema.

Um deles era o formato de pacote Debian (.deb) e sua ferramenta de pacote (dpkg). Hoje,
eles são amplamente usados não apenas no próprio Debian, mas também em seus derivados,
como o Ubuntu e aqueles derivados dele.

Outra ferramenta de gerenciamento de pacotes que é popular em sistemas baseados em De-


bian é a Advanced Package Tool (apt), que pode agilizar muitos dos aspectos da instalação,

75
76 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

manutenção e remoção de pacotes, tornando-a muito mais fácil.

A Ferramenta de Pacotes Debian (dpkg)


A ferramenta Debian Package (dpkg) é o utilitário essencial para instalar, configurar, manter
e remover pacotes de software em sistemas baseados em Debian. A operação mais básica é
instalar um pacote .deb, que pode ser feito com:

Código 9.1: Instalando pacotes com o dpkg

root@debian10:/home/debian# dpkg -i NOMEDOPACOTE

Onde NOMEDOPACOTE é o nome do arquivo .deb que você deseja instalar.

As atualizações de pacote são tratadas da mesma maneira. Antes de instalar um pacote,


o dpkg irá verificar se uma versão anterior já existe no sistema. Nesse caso, o pacote será
atualizado para a nova versão. Caso contrário, uma nova cópia será instalada.

Lidando com Dependências


Na maioria das vezes, um pacote pode depender de outros para funcionar conforme o planejado.
Por exemplo, um editor de imagens pode precisar de bibliotecas para abrir arquivos JPEG.

O dpkg verificará se essas dependências estão instaladas em seu sistema e não conseguirá
instalar o pacote se não estiverem. Neste caso, o dpkg irá listar quais pacotes estão faltando.
No entanto, ele não pode resolver dependências por si só. Cabe ao usuário encontrar os
pacotes .deb com as dependências correspondentes e instalá-los.

No exemplo abaixo, o usuário tenta instalar o pacote do editor de vídeo OpenShot, mas faltam
algumas dependências:

Código 9.2: Dependências na instalação um pacote .deb

root@debian10:/home/debian# dpkg -i openshot-qt_2.4.3+dfsg1-1_all.deb


(Reading database ... 269630 files and directories currently installed.)
Preparing to unpack openshot-qt_2.4.3+dfsg1-1_all.deb ...
Unpacking openshot-qt (2.4.3+dfsg1-1) over (2.4.3+dfsg1-1) ...
dpkg: dependency problems prevent configuration of openshot-qt:
openshot-qt depends on fonts-cantarell; however:
Package fonts-cantarell is not installed.
openshot-qt depends on python3-openshot; however:
Package python3-openshot is not installed.
openshot-qt depends on python3-pyqt5; however:
Package python3-pyqt5 is not installed.
77 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

openshot-qt depends on python3-pyqt5.qtsvg; however:


Package python3-pyqt5.qtsvg is not installed.
openshot-qt depends on python3-pyqt5.qtwebkit; however:
Package python3-pyqt5.qtwebkit is not installed.
openshot-qt depends on python3-zmq; however:
Package python3-zmq is not installed.

dpkg: error processing package openshot-qt (--install):


dependency problems - leaving unconfigured
Processing triggers for mime-support (3.60ubuntu1) ...
Processing triggers for gnome-menus (3.32.0-1ubuntu1) ...
Processing triggers for desktop-file-utils (0.23-4ubuntu1) ...
Processing triggers for hicolor-icon-theme (0.17-2) ...
Processing triggers for man-db (2.8.5-2) ...
Errors were encountered while processing:
openshot-qt

Conforme mostrado acima, o OpenShot depende dos pacotes fonts-cantarell, python3-openshot,


python3-pyqt5, python3-pyqt5.qtsvg, python3-pyqt5.qtwebkit e python3-zmq. Todos eles pre-
cisam ser instalados antes que a instalação do OpenShot seja bem-sucedida.

Removendo Pacotes
Para remover um pacote, passe o parâmetro -r para dpkg, seguido pelo nome do pacote. Por
exemplo, o seguinte comando removerá o pacote unrar do sistema:

Código 9.3: Removendo pacotes com dpkg

root@debian10:/home/debian# dpkg -r unrar


(Reading database ... 269630 files and directories currently installed.)
Removing unrar (1:5.6.6-2) ...
Processing triggers for man-db (2.8.5-2) ...

A operação de remoção também executa uma verificação de dependência e um pacote não


pode ser removido, a menos que todos os outros pacotes que dependem dele também sejam
removidos. Se você tentar fazer isso, receberá uma mensagem de erro como esta exemplificada
abaixo:

Código 9.4: Exemplo de tentativa de remoção com dependências

root@debian10:/home/debian# dpkg -r p7zip


dpkg: dependency problems prevent removal of p7zip:
winetricks depends on p7zip; however:
Package p7zip is to be removed.
p7zip-full depends on p7zip (= 16.02+dfsg-6).

dpkg: error processing package p7zip (--remove):


dependency problems - not removing
78 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Errors were encountered while processing:


p7zip

Você pode passar vários nomes de pacotes para dpkg -r, então todos eles serão removidos de
uma vez.

Quando um pacote é removido, os arquivos de configuração correspondentes são deixados no


sistema. Se você quiser remover tudo associado ao pacote, use a opção -P (purgar) em vez
de -r.

Você pode forçar o dpkg a instalar ou remover um pacote, mesmo se as dependências


não forem atendidas, adicionando o parâmetro –force como em dpkg -i –force
NOMEDOPACOTE. No entanto, isso provavelmente deixará o pacote instalado, ou
até mesmo seu sistema, em um estado quebrado. Não use –force, a menos que você
tenha certeza absoluta do que está fazendo.

Obtendo informações sobre o pacote


Para obter informações sobre um pacote .deb, como sua versão, arquitetura, mantenedor,
dependências e muito mais, use o comando dpkg com o parâmetro -I, seguido do nome do
arquivo do pacote que você deseja inspecionar:

Código 9.5: Listando informações de um pacote com dpkg

root@debian10:/home/debian# dpkg -I google-chrome-stable_current_amd64.deb


new Debian package, version 2.0.
size 59477810 bytes: control archive=10394 bytes.
1222 bytes, 13 lines control
16906 bytes, 457 lines * postinst #!/bin/sh
12983 bytes, 344 lines * postrm #!/bin/sh
1385 bytes, 42 lines * prerm #!/bin/sh
Package: google-chrome-stable
Version: 76.0.3809.100-1
Architecture: amd64
Maintainer: Chrome Linux Team <[email protected]>
Installed-Size: 205436
Pre-Depends: dpkg (>= 1.14.0)
Depends: ca-certificates, fonts-liberation, libappindicator3-1, libasound2 (>= 1.0.16),
libatk-bridge2.0-0 (>= 2.5.3), libatk1.0-0 (>= 2.2.0), libatspi2.0-0 (>= 2.9.90),
libc6 (>= 2.16), libcairo2 (>= 1.6.0), libcups2 (>= 1.4.0), libdbus-1-3 (>= 1.5.12),
libexpat1 (>= 2.0.1), libgcc1 (>= 1:3.0), libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2
.0-0 (>= 2.31.8), libgtk-3-0 (>= 3.9.10), libnspr4 (>= 2:4.9-2~), libnss3 (>= 2:3.22)
, libpango-1.0-0 (>= 1.14.0), libpangocairo-1.0-0 (>= 1.14.0), libuuid1 (>= 2.16),
libx11-6 (>= 2:1.4.99.1), libx11-xcb1, libxcb1 (>= 1.6), libxcomposite1 (>= 1:0.3-1),
libxcursor1 (>> 1.1.2), libxdamage1 (>= 1:1.1), libxext6, libxfixes3, libxi6 (>=
2:1.2.99.4), libxrandr2 (>= 2:1.2.99.3), libxrender1, libxss1, libxtst6, lsb-release,
wget, xdg-utils (>= 1.0.2)
79 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Recommends: libu2f-udev
Provides: www-browser
Section: web
Priority: optional
Description: The web browser from Google
Google Chrome is a browser that combines a minimal design with sophisticated technology
to make the web faster, safer, and easier.

Listando Pacotes Instalados e Conteúdo do Pacote


Para obter uma lista de todos os pacotes instalados em seu sistema, use a opção –get-
selections, como em dpkg –get-selections. Você também pode obter uma lista de todos os
arquivos instalados por um pacote específico, passando o parâmetro -L NOMEDOPACOTE
para o dpkg, como abaixo:

Código 9.6: Listando arquivos de um pacote

root@debian10:/var/cache/apt/archives# dpkg -L aptitude


/.
/etc
/etc/cron.daily
/etc/cron.daily/aptitude
/etc/logrotate.d
/etc/logrotate.d/aptitude
/usr
/usr/bin
/usr/bin/aptitude-curses
/usr/share
/usr/share/bug
/usr/share/bug/aptitude
/usr/share/doc
/usr/share/doc/aptitude
/usr/share/doc/aptitude/NEWS.Debian.gz
/usr/share/doc/aptitude/changelog.Debian.gz
/usr/share/doc/aptitude/copyright
/usr/share/menu
/usr/share/menu/aptitude
/var
/var/lib
/var/lib/aptitude

Descobrindo qual pacote possui um arquivo específico


Às vezes, pode ser preciso descobrir qual pacote possui um arquivo específico em seu sistema.
Você pode fazer isso usando o utilitário dpkg-query, seguido pelo parâmetro -S e o caminho
para o arquivo em questão:
80 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Código 9.7: Uso do dpkg-query

root@debian10:/home/debian# dpkg-query -S /usr/bin/unrar-nonfree


unrar: /usr/bin/unrar-nonfree

Reconfigurando Pacotes Instalados


Quando um pacote é instalado, há uma etapa de configuração chamada pós-instalação, onde
um script é executado para configurar tudo o que é necessário para que o software seja execu-
tado, como permissões, colocação de arquivos de configuração etc. Isso também pode fazer
algumas perguntas ao usuário para definir preferências sobre como o software será executado.

Às vezes, devido a um arquivo de configuração corrompido ou malformado, você pode desejar


restaurar as configurações de um pacote ao seu estado “original”. Ou você pode desejar alterar
as respostas que deu às perguntas de configuração inicial. Para fazer isso, execute o utilitário
dpkg-reconfigure, seguido pelo nome do pacote.

Este programa fará backup dos arquivos de configuração antigos, descompactará os novos
nos diretórios corretos e executará o script de pós-instalação fornecido pelo pacote, como se
o pacote tivesse sido instalado pela primeira vez. Tente reconfigurar o pacote tzdata com o
seguinte exemplo:

Código 9.8: Redefinir as configurações de um pacote com dpkg-reconfigure

root@debian10:/home/debian# dpkg-reconfigure tzdata

Ferramenta de Pacote Avançado (apt)


A Advanced Package Tool (APT) é um sistema de gerenciamento de pacotes, incluindo um
conjunto de ferramentas, que simplifica muito a instalação, atualização, remoção e gerencia-
mento de pacotes. O APT fornece recursos como recursos de pesquisa avançada e resolução
automática de dependência.

O APT trabalha em conjunto com os repositórios de software que contêm os pacotes disponíveis
para instalação. Esses repositórios podem ser um servidor local ou remoto ou (menos comum)
até mesmo um disco de CD-ROM.

Debian e Ubuntu, mantêm seus próprios repositórios, e outros repositórios podem ser mantidos
por desenvolvedores ou grupos de usuários para fornecer software não disponível nos principais
repositórios de distribuição.
81 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Existem muitos utilitários que interagem com o APT, sendo os principais:

• apt-get: Usado para baixar, instalar, atualizar ou remover pacotes do sistema;


• apt-cache: Usado para realizar operações, como pesquisas, no índice do pacote;
• apt-file: usado para pesquisar arquivos dentro de pacotes.

Também existe um utilitário “mais amigável” chamado simplesmente apt, combinando as


opções mais usadas de apt-get e apt-cache em um utilitário. Muitos dos comandos do apt
são iguais aos do apt-get, portanto, em muitos casos, são intercambiáveis. No entanto, uma
vez que o apt não pode ser instalado em um sistema, é recomendado aprender como usar
apt-get e apt-cache.

apt e apt-get podem exigir uma conexão de rede, porque os pacotes e índices de
pacotes podem precisar ser baixados de um servidor remoto.

Atualizando o Índice de Pacotes


Antes de instalar ou atualizar o software com APT, é recomendado atualizar o índice do
pacote primeiro para recuperar informações sobre pacotes novos e atualizados. Isso é feito
com o comando apt-get, seguido pelo parâmetro de atualização:

Código 9.9: Atualizar lista de repositórios do apt

root@debian10:/home/debian# apt-get update


Ign:1 http://dl.google.com/linux/chrome/deb stable InRelease
Hit:2 https://repo.skype.com/deb stable InRelease
Hit:3 http://us.archive.ubuntu.com/ubuntu disco InRelease
Hit:4 http://repository.spotify.com stable InRelease
Hit:5 http://dl.google.com/linux/chrome/deb stable Release
Hit:6 http://apt.pop-os.org/proprietary disco InRelease
Hit:7 http://ppa.launchpad.net/system76/pop/ubuntu disco InRelease
Hit:8 http://us.archive.ubuntu.com/ubuntu disco-security InRelease
Hit:9 http://us.archive.ubuntu.com/ubuntu disco-updates InRelease
Hit:10 http://us.archive.ubuntu.com/ubuntu disco-backports InRelease
Reading package lists... Done

Em vez de apt-get update, você também pode usar apt update.


82 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Instalando e removendo pacotes


Com o índice do pacote atualizado, agora você pode instalar um pacote. Isso é feito com
apt-get install, seguido pelo nome do pacote que você deseja instalar:

Código 9.10: Instalação do pacote xournal

root@debian10:/home/debian# apt-get install xournal


Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
xournal
0 upgraded, 1 newly installed, 0 to remove and 75 not upgraded.
Need to get 285 kB of archives.
After this operation, 1041 kB of additional disk space will be used.

Da mesma forma, para remover um pacote, use apt-get remove seguido pelo nome do
pacote:

Código 9.11: Removendo o pacote xournal

root@debian10:/home/debian# apt-get remove xournal


Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
xournal
0 upgraded, 0 newly installed, 1 to remove and 75 not upgraded.
After this operation, 1041 kB disk space will be freed.
Do you want to continue? [Y/n]

Esteja ciente de que ao instalar ou remover pacotes, o APT fará a resolução automática das
dependências. Isso significa que quaisquer pacotes adicionais necessários ao pacote que você
está instalando também serão instalados e que os pacotes que dependem do pacote que você
está removendo também serão removidos. O APT sempre mostrará o que será instalado ou
removido antes de perguntar se você deseja continuar:

Código 9.12: Avisos do apt

root@debian10:/home/debian# apt-get remove p7zip


Reading package lists... Done
Building dependency tree
The following packages will be REMOVED:
android-libbacktrace android-libunwind android-libutils
android-libziparchive android-sdk-platform-tools fastboot p7zip p7zip-full
0 upgraded, 0 newly installed, 8 to remove and 75 not upgraded.
After this operation, 6545 kB disk space will be freed.
83 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Do you want to continue? [Y/n]

Observe que, quando um pacote é removido, os arquivos de configuração correspondentes


são deixados no sistema. Para remover o pacote e quaisquer arquivos de configuração, use o
parâmetro purge em vez de remove, ou o parâmetro remove com a opção –purge:

Código 9.13: Removendo arquivos de configurações

root@debian10:/home/debian# apt-get purge p7zip

ou

Código 9.14: Removendo utilitários e seus arquivos de configurações

root@debian10:/home/debian# apt-get remove --purge p7zip

Você também pode usar apt install e apt remove.

Corrigindo Dependências Quebradas


É possível ter “dependências interrompidas” em um sistema. Isso significa que um ou mais
pacotes instalados dependem de outros pacotes que não foram instalados ou não estão mais
presentes. Isso pode acontecer devido a um erro do APT ou por causa de um pacote instalado
manualmente.

Para resolver isso, use o comando apt-get install -f. Isso tentará arrumar os pacotes quebra-
dos instalando as dependências ausentes, garantindo que todos os pacotes sejam consistentes
novamente.

Você também pode usar apt install -f.

Atualizando Pacotes
O APT pode ser usado para atualizar automaticamente quaisquer pacotes instalados para
as versões mais recentes disponíveis nos repositórios. Isso é feito com o comando apt-get
upgrade. Antes de executá-lo, primeiro atualize o índice do pacote com apt-get update:
84 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Código 9.15: Atualizando lista de pacotes com apt-get update

root@debian10:/home/debian# apt-get update


Hit:1 http://us.archive.ubuntu.com/ubuntu disco InRelease
Hit:2 http://us.archive.ubuntu.com/ubuntu disco-security InRelease
Hit:3 http://us.archive.ubuntu.com/ubuntu disco-updates InRelease
Hit:4 http://us.archive.ubuntu.com/ubuntu disco-backports InRelease
Reading package lists... Done

root@debian10:/home/debian# apt-get upgrade


Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
gnome-control-center
The following packages will be upgraded:
cups cups-bsd cups-client cups-common cups-core-drivers cups-daemon
cups-ipp-utils cups-ppdc cups-server-common firefox-locale-ar (...)

74 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.


Need to get 243 MB of archives.
After this operation, 30.7 kB of additional disk space will be used.
Do you want to continue? [Y/n]

O Cache Local
Quando você instala ou atualiza um pacote, o arquivo .deb correspondente é baixado para um
diretório de cache local antes de o pacote ser instalado. Por padrão, este diretório é /var/-
cache/apt/archives. Arquivos parcialmente baixados são copiados para /var/cache/ap-
t/archives/partial/.

Conforme você instala e atualiza pacotes, o diretório de cache pode ficar bem grande. Para
recuperar espaço, você pode esvaziar o cache usando o comando apt-get clean. Isso removerá
o conteúdo dos diretórios /var/cache/apt/archives e /var/cache/apt/archives/partial/.

Você também pode usar apt clean.

Procurando por Pacotes


O utilitário apt-cache pode ser usado para realizar operações no índice do pacote, como
pesquisar por um pacote específico ou listar quais pacotes contêm um arquivo específico.

Para realizar uma pesquisa, use apt-cache search seguido por um padrão de pesquisa. A
saída será uma lista de cada pacote que contém o padrão, seja no nome do pacote, na descrição
ou nos arquivos fornecidos.
85 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Código 9.16: Buscar pacotes nos repositórios

root@debian10:/home/debian# apt-cache search p7zip


liblzma-dev - XZ-format compression library - development files
liblzma5 - XZ-format compression library
forensics-extra - Forensics Environment - extra console components (metapackage)
p7zip - 7zr file archiver with high compression ratio
p7zip-full - 7z and 7za file archivers with high compression ratio
p7zip-rar - non-free rar module for p7zip

No exemplo acima, a entrada liblzma5 - XZ-format compression library não parece corresponder
ao padrão. No entanto, se mostrarmos as informações completas, incluindo a descrição, para
o pacote usando o parâmetro show, encontraremos o padrão lá:

Código 9.17: Detalhamento de um utilitário

root@debian10:/home/debian# apt-cache show liblzma5


Package: liblzma5
Architecture: amd64
Version: 5.2.4-1
Multi-Arch: same
Priority: required
Section: libs
Source: xz-utils
Origin: Ubuntu
Maintainer: Ubuntu Developers <[email protected]>
Original-Maintainer: Jonathan Nieder <[email protected]>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 259
Depends: libc6 (>= 2.17)
Breaks: liblzma2 (<< 5.1.1alpha+20110809-3~)
Filename: pool/main/x/xz-utils/liblzma5_5.2.4-1_amd64.deb
Size: 92352
MD5sum: 223533a347dc76a8cc9445cfc6146ec3
SHA1: 8ed14092fb1caecfebc556fda0745e1e74ba5a67
SHA256: 01020b5a0515dbc9a7c00b464a65450f788b0258c3fbb733ecad0438f5124800
Homepage: https://tukaani.org/xz/
Description-en: XZ-format compression library
XZ is the successor to the Lempel-Ziv/Markov-chain Algorithm
compression format, which provides memory-hungry but powerful
compression (often better than bzip2) and fast, easy decompression.
.
The native format of liblzma is XZ; it also supports raw (headerless)
streams and the older LZMA format used by lzma. (For 7-Zip's related
format, use the p7zip package instead.)

Você pode usar expressões regulares com o padrão de pesquisa, permitindo pesquisas muito
complexas (e precisas). No entanto, este tópico está fora do escopo desta lição.
86 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Você também pode usar apt search em vez de apt-cache search e apt show em vez
de apt-cache show.

A Lista de Fontes
O APT usa uma lista de fontes para saber de onde obter os pacotes. Esta lista é armazenada no
arquivo sources.list, localizado dentro do diretório /etc/apt. Este arquivo pode ser editado
diretamente com um editor de texto, como vi, pico ou nano, ou com utilitários gráficos como
aptitude ou synaptic.

Uma linha típica dentro de sources.list se parece com isto:

Código 9.18: Exemplo de um repositório no arquivo /etc/sources.list

deb http://us.archive.ubuntu.com/ubuntu/ disco main restricted universe multiverse

A sintaxe é o tipo de arquivo, URL, distribuição e um ou mais componentes, onde:

• Tipo de arquivo: Um repositório pode conter pacotes com software pronto para execu-
tar (pacotes binários, tipo deb) ou com o código-fonte para este software (pacotes-fonte,
tipo deb-src). O exemplo acima fornece pacotes binários;
• URL: A URL do repositório;
• Distribuição: O nome (ou codinome) da distribuição para a qual os pacotes são forneci-
dos. Um repositório pode hospedar pacotes para várias distribuições. No exemplo acima,
disco é o codinome do Ubuntu 19.04 Disco Dingo;
• Componentes: Cada componente representa um conjunto de pacotes. Esses compo-
nentes podem ser diferentes em diferentes distribuições do Linux.

Para exemplificar, no Ubuntu e derivados os componentes são:

• main: Contém pacotes de código aberto oficialmente suportados;


• restricted: Contém software de código fechado oficialmente compatível, como drivers
de dispositivos para placas gráficas, por exemplo;
• universe: Contém software de código aberto mantido pela comunidade;
• multiverse: Contém software sem suporte, de código fechado ou protegido por patente.

No Debian, os componentes principais são:

• main: Consiste em pacotes compatíveis com o Debian Free Software Guidelines (DFSG),
que não depende de software fora desta área para operar. Os pacotes incluídos aqui são
87 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

considerados parte da distribuição Debian;


• contrib: Contém pacotes compatíveis com DFSG, mas que dependem de outros pacotes
que não estão em principal;
• non-free: Contém pacotes que não são compatíveis com o DFSG;
• security: Contém atualizações de segurança;
• backports: Contém versões mais recentes de pacotes que estão em principal. O ciclo de
desenvolvimento das versões estáveis do Debian é bastante longo (cerca de dois anos),
e isso garante que os usuários possam obter os pacotes mais atualizados sem ter que
modificar o repositório principal.

Para adicionar um novo repositório para obter pacotes, você pode simplesmente adicionar
a linha correspondente (geralmente fornecida pelo mantenedor do repositório) ao final de
sources.list, salvar o arquivo e recarregar o índice do pacote com apt-get update. Depois
disso, os pacotes no novo repositório estarão disponíveis para instalação usando apt-get
install.

Lembre-se de que as linhas que começam com o caractere # são consideradas comentários e
são ignoradas.

O diretório /etc/apt/sources.list.d
Dentro do diretório /etc/apt/sources.list.d você pode adicionar arquivos com repositórios
adicionais para serem usados pelo APT, sem a necessidade de modificar o arquivo /etc/ap-
t/sources.list principal. Esses são arquivos de texto simples, com a mesma sintaxe descrita
acima e a extensão de arquivo .list.

Abaixo você vê o conteúdo de um arquivo chamado /etc/apt/sources.list.d/buster-backports.list:

Código 9.19: Repositórios adicionais no diretórios /etc/sources.lists.d

deb http://deb.debian.org/debian buster-backports main contrib non-free


deb-src http://deb.debian.org/debian buster-backports main contrib non-free

Listando o conteúdo do pacote e encontrando arquivos


Um utilitário chamado apt-file pode ser usado para realizar mais operações no índice do
pacote, como listar o conteúdo de um pacote ou encontrar um pacote que contém um arquivo
específico. Este utilitário pode não ser instalado por padrão em seu sistema. Nesse caso,
geralmente você pode instalá-lo usando apt-get:
88 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Código 9.20: Instalando o utilitário apt-file

root@debian10:/home/debian# apt-get install apt-file

Após a instalação, você precisará atualizar o cache do pacote usado para o arquivo apt:

Código 9.21: Atualizar a lista de pacotes

root@debian10:/home/debian# apt-file update

Isso geralmente leva apenas alguns segundos. Depois disso, você está pronto para usar o
arquivo apt.

Para listar o conteúdo de um pacote, use o parâmetro list seguido do nome do pacote:

Código 9.22: Listar o conteúdo de um pacote com apt-file list

root@debian10:/home/debian# apt-file list unrar


unrar: /usr/bin/unrar-nonfree
unrar: /usr/share/doc/unrar/changelog.Debian.gz
unrar: /usr/share/doc/unrar/copyright
unrar: /usr/share/man/man1/unrar-nonfree.1.gz

Você também pode usar em apt list ao invés de apt-file list.

Você pode pesquisar um arquivo em todos os pacotes usando o parâmetro de pesquisa, seguido
pelo nome do arquivo. Por exemplo, se você deseja saber qual pacote fornece um arquivo
chamado libSDL2.so, você pode usar:

Código 9.23: Procurar um pacote a partir de um arquivo

root@debian10:/home/debian# apt-file search libSDL2.so


libsdl2-dev: /usr/lib/x86_64-linux-gnu/libSDL2.so

A resposta é o pacote libsdl2-dev, que fornece o arquivo /usr/lib/x86_64-linux-gnu/libSDL2.so.

A diferença entre apt-file search e dpkg-query é que apt-file search também pesquisará
pacotes desinstalados, enquanto dpkg-query só pode mostrar arquivos que pertencem a um
pacote instalado.
89 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Resumo
Nesta aula, você aprendeu:

• Como usar o dpkg para instalar e remover pacotes;


• Como listar os pacotes instalados e o conteúdo dos pacotes;
• Como reconfigurar um pacote instalado;
• O que é apt e como instalar, atualizar e remover pacotes usando-o;
• Como usar o apt-cache para pesquisar pacotes;
• Como o arquivo /etc/apt/sources.list funciona;
• Como usar o apt-file para mostrar o conteúdo de um pacote ou como descobrir qual
pacote contém um arquivo específico.

Os seguintes comandos foram discutidos:

• dpkg -i: Instala um único pacote ou uma lista de pacotes separados por espaço;
• dpkg -r: Remove um pacote ou uma lista de pacotes separados por espaço;
• dpkg -I: Inspeciona um pacote, fornecendo detalhes sobre o software que ele instala e
quaisquer dependências necessárias;
• dpkg –get-selections: Lista todos os pacotes que o dpkg instalou no sistema;
• dpkg -L: Imprime uma lista de todos os arquivos que um determinado pacote instala;
• dpkg-query: Com um nome de arquivo especificado, este comando imprimirá o pacote
que instalou o arquivo;
• dpkg-reconfigure: Este comando executará novamente um script de pós-instalação de
pacotes para que um administrador possa fazer ajustes de configuração para a instalação
do pacote;
• apt-get update: Este comando atualizará o índice do pacote local para corresponder
ao que está disponível nos repositórios configurados no diretório / etc / apt /;
• apt-get install: Este comando irá baixar um pacote de um repositório remoto e instalá-
lo junto com suas dependências, também pode ser usado para instalar um pacote Debian
que já foi baixado;
• apt-get remove: Este comando desinstalará o (s) pacote (s) especificado (s) do sis-
tema;
• apt-cache show: Assim como o comando dpkg -I, este comando pode ser usado para
mostrar detalhes sobre um pacote específico;
• apt-cache search: Este comando pesquisará seu banco de dados local em cache do
APT por um pacote específico;
• apt-file update: Este comando atualizará o cache do pacote para que o comando
apt-file possa consultar seu conteúdo;
• apt-file search: Este comando pesquisará em qual pacote um arquivo está incluído.
Uma lista de todos os pacotes contendo o padrão é retornada;
• apt-file list: Este comando é usado para listar o conteúdo de um pacote, assim como
90 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

o comando dpkg -L.

Talvez isso possa te ajudar. . .

Fig. 9.1: COMPARACOES

• Fonte: https://ellawala.wordpress.com/2008/09/22/linux-package-management-cheatsheet/
# Gerenciamento de pacotes com YUM, DNF e Zypper

Introdução
Dando continuidade aos gerenciadores de pacotes, vamos aprender sobre mais alguns.

O RPM Package Manager e sua ferramenta de pacote (rpm) foi desenvolvida pela Red Hat, e
hoje é amplamente utilizado, não somente no próprio Red Hat Enterprise Linux (RHEL), mas
também em seus descendentes, como o Fedora, CentOS e Oracle Linux, outras distribuições
como o openSUSE, e até mesmo outros sistemas operacionais, como o AIX da IBM.

Outras ferramentas de gerenciamento de pacotes populares nas distribuições compatíveis com


o Red Hat são o yum (YellowDog Updater Modified), o dnf (Dandified YUM) e o zypper,
capazes de otimizar muitos dos aspectos da instalação, manutenção e remoção de pacotes,
facilitando bastante o gerenciamento deles.
91 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

O RPM Package Manager (rpm)


O RPM Package Manager (rpm) é a ferramenta essencial para gerenciar pacotes de software
em sistemas baseados (ou derivados) no Red Hat.

Instalando, atualizando e removendo pacotes


A operação mais básica é a instalação de um pacote, o que pode ser feito com:

Código 9.24: Instalando pacotes com o rpm

[root@centos8 centos]# rpm -i NOMEDOPACOTE

Onde NOMEDOPACOTE é o nome do pacote .rpm que se deseja instalar.

Se existir uma versão anterior de um pacote no sistema, será possível atualizar para uma
versão mais recente usando o parâmetro -U:

Código 9.25: Atualizando pacotes com rpm

[root@centos8 centos]# rpm -U NOMEDOPACOTE

Se não houver uma versão anterior do NOMEDOPACOTE, uma nova cópia será instalada.
Para evitar isso e apenas atualizar um pacote que esteja instalado, use a opção -F.

Em ambas as operações, o parâmetro -v permite obter uma saída detalhada e -h permite


exibir símbolos de hash (#) como ajuda visual para acompanhar o progresso da instalação.
Vários parâmetros podem ser combinados em um, portanto, rpm -i -v -h é o mesmo que rpm
-ivh. Para remover um pacote instalado, passe o parâmetro -e (como em “erase”, apagar)
para o rpm, seguido pelo nome do pacote que se deseja remover:

Código 9.26: Removendo pacotes com rpm

[root@centos8 centos]# rpm -e wget


error: package wget is not installed

Se um pacote instalado depender do pacote que está sendo removido, aparecerá uma men-
sagem de erro:
92 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Código 9.27: Tentativa de deletar um pacote com dependências ativas

[root@centos8 centos]# rpm -e unzip


error: Failed dependencies:
/usr/bin/unzip is needed by (installed) file-roller-3.28.1-2.el7.x86_64

Para concluir a operação, primeiro é necessário remover os pacotes que dependem daquele que
se deseja remover (no exemplo acima, file-roller). Podemos passar vários nomes de pacotes
para o rpm -e para remover vários pacotes de uma só vez.

Como gerenciar as dependências


No exemplo abaixo, o usuário tentou instalar o pacote do editor de imagens GIMP, mas algumas
dependências estavam ausentes:

Código 9.28: Tentativa de instalar pacotes com dependências não resolvidas

[root@centos8 centos]# rpm -i gimp-2.8.22-1.el7.x86_64.rpm


error: Failed dependencies:
babl(x86-64) >= 0.1.10 is needed by gimp-2:2.8.22-1.el7.x86_64
gegl(x86-64) >= 0.2.0 is needed by gimp-2:2.8.22-1.el7.x86_64
gimp-libs(x86-64) = 2:2.8.22-1.el7 is needed by gimp-2:2.8.22-1.el7.x86_64
libbabl-0.1.so.0()(64bit) is needed by gimp-2:2.8.22-1.el7.x86_64
libgegl-0.2.so.0()(64bit) is needed by gimp-2:2.8.22-1.el7.x86_64
libgimp-2.0.so.0()(64bit) is needed by gimp-2:2.8.22-1.el7.x86_64
libgimpbase-2.0.so.0()(64bit) is needed by gimp-2:2.8.22-1.el7.x86_64
libgimpcolor-2.0.so.0()(64bit) is needed by gimp-2:2.8.22-1.el7.x86_64
libgimpconfig-2.0.so.0()(64bit) is needed by gimp-2:2.8.22-1.el7.x86_64
libgimpmath-2.0.so.0()(64bit) is needed by gimp-2:2.8.22-1.el7.x86_64
libgimpmodule-2.0.so.0()(64bit) is needed by gimp-2:2.8.22-1.el7.x86_64

Cabe ao usuário encontrar os pacotes .rpm com as dependências correspondentes e instalá-los.


Os gerenciadores de pacotes como o yum, zypper e dnf têm ferramentas que informam qual
pacote fornece um arquivo específico.

Listando os pacotes instalados


Para obter uma lista de todos os pacotes instalados em seu sistema, use rpm -qa (o nome
vem de “query all”).

Código 9.29: Listar os pacotes instalados no sistema

[root@centos8 centos]# rpm -qa


iptables-1.8.4-17.el8.x86_64
93 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

tzdata-2021a-1.el8.noarch
xkeyboard-config-2.28-1.el8.noarch
kernel-modules-4.18.0-305.3.1.el8.x86_64
libssh-config-0.9.4-2.el8.noarch
python3-dateutil-2.6.1-6.el8.noarch
kbd-legacy-2.0.4-10.el8.noarch

Obtendo informações sobre um pacote

Para obter informações sobre um pacote instalado, como o número de versão, arquitetura,
data de instalação, empacotador, resumo etc., use rpm com os parâmetros -qi (o nome vem
de “query info”), seguido pelo nome do pacote. Por exemplo:

Código 9.30: Listar informações de um pacote

[root@centos8 centos]# rpm -qi iptables


Name : iptables
Version : 1.8.4
Release : 17.el8
Architecture: x86_64
Install Date: Sun 20 Jun 2021 12:03:30 AM EDT
Group : Unspecified
Size : 1989969
License : GPLv2 and Artistic 2.0 and ISC

Para ver uma lista dos arquivos que estão dentro de um pacote instalado, use os parâmetros
-ql (ou seja, “query list”) seguido pelo nome do pacote:

Código 9.31: Listar arquivos de um pacote instalado

[root@centos8 centos]# rpm -ql iptables


/etc/ethertypes
/etc/sysconfig/ip6tables-config
/etc/sysconfig/iptables-config
/usr/lib/.build-id
/usr/lib/.build-id/01

Se quiser informações ou uma lista de arquivos de um pacote que ainda não foi instalado,
basta adicionar o parâmetro -p aos comandos acima, seguido pelo nome do arquivo RPM
(FILENAME). Assim, rpm -qi NOMEDOPACOTE se torna rpm -qip FILENAME, e rpm
-ql NOMEDOPACOTE se torna rpm -qlp FILENAME, como mostrado abaixo.

Código 9.32: Listar informações de um pacote não instalado

[root@centos8 centos]# rpm -qip unzip-5.51-10.el5.src.rpm


94 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Name : unzip
Version : 5.51
Release : 10.el5
Architecture: i386
Install Date: (not installed)
Group : Applications/Archiving
Size : 1161365
License : BSD
Signature : (none)
Source RPM : (none)
Build Date : Mon 04 Aug 2008 03:07:05 PM EDT
Build Host : ca-build15.us.oracle.com
Relocations : (not relocatable)

Código 9.33: Listando arquivos de um pacote não instalado

[root@centos8 centos]# rpm -qlp unzip-5.51-10.el5.src.rpm


unzip-5.51-249057.patch
unzip-5.51-link-segv.patch
unzip-5.51-link-segv2.patch
unzip-5.51-link-segv3.patch
unzip-5.51-long-filename.patch
unzip-5.51-near-4GB.patch
unzip-5.51-near-4GB2.patch
unzip-5.51-near-4GB3.patch

Descobrindo qual pacote possui um arquivo específico


Para descobrir qual pacote instalado possui um arquivo, use o -qf (ou seja, “query file”)
seguido pelo caminho completo para o arquivo:

Código 9.34: Buscar o pacote a partir de um arquivo

[root@centos8 centos]# rpm -qf /usr/bin/ls


coreutils-8.30-8.el8.x86_64

No exemplo acima, o arquivo /usr/bin/ls pertence ao pacote coreutils-8.30-8.el8.x86_64.

YellowDog Updater Modified (YUM)


O yum foi originalmente desenvolvido como Yellow Dog Updater (YUP), uma ferramenta para
gerenciamento de pacotes na distribuição Linux Yellow Dog. Com o tempo, evoluiu para
gerenciar pacotes em outros sistemas baseados em RPM, como Fedora, CentOS, Red Hat
Enterprise Linux e Oracle Linux.
95 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Em termos de funcionalidade, ele é semelhante ao utilitário apt dos sistemas baseados em


Debian, sendo capaz de buscar, instalar, atualizar e remover pacotes, além de gerir automati-
camente as dependências. O yum pode ser usado para instalar um único pacote ou para
atualizar um sistema inteiro de uma vez só.

Buscando pacotes
Para instalar um pacote, temos de saber o nome dele. Por exemplo, se você precisar de um
utilitário para lidar com arquivos compactados 7Zip (com a extensão .7z), poderia usar:

Código 9.35: Procurar pacotes com o yum

[root@centos8 centos]# yum search unzip


Last metadata expiration check: 0:25:35 ago on Fri 02 Jul 2021 08:15:00 AM EDT.
=============================================================== Name Exactly Matched: unzip
================================================================
unzip.x86_64 : A utility for unpacking zip files

Instalando, atualizando e removendo pacotes


Para instalar um pacote usando o yum, use o comando yum install NOMEDOPACOTE. O
yum busca o pacote e as dependências correspondentes em um repositório online e instala
tudo no sistema.

Código 9.36: Instalando o pacote unzip

[root@centos8 centos]# yum install unzip


Last metadata expiration check: 0:29:54 ago on Fri 02 Jul 2021 08:15:00 AM EDT.
Dependencies resolved.
============================================================================================================

Package Architecture Version


Repository Size
============================================================================================================

Installing:
unzip x86_64 6.0-45.el8_4
baseos 195 k

Transaction Summary
============================================================================================================

Install 1 Package

Total download size: 195 k


Installed size: 414 k
Is this ok [y/N]:
96 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Para atualizar um pacote instalado, use yum update NOMEDOPACOTE. Por exemplo:

Código 9.37: Atualizar um pacote com yum

[root@centos8 centos]# yum update wget


Last metadata expiration check: 0:30:58 ago on Fri 02 Jul 2021 08:15:00 AM EDT.
Dependencies resolved.
Nothing to do.
Complete!

Se você omitir o nome de um pacote, poderá atualizar todos os pacotes no sistema para os
quais exista uma atualização disponível.

Para verificar se há uma atualização disponível para um pacote específico, use yum check-
update NOMEDOPACOTE. Como antes, se você omitir o nome do pacote, o yum procurará
atualizações para todos os pacotes instalados no sistema.

Para remover um pacote instalado, use yum remove NOMEDOPACOTE.

Como encontrar o pacote que fornece um arquivo específico


Em um exemplo anterior, mostramos uma tentativa de instalar o editor de imagens gimp, que
falhou devido a dependências não atendidas. No entanto, o rpm mostra quais arquivos estão
faltando, mas não lista o nome dos pacotes que os fornecem.

Por exemplo, uma das dependências ausentes era libgimpui-2.0.so.0. Para ver qual pacote o
fornece, usamos yum whatprovides, seguido pelo nome do arquivo que estamos procurando:

Código 9.38: Identificar um pacote a partir de um arquivo com yum

[root@centos8 centos]# yum whatprovides libgimpui-2.0.so.0


Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirror.ufscar.br
* epel: mirror.globo.com
* extras: mirror.ufscar.br
* updates: mirror.ufscar.br
2:gimp-libs-2.8.22-1.el7.i686 : GIMP libraries
Repo : base
Matched from:
Provides : libgimpui-2.0.so.0

A resposta é gimp-libs-2.8.22-1.el7.i686. Em seguida podemos instalar o pacote com o co-


mando yum install gimp-libs.
97 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Isso também funciona para arquivos já existentes no seu sistema. Por exemplo, para saber de
onde o arquivo /etc/hosts veio, você pode usar:

Código 9.39: Exemplo de whatprovides para arquivos presentes no sistema

[root@centos8 centos]# yum whatprovides /etc/hosts


Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirror.ufscar.br
* epel: mirror.globo.com
* extras: mirror.ufscar.br
* updates: mirror.ufscar.br
setup-2.8.71-10.el7.noarch : A set of system configuration and setup files
Repo : base
Matched from:
Filename : /etc/hosts

A resposta é setup-2.8.71-10.el7.noarch.

Obtendo informações sobre um pacote

Para obter informações sobre um pacote, como versão, arquitetura, descrição, tamanho e mais,
use yum info NOMEDOPACOTE.

Código 9.40: Obtendo informações de um pacote com o yum

[root@centos8 centos]# yum info firefox


Last metadata expiration check: 0:47:56 ago on Fri 02 Jul 2021 08:15:00 AM EDT.
Available Packages
Name : firefox
Version : 78.11.0
Release : 3.el8_4
Architecture : x86_64
Size : 102 M
Source : firefox-78.11.0-3.el8_4.src.rpm
Repository : appstream
Summary : Mozilla Firefox Web browser
URL : https://www.mozilla.org/firefox/
License : MPLv1.1 or GPLv2+ or LGPLv2+
Description : Mozilla Firefox is an open-source web browser, designed for standards
: compliance, performance and portability.

Administrando os repositórios de software


Para o yum, os “repos” estão listados no diretório /etc/yum.repos.d/. Cada repositório é
representado por um arquivo .repo, como CentOS-Base.repo.

Repositórios adicionais podem ser incluídos pelo usuário acrescentando um arquivo .repo
98 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

no diretório mencionado acima, ou no final de /etc/yum.conf. No entanto, a maneira


recomendada de adicionar ou gerenciar repositórios é usar a ferramenta yum-config-manager.

Para adicionar um repositório, use o parâmetro –add-repo, seguido da URL para um arquivo
.repo.

Código 9.41: Adicionando um repositório yum

[root@centos8 centos]# yum-config-manager --add-repo https://rpms.remirepo.net/enterprise/


remi.repo
Adding repo from: https://rpms.remirepo.net/enterprise/remi.repo

Para obter uma lista de todos os repositórios disponíveis, use yum repolist all. A saída obtida
será semelhante a esta:

Código 9.42: Listar os repositórios disponível com yum

[root@centos8 centos]# yum repolist all


repo id repo name

status
appstream CentOS Linux 8 - AppStream
enabled
appstream-source CentOS Linux 8 - AppStream - Source
disabled
baseos CentOS Linux 8 - BaseOS
enabled
baseos-source CentOS Linux 8 - BaseOS - Source
disabled
cr CentOS Linux 8 - ContinuousRelease
disabled
debuginfo CentOS Linux 8 - Debuginfo
disabled

Os repositórios disabled (desabilitados) serão ignorados ao instalar ou atualizar o software.


Para habilitar ou desabilitar um repositório, use o utilitário yum-config-manager, seguido
pelo ID do repositório.

Na saída acima, a identidade do repositório é mostrada na primeira coluna (repo id) de cada
linha.

Código 9.43: Desabilitando repositórios

[root@centos8 centos]# yum-config-manager --disable updates


99 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

O comando acima desabilita o repositório updates. Para reativá-lo, use:

Código 9.44: Habilitando repositórios

[root@centos8 centos]# yum-config-manager --enable updates

O Yum armazena os pacotes baixados e os metadados associados em um diretório de


cache (geralmente /var/cache/yum). À medida que o sistema é atualizado e novos
pacotes são instalados, essa cache pode ficar bem grande. Para limpar a cache e
recuperar o espaço em disco, podemos usar o comando yum clean, seguido pelo que
deve ser removido. Os parâmetros mais úteis são packages (yum clean packages) para
excluir pacotes baixados e metadata (yum clean metadata) para excluir os metadados
associados. Consulte a página de manual do yum (digite man yum) para obter mais
informações.

DNF
O dnf, a ferramenta de gerenciamento de pacotes usada no Fedora, é um fork do yum. Como
tal, muitos dos comandos e parâmetros são semelhantes. Esta seção oferece apenas uma visão
geral rápida do dnf:

• Busca de pacotes: dnf search PATTERN, onde PATTERN é aquilo que você está
buscando. Por exemplo, dnf search unzip mostra todos os pacotes que contêm a palavra
unzip no nome ou descrição:
• Obter informações sobre um pacote: dnf info NOMEDOPACOTE;
• Instalar pacotes: dnf install NOMEDOPACOTE. Para encontrar o nome, faça uma
busca;
• Remover pacotes: dnf remove NOMEDOPACOTE;
• Atualizar pacotes: dnf upgrade NOMEDOPACOTE para atualizar um só pacote.
Omita o nome do pacote para atualizar todos os pacotes do sistema;
• Descobrir qual pacote fornece um arquivo específico: dnf provides FILENAME;
• Obter uma lista de todos os pacotes instalados no sistema: dnf list –installed;
• Listar o conteúdo de um pacote: dnf repoquery -l NOMEDOPACOTE.

O dnf tem um sistema de ajuda embutido que mostra mais informações (como
parâmetros extras) para cada comando. Para usá-lo, digite dnf help seguido pelo
comando, como dnf help install.
100 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Administrando os repositórios de software


Como no caso do yum e do zypper, o dnf trabalha com repositórios de software (repos). Cada
distribuição tem uma lista de repositórios padrão e os administradores podem adicionar ou
remover repositórios conforme necessário.

Para obter uma lista de todos os repositórios disponíveis, use dnf repolist. Para listar apenas
os repositórios ativados, adicione a opção –enabled e, para listar apenas os repositórios
desativados, adicione a opção –disabled.

Código 9.45: Listando repositórios com dnf

[root@centos8 centos]# dnf repolist


repo id repo name
appstream CentOS Linux 8 -
AppStream
baseos CentOS Linux 8 -
BaseOS
extras CentOS Linux 8 -
Extras

Para adicionar um repositório, use dnf config-manager –add_repo URL, onde URL é a URL
completa do repositório. Para habilitar um repositório, use dnf config-manager –set-enabled
REPO_ID.

Da mesma forma, para desativar um repositório, use dnf config-manager –set-disabled REPO_ID.
Nos dois casos, REPO_ID é o ID exclusivo do repositório, que pode ser obtido com dnf re-
polist. Os repositórios adicionados são ativados por padrão. Os repositórios são armazenados
em arquivos .repo no diretório /etc/yum.repos.d/, com exatamente a mesma sintaxe usada
para o yum.

Zypper
O zypper é a ferramenta de gerenciamento de pacotes usada no SUSE Linux e OpenSUSE.
Em termos de recursos, é semelhante ao apt e ao yum, sendo capaz de instalar, atualizar e
remover pacotes de um sistema, com resolução automática de dependências.

Atualizando o índice do pacote


A exemplo de outras ferramentas de gerenciamento de pacotes, o zypper trabalha com repositórios
que contêm pacotes e metadados. Esses metadados precisam ser atualizados periodicamente
para que o utilitário fique a par dos pacotes mais recentes disponíveis. Para fazer uma atual-
ização, basta digitar:
101 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Código 9.46: Atualizar metadados para o gerenciador Zypper

root@debian10:/home/debian# zypper refresh


Repository 'update' is up to date.
All repositories have been refreshed.

O zypper possui um recurso de atualização automática que pode ser ativado caso a caso, ou
seja, alguns repositórios poderão ser atualizados automaticamente antes de uma consulta ou
da instalação de um pacote, e outros poderão precisar ser atualizados manualmente. Vamos
ensinar a controlar esse recurso em breve.

Buscando pacotes
Para procurar um pacote, use o operador search (ou se), seguido pelo nome do pacote:

Código 9.47: Busca de pacotes com Zypper

root@debian10:/home/debian# zypper se zip


Loading repository data...
Warning: Repository 'update' appears to be outdated. Consider using a different mirror or
server.
Reading installed packages...

S | Name | Summary | Type


--+-----------+---------------------------------------------+-----------
| bzip2 | A Program for Compressing Files | package
| bzip2 | A Program for Compressing Files | srcpackage
| bzip2 | bzip2 security update | patch
| bzip2-doc | The bzip2 program and Library Documentation | package
| gzip | GNU Zip Compression Utilities | package
| gzip | GNU Zip Compression Utilities | srcpackage
| gzip | gzip security update | patch
| php5-zip | PHP5 Extension Module | package

O operador de pesquisa também serve para obter uma lista de todos os pacotes instalados no
sistema. Para isso, use o parâmetro -i sem o nome do pacote, como em zypper se -i.

Para ver se um pacote específico está instalado, adicione o nome do pacote ao comando acima.
Por exemplo, o seguinte comando buscará dentre os pacotes instalados por um que contenha
“firefox” no nome:

Código 9.48: filtrar pacotes instalados com zypper

root@debian10:/home/debian# zypper se -i firefox


Loading repository data...
Reading installed packages...
102 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

S | Name | Summary | Type


--+------------------------------------+-------------------------+--------
i | MozillaFirefox | Mozilla Firefox Web B-> | package
i | MozillaFirefox-branding-openSUSE | openSUSE branding of -> | package
i | MozillaFirefox-translations-common | Common translations f-> | package

Para pesquisar apenas nos pacotes não-instalados, adicione o parâmetro -u ao operador se.

Instalando, atualizando e removendo pacotes


Para instalar um pacote de software, use o operador install (ou in), seguido pelo nome do
pacote. Desta maneira:

Código 9.49: Instalando pacotes com o zypper in

root@debian10:/home/debian# zypper in unrar


zypper in unrar
zypper in unrar
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following NEW package is going to be installed:


unrar

1 new package to install.


Overall download size: 141.2 KiB. Already cached: 0 B. After the operation, additional
301.6 KiB will be used.
Continue? [y/n/v/...? shows all options] (y): y
Retrieving package unrar-5.7.5-lp151.1.1.x86_64
(1/1), 141.2 KiB (301.6 KiB unpacked)
Retrieving: unrar-5.7.5-lp151.1.1.x86_64.rpm .......................[done]
Checking for file conflicts: .......................................[done]
(1/1) Installing: unrar-5.7.5-lp151.1.1.x86_64 .....................[done]

Para atualizar os pacotes instalados no sistema, use zypper update. Como no caso do processo
de instalação, aparece uma lista de pacotes a serem instalados/atualizados, e o gerenciador
pergunta se você deseja continuar.

Se quiser listar apenas as atualizações disponíveis, sem instalar nada, use zypper list-updates.

Para remover um pacote, use o operador remove (ou rm), seguido pelo nome do pacote:

Código 9.50: Removendo pacotes com Zypper

root@debian10:/home/debian# zypper rm unrar


103 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Lembre-se de que a remoção de um pacote também remove outros pacotes que dependem
dele. Por exemplo:

Código 9.51: Remoção de pacote e dependências com Zypper

root@debian10:/home/debian# zypper rm libgimp-2_0-0

Descobrindo quais pacotes possuem um arquivo específico


Para ver quais pacotes contêm um arquivo específico, use o operador de pesquisa seguido pelo
parâmetro –provides e o nome do arquivo (ou o caminho completo para ele). Por exemplo,
para saber quais pacotes contêm o arquivo libgimpmodule-2.0.so.0 em /usr/lib64/, usaríamos:

Código 9.52: Uso de parâmetros –provides

root@debian10:/home/debian# zypper se --provides /usr/lib64/libgimpmodule-2.0.so.0

Obtendo informações sobre um pacote


Para ver os metadados associados a um pacote, use o operador info seguido pelo nome
do pacote. Serão exibidos o repositório de origem, nome do pacote, versão, arquitetura,
fornecedor, tamanho instalado, se está instalado ou não, status (se está atualizado), o pacote
de origem e uma descrição.

Código 9.53: Listar informações de um pacote com zypper info

root@debian10:/home/debian# zypper info gimp


Loading repository data...
Reading installed packages...

Information for package gimp:


-----------------------------
Repository : Main Repository
Name : gimp
Version : 2.8.22-lp151.4.6
Arch : x86_64
Vendor : openSUSE
Installed Size : 29.1 MiB
Installed : Yes (automatically)
Status : up-to-date
Source package : gimp-2.8.22-lp151.4.6.src
104 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Administrando os repositórios de software


O zypper também pode ser usado para gerenciar repositórios de software. Para ver uma lista
de todos os repositórios atualmente registrados no seu sistema, use zypper repos:

Código 9.54: Listar repositórios disponíveis do zypper

root@debian10:/home/debian# zypper repos


Repository priorities are without effect. All enabled repositories share the same priority.

# | Alias | Name | Enabled | GPG Check |


Refresh
---+---------------------------+------------------------------------+---------+-----------+--------

1 | openSUSE-Leap-15.1-1 | openSUSE-Leap-15.1-1 | No | ---- |


----
2 | repo-debug | Debug Repository | No | ---- |
--

Na coluna Enabled vemos que alguns repositórios estão ativados e outros não. Para mudar
isso, use o operador modifyrepo, seguido pelo parâmetro -e (enable) ou -d (disable) e pelo
alias do repositório (a segunda coluna na saída acima).

Código 9.55: Habilitando e Desabilitando repositórios do zypper

root@debian10:/home/debian# zypper modifyrepo -d repo-non-oss


Repository 'repo-non-oss' has been successfully disabled.

root@debian10:/home/debian# zypper modifyrepo -e repo-non-oss


Repository 'repo-non-oss' has been successfully enabled.

Mencionamos anteriormente que o zypper possui um recurso de atualização automática que


pode ser ativado caso a caso nos repositórios. Quando ativado, esse sinalizador faz com que o
zypper execute uma operação de atualização (como se executássemos zypper refresh) antes de
trabalhar com o repositório especificado. O processo pode ser controlado com os parâmetros
-f e -F do operador modifyrepo:

Código 9.56: Refresh dos metadados do repositório de forma automática

root@debian10:/home/debian# zypper modifyrepo -F repo-non-oss


Autorefresh has been disabled for repository 'repo-non-oss'.

root@debian10:/home/debian# zypper modifyrepo -f repo-non-oss


Autorefresh has been enabled for repository 'repo-non-oss'.
105 9. Gerenciamento de pacotes em distribuições Debian
Fabio Gonçalves De Melo Santana / [email protected]

Adicionando e removendo repositórios

Para adicionar um novo repositório de software para o zypper, use o operador addrepo seguido
da URL e do nome do repositório, como abaixo:

Código 9.57: Adicionando um novo repositório do zypper

root@debian10:/home/debian# zypper addrepo http://packman.inode.at/suse/openSUSE_Leap_15.1/


packman
Adding repository 'packman' ........................................[done]
Repository 'packman' successfully added

URI : http://packman.inode.at/suse/openSUSE_Leap_15.1/
Enabled : Yes
GPG Check : Yes
Autorefresh : No
Priority : 99 (default priority)

Repository priorities are without effect. All enabled repositories share the same priority.

Ao adicionar um repositório, podemos ativar as atualizações automáticas com o parâmetro -f.


Os repositórios adicionados são ativados por padrão, mas também é possível adicionar e desati-
var um repositório ao mesmo tempo usando o parâmetro -d. Para remover um repositório, use
o operador removerepo seguido pelo nome do repositório (Alias). Para remover o repositório
adicionado no exemplo acima, o comando seria:

Código 9.58: Remover repositório do zypper

root@debian10:/home/debian# zypper removerepo packman


Removing repository 'packman' ......................................[done]
Repository 'packman' has been removed.
Fabio Gonçalves De Melo Santana / [email protected]

10
Resumo
Nesta aula, você aprendeu:

• Como usar o rpm para instalar, atualizar e remover pacotes;


• Como usar o yum, o zypper e o dnf;
• Como obter informações sobre um pacote;
• Como obter uma lista do conteúdo do pacote;
• Como descobrir de qual pacote veio um arquivo;
• Como listar, adicionar, remover, habilitar ou desabilitar repositórios de software.

Os seguintes comandos foram abordados:

• rpm
• yum
• dnf
• zypper

106
107 10. Resumo
Fabio Gonçalves De Melo Santana / [email protected]

Talvez isso possa te ajudar. . .

Fig. 10.1: YUM e RPM


108 10. Resumo
Fabio Gonçalves De Melo Santana / [email protected]

Fig. 10.2: YUM e RPM

• Fonte: https://access.redhat.com/articles/rhsm-cheat-sheet
Fabio Gonçalves De Melo Santana / [email protected]

11
102.6: Linux como um convidado
de virtualizacao

Introdução
Sem dúvida, versatilidade é um dos pontos fortes do Linux. Um aspecto dessa versatilidade é
a capacidade de usar o Linux como hospedeiro de outros sistemas operacionais, ou aplicativos
individuais, em um ambiente completamente isolado e seguro.

Visão geral da virtualização


A virtualização é uma tecnologia que permite que uma plataforma de software, chamada de
hipervisor, executar processos que contêm um sistema de computador totalmente emulado.
O hipervisor é responsável por gerenciar os recursos do hardware físico que podem ser usados
por máquinas virtuais individuais. Essas máquinas virtuais são chamadas de convidados do
hipervisor. Uma máquina virtual tem muitos aspectos de um computador físico emulado
em software, como BIOS do sistema e controladores de disco rígido. Uma máquina virtual
geralmente usará imagens de disco rígido que são armazenadas como arquivos individuais e
terá acesso à RAM e CPU da máquina host por meio do software hipervisor. O hipervisor
separa o acesso aos recursos de hardware do sistema host entre os convidados, permitindo
assim que vários sistemas operacionais sejam executados em um único sistema host.

Os hipervisores comumente usados para Linux incluem:

109
110 11. 102.6: Linux como um convidado de virtualizacao
Fabio Gonçalves De Melo Santana / [email protected]

• Xen :O Xen é um hipervisor Tipo 1 de software livre, o que significa que não depende
de um sistema operacional subjacente para funcionar;
• KVM: A máquina virtual do kernel ou KVM, é um módulo do kernel Linux para virtu-
alização. O KVM é um hipervisor tanto do Tipo 1 quanto do Tipo 2 porque, embora
precise de um sistema operacional Linux genérico para funcionar, ele é capaz de fun-
cionar perfeitamente bem como um hipervisor, integrando-se a uma instalação do Linux
em execução. As máquinas virtuais implantadas com KVM usam o daemon libvirt e
utilitários de software associados para serem criados e gerenciados;
• VirtualBox: Um aplicativo de desktop popular que facilita a criação e o gerenciamento
de máquinas virtuais. O Oracle VM VirtualBox é multiplataforma e funcionará em
Linux, macOS e Microsoft Windows. Como o VirtualBox requer um sistema operacional
subjacente para ser executado, ele é um hipervisor Tipo 2.

Tipos de máquinas virtuais


Existem três tipos principais de máquinas virtuais, o convidado totalmente virtualizado , o
convidado paravirtualizado e o convidado híbrido .

Totalmente Virtualizado

Toda a instrução que se espera que um sistema operacional convidado execute, deve poder
ser executada em uma instalação de sistema operacional totalmente virtualizado. A razão
para isso é que nenhum driver de software adicional é instalado no convidado para traduzir as
instruções para hardware simulado ou real.

Paravirtualizado

Um convidado paravirtualizado (ou PVM) é aquele em que o sistema operacional convidado


está ciente de que é uma instância de máquina virtual em execução. Esses tipos de convidados
usarão um kernel modificado e drivers especiais (conhecidos como drivers convidados ), que
ajudarão o sistema operacional convidado a utilizar os recursos de software e hardware do
hipervisor.

Híbrido

A paravirtualização e a virtualização completa podem ser combinadas para permitir que sis-
temas operacionais não modificados recebam desempenho de E/S quase nativo, usando drivers
paravirtualizados em sistemas operacionais totalmente virtualizados.
111 11. 102.6: Linux como um convidado de virtualizacao
Fabio Gonçalves De Melo Santana / [email protected]

Trabalhando com modelos de máquina virtual


Como as máquinas virtuais são, tipicamente, apenas arquivos em execução em um hipervisor,
é fácil criar modelos que podem ser personalizados para cenários específicos de implantação.
Frequentemente, uma máquina virtual contém uma instalação básica de sistema operacional
e algumas configurações de autenticação predefinidas para facilitar futuras inicializações do
sistema. Isso diminui o tempo necessário para construir um novo sistema, reduzindo a quan-
tidade de trabalho repetitivo, como a instalação de pacotes básicos e as configurações de
localidade.

Esse modelo de máquina virtual pode ser copiado posteriormente para um novo sistema con-
vidado. Nesse caso, o novo convidado receberia um novo nome e um novo endereço MAC
para sua interface de rede, além de outras modificações dependendo do uso pretendido.

O D-Bus Machine ID
Muitas instalações do Linux utilizam um número de identificação de máquina gerado no mo-
mento da instalação, chamado de D-Bus machine ID. No entanto, se uma máquina virtual
for clonada para ser usada como modelo para outras instalações de máquina virtual, um novo
D-Bus machine ID precisará ser criado para garantir que os recursos do sistema do hipervisor
sejam direcionados ao sistema convidado correto.

O comando a seguir serve para validar se existe um D-Bus machine ID para o sistema em
execução:

Código 11.1: Validar dbus machine ID

root@debian10:/home/debian# dbus-uuidgen --ensure

Se nenhuma mensagem de erro for exibida, é porque já existe um ID para o sistema. Para
visualizar o D-Bus machine ID atual, execute o seguinte:

Código 11.2: Recuperar o machine ID

root@debian10:/home/debian# dbus-uuidgen --get


17f2e0698e844e31b12ccd3f9aa4d94a

A sequência de caracteres exibida é o número de ID atual. Dois sistemas Linux em execução


em um hipervisor não devem ter o mesmo D-Bus machine ID.
112 11. 102.6: Linux como um convidado de virtualizacao
Fabio Gonçalves De Melo Santana / [email protected]

O D-Bus machine ID localiza-se em /var/lib/dbus/machine-id e está simbolicamente


ligado a /etc/machine-id. Não é recomendável alterar esse número de ID em um sistema
em execução, pois isso pode acarretar instabilidades e travamentos do sistema. Se duas
máquinas virtuais tiverem o mesmo D-Bus machine ID, siga o procedimento abaixo para gerar
um novo:

Código 11.3: Criando um novo D-Bus Machine ID

root@debian10:/home/debian# sudo rm -f /etc/machine-id


root@debian10:/home/debian# sudo dbus-uuidgen --ensure=/etc/machine-id

Se por acaso /var/lib/dbus/machine-id não for um link simbólico que remete a /etc/machine-
id, /var/lib/dbus/machine-id terá de ser removido.

Pré-configurando sistemas em nuvem


Uma ferramenta útil, que simplifica as implementações de máquina virtual baseada em nuvem,
é o utilitário cloud-init. Esse comando, junto com os arquivos de configuração associados e
a imagem de máquina virtual predefinida, é um método neutro (independente de fornecedor)
para implementar um convidado Linux em uma infinidade de provedores de IaaS. Utilizando
arquivos de texto simples YAML (YAML Ain’t Markup Language), o administrador pode pré-
configurar as definições de rede, a seleção de pacotes de software, a configuração de chave
SSH, a criação de contas de usuário e as configurações de localidade, além de uma série de
outras opções para criar novos sistemas rapidamente.

Durante a inicialização de um novo sistema, o cloud-init lê as definições dos arquivos de


configuração YAML e as aplica. Basta efetuar esse processo na configuração inicial de um
sistema, e a implantação de uma frota de novos sistemas em uma plataforma de provedor de
nuvem ficará muito mais fácil.

A sintaxe do arquivo YAML usado com cloud-init se chama cloud-config. Eis um exemplo
de arquivo cloud-config:

Código 11.4: Exemplo de um cloud-config

#cloud-config
timezone: Africa/Dar_es_Salaam
hostname: test-system

# Update the system when it first boots up


apt_update: true
apt_upgrade: true

# Install the Nginx web server


113 11. 102.6: Linux como um convidado de virtualizacao
Fabio Gonçalves De Melo Santana / [email protected]

packages:
- nginx

Observe que na linha superior não há espaço entre o símbolo hash (#) e o termo cloud-config.

Contêineres
A tecnologia de contêiner lembra uma máquina virtual em certos aspectos: eles proporcionam
um ambiente isolado para implementar facilmente um aplicativo. Ao passo que, com uma
máquina virtual, um computador inteiro é emulado, um contêiner usa apenas o software
suficiente para executar um aplicativo. Dessa forma, há muito menos sobrecarga.

Os contêineres permitem uma maior flexibilidade em relação a uma máquina virtual. Um


contêiner de aplicativo pode ser migrado de um hospedeiro para outro, assim como uma
máquina virtual pode ser migrada de um hipervisor para outro. No entanto, às vezes, uma
máquina virtual precisa ser desligada antes de poder ser migrada, enquanto no contêiner o
aplicativo permanece em execução enquanto está sendo migrado. Os contêineres também
facilitam a implementação de novas versões de aplicativos em conjunto com uma versão
existente. Conforme os usuários fecham suas sessões com contêineres em execução, esses
contêineres podem ser removidos automaticamente do sistema pelo software de orquestração
de contêineres e substituídos pela nova versão, reduzindo assim o tempo de inatividade.
Fabio Gonçalves De Melo Santana / [email protected]

12
Talvez isso possa te ajudar. . .

Fig. 12.1: FULL VIRTUALIZATION

• Fonte: https://zhihuicao.wordpress.com/2015/06/13/para-virtualization-full-virtualization-
differences/ # 103.1: Trabalho na linha de comando

114
Fabio Gonçalves De Melo Santana / [email protected]

13
Introdução

É comum que os recém-chegados ao mundo do Linux se sintam um pouco perdidos longe do


conforto de uma interface gráfica. Eles estão habituados a acessar, com o botão direito do
mouse, as dicas visuais e informações contextuais disponibilizadas pelos utilitários gráficos de
gerenciamento de arquivos. Então o conselho que eu te dou é aprender rapidamente a dominar
o conjunto relativamente pequeno de ferramentas de linha de comando que permitem acessar
instantaneamente todos os dados oferecidos por sua antiga interface gráfica.

Obtendo informações sobre o sistema


De olhos arregalados diante do tracinho piscando de um prompt de linha de comando, você
provavelmente se pergunta “Onde estou?” Ou, mais precisamente, “Onde estou agora no
sistema de arquivos do Linux? E se eu criar um novo arquivo, onde ele vai parar?” O que
você está procurando é o diretório de trabalho atual, e o comando pwd responderá às suas
dúvidas:

Código 13.1: Obter informações do diretório atual com pwd

root@debian10:/home/debian# pwd
/home/debian

Agora imagine que o usuário debian esteja atualmente logado no sistema e em seu diretório
pessoal: /home/debian/. Se debian criar um arquivo vazio usando o comando touch sem

115
116 13. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

especificar qualquer outro local no sistema de arquivos, o arquivo será criado em /home/de-
bian/. Se usarmos ls para listar o conteúdo do diretório, veremos esse novo arquivo:

Código 13.2: O comando ls

root@debian10:/home/debian# ls novoarquivo
novoarquivo

Além de sua localização no sistema de arquivos, você também pode precisar de informações
sobre o sistema Linux que está executando, como por exemplo o número exato da versão de
sua distribuição ou a versão do kernel do Linux atualmente carregada. A ferramenta uname é
a resposta. E, em particular, uname mais a opção -a (“all”).

root@debian10:/home/debian# uname -a
Linux debian10.linuxvmimages.local 4.19.0-13-amd64 #1 SMP Debian 4.19.160-2 (2020-11-28)
x86_64 GNU/Linux

Obtendo informações sobre comandos


Quase sempre, você encontrará documentações falando sobre comandos do Linux com os quais
ainda não está familiarizado. A própria linha de comando oferece todo tipo de informações
úteis sobre o que os comandos fazem e como usá-los com eficácia. As referências mais úteis
provavelmente estarão nos muitos arquivos do sistema man.

Como regra, os desenvolvedores Linux escrevem arquivos man e os distribuem junto com os
utilitários que criam. Os arquivos man são documentos altamente estruturados cujo conteúdo
é dividido intuitivamente em cabeçalhos padronizados. Basta digitar man seguido do nome
de um comando para exibir informações como o nome do comando, uma breve sinopse de seu
uso, uma descrição mais detalhada e alguns dados importantes sobre o histórico e as licenças
de uso. Se liga:

Código 13.3: Obtendo informações através do man

root@debian10:/home/debian# man uname


UNAME(1)

User Commands

UNAME(1)

NAME
uname - print system information
117 13. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

SYNOPSIS
uname [OPTION]...

DESCRIPTION
Print certain system information. With no OPTION, same as -s.

-a, --all
print all information, in the following order, except omit -p and -i if
unknown:

-s, --kernel-name
print the kernel name

-n, --nodename
print the network node hostname

-r, --kernel-release
print the kernel release

-v, --kernel-version
print the kernel version

-m, --machine
print the machine hardware name

-p, --processor
print the processor type (non-portable)

-i, --hardware-platform
print the hardware platform (non-portable)

-o, --operating-system
print the operating system

--help display this help and exit

O comando man só funciona quando fornecemos um nome de comando exato. Porém, se


não tiver certeza do nome do comando que deseja pesquisar, use o comando apropos para
explorar os nomes e descrições das páginas man. Se você não consegue se lembrar de que
uname informa a versão atual do kernel do Linux, pode passar a palavra kernel para apropros.
Aparecerão muitas linhas de saída, mas dentre elas haverá o seguinte:

Código 13.4: Procurar por entradas do man através do apropos

root@debian10:/home/debian# apropos kernel


add_key (2) - add a key to the kernel's key management facility
addpart (8) - tell the kernel about the existence of a partition
adjtimex (2) - tune kernel clock
apparmor (7) - kernel enhancement to confine programs to a limited set of resources
.
apparmor_parser (8) - loads AppArmor profiles into the kernel

Caso não precise da documentação completa de um comando, pode obter seus dados básicos
118 13. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

rapidamente usando type. Neste exemplo, usamos type para consultar quatro comandos
separados ao mesmo tempo. Os resultados mostram que cp é um programa que vive em
/bin/cp, e que kill é um comando interno do shell (shell builtin), o que significa que é parte
do próprio shell Bash:

Código 13.5: Verificando se um comando é nativo do shell ou se é um binário externo com type

root@debian10:/home/debian# type uname cp kill which


uname is hashed (/usr/bin/uname)
cp is /usr/bin/cp
kill is a shell builtin
which is /usr/bin/which

Note que, além de ser um comando binário regular como cp, uname também aparece como
“hashed”. A razão para isso é que Debian recentemente usou uname e, para aumentar a
eficiência do sistema, o comando foi adicionado a uma tabela de hash para ficar mais acessível
na próxima vez que for executado. Se Debian rodasse type uname após a inicialização do
sistema, ele constataria que type voltaria a descrever uname como um binário regular.

Uma maneira mais rápida de limpar a tabela de hash é executar o comando hash -d.

Às vezes precisamos de uma fonte mais simples de informações sobre um comando. O co-
mando which, que o comando type do exemplo anterior rastreou para nós, retorna somente
a localização absoluta de um comando. Este exemplo localiza os comandos uname e which.

Código 13.6: Identificando a localização do utilitário através do which

root@debian10:/home/debian# which uname which


/usr/bin/uname
/usr/bin/which

Se quiser exibir informações sobre comandos internos do shell (“builtin”), use o co-
mando help.

Usando o histórico de comandos


Pode acontecer de você pesquisar cuidadosamente o uso adequado de um comando e executá-
lo com êxito junto com uma seleção complicada de opções e argumentos. Mas o que ocorre
119 13. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

algumas semanas depois, quando você precisa executar o mesmo comando com as mesmas
opções e argumentos, mas não consegue se lembrar dos detalhes? Ao invés de recomeçar a
pesquisa do zero, vale a pena tentar recuperar o comando original usando history.

Digite history para exibir os comandos mais recentes em ordem de execução. É fácil pesquisar
nesses comandos usando um pipe para canalizar uma string específica para o comando grep.
O exemplo abaixo procura por qualquer comando que inclua o texto bash_history:

Código 13.7: Verificando histórico de comandos com o history

root@debian10:/home/debian# history | grep bash_history


34 history | grep bash_history

Aqui, um único comando é retornado junto com seu número na sequência, 34.

E por falar em bash_history, esse é na verdade o nome de um arquivo oculto que costuma
estar no diretório inicial do usuário. Por se tratar de um arquivo oculto (indicado pelo ponto
que precede seu nome de arquivo), ele só será visível ao se listar o conteúdo do diretório,
usando ls com o argumento -a:

Código 13.8: Inspecionando arquivos ocultos com o ls

root@debian10:/home/debian# ls /home/debian/
4linux.txt Desktop Downloads meutexto novoarquivo Public
qualteupapo.txt.zip sha256.txt Templates
4linux.txt.backup Documents meunovotexto Music Pictures qualteupapo.txt.jpg
qualteupapo.zip.jpg softlink Videos
root@debian10:/home/debian# ls -a /home/debian/
. 4linux.txt.backup .bashrc Desktop .gnupg meunovotexto novoarquivo
Public qualteupapo.zip.jpg .ssh .vboxclient-
display-svga-x11.pid Videos
.. .bash_history .cache Documents .ICEauthority meutexto Pictures
qualteupapo.txt.jpg sha256.txt Templates .vboxclient-
draganddrop.pid
4linux.txt .bash_logout .config Downloads .local Music .profile
qualteupapo.txt.zip softlink .vboxclient-clipboard.pid .vboxclient-
seamless.pid

Encontrando suas variáveis de ambiente


Então, como identificamos os valores atuais para cada uma de nossas variáveis de ambiente?
Uma maneira de fazer isso é por meio do comando env:

Código 13.9: Listar variáves de ambiente através do comando env


120 13. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# env
SHELL=/bin/bash
SUDO_GID=1000
SUDO_COMMAND=/usr/bin/su
SUDO_USER=debian
PWD=/home/debian
LOGNAME=root
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Aparecerão muitos resultados, mas por enquanto, observe a entrada PATH, que contém
os diretórios nos quais seu shell (e outros aplicativos) procura por outros programas, sem
a necessidade de especificar um caminho completo. Neste caso, seria possível executar um
programa binário que reside, digamos, em /usr/local/bin de dentro do seu diretório pessoal,
e ele seria executado como se o arquivo fosse local.

Agora se liga. . . O comando echo exibe na tela o que você mandar. Acredite ou não, haverá
diversas ocasiões em que será muito útil fazer echo, literalmente repetir algo.

Código 13.10: Exemplo de uso do comando echo

root@debian10:/home/debian# echo "E ai.. Qual teu papo"


E ai.. Qual teu papo

Mas echo tem outras cartas na manga. Quando você o alimenta com o nome de uma variável
de ambiente, e informa que se trata de uma variável, com o prefixo $, ao invés de apenas
exibir o nome da variável, o shell irá expandi-lo, informando o valor. Não tem certeza se o seu
diretório favorito está atualmente em PATH? Você pode verificar rapidamente com o echo:

Código 13.11: Mostrar o conteúdo de uma variável de ambiente com echo

root@debian10:/home/debian# echo $PATH


/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Criando novas variáveis de ambiente


Você pode adicionar suas próprias variáveis personalizadas ao seu ambiente. A maneira mais
simples é usar o caractere =. A string à esquerda será o nome da nova variável e a string à
direita, seu valor. Depois, alimente echo com o nome da variável para confirmar se funcionou:

Código 13.12: Atribuição de valores para variáveis de ambiente


121 13. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# minhavariavel=oi
root@debian10:/home/debian# echo $minhavariavel
oi

Note que não há espaços em torno do sinal de igual durante a atribuição de variáveis.

Mas será que funcionou mesmo? Digite bash no terminal para abrir um novo shell. Ele terá
exatamente a mesma aparência daquele que acabamos de usar, mas na verdade é um filho do
original (que chamamos de pai). Agora, dentro desse novo shell filho, tente fazer com que o
echo opere sua mágica, da mesma maneira de antes. Nada. O que aconteceu?

Código 13.13: Variáveis e comportamentos em outras sessões do shell

root@debian10:/home/debian# bash
root@debian10:/home/debian# echo $minhavariavel

Código 13.14: Exportando variáveis para serem visíveis aos processos filhos com export

root@debian10:/home/debian# exit
exit
root@debian10:/home/debian# export minhavariavel
root@debian10:/home/debian# bash
root@debian10:/home/debian# echo $minhavariavel
oi

Removendo as variáveis de ambiente


Quer saber como limpar todas as variáveis efêmeras que você criou? Uma maneira de fazer
isso é simplesmente fechar o shell pai ou reiniciar o computador. Mas existem jeitos mais
simples. Como, por exemplo, unset. Basta digitar unset (sem o $) para matar a variável.
Comprove com echo.

Código 13.15: Remover variáveis de ambiente existentes com o unset

root@debian10:/home/debian# unset minhavariavel


root@debian10:/home/debian# echo $minhavariavel

Se um comando unset existe, pode apostar que também há um comando set complementar.
122 13. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

A execução de set por si só exibirá um monte de saídas, mas nada muito diferente de env.
Observe a primeira linha da saída obtida ao filtrarmos por PATH:

Código 13.16: O comando set

root@debian10:/home/debian# set | grep PATH


PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Qual a diferença entre set e env? Para nossos propósitos, a principal delas é que set exibe
todas as variáveis e funções. Para ilustrar isso, vamos criar uma nova variável chamada
joatham e em seguida confirmar se ela está lá:

Código 13.17: Criando uma variável de escopo local

root@debian10:/home/debian# joatham=4linux
root@debian10:/home/debian# echo $joatham
4linux

Se rodarmos env usando grep para filtrar pela string joatham, nenhuma saída será exibida.
Mas se rodarmos set da mesma maneira, veremos nossa variável local.

Código 13.18: Diferença entre o comando set e env

root@debian10:/home/debian# env | grep joatham


root@debian10:/home/debian# set | grep joatham
joatham=4linux

Usando aspas para escapar dos caracteres especiais


Este é um bom momento para apresentar o problema dos caracteres especiais. Os caracteres
alfanuméricos (a-z e 0-9) normalmente são lidos literalmente pelo Bash. Para criar um novo
arquivo chamado myfile, bastaria digitar touch seguido de myfile e o Bash saberia o que fazer.
Mas se quisermos incluir um caractere especial no nome do arquivo, teríamos um pouco mais
de trabalho.

Para ilustrar esse fato, digitaremos touch e em seguida o título: my big file. O problema é
que existem dois espaços entre as palavras que o Bash interpretará. Embora, tecnicamente,
espaços não sejam “caracteres”, é assim que eles se comportam, já que o Bash não os lerá
literalmente. Se você listar o conteúdo do diretório atual, em vez de um arquivo chamado
my big file, verá três arquivos chamados, respectivamente, my, big, e file. Isso porque o Bash
123 13. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

pensou que você queria criar vários arquivos cujos nomes estavam sendo dados em uma lista:

Código 13.19: Comportamento de espaços no bash

root@debian10:/home/debian/4linux# touch my big file


root@debian10:/home/debian/4linux# ls
big file my

Os espaços serão interpretados da mesma forma se você excluir (rm) os três arquivos com um
só comando:

Código 13.20: Removendo os arquivos

root@debian10:/home/debian/4linux# rm my big file

Agora, vamos fazer do jeito certo. Digite touch e as três partes do seu nome de arquivo, mas
desta vez coloque o nome entre aspas. Desta vez, funciona. Ao listar o conteúdo do diretório,
veremos um único arquivo com o nome correto.

Código 13.21: Utilizando aspas para incluir espaços em nomes de arquivos

root@debian10:/home/debian/4linux# touch "my big file"


root@debian10:/home/debian/4linux# ls
'my big file'

Existem outras maneiras de obter o mesmo efeito. As aspas simples, por exemplo, funcionam
da mesma forma que as aspas duplas (note que as aspas simples preservam o valor literal de
todos os caracteres, ao passo que as aspas duplas preservam todos os caracteres exceto $, ‘,
e, em certos casos, !.)

Código 13.22: Removendo um arquivo com espaços

root@debian10:/home/debian/4linux# rm 'my big file'

Podemos incluir uma barra invertida antes de cada caractere especial para “escapar” dessa
característica e fazer com que o Bash o leia literalmente.

{.bash caption="Escapando espaços com o caractere \"} root@debian10:/home/debian/4linux# touch


my\ big\ file root@debian10:/home/debian/4linux# ls 'my big file'
Fabio Gonçalves De Melo Santana / [email protected]

14
Resumo
Nesta aula, você aprendeu:

• Como obter informações sobre a localização do sistema de arquivos e a pilha de software


do sistema operacional;
• Como encontrar ajuda para o uso de comandos;
• Como identificar a localização do sistema de arquivos e os tipos de binários de comandos;
• Como encontrar e reutilizar comandos executados anteriormente;
• Como identificar as variáveis de ambiente de seu sistema;
• Como criar suas próprias variáveis de ambiente e exportá-la para outros shells;
• Como remover variáveis de ambiente e usar os comandos env e set;
• Como escapar dos caracteres especiais para que o Bash os leia literalmente.

Os seguintes comandos foram abordados nesta lição:

• pwd: Exibe o caminho para o diretório de trabalho atual;


• uname: Exibe a arquitetura de hardware do sistema, a versão do kernel do Linux, a
distribuição e a versão da distribuição;
• man: Acessa os arquivos de ajuda com a documentação do uso dos comandos;
• type: Exibe a localização de um ou mais comandos no sistema de arquivos e seu tipo;
• which: Exibe a localização de um comando no sistema de arquivos;
• history: Exibe ou reutiliza comandos executados anteriormente;
• echo: Exibe as strings e variáveis informadas;
• env: Entende e modifica suas variáveis de ambiente;

124
125 14. Resumo
Fabio Gonçalves De Melo Santana / [email protected]

• export: Passa uma variável de ambiente para os shells filhos;


• unset: Desconfigura os valores e atributos das variáveis e funções do shell.
126
Fabio Gonçalves De Melo Santana / [email protected]
127 15. Talvez isso possa te ajudar. . .
Fabio Gonçalves De Melo Santana / [email protected]

15
Talvez isso possa te ajudar. . .

Fig. 15.1: MAN PAGES SECTIONS


128 15. Talvez isso possa te ajudar. . .
Fabio Gonçalves De Melo Santana / [email protected]

• Fonte: - https://wizardzines.com/comics/man-pages/
Fabio Gonçalves De Melo Santana / [email protected]

16
103.2: Processar fluxos de texto
usando filtros

Introdução
Lidar com textos é uma parte importante do trabalho de todo administrador de sistemas. Por-
tanto, um administrador deve estar pronto para lidar com muitas ferramentas de manipulação
de texto dentro de uma distribuição Linux.

Uma revisão rápida sobre redirecionamentos e pipes


Também da filosofia Unix:

• Escreva programas que façam apenas uma coisa e a façam bem;


• Escreva programas que trabalhem juntos.

Uma das principais formas de fazer os programas trabalharem juntos é usar piping (canalização)
e redirecionamentos. Praticamente todos os programas de manipulação de texto obtêm texto
de uma entrada padrão (stdin), produzem uma saída padrão (stdout) e enviam eventuais
erros para uma saída de erro padrão (stderr). A menos que especifiquemos o contrário, a
entrada padrão será o que digitamos no teclado (o programa lê esse texto quando pressionamos
Enter). Da mesma forma, a saída padrão e os erros serão exibidos na tela do terminal. Vamos
ver como isso funciona:

129
130 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]

Código 16.1: Saída padrão no próprio shell

root@debian10:/home/debian# cat
Isto eh um texto
Isto eh um texto
E ai..Qualteupapo..
E ai..Qualteupapo..
@joatham.silva
@joatham.silva
@qualteupapo
@qualteupapo
^C

Para saber mais sobre o comando cat (o termo vem de “concatenar”), consulte as páginas de
manual.

Conforme demonstrado acima, se você não especificar de onde cat deve ler, ele lerá a entrada
padrão (o que você digitar) e produzirá o que for lido na janela do terminal (a saída padrão).

Agora tente o seguinte:

Código 16.2: Redirecionamento de saída para um arquivo com >

root@debian10:/home/debian# cat > meutexto


Joatham Pedro Santos da Silva - Analista de Seguranca da Informacao - 4linux
@joatham.pedro
@qualteupapo
^C
root@debian10:/home/debian# cat meutexto
Joatham Pedro Santos da Silva - Analista de Seguranca da Informacao - 4linux
@joatham.pedro
@qualteupapo

O sinal de > (maior que) diz ao cat para enviar a saída ao arquivo meutexto, não para a
saída padrão. Agora tente o seguinte:

Código 16.3: Outro exemplo de redirecionamento de saída

root@debian10:/home/debian# cat meutexto > meunovotexto


root@debian10:/home/debian# cat meunovotexto
Joatham Pedro Santos da Silva - Analista de Seguranca da Informacao - 4linux
@joatham.pedro
@qualteupapo

O efeito desse comando é copiar meutexto para meunovotexto. Na verdade, podemos verificar
se esses dois arquivos têm o mesmo conteúdo executando um diff:
131 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]

Código 16.4: Inspecionando arquivos de texto com diff

root@debian10:/home/debian# diff meutexto meunovotexto

Como não há saída, os arquivos são idênticos. Agora, tente o operador de redirecionamento
de acréscimo (»):

Código 16.5: Adicionando o conteúdo ao final do arquivo com redirecionador »

root@debian10:/home/debian# echo "Se voce esta aqui.. me da um salve no instagram rsrs" >>
meunovotexto
root@debian10:/home/debian# diff meutexto meunovotexto
3a4
> Se voce esta aqui.. me da um salve no instagram rsrs

Até agora, usamos redirecionamentos para criar e manipular arquivos. Também podemos usar
pipes (representados pelo símbolo |) para redirecionar a saída de um programa para outro
programa. Vamos encontrar as linhas onde a palavra joatham aparece:

Código 16.6: Um exemplo de Pipe com os comandos cat e grep

root@debian10:/home/debian# cat meutexto | grep joatham


@joatham.pedro
root@debian10:/home/debian# cat meutexto | grep -i joatham
Joatham Pedro Santos da Silva - Analista de Seguranca da Informacao - 4linux
@joatham.pedro

Nós canalizamos a saída de cat para outro comando: grep. Observe que, quando ignoramos o
uso de maiúsculas e minúsculas (usando a opção -i), obtemos uma linha extra como resultado.

Processando fluxos de texto


Lendo um arquivo compactado

Vamos criar um arquivo chamado 4linux.txt contendo uma lista dos seguintes comandos:

Código 16.7: Criando um arquivo de texto

bzcat
cat
cut
head
132 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]

less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc
xzcat
zcat

A seguir, vamos usar o comando grep para imprimir todas as linhas que contêm a string cat:

Código 16.8: Filtrando linhas com grep

root@debian10:/home/debian# cat 4linux.txt | grep cat


bzcat
cat
xzcat
zcat

Outra forma de obter essas informações é apenas usar o comando grep para filtrar o texto
diretamente, sem a necessidade de usar outro aplicativo para enviar o fluxo de texto para
stdout:

Código 16.9: Utilizado o grep diretamente

root@debian10:/home/debian# grep cat 4linux.txt


bzcat
cat
xzcat
zcat

Lembre-se de que há muitas maneiras de realizar uma tarefa usando o Linux.

Existem outros comandos que lidam com arquivos compactados (bzcat para arquivos com-
pactados bzip, xzcat para arquivos xz e zcat para arquivos gzip). Eles são usados para visualizar
o conteúdo de um arquivo compactado com base no algoritmo de compactação empregado.
133 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]

Verifique se o arquivo recém-criado 4linux.txt é o único no diretório e, em seguida, crie uma


versão compactada gzip do arquivo:

Código 16.10: Compactar arquivos com o gzip

root@debian10:/home/debian# ls 4linux.*
4linux.txt
root@debian10:/home/debian# gzip 4linux.txt
root@debian10:/home/debian# ls 4linux*
4linux.txt.gz

Em seguida, use o comando zcat para visualizar o conteúdo do arquivo compactado com o
gzip:

Código 16.11: Visualizando o conteúdo de um arquivo compactactado com o zcat

root@debian10:/home/debian# zcat 4linux.txt.gz


bzcat
cat
cut
head
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc
xzcat
zcat

Visualizando um arquivo no paginador


Sabemos que cat concatena um arquivo para a saída padrão (quando um arquivo é informado
após o comando). O arquivo /var/log/syslog é onde o sistema Linux armazena tudo de
importante que acontece no sistema. Vamos ler o arquivo /var/log/syslog:

Código 16.12: Exemplo de saída muito extensa para o terminal

root@debian10:/home/debian# cat /var/log/syslog


134 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]

Nesse ponto veremos mensagens rolando muito rápido na janela do terminal. É possível
canalizar a saída para o programa less para que os resultados sejam paginados. Com o less,
podemos usar as setinhas do teclado para navegar pela saída. Comandos do tipo vi também
ajudam a navegar e pesquisar em todo o texto.

No entanto, em vez de canalizar o comando cat para um programa de paginação, é mais


pragmático usar o programa de paginação diretamente:

Código 16.13: Habilitar rolagem para arquivos muito grandes com o comando less

root@debian10:/home/debian# less /var/log/syslog

Obtendo uma parte de um arquivo de texto


Se apenas o início ou o final de um arquivo precisar ser analisado, existem outros métodos
disponíveis. O comando head é usado para ler as primeiras dez linhas de um arquivo por
padrão, e o comando tail é usado para ler as dez últimas linhas. Experimente:

Código 16.14: Inspecionando o início de um arquivo com o comando head

root@debian10:/home/debian# head /var/log/syslog


Jul 1 08:57:45 debian10 rsyslogd: [origin software="rsyslogd" swVersion="8.1901.0" x-pid=
"463" x-info="https://www.rsyslog.com"] rsyslogd was HUPed
Jul 1 08:57:45 debian10 systemd[1]: logrotate.service: Succeeded.
Jul 1 08:57:45 debian10 systemd[1]: Started Rotate log files.
Jul 1 08:57:46 debian10 NetworkManager[477]: <info> [1625147866.1483] dhcp4 (enp0s3):
state changed bound -> expire
Jul 1 08:57:46 debian10 NetworkManager[477]: <info> [1625147866.1484] device (enp0s3):
DHCPv4: 480 seconds grace period started
Jul 1 08:57:46 debian10 NetworkManager[477]: <info> [1625147866.1650] dhcp4 (enp0s3):
state changed expire -> unknown
Jul 1 08:57:46 debian10 dhclient[8341]: DHCPDISCOVER on enp0s3 to 255.255.255.255 port 67
interval 3
Jul 1 08:57:46 debian10 dhclient[8341]: DHCPOFFER of 192.168.0.20 from 192.168.0.1
Jul 1 08:57:46 debian10 dhclient[8341]: DHCPREQUEST for 192.168.0.20 on enp0s3 to
255.255.255.255 port 67
Jul 1 08:57:46 debian10 dhclient[8341]: DHCPACK of 192.168.0.20 from 192.168.0.1
root@debian10:/home/debian# tail /var/log/syslog
Jul 1 09:22:56 debian10 NetworkManager[477]: <info> [1625149376.5124] dhcp4 (enp0s3):
nameserver '179.155.128.36'
Jul 1 09:22:56 debian10 NetworkManager[477]: <info> [1625149376.5132] dhcp4 (enp0s3):
state changed bound -> bound
Jul 1 09:22:56 debian10 dbus-daemon[453]: [system] Activating via systemd: service name='
org.freedesktop.nm_dispatcher' unit='dbus-org.freedesktop.nm-dispatcher.service'
requested by ':1.9' (uid=0 pid=477 comm="/usr/sbin/NetworkManager --no-daemon ")
Jul 1 09:22:56 debian10 dhclient[8341]: bound to 192.168.0.20 -- renewal in 1397 seconds.
Jul 1 09:22:56 debian10 systemd[1]: Starting Network Manager Script Dispatcher Service...
Jul 1 09:22:56 debian10 dbus-daemon[453]: [system] Successfully activated service 'org.
freedesktop.nm_dispatcher'
Jul 1 09:22:56 debian10 systemd[1]: Started Network Manager Script Dispatcher Service.
135 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]

Jul 1 09:22:56 debian10 nm-dispatcher: req:1 'dhcp4-change' [enp0s3]: new request (1


scripts)
Jul 1 09:22:56 debian10 nm-dispatcher: req:1 'dhcp4-change' [enp0s3]: start running
ordered scripts...
Jul 1 09:23:07 debian10 systemd[1]: NetworkManager-dispatcher.service: Succeeded.

Para ajudar a ilustrar o número de linhas exibidas, podemos canalizar a saída do comando head
para o comando nl, que exibirá o número de linhas de texto transmitidas para o comando:

Código 16.15: Inspecionando as linhas do comando head com redirecionamento para o comando nl

root@debian10:/home/debian# head /var/log/syslog | nl


1 Jul 1 08:57:45 debian10 rsyslogd: [origin software="rsyslogd" swVersion="8.1901.0
" x-pid="463" x-info="https://www.rsyslog.com"] rsyslogd was HUPed
2 Jul 1 08:57:45 debian10 systemd[1]: logrotate.service: Succeeded.
3 Jul 1 08:57:45 debian10 systemd[1]: Started Rotate log files.
4 Jul 1 08:57:46 debian10 NetworkManager[477]: <info> [1625147866.1483] dhcp4 (
enp0s3): state changed bound -> expire
5 Jul 1 08:57:46 debian10 NetworkManager[477]: <info> [1625147866.1484] device (
enp0s3): DHCPv4: 480 seconds grace period started
6 Jul 1 08:57:46 debian10 NetworkManager[477]: <info> [1625147866.1650] dhcp4 (
enp0s3): state changed expire -> unknown
7 Jul 1 08:57:46 debian10 dhclient[8341]: DHCPDISCOVER on enp0s3 to 255.255.255.255
port 67 interval 3
8 Jul 1 08:57:46 debian10 dhclient[8341]: DHCPOFFER of 192.168.0.20 from 192.168.0.1
9 Jul 1 08:57:46 debian10 dhclient[8341]: DHCPREQUEST for 192.168.0.20 on enp0s3 to
255.255.255.255 port 67
10 Jul 1 08:57:46 debian10 dhclient[8341]: DHCPACK of 192.168.0.20 from 192.168.0.1

Da mesma forma, podemos canalizar a saída do comando tail para o comando wc, que por
padrão conta o número de palavras em um documento, e usando a opção -l para imprimir na
tela o número de linhas de texto lidas pelo comando:

Código 16.16: Contagem de linhas com o comando wc

root@debian10:/home/debian# tail /var/log/syslog | wc -l


10

Caso um administrador precise revisar mais (ou menos) linhas do início ou do fim de um


arquivo, a opção -n pode ser usada para limitar a saída dos comandos:

Código 16.17: Definindo a quantidade de linhas para os comandos head/tail

root@debian10:/home/debian# tail -n 5 /var/log/syslog


Jul 1 09:22:56 debian10 dbus-daemon[453]: [system] Successfully activated service 'org.
freedesktop.nm_dispatcher'
Jul 1 09:22:56 debian10 systemd[1]: Started Network Manager Script Dispatcher Service.
136 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]

Jul 1 09:22:56 debian10 nm-dispatcher: req:1 'dhcp4-change' [enp0s3]: new request (1


scripts)
Jul 1 09:22:56 debian10 nm-dispatcher: req:1 'dhcp4-change' [enp0s3]: start running
ordered scripts...
Jul 1 09:23:07 debian10 systemd[1]: NetworkManager-dispatcher.service: Succeeded.
root@debian10:/home/debian# head -n 12 /var/log/syslog
Jul 1 08:57:45 debian10 rsyslogd: [origin software="rsyslogd" swVersion="8.1901.0" x-pid=
"463" x-info="https://www.rsyslog.com"] rsyslogd was HUPed
Jul 1 08:57:45 debian10 systemd[1]: logrotate.service: Succeeded.
Jul 1 08:57:45 debian10 systemd[1]: Started Rotate log files.
Jul 1 08:57:46 debian10 NetworkManager[477]: <info> [1625147866.1483] dhcp4 (enp0s3):
state changed bound -> expire
Jul 1 08:57:46 debian10 NetworkManager[477]: <info> [1625147866.1484] device (enp0s3):
DHCPv4: 480 seconds grace period started
Jul 1 08:57:46 debian10 NetworkManager[477]: <info> [1625147866.1650] dhcp4 (enp0s3):
state changed expire -> unknown
Jul 1 08:57:46 debian10 dhclient[8341]: DHCPDISCOVER on enp0s3 to 255.255.255.255 port 67
interval 3
Jul 1 08:57:46 debian10 dhclient[8341]: DHCPOFFER of 192.168.0.20 from 192.168.0.1
Jul 1 08:57:46 debian10 dhclient[8341]: DHCPREQUEST for 192.168.0.20 on enp0s3 to
255.255.255.255 port 67
Jul 1 08:57:46 debian10 dhclient[8341]: DHCPACK of 192.168.0.20 from 192.168.0.1
Jul 1 08:57:46 debian10 NetworkManager[477]: <info> [1625147866.3347] dhcp4 (enp0s3):
address 192.168.0.20
Jul 1 08:57:46 debian10 NetworkManager[477]: <info> [1625147866.3348] dhcp4 (enp0s3):
plen 24 (255.255.255.0)

Noções básicas de sed, o editor de fluxo


Vamos dar uma olhada em outros arquivos, termos e utilitários que não têm cat em seus
nomes. Podemos fazer isso passando a opção -v para grep, que instrui o comando a exibir
apenas as linhas que não contêm cat:

Código 16.18: Utilizando o grep para pegar a contraparte

root@debian10:/home/debian# zcat 4linux.txt.gz | grep -v cat


cut
head
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc
137 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]

Muito do que podemos fazer com grep, também podemos fazer com sed. Primeiro, vamos
recuperar nosso arquivo 4linux.txt descompactando o pacote gzip do arquivo:

Código 16.19: Descompactando o arquivo com gunzip

root@debian10:/home/debian# gunzip 4linux.txt.gz


root@debian10:/home/debian# ls 4linux*
4linux.txt

Em seguida, podemos usar sed para listar apenas as linhas que contêm a string cat:

Código 16.20: Utilizando o sed para filtrar linhas

root@debian10:/home/debian# sed -n /cat/p < 4linux.txt


bzcat
cat
xzcat
zcat

Usamos o sinal de menor que < para direcionar o conteúdo do arquivo 4linux.txt into para
o comando sed. A palavra entre barras (isto é, /cat/) é o termo que estamos procurando.
A opção -n instrui o sed a não produzir nenhuma saída (a não ser as saídas solicitadas pelo
comando p). Tente executar este mesmo comando sem a opção -n para ver o que acontece.
Depois, tente o seguinte:

Código 16.21: Redirecionamento do conteúdo de um arquivo para o sed

root@debian10:/home/debian# sed /cat/d < 4linux.txt


cut
head
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc

Sem a opção -n, sed imprime na tela tudo o que está no arquivo, exceto o que /d instrui sed
138 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]

a remover da saída.

Um uso comum de sed é localizar e substituir texto em um arquivo. Suponha que você queira
alterar todas as ocorrências de cat para dog. Para isso, use o sed, instruindo a opção s a
trocar cada instância do primeiro termo, cat, pelo segundo, dog:

Código 16.22: Substituição de padrões com sed

root@debian10:/home/debian# sed s/cat/dog/ < 4linux.txt


bzdog
dog
cut
head
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc
xzdog
zdog

Em vez de usar um operador de redirecionamento (<) para passar o arquivo 4linux.txt para o
comando sed, podemos fazer o comando sed operar diretamente no arquivo. Tentaremos isso
a seguir, enquanto criamos simultaneamente um backup do arquivo original:

Código 16.23: Criando um arquivo de backup com as alterações realizadas pelo comando sed

root@debian10:/home/debian# sed -i.backup s/cat/dog/ 4linux.txt


root@debian10:/home/debian# ls 4linux*
4linux.txt 4linux.txt.backup

A opção -i executa uma operação sed local no arquivo original. Se você não usar .backup após
o parâmetro -i, vai reescrever o arquivo original. Qualquer texto inserido após o parâmetro -i
será o nome com o qual o arquivo original será salvo antes das modificações que você pediu
ao sed para realizar.
139 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]

Um olhar mais aprofundado nos arquivos


O comando octal dump (od) é frequentemente usado para depurar aplicativos e diversos tipos
de arquivos. Por si só, o comando od somente lista o conteúdo de um arquivo em formato
octal. Podemos usar nosso arquivo 4linux.txt para praticar com esse comando:

Código 16.24: Exemplo de saída do comando od

root@debian10:/home/debian# od 4linux.txt
0000000 075142 067544 005147 067544 005147 072543 005164 062550
0000020 062141 066012 071545 005163 062155 071465 066565 067012
0000040 005154 062157 070012 071541 062564 071412 062145 071412
0000060 060550 032462 071466 066565 071412 060550 030465 071462
0000100 066565 071412 071157 005164 070163 064554 005164 060564
0000120 066151 072012 005162 067165 070551 073412 005143 075170
0000140 067544 005147 062172 063557 067412 005151
0000154

A primeira coluna é o deslocamento de bytes para cada linha da saída. Como por padrão od
imprime informações no formato octal, cada linha começa com um deslocamento de bytes de
oito bits, seguido por oito colunas, cada uma contendo o valor octal dos dados dentro dessa
coluna.

Lembre-se que um byte tem 8 bits.

Se precisar visualizar o conteúdo de um arquivo em formato hexadecimal, use a opção -x:

Código 16.25: Mostrar o conteúdo no formato hexadecimal com o comando od

root@debian10:/home/debian# od -x 4linux.txt
0000000 7a62 6f64 0a67 6f64 0a67 7563 0a74 6568
0000020 6461 6c0a 7365 0a73 646d 7335 6d75 6e0a
0000040 0a6c 646f 700a 7361 6574 730a 6465 730a
0000060 6168 3532 7336 6d75 730a 6168 3135 7332
0000100 6d75 730a 726f 0a74 7073 696c 0a74 6174
0000120 6c69 740a 0a72 6e75 7169 770a 0a63 7a78
0000140 6f64 0a67 647a 676f 6f0a 0a69
0000154

Nesse caso, cada uma das oito colunas após o deslocamento de bytes é representada por seus
equivalentes hexadecimais.

Um uso útil do comando od é depurar scripts. Por exemplo, o comando od pode nos mostrar
caracteres que não são normalmente visíveis e que existem em um arquivo, como indicadores
140 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]

de nova linha. Usamos para isso a opção -c, de modo que, em vez de exibir a notação numérica
para cada byte, as colunas serão mostradas como seus equivalentes em caracteres:

Código 16.26: Listando caracteres invisível através do parâmetro c

root@debian10:/home/debian# od -c 4linux.txt
0000000 b z d o g \n d o g \n c u t \n h e
0000020 a d \n l e s s \n m d 5 s u m \n n
0000040 l \n o d \n p a s t e \n s e d \n s
0000060 h a 2 5 6 s u m \n s h a 5 1 2 s
0000100 u m \n s o r t \n s p l i t \n t a
0000120 i l \n t r \n u n i q \n w c \n x z
0000140 d o g \n z d o g \n o i \n
0000154

Todas as ocorrências de nova linha no arquivo são representadas pelos caracteres ocultos \n.
Se você deseja apenas visualizar todos os caracteres em um arquivo e não precisa ver as
informações de deslocamento de bytes, pode remover essa coluna da saída da seguinte forma:

Código 16.27: Visualizando apenas os caracteres com o od

root@debian10:/home/debian# od -An -c 4linux.txt


b z d o g \n d o g \n c u t \n h e
a d \n l e s s \n m d 5 s u m \n n
l \n o d \n p a s t e \n s e d \n s
h a 2 5 6 s u m \n s h a 5 1 2 s
u m \n s o r t \n s p l i t \n t a
i l \n t r \n u n i q \n w c \n x z
d o g \n z d o g \n o i \n

Resumo
Lidar com fluxos de texto é de grande importância ao administrar qualquer sistema Linux.
Os fluxos de texto podem ser processados usando scripts para automatizar tarefas diárias ou
localizar informações de depuração relevantes em arquivos de log. Eis um breve resumo dos
comandos abordados nesta lição:

• cat: Usado para combinar ou ler arquivos de texto simples;


• bzcat: Permite processar ou ler arquivos comprimidos usando o método bzip2;
• xzcat: Permite processar ou ler arquivos comprimidos usando o método xz;
• zcat: Permite processar ou ler arquivos comprimidos usando o método gzip;
• less: Este comando página o conteúdo de um arquivo e possibilita a funcionalidade de
navegação e pesquisa;
• head: Este comando exibe as primeiras 10 linhas de um arquivo por padrão. A opção
141 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]

-n permite exibir mais ou menos linhas;


• tail: Este comando exibe as últimas 10 linhas de um arquivo por padrão. A opção -n
permite exibir mais ou menos linhas. A opção -f é usada para seguir a saída de um
arquivo de texto conforme novos dados são escritos nele;
• wc: Abreviação de “word count” (contagem de palavras), mas dependendo dos parâmet-
ros usados ele conta caracteres, palavras e linhas;
• sort: Usado para organizar a saída de uma listagem em ordem alfabética, alfabética
inversa ou aleatória;
• uniq: Usado para listar (e contar) strings correspondentes;
• od: O comando “octal dump” é usado para exibir um arquivo binário em notação octal,
decimal ou hexadecimal;
• nl: O comando “number line” exibe o número de linhas em um arquivo, além de recriar
um arquivo com cada linha prefixada por seu número de linha;
• sed: O editor de fluxo pode ser usado para encontrar ocorrências correspondentes de
strings usando Expressões Regulares, bem como editar arquivos usando padrões pre-
definidos;
• tr: O comando translate substitui caracteres, e também remove e compacta caracteres
repetidos;
• cut: Este comando imprime colunas de arquivos de texto como campos baseados no
delimitador de caracteres de um arquivo;
• paste: Une arquivos em colunas com base no uso de separadores de campo;
• split: Este comando divide arquivos maiores em menores conforme os critérios definidos
nas opções do comando;
• md5sum: Usado para calcular o valor de hash MD5 de um arquivo. Também usado para
verificar um arquivo em relação a um valor de hash existente para garantir a integridade
do arquivo;
• sha256sum: Usado para calcular o valor de hash SHA256 de um arquivo. Também
usado para verificar um arquivo em relação a um valor de hash existente para garantir
a integridade do arquivo;
• sha512sum: Usado para calcular o valor de hash SHA512 de um arquivo. Também
usado para verificar um arquivo em relação a um valor de hash existente para garantir
a integridade do arquivo.
142 16. 103.2: Processar fluxos de texto usando filtros
Fabio Gonçalves De Melo Santana / [email protected]

Fig. 16.1: CHEATSHEETS

• Fonte: - https://www.scribd.com/document/365334038/Bash-Cheatsheet
Fabio Gonçalves De Melo Santana / [email protected]

17
103.3: Gerencia-
mento_básico_de_arquivos

Introdução
Se você não sabia, agora sabe que, no Linux tudo são arquivos, então é importantíssimo
saber como manipulá-los. Em geral, um usuário Linux precisa saber navegar pelo sistema de
arquivos, copiar arquivos de um local para outro e excluir arquivos.

Bom, mas o que é um arquivo? Um arquivo é uma entidade que armazena dados e programas.
Consiste em conteúdo e metadados (tamanho do arquivo, proprietário, data de criação, per-
missões). Os arquivos são organizados em diretórios. Um diretório é um arquivo que armazena
outros arquivos.

Dentre os diferentes tipos de arquivos, temos:

• Arquivos regulares: Armazenam dados e programas.


• Diretórios: Contêm outros arquivos.
• Arquivos especiais: Usados para entrada e saída de dados.

Claro, que existem outros tipos de arquivos.

143
144 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Manipulação de arquivos
Usando ls para listar arquivos

O comando ls é uma das ferramentas de linha de comando mais importantes que precisamos
aprender para navegar no sistema de arquivos.

Em sua forma mais básica, o ls lista somente nomes de arquivos e diretórios:

Código 17.1: O comando ls

root@debian10:/home/debian# ls
4linux 4linux.txt 4linux.txt.backup Desktop Documents Downloads meunovotexto
meutexto Music novoarquivo Pictures Public qualteupapo.txt.jpg qualteupapo.txt.
zip qualteupapo.zip.jpg sha256.txt softlink Templates Videos

Quando usado com -l, conhecido como formato de “listagem longa”, ele mostra as permissões
de arquivo ou diretório, proprietário, tamanho, data de modificação, hora e nome:

Código 17.2: Listar arquivos de forma detalhada com o ls

root@debian10:/home/debian# ls -l
total 56
drwxr-xr-x 2 root root 4096 Jul 1 12:30 4linux
-rw-r--r-- 1 root root 108 Jul 1 09:35 4linux.txt
-rw-r--r-- 1 root root 105 Jul 1 09:11 4linux.txt.backup
drwxr-xr-x 2 debian debian 4096 Feb 6 03:21 Desktop
drwxr-xr-x 3 debian debian 4096 Jun 30 15:06 Documents
drwxr-xr-x 2 debian debian 4096 Feb 6 03:21 Downloads
-rw-r--r-- 1 root root 158 Jul 1 09:06 meunovotexto
-rw-r--r-- 1 root root 105 Jul 1 09:03 meutexto
drwxr-xr-x 2 debian debian 4096 Feb 6 03:21 Music

O primeiro caractere na saída indica o tipo de arquivo:

• -: para um arquivo regular;


• d: para um diretório;
• c: para um arquivo especial.

Para mostrar o tamanho dos arquivos em um formato legível por humanos, adicione a opção
-h:

Código 17.3: Combinando parâmetros no comando ls

root@debian10:/home/debian# ls -lh
145 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

total 56K
drwxr-xr-x 2 root root 4.0K Jul 1 12:30 4linux
-rw-r--r-- 1 root root 108 Jul 1 09:35 4linux.txt
-rw-r--r-- 1 root root 105 Jul 1 09:11 4linux.txt.backup
drwxr-xr-x 2 debian debian 4.0K Feb 6 03:21 Desktop
drwxr-xr-x 3 debian debian 4.0K Jun 30 15:06 Documents

Para listar todos os arquivos, incluindo arquivos ocultos (aqueles que começam com .), use a
opção -a:

Código 17.4: Listar arquivos ocultos com o comando ls

root@debian10:/home/debian# ls -a
. 4linux.txt .bash_logout .config Downloads .local Music
.profile qualteupapo.txt.zip softlink .vboxclient-clipboard.pid
.vboxclient-seamless.pid
.. 4linux.txt.backup .bashrc Desktop .gnupg meunovotexto
novoarquivo Public qualteupapo.zip.jpg .ssh .vboxclient-display-
svga-x11.pid Videos
4linux .bash_history .cache Documents .ICEauthority meutexto Pictures
qualteupapo.txt.jpg sha256.txt Templates .vboxclient-draganddrop.pid

Os arquivos de configuração como .bash_history, que por padrão ficam ocultos, agora estão
visíveis.

Em geral, a sintaxe do comando ls é dada por:

Código 17.5: Sintaxe base do comando ls

ls OPTIONS FILE

Onde OPTIONS é qualquer uma das opções mostradas anteriormente (para ver todas as
opções possíveis execute man ls), e FILE é o nome do arquivo ou detalhes do diretório que
você deseja listar.

Quando FILE não está especificado, o diretório atual fica implícito.


146 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Criar, copiar, mover e remover arquivos


Criando arquivos com touch

O comando touch é a maneira mais fácil de criar arquivos novos e vazios. Também pode ser
usado para alterar os carimbos de data/hora (ou seja, hora de modificação) dos arquivos e
diretórios existentes. A sintaxe para usar touch é:

Código 17.6: Sintaxe base do comando touch

touch OPTIONS FILE_NAME(S)

Sem nenhuma opção, touch cria novos arquivos com os nomes de arquivo fornecidos como
argumentos, desde que ainda não existam arquivos com o mesmo nome. O comando touch
pode criar qualquer número de arquivos simultaneamente:

Código 17.7: Criar arquivos com o comando touch

root@debian10:/home/debian/4linux# touch file1 file2 file3

Com esse comando, seriam criados três arquivos novos vazios, chamados file1, file2 e file3.

Diversas opções de touch foram especificamente pensadas para permitir ao usuário alterar os
carimbos de data/hora dos arquivos. Por exemplo, a opção -a altera apenas a hora de acesso,
enquanto a opção -m altera apenas a hora de modificação. O uso de ambas as opções em
conjunto altera ambas as horas de acesso e de modificação para o horário atual:

Código 17.8: Modificando horário de alteração de um arquivo com o comando touch

root@debian10:/home/debian/4linux# touch -am file3

Copiando arquivos com cp

Como usuários Linux, geralmente copiamos arquivos de um local para outro. Podemos usar o
cp para todas as tarefas de cópia, seja para mover um arquivo de música ou um arquivo de
sistema de um diretório para outro:

Código 17.9: Copiando um arquivo para um diretório


147 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian/4linux# cp file1 dir2/

Este comando pode ser interpretado literalmente como copiar file1 para o diretório dir2. O
resultado é a presença de file1 dentro de dir2. Para que este comando seja executado com
sucesso, file1 deve existir no diretório atual do usuário. Caso contrário, o sistema exibe a
mensagem de erro No such file or directory:

Código 17.10: cp - no such file or directory

root@debian10:/home/debian# cp dir1/file1 dir2


cp: cannot stat 'dir1/file1': No such file or directory

Neste caso, observe que o caminho para file1 é mais explícito. O caminho de origem pode
ser expresso como um caminho relativo ou um caminho absoluto. Os caminhos relativos são
dados em referência a um diretório específico, ao passo que os caminhos absolutos não são
fornecidos com uma referência. Esclareceremos melhor essa noção mais adiante.

Por enquanto, apenas observe que este comando copia file1 para o diretório dir2. O caminho
para file1 é fornecido com mais detalhes, pois o usuário atualmente não está localizado em
dir1:

Código 17.11: Copiando arquivos de localidades diferentes

root@debian10:/home/debian# cp /home/debian/4linux/file2 /home/debian/Documents/

Neste terceiro caso, file2, localizado em /home/debian/4linux, é copiado no diretório


/home/debian/Documents/. O caminho fornecido aqui é absoluto. Nos dois exemplos
acima, os caminhos são relativos. Quando um caminho começa com o caractere /, trata-se
de um caminho absoluto; caso contrário, ele é relativo.

A sintaxe geral de cp é:

Código 17.12: Sintaxe do comando cp

cp OPTIONS SOURCE DESTINATION

SOURCE é o arquivo a ser copiado e DESTINATION o diretório para o qual o arquivo será
copiado. SOURCE e DESTINATION podem ser especificados como caminhos absolutos ou
148 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

relativos.

Movendo arquivos com o mv

Assim como o cp para copiar, o Linux fornece um comando para mover e renomear arquivos.
Ele se chama mv.

A operação de mover é análoga à de recortar e colar que costumamos executar por meio de
uma interface gráfica de usuário (GUI).

Se quiser mover um arquivo para um novo local, use mv da seguinte maneira:

Código 17.13: Sintaxe base do comando mv

mv FILENAME DESTINATION_DIRECTORY

Aqui está um exemplo:

Código 17.14: Exemplo de movimentação de um arquivo entre diretórios

root@debian10:/home/debian/4linux# mv file1 /home/debian/Documents/

O resultado é que file1 é movido para o destino /home/debian/Documents.

Para renomear um arquivo, mv é usado da seguinte maneira:

Código 17.15: Renomeando arquivos com o comando mv

root@debian10:/home/debian/Documents# mv file1 4linuxfile

Esse comando muda o nome do arquivo de file1 para 4linuxfile.

Por padrão, o mv não pede confirmação se você quiser sobrescrever (renomear) um arquivo
existente. No entanto, podemos fazer com que o sistema exiba uma mensagem, usando a
opção -i:

Código 17.16: Modo interativo ao utilizar o mv

debian@debian10:~/Documents$ mv -i 4linuxagain teste


mv: replace 'teste', overriding mode 0644 (rw-r--r--)?
149 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Este comando solicita a permissão do usuário antes de sobrescrever 4linuxagain com teste.

Inversamente, se usarmos -f, o arquivo será sobrescrito à força, sem pedir premissão:

Código 17.17: Forçar a sobrescrita de um arquivo

debian@debian10:~/Documents$ mv -f teste 4linuxdenovo

Removendo arquivos com rm

rm é usado para excluir arquivos. Pense nele como uma forma abreviada da palavra “remover”.
Note que a ação de remover um arquivo geralmente é irreversível e, portanto, este comando
deve ser usado com cautela:

Código 17.18: Remover arquivos com o comando rm

debian@debian10:~/Documents$ rm 4linuxdenovo

Este comando excluiria 4linuxdenovo:

Código 17.19: Solicitar confirmação ao usuário ao remover um arquivo

debian@debian10:~/Documents$ rm -i 4linuxdenovo
rm: remove write-protected regular empty file '4linuxdenovo'?

Este comando solicitaria uma confirmação ao usuário antes de excluir 4linuxdenovo. Lembre-
se, vimos a opção -i ao usarmos mv, acima:

Código 17.20: Forçar a remoção

debian@debian10:~/Documents$ rm -f 4linuxdenovo

Este comando exclui 4linuxdenovo à força, sem pedir sua confirmação.

Podemos excluir vários arquivos ao mesmo tempo:

Código 17.21: Excluindo múltiplos arquivos

root@debian10:/home/debian/Documents# rm file1 file2 file3


150 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Neste exemplo, file1, file2 e file3 são excluídos simultaneamente.

A sintaxe de rm geralmente é a seguinte:

Código 17.22: Sintaxe base do comando rm

rm OPTIONS FILE

Criando e removendo diretórios


Criando diretórios com mkdir

A criação de diretórios é essencial para organizar seus arquivos e pastas. Os arquivos podem
ser agrupados de maneira lógica dentro de um diretório. Para criar um diretório, use mkdir:

Código 17.23: Sintaxe base do comando mkdir

mkdir OPTIONS DIRECTORY_NAME

onde DIRECTORY_NAME é o nome do diretório a ser criado. Podemos criar qualquer número
de diretórios simultaneamente:

Código 17.24: Exemplo de criação de um repositório

root@debian10:/home/debian/Documents# mkdir dir1

criaria o diretório dir1 no diretório atual do usuário:

Código 17.25: Criar mais de um diretório simultâneamente

root@debian10:/home/debian/Documents# mkdir dir1 dir2 dir3

O comando anterior criaria três diretórios, dir1, dir2 e dir3, ao mesmo tempo.

Para criar um diretório junto com seus subdiretórios, use a opção -p (“parents”):
151 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Código 17.26: Criar diretórios aninhados

root@debian10:/home/debian/Documents# mkdir -p joatham/pedro

Este comando criaria a estrutura de diretórios joatham/pedro, ou seja, criaria os diretórios


joatham e pedro. O diretório pedro estaria localizado dentro do diretório joatham.

Removendo diretórios com o rmdir


rmdir deleta um diretório se ele estiver vazio. Sua sintaxe é dada por:

Código 17.27: Sintaxe base do comando rmdir

rmdir OPTIONS DIRECTORY

Onde DIRECTORY pode ser um único argumento ou uma lista de argumentos:

Código 17.28: Removendo diretórios com rmdir

root@debian10:/home/debian/Documents# rmdir dir1/

Este comando excluiria dir1.

Código 17.29: Removendo múltiplos diretórios de forma simultânea

root@debian10:/home/debian/Documents# rmdir dir2/ dir3/

Este comando excluiria simultaneamente dir1 e dir2.

Podemos remover um diretório junto com seu subdiretório:

Código 17.30: Remover diretórios aninhados

root@debian10:/home/debian/Documents# rmdir -p joatham/pedro/

Isso removeria a estrutura de diretórios joatham/pedro. Note que, se algum dos diretórios não
estiver vazio, ele não será excluído.
152 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Manipulação recursiva de arquivos e diretórios


Para manipular um diretório e seu conteúdo, precisamos aplicar a recursão. Recursão significa
efetuar uma ação e repetir essa ação em toda a árvore de diretórios. No Linux, as opções -r
ou -R ou –recursive são geralmente associadas à recursão.

Listagem recursiva com ls -R


ls -R é usado para listar o conteúdo de um diretório junto com seus subdiretórios e arquivos.

Código 17.31: Listar de forma recursiva o diretório debian

root@debian10:/home# ls -R debian/
debian/:
4linux 4linux.txt 4linux.txt.backup Desktop Documents Downloads meunovotexto
meutexto Music novoarquivo Pictures Public qualteupapo.txt.jpg qualteupapo.txt.
zip qualteupapo.zip.jpg sha256.txt softlink Templates Videos

debian/4linux:
dir2 file2 file3

debian/4linux/dir2:
file1

debian/Desktop:

Em geral, para listar o conteúdo de um diretório incluindo seus subdiretórios, usamos:

Código 17.32: Sintaxe base

ls -R DIRECTORY_NAME

A adição de uma barra a DIRECTORY_NAME não tem efeito:

ls -R teste

é similar a

ls -R teste/
153 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Cópia recursiva com cp -r


cp -r (ou -R ou –recursive) permite copiar um diretório junto com todos os seus subdiretórios
e arquivos.

Código 17.33: Listagem do conteúdo do diretório 4Linux

root@debian10:/home/debian# tree 4linux


4linux
|--- dir2
| `-- file1
|--- file2
`-- file3

1 directory, 3 files

root@debian10:/home/debian# mkdir novacopia


root@debian10:/home/debian# cp 4linux novacopia/
cp: -r not specified; omitting directory '4linux'
root@debian10:/home/debian# cp -r 4linux novacopia/
root@debian10:/home/debian# tree novacopia/
newcopy/
`-- 4linux
|--- dir2
| `-- file1
|--- file2
`-- file3

2 directories, 3 files

Remoção recursiva com rm -r


O comando rm -r remove um diretório e todo o seu conteúdo (subdiretórios e arquivos).

Ao tentar excluir um diretório sem usar -r, o sistema exibe um erro:

Código 17.34: Exemplo de remoção recursiva

root@debian10:/home/debian# rm novacopia/
rm: cannot remove 'novacopia/': Is a directory
root@debian10:/home/debian# rm -r novacopia/

É necessário adicionar -r, como no segundo comando, para que a exclusão tenha efeito.

Você deve estar se perguntando por que não usamos rmdir neste caso. Existe uma
diferença sutil entre os dois comandos. rmdir terá sucesso na exclusão apenas se o
154 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

diretório fornecido estiver vazio, enquanto rm -r pode ser usado independentemente


de o diretório estar vazio ou não.

Adicione a opção -i para pedir a confirmação antes que o arquivo seja excluído:

Código 17.35: Combinando a forma recursiva com a forma interativa

root@debian10:/home/debian# rm -ri 4linux


rm: descend into directory '4linux'?

Globbing de arquivos e caracteres curinga


O globbing de arquivos é um recurso fornecido pelo shell do Unix/Linux para representar
múltiplos nomes de arquivo usando caracteres especiais chamados caracteres curinga.

Os curingas são, essencialmente, símbolos que podem ser usados para substituir um ou mais
caracteres. Eles permitem, por exemplo, mostrar todos os arquivos que começam com a letra
A ou todos os que terminam com as letras .conf.

Os caracteres curinga são utilíssimos, pois podem ser usados com comandos como cp, ls ou
rm.

Veja a seguir alguns exemplos de globbing de arquivos:

• rm * : Remove todos os arquivos no diretório de trabalho atual;


• ls l?st : Lista todos os arquivos cujo nome começa com l, seguido por qualquer caractere
único e terminando com st;
• rmdir [a-z] * : Remove todos os diretórios cujo nome começa com uma letra.

Tipos de caracteres curinga


Existem três caracteres que podem ser usados como curingas no Linux:

• * (asterisco): Representa zero, uma ou mais ocorrências de qualquer caractere;


• ? (interrogação): Representa uma única ocorrência de qualquer caractere;
• [] (caracteres entre colchetes): Representa qualquer ocorrência do(s) caractere(s) in-
seridos nos colchetes. É possível usar diferentes tipos de caracteres, sejam números,
letras ou outros caracteres especiais. Por exemplo, a expressão [0-9] representa todos
os dígitos.
155 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

O asterisco
Um asterisco (*) corresponde a zero, uma ou mais ocorrências de qualquer caractere.

Por exemplo:

Código 17.36: O coringa *

root@debian10:/home/debian# find /home/ -name *.png

Esse comando localizaria todos os arquivos que terminam com .png, como foto.png, cat.png,
jota.png. O comando find será explorado posteriormente em uma lição seguinte.

Da mesma maneira:

Código 17.37: Listar todos os arquivos que se iniciam com lpic-

root@debian10:/home/debian# ls lpic-*.txt

listaria todos os arquivos de texto que começam com os caracteres lpic- seguidos por qualquer
número de caracteres e que terminam com .txt, como lpic-1.txt e lpic-2.txt.

O caractere curinga asterisco pode ser usado para manipular (copiar, excluir ou mover) todo
o conteúdo de um diretório:

Código 17.38: Copiar todos os arquivos de um diretório

root@debian10:/home/debian# cp -r animal/* forest/

O ponto de interrogação
O ponto de interrogação (?) corresponde a uma única ocorrência de um caractere.

Considere a listagem:

Código 17.39: Listagem de arquivos

root@debian10:/home/debian/4linux# ls
last.txt lest.txt list.txt past.txt third.txt
156 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Para retornar apenas os arquivos que começam com l seguido por qualquer caractere único e
os caracteres st.txt, usamos o caractere curinga ponto de interrogação (?):

Código 17.40: Aplicando filtros com o caractere ?

root@debian10:/home/debian/4linux# ls l?st.txt
last.txt lest.txt list.txt

Apenas os arquivos last.txt, lest.txt e list.txt são exibidos, pois correspondem aos critérios
dados.

Da mesma maneira,

Código 17.41: Combinando mais de uma ocorrência

root@debian10:/home/debian/4linux# ls ??st.txt
last.txt lest.txt list.txt past.txt

exibe os arquivos cujos nomes iniciam com quaisquer dois caracteres seguidos pelo texto st.txt.

Caracteres entre colchetes


Os curingas entre colchetes correspondem a qualquer ocorrência do(s) caractere(s) entre
colchetes:

Código 17.42: Criando grupos de busca

root@debian10:/home/debian/4linux# ls l[aef]st.txt
last.txt lest.txt

Este comando listaria todos os arquivos começando com l seguido por qualquer um dos car-
acteres do conjunto aef e terminando com st.txt.

Os colchetes também podem indicar intervalos:

Código 17.43: Utilizando intervalos

root@debian10:/home/debian/4linux# ls l[a-z]st.txt
last.txt lest.txt list.txt
157 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Esse comando exibe todos os arquivos com nomes começando com l seguido por qualquer
letra minúscula no intervalo de a à z e terminando com st.txt.

Também podemos definir múltiplos intervalos entre colchetes:

Código 17.44: Combinação de intervalos

root@debian10:/home/debian/4linux# ls
4linux-1A.txt 4linux-2A.txt 4linux-3.txt last.txt lest.txt list.txt past.txt third.
txt
root@debian10:/home/debian/4linux# ls 4linux-[0-9][A-Z].txt
4linux-1A.txt 4linux-2A.txt

A lista mostra um diretório escolar com uma lista de alunos registrados. Listando apenas os
alunos cujos números de registro atendam aos seguintes critérios:

• Começa com 4linux-


• Seguido por um número e um caractere em maiúscula
• e termina com .txt

Combinando caracteres curinga


Os caracteres curinga podem ser combinados, como em:

Código 17.45: Combinando caracteres coringa

root@debian10:/home/debian/4linux# ls
4linux-1A.txt 4linux-2A.txt 4linux-3.txt last.txt lest.txt list.txt past.txt third.
txt
root@debian10:/home/debian/4linux# ls [plf]?st*
last.txt lest.txt list.txt past.txt

O primeiro componente curinga ([plf]) corresponde a qualquer um dos caracteres p, l ou f. O


segundo componente curinga (?) corresponde a qualquer caractere único. O terceiro compo-
nente curinga (*) corresponde a zero, uma ou múltiplas ocorrências de qualquer caractere.

Existem outros caracteres curinga, como o sinal de mais (+), usado para representar carac-
tere(s) que aparecem uma ou mais vezes:

Código 17.46: Casar caracteres que iniciam com a letra f e terminal com algum número

root@debian10:/home/debian/4linux# ls
file1.txt file23.txt file.txt fisher.txt fom23.txt
158 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian/4linux# ls f*[0-9].txt
file1.txt file23.txt fom23.txt

Como encontrar arquivos


Conforme você usa sua máquina, os arquivos vão aumentando progressivamente em número e
tamanho. Às vezes, é difícil localizar um arquivo específico. Felizmente, o Linux inclui o find
para pesquisar e localizar arquivos rapidamente. O find usa a seguinte sintaxe:

Código 17.47: Sintaxe base do comando find

find STARTING_PATH OPTIONS EXPRESSION

• STARTING_PATH: Define o diretório em que a pesquisa se inicia;


• OPTIONS: Controla o comportamento e adiciona critérios específicos para otimizar o
processo de busca;
• EXPRESSION: Define os termos da pesquisa.

Código 17.48: Procurar um arquivo a partir de um nome

find . -name "myfile.txt"


./myfile.txt

O caminho inicial, neste caso, é o diretório atual. A opção -name especifica que a pesquisa
é baseada no nome do arquivo. myfile.txt é o nome do arquivo a ser pesquisado. Ao usar
globbing de arquivo, inclua sempre a expressão entre aspas:

Código 17.49: Utilizando caracteres coringa para busca

find /home/frank -name "*.png"


/home/frank/Pictures/logo.png
/home/frank/screenshot.png

Este comando busca por todos os arquivos que terminam com .png, começando no diretório
/home/frank/ e abaixo dele. Se você não entendeu o uso do asterisco (*), ele foi abordado
na lição anterior.
159 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Usando critérios para acelerar a pesquisa


Use find para localizar arquivos com base em tipo, tamanho ou hora. Se especificarmos uma
ou mais opções, os resultados desejados são obtidos em menos tempo.

As opções para localizar arquivos com base no tipo incluem:

• -type f: Busca por arquivos;


• -type d: Busca por diretórios;
• -type l: Busca por links simbólicos.

Código 17.50: Exempo de busca por diretório

$ find . -type d -name "example"

Este comando procura por todos os diretórios, no diretório atual e abaixo dele, que tenham o
nome example.

Dentre os outros critérios que podem ser usados com find, temos:

• -name: Pesquisa com base no nome fornecido;


• -iname: Pesquisa com base no nome, desconsiderando maiúsculas e minúsculas (ou
seja, o caso de teste myFile é semelhante a MYFILE);
• -not: Retorna os resultados que não correspondem ao caso de teste;
• -maxdepth N: Pesquisa no diretório atual, além dos subdiretórios até N níveis de
profundidade.

Localizando arquivos por hora de modificação


O comando find também permite filtrar uma hierarquia de diretórios com base em quando o
arquivo foi modificado:

Código 17.51: Aplicando filtos por momento de modificação

sudo find / -name "*.conf" -mtime 7


/etc/logrotate.conf

Este comando procura por todos os arquivos em todo o sistema de arquivos (o caminho inicial
é o diretório raiz, ou seja, /) que terminam com os caracteres .conf e que foram modificados
nos últimos sete dias. Este comando exige privilégios elevados para acessar diretórios na base
160 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

da estrutura de diretórios do sistema, daí o uso de sudo neste caso. O argumento passado
para mtime representa o número de dias desde a última modificação do arquivo.

Localizando arquivos por tamanho


O find também pode localizar arquivos por tamanho. Por exemplo, se quisermos encontrar
arquivos maiores que 2G em /var:

Código 17.52: Buscar por arquivos maiores de que 2 Gigabytes

sudo find /var -size +2G


/var/lib/libvirt/images/debian10.qcow2
/var/lib/libvirt/images/rhel8.qcow2

A opção -size exibe arquivos de tamanhos correspondentes ao argumento passado. Eis alguns
exemplos de argumentos:

• -size 100b: Arquivos com exatamente 100 bytes;


• -size +100k: Arquivos maiores que 100 kilobytes;
• -size -20M: Arquivos menores que 20 megabytes;
• -size +2G: Arquivos maiores que 2 gigabytes.

Para encontrar arquivos vazios, podemos usar: find . -size 0b ou find . -empty.

O que fazer com os resultados


Uma vez que a pesquisa é feita, é possível realizar uma ação no conjunto de resultados usando
-exec:

Código 17.53: Aplicar comando com os resultados da busca

find . -name "*.conf" -exec chmod 644 '{}' \;

Esse comando filtra todos os objetos no diretório atual (.) e abaixo dele para nomes de
arquivo terminando com .conf, e em seguida executa o comando chmod 644 para modificar
as permissões de arquivo nos resultados.

Por enquanto, não se preocupe com o significado de ‘{}’ ;, pois isso será discutido mais
adiante.
161 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Usando o grep para filtrar por arquivos com base no conteúdo


O comando grep é usado para buscar pela ocorrência de uma palavra-chave.

Considere uma situação na qual precisamos encontrar arquivos com base no conteúdo:

Código 17.54: Busca de arquivos por conteúdo

find . -type f -exec grep "lpi" '{}' \; -print


./.bash_history
Alpine/M
helping/M

Esse comando busca, na hierarquia de diretórios atual (.), por objetos que são arquivos (-type
f) e em seguida executa o comando grep “lpi” para cada arquivo que satisfaça as condições.
Os arquivos que atendem a essas condições são impressos na tela (-print). As chaves ({})
servem para reservar o espaço para os resultados encontrados por find. As {} são postas entre
aspas simples (’) para evitar passar arquivos com nomes contendo caracteres especiais para o
grep. O comando -exec é concluído com um ponto e vírgula (;), que deve ser escapado (;)
para não ser interpretado pelo shell.

A opção -delete, se colocada no final de uma expressão, excluiria todos os arquivos correspon-
dentes à descrição. Esta opção deve ser usada quando você tiver certeza de que os resultados
correspondem apenas aos arquivos que deseja excluir.

No exemplo abaixo, find localiza todos os arquivos na hierarquia começando no diretório atual
e, em seguida, exclui todos os arquivos que terminam com os caracteres .bak:

Código 17.55: Removendo arquivos a partir do resultado de uma busca

find . -name "*.bak" -delete

Empacotamento de arquivos
O comando tar (Arquivamento e compactação)

O comando tar, abreviação de “tape archive(r)”, é usado para criar arquivos tar, convertendo
um grupo de arquivos em um pacote. Os arquivos de pacote são úteis para mover ou fazer
backup de um grupo de arquivos facilmente. Pense no tar como uma ferramenta que cria uma
cola, na qual os arquivos podem ser grudados, agrupados e facilmente movidos.
162 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

O tar também tem a capacidade de extrair arquivos tar, exibir uma lista dos arquivos incluídos
no pacote e adicionar mais arquivos a um pacote existente.

A sintaxe do comando tar é a seguinte:

Código 17.56: Sintaxe base do comado tar

tar [OPERATION_AND_OPTIONS] [ARCHIVE_NAME] [FILE_NAME(S)]

• OPERATION: Somente um argumento de operação é permitido e exigido. As oper-


ações mais frequentemente usadas são:
–create (-c): Cria um novo arquivo tar;
–extract (-x): Extrai o pacote inteiro ou um ou mais arquivos de um pacote;
–list (-t): Exibe uma lista dos arquivos incluídos no pacote.
• OPTIONS: As opções usadas com mais frequência são:
–verbose (-v): Mostra os arquivos que estão sendo processados pelo comando tar;
–file=archive=name (-f archive-name): Especifica o nome de arquivo do pacote.
• ARCHIVE_NAME: O nome do arquivo de pacote;
• FILE_NAME(S): Uma lista separada por espaços com os nomes de arquivos a serem
extraídos. Se não estiver presente, o pacote inteiro é extraído.

Criando um arquivo de pacote


Digamos que temos um diretório chamado stuff no diretório atual e queremos salvá-lo em um
arquivo chamado archive.tar. Executaríamos para isso o seguinte comando:

Código 17.57: Um exemplo de empacotamento de arquivos

tar -cvf archive.tar stuff


stuff/
stuff/service.conf

Eis o que essas opções significam de fato:

• -c: Cria um arquivo de pacote;


• -v: Exibe o progresso no terminal enquanto o arquivo de pacote é criado. Também
chamado de modo “verboso”. O -v sempre é opcional nesses comandos, mas é útil;
• -f: Permite especificar o nome de arquivo do pacote.

Em geral, para arquivar um único diretório ou um único arquivo no Linux, usamos:


163 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Código 17.58: Sintaxe base para empacotamento de arquivo ou diretório

tar -cvf NAME-OF-ARCHIVE.tar /PATH/TO/DIRECTORY-OR-FILE

O tar funciona de maneira recursiva. Ele realiza a ação solicitada em todos os diretórios
subsequentes dentro do diretório especificado.

Para empacotar diversos diretórios de uma vez só, listamos todos eles delimitando-os por um
espaço na seção /PATH/TO/DIRECTORY-OR-FILE:

Código 17.59: Empacotando múltiplos arquivos

tar -cvf archive.tar stuff1 stuff2

Isso cria um arquivo de pacote com stuff1 e stuff2 em archive.tar

Extraindo um pacote
Podemos extrair um arquivo de pacote usando o tar:

Código 17.60: Um exemplo de desempacotamento de arquivos

tar -xvf archive.tar


stuff/
stuff/service.conf

Isso extrai o conteúdo de archive.tar para o diretório atual.

Este comando é igual ao comando de criação de pacotes usado acima, exceto porque a opção
-x substitui a opção -c.

Para extrair o conteúdo do pacote para um diretório específico, usamos -C:

Código 17.61: Modificando o destino dos arquivos extraídos

tar -xvf archive.tar -C /tmp


164 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Isso extrai o conteúdo de archive.tar para o diretório /tmp.

Código 17.62: Verificando o resultado do desempacotamento em outro diretório

ls /tmp
stuff

Compactando com o tar


O comando tar do GNU incluído nas distribuições Linux pode criar um arquivo .tar e, em
seguida, compactá-lo com a compactação gzip ou bzip2 em um único comando:

Código 17.63: Exemplo de compactação com o algoritmo gzip

tar -czvf name-of-archive.tar.gz stuff

Este comando criaria um arquivo compactado usando o algoritmo gzip (-z).

Embora a compressão gzip seja mais frequentemente usada para criar arquivos .tar.gz ou .tgz,
o tar também suporta a compressão bzip2. Isso permite a criação de arquivos compactados
bzip2, geralmente chamados de arquivos .tar.bz2, .tar.bz ou .tbz.

Para isso, substituímos -z, de gzip, por -j, de bzip2:

Código 17.64: Exemplo de compactação com o algoritmo bzip2

tar -cjvf name-of-archive.tar.bz stuff

Para descompactar o arquivo, substituímos -c por -x, onde x significa “extract”:

Código 17.65: Extrair arquivos compactados com o algoritmo bzip2

tar -xzvf archive.tar.gz

O gzip é mais rápido, mas geralmente compacta um pouco menos, de modo que o arquivo
obtido é um pouco maior. O bzip2 é mais lento, mas comprime um pouco mais, então o
arquivo fica um pouco menor. Em geral, porém, gzip e bzip2 são praticamente a mesma coisa;
ambos funcionam de forma semelhante.
165 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Outra alternativa seria, aplicar a compressão gzip ou bzip2 usando o comando gzip para as
compressões gzip e bzip para as compressões bzip. Por exemplo, para aplicar a compactação
gzip, use:

Código 17.66: Sintaxe base do gzip

gzip FILE-TO-COMPRESS

• gzip: Cria o arquivo compactado com o mesmo nome, mas com a terminação .gz;
• gzip: Remove os arquivos originais após criar o arquivo compactado.

O comando bzip2 funciona de maneira semelhante.

Para descompactar os arquivos usamos gunzip ou bunzip2, dependendo do algoritmo usado


para compactá-los.

O comando cpio
A expressão cpio significa “copy in, copy out”. É usado para processar arquivo de pacote como
os arquivos .cpio ou .tar.

O cpio executa as seguintes operações:

• Copiar arquivos para um pacote;


• Extrair arquivos de um pacote.

Ele usa a lista de arquivos da entrada padrão (principalmente a saída de ls).

Para criar um arquivo cpio, usamos:

Código 17.67: Exemplo de uso do cpio

ls | cpio -o > archive.cpio

A opção -o instrui o cpio a criar uma saída. Neste caso, o arquivo de saída criado é archive.cpio.
O comando ls lista o conteúdo do diretório atual que será empacotado.

Para extrair o arquivo de pacote, usamos:

Código 17.68: Extraindo arquivos com cpio


166 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

cpio -id < archive.cpio

A opção -i é usada para realizar a extração. A opção -d cria a pasta de destino. O caractere
< representa a entrada padrão. O arquivo de entrada a ser extraído é archive.cpio.

O comando dd
O dd copia dados de um local para outro. A sintaxe de linha de comando de dd difere de
muitos outros programas Unix, pois ele usa a sintaxe option = value para as opções de linha
de comando ao invés dos formatos padrão GNU -option value ou –option=value:

Código 17.69: Exemplo de uso do comando DD

dd if=oldfile of=newfile

Este comando copia o conteúdo de oldfile para newfile, onde if= é o arquivo de entrada e of=
refere-se ao arquivo de saída.

O comando dd normalmente não exibe nada na tela até que o comando seja concluído. Ao
fornecer a opção status=progress, o console exibe o andamento do trabalho realizado pelo
comando. Por exemplo: dd status=progress if=oldfile of=newfile.

O dd também é usado para alterar dados para maiúsculas/minúsculas ou para escrever dire-
tamente em dispositivos de bloco como /dev/sdb:

Código 17.70: Copiando e modificando arquivos com dd

$ dd if=oldfile of=newfile conv=ucase

Esse comando copiaria todo o conteúdo de oldfile para newfile e colocaria todo o texto em
maiúsculas.

O comando a seguir faria backup do disco rígido inteiro localizado em /dev/sda para um
arquivo de nome backup.dd:

Código 17.71: Utilizando o dd para realizar backup

$ dd if=/dev/sda of=backup.dd bs=4096


167 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Resumo
Nesta lição, exploramos como visualizar o que está dentro de um diretório com o comando
ls, como copiar (cp) arquivos e pastas e como movê-los (mv). Também vimos como novos
diretórios podem ser criados com o comando mkdir. Os comandos para remover arquivos (rm)
e pastas (rmdir) também foram abordados.

Nesta lição, você também aprendeu sobre o globbing de arquivos e caracteres curinga. O glob-
bing de arquivo é usado para representar vários nomes de arquivo usando caracteres especiais
chamados curingas. Estes são os caracteres curinga básicos e seus significados:

• ? (interrogação): Representa uma única ocorrência de qualquer caractere;


• [ ] (caracteres entre colchetes): Representa qualquer ocorrência do(s) caractere(s)
inseridos nos colchetes;
• * (asterisco): Representa zero, uma ou mais ocorrências de qualquer caractere.

Podemos incluir qualquer combinação desses caracteres curinga na mesma instrução:

• Como encontrar arquivos com find;


• Como adicionar critérios de busca com base em hora, tipo de arquivo e tamanho
fornecendo argumentos ao find;
• O que fazer com os resultados;
• Como arquivar, compactar e descompactar arquivos usando tar;
• Processamento de arquivos de pacote com cpio;
• Cópia de arquivos com dd.
168 17. 103.3: Gerenciamento_básico_de_arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Talvez isso possa te ajudar. . .

Fig. 17.1: FIND CHEAT SHEETS

• Fonte: - https://wall-skills.com/2015/the-find-command-in-examples/
Fabio Gonçalves De Melo Santana / [email protected]

18
103.4 Usando fluxos, pipes e
redirecionamentos

Introdução
Todos os programas de computador seguem o mesmo princípio geral: os dados recebidos de
alguma fonte são transformados para gerar um resultado inteligível. No contexto do shell do
Linux, a fonte de dados pode ser um arquivo local, um arquivo remoto, um dispositivo (como
um teclado), etc. A saída do programa geralmente é exibida em uma tela, mas também
é comum armazenar os dados de saída em um sistema de arquivos local, enviar para um
dispositivo remoto, reproduzi-lo em alto-falantes de áudio etc.

Os processos padrão do Linux têm três canais de comunicação abertos por padrão: o canal
de entrada padrão (na maioria das vezes simplesmente chamado de stdin), o canal de saída
padrão (stdout) e o canal de erro padrão (stderr). Os descritores numéricos de arquivo
atribuídos a esses canais são 0 para stdin, 1 para stdout e 2 para stderr. Os canais de
comunicação também são acessíveis por meio dos dispositivos especiais /dev/stdin, /de-
v/stdout e /dev/stderr.

Esses três canais de comunicação permitem que os programadores escrevam códigos que leem
e gravam dados sem se preocupar com o tipo de mídia de onde vêm ou para o qual vão. Por
exemplo, se um programa precisa de um conjunto de dados como entrada, pode simplesmente
solicitar os dados da entrada padrão; será fornecido aquilo que estiver sendo usado como
entrada padrão. Da mesma forma, o método mais simples que um programa pode usar para

169
170 18. 103.4 Usando fluxos, pipes e redirecionamentos
Fabio Gonçalves De Melo Santana / [email protected]

exibir sua saída é escrevê-la na saída padrão. Em uma sessão comum do shell, o teclado é
definido como stdin e a tela do monitor como stdout e stderr.

O shell Bash tem a capacidade de reatribuir os canais de comunicação ao carregar um pro-


grama. Ele permite, por exemplo, substituir a tela como a saída padrão e usar um arquivo no
sistema de arquivos local como stdout.

Redirecionamentos
Um redirecionamento é definido por um caractere especial na linha de comando. Por exemplo,
para redirecionar a saída padrão de um processo para um arquivo, o símbolo de maior que >
é posicionado no final do comando e seguido pelo caminho até o arquivo que receberá a saída
redirecionada:

root@debian10:/home/debian# cat /proc/cpuinfo > /tmp/cpu.txt

Por padrão, apenas o conteúdo que chega a stdout é redirecionado. Isso ocorre porque o valor
numérico do descritor de arquivo deve ser especificado logo antes do símbolo de maior que, e
quando não especificado, o Bash redireciona a saída padrão. Portanto, usar > é equivalente
a usar 1> (o valor do descritor de arquivo de stdout é 1).

Para capturar o conteúdo de stderr, o redirecionamento 2> deve ser usado. A maioria dos
programas de linha de comando enviam informações de depuração e mensagens de erro para o
canal de erro padrão. É possível, por exemplo, capturar a mensagem de erro gerada por uma
tentativa de leitura de um arquivo inexistente:

root@debian10:/home/debian# cat /proc/cpu_info 2> /tmp/error.txt


root@debian10:/home/debian# cat /tmp/error.txt
cat: /proc/cpu_info: No such file or directory

Tanto stdout quanto stderr são redirecionados para o mesmo destino com &> ou >&.
É importante não colocar nenhum espaço ao lado do “e” comercial, caso contrário o Bash
o interpretará como uma instrução para executar o processo em segundo plano e não para
executar o redirecionamento.

O destino deve ser um caminho para um arquivo gravável, como /tmp/cpu.txt, ou um descritor
de arquivo gravável. O destino de um descritor de arquivo é representado por um “e” comercial
seguido pelo valor numérico do descritor de arquivo. Por exemplo, 1>&2 redireciona stdout
para stderr. Para fazer o oposto, stderr para stdout, devemos usar 2>&1.
171 18. 103.4 Usando fluxos, pipes e redirecionamentos
Fabio Gonçalves De Melo Santana / [email protected]

Embora não seja muito útil, visto que existe uma maneira mais curta de executar a mesma
tarefa, é possível redirecionar stderr para stdout e, em seguida, redirecioná-lo para um arquivo.
Por exemplo, um redirecionamento para gravar stderr e stdout em um arquivo chamado
log.txt pode ser escrito como >log.txt 2>&1. No entanto, o principal motivo para redire-
cionar stderr para stdout é permitir a análise de mensagens de depuração e erro. É possível
redirecionar a saída padrão de um programa para a entrada padrão de outro programa, mas não
é possível redirecionar diretamente o erro padrão para a entrada padrão de outro programa.
Assim, as mensagens do programa enviadas para stderr primeiro precisam ser redirecionadas
para stdout a fim de serem lidas pelo stdin de outro programa.

Para simplesmente descartar a saída de um comando, seu conteúdo pode ser redirecionado
para o arquivo especial /dev/null. Por exemplo, >log.txt 2>/dev/null salva o conteúdo de
stdout no arquivo log.txt e descarta o stderr. O arquivo /dev/null pode ser escrito por
qualquer usuário, mas nenhum dado pode ser recuperado dele, pois não é armazenado em
lugar nenhum.

Uma mensagem de erro é apresentada se o destino especificado não for gravável (se o caminho
apontar para um diretório ou um arquivo somente leitura) e nenhuma modificação for feita no
destino. No entanto, um redirecionamento de saída sobrescreve um destino gravável existente
sem pedir nenhuma confirmação. Os arquivos são substituídos pelos redirecionamentos de
saída, a menos que a opção noclobber esteja habilitada no Bash, o que pode ser feito para
a sessão atual com o comando set -o noclobber ou set -C:

root@debian10:/home/debian# set -o noclobber


root@debian10:/home/debian# cat /proc/cpu_info 2> /tmp/error.txt
bash: /tmp/error.txt: cannot overwrite existing file

Para remover a opção noclobber da sessão atual, execute set +o noclobber ou set +C. Para
tornar a opção noclobber persistente, ela deve ser incluída no perfil Bash do usuário ou no
perfil de todo o sistema.

Mesmo com a opção noclobber habilitada, é possível anexar dados redirecionados ao conteúdo
existente. Usamos para isso um redirecionamento escrito com dois símbolos de maior que, »:

root@debian10:/home/debian# cat /proc/cpu_info 2>> /tmp/error.txt


root@debian10:/home/debian# cat /tmp/error.txt
cat: /proc/cpu_info: No such file or directory
cat: /proc/cpu_info: No such file or directory

No exemplo anterior, a nova mensagem de erro foi anexada à existente no arquivo /tmp/er-
172 18. 103.4 Usando fluxos, pipes e redirecionamentos
Fabio Gonçalves De Melo Santana / [email protected]

ror.txt. Se o arquivo ainda não existir, ele será criado com os novos dados.

A fonte de dados da entrada padrão de um processo também pode ser reatribuída. O símbolo
de menor que < é usado para redirecionar o conteúdo de um arquivo para o stdin de um
processo. Nesse caso, os dados fluem da direita para a esquerda: o descritor reatribuído é
considerado como sendo 0 à esquerda do símbolo de menor que, e a fonte de dados (um
caminho para um arquivo) deve estar à direita do símbolo de menor que. O comando uniq,
como a maioria dos utilitários de linha de comando para processamento de texto, aceita os
dados enviados para stdin por padrão:

root@debian10:/home/debian# uniq -c </tmp/error.txt


2 cat: /proc/cpu_info: No such file or directory

A opção -c faz com que o uniq exiba quantas vezes uma linha repetida aparece no texto.
Como o valor numérico do descritor de arquivo redirecionado foi suprimido, o comando de
exemplo é equivalente a uniq -c 0 < /tmp/error.txt.

Here Document e Here String


Outra forma de redirecionar a entrada envolve os métodos Here document e Here string. O
redirecionamento Here document permite digitar um texto de várias linhas que será usado
como o conteúdo redirecionado. Dois símbolos de menor que « indicam um redirecionamento
de Here document:

root@debian10:/home/debian# wc -c <<EOF
> Sao quantos caracteres
> dentro deste documento
> EOF
46

À direita dos dois símbolos de menor que « está o termo de fim EOF. O modo de inserção
termina assim que for inserida uma linha contendo apenas o termo de fim. Qualquer outro
termo pode ser usado como termo de fim, mas é importante não colocar caracteres em branco
entre o símbolo de menor que e o termo de fim. No exemplo acima, as duas linhas de texto
foram enviadas para o stdin do comando wc -c, que exibe a contagem de caracteres. Assim
como acontece com os redirecionamentos de entrada para arquivos, o stdin (descritor de
arquivo 0) é pressuposto se o descritor de arquivo redirecionado for suprimido.

O método de Here string é muito parecido com o método de Here document, mas para
uma linha apenas:
173 18. 103.4 Usando fluxos, pipes e redirecionamentos
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# wc -c <<<"Sao quantos caracteres dentro desta string"


43

Pipes
Ao contrário dos redirecionamentos, com os pipes os dados fluem da esquerda para a direita
na linha de comando e o destino é outro processo, não um caminho do sistema de arquivos,
descritor de arquivo ou Here document. O caractere de barra vertical | manda o shell
iniciar todos os comandos distintos ao mesmo tempo e conectar a saída do comando anterior
à entrada do comando seguinte, da esquerda para a direita. Por exemplo, em vez de usar
redirecionamentos, o conteúdo do arquivo /proc/cpuinfo enviado para a saída padrão por
cat pode ser canalizado para o stdin de wc com o seguinte comando:

root@debian10:/home/debian# cat /proc/cpuinfo | wc


52 322 1826

Na ausência do caminho para um arquivo, wc conta o número de linhas, palavras e caracteres


que recebe em seu stdin, como é o caso no exemplo. Muitos pipes podem estar presentes em
um comando composto. No exemplo a seguir, dois pipes são usados:

root@debian10:/home/debian# cat /proc/cpuinfo | grep 'model name' | uniq


model name : Intel(R) Core(TM) i7-4710HQ CPU @ 2.50GHz

O conteúdo do arquivo /proc/cpuinfo produzido por cat /proc/cpuinfo foi canalizado para o
comando grep ‘model name’, que em seguida seleciona apenas as linhas contendo o termo
model name. A máquina que executa o exemplo tem muitas CPUs, portanto existem lin-
has repetidas com model name. O último pipe conecta grep ‘model name’ ao uniq, que é
responsável por pular qualquer linha idêntica à anterior.

Os pipes podem ser combinados com redirecionamentos na mesma linha de comando. O


exemplo anterior pode ser reescrito em uma forma mais simples:

root@debian10:/home/debian# grep 'model name' </proc/cpuinfo | uniq


model name : Intel(R) Core(TM) i7-4710HQ CPU @ 2.50GHz

O redirecionamento de entrada para grep não é estritamente necessário, pois grep aceita um
174 18. 103.4 Usando fluxos, pipes e redirecionamentos
Fabio Gonçalves De Melo Santana / [email protected]

caminho de arquivo como argumento, mas o exemplo demonstra como construir comandos
combinados.

Pipes e redirecionamentos são exclusivos, ou seja, uma origem pode ser mapeada para apenas
um destino. Ainda assim, é possível redirecionar uma saída para um arquivo e ainda vê-la na
tela com o programa tee. Para isso, o primeiro programa envia sua saída para o stdin de tee
e um nome de arquivo é fornecido a este último para armazenar os dados:

root@debian10:/home/debian# grep 'model name' </proc/cpuinfo | uniq | tee cpu_model.txt


model name : Intel(R) Core(TM) i7-4710HQ CPU @ 2.50GHz
root@debian10:/home/debian# cat cpu_model.txt
model name : Intel(R) Core(TM) i7-4710HQ CPU @ 2.50GHz

A saída do último programa na cadeia, gerada por uniq, é exibida e armazenada no arquivo
cpu_model.txt. Para não sobrescrever o conteúdo do arquivo fornecido, e sim anexar dados a
ele, a opção -a deve ser fornecida para tee.

Apenas a saída padrão de um processo é capturada por um pipe. Digamos que você precise
passar por um longo processo de compilação na tela e, ao mesmo tempo, salvar tanto a
saída padrão quanto o erro padrão em um arquivo para inspeção posterior. Supondo que seu
diretório atual não tenha um Makefile, o seguinte comando gerará um erro:

root@debian10:/home/debian# make | tee log.txt


make: *** No targets specified and no makefile found. Stop.

Embora exibida na tela, a mensagem de erro gerada por make não foi capturada por tee e o
arquivo log.txt foi criado vazio. É preciso fazer um redirecionamento antes que um pipe possa
capturar o stderr:

root@debian10:/home/debian# make 2>&1 | tee log.txt


make: *** No targets specified and no makefile found. Stop.
root@debian10:/home/debian# cat log.txt
make: *** No targets specified and no makefile found. Stop.

Neste exemplo, o stderr de make foi redirecionado para o stdout, de forma que o tee foi
capaz de capturá-lo com um pipe, exibi-lo na tela e salvá-lo no arquivo log.txt. Em casos
como esse, pode ser útil salvar as mensagens de erro para inspeção posterior.
175 18. 103.4 Usando fluxos, pipes e redirecionamentos
Fabio Gonçalves De Melo Santana / [email protected]

Substituição de comando
Outro método para capturar a saída de um comando é a substituição de comando. Ao colocar
um comando entre crases, o Bash o substitui por sua saída padrão. O exemplo a seguir mostra
como usar o stdout de um programa como argumento para outro programa:

root@debian10:/home/debian/4linux# mkdir `date +%Y-%m-%d`


root@debian10:/home/debian/4linux# ls
2021-07-01

A saída do programa date, a data atual formatada como ano-mês-dia, foi usada como um
argumento para criar um diretório com o mkdir. Um resultado idêntico é obtido usando $()
em vez de crases:

root@debian10:/home/debian/4linux# rmdir 2021-07-01/


root@debian10:/home/debian/4linux# mkdir $(date +%Y-%m-%d)
root@debian10:/home/debian/4linux# ls
2021-07-01

O mesmo método pode ser usado para armazenar a saída de um comando como uma variável:

root@debian10:/home/debian/4linux# OS=`uname -o`


root@debian10:/home/debian/4linux# echo $OS
GNU/Linux

O comando uname -o retorna o nome genérico do sistema operacional atual, que foi ar-
mazenado na variável de sessão OS. Atribuir a saída de um comando a uma variável é muito
útil em scripts, possibilitando armazenar e avaliar os dados de várias maneiras distintas.

Dependendo da saída gerada pelo comando substituído, a substituição do comando interno do


shell pode não ser apropriada. Um método mais sofisticado para usar a saída de um programa
como argumento de outro programa emprega um intermediário chamado xargs. O programa
xargs usa o conteúdo que recebe via stdin para executar um determinado comando com o
conteúdo como argumento.

root@debian10:/home/debian/4linux# find . -name '*avi' -print0 -o -name '*mp4' -print0 -o -


name '*mkv' -print0 | xargs -0 du | sort -n
4 ./2021-07-01
8 .
176 18. 103.4 Usando fluxos, pipes e redirecionamentos
Fabio Gonçalves De Melo Santana / [email protected]

A opção -0 diz ao xargs que o caractere nulo deve ser usado como separador. Dessa forma, os
caminhos de arquivo fornecidos pelo find são analisados corretamente, mesmo se contiverem
espaços em branco ou outros caracteres especiais. O exemplo anterior mostra como usar o
comando du para descobrir o uso de espaço em disco por cada arquivo encontrado, e em
seguida classificar os resultados por tamanho. A saída foi suprimida para fins de concisão.
Observe que para cada critério de pesquisa é necessário incluir a opção -print0 para find.

Por padrão, o xargs coloca por último os argumentos do comando executado. Para mudar
esse comportamento, usamos a opção -I:

root@debian10:/home/debian/4linux# find . -mindepth 2 -name '*avi' -print0 -o -name '*mp4'


-print0 -o -name '*mkv' -print0 | xargs -0 -I PATH mv PATH ./

No último exemplo, todo arquivo encontrado por find é movido para o diretório atual. Como
o(s) caminho(s) de origem devem ser informados para o mv antes do caminho de destino,
um termo de substituição é dado à opção -I do xargs, que é então apropriadamente colocado
junto a mv. Ao usar o caractere nulo como separador, não é necessário colocar o termo de
substituição entre aspas.
Fabio Gonçalves De Melo Santana / [email protected]

19
Resumo
Esta lição cobre métodos para executar um programa redirecionando seus canais de comuni-
cação padrão. Os processos do Linux usam esses canais padrão como descritores de arquivo
genéricos para ler e gravar dados, tornando possível transferi-los arbitrariamente para arquivos
ou dispositivos. A lição demonstra as seguintes etapas:

• O que são descritores de arquivos e qual seu papel no Linux;


• Os canais de comunicação padrão em todos os processos: stdin, stdout e stderr;
• Como executar corretamente um comando usando redirecionamento de dados, tanto na
entrada quanto na saída;
• Como usar Here Documents e Here Strings nos redirecionamentos de entrada;
• Como pipes podem ser usados para transmitir a saída de um processo para a entrada
de outro processo;
• A finalidade dos comandos tee e xargs;
• Como capturar a saída de um processo com a substituição de comando, armazenando-a
em uma variável ou usando-a diretamente como parâmetro para outro comando.

Os comandos e procedimentos abordados foram:

• Operadores de redirecionamento: >, <, », «, «<;


• Comandos cat, set, uniq e wc;
• Canalização de comandos com |;
• Substituição de comandos com crases e $();
• Os comandos tee, xargs e find.

177
178 19. Resumo
Fabio Gonçalves De Melo Santana / [email protected]

Talvez isso possa te ajudar. . .

-
Fonte: - https://stackoverflow.com/questions/3385201/confused-about-stdin-stdout-and-stderr

- Fonte: - https://linuxhint.com/redirect-stderr-stdout-bash/
179 19. Resumo
Fabio Gonçalves De Melo Santana / [email protected]

- Fonte: - https://kb.no-
vaordis.com/index.php/Linux_General_Concepts

- Fonte: - https://neilkakkar.com/unix.html
19. Resumo

- Fonte: - https://neilkakkar.com/unix.html
180
Fabio Gonçalves De Melo Santana / [email protected]
Fabio Gonçalves De Melo Santana / [email protected]

20
103.5: Criar, monitorar e eliminar
processos

Introdução
Sempre que rodamos um comando, um ou mais processos são startados. Um SysAdmin
experiente não só precisa criar processos, mas também ser capaz de controlá-los e enviar
diferentes tipos de sinais a eles, se e quando necessário.

Controle de jobs
Jobs são processos iniciados de forma interativa através de um terminal, enviados para o
segundo plano e ainda não finalizados. Para descobrir mais sobre os jobs ativos (e seus status)
em seu sistema Linux, execute o comando jobs:

root@debian10:/home/debian/4linux# jobs

O comando jobs acima não produziu nenhuma saída, o que significa que não há jobs ativos
no momento. Vamos criar nosso primeiro job executando um comando que leva algum tempo
para terminar de ser executado (o comando sleep com um parâmetro de 60) e pressionamos
Ctrl+Z:

181
182 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian/4linux# sleep 60
^Z
[1]+ Stopped sleep 60

A execução do comando foi interrompida (ou, mais exatamente, suspensa) e o prompt de


comando está disponível novamente. Se você procurar por jobs uma segunda vez, encontrará
aquele que foi suspenso:

root@debian10:/home/debian/4linux# jobs
[1]+ Stopped sleep 60

Vamos entender melhor essa saída:

• [1]: Este número é o identificador do trabalho e pode ser usado –precedido por um
símbolo de porcentagem (%)—para alterar o status do job com os utilitários fg, bg e
kill (como ensinaremos mais tarde);
• +: O sinal de mais indica o job atual por padrão (ou seja, o último a ser suspenso ou
mandado ao segundo plano). O job anterior é sinalizado com um sinal de menos (-).
Quaisquer outros jobs anteriores não são sinalizados;
• Stopped: Descrição do status do job;
• sleep 60: O comando ou job em si.

Com a opção -l, o comando jobs exibe adicionalmente o identificador do processo (PID) logo
antes do status:

root@debian10:/home/debian/4linux# jobs -l
[1]+ 1428 Stopped sleep 60

As demais opções possíveis para jobs são:

• -n: Lista apenas os processos que mudaram de status desde a última notificação. Os
possíveis status incluem Running, Stopped, Terminated ou Done;
• -p: Lista os IDs do processo;
• -r: Lista apenas os jobs em execução;
• -s: Lista apenas os jobs interrompidos (ou suspensos).

Lembre-se, um job tem um ID de trabalho e um ID de processo (PID).


183 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]

Especificação do trabalho
O comando jobs, a exemplo de outros utilitários como fg, bg e kill (que você verá na próxima
seção), precisa de uma especificação de trabalho (ou jobspec) para agir sobre um job particular.
Como acabamos de ver, este pode ser—e normalmente é—o ID do trabalho precedido por %.
No entanto, outras especificações de trabalho também são possíveis. Vamos dar uma olhada
nelas:

• %n: Job cujo número de ID é n:

root@debian10:/home/debian/4linux# jobs %1
[1]+ Stopped sleep 60

• %str: Job cuja linha de comando começa com str:

root@debian10:/home/debian/4linux# jobs %sl


[1]+ Stopped sleep 60

• %?str: Job cuja linha de comando contém str:

root@debian10:/home/debian/4linux# jobs %?le


[1]+ Stopped sleep 60

• %+ ou %%: Job atual (o que foi iniciado por último em segundo plano ou suspenso
do primeiro plano):

root@debian10:/home/debian/4linux# jobs %+
[1]+ Stopped sleep 60

• %-: Job anterior (aquele que era %+ antes do padrão, que é o atual):

root@debian10:/home/debian/4linux# jobs %-
[1]+ Stopped sleep 60

No nosso caso, como há apenas um job, ele é o atual e o anterior.


184 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]

Status do trabalho: suspensão, primeiro plano e segundo plano


Uma vez que um job está em segundo plano ou foi suspenso, podemos fazer três coisas com
ele:

1. Levá-lo ao primeiro plano com fg:

root@debian10:/home/debian/4linux# fg %1
sleep 60

fg move o job especificado para o primeiro plano e o torna o job atual. A seguir podemos
esperar que ele seja concluído, interrompê-lo novamente com Ctrl+Z ou encerrá-lo com
Ctrl+C.

2. Colocá-lo em segundo plano com bg:

root@debian10:/home/debian/4linux# bg %1
[1]+ sleep 60 &

Uma vez no segundo plano, o trabalho pode ser trazido de volta ao primeiro plano com fg ou
eliminado (veja abaixo). Observe o e comercial (&) indicando que o trabalho foi enviado para
o segundo plano. Na verdade, também podemos usar o e comercial para iniciar um processo
diretamente em segundo plano:

root@debian10:/home/debian/4linux# sleep 100 &


[2] 1487
[1] Done sleep 60

Junto com o ID do novo trabalho ([2]), também obtemos o ID do processo (1487). Agora,
ambos os trabalhos estão rodando em segundo plano:

root@debian10:/home/debian/4linux# jobs
[1]- Running sleep 60 &
[2]+ Running sleep 100 &

Um pouco mais tarde, o primeiro trabalho termina de ser executado:


185 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian/4linux# jobs
[1]- Done sleep 60
[2]+ Running sleep 100 &

3. Encerrá-lo através de um sinal SIGTERM com kill:

root@debian10:/home/debian/4linux# kill %2

Para ter certeza de que o job foi encerrado, rode jobs novamente:

root@debian10:/home/debian/4linux# jobs
[2]+ Terminated sleep 100

Se nenhum trabalho for especificado, fg e bg agirão sobre o job padrão atual. kill, no
entanto, sempre precisa de uma especificação de trabalho.

Trabalhos desvinculados: nohup


Os jobs que vimos nas seções anteriores estavam todos vinculados à sessão do usuário que os
invocou. Isso significa que, se a sessão for encerrada, os jobs serão perdidos. No entanto, é
possível desvincular jobs de sessões e executá-los mesmo após o encerramento da sessão. Isso
é feito com o comando nohup (“no hangup”). A sintaxe é a seguinte:

nohup COMMAND &

Lembre-se, o & envia o processo para o segundo plano e libera o terminal em que estamos
trabalhando.

Vamos desvincular o job em segundo plano ping localhost da sessão atual:

root@debian10:/home/debian/4linux# nohup ping localhost &


[1] 1491
root@debian10:/home/debian/4linux# nohup: ignoring input and appending output to 'nohup.out
'
^C
186 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]

A saída mostra o ID do trabalho ([1]) e o PID (1491), seguido por uma mensagem nos
informando sobre o arquivo nohup.out. Este é o arquivo padrão no qual stdout e stderr serão
salvos. Agora podemos pressionar Ctrl+C para liberar o prompt de comando, fechar a sessão,
iniciar outra como root e usar tail -f para verificar se o comando está rodando e a saída está
sendo escrita no arquivo padrão:

root@debian10:/home/debian/4linux# exit
root@debian10:/home/debian/4linux# tail -f /home/debian/4linux/nohup.out64 bytes from
localhost (::1): icmp_seq=167 ttl=64 time=0.083 ms
64 bytes from localhost (::1): icmp_seq=168 ttl=64 time=0.035 ms
64 bytes from localhost (::1): icmp_seq=169 ttl=64 time=0.084 ms
64 bytes from localhost (::1): icmp_seq=170 ttl=64 time=0.078 ms
64 bytes from localhost (::1): icmp_seq=171 ttl=64 time=0.080 ms
64 bytes from localhost (::1): icmp_seq=172 ttl=64 time=0.079 ms
64 bytes from localhost (::1): icmp_seq=173 ttl=64 time=0.078 ms
64 bytes from localhost (::1): icmp_seq=174 ttl=64 time=0.078 ms
64 bytes from localhost (::1): icmp_seq=175 ttl=64 time=0.082 ms
64 bytes from localhost (::1): icmp_seq=176 ttl=64 time=0.081 ms

Se quisermos encerrar o processo, devemos especificar seu PID:

root@debian10:/home/debian/4linux# kill 1491

Monitoramento de processos
O comando watch executa um programa periodicamente (por padrão, a cada 2 segundos)
e nos permite observar a mudança da saída do programa ao longo do tempo. Por exemplo,
podemos monitorar como a média de trabalho muda conforme mais processos são executados
digitando watch uptime:

Every 2.0s: uptime

debian10.linuxvmimages.local: Thu Jul 1 17:43:18 2021

17:43:18 up 5:27, 1 user, load average: 0.00, 0.00, 0.00

Da mesma forma, você pode verificar o uso de memória à medida que novos processos são
criados com watch free:

Every 2.0s: free

debian10.linuxvmimages.local: Thu Jul 1 17:43:48 2021


187 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]

total used free shared buff/cache available


Mem: 486588 285272 9444 1060 191872 188000
Swap: 999420 54784 944636

Para alterar o intervalo de atualização de watch, use as opções -n ou –interval, mais o


número de segundos, como em:

root@debian10:/home/debian/4linux# watch -n 5 free

Every 5.0s: free

debian10.linuxvmimages.local: Thu Jul 1 17:44:13 2021

total used free shared buff/cache available


Mem: 486588 285032 9676 1060 191880 188240
Swap: 999420 54784 944636

Agora o comando free será executado a cada 5 segundos.

Enviando sinais para processos: kill


Cada processo possui um identificador de processo ou PID exclusivo. Uma maneira de descobrir
o PID de um processo é usar o comando pgrep seguido pelo nome do processo:

root@debian10:/home/debian/4linux# pgrep sleep


1635

O identificador de um processo também pode ser descoberto com o comando pidof


(p.ex. pidof sleep).

Como no caso do pgrep, o comando pkill elimina um processo com base em seu nome:

root@debian10:/home/debian/4linux# pkill sleep


[1]+ Terminated sleep 100

Para eliminar várias instâncias do mesmo processo, o comando killall pode ser usado:
188 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian/4linux# sleep 60 &


[1] 1641
root@debian10:/home/debian/4linux# sleep 70 &
[2] 1642
root@debian10:/home/debian/4linux# killall sleep
[2]+ Terminated sleep 70
[1]+ Terminated sleep 60

Tanto pkill quanto killall funcionam da mesma maneira que kill, ou seja, enviam um sinal de
encerramento para o(s) processo(s) especificado(s). Se nenhum sinal for fornecido, o padrão
SIGTERM é enviado. No entanto, kill só aceita um ID de trabalho ou de processo como
argumento.

Os sinais podem ser especificados por:

• Nome:

kill -SIGHUP 1247

• Numero:

kill -1 1247

• Opcao: kill -s SIGHUP 1247

Para fazer com que kill funcione de forma semelhante a pkill ou killall (evitando os comandos
para descobrir os PIDs correspondentes), podemos usar a substituição de comandos:

$ kill -1 $(pgrep sleep)

Como você já deve saber, uma sintaxe alternativa é kill -1 pgrep sleep.

Para uma lista exaustiva de todos os sinais de kill e seus códigos, digite kill -l no
terminal. Use -KILL (-9 ou -s KILL) para eliminar processos rebeldes quando todos
os outros sinais falharem.
189 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]

top e ps
Quando se trata de monitoramento de processos, duas ferramentas inestimáveis são top e
ps. Enquanto o primeiro produz resultados de maneira dinâmica, o último o faz de maneira
estática. Em todos os casos, ambos são excelentes utilitários para se ter uma visão abrangente
de todos os processos do sistema.

Interação com top

Para chamar o top, basta digitar top:

top - 17:51:39 up 5:36, 1 user, load average: 0.00, 0.00, 0.00


Tasks: 128 total, 1 running, 127 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.2 sy, 0.0 ni, 99.5 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 475.2 total, 8.5 free, 278.1 used, 188.6 buff/cache
MiB Swap: 976.0 total, 922.5 free, 53.5 used. 184.0 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND


1645 root 20 0 11136 3660 3076 R 1.0 0.8 0:00.16 top
1 root 20 0 169752 5332 3860 S 0.0 1.1 0:03.35 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kblockd
8 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
9 root 20 0 0 0 0 S 0.0 0.0 0:00.03 ksoftirqd/0
10 root 20 0 0 0 0 I 0.0 0.0 0:09.50 rcu_sched
11 root 20 0 0 0 0 I 0.0 0.0 0:00.00 rcu_bh
12 root rt 0 0 0 0 S 0.0 0.0 0:00.26 migration/0
14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1
16 root rt 0 0 0 0 S 0.0 0.0 0:00.97 migration/1
17 root 20 0 0 0 0 S 0.0 0.0 0:00.44 ksoftirqd/1
19 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/1:0H
20 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
21 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns
22 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kauditd
23 root 20 0 0 0 0 S 0.0 0.0 0:00.02 khungtaskd
24 root 20 0 0 0 0 S 0.0 0.0 0:00.00 oom_reaper
25 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 writeback
26 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kcompactd0
27 root 25 5 0 0 0 S 0.0 0.0 0:00.00 ksmd
28 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 crypto
29 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kintegrityd
30 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kblockd
31 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 edac-poller
32 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 devfreq_wq
33 root rt 0 0 0 0 S 0.0 0.0 0:00.00 watchdogd

O top permite uma certa interação do usuário. Por padrão, a saída é classificada pela porcent-
agem de tempo da CPU usada por cada processo em ordem decrescente. Esse comportamento
pode ser modificado pressionando as seguintes teclas de dentro do top:
190 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]

• M: Classificar por uso da memória;


• N: Classificar pelo número ID do processo;
• T: Classificar por tempo de execução;
• P: Classificar por porcentagem de uso da CPU.

Para alternar entre a ordem crescente/decrescente, basta pressionar R.

Outras teclas interessantes para interagir com top são:

• ? ou h: Ajuda;
• k: Elimina um processo. O top pedirá o PID do processo a encerrar, assim como o sinal
a ser enviado (por padrão, SIGTERM ou 15);
• r: Altera a prioridade de um processo (renice). top pede o valor de nice. Os valores
possíveis variam de -20 a 19, mas apenas o superusuário (root) pode definir um valor
negativo ou inferior ao atual;
• u: Lista os processos de um determinado usuário (por padrão, são mostrados os pro-
cessos de todos os usuários);
• c: Mostra os caminhos absolutos dos programas e diferencia os processos do espaço do
usuário dos processos do espaço do kernel (entre colchetes);
• V: Visão de floresta/hierárquica dos processos;
• t e m: Mudam a aparência das leituras da CPU e da memória, respectivamente, em um
ciclo de quatro estágios: os dois primeiros pressionamentos mostram barras de progresso,
o terceiro oculta a barra e o quarto a traz de volta;
• W: Salva as definições de configuração em ~/.toprc.

Uma versão mais sofisticada e amigável de top é htop. Outra alternativa, talvez
mais exaustiva, é atop. Se ainda não estiverem instalados em seu sistema, use seu
gerenciador de pacotes para instalá-los e experimentá-los.

Explicação da saída de top

A saída de top é dividida em duas áreas: a área de resumo e a área de tarefas.

A área de resumo em top

• A área de resumo é composta pelas cinco linhas superiores e nos fornece as seguintes
informações:
– top - 11:10:29 up 2:21, 1 user, load average: 0,11, 0,20, 0,14;
– hora atual (em formato de 24 horas): 11:20:29;
191 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]

– tempo de atividade (há quanto tempo o sistema está ativo e funcionando): up


2:21;
– número de usuários logados e carga média da CPU nos últimos 1, 5 e 15 minutos,
respectivamente: load average: 0,11, 0,20, 0,14.
• Tasks: 73 total, 1 running, 72 sleeping, 0 stopped, 0 zombie (informações sobre os
processos):
– número total de processos em modo ativo: 73 total;
– em execução (os que estão sendo executados): 1 running;
– em espera (os que estão esperando para retomar a execução): 72 sleeping;
– interrompidos (por um sinal de controle do trabalho): 0 stopped;
– zumbi (os que concluíram a execução mas ainda estão esperando que o processo
pai os remova da tabela de processos): 0 zombie.
• %Cpu(s): 0,0 us, 0,3 sy, 0,0 ni, 99,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st (porcentagem de
tempo da CPU gasto em):
– processos de usuário: 0,0 us;
– processos do sistema/kernel: 0,4 sy;
– processos com um valor nice configurado—quanto mais alto o valor nice, menor a
prioridade: 0,0 ni;
– nada—tempo ocioso da CPU: 99,7 id;
– processos aguardando operações de I/O: 0,0 wa;
– processos atendendo interrupções de hardware—periféricos enviando ao proces-
sador sinais que precisam de atenção: 0,0 hi;
– processos atendendo interrupções de software: 0,0 si;
– processos atendendo tarefas de outras máquinas virtuais em um ambiente virtual,
e que, portanto, roubam tempo: 0,0 st.
• KiB Mem : 1020332 total, 909492 free, 38796 used, 72044 buff/cache (informações da
memória em kilobytes):
– quantidade total de memória: 1020332 total;
– memória não utilizada: 909492 free;
– memória em uso: 38796 used;
– memória armazenada em buffer e em cache para evitar acesso excessivo ao disco:
72044 buff/cache;
– Note como o total é a soma dos outros três valores—free, used e buff/cache—(aproximadamente
1 GB em nosso caso).
• KiB Swap: 1046524 total, 1046524 free, 0 used. 873264 avail Mem (informações de
troca em kilobytes):
– quantidade total de espaço de troca: 1046524 total;
– espaço de troca não utilizado: 1046524 free;
– espaço de troca em uso: 0 used;
– quantidade de memória de troca que pode ser alocada a processos sem causar mais
trocas: 873264 avail Mem.
192 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]

A área de tarefas em top: Campos e colunas

Abaixo da área de resumo fica a área de tarefas, que inclui uma série de campos e colunas que
informam sobre os processos em execução:

• PID: Identificador do processo;


• USER: Usuário emissor do comando que originou o processo;
• PR: Prioridade de processo para o kernel;
• NI: Valor nice do processo. Os valores mais baixos têm mais prioridade que os valores
altos;
• VIRT: Quantidade total de memória usada por processo (incluindo Troca);
• RES: Memória RAM usada por processo;
• SHR: Memória compartilhada do processo com outros processos;
• S: Status do processo. Os valores incluem: S (suspensão interrompível—esperando
que um evento termine), R (executável—em execução ou na fila para ser executado)
ou Z (zumbi—processos filhos encerrados cujas estruturas de dados ainda não foram
removidas da tabela de processos);
• %CPU: Porcentagem de CPU usada pelo processo;
• %MEM: Porcentagem de RAM utilizada pelo processo, ou seja, o valor de RES expresso
em porcentagem;
• TIME+: Tempo total de atividade do processo;
• COMMAND: Nome do comando/programa que gerou o processo.

Visualizando processos estaticamente: ps

Como dito acima, o ps exibe um instantâneo dos processos. Para ver todos os processos com
um terminal (tty), digite ps a:

root@debian10:/home/debian/4linux# ps a
PID TTY STAT TIME COMMAND
731 tty1 Ssl+ 0:00 /usr/lib/gdm3/gdm-wayland-session gnome-session --autostart /usr
/share/gdm/greeter/autostart
735 tty1 Sl+ 0:00 /usr/lib/gnome-session/gnome-session-binary --autostart /usr/
share/gdm/greeter/autostart
743 tty1 Sl+ 0:43 /usr/bin/gnome-shell

Explicação da sintaxe e da saída das opções de ps

Com relação às opções, o ps aceita três estilos diferentes: BSD, UNIX e GNU. Vamos ver
como cada um desses estilos se comportaria ao relatar informações sobre a ID de um processo
específico:

• BSD: As opções não requerem um traço inicial:


193 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]

ps p 811
PID TTY STAT TIME COMMAND
811 pts/0 S 0:00 -su

• UNIX: As opções requerem um traço inicial:

ps -p 811
PID TTY TIME CMD
811 pts/0 00:00:00 bash

• GNU: As opções recebem um duplo traço inicial:

ps --pid 811
PID TTY TIME CMD
811 pts/0 00:00:00 bash

Nos três casos, o ps relata informações sobre o processo cujo PID é 811—neste caso, o bash.

Da mesma forma, podemos usar o ps para pesquisar os processos iniciados por um usuário
determinado:

• ps U debian (BSD);
• ps -u debian (UNIX);
• ps –user debian (GNU).

Vamos verificar os processos iniciados por debian:

root@debian10:/home/debian/4linux# ps U debian
PID TTY STAT TIME COMMAND
845 ? Ss 0:00 /lib/systemd/systemd --user
852 ? S 0:00 (sd-pam)
914 ? R 0:01 sshd: debian@pts/0
918 pts/0 Ss 0:00 -bash

A coluna STAT informa o estado do processo (veja abaixo).

Podemos obter o melhor do ps combinando algumas de suas opções. Um comando muito útil
(produzindo uma saída semelhante à de top) é ps aux (estilo BSD). Nesse caso, os processos
de todos os shells (não apenas o atual) são mostrados. O significado das opções é o seguinte:
194 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]

• a: Mostra processos que estão vinculados a um tty ou terminal;


• u: Exibe formato orientado ao usuário;
• x: Mostra processos que não estão vinculados a um tty ou terminal.

root@debian10:/home/debian/4linux# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 1.0 169752 5332 ? Ss 12:15 0:03 /sbin/init
root 2 0.0 0.0 0 0 ? S 12:15 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 12:15 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 12:15 0:00 [rcu_par_gp]
root 6 0.0 0.0 0 0 ? I< 12:15 0:00 [kworker/0:0H-kblockd]
root 8 0.0 0.0 0 0 ? I< 12:15 0:00 [mm_percpu_wq]

Entenda melhor as colunas:

• USER: Proprietário do processo;


• PID: Identificador do processo;
• %CPU: Porcentagem de CPU usada;
• %MEM: Porcentagem de memória física usada;
• VSZ: Memória virtual do processo em KiB;
• RSS: Memória física não trocada usada pelo processo em KiB;
• TT: Terminal (tty) que controla o processo;
• STAT: Código que representa o estado do processo. Além de S, R e Z (que vimos
ao descrever a saída de top), outros valores possíveis seriam: D (dormente sem inter-
rupção—geralmente esperando por I/O), T (interrompido—normalmente por um sinal
de controle). Alguns modificadores extras incluem: < (prioridade maior que o conven-
cional), N (prioridade menor que o convencional), ou + (no grupo de processos em
primeiro plano);
• STARTED: Horário de início do processo;
• TIME: Tempo de CPU acumulado;
• COMMAND: Comando que iniciou o processo.

Recursos dos multiplexadores de terminal


Em eletrônica, um multiplexador (ou mux) é um dispositivo que permite que várias entradas
sejam conectadas a uma única saída. Assim, um multiplexador de terminal nos proporciona
a capacidade de alternar entre diferentes entradas conforme necessário. Embora não sejam
exatamente iguais, screen e tmux compartilham uma série de características comuns:

• Qualquer invocação bem-sucedida resultará em pelo menos uma sessão que—por sua
vez—incluirá ao menos uma janela. As janelas contêm programas;
• As janelas podem ser divididas em regiões ou painéis—o que ajuda na produtividade ao
195 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]

se trabalhar com vários programas simultaneamente;


• Facilidade de controle: para executar a maioria dos comandos, usamos uma combinação
de teclas—o chamado prefixo de comando ou chave de comando—seguida por outro
caractere;
• As sessões podem ser desanexadas do terminal em que estão (ou seja, os programas
são enviados para o segundo plano e continuam em execução). Isso garante a execução
completa dos programas, independentemente de fecharmos acidentalmente um terminal,
travamentos ocasionais ou até mesmo a perda da conexão remota;
• Conexão de socket;
• Modo de cópia;
• São altamente personalizáveis.

Resumo
Nesta lição, você aprendeu sobre jobs (trabalhos) e controle de jobs. Os fatos e conceitos
principais a ser lembrados são:

• Jobs são processos enviados ao segundo plano;


• Além de um ID de processo, os jobs também recebem um ID de trabalho quando criados;
• Para controlar os jobs, é necessária uma especificação de trabalho (jobspec);
• Os jobs podem ser trazidos ao primeiro plano, enviados ao segundo plano, encerrados e
eliminados (ou mortos);
• Um job pode ser desvinculado do terminal e da sessão na qual foi criado;
• Prefixo do comando: o screen usa Ctrl+a + caractere; o tmux, Ctrl+b + caractere;
• Estrutura de sessões, janelas e divisões de janelas (regiões ou painéis);
• Modo de cópia;
• Desanexar sessões: um dos recursos mais poderosos dos multiplexadores.

Discutimos também o conceito de processos e monitoramento de processos. As ideias mais


relevantes são:

• Os processos são programas em execução;


• Os processos podem ser monitorados;
• Diferentes utilitários nos permitem descobrir o ID do processo dos processos, bem como
enviar sinais para encerrá-los;
• Os sinais podem ser especificados por nome (p. ex. -SIGTERM), número (p. ex. -15)
ou opção (p. ex. -s SIGTERM);
• top e ps são muito poderosos quando se trata de monitorar processos. A saída do
primeiro é dinâmica e se atualiza constantemente; já o ps exibe a saída de forma estática.

Comandos usados nesta lição:


196 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]

• jobs: Mostra os jobs ativos e seus status;


• sleep: Espera por um período específico de tempo;
• fg: Traz o job para o primeiro plano;
• bg: Move o job para o segundo plano;
• kill: Elimina o job;
• nohup: Desvincula o job da sessão/terminal;
• exit: Sai do shell atual;
• tail: Exibe as linhas mais recentes em um arquivo;
• watch: Executa um comando repetidamente (ciclo de 2 segundos por padrão);
• uptime: Mostra há quanto tempo o sistema está rodando, o número de usuários atuais
e a carga média do sistema;
• free: Mostra o uso da memória;
• pgrep: Procura o ID do processo com base no nome;
• pidof: Procura o ID do processo com base no nome;
• pkill: Envia sinal ao processo por nome;
• killall: Elimina processo(s) por nome;
• top: Exibe os processos do Linux;
• ps: Relata um instantâneo dos processos atuais.

Talvez isso possa te ajudar. . .

Fig. 20.1: HTOP EXPLAINED


197 20. 103.5: Criar, monitorar e eliminar processos
Fabio Gonçalves De Melo Santana / [email protected]

Fig. 20.2: HTOP EXPLAINED

• Fonte: https://codeahoy.com/2017/01/20/hhtop-explained-visually/
Fabio Gonçalves De Melo Santana / [email protected]

21
103.6 Modificar as prioridades de
execução do processo

Introdução
Os sistemas operacionais capazes de executar mais de um processo ao mesmo tempo são
chamados de sistemas multitarefa ou multiprocessamento. Embora a verdadeira simultanei-
dade só aconteça quando mais de uma unidade de processamento estiver disponível, mesmo
os sistemas de processador único podem imitar a simultaneidade alternando entre os processos
muito rapidamente.

Na verdade, apenas um processo por vez pode controlar a CPU. No entanto, a maioria das
atividades de processo são chamadas de sistema, ou seja, o processo em execução transfere o
controle da CPU para o processo de um sistema operacional para que ele execute a operação
solicitada. As chamadas do sistema são responsáveis por todas as comunicações entre dis-
positivos, como alocações de memória, leitura e gravação em sistemas de arquivos, impressão
de texto na tela, interação do usuário, transferências de rede etc. Transferir o controle da
CPU durante uma chamada do sistema permite que o sistema operacional decida se para
retornar o controle da CPU para o processo anterior ou para transferi-lo para outro processo.
Como as CPUs modernas podem executar instruções muito mais rápido do que a maioria dos
hardwares externos podem se comunicar entre si, um novo processo de controle pode fazer
muito trabalho da CPU enquanto as respostas de hardware solicitadas anteriormente ainda
estão indisponíveis. Para garantir o aproveitamento máximo da CPU,os sistemas operacionais

198
199 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

de multiprocessamento mantêm uma fila dinâmica de processos ativos aguardando um slot de


tempo da CPU.

Embora eles permitam melhorar significativamente a utilização do tempo da CPU, confiar


apenas nas chamadas do sistema para alternar entre os processos não é suficiente para atingir
um desempenho multitarefa satisfatório. Um processo que não faz chamadas de sistema pode
controlar a CPU indefinidamente. É por isso que os sistemas operacionais modernos também
são preemptivos, ou seja, um processo em execução pode ser colocado de volta na fila para
que um processo mais importante possa controlar a CPU, mesmo que o processo em execução
não tenha feito uma chamada de sistema.

O Linux Scheduler
O Linux, como um sistema operacional de multiprocessamento preventivo, implementa um
agendador que organiza a fila de processos. Mais precisamente, o escalonador também decide
qual thread enfileirada será executado - um processo pode ramificar muitos threads indepen-
dentes - mas processo e thread são termos intercambiáveis neste contexto. Todo processo
possui dois predicados que intervêm em seu escalonamento: a política de escalonamento e a
prioridade de escalonamento.

Existem dois tipos principais de políticas de escalonamento: políticas em tempo real e políticas
normais. Os processos em uma política em tempo real são programados diretamente por seus
valores de prioridade. Se um processo mais importante ficar pronto para ser executado, um
processo menos importante será interrompido e o processo de prioridade mais alta assumirá o
controle da CPU. Um processo de prioridade mais baixa obterá controle da CPU apenas se os
processos de prioridade mais alta estiverem ociosos ou aguardando a resposta do hardware.

Qualquer processo em tempo real tem prioridade mais alta do que um processo normal. Como
um sistema operacional de uso geral, o Linux executa apenas alguns processos em tempo
real. A maioria dos processos, incluindo o sistema e os programas do usuário, são executados
sob as políticas de agendamento normais. Os processos normais geralmente têm o mesmo
valor de prioridade, mas as políticas normais podem definir regras de prioridade de execução
usando outro predicado de processo: o valor agradável. Para evitar confusão com as prioridades
dinâmicas derivadas de valores legais, as prioridades de agendamento são geralmente chamadas
de prioridades de agendamento estáticas.

O agendador do Linux pode ser configurado de muitas maneiras diferentes e existem maneiras
ainda mais intrincadas de estabelecer prioridades, mas esses conceitos gerais sempre se aplicam.
Ao inspecionar e ajustar a programação do processo, é importante ter em mente que apenas
os processos sob a política de programação normal serão afetados.
200 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Prioridades de leitura
O Linux reserva prioridades estáticas de 0 a 99 para processos em tempo real e processos
normais são atribuídos a prioridades estáticas de 100 a 139, o que significa que existem 39
níveis de prioridade diferentes para processos normais. Valores mais baixos significam prioridade
mais alta. A prioridade estática de um processo ativo pode ser encontrada no arquivo sched,
localizado em seu respectivo diretório dentro do sistema de arquivos /proc:

root@debian10:/home/debian# grep ^prio /proc/1/sched


prio : 120
root@debian10:/home/debian#

Conforme mostrado no exemplo, a linha que começa com prio fornece o valor de prioridade do
processo (o processo PID 1 é o init ou o processo systemd, o primeiro processo que o kernel
inicia durante a inicialização do sistema). A prioridade padrão para processos normais é 120,
de modo que pode ser diminuída para 100 ou aumentada para 139. As prioridades de todos
os processos em execução podem ser verificadas com o comando ps -Al ou ps -el:

root@debian10:/home/debian# ps -el
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 1 80 0 - 42432 do_epo ? 00:00:03 systemd
1 S 0 2 0 0 80 0 - 0 - ? 00:00:00 kthreadd
1 I 0 3 2 0 60 -20 - 0 - ? 00:00:00 rcu_gp
1 I 0 4 2 0 60 -20 - 0 - ? 00:00:00 rcu_par_gp
1 I 0 5 2 0 80 0 - 0 - ? 00:00:00 kworker/0:0-events
1 I 0 6 2 0 60 -20 - 0 - ? 00:00:00 kworker/0:0H-kblockd
1 I 0 7 2 0 80 0 - 0 - ? 00:00:00 kworker/u4:0-flush-254:2
1 I 0 8 2 0 60 -20 - 0 - ? 00:00:00 mm_percpu_wq

A coluna PRI indica a prioridade estática atribuída pelo kernel. Observe, entretanto, que o
valor de prioridade exibido por ps difere daquele obtido no exemplo anterior. Devido a razões
históricas, as prioridades exibidas por ps variam de -40 a 99 por padrão, então a prioridade
real é obtida adicionando 40 a ela (em particular, 80 + 40 = 120).

Também é possível monitorar continuamente os processos atualmente gerenciados pelo kernel


Linux com o programa top. Tal como acontece com ps, top também exibe o valor de prioridade
de forma diferente. Para facilitar a identificação dos processos em tempo real, top subtrai o
valor da prioridade por 100, tornando todas as prioridades em tempo real negativas, com um
número negativo ou rt identificando-as. Portanto, as prioridades normais exibidas por top
variam de 0 a 39.
201 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Para obter mais detalhes do pscomando, opções adicionais podem ser usadas. Com-
pare a saída deste comando com a de nosso exemplo anterior:

ps -e -o usuário, uid, comm, tty, pid, ppid, pri, pmem, pcpu –sort = -pcpu | head

Niceness do processo
Todo processo normal começa com um valor legal padrão de 0 (prioridade 120). O nome nice
“legal” vem da ideia de que processos “mais legais” permitem que outros processos sejam
executados antes deles em uma fila de execução específica. Números agradáveis variam de -20
(menos legais, prioridade alta) a 19 (mais legais, prioridade baixa). O Linux também permite
a capacidade de atribuir diferentes valores agradáveis a threads dentro do mesmo processo. A
coluna NI na saída do comando ps indica o número nice “legal”.

Apenas o usuário root pode diminuir a gentileza de um processo abaixo de zero. É possível
iniciar um processo com uma prioridade não padrão com o comando nice. Por padrão, o
comando nice altera o niceness para 10, mas pode ser especificado com a opção -n:

root@debian10:/home/debian# nice -n 15 tar czf home_backup.tar.gz /home

Neste exemplo, o comando tar é executado com uma prioridade de 15. O comando renice
pode ser usado para alterar a prioridade de um processo em execução. A opção -p indica o
número PID do processo de destino. Por exemplo:

root@debian10:/home/debian# renice -10 -p 2164


2164 (process ID) old priority 0, new priority -10

As opções -g e -u são utilizadas para modificar todos os processos de um determinado grupo


ou usuário, respectivamente. Com renice +5 -g users, a prioridade dos processos pertencentes
a usuários do grupo de usuários será aumentada em cinco.

Além do comando renice, a prioridade dos processos pode ser modificada com outros progra-
mas, como o programa top.
202 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Resumo
Esta lição cobre como o Linux compartilha o tempo de CPU entre seus processos gerenciados.
Para garantir o melhor desempenho, os processos mais críticos devem ultrapassar os processos
menos críticos. A lição passa pelas seguintes etapas:

• Conceitos básicos sobre sistemas de multiprocessamento;


• O que é um planejador de processo e como o Linux o implementa;
• Quais são as prioridades do Linux, bons números e sua finalidade;
• Como ler e interpretar prioridades de processo no Linux;
• Como alterar a prioridade de um processo, antes e durante sua execução.

Talvez isso possa te ajudar. . .

Fig. 21.1: NICENESS

• Fonte: https://devconnected.com/understanding-processes-on-linux/ # Pesquisar em


arquivo de texto usando expressoes regulares

Introdução
As expressões regulares consistem em sequências de caracteres, constituindo um padrão genérico
usado para localizar e, às vezes, modificar uma sequência correspondente em uma sequência
maior de caracteres. As expressões regulares expandem muito a capacidade de:

• Escrever regras de análise para solicitações em servidores WEB em particular;


• Escrever scripts que convertem conjuntos de dados baseados em texto para outro for-
mato;
• Procurar por ocorrências de interesse em entradas de diário ou documentos;
203 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

• Filtrar documentos de marcação, mantendo o conteúdo semântico.

A expressão regular mais simples contém pelo menos um átomo. Um átomo, assim chamado
por ser o elemento básico de uma expressão regular, é apenas um caractere que pode ou não
ter um significado especial. A maioria dos caracteres comuns não são ambíguos e retêm seu
significado literal, enquanto outros têm um significado especial:

• . (ponto): O átomo corresponde a qualquer caractere;


• ˆ (acento circunflexo): O átomo corresponde ao início de uma linha;
• $ (cifrão): O átomo corresponde ao fim de uma linha.

Por exemplo, a expressão regular bc, composta pelos átomos literais b e c, pode ser encontrada
na string abcd, mas não na string a1cd. Por outro lado, a expressão regular .c pode ser
encontrada nas strings abcd e a1cd, pois o ponto . corresponde a qualquer caractere.

Os átomos de circunflexo e o cifrão são usados quando apenas as correspondências no início


ou no final da string são de interesse. Por essa razão, eles também são chamados de âncoras.
Assim, cd pode ser encontrado em abcd, mas ˆcd não. Da mesma forma, ab pode ser
encontrado em abcd, mas ab$ não. O acento circunflexo ˆ é um caractere literal, exceto
quando no início, e $ é um caractere literal, exceto quando no final da expressão regular.

Expressão de colchetes
Embora não sejam um único caractere, os colchetes [] (incluindo o conteúdo) são considerados
um único átomo. Uma expressão de colchetes geralmente é apenas uma lista de caracteres
literais delimitados por [], fazendo com que o átomo corresponda a qualquer caractere único
da lista. Por exemplo, a expressão [1b] pode ser encontrada nas strings abcd e a1cd. Para
especificar caracteres aos quais o átomo não deve corresponder, a lista deve começar com
ˆ, como em [ˆ1b]. Também é possível especificar intervalos de caracteres em expressões de
colchetes. Por exemplo, [09] corresponde aos dígitos de 0 a 9 e [az] corresponde a qualquer
letra minúscula. Os intervalos devem ser usados com cuidado, pois podem não ser consistentes
em diferentes idiomas.

As listas de expressão de colchetes também aceitam classes em vez de apenas caracteres únicos
e intervalos. As classes de caracteres tradicionais são:

• [:alnum:]: Representa um caractere alfanumérico;


• [:alpha:]: Representa um caractere alfabético;
• [:ascii:]: Representa um caractere que pertence ao conjunto de caracteres ASCII;
• [:blank:]: Representa um caractere em branco, ou seja, um espaço ou tabulação;
• [:cntrl:]: Representa um caractere de controle;
• [:digit:]: Representa um dígito (de 0 a 9);
204 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

• [:graph:]: Representa qualquer caractere imprimível, exceto espaço;


• [:lower:]: Representa um caractere em minúsculas;
• [:print:]: Representa qualquer caractere imprimível, incluindo espaço;
• [:punct:]: Representa qualquer caractere imprimível que não seja um espaço ou um
caractere alfanumérico;
• [:space:]: Representa os caracteres de espaço em branco: espaço, alimentação de
formulário (\f), nova linha (\n), retorno de carro (\r), tabulação horizontal (\t) e
tabulação vertical (\v);
• [:upper:]: Representa uma letra maiúscula;
• [:xdigit:]: Representa dígitos hexadecimais (de 0 a F).

As classes de caracteres podem ser combinadas com caracteres únicos e intervalos, mas não
podem ser usadas como ponto final de um intervalo. Além disso, as classes de caracteres
podem ser usadas apenas em expressões de colchetes, não como um átomo independente fora
dos colchetes.

Chaves
As chaves são quantificadores que permitem ao usuário especificar limites precisos de quanti-
dade para um átomo. Em expressões regulares estendidas, as chaves podem aparecer de três
maneiras:

• {i}: O átomo deve aparecer exatamente i vezes (sendo i um número inteiro). Por
exemplo, [[:blank:]]{2} corresponde a exatamente dois caracteres em branco;
• {i,}: O átomo deve aparecer pelo menos i vezes (sendo i um número inteiro). Por
exemplo, [[:blank:]]{2,} corresponde a qualquer sequência de dois ou mais caracteres
em branco;
• {i,j}: O átomo deve aparecer pelo menos i vezes e no máximo j vezes (i e j números
inteiros, j maior que i). Por exemplo, xyz {2,4} corresponde à string xy seguida por dois
a quatro do caractere z.

De toda forma, se uma substring corresponder a uma expressão regular e uma substring
mais longa começando no mesmo ponto também corresponder, a substring mais longa será
considerada.

As expressões regulares básicas também suportam chaves, mas elas devem ser precedidas por:
{ e }. Sozinhas, { e } são interpretadas como caracteres literais. Uma { seguida por um
caractere diferente de um dígito é um caractere literal, não uma abertura de chave.
205 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Pesquisas com expressões regulares


A vantagem imediata oferecida pelas expressões regulares é aprimorar as pesquisas em sistemas
de arquivos e em documentos de texto. A opção -regex do comando find permite testar cada
caminho em uma hierarquia de diretórios de acordo com uma expressão regular. Por exemplo,

root@debian10:/home/debian/4linux# find $HOME -regex '.*/\..*' -size +100M

busca por arquivos maiores que 100 megabytes (100 unidades de 1048576 bytes), mas apenas
em caminhos dentro do diretório inicial do usuário que contenham uma correspondência com
./.., ou seja, um /. rodeado por qualquer outro número de caracteres. Em outras palavras,
apenas os arquivos ocultos ou arquivos dentro de diretórios ocultos serão listados, indepen-
dentemente da posição de /. no caminho correspondente. Para expressões regulares que não
diferenciam maiúsculas de minúsculas, a opção -iregex deve ser usada em seu lugar:

root@debian10:/home/debian/4linux# find /usr/share/fonts -regextype posix-extended -iregex


'.*(dejavu|liberation).*sans.*(italic|oblique).*'
/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Oblique.ttf
/usr/share/fonts/truetype/dejavu/DejaVuSansCondensed-BoldOblique.ttf
/usr/share/fonts/truetype/dejavu/DejaVuSans-Oblique.ttf
/usr/share/fonts/truetype/dejavu/DejaVuSansMono-BoldOblique.ttf
/usr/share/fonts/truetype/dejavu/DejaVuSans-BoldOblique.ttf
/usr/share/fonts/truetype/dejavu/DejaVuSansCondensed-Oblique.ttf
/usr/share/fonts/truetype/liberation2/LiberationSans-BoldItalic.ttf
/usr/share/fonts/truetype/liberation2/LiberationSans-Italic.ttf

Neste exemplo, a expressão regular contém alternâncias (escritas no estilo estendido) para listar
apenas arquivos de fonte específicos na hierarquia de diretório /usr/share/fonts. Expressões
regulares estendidas não são suportadas por padrão, mas find permite que sejam habilitadas
com -regextype posix-extended or -regextype egrep. A ER padrão para find é findutils-default,
que é essencialmente um clone da expressão regular básica.

O localizador de padrões: grep


As expressões regulares são uma técnica importante usada não apenas na administração de
sistemas, mas também na mineração de dados e áreas relacionadas. Dois comandos são
especialmente adequados para manipular arquivos e texto usando expressões regulares: grep
e sed. grep é um localizador de padrões e sed é um editor de fluxo. Eles são úteis por si sós,
mas é no trabalho em conjunto com outros processos que se destacam de fato.

Um dos usos mais comuns do grep é facilitar a inspeção de arquivos longos, usando a expressão
206 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

regular como filtro aplicado a cada linha. Pode ser usado para mostrar apenas as linhas que
começam com um determinado termo. Por exemplo, o grep pode ser usado para investigar
um arquivo de configuração para módulos do kernel, listando apenas as linhas de opções:

root@debian10:/home/debian# grep '^#HostKey' /etc/ssh/sshd_config


#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key

O caractere pipe | pode ser empregado para redirecionar a saída de um comando diretamente
para a entrada de grep. O exemplo a seguir usa uma expressão entre colchetes para selecionar
linhas da saída de fdisk -l, começando com Disk /dev/sda ou Disk /dev/sdb:

root@debian10:/home/debian# fdisk -l | grep '^Disk /dev/sd[ab]'


Disk /dev/sda: 512 GiB, 549755813888 bytes, 1073741824 sectors

A mera seleção de linhas com correspondências pode não ser apropriada para uma tarefa em
particular, exigindo ajustes no comportamento de grep através de suas opções. Por exemplo,
a opção -c ou –count diz ao grep para exibir quantas linhas têm correspondências:

root@debian10:/home/debian# fdisk -l | grep '^Disk /dev/sd[ab]' -c


1

A opção pode ser colocada antes ou depois da expressão regular. Outras opções importantes
do grep são:

• -c ou –count: Em vez de exibir os resultados da pesquisa, exibe apenas a contagem


total de quantas vezes uma correspondência ocorre em qualquer arquivo;
• -i ou –ignore-case: Torna a busca insensível a maiúsculas e minúsculas;
• -f FILE ou –file=FILE: Indica um arquivo contendo a expressão regular a ser usada;
• -n ou –line-number: Mostra o número da linha;
• -v ou –invert-match: Seleciona todas as linhas, exceto aquelas que contêm corre-
spondências;
• -H ou –with-filename: Mostra também o nome do arquivo que contém a linha;
• -z ou –null-data: Em vez de fazer com que o grep trate os fluxos de dados de entrada e
saída como linhas separadas (usando newline por padrão), ele passa a encarar a entrada
ou saída como uma sequência de linhas. Ao combinar a saída do comando find usando
a opção -print0 com o comando grep, a opção -z ou –null-data deve ser usada para
207 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

processar o fluxo da mesma maneira.

Embora ativada por padrão quando vários caminhos de arquivo são fornecidos como entrada,
a opção -H não é ativada para arquivos individuais. Isso pode ser importante em situações
especiais, como quando grep é chamado diretamente por find, por exemplo:

root@debian10:/home/debian# find /usr/share/doc -type f -exec grep -i 'iptables' "{}" \; |


cut -c -100
Upstream-Name: iptables
Files: iptables/iptables-apply
Files: iptables/iptables-save.c
Files: iptables/iptables-xml.c
Files: iptables/nft.c
Files: iptables/nft-arp.c
Files: iptables/nft-bridge.c

Neste exemplo, find lista todos os arquivos em /usr/share/doc e passa cada um deles para
o grep, que por sua vez realiza uma busca sem distinção entre maiúsculas e minúsculas por
iptables dentro do arquivo. O pipe para cut existe apenas para limitar o comprimento da saída
a 100 colunas. Observe, entretanto, que não há como saber de qual arquivo as linhas vieram.
Esse problema é resolvido adicionando -H ao grep:

root@debian10:/home/debian# find /usr/share/doc -type f -exec grep -i -H 'iptables' "{}" \;


| cut -c -100
/usr/share/doc/libip4tc0/copyright:Upstream-Name: iptables
/usr/share/doc/libip4tc0/copyright:Files: iptables/iptables-apply
/usr/share/doc/libip4tc0/copyright:Files: iptables/iptables-save.c
/usr/share/doc/libip4tc0/copyright:Files: iptables/iptables-xml.c
/usr/share/doc/libip4tc0/copyright:Files: iptables/nft.c

Agora é possível identificar os arquivos nos quais cada correspondência foi encontrada. Para
tornar a listagem ainda mais informativa, linhas iniciais e finais podem ser adicionadas às linhas
com correspondências:

root@debian10:/home/debian# find /usr/share/doc -type f -exec grep -i -H -1 'iptables' "{}"


\; | cut -c -100
/usr/share/doc/libip4tc0/copyright-Format: https://www.debian.org/doc/packaging-manuals/
copyright-fo
/usr/share/doc/libip4tc0/copyright:Upstream-Name: iptables
/usr/share/doc/libip4tc0/copyright-Upstream-Contact: Netfilter Developer List <
[email protected]

A opção -1 instrui o grep a incluir uma linha antes e uma linha depois quando encontrar uma
linha com uma correspondência. Essas linhas extras são chamadas de linhas de contexto e são
208 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

identificadas na saída por um sinal de menos após o nome do arquivo. O mesmo resultado
pode ser obtido com -C 1 ou –context=1; outras quantidades de linhas de contexto podem
ser indicadas.

Existem dois programas complementares a grep: egrep e fgrep. O programa egrep é equivalente
ao comando grep -E, que incorpora recursos extras além das expressões regulares básicas. Por
exemplo, com o egrep é possível usar recursos de expressões regulares estendidas, como as
alternâncias:

root@debian10:/home/debian# find /usr/share/doc -type f -exec egrep -i -H -1 'iptables|


firewall' "{}" \; | cut -c -100
/usr/share/doc/traceroute/TODO: All methods, usable when firewalls are present in the
network path,
/usr/share/doc/traceroute/TODO- normally use some particular destination port. Most often
it is a p
/usr/share/doc/libip4tc0/copyright-Format: https://www.debian.org/doc/packaging-manuals/
copyright-fo
/usr/share/doc/libip4tc0/copyright:Upstream-Name: iptables

Neste exemplo, a expressão buscada corresponderá a iptables ou firewall, sem distinção entre
maiúsculas e minúsculas. Para exibir apenas as partes de um fluxo de texto que correspondem
à expressão usada por egrep, use a opção -o.

O programa fgrep é equivalente a grep -F, ou seja, não analisa expressões regulares. Ele é
útil em pesquisas simples, nas quais o objetivo é encontrar uma expressão literal. Portanto,
caracteres especiais como o cifrão e o ponto serão interpretados literalmente e não como seus
significados em uma expressão regular.

O editor de fluxo: sed


O objetivo do programa sed é modificar dados baseados em texto de forma não interativa. Isso
significa que toda a edição é feita por instruções predefinidas, não por uma digitação direta e
arbitrária em um texto exibido na tela. Em termos modernos, o sed pode ser entendido como
um analisador de modelo: dado um texto como entrada, ele coloca um conteúdo personalizado
em posições predefinidas ou quando encontra uma correspondência para uma expressão regular.

O sed é adequado para texto transmitido por meio de encadeamentos (pipelines). Sua sintaxe
básica é sed -f SCRIPT, quando as instruções de edição são armazenadas no arquivo SCRIPT,
ou sed -e COMANDOS para executar COMANDOS diretamente da linha de comando. Se
nem -f nem -e estiverem presentes, o sed usa o primeiro parâmetro que não seja uma opção
como arquivo de script. Também é possível usar um arquivo como entrada apenas fornecendo
seu caminho como um argumento para o sed.
209 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

As instruções do sed são compostas por um único caractere, possivelmente precedido por um
endereço ou seguido por uma ou mais opções, e são aplicadas a uma linha de cada vez. Os
endereços podem ser um único número de linha, uma expressão regular ou um intervalo de
linhas. Por exemplo, a primeira linha de um fluxo de texto pode ser excluída com 1d, onde 1
especifica a linha à qual o comando de exclusão d será aplicado. Para esclarecer o uso de sed,
vejamos a saída do comando factor seq 12, que retorna os fatores primos para os números de
1 a 12:

root@debian10:/home/debian# factor `seq 12`


1:
2: 2
3: 3
4: 2 2
5: 5
6: 2 3
7: 7
8: 2 2 2
9: 3 3
10: 2 5
11: 11
12: 2 2 3

A exclusão da primeira linha com o sed é realizada por 1d:

root@debian10:/home/debian# factor `seq 12` | sed 1d


2: 2
3: 3
4: 2 2
5: 5
6: 2 3
7: 7
8: 2 2 2
9: 3 3
10: 2 5
11: 11
12: 2 2 3

Especificamos um intervalo de linhas com uma vírgula de separação:

root@debian10:/home/debian# factor `seq 12` | sed 1,7d


8: 2 2 2
9: 3 3
10: 2 5
11: 11
12: 2 2 3
210 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Mais de uma instrução pode ser usada na mesma execução, separadas por ponto e vírgula.
Nesse caso, no entanto, é importante colocá-las entre parênteses para que o ponto e vírgula
não seja interpretado pelo shell:

root@debian10:/home/debian# factor `seq 12` | sed "1,7d;11d"


8: 2 2 2
9: 3 3
10: 2 5
12: 2 2 3

Neste exemplo, duas instruções de exclusão foram executadas, primeiro nas linhas que vão de
1 a 7 e depois na linha 11. Um endereço também pode ser uma expressão regular, portanto,
apenas as linhas correspondentes serão afetadas pela instrução:

root@debian10:/home/debian# factor `seq 12` | sed "1d;/:.*2.*/d"


3: 3
5: 5
7: 7
9: 3 3
11: 11

A expressão regular :2. * corresponde a qualquer ocorrência do número 2 em qualquer lugar


depois de dois pontos, provocando a exclusão das linhas correspondentes aos números que
tenham 2 como fator. Com o sed, qualquer coisa colocada entre barras (/) é considerada
uma expressão regular e, por padrão, todas as ER básicas são suportadas. Por exemplo,
sed -e “/ˆ#/d” /etc/services mostra o conteúdo do arquivo /etc/services sem as linhas que
começam com # (linhas de comentário).

A instrução de exclusão d é apenas uma das muitas instruções de edição fornecidas pelo sed.
Em vez de excluir uma linha, o sed pode substitui-la por um texto determinado:

root@debian10:/home/debian# factor `seq 12` | sed "1d;/:.*2.*/c REMOVED"


REMOVED
3: 3
REMOVED
5: 5
REMOVED
7: 7
REMOVED
9: 3 3
REMOVED
11: 11
REMOVED
211 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

A instrução c REMOVED simplesmente substitui uma linha pelo texto REMOVED. No caso
do exemplo, cada linha com uma substring correspondente à expressão regular :.2. é afetada
pela instrução c REMOVED. A instrução a TEXT copia o texto indicado por TEXT para uma
nova linha após a linha com uma correspondência. A instrução r FILE faz o mesmo, mas copia
o conteúdo do arquivo indicado por FILE. A instrução w faz o oposto de r, ou seja, a linha
será anexada ao arquivo indicado.

De longe, a instrução mais usada do sed é s/FIND/REPLACE/, que é usada para substituir uma
correspondência da expressão regular FIND pelo texto indicado por REPLACE. Por exemplo, a
instrução s/hda/sda/ substitui uma substring que corresponde à ER literal hda por sda. Apenas
a primeira correspondência encontrada na linha será substituída, a menos que o sinalizador g
seja colocado após a instrução, como em s/hda/sda/g.

Combinando grep e sed


Os comandos grep e sed podem ser usados juntos quando uma mineração de texto mais
complexa é necessária. Como administrador do sistema, você pode querer inspecionar todas
as tentativas de login em um servidor, por exemplo. O arquivo /var/log/wtmp registra todos
os logins e logouts, ao passo que /var/log/btmp registra as tentativas de login falhadas. Eles
são escritos em um formato binário, que pode ser lido, respectivamente, pelos comandos last
e lastb. A saída de lastb mostra não apenas o nome de usuário empregado na tentativa de
login incorreta, mas também seu endereço IP:

root@debian10:/home/debian# lastb -d -a -n 10 --time-format notime


4linux ssh:notty (00:00) localhost
4linux ssh:notty (00:00) localhost
qualteup ssh:notty (00:00) localhost
qualteup ssh:notty (00:00) localhost
joatham ssh:notty (00:00) localhost
joatham ssh:notty (00:00) localhost

A opção -d traduz o número IP para o nome de host correspondente. O nome do host pode
fornecer pistas sobre o provedor de internet ou o serviço de hospedagem usado para realizar
essas tentativas de login incorretas. A opção -a põe o nome do host na última coluna, o
que facilita a filtragem a ser aplicada. A opção –time-format notime suprime a hora em que
ocorreu a tentativa de login. O comando lastb pode levar algum tempo para ser concluído caso
tenha havido muitas tentativas de login incorretas, por isso limitamos a saída a dez entradas
com a opção -n 10. Nem todos os IPs remotos têm um nome de host associado, portanto o
DNS reverso não se aplica e eles podem ser dispensados. Embora seja possível escrever uma
expressão regular que corresponda ao formato esperado para um nome de host no final da
linha, provavelmente é mais simples escrever uma que corresponda a uma letra do alfabeto ou
a um único dígito no final linha. O exemplo a seguir mostra como o comando grep pega a
212 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

listagem em sua entrada padrão e remove as linhas sem nomes de host:

root@debian10:/home/debian# lastb -d -a -n 10 --time-format notime | grep -v '[0-9]$' |


head -n 10
4linux ssh:notty (00:00) localhost
4linux ssh:notty (00:00) localhost
qualteup ssh:notty (00:00) localhost
qualteup ssh:notty (00:00) localhost
joatham ssh:notty (00:00) localhost
joatham ssh:notty (00:00) localhost

A opção -v do comando grep exibe apenas as linhas que não correspondem à expressão
regular fornecida. Uma expressão regular que corresponda a qualquer linha terminada por
um número (isto é, [0-9])capturaapenasasentradassemumnomedehost.P ortanto, grep −
v ′ [0 − 9]’ mostra somente as linhas que terminam com um nome de host. A filtragem da saída
pode ser ainda mais refinada, mantendo-se apenas o nome de domínio e removendo as outras
partes de cada linha. Para isso, usamos o comando sed com um comando de substituição para
trocar a linha inteira por um agrupamento referente ao nome de domínio contido nela:

root@debian10:/home/debian# lastb -d -a -n 10 --time-format notime | grep -v '[0-9]$' | sed


-e 's/.* \(.*\)$/\1/' | head -n 10
localhost
localhost
localhost
localhost
localhost
localhost

O parêntese escapado em .* (.*)$ diz ao sed para lembrar aquela parte da linha, ou seja, a parte
entre o último caractere de espaço e o final da linha. No exemplo, esta parte é referenciada
com \1 e usada para substituir a linha inteira. Parece claro que a maioria dos hosts remotos
tenta fazer o login mais de uma vez, assim, o mesmo nome de domínio se repete. Para suprimir
as entradas repetidas, elas precisam primeiro ser classificadas (com o comando sort) e depois
passadas para o comando uniq:

root@debian10:/home/debian# lastb -d -a -n 10 --time-format notime | grep -v '[0-9]$' | sed


-e 's/.* \(.*\)$/\1/' | sort | uniq | head -n 10
localhost

Este exemplo mostra como diferentes comandos podem ser combinados para produzir o resul-
tado desejado. A lista de nomes de host pode então ser usada para escrever regras de firewall
de bloqueio ou tomar outras medidas para garantir a segurança do servidor.
213 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Resumo
Esta lição cobre o suporte geral do Linux para expressões regulares, um padrão amplamente
usado cujos recursos de correspondência de padrões são suportados pela maioria dos programas
que trabalham com texto. A lição atravessa as seguintes etapas:

• O que é uma expressão regular;


• Os principais componentes de uma expressão regular;
• As diferenças entre expressões regulares e expressões regulares estendidas;
• Como realizar pesquisas simples de texto e arquivos usando expressões regulares;
• Como usar o grep e suas variações, como egrep e fgrep;
• Como usar o sed e suas instruções internas para manipular texto;
• Exemplos de aplicações de expressões regulares usando grep e sed.

Talvez isso possa te ajudar. . .

Fig. 21.2: REGEX


214 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

• Fonte: https://twitter.com/dataandme/status/852869552191012865?lang=de # Edi-


cao basica de arquivos

Introdução
Na maioria das distribuições Linux, vi - abreviação de “visual” - é pré-instalado e é o editor
padrão no ambiente shell. Vi é um editor de texto interativo, que mostra o conteúdo do
arquivo na tela à medida que vai sendo editado. Como tal, permite ao usuário navegar e fazer
modificações em qualquer parte do documento. No entanto, ao contrário dos editores visuais
da área de trabalho gráfica, o editor vi é um aplicativo shell com atalhos de teclado para todas
as tarefas de edição.

Uma alternativa ao vi, chamada vim (vi melhorado), às vezes é usada como um substituto
moderno para o vi. Entre outras melhorias, o vim oferece suporte para destaque de sintaxe,
desfazer/refazer e edição de múltiplos documentos. Embora mais engenhoso, o vim é total-
mente compatível com versões anteriores do vi, tornando ambos indistinguíveis para a maioria
das tarefas.

A maneira padrão de iniciar o vi é fornecer a ele um caminho para um arquivo como parâmetro.
Para pular diretamente para uma linha específica, seu número deve ser informado com um sinal
de mais, como em vi +9 /etc/fstab para abrir /etc/fstab/ e posicionar o cursor na 9ł linha.
Sem um número, o sinal de mais por si só coloca o cursor na última linha.

A interface do vi é muito simples: todo o espaço disponível na janela do terminal é ocupado


para apresentar um arquivo, normalmente informado como um argumento de comando, ao
usuário. As únicas dicas visuais são uma linha de rodapé mostrando a posição atual do cursor
e um til ~ indicando onde o arquivo termina. Existem diferentes modos de execução para o vi,
onde o comportamento do programa muda. Os mais comuns são: modo de inserção e modo
normal.

Modo de inserção
O modo de inserção é simples: o texto aparece na tela à medida que é digitado no teclado.
É o tipo de interação que a maioria dos usuários espera de um editor de texto, mas não é
como o vi primeiro apresenta um documento. Para entrar no modo de inserção, o usuário deve
executar um comando de inserção no modo normal. A tecla Esc termina o modo de inserção
e retorna ao modo normal, o modo vi padrão.

Se você estiver interessado em saber mais sobre os outros modos de execução, abra
o vi e digite:
215 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

: help vim-modes-intro

Modo normal
O modo normal, também conhecido como modo de comando, é como o vi inicia por padrão.
Neste modo, as teclas do teclado são associadas a comandos para navegação e tarefas de
manipulação de texto. A maioria dos comandos neste modo são chaves exclusivas. Algumas
das teclas e suas funções no modo normal são:

• 0, $: Vá para o início e o fim da linha;


• 1G, G: Vá para o início e o final do documento;
• (,): Vá para o início e o final da frase;
• {,}: Vá para o início e o final do parágrafo;
• w, w: Palavra de salto e palavra de salto incluindo pontuação;
• h, j, k, l: Esquerda, baixo, cima, direita;
• e ou E: Vá para o final da palavra atual;
• /,?: Pesquise para a frente e para trás;
• i, I: Entre no modo de inserção antes da posição atual do cursor e no início da linha
atual;
• a, A: Entre no modo de inserção após a posição atual do cursor e no final da linha
atual;
• o, O: Adicione uma nova linha e entre no modo de inserção na próxima linha ou na
linha anterior;
• s, S: Apague o caractere sob o cursor ou a linha inteira e entre no modo de inserção;
• c: Altere os caracteres sob o cursor;
• r: Substitua o caractere sob o cursor;
• x: Exclua os caracteres selecionados ou o caractere sob o cursor;
• v, V: Inicie uma nova seleção com o caractere atual ou a linha inteira;
• y, yy: Copia (puxa) o (s) personagem (s) ou a linha inteira;
• p, P: Cole o conteúdo copiado, antes ou depois da posição atual;
• u: Desfaça a última ação;
• Ctrl-R: Refaça a última ação;
• ZZ: Feche e salve;
• ZQ: Feche e não salve.

Se precedido por um número, o comando será executado o mesmo número de vezes. Por
exemplo, pressione 3yy para copiar a linha atual mais as duas seguintes, pressione d5w para
excluir a palavra atual e as 4 palavras seguintes e assim por diante.

A maioria das tarefas de edição são combinações de vários comandos. Por exemplo, a sequência
de teclas vey é usada para copiar uma seleção começando na posição atual até o final da palavra
216 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

atual. A repetição de comandos também pode ser usada em combinações, então v3ey copiaria
uma seleção começando na posição atual até o final da terceira palavra a partir daí.

O vi pode organizar o texto copiado em registros, permitindo manter conteúdos distintos ao


mesmo tempo. Um registro é especificado por um caractere precedido por " e, uma vez criado,
é mantido até o final da sessão atual. A sequência de teclas “ly cria um registro contendo
a seleção atual, que será acessível por meio da tecla l. Então, o registro l pode ser colado
com”lp.

Também existe uma maneira de definir marcas personalizadas em posições arbitrárias ao


longo do texto, tornando mais fácil alternar rapidamente entre elas. As marcas são criadas
pressionando a tecla m e, em seguida, uma tecla para endereçar a posição atual. Feito isso, o
cursor voltará para a posição marcada quando ’ seguido pela tecla escolhida for pressionada.

Qualquer sequência de teclas pode ser gravada como uma macro para execução futura. Uma
macro pode ser gravada, por exemplo, para colocar um texto selecionado entre aspas duplas.
Primeiro, uma string de texto é selecionada e a tecla q é pressionada, seguida por uma tecla de
registro para associar a macro, como d. A linha recording @d aparecerá na linha de rodapé,
indicando que a gravação está ativada. Presume-se que algum texto já esteja selecionado,
então o primeiro comando é x para remover (e copiar automaticamente) o texto selecionado.
A tecla i é pressionada para inserir duas aspas duplas na posição atual e, em seguida, Esc
retorna ao modo normal. O último comando é P, para inserir novamente a seleção excluída
imediatamente antes da última aspa dupla. Pressionar q novamente encerrará a gravação.
Agora, uma macro que consiste na sequência de teclas x, i, "", Esc e P será executada
toda vez que as teclas @d forem pressionadas no modo normal, onde d é a tecla de registro
associada à macro.

No entanto, a macro estará disponível apenas durante a sessão atual. Para tornar as macros
persistentes, elas devem ser armazenadas no arquivo de configuração. Como a maioria das
distribuições modernas usa o vim como editor compatível com o vi, o arquivo de configuração
do usuário é /.vimrc. Dentro de /.vimrc, a linha let @d = ‘xi"" P’ definirá o registro d para
a sequência de teclas entre aspas simples. O mesmo registro atribuído anteriormente a uma
macro pode ser usado para colar sua sequência de teclas.

Comandos de dois pontos


O modo normal também oferece suporte a outro conjunto de comandos do vi: os comandos
de dois pontos. Os comandos de dois pontos, como o nome indica, são executados após
pressionar a tecla de dois pontos : no modo normal. Os comandos de dois pontos permitem
ao usuário realizar pesquisas, salvar, sair, executar comandos do shell, alterar as configurações
do vi etc. Para voltar ao modo normal, o comando :visual deve ser executado ou a tecla
217 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Enter pressionada sem nenhum comando. Alguns dos comandos de dois pontos mais comuns
são indicados aqui (a inicial não faz parte do comando):

• :s/REGEX/TEXT/g: Substitui todas as ocorrências da expressão regular REGEX por


TEXT na linha atual. Ele aceita a mesma sintaxe do comando sed, incluindo endereços;
• :!: Execute o seguinte comando shell;
• :quit ou :q: Saia do programa;
• :quit! ou :q!: Saia do programa sem salvar;
• :wq: Salvar e sair;
• :exit ou :x ou :e: Salve e saia, se necessário;
• :visual: Volte para o modo de navegação.

O programa vi padrão é capaz de fazer a maioria das tarefas de edição de texto, mas qualquer
outro editor não gráfico pode ser usado para editar arquivos de texto no ambiente shell.

Usuários iniciantes podem ter dificuldade em memorizar as teclas de comando do vi


de uma só vez.

As distribuições que adotam o vim também possuem o comando vimtutor, que usa
o próprio vim para abrir um guia passo a passo das principais atividades.

O arquivo é uma cópia editável que pode ser usada para praticar os comandos e
progressivamente se acostumar com eles.

Editores Alternativos
Os usuários não familiarizados com o vi podem ter dificuldade em se adaptar a ele, pois seu
funcionamento não é intuitivo. Uma alternativa mais simples é o GNU nano, um pequeno
editor de texto que oferece todos os recursos básicos de edição de texto, como desfazer/re-
fazer, coloração de sintaxe, busca e substituição interativa, recuo automático, números de
linha, completamento de palavras, bloqueio de arquivo, arquivos de backup e apoio à interna-
cionalização. Ao contrário do vi, todos os pressionamentos de tecla são apenas inseridos no
documento que está sendo editado. Os comandos no nano são dados usando a tecla Ctrl ou
a tecla Meta (dependendo do sistema, Meta é Alt ou ).

• Ctrl-6 ou Meta-A.: Inicie uma nova seleção. Também é possível criar uma seleção
pressionando Shift e movendo o cursor;
218 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

• Meta-6: Copie a seleção atual;


• Ctrl-K: Corte a seleção atual;
• Ctrl-U: Cole o conteúdo copiado;
• Meta-U: Desfazer;
• Meta-E: Refazer;
• Ctrl-T: Inicie uma sessão de verificação ortográfica para o documento ou seleção atual.

Emacs é outro editor de texto muito popular para o ambiente de shell. Enquanto o texto
é inserido apenas digitando-o, como no nano, a navegação pelo documento é auxiliada por
comandos do teclado, como no vi. O Emacs inclui muitos recursos que o tornam mais do
que apenas um editor de texto. É também um IDE (ambiente de desenvolvimento integrado)
capaz de compilar, executar e testar programas. O Emacs pode ser configurado como um
cliente de email, notícias ou RSS, tornando-o um pacote de produtividade autêntico.

O próprio shell executará um editor de texto padrão, geralmente o vi, sempre que necessário.
Este é o caso, por exemplo, quando crontab -e é executado para editar cronjobs. O Bash usa
as variáveis de sessão VISUAL ou EDITOR para descobrir o editor de texto padrão para o
ambiente do shell. Por exemplo, o comando export EDITOR=nano define o nano como o
editor de texto padrão na sessão shell atual. Para tornar essa mudança persistente nas sessões,
o comando deve ser incluído em ~/.bash_profile.
219 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Talvez isso possa te ajudar. . .

Fig. 21.3: VIM CHEATSHEETS

• Fonte: https://medium.com/usevim/vim-cheat-sheet-poster-2745f2b2162c # 104.1:


Criação de partições e sistemas de arquivos

Introdução
Não adianta. . . para se ter um sistema operacional, um disco precisa com certeza ser par-
ticionado antes de poder ser usado. Uma partição é um subconjunto lógico do disco físico;
as informações sobre as partições são armazenadas em uma tabela de partições. Essa tabela
inclui informações sobre o primeiro e o último setores da partição e seu tipo, além de mais
detalhes sobre cada partição.

Normalmente, cada partição é vista por um sistema operacional como um “disco” separado,
mesmo que todas residam na mesma mídia física. Nos sistemas Windows, elas recebem letras
220 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

como C: (historicamente o disco principal), D: e assim por diante. No Linux, cada partição
recebe um diretório em /dev, como /dev/sda1 ou /dev/sda2.

Entendendo MBR e GPT


Existem duas maneiras principais de armazenar informações sobre partições em discos rígidos.
A primeira é o MBR (Master Boot Record, ou Registro Mestre de Inicialização) e a segunda
é a GPT (GUID Partition Table, ou Tabela de Partição GUID).

• MBR: Um remanescente dos primeiros dias do MS-DOS (mais especificamente, o PC-


DOS 2.0 de 1983) que, por décadas, foi o esquema de particionamento padrão dos PCs.
A tabela de partição é armazenada no primeiro setor de um disco, chamado setor de ini-
cialização, junto com um carregador de inicialização, que em sistemas Linux geralmente
é o bootloader GRUB. Mas o MBR tem uma série de limitações que dificultam seu uso
em sistemas modernos, como a incapacidade de endereçar discos com mais de 2 TB de
tamanho e o limite de apenas 4 partições primárias por disco;
• GUID: Um sistema de particionamento que aborda muitas das limitações do MBR. Não
há limite prático para o tamanho do disco, e o número máximo de partições é limitado
apenas pelo próprio sistema operacional. É mais comumente encontrado em máquinas
mais modernas que usam UEFI em vez da antiga BIOS.

Durante as tarefas de administração do sistema, é bastante possível que você encontre ambos
os esquemas em uso, por isso é importante saber como usar as ferramentas associadas a cada
um para criar, excluir ou modificar partições.

Gerenciando partições MBR com o FDISK


O utilitário padrão para gerenciar partições MBR no Linux é o fdisk. Trata-se de um utilitário
interativo com menu. Para usá-lo, digite fdisk seguido pelo nome do dispositivo correspon-
dente ao disco que deseja editar. Por exemplo, o comando

root@debian10:/home/debian/4linux# fdisk /dev/sda

serve para editar a tabela de partição do primeiro dispositivo conectado por SATA (sda) no
sistema. Lembre-se de que é preciso especificar o dispositivo correspondente ao disco físico,
não uma de suas partições (como /dev/sda1).
221 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Todas as operações de disco desta lição devem ser realizadas com o usuário root (o
administrador do sistema), ou com privilégios de root usando sudo.

Quando invocado, fdisk mostra uma saudação seguida de um aviso e espera pelos seus co-
mandos.

root@debian10:/home/debian/4linux# fdisk /dev/sda


Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help):

O aviso é importante. Você pode criar, editar ou remover partições à vontade, mas nada será
gravado no disco a menos que você use o comando write (w). Assim, você pode “praticar”
sem o risco de perder dados, desde que mantenha distância da tecla w. Para sair do fdisk sem
salvar as alterações, use o comando q.

Dito isso, jamais pratique em um disco importante, pois sempre haverá riscos. Use
um disco externo sobressalente ou um pendrive.

Imprimindo a tabela de partição atual

O comando p é usado para imprimir a tabela de partição atual. A saída é mais ou menos
assim:

Command (m for help): p


Disk /dev/sda: 111.8 GiB, 120034123776 bytes, 234441648 sectors
Disk model: CT120BX500SSD1
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x97f8fef5

Device Boot Start End Sectors Size Id Type


/dev/sda1 4096 226048942 226044847 107.8G 83 Linux
/dev/sda2 226048944 234437550 8388607 4G 82 Linux swap / Solaris

Este é o significado de cada coluna:

• Device: O dispositivo atribuído à partição;


222 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

• Boot: Mostra se a partição é “inicializável” ou não;


• Start: O setor em que a partição começa;
• End: O setor em que a partição termina;
• Sectors: O número total de setores na partição. Deve ser multiplicado pelo tamanho
dos setores para se obter o tamanho da partição em bytes;
• Size: O tamanho da partição em formato “legível por humanos”. No exemplo acima,
os valores estão em gigabytes;
• Id: O valor numérico que representa o tipo de partição;
• Type: A descrição do tipo de partição.

Partições primárias e estendidas

Em um disco MBR, podemos ter 2 tipos principais de partições, primária e estendida. Como já
dissemos, só é possível ter 4 partições primárias no disco e, para que o disco seja “inicializável”,
a primeira partição deve ser primária.

Uma maneira de contornar essa limitação é criar uma partição estendida que atue como um
contêiner para partições lógicas. Seria possível ter, por exemplo, uma partição primária, uma
partição estendida ocupando o restante do espaço em disco e cinco partições lógicas dentro
dela.

Para um sistema operacional como o Linux, as partições primárias e estendidas são tratadas
exatamente da mesma maneira, então não há “vantagens” em se usar uma ou outra.

Criando uma partição

Para criar uma partição, use o comando n. Por padrão, as partições serão criadas no início
do espaço não alocado no disco. Você será questionado sobre o tipo de partição (primária ou
estendida), primeiro setor e último setor.

Para o primeiro setor, geralmente podemos aceitar o valor padrão sugerido pelo fdisk, a menos
que você precise que uma partição inicie em um setor específico. Em vez de especificar o último
setor, dá para especificar um tamanho seguido das letras K, M, G, T ou P (Kilo, Mega, Giga,
Tera ou Peta). Assim, se você quiser criar uma partição de 1 GB, pode especificar +1G como
Last sector e o fdisk redimensiona a partição de acordo. Veja este exemplo para a criação de
uma partição primária:

Command (m for help): n


Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-3903577, default 2048): 2048
223 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-3903577, default 3903577): +1G

Verificando o espaço não alocado

Se você não souber quanto espaço livre resta no disco, pode usar o comando F para mostrar
o espaço não alocado, desta maneira:

Command (m for help): F


Unpartitioned space /dev/sdd: 881 MiB, 923841536 bytes, 1804378 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes

Start End Sectors Size


2099200 3903577 1804378 881M

Removendo partições

Para remover uma partição, use o comando d. O fdisk irá pedir o número da partição a
remover, a menos que haja apenas uma partição no disco. Neste caso, essa partição será
selecionada e excluída imediatamente.

Esteja ciente de que se você excluir uma partição estendida, todas as partições lógicas dentro
dela também serão excluídas.

Lacunas

Tenha em mente que, ao criar uma nova partição com fdisk, o tamanho máximo será limitado
pela quantidade máxima de espaço contíguo não alocado no disco. Digamos, por exemplo,
que você tenha o seguinte mapa de partições:

Device Boot Start End Sectors Size Id Type


/dev/sdd1 2048 1050623 1048576 512M 83 Linux
/dev/sdd2 1050624 2099199 1048576 512M 83 Linux
/dev/sdd3 2099200 3147775 1048576 512M 83 Linux

Em seguida, você exclui a partição 2 e verifica o espaço livre:

Command (m for help): F


Unpartitioned space /dev/sdd: 881 MiB, 923841536 bytes, 1804378 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
224 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Start End Sectors Size


1050624 2099199 1048576 512M
3147776 3903577 755802 369M

Somando o tamanho do espaço não alocado, em teoria teríamos 881 MB disponíveis. Mas
veja o que acontece quando tentamos criar uma partição de 700 MB:

Command (m for help): n


Partition type
p primary (2 primary, 0 extended, 2 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2,4, default 2): 2
First sector (1050624-3903577, default 1050624):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (1050624-2099199, default 2099199): +700M
Value out of range.

Isso acontece porque o maior espaço contíguo não alocado no disco é o bloco de 512 MB que
pertencia à partição 2. Sua nova partição não pode “pular por cima” da partição 3 para usar
parte do espaço não alocado existente depois dela.

Mudando o tipo da partição

Ocasionalmente, pode ser necessário alterar o tipo da partição, especialmente ao lidar com
discos que serão usados em outros sistemas operacionais e plataformas. Isso é feito com o
comando t, seguido pelo número da partição que se deseja alterar.

O tipo de partição deve ser especificado por seu código hexadecimal correspondente. Para ver
uma lista de todos os códigos válidos, use o comando l.

Não confunda o tipo de partição com o sistema de arquivos usado nela. Embora no início
houvesse uma relação entre eles, hoje não é possível presumir que isso seja verdade. Uma
partição Linux, por exemplo, pode conter qualquer sistema de arquivos nativo do Linux, como
ext4 ou ReiserFS.

As partições do Linux são do tipo 83 (Linux). As partições de troca são do tipo 82


(Linux Swap).
225 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Gerenciando partições GUID com o GDISK


O utilitário gdisk é o equivalente do fdisk para lidar com discos particionados GPT. Na verdade,
a interface foi criada a partir do fdisk, com um prompt interativo e os mesmos comandos (ou
muito semelhantes).

Imprimindo a tabela de partição atual

O comando p é usado para imprimir a tabela de partição atual. A saída é mais ou menos
assim:

Command (? for help): p


Disk /dev/sdb: 3903578 sectors, 1.9 GiB
Model: DataTraveler 2.0
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): AB41B5AA-A217-4D1E-8200-E062C54285BE
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 3903544
Partitions will be aligned on 2048-sector boundaries
Total free space is 1282071 sectors (626.0 MiB)

Number Start (sector) End (sector) Size Code Name


1 2048 2099199 1024.0 MiB 8300 Linux filesystem
2 2623488 3147775 256.0 MiB 8300 Linux filesystem

Já de cara, notamos algumas coisas diferentes:

• Cada disco possui um Identificador de Disco (GUID) exclusivo. Este é um número


hexadecimal de 128 bits, atribuído aleatoriamente quando a tabela de partição é cri-
ada. Como há 3.4 Œ 1038 valores possíveis para esse número, as chances de que 2
discos aleatórios tenham o mesmo GUID são muito pequenas. O GUID pode ser us-
ado para identificar quais sistemas de arquivos montar no momento da inicialização (e
onde), eliminando a necessidade de usar o caminho do dispositivo para fazer isso (como
/dev/sdb);
• Notou a frase Partition table holds up to 128 entries? É isso mesmo, dá para ter até 128
partições em um disco GPT. Por causa disso, não há necessidade de partições primárias
e estendidas;
• O espaço livre é listado na última linha, então não precisamos de um equivalente ao
comando F do fdisk.

Criando uma partição

O comando para criar uma partição é n, assim como em fdisk. A principal diferença é que,
além do número da partição e do primeiro e último setores (ou o tamanho), também podemos
226 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

especificar o tipo de partição durante a criação. As partições GPT suportam muitos mais tipos
do que as MBR. Para ver uma lista de todos os tipos suportados, use o comando L.

Removendo uma partição

Para excluir uma partição, digite d e o número da partição. Ao contrário do fdisk, a primeira
partição não será selecionada automaticamente se for a única no disco.

Em discos GPT, as partições podem ser facilmente reordenadas ou “classificadas” para evitar
lacunas na sequência de numeração. Para isso, basta usar o comando s. Por exemplo, imagine
um disco com a seguinte tabela de partição:

Number Start (sector) End (sector) Size Code Name


1 2048 2099199 1024.0 MiB 8300 Linux filesystem
2 2099200 2361343 128.0 MiB 8300 Linux filesystem
3 2361344 2623487 128.0 MiB 8300 Linux filesystem

Se excluirmos a segunda partição, a tabela fica assim:

Number Start (sector) End (sector) Size Code Name


1 2048 2099199 1024.0 MiB 8300 Linux filesystem
3 2361344 2623487 128.0 MiB 8300 Linux filesystem

Se usarmos o comando s, ela se torna:

Number Start (sector) End (sector) Size Code Name


1 2048 2099199 1024.0 MiB 8300 Linux filesystem
2 2361344 2623487 128.0 MiB 8300 Linux filesystem

Observe que a terceira partição se tornou a segunda.

Lacuna? Que lacuna?

Ao contrário dos discos MBR, ao criar uma partição em discos GPT, o tamanho não é limitado
pela quantidade máxima de espaço contíguo não alocado. Você pode usar até o último
pedacinho de um setor livre, não importa onde ele esteja localizado no disco.
227 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Opções de recuperação

Os discos GPT armazenam cópias de backup do cabeçalho GPT e da tabela de partição,


facilitando a recuperação dos discos caso esses dados tenham sido danificados. O gdisk fornece
recursos para auxiliar nessas tarefas de recuperação, acessadas com o comando r.

Para reconstruir um cabeçalho GPT principal corrompido ou uma tabela de partição, usamos
b e c, respectivamente, ou usamos o cabeçalho principal e a tabela para reconstruir um backup
com d e e. Também dá para converter um MBR em GPT com f e fazer o oposto com g,
entre outras operações. Digite ? no menu de recuperação para obter uma lista de todos os
comandos de recuperação disponíveis e descrições sobre o que eles fazem.

Criando sistemas de arquivos


O particionamento é apenas o primeiro passo para poder usar um disco. Depois disso, é
necessário formatar a partição com um sistema de arquivos antes que se possa usá-lo para
armazenar dados.

Um sistema de arquivos controla como os dados são armazenados e acessados no disco. O


Linux suporta muitos sistemas de arquivos, alguns nativos, como a família ext (Extended
Filesystem), enquanto outros vêm de outros sistemas operacionais como o FAT do MS-DOS,
o NTFS do Windows NT, HFS e HFS + do Mac OS etc.

A ferramenta padrão usada para criar um sistema de arquivos no Linux é o mkfs, que vem em
muitos “sabores” de acordo com o sistema de arquivos com o qual ele precisa trabalhar.

Criando um sistema de arquivos ext2/ext3/ext4


O Extended Filesystem (ext) foi o primeiro sistema de arquivos para Linux, tendo sido sub-
stituído ao longo dos anos por novas versões chamadas ext2, ext3 e ext4. Este último é
atualmente o sistema de arquivos padrão de muitas distribuições Linux.

Os utilitários mkfs.ext2, mkfs.ext3 e mkfs.ext4 são usados para criar sistemas de arquivos ext2,
ext3 e ext4. De fato, todos esses “utilitários” existem apenas como links simbólicos para outro
utilitário chamado mke2fs. O mke2fs altera seus padrões de acordo com o nome pelo qual é
chamado. Dessa forma, todos eles têm o mesmo comportamento e parâmetros na linha de
comando.

A forma de uso mais simples é:

root@debian10:/home/debian/4linux# mkfs.ext2 TARGET


228 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Onde TARGET é o nome da partição na qual o sistema de arquivos deve ser criado. Por
exemplo, para criar um sistema de arquivos ext3 em /dev/sdb1, o comando seria:

root@debian10:/home/debian/4linux# mkfs.ext3 /dev/sdb1

Em vez de usar o comando correspondente ao sistema de arquivos que deseja criar, você pode
passar o parâmetro -t para mke2fs seguido do nome do sistema de arquivos. Por exemplo, os
comandos a seguir são equivalentes e irão criar um sistema de arquivos ext4 em /dev/sdb1.

root@debian10:/home/debian/4linux# mkfs.ext4 /dev/sdb1


root@debian10:/home/debian/4linux# mke2fs -t ext4 /dev/sdb1

Parâmetros de linha de comando O mke2fs suporta uma ampla gama de parâmetros e opções
de linha de comando. Eis alguns dos mais significativos. Todos eles também se aplicam a
mkfs.ext2, mkfs.ext3 e mkfs.ext4:

• -b SIZE: Define o tamanho dos blocos de dados no dispositivo para SIZE, que pode ser
de 1024, 2048 ou 4096 bytes por bloco;
• -c: Verifica se existem blocos defeituosos no dispositivo de destino antes de criar o
sistema de arquivos. Para fazer uma verificação mais detalhada, porém muito mais
lenta, aplique esse parâmetro duas vezes, como em mkfs.ext4 -c -c TARGET;
• -d DIRECTORY: Copia o conteúdo do diretório especificado para a raiz do novo
sistema de arquivos. Útil quando se precisa “pré-preencher” o disco com um conjunto
de arquivos predefinido;
• -F: Perigo, Will Robinson! Esta opção força o mke2fs a criar um sistema de arquivos,
mesmo se as outras opções passadas para ele ou para o alvo forem perigosas ou não
fizerem nenhum sentido. Se especificado duas vezes (como em -F -F), pode inclusive
ser usado para criar um sistema de arquivos em um dispositivo montado ou em uso, o
que é uma coisa muito, mas muito ruim de se fazer;
• -L VOLUME_LABEL: Define o rótulo do volume conforme especificado em VOL-
UME_LABEL. Esse rótulo deve ter ao menos 16 caracteres;
• -n: Esta é uma opção utilíssima que simula a criação do sistema de arquivos e mostra
o que seria feito se executado sem a opção n. Pense nele como um modo de “teste”. É
bom verificar as coisas antes de realmente efetuar quaisquer alterações no disco;
• -q: Modo silencioso. O mke2fs será executado normalmente, mas não produzirá nen-
huma saída para o terminal. Útil ao executar mke2fs a partir de um script;
• -U ID: Este parâmetro define o UUID (Universally Unique Identifier, ou Identificador
único universal) de uma partição para o valor especificado como ID. Os UUIDs são
números de 128 bits em notação hexadecimal que servem para identificar uma partição
229 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

para o sistema operacional. Esse número é especificado como uma string de 32 dígitos
no formato 8-4-4-4-12, ou seja, 8 dígitos, hífen, 4 dígitos, hífen, 4 dígitos, hífen, 4
dígitos, hífen, 12 dígitos, como D249E380-7719-45A1-813C-35186883987E. Em vez de
um ID, você também pode especificar parâmetros como clear para remover o UUID do
sistema de arquivos, random para usar um UUID gerado aleatoriamente, ou time para
criar um UUID baseado em tempo;
• -V: Modo detalhado (ou verboso), exibe muito mais informações durante a operação
do que normalmente. Útil para fins de depuração.

Criando um sistema de arquivos XFS


O XFS é um sistema de arquivos de alto desempenho originalmente desenvolvido pela Silicon
Graphics em 1993 para seu sistema operacional IRIX. Graças a seu desempenho e recursos de
confiabilidade, ele é comumente usado para servidores e outros ambientes que exigem largura
de banda alta (ou garantida) do sistema de arquivos.

As ferramentas para gerenciar os sistemas de arquivos XFS são parte do pacote xfsprogs.
Pode ser preciso instalar esse pacote manualmente, pois ele não vem incluído por padrão em
algumas distribuições Linux. Outras, como o Red Hat Enterprise Linux 7, usam o XFS como
sistema de arquivos padrão.

Os sistemas de arquivos XFS são divididos em pelo menos 2 partes, uma seção de log, onde
é mantido um log de todas as operações do sistema de arquivos (comumente chamadas de
Journal, ou diário), e a seção de dados. A seção de log pode estar localizada dentro da seção
de dados (que é o comportamento padrão), ou mesmo em um disco separado, para melhor
desempenho e confiabilidade.

O comando mais básico para criar um sistema de arquivos XFS é mkfs.xfs TARGET, onde
TARGET é a partição na qual você deseja que o sistema de arquivos seja criado. Por exemplo:
mkfs.xfs /dev/sda1.

Como no caso do mke2fs, o mkfs.xfs suporta uma série de opções de linha de comando. Eis
algumas das mais comuns:

• -b size=VALUE: Define o tamanho do bloco no sistema de arquivos, em bytes, para


aquele especificado em VALUE. O valor padrão é 4096 bytes (4 KiB), o mínimo é 512
e o máximo é 65536 (64 KiB);
• -m crc=VALUE: Os parâmetros iniciados com -m são opções de metadados. Este aqui
habilita (se VALUE for 1) ou desabilita (se VALUE for 0) o uso de verificações CRC32c
para checar a integridade de todos os metadados no disco. Isso permite uma melhor
detecção de erros e recuperação de travamentos relacionados a problemas de hardware
e, portanto, ele vem habilitado por padrão. O impacto dessa verificação no desempenho
230 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

costuma ser mínimo e, portanto, normalmente não há razão para desativá-lo;


• -m uuid=VALUE: Define o UUID da partição conforme o especificado em VALUE.
Lembre-se de que UUIDs são números de 32 caracteres (128 bits) em base hexadecimal,
especificados em grupos de 8, 4, 4, 4 e 12 dígitos separados por hifens, como 1E83E3A3-
3AE9-4AAC-BF7E-29DFFECD36C0;
• -f: Força a criação de um sistema de arquivos no dispositivo de destino, mesmo se um
sistema de arquivos for detectado nele;
• -l logdev=DEVICE: Coloca a seção de log do sistema de arquivos no dispositivo
especificado, em vez de dentro da seção de dados;
• -l size=VALUE: Define o tamanho da seção de log conforme o especificado em VALUE.
O tamanho pode ser especificado em bytes, e também é possível usar sufixos como m
ou g. -l size=10m, por exemplo, limita a seção de log a 10 Megabytes;
• -q: Modo silencioso. Neste modo, o mkfs.xfs não imprime os parâmetros do sistema de
arquivos que está sendo criado;
• -L LABEL: Define o rótulo do sistema de arquivos, que pode ter no máximo 12 carac-
teres;
• -N: Semelhante ao parâmetro -n do mke2fs, faz com que o mkfs.xfs exiba todos os
parâmetros para a criação do sistema de arquivos, sem realmente criá-lo.

Criando um sistema de arquivos FAT ou VFAT


O sistema de arquivos FAT originou-se no MS-DOS e, ao longo dos anos, recebeu muitas
revisões, culminando no formato FAT32 lançado em 1996 com o Windows 95 OSR2.

O VFAT é uma extensão do formato FAT16 com suporte para nomes de arquivo longos (até 255
caracteres). Ambos os sistemas de arquivos são controlados pelo mesmo utilitário, mkfs.fat.
mkfs.vfat é um nome alternativo para ele.

O sistema de arquivos FAT tem desvantagens importantes que restringem seu uso em discos
grandes. O FAT16, por exemplo, suporta volumes de no máximo 4 GB e um tamanho máximo
de arquivo de 2 GB. O FAT32 aumenta o tamanho do volume para até 2 PB e o tamanho
máximo do arquivo para 4 GB. Por causa disso, os sistemas de arquivos FAT são hoje mais
comumente usados em pequenos drives USB ou cartões de memória (de até 2 GB), ou dispos-
itivos e sistemas operacionais legados que não oferecem suporte a sistemas de arquivos mais
avançados.

O comando mais básico para a criação de um sistema de arquivos FAT é mkfs.fat TARGET,
onde TARGET é a partição em que você deseja que o sistema de arquivos seja criado. Por
exemplo: mkfs.fat /dev/sdc1.

Como outros utilitários, o mkfs.fat suporta uma série de opções de linha de comando. Uma
231 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

lista completa com a descrição de cada opção pode ser lida no manual do utilitário, com o
comando man mkfs.fat. Abaixo estão as mais importantes:

• -c: Verifica se existem blocos defeituosos no dispositivo de destino antes de criar o


sistema de arquivos;
• -C FILENAME BLOCK_COUNT: Cria o arquivo especificado em FILENAME e em
seguida cria um sistema de arquivos FAT dentro dele, produzindo assim uma “imagem
de disco” vazia que pode ser posteriormente gravada em um dispositivo usando um
utilitário como o dd ou montada como um dispositivo de loopback. Ao usar esta opção,
o número de blocos no sistema de arquivos (BLOCK_COUNT) deve ser especificado
após o nome do dispositivo;
• -F SIZE: Seleciona o tamanho do FAT (File Allocation Table ou Tabela de Alocação de
Arquivos), entre 12, 16 ou 32, ou seja, entre FAT12, FAT16 ou FAT32. Se isso não for
especificado, o mkfs.fat seleciona a opção apropriada com base no tamanho do sistema
de arquivos;
• -n NAME: Define o rótulo do volume, ou nome, do sistema de arquivos. Pode ter até
11 caracteres e o padrão é sem nome;
• -v: Modo detalhado. Imprime muito mais informações do que o normal, útil para
depuração.

O mkfs.fat não pode criar um sistema de arquivos “iniciável”. De acordo com a página
de manual, “isso não é tão fácil quanto você pensa” e não será implementado.

Criando um sistema de arquivos exFAT


O exFAT é um sistema de arquivos criado pela Microsoft em 2006 que aborda uma das
limitações mais importantes do FAT32: o tamanho do arquivo e do disco. No exFAT, o
tamanho máximo do arquivo é de 16 exabytes (no FAT32 eram 4 GB) e o tamanho máximo
do disco é de 128 petabytes.

Como é bem suportado pelos três principais sistemas operacionais (Windows, Linux e macOS),
trata-se de uma boa escolha nos casos em que a interoperabilidade é necessária, como em
drives flash de grande capacidade, cartões de memória e discos externos. Na verdade, esse
é o sistema de arquivos padrão, conforme definido pela SD Association, para os cartões de
memória SDXC com mais de 32 GB.

O utilitário padrão para criar sistemas de arquivos exFAT é mkfs.exfat, que é um link para
mkexfatfs. O comando mais básico é mkfs.exfat TARGET, onde TARGET é a partição em
que você deseja que o sistema de arquivos seja criado. Por exemplo: mkfs.exfat /dev/sdb2.
232 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Ao contrário dos outros utilitários discutidos nesta lição, o mkfs.exfat tem pouquíssimas opções
de linha de comando. Elas são:

• -i VOL_ID: Define o ID do Volume para o valor especificado em VOL_ID. Este é um


número hexadecimal de 32 bits. Se não for definido, é criado um ID com base na hora
atual;
• -n NAME: Define o rótulo ou nome do volume. Pode ter até 15 caracteres e o padrão
é sem nome;
• -p SECTOR: Especifica o primeiro setor da primeira partição no disco. Este é um valor
opcional e o padrão é zero;
• -s SECTORS: Define o número de setores físicos por cluster de alocação. Deve ser
uma potência de dois, como 1, 2, 4, 8 e assim por diante.

Conhecendo melhor o sistema de arquivos Btrfs


O Btrfs (oficialmente o B-Tree Filesystem: pronuncia-se “Butter FS”, “Better FS” ou mesmo
“Butterfuss”, como preferir) é um sistema de arquivos que está em desenvolvimento desde 2007
especificamente para o Linux pela Oracle Corporation e outras empresas, incluindo Fujitsu,
Red Hat, Intel e SUSE, entre outras.

Existem muitos recursos que tornam o Btrfs atraente nos sistemas modernos em que é comum
haver grandes quantidades de armazenamento. Dentre esses recursos estão o suporte a múltip-
los dispositivos (incluindo striping, mirroring e striping + mirroring, como em uma configuração
RAID), compressão transparente, otimizações SSD, backups incrementais, instantâneos, des-
fragmentação online, verificações offline, suporte para subvolumes (com cotas), deduplicação
e muito mais.

Por ser um sistema de arquivos cópia em gravação (copy-on-write), ele é muito resistente a
travamentos. Além disso, o Btrfs é simples de usar e bem suportado por muitas distribuições
Linux. Algumas delas, como o SUSE, o usam como sistema de arquivos padrão.

Em um sistema de arquivos tradicional, quando você deseja sobrescrever parte de um


arquivo, os novos dados são colocados diretamente sobre os dados antigos que estão
substituindo. Em um sistema de arquivos cópia em gravação os novos dados são
gravados para liberar espaço em disco, em seguida os metadados originais do arquivo
são atualizados para se referir aos novos dados e somente então os dados antigos são
liberados, já que não são mais necessários. Isso reduz as chances de perda de dados
em caso de travamento, já que os dados antigos só são descartados depois que o
sistema de arquivos tem absoluta certeza de que não são mais necessários e os novos
dados estão no lugar.
233 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Criando um sistema de arquivos Btrfs

O utilitário mkfs.btrfs é usado para criar um sistema de arquivos Btrfs. Se o comando for usado
sem nenhuma opção, ele cria um sistema de arquivos Btrfs em um determinado dispositivo,
assim:

root@debian10:/home/debian/4linux# mkfs.btrfs /dev/sdb1

Caso não tenha o utilitário mkfs.btrfs em seu sistema, procure por btrfs-progs no
gerenciador de pacotes de sua distribuição.

Você pode usar -L para definir um rótulo (ou nome) para o seu sistema de arquivos. Os rótulos
Btrfs podem ter até 256 caracteres, exceto por quebras de linha:

root@debian10:/home/debian/4linux# mkfs.btrfs /dev/sdb1 -L "Novo Disco"

Coloque o rótulo entre aspas (como acima) se contiver espaços.

O Btrfs tem uma coisa peculiar: é possível incluir múltiplos dispositivos no comando mkfs.btrfs.
Quando passamos mais de um dispositivo, o sistema de arquivos se estenderá por todos os
dispositivos, numa configuração semelhante à de um RAID ou LVM. Para especificar como os
metadados serão distribuídos na matriz de disco, use o parâmetro -m. Os parâmetros válidos
são raid0, raid1, raid5, raid6, raid10, single e dup.

Por exemplo, para criar um sistema de arquivos abrangendo /dev/sdb1 e /dev/sdc1, concate-
nando as duas partições em uma maior, use:

root@debian10:/home/debian/4linux# mkfs.btrfs -d single -m single /dev/sdb /dev/sdc

Gerenciando Partições com o GNU Parted


O GNU Parted é um editor de partição muito poderoso (daí o nome) que pode ser usado para
criar, excluir, mover, redimensionar, resgatar e copiar partições. Ele trabalha com discos GPT
234 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

e MBR e é capaz de cobrir quase todas as suas necessidades de gerenciamento de disco.

Existem muitos front-ends gráficos que tornam o trabalho com o parted muito mais fácil,
como o GParted para ambientes de desktop baseados no GNOME e o KDE Partition Manager
para desktops KDE. No entanto, você deve aprender a usar o parted na linha de comando, já
que em uma configuração de servidor nunca podemos contar com a presença de um ambiente
gráfico.

Diferente de fdisk e gdisk, o parted faz alterações no disco imediatamente após o


comando ser emitido, sem esperar por outro comando para gravar as alterações. Ao
praticar, é aconselhável fazê-lo em um disco ou unidade flash vazio ou sobressalente,
para que não haja risco de perda de dados caso você cometa um erro.

A maneira mais simples de começar a usar o parted é digitando parted DEVICE, onde DEVICE
é o dispositivo que se deseja gerenciar (parted /dev/sdb). O programa inicia uma interface de
linha de comando interativa, como fdisk e gdisk, com um prompt (parted) para você inserir
os comandos.

root@debian10:/home/debian/4linux# parted /dev/sdb


GNU Parted 3.2
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.

(parted)

Tenha cuidado! Se você não especificar um dispositivo, o parted seleciona automati-


camente o disco primário (normalmente /dev/sda) para operar.

Selecionando discos
Para mudar para um disco diferente do especificado na linha de comando, usamos o comando
select, seguido pelo nome do dispositivo:

(parted) select /dev/sdb


Using /dev/sdb
235 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Obtendo informações
O comando print pode ser usado para obter mais informações sobre uma partição específica
ou até mesmo todos os dispositivos de bloco (discos) conectados ao seu sistema.

Para obter informações sobre a partição atualmente selecionada, basta digitar print:

(parted) print
Model: ATA CT120BX500SSD1 (scsi)
Disk /dev/sda: 120GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start End Size Type File system Flags


1 2097kB 116GB 116GB primary ext4
2 116GB 120GB 4295MB primary linux-swap(v1)

Use print devices para obter uma lista de todos os dispositivos de bloco conectados ao seu
sistema:

(parted) print devices


/dev/sdb (1999MB)
/dev/sda (120GB)
/dev/sdc (320GB)
/dev/mapper/cryptswap (4294MB)

Para obter informações sobre todos os dispositivos conectados de uma vez, usamos print all.
Se quiser saber quanto espaço livre existe em cada um deles, o comando é print free:

(parted) print free


Model: ATA CT120BX500SSD1 (scsi)
Disk /dev/sda: 120GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start End Size Type File system Flags


32.3kB 2097kB 2065kB Free Space
1 2097kB 116GB 116GB primary ext4
116GB 116GB 512B Free Space
2 116GB 120GB 4295MB primary linux-swap(v1)
120GB 120GB 2098kB Free Space
236 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Criando uma tabela de partição em um disco vazio


Para criar uma tabela de partição em um disco vazio, use o comando mklabel, seguido pelo
tipo de tabela de partição que deseja usar.

Existem muitos tipos suportados de tabelas de partição, mas os principais que você deve
conhecer são msdos, usado aqui para se referir a uma tabela de partição MBR, e gpt para se
referir a uma tabela de partição GPT. Para criar uma tabela de partição MBR, digite:

(parted) mklabel msdos

E para criar uma tabela de partição GPT, o comando é:

(parted) mklabel gpt

Criando uma partição


Para criar uma partição, usamos o comando mkpart com a sintaxe mkpart PARTTYPE
FSTYPE START END, onde:

• PARTTYPE: É o tipo de partição, que pode ser primary, logical ou extended no caso
de uma tabela de partição MBR;
• FSTYPE: Especifica qual sistema de arquivos será usado nesta partição. Note que
parted não cria o sistema de arquivos. Ele apenas define um sinalizador na partição que
informa ao sistema operacional que tipo de dados esperar dela;
• START: Especifica o ponto exato no dispositivo onde a partição começa. Você pode
usar unidades diferentes para especificar esse ponto. 2s pode ser usado para se referir
ao segundo setor do disco, ao passo que 1m se refere ao início do primeiro megabyte do
disco. Outras unidades comuns são B (bytes) e % (porcentagem do disco);
• END: Especifica o fim da partição. Observe que este não é o tamanho da partição,
este é o ponto no disco onde ele termina. Por exemplo, se você especificar 100m, a
partição terminará 100 MB após o início do disco. Podemos usar as mesmas unidades
do parâmetro START.

Assim, o comando:

(parted) mkpart primary ext4 1m 100m


237 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Cria uma partição primária do tipo ext4, começando no primeiro megabyte do disco e termi-
nando após o 100ž megabyte.

Removendo uma partição


Para remover uma partição, use o comando rm seguido pelo número da partição, que você
pode exibir usando o comando print. Portanto, rm 2 removeria a segunda partição no disco
atualmente selecionado.

Recuperando partições
O parted é capaz de recuperar uma partição excluída. Considere que temos a seguinte estrutura
de partição:

Number Start End Size File system Name Flags


1 1049kB 99.6MB 98.6MB ext4 primary
2 99.6MB 200MB 100MB ext4 primary
3 200MB 300MB 99.6MB ext4 primary

Por acidente, você removeu a partição 2 usando rm 2. Para recuperá-la, pode-se usar o
comando rescue, com a sintaxe rescue START END, onde START é o local aproximado onde
a partição começava e END o local aproximado onde terminava.

O parted irá analisar o disco em busca de partições e se oferecer para restaurar as que forem
encontradas. No exemplo acima, a partição 2 começava em 99,6 MB e terminava em 200
MB. Portanto, você pode usar o seguinte comando para recuperar a partição:

(parted) rescue 90m 210m


Information: A ext4 primary partition was found at 99.6MB -> 200MB.
Do you want to add it to the partition table?

Yes/No/Cancel? y

A partição e seu conteúdo serão recuperados dessa forma. Note que o rescue só pode recuperar
partições em que haja um sistema de arquivos instalado. Partições vazias não são detectadas.

Criando partições de troca


No Linux, o sistema pode passar páginas de memória da RAM para o disco conforme necessário,
armazenando-as em um espaço separado, geralmente implementado como uma partição sep-
238 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

arada em um disco, chamada de partição de troca ou simplesmente troca (swap, em inglês).


Esta partição precisa ser de um tipo específico e configurada com um utilitário apropriado
(mkswap) antes de poder ser usada.

Para criar a partição swap usando fdisk ou gdisk, proceda como se estivesse criando uma
partição normal, conforme explicado anteriormente. A única diferença é que você precisará
alterar o tipo de partição para Linux swap.

• No fdisk, use o comando t. Selecione a partição que deseja usar e mude seu tipo para
82. Grave as alterações no disco e saia com w;
• No gdisk, o comando para alterar o tipo de partição também é t, mas o código é 8200.
Grave as alterações no disco e saia com w.

Se estiver usando o parted, a partição deve ser identificada como uma partição de troca
durante a criação, apenas use linux-swap como tipo de sistema de arquivos. Por exemplo, o
comando para criar uma partição de troca de 500 MB, começando com 300 MB no disco é:

(parted) mkpart primary linux-swap 301m 800m

Assim que a partição for criada e devidamente identificada, basta usar mkswap seguido do
dispositivo que representa a partição que deseja usar, como:

root@debian10:/home/debian/4linux# mkswap /dev/sda2

Para habilitar a troca nesta partição, use swapon seguido do nome do dispositivo:

root@debian10:/home/debian/4linux# swapon /dev/sda2

Da mesma forma, swapoff, seguido pelo nome do dispositivo, desabilita a troca naquele dis-
positivo.

O Linux também suporta o uso de arquivos de troca em vez de partições. Basta criar um
arquivo vazio do tamanho que desejar usando dd e então usar mkswap e swapon tendo esse
arquivo como destino.

Os comandos a seguir criam um arquivo de 1 GB chamado myswap no diretório atual,


preenchido com zeros, e então o configuram e habilitam como um arquivo de troca.
239 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

Crie o arquivo de troca:

$ dd if=/dev/zero of=myswap bs=1M count=1024


1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 7.49254 s, 143 MB/s

if = é o arquivo de entrada, a fonte dos dados que serão gravados no arquivo. Neste caso, é o
dispositivo /dev/zero, que fornece tantos caracteres NULL quanto solicitados. of = é o arquivo
de saída, o arquivo que será criado. bs = é o tamanho dos blocos de dados, especificados aqui
em Megabytes, e count = é a quantidade de blocos a serem gravados na saída. 1.024 blocos
de 1 MB cada equivalem a 1 GB.

root@debian10:/home/debian/4linux# mkswap myswap


Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=49c53bc4-c4b1-4a8b-a613-8f42cb275b2b

root@debian10:/home/debian/4linux# swapon myswap

Usando os comandos acima, este arquivo de troca será usado apenas durante a sessão atual
do sistema. Se a máquina for reinicializada, o arquivo ainda estará disponível, mas não será
carregado automaticamente. Você pode automatizar esse processo adicionando o novo arquivo
de troca a /etc/fstab, que discutiremos em uma lição posterior.

Tanto o mkswap quanto o swapon vão reclamar se seu arquivo de troca tiver per-
missões inseguras. O sinalizador de permissão de arquivo recomendado é 0600. O
proprietário e o grupo devem ser root.

Resumo
Nesta lição, você aprendeu:

• Como criar uma tabela de partição MBR em um disco com fdisk e como usá-la para
criar e deletar partições;
• Como criar uma tabela de partição MBR em um disco com gdisk e como usá-la para
criar e deletar partições;
• Como criar partições ext2, ext3, ext4, XFS, VFAT e exFAT;
• Como usar o parted para criar, excluir e recuperar partições em discos MBR e GPT;
• Como usar e redimensionar partições ext2, ext3, ext4 e Brts;
240 21. 103.6 Modificar as prioridades de execução do processo
Fabio Gonçalves De Melo Santana / [email protected]

• Como criar, configurar e ativar partições de swap e arquivos de swap.

Os seguintes comandos foram abordados nesta lição:

• fdisk
• gdisk
• mkfs.ext2, mkfs.ext3, mkfs.ext4, mkfs.xfs, mkfs.vfat e mkfs.exfat
• parted
• btrfs
• mkswap
• swapon e swapoff

Tavez isso possa te ajudar

Fig. 21.4: COMPARACAO

• Fonte: https://devconnected.com/how-to-format-disk-partitions-on-linux/
Fabio Gonçalves De Melo Santana / [email protected]

22
104.2: Manutenção da
integridade dos sistemas de
arquivos

Introdução
Você sabia que o Linux tem suporte a journaling? Isso significa que cada operação é registrada
em um log interno antes de ser executada. Se a operação for interrompida devido a um erro
do sistema (como kernel panic, falha de energia etc.), ela pode ser reconstituída verificando-se
o diário, evitando assim a corrupção do sistema de arquivos e perda de dados.

Isso reduz muito a necessidade de verificações manuais do sistema de arquivos, mas elas
ainda podem ser necessárias. Conhecer as ferramentas utilizadas para isso (e os parâmetros
correspondentes) pode representar a diferença entre jantar em casa com a família ou passar a
noite na sala do servidor no trabalho.

Verificando o uso de disco


Existem dois comandos que podem ser usados para verificar quanto espaço está sendo usado,
e quanto resta em um sistema de arquivos. O primeiro é du, que significa “disk usage” (uso
do disco).

241
242 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

O du é recursivo por natureza. Em sua forma mais básica, o comando simplesmente mostra
quantos blocos de 1 Kilobyte estão sendo usados pelo diretório atual e todos os seus subdi-
retórios:

root@debian10:/home/debian# du
12944 .

Isso não é muito útil, então podemos solicitar uma saída maior e “legível por humanos”
adicionando o parâmetro -h:

root@debian10:/home/debian# du -h
13M .

Por padrão, o du só mostra a contagem de uso para os diretórios (considerando todos os


arquivos e subdiretórios dentro deles). Para mostrar uma contagem individual para todos os
arquivos no diretório, usamos o parâmetro -a:

root@debian10:/home/debian# du -ah
4.0K ./.gnupg/pubring.kbx
16K ./.gnupg
4.0K ./.profile
0 ./softlink
4.0K ./Videos
4.0K ./.vboxclient-seamless.pid
13M .

O comportamento padrão é mostrar o uso de cada subdiretório e, em seguida, o uso total do


diretório atual, incluindo subdiretórios:

root@debian10:/home/debian# du -h
16K ./.gnupg
4.0K ./Videos
13M .

No exemplo acima, podemos ver que o subdiretório Temp ocupa 4,8 MB e o diretório atual,
incluindo Temp, ocupa 6,0 MB. Mas quanto espaço os arquivos no diretório atual ocupam,
excluindo os subdiretórios? Para isso temos o parâmetro -S:

root@debian10:/home/debian# du -sh
243 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

13M .

Lembre-se de que os parâmetros da linha de comando diferenciam maiúsculas de


minúsculas: -s é diferente de -S.

Se quiser manter essa distinção entre o espaço usado pelos arquivos no diretório atual e o
espaço usado pelos subdiretórios, mas também quiser um total geral no final, você pode
adicionar o parâmetro -c:

root@debian10:/home/debian# du -Shc
4.0K ./.local/share/tracker
4.0K ./.local/share/gnome-shell
8.0K ./.local/share
4.0K ./.local
4.0K ./.gnupg/private-keys-v1.d
12K ./.gnupg
4.0K ./Videos
40K .
13M total

Para controlar a “profundidade” da saída de du, usamos o parâmetro -d N, onde N descreve


os níveis. Por exemplo, se usarmos o parâmetro -d 1, ele mostrará o diretório atual e seus
subdiretórios, mas não os subdiretórios deles.

Veja a diferença abaixo. Sem -d:

root@debian10:/home/debian/Documents# du -h
4.0K ./joatham/pedro
8.0K ./joatham
12K .

E limitando a profundidade a um nível com -d 1:

root@debian10:/home/debian/Documents# du -h -d1
8.0K ./joatham
12K .

Observe que, mesmo que pedro não esteja sendo mostrado, seu tamanho ainda está sendo
levado em consideração.
244 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Você pode querer excluir alguns tipos de arquivos da contagem, o que é feito com –exclude=“PATTERN”,
onde PATTERN é o padrão que deve ser correspondido. Considere este diretório:

root@debian10:/home/debian/Documents/joatham# du -ah
4.0K ./pedro
136K ./qualteupapo.bin
144K .

Agora, usamos –exclude para filtrar todos os arquivos com a extensão .bin:

root@debian10:/home/debian/Documents/joatham# du -ah --exclude="*.bin"


4.0K ./pedro
8.0K .

Observe que o total não reflete mais o tamanho dos arquivos excluídos.

Em busca de espaço livre


O du trabalha no nível dos arquivos. Existe outro comando que pode mostrar o uso do disco
e quanto espaço está disponível no nível dos sistemas de arquivos. Esse comando é df.

O comando df fornece uma lista de todos os sistemas de arquivos disponíveis (já montados)
em seu sistema, incluindo o tamanho total, quanto espaço foi usado, quanto espaço está
disponível, a porcentagem de uso e onde estão montados:

root@debian10:/home/debian/Documents/joatham# df
Filesystem 1K-blocks Used Available Use% Mounted on
udev 222304 0 222304 0% /dev
tmpfs 48660 2992 45668 7% /run
/dev/mapper/debian10--vg-root 23897936 3949320 18711624 18% /
tmpfs 243292 0 243292 0% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 243292 0 243292 0% /sys/fs/cgroup
/dev/mapper/debian10--vg-tmp 1886280 5816 1766596 1% /tmp
/dev/mapper/debian10--vg-var 9545920 791056 8250240 9% /var
/dev/mapper/debian10--vg-home 490307536 86904 465244660 1% /home
/dev/sda1 482922 59785 398203 14% /boot
tmpfs 48656 4648 44008 10% /run/user/1000

No entanto, dispor das informações de tamanho em blocos de 1 KB não é lá muito amigável.


Como no du, podemos adicionar os parâmetros -h para obter uma saída mais “legível por
humanos”:
245 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian/Documents/joatham# df -h
Filesystem Size Used Avail Use% Mounted on
udev 218M 0 218M 0% /dev
tmpfs 48M 3.0M 45M 7% /run
/dev/mapper/debian10--vg-root 23G 3.8G 18G 18% /
tmpfs 238M 0 238M 0% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 238M 0 238M 0% /sys/fs/cgroup
/dev/mapper/debian10--vg-tmp 1.8G 5.7M 1.7G 1% /tmp
/dev/mapper/debian10--vg-var 9.2G 773M 7.9G 9% /var
/dev/mapper/debian10--vg-home 468G 85M 444G 1% /home
/dev/sda1 472M 59M 389M 14% /boot
tmpfs 48M 4.6M 43M 10% /run/user/1000

Também podemos usar o parâmetro -i para mostrar os inodes usados/disponíveis, em vez dos
blocos:

root@debian10:/home/debian/Documents/joatham# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
udev 55576 408 55168 1% /dev
tmpfs 60823 711 60112 2% /run
/dev/mapper/debian10--vg-root 1525920 175187 1350733 12% /
tmpfs 60823 1 60822 1% /dev/shm
tmpfs 60823 5 60818 1% /run/lock
tmpfs 60823 17 60806 1% /sys/fs/cgroup
/dev/mapper/debian10--vg-tmp 121920 32 121888 1% /tmp
/dev/mapper/debian10--vg-var 610800 10873 599927 2% /var
/dev/mapper/debian10--vg-home 31203328 162 31203166 1% /home
/dev/sda1 124928 339 124589 1% /boot
tmpfs 60823 40 60783 1% /run/user/1000

Um parâmetro útil é -T, que também imprime o tipo de cada sistema de arquivos:

root@debian10:/home/debian/Documents/joatham# df -hT
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 218M 0 218M 0% /dev
tmpfs tmpfs 48M 3.0M 45M 7% /run
/dev/mapper/debian10--vg-root ext4 23G 3.8G 18G 18% /
tmpfs tmpfs 238M 0 238M 0% /dev/shm
tmpfs tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs tmpfs 238M 0 238M 0% /sys/fs/cgroup
/dev/mapper/debian10--vg-tmp ext4 1.8G 5.7M 1.7G 1% /tmp
/dev/mapper/debian10--vg-var ext4 9.2G 773M 7.9G 9% /var
/dev/mapper/debian10--vg-home ext4 468G 85M 444G 1% /home
/dev/sda1 ext2 472M 59M 389M 14% /boot
tmpfs tmpfs 48M 4.6M 43M 10% /run/user/1000

Conhecendo o tipo do sistema de arquivos, podemos filtrar a saída. A ideia é mostrar apenas
sistemas de arquivos de um determinado tipo com -t TYPE ou excluir sistemas de arquivos
246 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

de um determinado tipo com -x TYPE, como nos exemplos abaixo.

Excluindo os sistemas de arquivos tmpfs:

root@debian10:/home/debian/Documents/joatham# df -hx tmpfs


Filesystem Size Used Avail Use% Mounted on
udev 218M 0 218M 0% /dev
/dev/mapper/debian10--vg-root 23G 3.8G 18G 18% /
/dev/mapper/debian10--vg-tmp 1.8G 5.7M 1.7G 1% /tmp
/dev/mapper/debian10--vg-var 9.2G 773M 7.9G 9% /var
/dev/mapper/debian10--vg-home 468G 85M 444G 1% /home
/dev/sda1 472M 59M 389M 14% /boot

Exibindo apenas sistemas de arquivos ext4:

root@debian10:/home/debian/Documents/joatham# df -ht ext4


Filesystem Size Used Avail Use% Mounted on
/dev/mapper/debian10--vg-root 23G 3.8G 18G 18% /
/dev/mapper/debian10--vg-tmp 1.8G 5.7M 1.7G 1% /tmp
/dev/mapper/debian10--vg-var 9.2G 773M 7.9G 9% /var
/dev/mapper/debian10--vg-home 468G 85M 444G 1% /home

Também podemos personalizar a saída de df, selecionando o que deve ser exibido e em que
ordem, usando o parâmetro –output= seguido por uma lista separada por vírgulas dos campos
que desejamos exibir. Alguns dos campos disponíveis são:

• source: O dispositivo correspondente ao sistema de arquivos;


• fstype: O tipo de sistema de arquivos;
• size: O tamanho total do sistema de arquivos;
• used: Quanto espaço está sendo usado;
• avail: Quanto espaço está disponível;
• pcent: A porcentagem de uso;
• target: Onde o sistema de arquivos é montado (ponto de montagem).

Se quiser uma saída mostrando o destino, a fonte, o tipo e o uso, você pode usar:

root@debian10:/home/debian/Documents/joatham# df -h --output=target,source,fstype,pcent
Mounted on Filesystem Type Use%
/dev udev devtmpfs 0%
/run tmpfs tmpfs 7%
/ /dev/mapper/debian10--vg-root ext4 18%
/dev/shm tmpfs tmpfs 0%
/run/lock tmpfs tmpfs 1%
/sys/fs/cgroup tmpfs tmpfs 0%
/tmp /dev/mapper/debian10--vg-tmp ext4 1%
247 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

/var /dev/mapper/debian10--vg-var ext4 9%


/home /dev/mapper/debian10--vg-home ext4 1%
/boot /dev/sda1 ext2 14%
/run/user/1000 tmpfs tmpfs 10%

O df também pode ser usado para verificar as informações do inode, passando os seguintes
campos para –output=:

• itotal: O número total de inodes no sistema de arquivos;


• iused: O número de inodes usados no sistema de arquivos;
• iavail: O número de inodes disponíveis no sistema de arquivos;
• ipcent: A porcentagem de inodes usados no sistema de arquivos.

Por exemplo:

root@debian10:/home/debian/Documents/joatham# df -h --output=source,fstype,itotal,iused,
ipcent
Filesystem Type Inodes IUsed IUse%
udev devtmpfs 55K 408 1%
tmpfs tmpfs 60K 711 2%
/dev/mapper/debian10--vg-root ext4 1.5M 172K 12%
tmpfs tmpfs 60K 1 1%
tmpfs tmpfs 60K 5 1%
tmpfs tmpfs 60K 17 1%
/dev/mapper/debian10--vg-tmp ext4 120K 32 1%
/dev/mapper/debian10--vg-var ext4 597K 11K 2%
/dev/mapper/debian10--vg-home ext4 30M 162 1%
/dev/sda1 ext2 122K 339 1%
tmpfs tmpfs 60K 40 1%

Manutenção de sistemas de arquivos ext2, ext3 e ext4


Para procurar por erros em um sistema de arquivos (e, com sorte, corrigi-los), o Linux oferece
o utilitário fsck (pense em “filesystem check”, verificação do sistema de arquivos, e você nunca
mais esquecerá esse nome). Em sua forma mais básica, ele é invocado com fsck seguido da
localização do sistema de arquivos que se deseja verificar:

root@debian10:/home/debian# fsck /dev/sdb1

NUNCA execute fsck (ou utilitários relacionados) em um sistema de arquivos montado.


Se isso for feito, pode haver perda de dados.
248 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

O fsck em si não verifica o sistema de arquivos, mas apenas chama para isso o utilitário
apropriado para o tipo de sistema de arquivos em questão. No exemplo acima, como um
tipo de sistema de arquivos não foi especificado, o fsck pressupôs se tratar de um sistema de
arquivos ext2/3/4 por padrão, e chamou e2fsck.

Para especificar um sistema de arquivos, use a opção -t, seguida pelo nome do sistema de
arquivos, como em fsck -t vfat /dev/sdc. Alternativamente, podemos chamar diretamente um
utilitário específico ao sistema de arquivos, como o fsck.msdos para sistemas de arquivos FAT.

Digite fsck seguido por Tab duas vezes para ver uma lista de todos os comandos
relacionados em seu sistema.

O fsck aceita alguns argumentos de linha de comando. Estes são alguns dos mais comuns:

• -A: Verifica todos os sistemas de arquivos listados em /etc/fstab;


• -C: Exibe uma barra de progresso ao verificar um sistema de arquivos. Atualmente
funciona apenas em sistemas de arquivos ext2/3/4;
• -N: Imprime na tela o que seria feito e sai, sem de fato verificar o sistema de arquivos;
• -R: Quando usado em conjunto com -A, ele pula a verificação do sistema de arquivos
raiz;
• -V: Modo detalhado, imprime mais informações do que o normal durante a operação.
Útil para depuração.

O utilitário específico para sistemas de arquivos ext2, ext3 e ext4 é o e2fsck, também chamado
fsck.ext2, fsck.ext3 e fsck.ext4 (esses três são apenas links para e2fsck). Por padrão, ele é
executado no modo interativo: quando um erro é encontrado no sistema de arquivos, ele para
e pergunta ao usuário o que fazer. O usuário deve digitar y para corrigir o problema, n para
deixá-lo sem solução ou a para corrigir o problema atual e todos os subsequentes.

É claro que se sentar em frente a um terminal esperando o e2fsck perguntar o que fazer não é
um uso produtivo do seu tempo, especialmente se você estiver lidando com um grande sistema
de arquivos. Dessa forma, existem opções que fazem com que o e2fsck seja executado em
modo não interativo:

• -p: Essa opção tenta corrigir automaticamente quaisquer erros encontrados. Se for
encontrado um erro que requeira intervenção do administrador do sistema, o e2fsck
fornecerá uma descrição do problema e sairá;
• -y: Responde y (sim) a todas as questões;
• -n: O oposto de -y. Além de responder n (não) a todas as questões, faz com que
o sistema de arquivos seja montado somente para leitura e, portanto, não possa ser
modificado;
249 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

• -f: Força o e2fsck a verificar um sistema de arquivos mesmo se ele estiver marcado
como “limpo”, ou seja, que foi corretamente desmontado.

Ajustando um sistema de arquivos ext


Os sistemas de arquivos ext2, ext3 e ext4 têm diversos parâmetros que podem ser ajustados
ou “refinados” pelo administrador do sistema para melhor atender às necessidades do sistema.
O utilitário usado para exibir ou modificar esses parâmetros se chama tune2fs.

Para ver os parâmetros atuais de qualquer sistema de arquivos, use o parâmetro -l seguido
pelo dispositivo que representa a partição. O exemplo abaixo mostra a saída desse comando
na primeira partição do primeiro disco (/dev/sda1) de uma máquina:

root@debian10:/home/debian# tune2fs -l /dev/sda1


tune2fs 1.44.5 (15-Dec-2018)
Filesystem volume name: <none>
Last mounted on: /boot
Filesystem UUID: b1199388-b7a3-44ed-bd41-b814cd8989c1
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: ext_attr resize_inode dir_index filetype sparse_super large_file
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: not clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 124928
Block count: 498688
Reserved block count: 24934
Free blocks: 423137
Free inodes: 124589
First block: 1
Block size: 1024
Fragment size: 1024
Reserved GDT blocks: 256
Blocks per group: 8192
Fragments per group: 8192
Inodes per group: 2048
Inode blocks per group: 256
Filesystem created: Sat Feb 6 03:10:52 2021
Last mount time: Wed Jun 30 12:01:56 2021
Last write time: Wed Jun 30 12:01:56 2021
Mount count: 1
Maximum mount count: -1
Last checked: Wed Jun 30 12:01:55 2021
Check interval: 0 (<none>)
Lifetime writes: 170 MB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 128
Default directory hash: half_md4
Directory Hash Seed: 9d0b0f1a-8cca-4886-a92c-efbdb35b354d
250 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Os sistemas de arquivos ext têm contagens de montagem. A contagem é aumentada em 1 a


cada vez que o sistema de arquivos é montado, e quando um valor limite (a contagem máxima
de montagem) é alcançado, o sistema será verificado automaticamente com e2fsck na próxima
inicialização.

A contagem máxima de montagens pode ser definida com o parâmetro -c N, onde N é o número
de vezes que o sistema de arquivos pode ser montado sem ser verificado. O parâmetro -C
N define o número de vezes que o sistema foi montado com o valor de N. Observe que os
parâmetros da linha de comando diferenciam maiúsculas de minúsculas, então -c é diferente
de -C.

Também é possível definir um intervalo de tempo entre as verificações com o parâmetro -i,
seguido por um número e as letras d para dias, m para meses e y para anos. Por exemplo, -i
10d verificaria o sistema de arquivos na reinicialização seguinte a cada 10 dias. Use zero como
valor para desabilitar este recurso.

-L pode ser usado para definir um rótulo para o sistema de arquivos. Esse rótulo pode ter até
16 caracteres. O parâmetro -U define o UUID do sistema de arquivos, que é um número hex-
adecimal de 128 bits. No exemplo acima, o UUID é 6e2c12e3-472d-4bac-a257-c49ac07f3761.
Tanto o rótulo quanto o UUID podem ser usados no lugar do nome do dispositivo (como
/dev/sda1) para montar o sistema de arquivos.

A opção -e BEHAVIOUR define o comportamento do kernel quando um erro é encontrado no


sistema de arquivos. Existem três comportamentos possíveis:

• continue: Continua a execução normalmente;


• remount-ro: Remonta o sistema de arquivos como somente leitura;
• panic: Causa um kernel panic.

O comportamento padrão é continue. remount-ro pode ser útil em aplicativos com dados
sensíveis, pois irá interromper imediatamente as gravações no disco, evitando mais erros po-
tenciais.

Os sistemas de arquivos ext3 são basicamente sistemas de arquivos ext2 com um diário.
Usando o tune2fs, podemos adicionar um diário a um sistema de arquivos ext2, convertendo-o
assim em ext3. O procedimento é simples: basta passar o parâmetro -j para tune2fs, seguido
do dispositivo que contém o sistema de arquivos:

root@debian10:/home/debian# tune2fs -j /dev/sda1

Posteriormente, ao montar o sistema de arquivos convertido, não se esqueça de definir o tipo


251 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

para ext3 para que o diário possa ser usado.

Ao lidar com sistemas de arquivos com journaling, o parâmetro -J permite usar parâmetros
extras para definir algumas opções de diário, como -J size= para definir o tamanho do diário
(em megabytes), -J location= para especificar onde o diário deve ser armazenado (seja um
bloco específico ou uma posição específica no disco com sufixos como M ou G) e até mesmo
colocar o diário em um dispositivo externo com -J device=.

Para especificar diversos parâmetros ao mesmo tempo, eles devem ser separados por vírgula.
Por exemplo: -J size=10,location=100M,device=/dev/sdb1 criam um diário (Journal) de 10
MB na posição 100 MB do dispositivo /dev/sdb1.

O tune2fs tem uma opção de “força bruta”, -f, que o força a completar uma operação
mesmo que sejam encontrados erros. Nem é preciso dizer que esse recurso deve ser
usado com extrema cautela.

Manutenção de sistema de arquivos XFS


Para os sistemas de arquivos XFS, o equivalente a fsck é xfs_repair. Se você suspeitar que
algo está errado com o sistema de arquivos, a primeira coisa a fazer é verificar se ocorreram
danos.

Isso pode ser feito passando o parâmetro -n para xfs_repair, seguido pelo dispositivo que
contém o sistema de arquivos. O parâmetro -n significa “no modify”, o sistema de arquivos
será verificado e os erros relatados, mas nenhum reparo será feito:

root@debian10:/home/debian# xfs_repair -n /dev/sdb1

Se forem encontrados erros, você pode prosseguir com os reparos sem o parâmetro -n, da
seguinte forma: xfs_repair /dev/sdb1.

xfs_repair aceita uma série de opções de linha de comando. Dentre elas:

• -l LOGDEV and -r RTDEV: Necessários se o sistema de arquivos tem log externo


e seções em tempo real. Neste caso, substitua LOGDEV e RTDEV pelos dispositivos
correspondentes;
• -m N: Usado para limitar o uso de memória de xfs_repair para N megabytes, algo que
pode ser útil nas configurações do servidor. De acordo com a página do manual, por
padrão xfs_repair adapta seu uso de memória conforme necessário, até 75% da RAM
252 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

física do sistema;
• -d: O modo “dangerous” (perigoso) permite reparar sistemas de arquivos montados
como apenas leitura;
• -v: Você deve ter adivinhado: modo verboso. Cada vez que este parâmetro é usado,
a “verbosidade” é aumentada (por exemplo, -v -v imprime mais informações do que
apenas -v).

Observe que xfs_repair não é capaz de reparar sistemas de arquivos com um log “sujo”. É
possível “zerar” um log corrompido com o parâmetro -L, mas tenha em mente que este é um
último recurso, pois pode resultar em corrupção do sistema de arquivos e perda de dados.

Para depurar um sistema de arquivos XFS, o utilitário xfs_db pode ser usado, como em
xfs_db /dev/sdb1. Ele serve principalmente para inspecionar diversos elementos e parâmetros
do sistema de arquivos.

Este utilitário tem um prompt interativo, como o parted, com muitos comandos internos. Um
sistema de ajuda também está disponível: digite help para ver uma lista de todos os comandos,
e help seguido do nome do comando para ver mais informações sobre o comando.

Outro utilitário útil é o xfs_fsr, que pode ser usado para reorganizar (“desfragmentar”) um
sistema de arquivos XFS. Quando executado sem nenhum argumento extra, ele roda por duas
horas e tenta desfragmentar todos os sistemas de arquivos XFS graváveis e montados listados
no arquivo /etc/mtab/. Pode ser necessário instalar esse utilitário usando o gerenciador de
pacotes de sua distribuição Linux, pois ele nem sempre faz parte de uma instalação padrão.
Para obter mais informações, consulte a página do manual correspondente.

Resumo
Nesta lição, você aprendeu:

• Como verificar o espaço usado e livre em um sistema de arquivos;


• Como ajustar a saída de df para atender às suas necessidades;
• Como verificar a integridade e reparar um sistema de arquivos com fsck e e2fsck;
• Como ajustar um sistema de arquivos ext com tune2fs;
• Como verificar e reparar sistemas de arquivos XFS com xfs_repair.

Os seguintes comandos foram abordados nesta lição:

• du: Exibe a quantidade de espaço em disco em uso em um sistema de arquivos;


• df: Exibe a quantidade de espaço em disco disponível (livre) em um sistema de arquivos;
• fsck: Utilitário para verificação de erros do sistema de arquivos;
• e2fsck: Utilitário para verificação de erros específico aos sistemas de arquivos estendidos
253 22. 104.2: Manutenção da integridade dos sistemas de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

(ext2/3/4);
• tune2fs: Modifica parâmetros do sistema de arquivos em um sistema de arquivos es-
tendido (ext2/3/4);
• xfs_repair: Equivalente a fsck para sistemas de arquivos XFS;
• xfs_db: Utilitário usado para visualizar diversos parâmetros de um sistema de arquivos
XFS.

Tavez isso possa te ajudar. . .

- Fonte: https://twitter.com/b0rk/s-
tatus/1000953701090103302
Fabio Gonçalves De Melo Santana / [email protected]

23
104.3: Controlar a montagem e
desmontagem dos sistema de
arquivos

254
Fabio Gonçalves De Melo Santana / [email protected]

24
Introdução
Montar significa anexar o sistema de arquivos em um ponto específico da árvore de diretórios
do sistema, chamado ponto de montagem. Os sistemas de arquivos podem ser montados
manual ou automaticamente e há muitas maneiras de fazê-lo.

Montando e desmontando sistemas de arquivos


O comando para montar manualmente um sistema de arquivos é mount e sua sintaxe é:

mount -t TYPE DEVICE MOUNTPOINT

Onde:

• TYPE - O tipo de sistema de arquivos sendo montado (p. ex. ext4, btrfs, exfat, etc.);
• DEVICE - O nome da partição que contém o sistema de arquivos (p. ex. /dev/sdb1);
• MOUNTPOINT - Onde o sistema de arquivos será montado. O diretório de mon-
tagem não precisa estar vazio, embora precise existir. Porém, quaisquer arquivos que ele
contiver estarão inacessíveis por nome enquanto o sistema de arquivos estiver montado.

Por exemplo, para montar uma unidade flash USB contendo um sistema de arquivos exFAT
localizado em /dev/sdb1 em um diretório chamado flash em seu diretório inicial, você usaria:

255
256 24. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# mount -t exfat /dev/sdb1 ~/flash/

Após a montagem, o conteúdo do sistema de arquivos estará acessível no diretório ~/flash:

root@debian10:/home/debian# ls -lh ~/flash/


total 469M
-rwxrwxrwx 1 root root 454M jul 19 09:49 lineage-16.0-20190711-MOD-quark.zip
-rwxrwxrwx 1 root root 16M jul 19 09:44 twrp-3.2.3-mod_4-quark.img

Listando sistemas de arquivos montados


Se você digitar apenas mount, obterá uma lista de todos os sistemas de arquivos atualmente
montados em seu sistema. Essa lista pode ser bastante extensa, já que, além dos discos
anexados ao sistema, ela também conterá diversos sistemas de arquivos de tempo de execução
na memória que servem a vários propósitos. Se quiser filtrar a saída, use o parâmetro -t para
listar apenas os sistemas de arquivos do tipo correspondente, como abaixo:

root@debian10:/home/debian# mount -t ext4


/dev/sda1 on / type ext4 (rw,noatime,errors=remount-ro)

Podemos especificar vários sistemas de arquivos de uma vez, separando-os com uma vírgula:

root@debian10:/home/debian# mount -t ext4,fuseblk


/dev/sda1 on / type ext4 (rw,noatime,errors=remount-ro)
/dev/sdb1 on /home/debian/flash type fuseblk (rw,nosuid,nodev,relatime,user_id=0,group_id
=0,default_permissions,allow_other,blksize=4096) [DT_8GB]

A saída nos exemplos acima pode ser descrita no formato:

SOURCE on TARGET type TYPE OPTIONS

Onde SOURCE é a partição que contém o sistema de arquivos, TARGET é o diretório onde
ele está montado, TYPE é o tipo do sistema de arquivos e OPTIONS são as opções passadas
para o comando mount no momento da montagem.
257 24. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Parâmetros adicionais da linha de comando


Diversos parâmetros de linha de comando podem ser usados com mount. Alguns dos mais
frequentes são:

• -a - Monta todos os sistemas de arquivos listados no arquivo /etc/fstab (trataremos


disso na próxima seção);
• -o ou –options - Passa uma lista de opções de montagem separadas por vírgula para
o comando de montagem, que pode mudar a forma como o sistema de arquivos será
montado. Falaremos disso junto com /etc/fstab;
• -r ou -ro - Monta o sistema de arquivos como somente leitura;
• -w ou -rw - Monta o sistema de arquivos como gravável.

Para desmontar um sistema de arquivos, use o comando umount, seguido pelo nome do
dispositivo ou ponto de montagem. Considerando o exemplo acima, os comandos abaixo são
intercambiáveis:

root@debian10:/home/debian# umount /dev/sdb1


root@debian10:/home/debian# umount ~/flash

Alguns dos parâmetros da linha de comando para umount são:

• -a - Desmonta todos os sistemas de arquivos listados em /etc/fstab;


• -f - Força a desmontagem de um sistema de arquivos. Pode ser útil se você tiver
montado um sistema de arquivos remoto que se tornou inacessível;
• -r - Se o sistema de arquivos não puder ser desmontado, esse comando tenta torná-lo
somente leitura.

Como lidar com arquivos abertos


Ao desmontar um sistema de arquivos, pode aparecer a mensagem de erro target is busy. Isso
acontece quando algum arquivo do sistema de arquivos está aberto. No entanto, nem sempre
a localização de um arquivo aberto é óbvia, nem o que está acessando o sistema de arquivos.

Nesses casos, podemos usar o comando lsof seguido do nome do dispositivo que contém o
sistema de arquivos para ver uma lista de processos que o acessam e quais arquivos estão
abertos. Por exemplo:

root@debian10:/home/debian# umount /dev/sdb1


umount: /media/debian/External_Drive: target is busy.
258 24. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# lsof /dev/sdb1


COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
evince 3135 debian 16r REG 8,17 21881768 5195 /media/debian/External_Drive/Documents
/E-Books/MagPi40.pdf

• COMMAND - é o nome do executável que abriu o arquivo e PID é o número do


processo. NAME é o nome do arquivo que está aberto. No exemplo acima, o arquivo
MagPi40.pdf foi aberto pelo programa evince (um visualizador de PDF). Se fecharmos
o programa, poderemos desmontar o sistema de arquivos.

Onde montar?
Você pode montar um sistema de arquivos em qualquer lugar que desejar. No entanto, existem
algumas práticas recomendadas para facilitar a administração do sistema.

Tradicionalmente, /mnt era o diretório sob o qual todos os dispositivos externos eram mon-
tados e, dentro dele, existia uma série de “pontos de ancoragem” pré-configurados para dis-
positivos comuns, como drives de CD-ROM (/mnt/cdrom) e disquetes (/mnt/floppy).

Ele foi substituído por /media, que agora é o ponto de montagem padrão para qualquer mídia
removível pelo usuário (por exemplo, discos externos, pendrives, leitores de cartão de memória
etc.) conectada ao sistema.

Na maioria das distribuições Linux e ambientes de desktop modernos, os dispositivos re-


movíveis são montados automaticamente em /media/USER/LABEL quando conectados ao
sistema, sendo USER o nome de usuário e LABEL o nome do dispositivo. Por exemplo, um
drive flash USB com o nome FlashDrive conectado pelo usuário john seria montado em /medi-
a/john/FlashDrive/. A maneira como isso é feito varia de acordo com o ambiente de desktop.
Dito isto, sempre que você precisar montar manualmente um sistema de arquivos, é melhor
fazer isso em /mnt.

Montagem de sistemas de arquivos na inicialização


O arquivo /etc/fstab contém descrições sobre os sistemas de arquivos que podem ser monta-
dos. Trata-se de um arquivo de texto em que cada linha descreve um sistema de arquivos a
ser montado, com seis campos por linha, na seguinte ordem:

FILESYSTEM MOUNTPOINT TYPE OPTIONS DUMP PASS

Onde:
259 24. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

• FILESYSTEM - O dispositivo que contém o sistema de arquivos a ser montado. Em vez


do dispositivo, você pode especificar o UUID ou rótulo da partição, algo que discutiremos
mais tarde;
• MOUNTPOINT - Onde o sistema de arquivos será montado;
• TYPE - O tipo de sistema de arquivos;
• OPTIONS - Opções de montagem que serão passadas para mount;
• DUMP - Indica se qualquer sistema de arquivos ext2, ext3 ou ext4 deve ser considerado
para backup pelo comando dump. Normalmente o valor é zero, o que significa que devem
ser ignorados;
• PASS - Quando diferente de zero, define a ordem na qual os sistemas de arquivos serão
checados na inicialização. Normalmente é zero.

Por exemplo, a primeira partição do primeiro disco de uma máquina pode ser descrita como:

/dev/sda1 / ext4 noatime,errors

As opções de montagem em OPTIONS são uma lista de parâmetros separados por vírgulas,
que podem ser genéricos ou específicos ao sistema de arquivos. Entre os genéricos temos:

• atime e noatime - Por padrão, cada vez que um arquivo é lido, a informação de data
e hora de acesso é atualizada. Se essa opção for desativada (com noatime), a E/S
do disco fica mais veloz. Não confundir com a hora de modificação, que é atualizada
sempre que um arquivo é gravado;
• auto e noauto - Se o sistema de arquivos pode (ou não) ser montado automaticamente
com mount -a;
• defaults - Passa as opções rw, suid, dev, exec, auto, nouser e async para mount;
• dev e nodev - Indica se os dispositivos de caractere ou de bloco no sistema de arquivos
montado devem ser interpretados;
• exec e noexec - Permite ou nega a permissão para executar binários no sistema de
arquivos;
• user e nouser - Permite (ou não) a um usuário comum montar o sistema de arquivos;
• group - Permite a um usuário montar o sistema de arquivos se o usuário pertencer ao
mesmo grupo que possui o dispositivo que o contém;
• owner - Permite a um usuário montar um sistema de arquivos se ele for proprietário do
dispositivo que o contém;
• suid e nosuid - Permite ou não que os bits SETUID e SETGID tenham efeito;
• ro e rw - Montam um sistema de arquivos como somente leitura ou gravável;
• remount - Tenta remontar um sistema de arquivos já montado. Não é usado em
/etc/fstab, mas como um parâmetro para mount -o. Por exemplo, para remontar a
partição já montada /dev/sdb1 como somente leitura, você pode usar o comando mount
260 24. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

-o remount,ro /dev/sdb1. Ao remontar, não é necessário especificar o tipo de sistema


de arquivos, apenas o nome do dispositivo ou o ponto de montagem;
• sync e async - Definem se todas as operações de E/S devem ser realizadas no sistema
de arquivos de forma síncrona ou assíncrona. async geralmente é o padrão. A página
de manual de mount avisa que usar sync em mídias com um número limitado de ciclos
de gravação (como drives flash ou cartões de memória) pode encurtar a vida útil do
dispositivo.

Usando UUIDs e rótulos


Podem ocorrer problemas ao se especificar o nome do dispositivo que contém o sistema de
arquivos a ser montado. Às vezes, o mesmo nome pode ser atribuído a outro dispositivo,
dependendo de quando ou onde ele foi conectado ao sistema. Por exemplo, um pendrive
em /dev/sdb1 pode ser atribuído a /dev/sdc1 se conectado em outra porta ou após outro
pendrive.

Uma maneira de evitar isso é especificar o rótulo ou UUID (Universally Unique Identifier) do
volume. Ambos são especificados quando o sistema de arquivos é criado e não serão alterados,
a menos que o sistema de arquivos seja destruído ou atribuído manualmente a um novo rótulo
ou UUID.

O comando lsblk serve para consultar informações sobre um sistema de arquivos e descobrir
o rótulo e o UUID associados a ele. Para isso, use o parâmetro -f, seguido pelo nome do
dispositivo:

root@debian10:/home/debian# lsblk -f /dev/sda1


NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda1 ext4 6e2c12e3-472d-4bac-a257-c49ac07f3761 64,9G 33% /

Este é o significado de cada coluna:

• NAME - Nome do dispositivo que contém o sistema de arquivos;


• FSTYPE - Tipo de sistema de arquivos;
• LABEL - Rótulo do sistema de arquivos;
• UUID - Identificador Universal Único (UUID) atribuído ao sistema de arquivos;
• FSAVAIL - Espaço disponível no sistema de arquivos;
• FSUSE% - Porcentagem de uso do sistema de arquivos;
• MOUNTPOINT - Onde o sistema de arquivos é montado.

Em /etc/fstab, um dispositivo pode ser especificado por seu UUID com a opção UUID=
seguida pelo UUID, ou com LABEL=, seguida pelo rótulo. Assim, em vez de:
261 24. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

/dev/sda1 / ext4 noatime,errors

Usaríamos:

UUID=6e2c12e3-472d-4bac-a257-c49ac07f3761 / ext4 noatime,errors

Ou, se tivermos um disco rotulado como homedisk:

LABEL=homedisk /home ext4 defaults

A mesma sintaxe pode ser usada com o comando mount. Em vez do nome do dispositivo,
passe o UUID ou rótulo. Por exemplo, para montar um disco NTFS externo com o UUID
56C11DCC5D2E1334 em /mnt/external, o comando seria:

root@debian10:/home/debian# mount -t ntfs UUID=56C11DCC5D2E1334 /mnt/external

Montando discos com Systemd


Systemd é o processo init, o primeiro processo a ser executado em muitas distribuições Linux.
Ele é responsável por gerar outros processos, iniciar serviços e inicializar o sistema. Entre
muitas outras tarefas, o systemd também pode ser usado para gerenciar a montagem (e a
montagem automática) de sistemas de arquivos.

Para usar este recurso do systemd, você precisa criar um arquivo de configuração chamado
unidade de montagem. Cada volume a ser montado tem sua própria unidade de montagem e
elas devem ser postas em /etc/systemd/system/.

As unidades de montagem são arquivos de texto simples com a extensão .mount. O formato
básico é mostrado abaixo:

[Unit]
Description=

[Mount]
What=
Where=
262 24. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Type=
Options=

[Install]
WantedBy=

• Description= - Descrição curta da unidade de montagem, algo como Mounts the


backup disk;
• What - O que deve ser montado. O volume tem de ser especificado como /dev/disk/by-
uuid/VOL_UUID, onde VOL_UUID é o UUID do volume;
• Where= - Deve ser o caminho completo para o local em que o volume será montado;
• Type= - O tipo de sistema de arquivos;
• Options= - Opções de montagem que podem ser desejáveis; são as mesmas usadas
com o comando mount ou em /etc/fstab;
• WantedBy= - Usado para o gerenciamento de dependências. Neste caso, usaremos
multi-user.target, que indica que sempre que o sistema inicializar em um ambiente mul-
tiusuário (uma inicialização normal) a unidade será montada.

Nosso exemplo anterior do disco externo poderia ser escrito como:

[Unit]
Description=External data disk

[Mount]
What=/dev/disk/by-uuid/56C11DCC5D2E1334
Where=/mnt/external
Type=ntfs
Options=defaults

[Install]
WantedBy=multi-user.target

Mas ainda não acabamos. Para funcionar corretamente, a unidade de montagem deve ter o
mesmo nome do ponto de montagem. Neste caso, o ponto de montagem é /mnt/external,
de forma que o nome do arquivo precisa ser mnt-external.mount.

Depois disso, precisamos reiniciar o daemon do systemd com o comando systemctl e iniciar a
unidade:

root@debian10:/home/debian# systemctl daemon-reload


root@debian10:/home/debian# systemctl start mnt-external.mount
263 24. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Agora o conteúdo do disco externo deve estar disponível em /mnt/external. Para verificar o
status da montagem, use o comando systemctl status mnt-external.mount, como mostrado
abaixo:

root@debian10:/home/debian# systemctl status mnt-external.mount●


mnt-external.mount - External data disk
Loaded: loaded (/etc/systemd/system/mnt-external.mount; disabled; vendor pres
Active: active (mounted) since Mon 2019-08-19 22:27:02 -03; 14s ago
Where: /mnt/external
What: /dev/sdb1
Tasks: 0 (limit: 4915)
Memory: 128.0K
CGroup: /system.slice/mnt-external.mount

ago 19 22:27:02 pop-os systemd[1]: Mounting External data disk...


ago 19 22:27:02 pop-os systemd[1]: Mounted External data disk.

O comando systemctl start mnt-external.mount só habilita a unidade para a sessão atual. Se


quiser habilitá-la em todas as inicializações, substitua start por enable:

root@debian10:/home/debian# systemctl enable mnt-external.mount

Montagem automática de uma unidade de montagem


As unidades de montagem podem ser montadas automaticamente sempre que o ponto de
montagem for acessado. Para isso, precisamos de um arquivo .automount, junto com o
arquivo .mount descrevendo a unidade. O formato básico é:

[Unit]
Description=

[Automount]
Where=

[Install]
WantedBy=multi-user.target

Como anteriormente, Description= é uma breve descrição do arquivo e Where= é o ponto de


montagem. Por exemplo, um arquivo .automount em nosso exemplo anterior ficaria assim:

[Unit]
Description=Automount for the external data disk
264 24. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

[Automount]
Where=/mnt/external

[Install]
WantedBy=multi-user.target

Salve o arquivo com o mesmo nome do ponto de montagem (neste caso, mnt-external.automount),
recarregue o systemd e inicie a unidade:

root@debian10:/home/debian# systemctl daemon-reload


root@debian10:/home/debian# systemctl start mnt-external.automount

Agora, sempre que o diretório /mnt/external for acessado, o disco será montado. Como
anteriormente, para habilitar a montagem automática em cada inicialização usaríamos:

root@debian10:/home/debian# systemctl enable mnt-external.automount

Tavez isso possa te ajudar. . .

- Fonte: - https://aodba.com/describing-Linux-fstab-filesystem-table-file/
Fabio Gonçalves De Melo Santana / [email protected]

25
104.5: Gerenciar permissões e
propriedade de arquivos

Introdução
Por ser um sistema multiusuário, o Linux precisa de alguma forma de rastrear quem é o
proprietário de cada arquivo, e se um usuário tem ou não permissão para executar ações
em um arquivo. Isso serve para garantir a privacidade dos usuários que desejam manter o
conteúdo de seus arquivos em sigilo, bem como para permitir colaboração, tornando certos
arquivos acessíveis a diversos usuários.

Isso é feito por meio de um sistema de permissões em três níveis. Cada arquivo em disco
pertence a um usuário e a um grupo de usuários, e tem três conjuntos de permissões: um
para seu proprietário, um para o grupo que possui o arquivo e um para todos os outros. Nesta
lição, você aprenderá a consultar as permissões de um arquivo, o significado dessas permissões
e como manipulá-las.

Consulta de informações sobre arquivos e diretórios


O comando ls é usado para obter uma lista do conteúdo de qualquer diretório. Em sua forma
mais básica, tudo o que você obtém são os nomes dos arquivos:

ls

265
266 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

diretorio_qualquer foto.jpg texto.txt

Mas há muito mais informações disponíveis para cada arquivo, incluindo seu tipo, tamanho,
propriedade e muito mais. Para ver essas informações, você deve pedir ao ls uma lista de
“formato longo”, usando o parâmetro -l:

root@debian10:/home/debian# ls -l
total 536
drwxrwxr-x 2 debian debian 4096 Jun 10 15:57 diretorio_qualquer
-rw------- 1 debian debian 539663 Jun 10 10:43 foto.jpg
-rw-rw-r-- 1 debian debian 1881 Jun 10 15:57 texto.txt

Cada coluna da saída acima tem um significado. Vamos dar uma olhada nas colunas relevantes
para esta lição.

• A primeira coluna da lista mostra o tipo de arquivo e as permissões. Por exemplo, em


drwxrwxr-x:
– O primeiro caractere, d, indica o tipo de arquivo;
– Os três caracteres seguintes, rwx, indicam as permissões do proprietário do arquivo,
também chamado de usuário ou u;
– Os três caracteres seguintes, rwx, indicam as permissões do grupo que possui o
arquivo, também chamado de g;
– Os três últimos caracteres, r-x, indicam as permissões de todos os outros ou o.

Também é comum chamar as permissões de outros de permissões world (mundo),


como em “Todo mundo tem essas permissões”.

• A terceira e quarta colunas mostram informações sobre a propriedade: respectivamente


o usuário e o grupo que possuem o arquivo;
• A sétima e a última colunas mostram o nome do arquivo.

A segunda coluna indica o número de links físicos que apontam para aquele arquivo. A quinta
coluna mostra o tamanho do arquivo. A sexta coluna mostra a data e hora em que o arquivo
foi modificado pela última vez. Mas essas colunas não são relevantes para o tópico atual.

E quanto aos diretórios?

Se você solicitar informações sobre um diretório usando ls -l, ele mostra uma lista do conteúdo
do diretório:
267 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# ls -l diretorio_qualquer/
total 0
-rw-r--r-- 1 debian debian 0 Jun 10 17:59 outro_arquivo.txt

Para evitar isso e consultar informações sobre o próprio diretório, adicione o parâmetro -d a
ls:

root@debian10:/home/debian# ls -l -d diretorio_qualquer/
drwxrwxr-x 2 debian debian 4096 Jun 10 17:59 diretorio_qualquer/

Exibindo arquivos ocultos


A listagem do diretório que recuperamos usando ls -l anteriormente está incompleta:

root@debian10:/home/debian# ls -l
total 544
drwxrwxr-x 2 debian debian 4096 Jun 10 17:59 diretorio_qualquer
-rw------- 1 debian debian 539663 Jun 10 10:43 foto.jpg
-rw-rw-r-- 1 debian debian 1881 Jun 10 15:57 texto.txt

Existem três outros arquivos nesse diretório, mas eles estão ocultos. No Linux, os arquivos
cujo nome começa com um ponto (.) são ocultados automaticamente. Para vê-los, precisamos
adicionar o parâmetro -a ao ls:

root@debian10:/home/debian# ls -l -a
total 544
drwxrwxr-x 3 debian debian 4096 Jun 10 16:01 .
drwxrwxr-x 4 debian debian 4096 Jun 10 15:56 ..
drwxrwxr-x 2 debian debian 4096 Jun 10 17:59 diretorio_qualquer
-rw------- 1 debian debian 539663 Jun 10 10:43 foto.jpg
-rw-rw-r-- 1 debian debian 1881 Jun 10 15:57 texto.txt
-rw-r--r-- 1 debian debian 0 Jun 10 16:01 .oculto

O arquivo .oculto está oculto simplesmente porque o nome começa com . (ponto).

Os diretórios . e .., porém, são especiais. . é um ponteiro para o diretório atual. E .. é um


ponteiro para o diretório pai, aquele que contém o atual. No Linux, cada diretório contém
pelo menos esses dois diretórios.
268 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

É possível combinar os parâmetros do ls (e muitos outros comandos do Linux). ls -l


-a, por exemplo, pode ser escrito como ls -la.

Entendendo os tipos de arquivos


Já mencionamos que a primeira letra em cada saída de ls -l descreve o tipo do arquivo. Os
três tipos de arquivo mais comuns são:

• - (arquivo normal): Um arquivo pode conter dados de qualquer tipo e ajuda a gerenciar
esses dados. Os arquivos podem ser modificados, movidos, copiados e excluídos;
• d (diretório): Um diretório contém outros arquivos ou diretórios e ajuda a organizar o
sistema de arquivos. Tecnicamente, os diretórios são um tipo especial de arquivo;
• l (link simbólico): Este “arquivo” é um ponteiro para outro arquivo ou diretório em
outro local no sistema de arquivos.

Além desses, existem três outros tipos de arquivo que você precisa pelo menos conhecer, mas
estão fora do escopo desta lição:

• b (dispositivo de bloco): Este arquivo representa um dispositivo virtual ou físico,


geralmente discos ou outros tipos de dispositivos de armazenamento, como o primeiro
disco rígido, que pode ser representado por /dev/sda;
• c (dispositivo de caracteres): Este arquivo representa um dispositivo virtual ou físico.
Terminais (como o terminal principal em /dev/ttyS0) e portas seriais são exemplos
comuns de dispositivos de caracteres;
• s (socket): Sockets servem como “canais” passando informações entre dois programas.

Não altere nenhuma permissão nos dispositivos de bloco, dispositivos de caracteres ou


sockets, a menos que saiba muito bem o que está fazendo. Isso pode fazer o sistema
parar de funcionar!

Entendendo as permissões
Na saída de ls -l, as permissões de arquivo são mostradas logo após o tipo de arquivo, como
três grupos de três caracteres cada, na ordem r, w e x. Eis o que significam. Lembre-se de
que um traço - representa a falta de permissão.
269 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Permissões de arquivos
• r: Significa read (leitura) e tem um valor octal de 4 (não se preocupe, falaremos de
octais em breve). Indica permissão para abrir um arquivo e ler seu conteúdo;
• w: Significa write (escrita) e tem um valor octal de 2. Indica permissão para editar ou
excluir um arquivo;
• x: Significa execute (execução) e tem um valor octal de 1. Indica que o arquivo pode
ser executado como um executável ou script.

Assim, por exemplo, um arquivo com permissões rw- pode ser lido e escrito, mas não pode
ser executado.

Permissões em diretórios
• r: Significa read (leitura) e tem um valor octal de 4. Indica permissão para ler o
conteúdo do diretório, como nomes de arquivos. Mas não implica em permissão para
ler os arquivos em si;
• w: Significa write (escrita) e tem um valor octal de 2. Indica permissão para editar ou
excluir arquivos em um diretório, ou alterar seus nomes, permissões e proprietários. Se
um usuário tiver a permissão w em um diretório, ele poderá alterar as permissões de
qualquer arquivo dentro do diretório (o conteúdo do diretório), mesmo que o usuário
não tenha permissões no arquivo ou se o arquivo pertencer a outro utilizador.

Lembre-se de que ter permissões de gravação em um diretório ou arquivo não significa que
você tem permissão para remover ou renomear o diretório ou arquivo em si.

• x: Significa execute (execução) e tem um valor octal de 1. Indica permissão para entrar
em um diretório, mas não para listar seus arquivos (para isso, r é necessário).

A última parte sobre diretórios pode parecer um pouco confusa. Vamos imaginar, por exemplo,
que você tem um diretório chamado diretorio_qualquer, com as seguintes permissões:

root@debian10:/home/debian# ls -ld diretorio_qualquer/


d--x--x--x 2 debian debian 4,0K Jun 20 18:46 diretorio_qualquer

Imagine também que dentro deste diretório há um script de shell chamado oi.sh:

-rwxr-xr-x 1 debian debian 33 Jun 20 18:46 oi.sh


270 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Se você for a usuário debian e tentar listar o conteúdo de diretorio_qualquer, receberá uma
mensagem de erro, pois seu usuário não tem permissão de leitura para esse diretório:

root@debian10:/home/debian# ls -l diretorio_qualquer/
ls: cannot open directory 'diretorio_qualquer/': Permission denied

No entanto, o usuário debian tem permissões de execução, o que significa que ele pode entrar
no diretório. Portanto, o usuário debian pode acessar arquivos dentro do diretório, desde
que tenha as permissões corretas para o respectivo arquivo. Vamos supor que o usuário tem
permissões totais (rwx) para o script oi.sh. Nesse caso, se souber o nome do arquivo completo,
ele pode executar o script, embora não possa ler o conteúdo do diretório que o contém:

root@debian10:/home/debian# sh diretorio_qualquer/oi.sh
Salve Galeraa!!!

Como dissemos antes, as permissões são especificadas em sequência: primeiro para o propri-
etário do arquivo, depois para o grupo proprietário e, em seguida, para outros usuários. Sempre
que alguém tenta realizar uma ação no arquivo, as permissões são verificadas na mesma ordem.

Primeiro, o sistema verifica se o usuário atual possui o arquivo e, se for o caso, ele aplica apenas
o primeiro conjunto de permissões. Caso contrário, ele verifica se o usuário atual pertence ao
grupo que possui o arquivo. Nesse caso, ele aplica o segundo conjunto de permissões apenas.
Em qualquer outro caso, o sistema aplicará o terceiro conjunto de permissões.

Isso significa que, se o usuário atual for o proprietário do arquivo, apenas as permissões do
proprietário serão efetivas, mesmo se as permissões do grupo ou outras forem mais permissivas
do que as do proprietário.

Modificando as permissões de arquivos


O comando chmod é usado para modificar as permissões de um arquivo, e pede pelo menos
dois parâmetros: o primeiro descreve quais permissões alterar, o segundo aponta para o arquivo
ou diretório onde a alteração será feita. Lembre-se de que apenas o proprietário do arquivo ou
o administrador do sistema (root) pode alterar as permissões em um arquivo.

As permissões a alterar podem ser descritas de duas maneiras, ou “modos”, diferentes.

O primeiro, denominado modo simbólico, oferece um controle refinado, permitindo adicionar


ou revogar uma única permissão sem modificar as outras no conjunto. O outro modo, chamado
271 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

modo octal, é mais fácil de lembrar e mais rápido de usar quando desejamos definir todos os
valores de permissão de uma vez.

Ambos os modos levam ao mesmo resultado final. Assim, por exemplo, os comandos:

root@debian10:/home/debian# chmod ug+rw-x,o-rwx texto.txt

root@debian10:/home/debian# chmod 660 texto.txt

produzem exatamente a mesma saída, um arquivo com as permissões definidas:

-rw-rw---- 1 debian debian 765 Jun 20 21:25 texto.txt

Agora, vamos ver como cada modo funciona.

Modo simbólico
Ao descrever quais permissões alterar no modo simbólico, o(s) primeiro(s) caractere(s) in-
dica(m) as permissões que serão alteradas: de usuário (u), grupo (g), outros (o) e/ou todos
(a).

Então você precisa dizer ao comando o que fazer: você pode conceder uma permissão (+),
revogar uma permissão (-) ou defini-la com um valor específico (=).

Por último, você especifica em qual permissão deseja agir: leitura (r), escrita (w) ou execução
(x).

Por exemplo, imagine que temos um arquivo chamado texto.txt com o seguinte conjunto de
permissões:

root@debian10:/home/debian# ls -l texto.txt
-rw-r--r-- 1 debian debian 765 Jun 20 21:25 texto.txt

Se você deseja conceder permissões de gravação aos membros do grupo proprietário do arquivo,
272 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

deve usar o parâmetro g+w. É mais fácil pensar desta forma: “Para o grupo (g), conceda
(+) permissões de escrita (w)”. Então, o comando seria:

root@debian10:/home/debian# chmod g+w texto.txt

Vamos conferir o resultado com ls:

root@debian10:/home/debian# ls -l texto.txt
-rw-rw-r-- 1 debian debian 765 Jun 20 21:25 texto.txt

Deseja remover as permissões de leitura para o proprietário do mesmo arquivo? Pense assim:
“Para o usuário (u), revogue (-) as permissões de leitura (r)”. Portanto, o parâmetro é u-r,
desta maneira:

root@debian10:/home/debian# chmod u-r texto.txt


root@debian10:/home/debian# ls -l texto.txt
--w-rw-r-- 1 debian debian 765 Jun 20 21:25 texto.txt

E se quisermos definir as permissões exatamente como rw- para todos? Nesse caso, pensamos
assim: “Para todos (a), defina exatamente (=) leitura (r), escrita (w), e não execução (-)”.
Assim:

root@debian10:/home/debian# chmod a=rw- texto.txt


root@debian10:/home/debian# ls -l texto.txt
-rw-rw-rw- 1 debian debian 765 Jun 20 21:25 texto.txt

Claro, é possível modificar diversas permissões ao mesmo tempo. Neste caso, separe-os com
uma vírgula (,):

root@debian10:/home/debian# chmod u+rwx,g-x texto.txt


root@debian10:/home/debian# ls -lh texto.txt
-rwxrw-rw- 1 debian debian 765 Jun 20 21:25 texto.txt

O exemplo acima pode ser lido como: “Para o usuário (u), conceda (+) permissões de leitura,
escrita e execução (rwx), para o grupo (g), revogue (-) permissões de execução (x)”.
273 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Quando executado em um diretório, chmod modifica apenas as permissões do diretório. chmod


também possui um modo recursivo, útil quando desejamos alterar as permissões para “todos
os arquivos dentro de um diretório e seus subdiretórios”. Para usá-lo, adicione o parâmetro -R
após o nome do comando, antes das permissões a alterar:

root@debian10:/home/debian# chmod -R u+rwx diretorio_qualquer/

Este comando pode ser lido como: “Recursivamente (-R), para o usuário (u), conceda (+)
permissões de leitura, escrita e execução (rwx)”.

Tenha cuidado e pense duas vezes antes de usar a opção -R, pois é fácil alterar sem
querer as permissões de arquivos e diretórios, especialmente em diretórios com um
grande número de arquivos e subdiretórios.

Modo octal
No modo octal, as permissões são especificadas de maneira diferente: como um valor de três
dígitos na notação octal, um sistema numérico de base 8.

Cada permissão tem um valor correspondente e elas são especificadas na seguinte ordem:
primeiro vem leitura (r), que é 4, depois escrita (w), que é 2, e por fim execução (x), repre-
sentada por 1. Se não houver permissão, usamos o valor zero (0). Portanto, uma permissão
rwx seria 7 (4 + 2 + 1) e rx seria 5 (4 + 0 + 1).

O primeiro dos três dígitos no conjunto de permissões representa as permissões do usuário (u),
o segundo as do grupo (g) e o terceiro as do outros (o). Se quisermos definir as permissões
de um arquivo como rw-rw—-, o valor octal seria 660:

root@debian10:/home/debian# chmod 660 texto.txt


root@debian10:/home/debian# ls -l texto.txt
-rw-rw---- 1 debian debian 765 Jun 20 21:25 texto.txt

Além disso, a sintaxe no modo octal é a mesma que no modo simbólico: o primeiro parâmetro
representa as permissões que você deseja alterar e o segundo aponta para o arquivo ou diretório
onde a alteração será feita.
274 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Se o valor de uma permissão for ímpar, o arquivo certamente é executável!

Qual sintaxe você deve usar? O modo octal é recomendado quando se deseja alterar as
permissões para um valor específico, por exemplo 640 (rw- r– —).

O modo simbólico é mais útil se você deseja inverter apenas um valor específico, independen-
temente das permissões atuais do arquivo. Por exemplo, você pode adicionar permissões de
execução para o usuário usando apenas chmod u+x script.sh sem levar em conta, ou mesmo
tocar, as permissões atuais de grupo e outros.

Modificando o proprietário de um arquivo


O comando chown é usado para modificar a propriedade de um arquivo ou diretório. A sintaxe
é bastante simples:

chown USERNAME:GROUPNAME FILENAME

Por exemplo, vamos verificar um arquivo chamado texto.txt:

root@debian10:/home/debian# ls -l texto.txt
-rw-rw---- 1 debian debian 1881 Jun 10 15:57 texto.txt

O usuário que possui o arquivo é debian, e o grupo também é debian. Agora, vamos mudar
o grupo proprietário do arquivo para um outro grupo, como students:

root@debian10:/home/debian# chown debian:students texto.txt


root@debian10:/home/debian# ls -l texto.txt
-rw-rw---- 1 debian students 1881 Jun 10 15:57 texto.txt

Lembre-se de que o usuário que possui um arquivo não precisa pertencer ao grupo que possui
o arquivo. No exemplo acima, o usuário debian não precisa ser um membro do grupo students.

O conjunto de permissões de usuário ou grupo pode ser omitido se você não quiser alterá-
lo. Portanto, para alterar apenas o grupo que possui um arquivo, o comando seria chown:
students texto.txt. Para alterar apenas o usuário, o comando seria chown debian: texto.txt ou
apenas chown debian texto.txt. Alternativamente, você pode usar o comando chgrp students
texto.txt.
275 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

A menos que você seja o administrador do sistema (root), não é possível mudar a propriedade
de um arquivo para outro usuário ou grupo ao qual você não pertence. Se tentar fazer isso,
aparecerá a mensagem de erro Operation not allowed.

Consultando os grupos
Antes de alterar a propriedade de um arquivo, pode ser útil saber quais grupos existem no
sistema, quais usuários são membros de um grupo e a quais grupos um usuário pertence.

Para ver quais grupos existem em seu sistema, digite getent group. A saída será semelhante
a esta (a saída foi abreviada):

root@debian10:/home/debian# getent group


root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog,rigues
tty:x:5:rigues
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:rigues

Se quiser saber a quais grupos um usuário pertence, adicione o nome de usuário como um
parâmetro a groups:

root@debian10:/home/debian# groups debian


debian : debian students cdrom sudo dip plugdev lpadmin sambashare

Para fazer o inverso (ver quais usuários pertencem a um grupo), use groupmems. O
parâmetro -g especifica o grupo, e -l lista todos os seus membros:

root@debian10:/home/debian# groupmems -g cdrom -l


debian

groupmems só pode ser executado como root, o administrador do sistema. Se você


não estiver conectado como root, adicione sudo antes do comando.
276 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Permissões padrão
Vamos fazer uma experiência. Abra uma janela de terminal e crie um arquivo vazio com o
seguinte comando:

root@debian10:/home/debian# touch testfile

Agora, vamos dar uma olhada nas permissões deste arquivo. Eles podem ser diferentes em
seu sistema, mas vamos supor que sejam mais ou menos assim:

root@debian10:/home/debian# ls -lh testfile


-rw-r--r-- 1 debian debian 0 jul 13 21:55 testfile

As permissões são rw-r—r–: leitura e escrita para o usuário, e leitura para o grupo e outros,
ou 644 no modo octal. Agora, tente criar um diretório:

root@debian10:/home/debian# mkdir testdir


root@debian10:/home/debian# ls -lhd testdir
drwxr-xr-x 2 debian debian 4,0K jul 13 22:01 testdir

Agora as permissões são rwxr-xr-x: leitura, escrita e execução para o usuário, leitura e
execução para o grupo e outros, ou 755 no modo simbólico.

Não importa onde você esteja no sistema de arquivos, cada arquivo ou diretório que criar terá
as mesmas permissões. Você já se perguntou de onde eles vêm?

Elas vêm da máscara de usuário ou umask, que define as permissões padrão para cada arquivo
criado. Você pode verificar os valores atuais com o comando umask:

root@debian10:/home/debian# umask
0022

Mas isso não se parece com rw-r—r–, ou mesmo 644. Talvez devêssemos tentar com o
parâmetro -S, para obter uma saída em modo simbólico:

root@debian10:/home/debian# umask -S
u=rwx,g=rx,o=rx
277 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Essas são as mesmas permissões que nosso diretório de teste obteve em um dos exemplos
acima. Mas por que quando criamos um arquivo as permissões eram diferentes?

Bem, não faz sentido definir permissões globais de execução para todos em qualquer arquivo
por padrão, certo? Os diretórios precisam de permissões de execução (caso contrário, não é
possível entrar neles), mas os arquivos não, então eles não as recebem. Daí o rw-r—r–.

Além de exibir as permissões padrão, o umask também pode ser usado para alterá-las para
sua sessão do shell atual. Por exemplo, se usarmos o comando:

root@debian10:/home/debian# umask u=rwx,g=rwx,o=

Cada novo diretório irá herdar as permissões rwxrwx—, e cada arquivo rw-rw—- (já que
eles não recebem permissões de execução). Se você repetir os exemplos acima para criar um
testfile e testdir e verificar as permissões, o resultado será:

root@debian10:/home/debian# ls -lhd test*


drwxrwx--- 2 debian debian 4,0K jul 13 22:25 testdir
-rw-rw---- 1 debian debian 0 jul 13 22:25 testfile

E se você marcar o umask sem o parâmetro -S (modo simbólico), você obterá:

root@debian10:/home/debian# umask
0007

O resultado não parece familiar porque os valores usados são diferentes. Eis uma tabela com
todos os valores e seus respectivos significados:

Valores Permissão dos Arquivos Permissões dos diretórios


0 rm- rwx
1 rw rw-
2 r– r-x
3 r– r–
4 -w- -wx
5 -w- -w-
278 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Valores Permissão dos Arquivos Permissões dos diretórios


6 — –x
7 — —

Como vemos, 007 corresponde a rwxrwx—, exatamente como solicitamos. O zero inicial
pode ser ignorado.

Permissões especiais
Além das permissões de leitura, gravação e execução para usuário, grupo e outros, cada
arquivo pode ter três outras permissões especiais capazes de alterar a maneira como um
diretório funciona ou como um programa é executado. Elas podem ser especificadas no modo
simbólico ou octal e são as seguintes:

Sticky Bit
O sticky bit, também chamado de sinalizador de exclusão restrito, tem o valor octal 1 e no
modo simbólico é representado por um t dentro das permissões de outros. Ele se aplica apenas
a diretórios e não tem efeito em arquivos normais. No Linux, ele evita que os usuários removam
ou renomeiem um arquivo em um diretório, a menos que sejam proprietários desse arquivo ou
diretório.

Os diretórios com o sticky bit definido mostram um t substituindo o x nas permissões de


outros na saída de ls -l:

root@debian10:/home/debian# ls -ld Diretorio_exemplo/


drwxr-xr-t 2 debian debian 4096 Jun 20 18:46 Diretorio_exemplo/

No modo octal, as permissões especiais são especificadas usando uma notação de 4 dígitos,
sendo que o primeiro dígito representa a permissão especial sobre a qual agir. Por exemplo,
para definir o sticky bit (valor 1) para o diretório diretorio_qualquer no modo octal, com
permissões 755, o comando seria:

root@debian10:/home/debian# chmod 1755 diretorio_qualquer


root@debian10:/home/debian# ls -ld diretorio_qualquer
drwxr-xr-t 2 debian debian 4,0K Jun 20 18:46 diretorio_qualquer
279 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Set GID

O Set GID, também conhecido como SGID ou Set Group ID bit, tem o valor octal 2 e no
modo simbólico é representado por um s nas permissões de grupo. Ele pode ser aplicado a
arquivos executáveis ou diretórios. Nos arquivos, fará com que o processo seja executado com
os privilégios do grupo que possui o arquivo. Quando aplicado a diretórios, fará com que cada
arquivo ou diretório criado herde o grupo do diretório pai.

Arquivos e diretórios com o bit SGID mostram um s no lugar do x nas permissões de grupo
na saída de ls -l:

root@debian10:/home/debian# ls -l test.sh
-rwxr-sr-x 1 debian debian 33 Jun 11 10:36 test.sh

Para adicionar permissões SGID a um arquivo no modo simbólico, o comando seria:

root@debian10:/home/debian# chmod g+s test.sh


root@debian10:/home/debian# ls -l test.sh
-rwxr-sr-x 1 debian root 33 Jun 11 10:36 test.sh

O exemplo a seguir o ajudará a entender melhor os efeitos do SGID em um diretório. Suponha


que temos um diretório chamado Diretorio_exemplo, pertencente à usuário debian e ao grupo
users, com a seguinte estrutura de permissões:

root@debian10:/home/debian# ls -ldh Diretorio_exemplo/


drwxr-xr-x 2 debian users 4,0K Jan 18 17:06 Diretorio_exemplo/

Agora, vamos mudar para esse diretório e, usando o comando touch, criar um arquivo vazio
dentro dele. O resultado seria:

root@debian10:/home/debian# cd Diretorio_exemplo/
root@debian10:/home/debian# touch novoarquivo
root@debian10:/home/debian# ls -lh novoarquivo
-rw-r--r-- 1 debian debian 0 Jan 18 17:11 novoarquivo

Como podemos ver, o arquivo é propriedade do usuário debian e do grupo debian. Mas, se
o diretório tivesse a permissão SGID definida, o resultado seria diferente. Primeiro, vamos
adicionar o bit SGID ao Diretorio_exemplo e verificar os resultados:
280 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# sudo chmod g+s Diretorio_exemplo/


root@debian10:/home/debian# ls -ldh Diretorio_exemplo/
drwxr-sr-x 2 debian users 4,0K Jan 18 17:17 Diretorio_exemplo/

O s nas permissões do grupo indica que o bit SGID está definido. Agora, vamos mudar para
este diretório e, novamente, criar um arquivo vazio com o comando touch:

root@debian10:/home/debian# cd Diretorio_exemplo/
root@debian10:/home/debian# touch arquivovazio
root@debian10:/home/debian# ls -lh arquivovazio
-rw-r--r-- 1 debian users 0 Jan 18 17:20 arquivovazio

O grupo que possui o arquivo é users. Isso ocorre porque o bit SGID fez o arquivo herdar o
proprietário do grupo de seu diretório pai, que é users.

Set UID
SUID, também conhecido como Set User ID, tem valor octal 4 e é representado por um s nas
permissões de usuário no modo simbólico. Aplica-se apenas aos arquivos e não tem efeito em
diretórios. Seu comportamento é semelhante ao do bit SGID, mas o processo será executado
com os privilégios do usuário proprietário do arquivo. Os arquivos com o bit SUID mostram
um s no lugar do x nas permissões do usuário, na saída de ls -l:

root@debian10:/home/debian# ls -ld test.sh


-rwsr-xr-x 1 debian debian 33 Jun 11 10:36 test.sh

Podemos combinar diversas permissões especiais em um parâmetro somando-as. Assim, para


definir o SGID (valor 2) e o SUID (valor 4) no modo octal para o script test.sh com permissões
755, digite:

root@debian10:/home/debian# chmod 6755 test.sh

E o resultado seria:

root@debian10:/home/debian# ls -lh test.sh


-rwsr-sr-x 1 debian debian 66 Jan 18 17:29 test.sh
281 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Se o seu terminal exibe cores, como é o caso da maioria atualmente, é fácil ver se
essas permissões especiais estão definidas olhando a saída de ls -l. Para o sticky bit, o
nome do diretório pode ser mostrado em uma fonte preta com fundo azul. O mesmo
se aplica aos arquivos com os bits SGID (fundo amarelo) e SUID (fundo vermelho). As
cores podem ser diferentes dependendo da distribuição do Linux e das configurações
do terminal que você usa.

Resumo
Nesta aula, você aprendeu como usar o ls para obter informações sobre permissões de arquivo,
como controlar ou alterar quem pode criar, excluir ou modificar um arquivo com chmod, tanto
nos modos octal e simbólico como para alterar a propriedade de arquivos com chown e chgrp,
e como consultar e alterar a máscara de permissões padrão para arquivos e diretórios com
umask.

Os seguintes comandos foram abordados nesta lição:

• ls: Lista os arquivos, incluindo opcionalmente detalhes como as permissões;


• chmod: Altera as permissões de um arquivo ou diretório;
• chown: Altera o usuário e/ou o grupo proprietário de um arquivo ou diretório;
• chgrp: Altera o grupo proprietário de um arquivo ou diretório;
• umask: Permite consultar ou definir a máscara de permissões padrão para arquivos e
diretórios.
282 25. 104.5: Gerenciar permissões e propriedade de arquivos
Fabio Gonçalves De Melo Santana / [email protected]

Tavez isso possa te ajudar. . .

Fig. 25.1: PERMISSOES

• Fonte: https://twitter.com/0xax/status/605640674935848960
Fabio Gonçalves De Melo Santana / [email protected]

26
104.6: Criar e alterar links
simbólicos e hardlinks

Introdução
Como já disse antes, no Linux tudo é tratado como arquivo. Mas, alguns arquivos recebem
um tratamento especial, seja devido ao local em que estão armazenados, como os arquivos
temporários, ou à maneira como interagem com o sistema de arquivos, como os links. Nesta
lição, aprenderemos onde esses arquivos estão localizados, como funcionam e como gerenciá-
los.

Arquivos temporários
Os arquivos temporários são arquivos usados pelos programas para armazenar dados que serão
necessários apenas por um curto espaço de tempo, por exemplo, dados de processos em
execução, logs de falhas, arquivos de rascunho de um salvamento automático, arquivos inter-
mediários usados durante uma conversão, arquivos de cache e assim por diante.

Localização dos arquivos temporários


A versão 3.0 do Filesystem Hierarchy Standard (FHS) define locais padrão para os arquivos
temporários nos sistemas Linux. Cada local tem uma finalidade e um comportamento difer-
entes, e é recomendável que os desenvolvedores sigam as convenções definidas pelo FHS ao

283
284 26. 104.6: Criar e alterar links simbólicos e hardlinks
Fabio Gonçalves De Melo Santana / [email protected]

gravar dados temporários no disco.

• /tmp: De acordo com o FHS, não se deve pressupor que os arquivos escritos aqui serão
preservados entre as invocações de um programa. A recomendação é que esse diretório
seja limpo (todos os arquivos apagados) durante a inicialização do sistema, embora isso
não seja obrigatório;
• /var/tmp: Outro local para arquivos temporários, mas este não deve ser limpo durante
a inicialização do sistema, ou seja, os arquivos armazenados aqui geralmente persistem
entre as reinicializações;
• /run: Este diretório contém arquivos variáveis de tempo de execução usados pelos
processos ativos, como os arquivos identificadores de processo (.pid). Os programas que
precisam de mais de um arquivo de tempo de execução podem criar subdiretórios aqui.
Este local deve ser limpo durante a inicialização do sistema. Antigamente essa finalidade
pertencia a /var/run e, em alguns sistemas, /var/run pode ser um link simbólico para
/run.

Observe que nada impede o programa de criar arquivos temporários em outro local do sistema,
mas é recomendável respeitar as convenções definidas pelo FHS.

Permissões em arquivos temporários


A existência de diretórios temporários que contemplam todo o sistema em um sistema mul-
tiusuário apresenta alguns desafios em relação às permissões de acesso. A princípio, poderíamos
pensar que esses diretórios seriam “graváveis por todos”, ou seja, qualquer usuário poderia
escrever ou excluir dados dele. Mas se assim fosse, como impedir que um usuário apagasse ou
modificasse arquivos criados por outro?

A solução é uma permissão especial chamada sticky bit, que se aplica a diretórios e arquivos.
Porém, por razões de segurança, o kernel do Linux ignora o sticky bit quando ele é apli-
cado a arquivos. Quando esse bit especial é definido para um diretório, ele impede que os
usuários removam ou renomeiem um arquivo nesse diretório, a menos que sejam proprietários
do arquivo.

Os diretórios com o sticky bit definido mostram um t no lugar do x nas permissões de outros
na saída de ls -l. Por exemplo, vamos verificar as permissões dos diretórios /tmp e /var/tmp:

root@debian10:/home/debian# ls -ldh /tmp/ /var/tmp/


drwxrwxrwt 14 root root 4.0K Jun 30 12:03 /tmp/
drwxrwxrwt 7 root root 4.0K Jun 30 12:03 /var/tmp/

Como você pode ver pelo t no lugar do x na permissão para outros, os dois diretórios estão
285 26. 104.6: Criar e alterar links simbólicos e hardlinks
Fabio Gonçalves De Melo Santana / [email protected]

com o sticky bit definido.

Para definir o sticky bit em um diretório usando chmod no modo numérico, use a notação de
quatro dígitos, sendo 1 o primeiro dígito. Por exemplo:

root@debian10:/home/debian# chmod 1755 temp

Isso define o sticky bit para o diretório chamado temp e suas permissões como rwxr-xr-t.

Ao usar o modo simbólico, empregue o parâmetro t. Assim, +t para definir o sticky bit e -t
para desativá-lo. Desta maneira:

root@debian10:/home/debian# chmod +t temp

Compreendendo os links
Como já mencionamos anteriormente, no Linux tudo é tratado como um arquivo, mas existe
um tipo especial de arquivo chamado link. Há dois tipos de links em um sistema Linux:

Links simbólicos
Também chamados de soft links, eles apontam para o caminho de outro arquivo. Se excluirmos
o arquivo para o qual o link aponta (chamado destino), o link ainda existirá, mas “para de
funcionar”, pois passará a apontar para “nada”.

Links físicos
Um link físico é como como um segundo nome para o arquivo original. Eles não são duplicatas,
mas sim uma entrada adicional no sistema de arquivos que aponta para o mesmo local (inode)
no disco.

Um inode é uma estrutura de dados que armazena os atributos de um objeto (como


um arquivo ou diretório) em um sistema de arquivos. Entre esses atributos estão as
permissões, proprietário e os blocos do disco nos quais estão armazenados os dados
referentes àquele objeto. São semelhantes a um verbete em um índice, por isso o
nome, que vem de “index node”.
286 26. 104.6: Criar e alterar links simbólicos e hardlinks
Fabio Gonçalves De Melo Santana / [email protected]

Trabalhando com links físicos


Criando links físicos

O comando para criar um link físico no Linux é ln. A sintaxe básica é:

$ ln TARGET LINK_NAME

O TARGET já deve existir (trata-se do arquivo para o qual o link apontará) e, se o destino não
estiver no diretório atual ou se você deseja criar o link em outro lugar, é obrigatório especificar
o caminho completo para ele. Por exemplo, o comando

$ ln target.txt /home/debian/Documents/hardlink

Cria um arquivo chamado hardlink no diretório /home/debian/Documents/, vinculado ao


arquivo target.txt no diretório atual.

Se deixarmos de fora o último parâmetro (LINK_NAME), será criado um link com o mesmo
nome do destino no diretório atual.

Gerenciando os links físicos

Os links físicos são entradas no sistema de arquivos que têm nomes diferentes, mas que
apontam para os mesmos dados no disco. Todos esses nomes são equivalentes e podem
ser usados para se referir a um arquivo. Se você alterar o conteúdo de um dos nomes, o
conteúdo de todos os outros nomes que apontam para aquele arquivo será alterado, já que
todos apontam para os mesmos dados. Se você excluir um dos nomes, os outros nomes
continuarão a funcionar.

Isso acontece porque quando você “exclui” um arquivo, os dados não são realmente apagados
do disco. O sistema simplesmente exclui a entrada na tabela do sistema de arquivos apon-
tando para o inode correspondente aos dados no disco. Mas se houver uma segunda entrada
apontando para o mesmo inode, ainda será possível acessar os dados. É como se fossem duas
estradas convergindo no mesmo ponto. Mesmo se bloquearmos ou redirecionarmos uma das
estradas, ainda será possível chegar ao destino usando a outra.

Para conferir, podemos usar o parâmetro -i de ls. Considere o seguinte conteúdo de um


diretório:
287 26. 104.6: Criar e alterar links simbólicos e hardlinks
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian/Documents# ls -li
total 0
5636238 -rw-r--r-- 2 root root 0 Jun 30 12:17 hardlink
5636238 -rw-r--r-- 2 root root 0 Jun 30 12:17 target.txt

O número anterior às permissões é o número inode. Percebeu que tanto o arquivo hardlink
quanto o arquivo target.txt têm o mesmo número (5636238)? Isso ocorre porque um é o link
físico do outro.

Mas qual é o original e qual é o link? Não dá pra dizer, já que, na prática, eles são a mesma
coisa.

Observe que todo link físico que aponta para um arquivo aumenta a contagem de links do
arquivo. Este é o número logo após as permissões na saída de ls -l. Por padrão, todo arquivo
tem uma contagem de links de 1 (os diretórios têm uma contagem de 2), e cada link físico
apontando para ele aumenta a contagem em um. Por isso a contagem de links é 2 nos arquivos
da lista acima.

Ao contrário dos links simbólicos, só é possível criar links físicos para arquivos, e tanto o link
quanto o destino devem residir no mesmo sistema de arquivos.

Movendo e removendo links físicos

Como os links físicos são tratados como arquivos regulares, eles podem ser excluídos com rm,
e renomeados ou movidos no sistema de arquivos com mv. E como um link rígido aponta para
o mesmo inode do destino, ele pode ser movido livremente, sem medo de “quebrar” o link.

Links simbólicos
Criando links simbólicos

O comando usado para criar um link simbólico também é ln, mas com o parâmetro -s adi-
cionado. Assim:

root@debian10:/home/debian/Documents# ln -s target.txt /home/debian/Documents/softlink

Criamos assim um arquivo chamado softlink no diretório /home/debian/Documents/, apon-


tando para o arquivo target.txt no diretório atual.

Como no caso dos links físicos, é possível omitir o nome do link, para criar um link com o
288 26. 104.6: Criar e alterar links simbólicos e hardlinks
Fabio Gonçalves De Melo Santana / [email protected]

mesmo nome do destino no diretório atual.

Gerenciando links simbólicos

Os links simbólicos apontam para outro caminho no sistema de arquivos. Podemos criar links
simbólicos para arquivos e diretórios, mesmo em diferentes partições. É muito fácil identificar
um link simbólico na saída de ls:

root@debian10:/home/debian/Documents# ls -lh
total 0
-rw-r--r-- 2 root root 0 Jun 30 12:17 hardlink
lrwxrwxrwx 1 root root 10 Jun 30 12:21 softlink -> target.txt
-rw-r--r-- 2 root root 0 Jun 30 12:17 target.txt

No exemplo acima, o primeiro caractere nas permissões para o arquivo softlink é l, indicando
um link simbólico. Além disso, logo após o nome do arquivo, vemos o nome do destino para
o qual o link aponta, o arquivo target.txt.

Note que nas listagens de arquivos e diretórios os links simbólicos sempre mostram as permis-
sões rwx para o usuário, o grupo e outros, mas, na prática, as permissões de acesso para eles
são as mesmas do destino.

Movendo e removendo links simbólicos

Como no caso dos links físicos, os links simbólicos podem ser removidos usando rm e movidos
ou renomeados com mv. No entanto, deve-se tomar cuidado especial ao criá-los, para evitar
“quebrar” o link se ele for movido de seu local original.

Ao criar links simbólicos, é preciso estar ciente de que, a menos que um caminho seja total-
mente especificado, o local do destino será interpretado como sendo relativo ao local do link.
Isso pode criar problemas caso o link ou o arquivo para o qual ele aponta seja movido.

É mais fácil entender isso com um exemplo. Digamos que temos um arquivo chamado orig-
inal.txt no diretório atual e desejamos criar um link simbólico para ele chamado softlink.
Poderíamos usar:

root@debian10:/home/debian/Documents# ln -s original.txt softlink

E aparentemente tudo correria bem. Vamos verificar com ls:


289 26. 104.6: Criar e alterar links simbólicos e hardlinks
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian/Documents# ls -lh
total 0
-rw-r--r-- 1 root root 0 Jun 30 12:25 original.txt
lrwxrwxrwx 1 root root 12 Jun 30 12:25 softlink -> original.txt

Observe como o link é elaborado: softlink aponta para () original.txt. Entretanto, vamos ver
o que acontece se movermos o link para o diretório anterior e tentarmos exibir seu conteúdo
com o comando less:

root@debian10:/home/debian/Documents# mv softlink ../


root@debian10:/home/debian/Documents# less ../softlink
../softlink: No such file or directory

Como o caminho para original.txt não foi especificado, o sistema pressupõe que ele está no
mesmo diretório que o link. Quando isso deixa de ser verdade, o link para de funcionar.

Para evitar isso, devemos sempre especificar o caminho completo para o destino ao criar o
link:

root@debian10:/home/debian/Documents# ln -s /home/debian/Documents/original.txt softlink

Dessa forma, o link continuará a funcionar mesmo se for movido, porque aponta para a
localização absoluta do destino. Verifique com ls:

root@debian10:/home/debian/Documents# ls -lh
total 0
-rw-r--r-- 1 root root 0 Jun 30 12:25 original.txt
lrwxrwxrwx 1 root root 35 Jun 30 12:27 softlink -> /home/debian/Documents/original.txt

Resumo
Nesta lição, você aprendeu:

• Onde são armazenados os arquivos temporários;


• Qual a permissão especial aplicada a eles;
• O que são links;
• A diferença entre os links simbólicos e físicos;
• Como criar links;
290 26. 104.6: Criar e alterar links simbólicos e hardlinks
Fabio Gonçalves De Melo Santana / [email protected]

• Como movê-los, renomeá-los ou excluí-los.

Os seguintes comandos foram abordados nesta lição:

• ln: O comando “link”. Sozinho, este comando cria um link físico. Com a opção -
s, podemos criar um link simbólico ou soft link. Lembre-se de que os links físicos
só podem residir na mesma partição e sistema de arquivos, e que os links simbólicos
podem atravessar partições e sistemas de arquivos (inclusive armazenamento conectado
em rede);
• O parâmetro -i do ls, que permite visualizar o número inode de um arquivo.

Tavez isso possa te ajudar. . .

Fig. 26.1: Soft link vs Hard link

• Fonte: https://linuxhandbook.com/ln-command/
Fabio Gonçalves De Melo Santana / [email protected]

27
104.7: Encontrar arquivos de
sistema e conhecer sua
localização correta

Introdução
As distribuições Linux, na minha opinião, são como carros, onde cada pessoa se identifica com
um tipo específico. . . Tem pessoas que gostam de Sedã (assim como eu), outras preferem
caminhonete, e por aí vai. Mas uma coisa que quase todas as distribuições têm em comum,
é o fato de seguirem o Filesystem Hierarchy Standard (FHS), que define um “layout padrão”
para o sistema de arquivos. Isso simplifica muito a interoperação e administração do sistema.

291
Fabio Gonçalves De Melo Santana / [email protected]

28
O Filesystem Hierarchy Standard

O Filesystem Hierarchy Standard (FHS) é um projeto da Linux Foundation para padronizar a


estrutura de diretórios e o conteúdo dos diretórios nos sistemas Linux. A conformidade com o
padrão não é obrigatória, mas a maioria das distribuições o segue.

De acordo com o padrão, a estrutura de diretórios básica é a seguinte:

• /: Este é o diretório raiz, o primeiro da hierarquia. Todos os outros diretórios ficam


dentro dele. Um sistema de arquivos muitas vezes é comparado a uma “árvore”, nesse
caso, este seria o “tronco” ao qual todos os galhos se conectam;
• /bin: Binários essenciais, disponível para todos os usuários;
• /boot: Arquivos necessários ao processo de inicialização, incluindo o disco RAM inicial
(initrd) e o próprio kernel do Linux;
• /dev: Arquivos de dispositivos. Podem ser dispositivos físicos conectados ao sistema
(por exemplo, /dev/sda seria o primeiro disco SCSI ou SATA) ou dispositivos virtuais
fornecidos pelo kernel;
• /etc: Arquivos de configuração específicos ao hospedeiro. Se necessário, os programas
podem criar subdiretórios sob /etc para armazenar diversos arquivos de configuração;
• /home: Cada usuário do sistema tem um diretório “inicial” para armazenar arquivos
pessoais e preferências, a maioria deles localizados sob /home. Geralmente, o diretório
home tem o mesmo nome do usuário, de modo que o usuário John teria seu diretório
sob /home/john. As exceções são o superusuário (root), que tem um diretório separado
(/root), e certos usuários do sistema;
• /lib: Bibliotecas compartilhadas necessárias para inicializar o sistema operacional e

292
293 28. O Filesystem Hierarchy Standard
Fabio Gonçalves De Melo Santana / [email protected]

executar os binários que estão em /bin e /sbin;


• /media: Mídias removíveis montadas pelo usuário, como pendrives, leitores de CD e
DVD-ROM, disquetes, cartões de memória e discos externos, são montadas aqui;
• /mnt: Ponto de montagem para sistemas de arquivos montados temporariamente;
• /opt: Pacotes de software opcionais;
• /root: Diretório inicial do superusuário (root);
• /run: Dados variáveis de tempo de execução;
• /sbin: Binários do sistema;
• /srv: Dados de serviços fornecidos pelo sistema. Por exemplo, as páginas fornecidas
por um servidor web poderiam ser armazenadas em /srv/www;
• /tmp: Arquivos temporários;
• /usr: Dados de usuários de apenas leitura, incluindo dados utilizados por certos util-
itários e aplicações secundárias;
• /proc: Sistema de arquivos virtual contendo dados relacionados a processos em exe-
cução;
• /var: Dados variáveis gravados durante a operação do sistema, incluindo fila de im-
pressão, dados de log, caixas de entrada, arquivos temporários, cache do navegador
etc.

Tenha em mente que alguns desses diretórios, como /etc, /usr e /var, contêm toda uma
hierarquia de subdiretórios.

Busca de arquivos
Para pesquisar por arquivos em um sistema Linux, podemos usar o comando find. Esta é
uma ferramenta muito poderosa, rica em parâmetros configuráveis para modificar a saída
exatamente de acordo com suas necessidades.

Para começar, o find precisa de dois argumentos: um ponto de partida e o que procurar. Por
exemplo, para pesquisar todos os arquivos no diretório atual (e seus subdiretórios) cujo nome
termina em .txt, usaríamos:

root@debian10:/home/debian# find . -name '*.txt'


./.cache/tracker/parser-version.txt
./.cache/tracker/db-version.txt
./.cache/tracker/last-crawl.txt
./.cache/tracker/locale-for-miner-apps.txt
./.cache/tracker/db-locale.txt
./.cache/tracker/first-index.txt
./Documents/original.txt

Essa busca corresponde a qualquer arquivo cujos últimos quatro caracteres do nome sejam
294 28. O Filesystem Hierarchy Standard
Fabio Gonçalves De Melo Santana / [email protected]

.txt, não importa o que venha antes, já que * é um curinga para “qualquer coisa”. No entanto,
veja o que acontece se outro * for adicionado no final do padrão:

root@debian10:/home/debian# find . -name '*.txt*'


./.cache/tracker/parser-version.txt
./.cache/tracker/db-version.txt
./.cache/tracker/last-crawl.txt
./.cache/tracker/locale-for-miner-apps.txt
./.cache/tracker/db-locale.txt
./.cache/tracker/first-index.txt
./Documents/original.txt
./qualteupapo.txt.zip

O arquivo qualteupapo.txt.zip (destacado acima) não foi incluído na lista anterior, porque
embora contenha .txt em seu nome, não corresponde ao padrão, já que há caracteres extras
depois dele. O novo padrão significa “qualquer coisa .txt qualquer coisa”, então ele passa a
corresponder.

Lembre-se de que o parâmetro -name diferencia maiúsculas de minúsculas. Se quiser


fazer uma pesquisa que não diferencia maiúsculas de minúsculas, use -iname.

A expressão * .txt deve ser posta entre aspas simples, para evitar que o shell interprete o
padrão como um comando. Experimente sem as aspas e veja o que acontece.

Por padrão, o find começa no ponto de partida e vai descendo pelos subdiretórios (e sub-
diretórios desses subdiretórios) encontrados. Para restringir esse comportamento, use os
parâmetros -maxdepth N, onde N é o número máximo de níveis.

Para pesquisar apenas no diretório atual, usaríamos -maxdepth 1. Suponha que você tem a
seguinte estrutura de diretório:

directory |— clients.txt |— partners.txt -> clients.txt -- somedir |--- anotherdir– clients.txt

Para pesquisar dentro de somedir, você precisará usar -maxdepth 2 (o diretório atual +1
nível abaixo). Para pesquisar dentro de anotherdir, -maxdepth 3 seria necessário (o diretório
atual +2 níveis abaixo). O parâmetro -mindepth N faz o contrário, pesquisando apenas em
diretórios no mínimo N níveis abaixo.

O parâmetro -mount pode ser usado para evitar que o find mergulhe em sistemas de arquivos
montados. Também é possível restringir a pesquisa a tipos específicos de sistemas de arquivos
usando o parâmetro -fstype. Assim, find /mnt -fstype exfat -iname “report” buscaria
somente dentro de sistemas de arquivos exFAT montados sob /mnt.
295 28. O Filesystem Hierarchy Standard
Fabio Gonçalves De Melo Santana / [email protected]

Buscando por atributos


Podemos usar os parâmetros abaixo para pesquisar arquivos com atributos específicos, como
os que podem ser gravados por seu usuário, os que têm um conjunto específico de permissões
ou que têm um determinado tamanho:

• -user USERNAME: Encontra arquivos de que o usuário USERNAME é proprietário;


• -group GROUPNAME: Encontra arquivos de que o grupo GROUPNAME é propri-
etário;
• -readable: Encontra arquivos que podem ser lidos pelo usuário atual;
• -writable: Encontra arquivos que podem ser gravados pelo usuário atual;
• -executable: Encontra arquivos que podem ser executados pelo usuário atual. No
caso dos diretórios, ele encontrará quaisquer diretórios em que o usuário pode entrar
(permissão x);
• -perm NNNN: Encontra quaisquer arquivos que tenham exatamente a permissão
NNNN. Por exemplo, -perm 0664 corresponde a quaisquer arquivos que o usuário e
grupo podem ler e gravar e que outros podem ler (ou rw-rw-r–).

Adicione um - antes de NNNN para procurar por arquivos que tenham pelo menos a permissão
especificada. Por exemplo, -perm -644 encontraria arquivos que tenham permissões de ao
menos 644 (rw-r—r–). Isso inclui arquivos com 664 (rw-rw-r–) ou mesmo 775 (rwxrwx-r-x).

• -empty: Encontra arquivos e diretórios vazios;


• -size N: Encontra quaisquer arquivos de tamanho N, onde N por padrão é um número
de blocos de 512 bytes. Podemos adicionar sufixos a N para as outras unidades: Nc
conta o tamanho em bytes, Nk em kibibytes (KiB, múltiplos de 1024 bytes), NM em
mebibytes (MiB, múltiplos de 1024 * 1024) e NG para gibibytes (GiB, múltiplos de 1024
* 1024 * 1024).

Aqui também, podemos usar os prefixos + ou - (que aqui significam maior que e menor
que) para buscar por tamanhos relativos. Por exemplo, -size -10M corresponderia a qualquer
arquivo menor de 10 MiB.

Assim, para pesquisar arquivos em seu diretório inicial que contenham o padrão report (sem
distinção entre maiúsculas e minúsculas) em qualquer parte do nome, tenham permissões
0644, foram acessados há 10 dias e cujo tamanho é de pelo menos 1 Mib, usaríamos

root@debian10:/home/debian# find / -iname "*report*" -perm 0644 -atime 10 -size +1M


296 28. O Filesystem Hierarchy Standard
Fabio Gonçalves De Melo Santana / [email protected]

Busca por tempo


Além da busca por atributos, também é possível realizar buscas por data e hora, encontrando
arquivos que foram acessados, tiveram seus atributos alterados ou foram modificados durante
um determinado período de tempo. Os parâmetros são:

• -amin N, -cmin N, -mmin N: Corresponde a arquivos que foram acessados, tiveram


atributos alterados ou foram modificados (respectivamente) N minutos atrás;
• -atime N, -ctime N, -mtime N: Corresponde a arquivos que foram acessados, tiveram
atributos alterados ou foram modificados N * 24 horas atrás.

Para -cmin N e -ctime N, qualquer alteração de atributo é levada em conta, incluindo mudanças
nas permissões, leitura ou gravação no arquivo. Isso torna esses parâmetros especialmente
poderosos, uma vez que praticamente qualquer operação envolvendo o arquivo fará com que
ele corresponda aos parâmetros da busca.

O exemplo a seguir corresponderia a qualquer arquivo no diretório atual que foi modificado
há menos de 24 horas e é maior que 100 MiB:

root@debian10:/home/debian# find / -mtime -1 -size +100M

Usando locate e updatedb


locate e updatedb são comandos que podem ser usados para encontrar rapidamente um
arquivo correspondente a um padrão dado em um sistema Linux. Mas, ao contrário de find,
locate não pesquisa por um padrão no sistema de arquivos, em vez disso, ele consulta um
banco de dados construído com a execução do comando updatedb. Os resultados são muito
velozes, mas podem ser imprecisos dependendo da data da última atualização do banco de
dados.

A maneira mais simples de usar locate é simplesmente fornecer a ele um padrão a pesquisar.
Por exemplo, para encontrar todas as imagens JPEG em seu sistema, você usaria locate jpg.
A lista de resultados pode ser bastante longa, mas teria a seguinte aparência:

root@debian10:/home/debian# locate jpg


/usr/share/backgrounds/gnome/AndICallItBoke.jpg
/usr/share/backgrounds/gnome/ColdWarm.jpg
/usr/share/backgrounds/gnome/Dark_Ivy.jpg
/usr/share/backgrounds/gnome/Fabric.jpg
/usr/share/backgrounds/gnome/Flowerbed.jpg
297 28. O Filesystem Hierarchy Standard
Fabio Gonçalves De Melo Santana / [email protected]

Com locate, estamos procurando por padrões, e não por extensões de arquivo.

Em princípio, o padrão diferencia maiúsculas de minúsculas. Isso significa que arquivos con-
tendo .JPG não seriam mostrados, pois o padrão está em letras minúsculas. Para evitar isso,
passe o parâmetro -i para locate. Repetindo nosso exemplo anterior:

root@debian10:/home/debian# locate -i .jpg | head

Para passar vários padrões para locate, basta separá-los com espaços. O exemplo abaixo
faria uma busca sem distinção entre maiúsculas e minúsculas por quaisquer arquivos que
correspondam aos padrões zip e jpg:

root@debian10:/home/debian# locate -i zip jpg | head


/home/debian/qualteupapo.txt.zip
/home/debian/qualteupapo.txt.jpg
/usr/bin/bunzip2
/usr/bin/bzip2
/usr/bin/bzip2recover
/usr/bin/funzip
/usr/bin/gpg-zip

Ao usar múltiplos padrões, você pode solicitar ao locate que exiba apenas os arquivos que
correspondam a todos eles. Isso é feito com a opção -A. O exemplo a seguir mostraria
qualquer arquivo que corresponda aos padrões .jpg e .zip:

root@debian10:/home/debian# locate -A .zip .jpg


/home/debian/qualteupapo.zip.jpg

Se quiser contar o número de arquivos que correspondem a um determinado padrão em vez de


mostrar o caminho completo, você pode usar a opção -c. Por exemplo, para contar o número
de arquivos .jpg em um sistema:

root@debian10:/home/debian# locate -c .jpg


243

Um problema com o locate é que ele mostra apenas as entradas presentes no banco de dados
gerado pelo updatedb (localizado em /var/lib/mlocate.db). Se o banco de dados estiver
298 28. O Filesystem Hierarchy Standard
Fabio Gonçalves De Melo Santana / [email protected]

desatualizado, a saída poderá mostrar arquivos que foram excluídos desde a última vez em
que foi atualizado. Uma maneira de evitar isso é adicionar o parâmetro -e, que fará com que
ele verifique se o arquivo ainda existe antes de mostrá-lo na saída.

Obviamente, isso não fará com que os arquivos criados após a última atualização do banco
de dados apareçam. Para isso será necessário atualizar o banco de dados com o comando
updatedb. O tempo para a execução dessa operação dependerá da quantidade de arquivos em
seu disco.

Controlando o comportamento de updatedb

O comportamento do updatedb pode ser controlado pelo arquivo /etc/updatedb.conf.


Trata-se de um arquivo de texto no qual cada linha controla uma variável. As linhas em
branco são ignoradas e as linhas que começam com o caractere # são tratadas como comen-
tários.

• PRUNEFS=: Quaisquer tipos de sistemas de arquivos indicados após este parâmetro


não serão analisados pelo updatedb. A lista de tipos deve ser separada por espaços e
os tipos em si não diferenciam maiúsculas de minúsculas, de forma que NFS e nfs são
a mesma coisa;
• PRUNENAMES=: Lista de nomes de diretórios separados por espaços que não deverá
ser analisada pelo updatedb;
• PRUNEPATHS=: Lista de nomes de caminhos que devem ser ignorados pelo updat-
edb. Os nomes de caminhos devem ser separados por espaços e especificados da mesma
maneira como seriam mostrados pelo updatedb (por exemplo, /var/spool /media);
• PRUNE_BIND_MOUNTS=: Esta é uma simples variável de yes ou no. Se definida
como yes, as bind mounts (montagens de ligação: diretórios montados em outros locais
com o comando mount –bind) serão ignoradas.

Encontrando binários, páginas de manual e código-fonte


O which é um comando muito útil que mostra o caminho completo para um executável. Por
exemplo, se você quiser localizar o executável para bash, pode usar:

root@debian10:/home/debian# which bash


/usr/bin/bash

Se a opção -a for adicionada, o comando mostrará todos os nomes de caminho que correspon-
dem ao executável. Observe a diferença:
299 28. O Filesystem Hierarchy Standard
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# which mkfs.ext3


/usr/sbin/mkfs.ext3
root@debian10:/home/debian# which -a mkfs.ext3
/usr/sbin/mkfs.ext3
/sbin/mkfs.ext3

Para descobrir quais diretórios estão no PATH, use o comando echo P AT H.Eleexibe(echo)ocontedoda
no terminal.

type é um comando semelhante que mostra informações sobre um binário, incluindo sua
localização e tipo. Basta usar type seguido do nome do comando:

root@debian10:/home/debian# type locate


locate is hashed (/usr/bin/locate)

O parâmetro -a funciona da mesma maneira que em which, mostrando todos os nomes de


caminho que correspondem ao executável. Assim:

root@debian10:/home/debian# type -a locate


locate is /usr/bin/locate
locate is /bin/locate

E o parâmetro -t mostra o tipo de arquivo do comando que pode ser alias, keyword, function,
builtin ou file. Por exemplo:

root@debian10:/home/debian# type -t locate


file
root@debian10:/home/debian# type -t type
builtin

O comando whereis é mais versátil e, além dos binários, também pode ser usado para mostrar
a localização das páginas do manual ou mesmo o código-fonte de um programa (se disponível
em seu sistema). Basta digitar whereis seguido do nome binário:

root@debian10:/home/debian# whereis locate


locate: /usr/bin/locate.findutils /usr/bin/locate /usr/lib/x86_64-linux-gnu/locate /usr/
share/man/man1/locate.1.gz
300 28. O Filesystem Hierarchy Standard
Fabio Gonçalves De Melo Santana / [email protected]

Os resultados acima incluem binários (/usr/bin/locate) e páginas de manual comprimidas


(/usr/share/man/man1/locate.1.gz).

Podemos filtrar rapidamente os resultados usando opções de linha de comando como -b, para
limitá-los apenas aos binários, -m, para limitá-los apenas a páginas de manual, ou -s, para
limitá-los apenas ao código-fonte. Repetindo o exemplo acima, os resultados seriam:

root@debian10:/home/debian# whereis -b locate


locate: /usr/bin/locate.findutils /usr/bin/locate /usr/lib/x86_64-linux-gnu/locate
root@debian10:/home/debian# whereis -m locate
locate: /usr/share/man/man1/locate.1.gz

Resumo
Nesta lição, você aprendeu sobre a organização básica do sistema de arquivos em uma máquina
Linux, de acordo com o FHS, e como encontrar binários e arquivos, seja por nome ou por
atributos. Os seguintes comandos foram discutidos nesta lição:

• find: Um comando versátil usado para encontrar arquivos e pastas segundo uma var-
iedade de critérios de pesquisa;
• locate: Um utilitário que usa um banco de dados local contendo a localização dos
arquivos armazenados localmente;
• updatedb: Atualiza o banco de dados local usado pelo comando locate;
• which: Exibe o caminho completo até um executável;
• whereis: Exibe a localização das páginas de manual, binários e código-fonte no sistema;
• type: Exibe a localização de um binário e de que tipo de aplicativo se trata (um
programa instalado, um programa interno do Bash e assim por diante).
301 28. O Filesystem Hierarchy Standard
Fabio Gonçalves De Melo Santana / [email protected]

Tavez isso possa te ajudar. . .

Fig. 28.1: FHS

• Fonte: https://twitter.com/Alra3ees/status/1181028153944358913/photo/1
Fabio Gonçalves De Melo Santana / [email protected]

29
105.1 Personalizar e usar o
ambiente do shell

Introdução
Acredito que não preciso dizer, mas já dizendo, o nosso querido shell é a ferramenta mais foda
do Linux. Ele pode ser definido como uma interface entre o usuário e o kernel do sistema
operacional. Além de interpretar os comandos inseridos pelo usuário. Dessa forma, todos os
administradores de sistema devem saber usar o shell. Como você já deve ter entendido, o
Bourne Again Shell (Bash) é o shell de fato na grande maioria das distribuições Linux.

A primeira coisa que o Bash ou qualquer outro shell faz é executar uma série de scripts de
inicialização. Esses scripts personalizam o ambiente da sessão. Existem scripts que afetam
todo o sistema e outros específicos do usuário. Podemos colocar as preferências ou configu-
rações pessoais que melhor atendam às necessidades dos usuários nesses scripts na forma de
variáveis, aliases e funções.

A série exata de arquivos de inicialização depende de um parâmetro muito importante: o tipo


de shell. Vamos dar uma olhada na variedade existente.

Tipos de shell: Interativo x Não-interativo e Login vs sem login


• Shells interativos / não-interativos: Este tipo de shell refere-se à interação que
ocorre entre o usuário e o shell: O usuário fornece a entrada digitando comandos no

302
303 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

terminal com o teclado; o shell fornece a saída imprimindo mensagens na tela;


• Shells com login / sem login: Esse tipo de shell se refere ao caso de um usuário que
acessa um sistema fornecendo suas credenciais, como nome de usuário e senha.

Os shells interativos e não interativos podem ser de login ou sem login; qualquer combinação
possível desses tipos tem seus usos específicos.

Os shells de login interativos são executados quando os usuários fazem login no sistema, e são
usados para personalizar as configurações de usuário de acordo com suas necessidades. Um
bom exemplo do uso desse tipo de shell seria um grupo de usuários pertencentes ao mesmo
departamento de uma empresa que precisam de uma determinada variável definida em suas
sessões.

Shells sem login interativos são quaisquer outros shells abertos pelo usuário após o login
no sistema. Os usuários empregam esses shells durante as sessões para realizar tarefas de
manutenção e administrativas, como definir variáveis, data e hora, copiar arquivos, criar scripts
etc.

Por outro lado, os shells não-interativos não requerem nenhum tipo de interação humana.
Dessa forma, esses shells não pedem entrada de dados pelo usuário e sua saída—quando
existe—é, na maioria dos casos, gravada em um log.

Os shells de login não-interativos são bastante raros e pouco práticos. Eles praticamente
não têm utilidade e nós só estamos falando deles para você conhecer outros aspectos do
comportamento do shell. Alguns exemplos incomuns incluem forçar um script a ser executado
a partir de um shell de login com /bin/bash –login ou canalizando a saída padrão (stdout) de
um comando para a entrada padrão (stdin) de uma conexão ssh:

<some_command> | ssh <some_user>@<some_server>

No caso do shell não-interativo e sem login, não há interação nem login em nome do usuário;
portanto, estamos nos referindo aqui ao uso de scripts automatizados. Esses scripts são
usados principalmente para realizar tarefas administrativas e de manutenção repetitivas, como
as incluídas em cronjobs. Nesses casos, o bash não lê nenhum arquivo de inicialização.

Abrindo um terminal
Quando estamos em um ambiente de desktop, podemos abrir um aplicativo de terminal ou
mudar para um dos consoles do sistema. Portanto, um novo shell pode ser um shell pts, quando
aberto a partir de um emulador de terminal na GUI, ou um shell tty, quando executado em um
304 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

console do sistema. No primeiro caso, não estamos lidando com um terminal, mas com um
emulador de terminal. Por serem parte das sessões gráficas, os emuladores de terminal, como
o gnome-terminal ou o konsole, são muito ricos em recursos e fáceis de usar em comparação
com os terminais de interface de usuário baseados em texto.

Usando as combinações Ctrl+Alt+F1-F6 podemos ir para os logins do console, que abrem um


shell de login interativo baseado em texto. Ctrl+Alt+F7 leva a sessão de volta para a área de
trabalho.

tty significa teletypewritter (teletipo); pts é a abreviação de pseudo terminal slave


(pseudo terminal escravo). Para saber mais: man tty e man pts.

Lançando shells com o bash


Após fazer o login, digite bash em um terminal para abrir um novo shell. Tecnicamente, este
shell é um processo filho do shell atual.

Ao iniciar o processo filho bash, podemos especificar diversas opções para definir que tipo de
shell queremos iniciar. Eis algumas opções importantes de invocação no bash:

• bash -l ou bash –login: Invoca um shell de login;


• bash -i: Invoca um shell interativo;
• bash –noprofile: Com shells de login, ignora o arquivo de inicialização do sistema
/etc/profile e os arquivos de inicialização em nível de usuário ~/.bash_profile, ~/.bash_lo-
gin e ~/.profile;
• bash –norc: Com shells interativos, ignora tanto o arquivo de inicialização do sistema
/etc/bash.bashrc quanto o arquivo de inicialização em nível de usuário ~/.bashrc;
• bash –rcfile : Com shells interativos, considera como arquivo de inicialização, ignorando
os arquivos de inicialização do sistema /etc/bash.bashrc e em nível de usuário ~/.bashrc.

Discutiremos abaixo os diversos arquivos de inicialização.

Iniciando shells com su e sudo


Graças a esses dois programas semelhantes, podemos obter tipos específicos de shell:

1. su: Muda o ID de usuário ou o torna superusuário (root). Com este comando, podemos
chamar shells de login e sem login:
• su - debian, su -l debian ou su –login debian: Iniciam um shell de login
interativo como debian;
305 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

• su debian: Inicia um shell sem login interativo como debian;


• su - root ou su -: Inicia um shell de login interativo como root;
• su root ou su: Inicia um shell interativo sem login como root.
2. sudo: Executa comandos como outro usuário (incluindo o superusuário). Como este co-
mando é usado principalmente para obter privilégios de root temporariamente, o usuário
que o emprega deve estar no arquivo sudoers. Para adicionar usuários a sudoers, pre-
cisamos nos tornar root e então executar:

root@debian:~# usermod -aG sudo debian

Assim como o su, o sudo permite invocar shells de login e sem login:

• sudo su - debian, sudo su -l debian ou sudo su –login debian: Iniciam um shell


de login interativo como debian;
• sudo su debian: Inicia um shell sem login interativo como debian;
• sudo -u debian -s: Inicia um shell sem login interativo como debian;
• sudo su - root ou sudo su: Inicia um shell de login interativo como root;
• sudo -i: Inicia um shell de login interativo como root;
• sudo -i : Inicia um shell de login interativo como root, executa o comando e retorna
ao usuário original;
• sudo su root ou sudo su: Inicia um shell sem login interativo como root;
• sudo -s ou sudo -u root -s: Iniciam um shell sem login como root.

Ao usar su ou sudo, é importante considerar o contexto particular antes de iniciar um novo


shell: Precisamos ou não do ambiente do usuário de destino? Se a resposta for sim, usaríamos
as opções que invocam shells de login; se não, as que invocam shells sem login.

Qual o meu tipo de shell?


Para descobrir em que tipo de shell estamos trabalhando, podemos digitar echo $0 no terminal
e obter a seguinte saída:

• Interativo de login: -bash ou -su;


• Interativo sem login: bash or /bin/bash;
• Não-interativo sem login (scripts): nome_do_script.

Quantos shells nós temos?


Para ver quantos shells do bash estão rodando no sistema, podemos usar o comando ps aux |
grep bash:
306 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

debian@debian:~$ ps aux | grep bash


debian 5270 0.1 0.1 25532 5664 pts/0 Ss 23:03 0:00 bash
debian 5411 0.3 0.1 25608 5268 tty1 S+ 23:03 0:00 -bash
debian 5452 0.0 0.0 16760 940 pts/0 S+ 23:04 0:00 grep --color=auto bash

De onde os shells obtêm sua configuração: arquivos de inicialização


Bem, agora que sabemos os tipos de shell que podemos encontrar em um sistema Linux, é
hora de aprender quais arquivos de inicialização são executados por qual shell. Observe que
os scripts referentes a todo o sistema, ou globais, são postos no diretório /etc/, enquanto que
os scripts locais ou em nível de usuário são encontrados no diretório inicial do usuário (~).
Além disso, quando existe mais de um arquivo a ser pesquisado, logo que um é encontrado e
executado, os outros são ignorados. Explore e estude esses arquivos com seu editor de texto
favorito ou digitando less.

Os arquivos de inicialização podem ser divididos em específicos do Bash (limitados


apenas a configurações e comandos do bash) e gerais (relacionados à maioria dos
shells).

Shell de login interativo

Nível global

• /etc/profile: Arquivo .profile de todo o sistema para o shell Bourne e shells com-
patíveis com Bourne (incluindo o bash). Através de uma série de instruções if, esse
arquivo define uma série de variáveis como PATH e PS1 conforme necessário, além de
buscar e executar—se existirem—o arquivo /etc/bash.bashrc e os que estão no diretório
/etc/profile.d;
• /etc/profile.d/: Este diretório pode conter scripts que são executados por /etc/profile.

Nível local

• ~/.bash_profile: Este arquivo específico do Bash é usado para configurar o ambiente


do usuário. Também pode ser usado para buscar e executar ~/.bash_login e ~/.profile;
• ~/.bash_login: Também específico ao Bash, este arquivo só será executado se não
houver um arquivo ~/.bash_profile. Seu nome sugere que deve ser usado para executar
comandos necessários no login;
• ~/.profile: Este arquivo não é específico ao Bash e só é originado se nem ~/.bash_profile
nem ~/.bash_login existirem—o que normalmente é o caso. Assim, a principal finalidade
307 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

de ~/.profile é conferir se um shell Bash está sendo executado e—se estiver—buscar


~/.bashrc e executá-lo caso exista. Ele normalmente define a variável PATH para que
ela inclua o diretório privado ~/bin do usuário se ele existir;
• ~/.bash_logout: Se existir, este arquivo específico do Bash faz algumas operações de
limpeza ao sair do shell. Isso pode ser conveniente em certos casos, como as sessões
remotas.

Explorando os arquivos de configuração do shell de login interativo

Vamos mostrar alguns desses arquivos em ação modificando /etc/profile e /home/debian/.pro-


file. A cada um deles, anexamos uma linha para relembrar o arquivo que está sendo executado:

root@debian:~# echo 'echo Ola... /etc/profile' >> /etc/profile


root@debian:~# echo 'echo Ola... ~/.profile' >> ~/.profile

Dois operadores de redirecionamento » acrescentam a saída de um comando a um


arquivo existente sem sobrescrevê-lo. Porém, se o arquivo não existir, ele será criado.

Assim, através da saída de seus respectivos comandos echo, sabemos quando cada um desses
arquivos é lido e executado. Para demonstrar, vamos ver o que acontece quando debian se
loga via ssh a partir de outra máquina:

debian@debian:~$ ssh [email protected]


[email protected]'s password:
Linux debian 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent


permitted by applicable law.
Last login: Tue Nov 27 19:57:19 2018 from 192.168.1.10
Ola... /etc/profile
Ola... /home/debian/.profile

Como mostram as duas últimas linhas, deu tudo certo. Além disso, observe três coisas:

• O arquivo global foi executado primeiro;


• Não havia arquivos .bash_profile ou .bash_login no diretório inicial de debian;
• O til (~) expandiu-se para o caminho absoluto do arquivo (/home/debian/.profile).
308 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

Shell interativo sem login

Nível global - /etc/bash.bashrc: Este é o arquivo .bashrc de todo o sistema para shells
bash interativos. Ao longo de sua execução, o bash garante que ele esteja sendo executado de
maneira interativa, verifica o tamanho da janela após cada comando (atualizando os valores
de LINES e COLUMNS se necessário) e define algumas variáveis.

Nível local - ~/.bashrc: Além de realizar tarefas semelhantes às descritas para /etc/bash.bashrc
no nível do usuário (como verificar o tamanho da janela ou se está sendo executado intera-
tivamente), este arquivo específico do Bash geralmente define algumas variáveis de histórico
e busca e executa ~/.bash_aliases, se existir. Além disso, esse arquivo é normalmente usado
para armazenar aliases e funções específicas dos usuários.

Da mesma forma, também é importante notar que ~/.bashrc é lido se o bash detectar que é
uma conexão de rede (como era o caso com a conexão Secure Shell (SSH) no exemplo acima).

Explorando arquivos de configuração de shell interativo sem login

Vamos modificar /etc/bash.bashrc e /home/debian/.bashrc:

root@debian:~# echo 'echo Ola... /etc/bash.bashrc' >> /etc/bash.bashrc


root@debian:~# echo 'echo Ola... ~/.bashrc' >> ~/.bashrc

E isso é o que acontece quando o debian inicia um novo shell:

debian@debian:~$ bash
Ola... /etc/bash.bashrc
Ola... /home/debian/.bashrc

Novamente, os dois arquivos foram lidos e executados.

Lembre-se, devido à ordem em que os arquivos são executados, os arquivos locais têm
precedência sobre os globais.

Shell de login não interativo

Um shell não-interativo com as opções -l ou –login é forçado a se comportar como um shell


de login, e assim os arquivos de inicialização a serem executados serão iguais aos dos shells de
login interativos.
309 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

Para provar, vamos escrever um script simples e torná-lo executável. Não incluiremos nenhum
shebang porque invocaremos o executável do bash (/bin/bash com a opção de login) a partir
da linha de comando.

1. Criamos o script teste.sh contendo a linha echo ‘Ola. . . a script’ para ser possível provar
que o script foi executado com sucesso:

debian@debian:~$ echo "echo 'Ola... a script'" > teste.sh

2. Tornamos o script executável:

debian@debian:~$ chmod +x ./teste.sh

3. Finalmente, invocamos bash com a opção -l para executar o script:

debian@debian:~$ bash -l ./teste.sh


Ola... /etc/profile
Ola... /home/debian/.profile
Ola... a script

Funcionou! Antes de executar o script, o login foi feito e tanto /etc/profile quanto ~/.profile
foram executados.

Aprenderemos sobre shebangs e todos os outros aspectos dos scripts do shell em lições
futuras.

Vamos agora mandar a saída padrão (stdout) do comando echo para a entrada padrão (stdin)
de uma conexão ssh por meio de um pipe (|):

debian@debian:~$ echo "Ola shell nao interativo" | ssh [email protected]


Pseudo-terminal will not be allocated because stdin is not a terminal.
[email protected] password:
Linux debian 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent


permitted by applicable law.
310 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

Ola... /etc/profile
Ola... /home/debian/.profile
-bash: line 1: Ola shell nao interativo: command not found

Novamente, /etc/profile and ~/.profile são executados. Fora isso, a primeira e a última linha
da saída são bastante reveladoras no que diz respeito ao comportamento do shell.

Shell não-interativo sem login

Os scripts não leem nenhum dos arquivos listados acima, mas procuram a variável de ambiente
BASH_ENV, expandem seu valor se necessário e o usam como nome de um arquivo de
inicialização para ler e executar comandos. Aprenderemos mais sobre variáveis de ambiente
na próxima lição.

Como dito acima, tipicamente /etc/profile e ~/.profile garantem que /etc/bash.bashrc e


~/.bashrc sejam executados após um login bem-sucedido. A saída do comando a seguir
mostra esse fenômeno:

root@debian:~# su - debian
Ola... /etc/bash.bashrc
Ola... /etc/profile
Ola... /home/debian/.bashrc
Ola... /home/debian/.profile

Tendo em mente as linhas que anexamos anteriormente aos scripts de inicialização,invocando


um shell de login interativo no nível do usuário com su - debian, as quatro linhas da saída
podem ser explicadas da seguinte forma:

1. Ola. . . /etc/bash.bashrc significa que /etc/profile buscou e executou /etc/bash.bashrc;


2. Ola. . . /etc/profile significa que /etc/profile foi inteiramente lido e executado;
3. Ola. . . /home/debian/.bashrc significa que ~/.profile buscou e executou ~/.bashrc;
4. Ola. . . /home/debian/.profile significa que ~/.profile foi inteiramente lido e executado.

Note que, com su - (e também su -l e su –login ), garantimos a invocação de um shell de


login, ao passo que su teria invocado somente /etc/bash.bashrc e ~/.bashrc.

A origem dos arquivos de inicialização do shell: SKEL


SKEL é uma variável cujo valor é o caminho absoluto para o diretório skel. Esse diretório serve
como modelo para a estrutura do sistema de arquivos dos diretórios pessoais dos usuários. Ele
inclui os arquivos que serão herdados por qualquer nova conta de usuário criada (incluindo,
311 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

é claro, os arquivos de configuração dos shells). SKEL e outras variáveis relacionadas são
armazenadas em /etc/adduser.conf, que é o arquivo de configuração para adduser:

debian@debian:~$ grep SKEL /etc/adduser.conf


# The SKEL variable specifies the directory containing "skeletal" user
SKEL=/etc/skel
# If SKEL_IGNORE_REGEX is set, adduser will ignore files matching this
SKEL_IGNORE_REGEX="dpkg-(old|new|dist|save)"

SKEL está definido em /etc/skel, assim, os scripts de inicialização que configuram nossos
shells estarão lá:

debian@debian:~$ ls -a /etc/skel/
. .. .bash_logout .bashrc .profile

Lembre-se de que os arquivos que começam com . estão ocultos, portanto é preciso
usar ls -a para vê-los ao listar o conteúdo do diretório.

Vamos agora criar um diretório em /etc/skel para armazenar os scripts pessoais de todos os
novos usuários:

1. Como root, entramos em /etc/skel:

root@debian:~# cd /etc/skel/
root@debian:/etc/skel#

2. Listamos o conteúdo:

root@debian:/etc/skel# ls -a
. .. .bash_logout .bashrc .profile

3. Criamos o diretório e verificamos se tudo correu como esperado:

root@debian:/etc/skel# mkdir meu_script_pessoal


root@debian:/etc/skel# ls -a
. .. .bash_logout .bashrc meu_script_pessoal .profile
312 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

4. A seguir, removemos debian junto com seu diretório home:

root@debian:~# deluser --remove-home debian


Looking for files to backup/remove ...
Removing files ...
Removing user `debian' ...
Warning: group `debian' has no more members.
Done.

5. Adicionamos debian novamente para que receba um novo diretório inicial:

root@debian:~# adduser debian


Adding user `debian' ...
Adding new group `debian' (1001) ...
Adding new user `debian' (1001) with group `debian' ...
Creating home directory `/home/debian' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for debian
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y

6. Finalmente, nos logamos como debian e listamos todos os arquivos em /home/debian


para verificar se tudo correu como esperado:

root@debian:~# su - debian
debian@debian:~$ pwd
/home/debian
debian@debian:~$ ls -a
. .. .bash_history .bash_logout .bashrc meu_script_pessoal .profile

Deu tudo certo.

Variáveis: atribuição e referência


Uma variável pode ser definida como um nome que contém um valor.

No Bash, a atribuição um valor a um nome é chamado de atribuição de variável e é a maneira


313 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

pela qual criamos ou definimos variáveis. Por outro lado, o processo de acesso ao valor contido
no nome é denominado referenciamento de variável.

A sintaxe para atribuir variáveis é:

<nome_da_variável>=<valor_da_variável>

Por exemplo:

$ distro=joatham

A variável distro é igual a joatham, ou seja, há uma parte da memória que contém o valor
joatham—sendo distro o indicador para ele.

Observe, no entanto, que não pode haver nenhum espaço em qualquer lado do sinal de igual
ao se atribuir uma variável:

root@debian:~$ distro =joatham


-bash: distro: command not found
root@debian:~$ distro= joatham
-bash: joatham: command not found

Devido ao nosso erro, o Bash leu distro e joatham como comandos.

Para referenciar uma variável (ou seja, para verificar seu valor), usamos o comando echo antes
do nome da variável com um sinal $:

root@debian:~$ echo $distro


joatham

Nomes de variáveis
Ao escolher o nome das variáveis, existem certas regras que devemos levar em consideração.

O nome da variável pode conter letras (a-z, A-Z), números (0-9) e sublinhados (_):
314 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

root@debian:~$ distro=joatham
root@debian:~$ echo $distro
joatham
root@debian:~$ DISTRO=joatham
root@debian:~$ echo $DISTRO
joatham
root@debian:~$ distro_1=joatham
root@debian:~$ echo $distro_1
joatham
root@debian:~$ _distro=joatham
root@debian:~$ echo $_distro
joatham

Ele não deve começar com um número para não confundir o Bash:

root@debian:~$ 1distro=joatham
-bash: 1distro=joatham: command not found

Não deve conter espaços (nem mesmo entre aspas); por convenção, os sublinhados são usados
no lugar dos espaços:

root@debian:~$ "my distro"=joatham


-bash: my: command not found
root@debian:~$ my_distro=joatham
root@debian:~$ echo $my_distro
joatham

Valores das variáveis


No que diz respeito à referência ou valor das variáveis, também é importante considerar uma
série de regras.

As variáveis podem conter quaisquer caracteres alfanuméricos (a-z, A-Z, 0-9), além da maioria
dos outros caracteres (?, !, *, ., / etc.):

root@debian:~$ distro=4linux12.4?
root@debian:~$ echo $distro
4linux12.4?

Os valores das variáveis devem ser postos entre aspas se contiverem espaços simples:
315 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

root@debian:~$ distro=4linux 12.4


-bash: 12.4: command not found
root@debian:~$ distro="4linux 12.4"
root@debian:~$ echo $distro
4linux 12.4
root@debian:~$ distro='4linux 12.4'
root@debian:~$ echo $distro
4linux 12.4

Os valores das variáveis também devem ser postos entre aspas se contiverem caracteres como
os usados para redirecionamento (<, >) ou o símbolo de barra vertical (|). A única coisa que
o comando a seguir faz é criar um arquivo vazio chamado 4linux:

root@debian:~$ distro=>4linux
root@debian:~$ echo $distro

root@debian:~$ ls 4linux
4linux

Mas quando usamos as aspas, a coisa funciona:

root@debian:~$ distro=">4linux"
root@debian:~$ echo $distro
>4linux

No entanto, aspas simples e duplas nem sempre são intercambiáveis. Dependendo do que
estamos fazendo com uma variável (atribuindo ou referenciando), o uso de uma ou de outra
tem implicações e produzirá resultados diferentes. No contexto da atribuição de variáveis, as
aspas simples consideram literalmente todos os caracteres do valor da variável, enquanto as
aspas duplas permitem a substituição de variáveis:

root@debian:~$ qualteupapo=instagram
root@debian:~$ qualquercoisa='Meu $qualteupapo'
root@debian:~$ echo $qualquercoisa
Meu $qualteupapo
root@debian:~$ qualquercoisa="Meu $qualteupapo"
root@debian:~$ echo $qualquercoisa
Meu instagram

Por outro lado, ao referenciar uma variável cujo valor inclui alguns espaços iniciais (ou extras),
às vezes combinados com asteriscos, é obrigatório usar aspas duplas após o comando echo
316 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

para evitar divisão de campos e expansão de nome de caminho:

root@debian:~$ qualteupapo=" inscreve | instagram"


root@debian:~$ echo $qualteupapo
inscreve | instagram
root@debian:~$ echo "$qualteupapo"
inscreve | instagram

Se a referência da variável contiver um ponto de exclamação no final, este deve ser o último
caractere da string (caso contrário, o Bash pensará que estamos nos referindo a um evento de
history):

root@debian:~$ distro=4linux.?/!os
-bash: !os: event not found
root@debian:~$ distro=4linux.?/!
root@debian:~$ echo $distro
4linux.?/!

Todas as barras invertidas devem ser escapadas com outra barra invertida. Aliás, se uma
barra invertida for o último caractere na string e não o escaparmos, o Bash interpretará que
queremos uma quebra de linha e criará uma nova linha:

root@debian:~$ distro=joatham\
>
root@debian:~$ distro=joatham\\
root@debian:~$ echo $distro
joatham\

Nas próximas duas seções, resumiremos as principais diferenças entre as variáveis locais e de
ambiente.

Variáveis locais ou do Shell


Variáveis locais ou de shell existem apenas no shell em que foram criadas. Por convenção, as
variáveis locais são escritas em letras minúsculas.

Para realizar alguns testes, vamos criar uma variável local. Conforme explicado acima, escol-
hemos um nome de variável apropriado e o igualamos a um valor apropriado. Por exemplo:

root@debian:~$ reptil=jabuti
317 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

Vamos agora usar o comando echo para referenciar nossa variável e verificar se tudo correu
conforme o esperado:

root@debian:~$ echo $reptil


jabuti

Em certos cenários a imutabilidade pode ser um recurso interessante das variáveis. Se quis-
ermos que nossas variáveis sejam imutáveis, podemos criá-las em modo readonly (somente
leitura):

root@debian:~$ readonly reptil=jabuti

Ou transformá-las em somente leitura depois de criá-las:

root@debian:~$ reptil=jabuti
root@debian:~$ readonly reptil

Agora, se tentarmos alterar o valor de reptil, o Bash se recusará:

root@debian:~$ reptil=qualteupapo
-bash: distro: readonly variable

Para listar todas as variáveis somente leitura da sessão atual, digite readonly ou read-
only -p no terminal.

Um comando útil ao lidar com variáveis locais é set.

O set exibe uma saída com todas as variáveis e funções do shell atribuídas atualmente. Como
podem ser muitas linhas (experimente você mesmo!), recomendamos usá-lo em combinação
com um paginador como o less:

root@debian:~$ set | less


BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:
force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:
sourcepath
318 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="4" [2]="12" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='4.4.12(1)-release'
(...)

Será que nossa variável reptil está aqui?

root@debian:~$ set | grep reptil


reptil=jabuti

Sim, aí está ela!

Todavia, reptil, por ser uma variável local, não será herdada por nenhum processo filho nascido
do shell atual:

root@debian:~$ bash
root@debian:~$ set | grep reptil
root@debian:~$

E, é claro, também não podemos ecoar seu valor:

root@debian:~$ echo $reptil


root@debian:~$

Ao digitar o comando bash no terminal, abrimos um novo shell (filho).

Para remover variáveis definidas (locais ou globais), usamos o comando unset:

root@debian:~$ echo $reptil


jabuti
root@debian:~$ unset reptil
root@debian:~root@debian:~$ echo $reptil
root@debian:~$
319 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

unset deve ser seguido somente pelo nome da variável (não precedido pelo símbolo
$).

Variáveis globais ou de ambiente


Existem variáveis globais ou de ambiente para o shell atual, bem como para todos os processos
subsequentes gerados a partir dele. Por convenção, as variáveis de ambiente são escritas em
letras maiúsculas:

root@debian:~$ echo $SHELL


/bin/bash

Podemos passar recursivamente o valor dessas variáveis para outras variáveis e o valor da
última acabará por se expandir para o da primeira:

root@debian:~$ meu_shell=$SHELL
root@debian:~$ echo $meu_shell
/bin/bash
root@debian:~$ seu_shell=$meu_shell
root@debian:~$ echo $seu_shell
/bin/bash
root@debian:~$ our_shell=$seu_shell
root@debian:~$ echo $our_shell
/bin/bash

Para que uma variável local do shell se torne uma variável de ambiente, usamos o comando
export:

root@debian:~$ export reptil

Com export reptil, transformamos nossa variável local em uma variável de ambiente para que
os shells filhos possam reconhecê-la e usá-la:

root@debian:~$ bash
root@debian:~$ echo $reptil
jabuti

Da mesma maneira, export pode ser usado para definir e exportar uma variável de uma só vez:
320 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

root@debian:~$ export anfibio=sapo

Agora podemos abrir uma nova instância do Bash e referenciar com sucesso a nova variável:

root@debian:~$ bash
root@debian:~$ echo $anfibio
sapo

Com export -n, a variável será novamente transformada em variável local do shell.

O comando export também nos dá uma lista de todas as variáveis de ambiente existentes
quando inserido sozinho (ou com a opção -p):

root@debian:~$ export
declare -x HOME="/home/debian"
declare -x LANG="en_GB.UTF-8"
declare -x LOGNAME="debian"
(...)
declare -x PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
declare -x PWD="/home/debian"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_CLIENT="192.168.1.10 49330 22"
declare -x SSH_CONNECTION="192.168.1.10 49330 192.168.1.7 22"
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="xterm-256color"
declare -x USER="debian"
declare -x XDG_RUNTIME_DIR="/run/user/1001"
declare -x XDG_SESSION_ID="8"
declare -x reptil="jabuti"

O comando declare -x equivale a export.

Dois outros comandos que podem ser usados para imprimir na tela uma lista de todas as
variáveis de ambiente são env e printenv:

root@debian:~$ env
SSH_CONNECTION=192.168.1.10 48678 192.168.1.7 22
LANG=en_GB.UTF-8
XDG_SESSION_ID=3
USER=debian
321 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

PWD=/home/debian
HOME=/home/debian
SSH_CLIENT=192.168.1.10 48678 22
SSH_TTY=/dev/pts/0
MAIL=/var/mail/debian
TERM=xterm-256color
SHELL=/bin/bash
SHLVL=1
LOGNAME=debian
XDG_RUNTIME_DIR=/run/user/1001
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
_=/usr/bin/env

Além de ser um sinônimo de env, às vezes podemos usar printenv de forma semelhante à que
usamos o comando echo para verificar o valor de uma variável:

root@debian:~$ echo $PWD


/home/debian
root@debian:~$ printenv PWD
/home/debian

Note, entretanto, que com printenv o nome da variável não é precedido por $.

PWD armazena o caminho do diretório de trabalho atual. Aprenderemos mais sobre


esta e outras variáveis de ambiente comuns posteriormente.

Variáveis de ambiente comuns


Agora é hora de revisar algumas das variáveis de ambiente mais relevantes que são definidas
nos arquivos de configuração do Bash.

1. DISPLAY Relacionada ao servidor X, o valor desta variável geralmente se compõe de


três elementos:

• O nome do host (localhost se esse dado estiver ausente) no qual o servidor X está
rodando;
• Dois pontos como delimitador;
• Um número (normalmente é 0 e se refere à tela do computador).

root@debian:~$ printenv DISPLAY


:0
322 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

Um valor vazio para esta variável indica um servidor sem um X Window System. Um número
extra—como em my.xserver:0:1—faria referência ao número da tela, caso haja mais de uma.

2. HISTCONTROL Esta variável controla quais comandos são salvos em HISTFILE (veja
abaixo). São três valores possíveis:
• ignorespace: Comandos iniciados com um espaço não serão salvos.
• ignoredups: Um comando idêntico ao anterior não será salvo.
• ignoreboth: Comandos que se encaixam em uma das duas categorias anteriores
não serão salvos.
root@debian:~$ echo $HISTCONTROL
ignoreboth

3. HISTSIZE Define o número de comandos a armazenar na memória enquanto durar a


sessão do shell.

root@debian:~$ echo $HISTSIZE


1000

4. HISTFILESIZE

Define o número de comandos a serem salvos em HISTFILE, tanto no início quanto no final
da sessão:

root@debian:~$ echo $HISTFILESIZE


2000

5. HISTFILE

O nome do arquivo que armazena todos os comandos à medida que são digitados. Por padrão,
esse arquivo está localizado em ~/.bash_history:

root@debian:~$ echo $HISTFILE


/home/debian/.bash_history

Para visualizar o conteúdo de HISTFILE, é só digitar history. Alternativamente, podemos


especificar o número de comandos que queremos ver passando um argumento (o número dos
comandos mais recentes) para history, como em history 3.
323 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

6. HOME Esta variável armazena o caminho absoluto do diretório home do usuário atual
e é definido quando o usuário faz login.

Este trecho de código—de ~/.profile—é autoexplicativo (ele abre e executa “$HOME/.bashrc”,


se existir):

# include .bashrc if it exists


if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi

Lembre-se que ~ equivale a $HOME:

root@debian:~$ echo ~; echo $HOME


/home/pedro
/home/pedro

Os comandos podem ser concatenados com um ponto e vírgula (;).

Também podemos provar esse ponto com uma declaração if:

root@debian:~$ if [ ~ == "$HOME" ]; then echo "true"; else "false"; fi


true

Lembre-se: o sinal de igual = é usado para a atribuição de variáveis. == é usado


para testar a igualdade.

7. HOSTNAME Esta variável armazena o nome TCP/IP do computador hospedeiro:

root@debian:~$ echo $HOSTNAME


debian

8. HOSTTYPE Armazena a arquitetura do processador do computador hospedeiro:


324 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

root@debian:~$ echo $HOSTTYPE


x86_64

9. LANG Esta variável salva o idioma do sistema:

root@debian:~$ echo $LANG


en_UK.UTF-8

10. LD_LIBRARY_PATH Esta variável consiste em um conjunto de diretórios separa-


dos por dois pontos nos quais as bibliotecas compartilhadas são compartilhadas por
programas:

root@debian:~$ echo $LD_LIBRARY_PATH


/usr/local/lib

11. MAIL Esta variável armazena o arquivo no qual o Bash procura por email:

root@debian:~$ echo $MAIL


/var/mail/pedro

Outro valor comum para esta variável é /var/spool/mail/$USER.

12. MAILCHECK Esta variável armazena um valor numérico que indica, em segundos, a
frequência com que o Bash verifica se há novas mensagens:

root@debian:~$ echo $MAILCHECK


60

13. PATH Esta variável de ambiente armazena a lista de diretórios onde o Bash procura
por arquivos executáveis quando instruído a executar qualquer programa. Em nossa
máquina de exemplo, esta variável é definida através do arquivo de sistema /etc/profile:

if [ "`id -u`" -eq 0 ]; then


PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
325 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

fi
export PATH

Através da declaração if, a identidade do usuário é testada e, dependendo do resultado do teste


(root ou outro) obtemos um PATH ou o outro. Finalmente, o PATH escolhido é propagado
com export.

Há duas coisas a observar em relação ao valor de PATH:

• Os nomes de diretórios são escritos usando caminhos absolutos;


• O sinal de dois pontos é usado como delimitador.

Se quisermos incluir a pasta /usr/local/sbin no PATH para usuários regulares, modificamos a


linha para que fique assim:

(...)
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/local/sbin"
fi
export PATH

Agora podemos ver como o valor da variável muda quando fazemos login como usuário regular:

# su - pedro
root@debian:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/local/sbin

Também poderíamos ter adicionado /usr/local/sbin ao PATH do usuário na linha


de comando, seja digitando PATH=/usr/local/sbin:P AT HouP AT H =PATH:/us-
r/local/sbin—a primeira opção torna /usr/local/sbin o primeiro diretório em que os
arquivos executáveis serão buscados; a segunda faz dele o último.

14. PS1 Essa variável armazena o valor do prompt do Bash. No trecho de código a seguir
(igualmente de /etc/profile), a declaração if testa a identidade do usuário e lhe atribui
um prompt bastante personalizado (# para root ou $ para usuários regulares):

if [ "`id -u`" -eq 0 ]; then


PS1='# '
else
PS1='$ '
326 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

fi

O id de root é 0. Entre como root e teste você mesmo com id -u.

Eis algumas outras variáveis de prompt:

15. PS2 Normalmente definido como > e usado como prompt de continuação para coman-
dos longos de muitas linhas;
16. PS3 Usado como prompt para o comando select;
17. PS4 Normalmente definido como + e usado para depuração;
18. SHELL Esta variável armazena o caminho absoluto do shell atual:

root@debian:~$ echo $SHELL


/bin/bash

19. USER Armazena o nome do usuário atual:

root@debian:~$ echo $USER


pedro

Criando aliases
Um alias é um nome substituto para outro(s) comando(s). Ele pode ser executado como um
comando normal, mas, na verdade, executa outro comando de acordo com a definição do alias.

A sintaxe para declarar aliases é bastante simples. Os aliases são declarados escrevendo-se a
palavra-chave alias seguida pela atribuição do alias. Por sua vez, a atribuição do alias consiste
no nome do alias, um sinal de igual e um ou mais comandos:

alias alias_name=command(s)

Por exemplo:

root@debian:~$ alias shellantigo=sh


327 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

Este alias bizarro inicia uma instância do shell sh original quando o usuário digitar shellantigo
no terminal:

root@debian:~$ shellantigo
root@debian:~$

O poder dos aliases reside no fato de nos permitirem escrever versões curtas de comandos
longos:

root@debian:~$ alias ls='ls --color=auto'

Para saber mais sobre o ls e suas cores, digite man dir_colors no terminal.

Da mesma forma, podemos criar aliases para uma série de comandos concatenados—o ponto
e vírgula (;) é usado como um delimitador. Podemos, por exemplo, ter um alias que nos dá
informações sobre a localização do executável git e sua versão:

root@debian:~$ alias git_info='which git;git --version'

Para invocar um alias, digitamos seu nome no terminal:

root@debian:~$ git_info
/usr/bin/git
git version 2.7.4

O comando alias produz uma lista de todos os aliases disponíveis no sistema:

root@debian:~$ alias
alias git-info='which git;git --version'
alias ls='ls --color=auto'
alias shellantigo='sh'

O comando unalias remove aliases. Podemos, por exemplo, digitar unalias git-info e ver como
ele desaparece da listagem:
328 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

root@debian:~$ unalias git-info


root@debian:~$ alias
alias ls='ls --color=auto'
alias shellantigo='sh'

Como vimos com alias hi=‘echo We salute you.’ em uma lição anterior, precisamos colocar
os comandos entre aspas (simples ou duplas) quando, devido aos argumentos ou parâmetros,
eles contêm espaços:

root@debian:~$ alias show='echo Hello world!'


root@debian:~$ show
Hello world!

Os comandos que incluem opções também têm espaços:

root@debian:~$ alias ll='ls -al'

Agora, ll listará todos os arquivos—incluindo os ocultos (a)—no formato longo (l).

Podemos referenciar variáveis em aliases:

root@debian:~$ reptil=instagram
root@debian:~$ alias show='echo Hello $reptil!'
root@debian:~$ show
Hello instagram!

A variável também pode ser atribuída dentro do alias:

root@debian:~$ alias show='reptil=jabuti; echo Hello $reptil!'


root@debian:~$ show
Hello jabuti!

Podemos escapar um alias com \:

root@debian:~$ alias where?='echo $PWD'


root@debian:~$ where?
/home/debian
root@debian:~$ \where?
329 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

-bash: where?: command not found

O escape de um alias é útil quando um alias tem o mesmo nome de um comando regular.
Nesse caso, o alias tem precedência sobre o comando original, que, no entanto, ainda pode
ser acessado escapando-se o alias.

Da mesma forma, podemos colocar um alias dentro de outro alias:

root@debian:~$ where?
/home/debian
root@debian:~$ alias my_home=where?
root@debian:~$ my_home
/home/debian

Além disso, também é possível colocar uma função dentro de um alias, como será demonstrado
mais adiante.

Expansão e avaliação de aspas em aliases


Ao se usar aspas com variáveis de ambiente, as aspas simples tornam a expansão dinâmica:

root@debian:~$ alias where?='echo $PWD'


root@debian:~$ where?
/home/debian
root@debian:~$ cd Music
root@debian:~$ where?
/home/debian/Music

No entanto, com aspas duplas, a expansão é feita estaticamente:

root@debian:~$ alias where?="echo $PWD"


root@debian:~$ where?
/home/debian
root@debian:~$ cd Music
root@debian:~$ where?
/home/debian
330 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

Persistência de aliases: scripts de inicialização


Como no caso das variáveis, para que nossos aliases se tornem persistentes devemos colocá-los
em scripts de inicialização que são originados quando o sistema é iniciado. Como já sabemos,
um bom arquivo para os usuários colocarem seus aliases pessoais é ~/.bashrc. Já deve haver
alguns aliases por lá (a maioria deles comentados e prontos para uso, bastando remover o #
inicial):

root@debian:~$ grep alias .bashrc


# enable color support of ls and also add handy aliases
alias ls='ls --color=auto'
#alias dir='dir --color=
#alias vdir='vdir --color=
#alias grep='grep --color=
#alias fgrep='fgrep --color'
#alias egrep='egrep --color=
# some more ls aliases
#ll='ls -al'
#alias la='ls -A'
#alias l='ls -CF'
# ~/.bash_aliases, instead of adding them here directly.
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases

Como podemos ver nas últimas três linhas, é possível ter nosso próprio arquivo dedicado aos
aliases—~/.bash_aliases—para o .bashrc abrir e executar a cada inicialização do sistema. Ao
escolher essa opção, criamos e preenchemos esse arquivo:

###########
# .bash_aliases:
# a file to be populated by the user's personal aliases (and sourced by ~/.bashrc).
###########
alias git_info='which git;git --version'
alias show='echo Hello world!'
alias ll='ls -al'
alias where?='echo $PWD'

Variáveis integradas especiais do Bash


O Bourne Again Shell vem com um conjunto de variáveis especiais que são particularmente
úteis para funções e scripts. Elas são especiais porque só podem ser referenciadas—e não
atribuídas. Eis uma lista das mais relevantes:

• $? A referência desta variável se expande para o resultado do último comando executado.


Um valor de 0 significa sucesso:
331 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

root@debian:~$ ps aux | grep bash


debian 420 0.0 0.4 21156 5012 pts/0 Ss 17:10 0:00 -bash
debian 640 0.0 0.0 12784 936 pts/0 S+ 18:04 0:00 grep bash
root@debian:~$ echo $?
0

Um valor diferente de 0 significa erro:

pedro1@debian:~$ ps aux |rep bash


-bash: rep: command not found
pedro1@debian:~$ echo $?
127

• $$ Expande-se para o PID do shell (ID do processo):

root@debian:~$ ps aux | grep bash


debian 420 0.0 0.4 21156 5012 pts/0 Ss 17:10 0:00 -bash
debian 640 0.0 0.0 12784 936 pts/0 S+ 18:04 0:00 grep bash
root@debian:~$ echo $$
420

• $! Expande-se para o PID do último trabalho em segundo plano:

root@debian:~$ ps aux | grep bash &


[1] 663
root@debian:~$ debian 420 0.0 0.4 21156 5012 pts/0 Ss+ 17:10 0:00 -bash
debian 663 0.0 0.0 12784 972 pts/0 S 18:08 0:00 grep bash
^C
[1]+ Done ps aux | grep bash
root@debian:~$ echo $!
663

Lembre-se, o e comercial (&) é usado para iniciar processos em segundo plano.

Parâmetros posicionais $0 a $9

Expandem-se para os parâmetros ou argumentos que estão sendo passados para a função (alias
ou script)—$0 se expande para o nome do script ou shell.

Vamos criar uma função para demonstrar os parâmetros posicionais—note PS2 (>) indicando
332 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

novas linhas após as quebras de linha:

root@debian:~$ special_vars() {
> echo $0
> echo $1
> echo $2
> echo $3
}

Agora, vamos invocar a função (special_vars) passando três parâmetros para ela (debian,
ubuntu, 4linux):

root@debian:~$ special_vars debian ubuntu 4linux


-bash
debian
ubuntu
4linux

Tudo funcionou como esperado.

Embora seja tecnicamente possível passar parâmetros posicionais para aliases, não é
lá muito prático, já que—com aliases—os parâmetros posicionais são sempre passados
no final:

root@debian:~$ alias bom_editor='echo $1 aqui um otimo editor de texto'


root@debian:~$ bom_editor emacs
aqui um otimo editor de texto emacs

Outras variáveis integradas especiais do Bash incluem:

• $#
Expande-se para o número de argumentos passados para o comando
• $@, $*
Expandem-se para os argumentos passados para o comando
• $_
Expande-se para o último parâmetro ou o nome do script (dentre outras coisas; consulte
man bash para saber mais!):
333 29. 105.1 Personalizar e usar o ambiente do shell
Fabio Gonçalves De Melo Santana / [email protected]

Talvez isso possa te ajudar. . .

- Fonte:
- https://www.cyberciti.biz/tutorials/openbsd/
Fabio Gonçalves De Melo Santana / [email protected]

30
105.2 Personalizar ou criar scripts
simples

Introdução
Tarefas administrativas são, muitas vezes, longas e repetitivas. Podemos automatizar esses
procedimentos através de scripts. Na verdade, os scripts podem nos auxiliar muito, numa
vasta gama de atividades.

O que é um script? É uma sequência de instruções que são executadas toda vez que o mesmo
é chamado.

Mas, qual a diferença entre um script e um programa, já que ambos são sequências de
instruções?

Um script, é um programa não compilado. O processador da máquina só é capaz de executar


programas binários, isto é, compilados especificamente para ele. Dessa forma, é necessário
um programa que interprete esse script, em tempo de execução, para que o mesmo possa ser
executado. No nosso caso, esse programa será uma shell, já que estamos falando de shell
scripts.

Sendo uma linguagem de programação, a Shell Script possui uma série de estruturas de
controle como loops e condicionais, mas que são estudadas apenas em cursos mais avançados.
Vejamos o seguinte exemplo de Shell Script:

334
335 30. 105.2 Personalizar ou criar scripts simples
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# vim shell.sh


#!/bin/bash
# Meu primeiro shell script
cd ~
clear
ls -alh
date
cd -

Este é um script bem simples. As linhas que começam pelo símbolo # (cerquilha) são
comentários, ou seja, tudo que aparece depois do desse carácter é desprezado. Os comentários
são muito importantes nos programas, pois são uma forma de documentá-los. Imagine se você
tiver que fazer uma alteração num programa escrito a um ano antes. Será que você irá se
lembrar de todas as estruturas e variáveis que utilizou? Provavelmente não. Se for outra
pessoa quem tiver que efetuar essa mudança, a situação será pior ainda!

Mas a primeira linha, na qual aparece um comentário, possui uma característica um tanto
estranha. Na verdade, a primeira linha de um script, indica qual será o interpretador daquele
script. Em nosso exemplo será o programa /bin/bash, uma shell. Se estivéssemos criando
um script com a linguagem de programação Perl, a primeira linha seria algo como /us-
r/bin/perl.

O script, propriamente dito, executa 4 comandos simples: Acessar o diretório do usuário


corrente (cd); limpar a tela (clear); listar o conteúdo diretório corrente (ls -alh); imprimir a
data (date) e voltar ao diretório original (cd -).

Executando o script
Um programa ou script no GNU/Linux deve possuir permissão de execução. Vamos denominar
como shell.sh o nosso script nesse exemplo. Agora para podermos executá-lo, devemos
primeiro executar o comando:

root@debian10:/home/debian# chmod u+x shell.sh

E em seguida executar o script:

root@debian10:/home/debian# ./shell.sh

Em algumas situações, pode ser necessário fornecer parâmetros para um script. Por exemplo,
336 30. 105.2 Personalizar ou criar scripts simples
Fabio Gonçalves De Melo Santana / [email protected]

se ao invés de listar o conteúdo do diretório pessoal do usuário, quiséssemos que o script


listasse o conteúdo de um diretório qualquer.

Supondo que esse novo script chama-se script2.sh, uma possível forma de utilização do
script seria:

root@debian10:/home/debian# ./script2.sh /etc

Para passar parâmetros para esse script, precisamos conhecer a função de algumas variáveis:
$1, $2. Quando passamos algum parâmetro para o nosso script, esse parâmetro fica ar-
mazenado em uma variável específica. Por exemplo:

root@debian10:/home/debian# ./script3.sh parametro1 parmetro2 parametro3

Para conseguirmos resgatar o valor desses parâmetros, precisamos chamar as variáveis $1, $2
e $3, por exemplo:

root@debian10:/home/debian# vim script3.sh


#!/bin/bash
# Esse script pega o valor dos par â metros e imprimi na tela.
echo $1
echo $2
echo $3
# ./script3 42 the answer

Usando os números
Muitas vezes quando fazemos scripts, precisamos de uma função que faça o trabalho das
operações matemáticas básicas como soma, divisão, multiplicação e subtração. Em shell
script podemos usar o comando expr para realizá-las. Já a contagem de linhas é feita pelo
comando wc. E o comando cut serve para cortar a saída no ponto especificado pelo separador.

Vamos ver esse exemplo: um script que deve dizer quantos usuários estão presentes, quantos
grupos estão presentes e no final mostrar quantos objetos meu sistema tem, a soma dos
usuários e dos grupos:

#!/bin/bash
#
echo "Aguarde ....."
337 30. 105.2 Personalizar ou criar scripts simples
Fabio Gonçalves De Melo Santana / [email protected]

sleep 3
G‘=wc -l /etc/group | cut -d " " -‘f1
U‘=wc -l /etc/passwd | cut -d " " -‘f1
echo "O sistema possui $U usuarios."
echo "O sistema possui $G grupos."
echo "O sistema possui ‘expr $G + $U ‘objetos."

Usando a estrutura se
Até o presente momento, fizemos scripts que não possuem escolhas, ou seja, comandos de
execução em linha de comando em série, utilizando nossa lógica para fazer com que aquele
script seja executado corretamente. Mas se qualquer coisa acontecer no meio do caminho,
não temos a oportunidade de trabalhar com as famosas exceptions.

As exceptions, também conhecidas como exceções, servem para ajudar quando o resultado
de alguma parte do script pode ter vários rumos. Usando a condição se, é possível testar o
resultado de uma condicional.

A variável $?
A variável interrogação é conhecida por testar o valor de retorno de qualquer comando quando
mostrada após sua execução. Com ela podemos verificar se o programa foi executado com
sucesso ou não. Para isso basta saber que essa variável tem dois retornos principais:

root@debian10:/home/debian# pwd
root@debian10:/home/debian# echo $?
root@debian10:/home/debian# 0

Quando o resultado dessa variável é igual a 0: Comando executado com sucesso!

root@debian10:/home/debian# pws
root@debian10:/home/debian# echo $?
root@debian10:/home/debian# !=0

Quando o resultado é diferente de 0, quer dizer que existiu algum problema na execução do
comando.

Cada programa tem sua tabela e exceções, mas sempre retornam 0 quando o programa é bem
executado.
338 30. 105.2 Personalizar ou criar scripts simples
Fabio Gonçalves De Melo Santana / [email protected]

O comando test
O teste de condicionais (strings, matemáticas e em arquivos) em Shell Script é feito através
do comando test. Vamos conferir algumas formas de testar condicionais.

Testando strings

root@debian10:/home/debian# test "uva"="uva"


root@debian10:/home/debian# echo $?
root@debian10:/home/debian# 0

root@debian10:/home/debian# test "uva"="banana"


root@debian10:/home/debian# echo $?
root@debian10:/home/debian# 1

Testando expressões matemáticas

root@debian10:/home/debian# test 5 -eq 2


root@debian10:/home/debian# echo $?
root@debian10:/home/debian# 1

root@debian10:/home/debian# test 2 -eq 2


root@debian10:/home/debian# echo $?
root@debian10:/home/debian# 0

Testando expressões em arquivos

root@debian10:/home/debian# test -z $vazia


root@debian10:/home/debian# echo $?
root@debian10:/home/debian# 0

root@debian10:/home/debian# var=valor
root@debian10:/home/debian# test -z $var
root@debian10:/home/debian# echo $?
root@debian10:/home/debian# 1
339 30. 105.2 Personalizar ou criar scripts simples
Fabio Gonçalves De Melo Santana / [email protected]

Usando a estrutura se
Acima mostramos algumas formas de se testar as condicionais utilizadas dentro da estrutura
se. Lembre-se que podemos usar as condicionais tanto dentro, quanto fora da estrutura se,
depende do caso e do meio.

Existem muitos outros operadores para que possamos dominar o mundo e consequentemente
os sistemas UNIX com shell script. Estes são apenas os essenciais!

Utilizando a estrutura if
Abaixo alguns exemplos realmente práticos de como utilizar a estrutura if:

#!/bin/bash
## Primeiro script - Verificando se um usuário existe
echo " Digite usuário para consulta:"
read USER
REPLY=$( getent passwd | grep $USER )
if [ -z $REPLY ] ; then
echo " Usuário $USER não existe!"
else
echo "Usuário Existe"
fi

Ao invés de verificar se a variável que recebia o resultado do comando estava vazia, poderíamos
ter utilizado o comando test antes da estrutura e checar apenas seu código de erro:

#!/bin/bash
## Primeiro script - Verificando se um usuário existe
#
echo "Digite usuário para consulta:"
read USER
REPLY=$(getent passwd | grep $USER)
test -z $REPLY
if [ $? -eq 0 ] ; then
echo "Usuário $USER não existe!"
else
echo "Pagamento em dia"
fi

Exemplos de script com IF


Exemplo 1: Verifica se um determinado usuário está logado no sistema:
340 30. 105.2 Personalizar ou criar scripts simples
Fabio Gonçalves De Melo Santana / [email protected]

#!/bin/bash
clear
echo "Digite o nome do usuário"
read USER
if
then
clear
echo $USER esta logado
else
who | grep $USER > /dev/null
clear
echo $USER nao esta logado
fi

Exemplo 2: Pesquisa uma palavra dentro de um arquivo:

#!/bin/bash
clear
echo "Escreva o nome do arquivo e a palavra a ser pesquisada:"
read file word
if grep $word $file > /dev/null
then
clear
echo "A palavra $word existe no arquivo $file . "
fi

Utilizando a estrutura case


Exemplo 1: Executar comandos dependendo do usuário digitado:

#!/bin/bash
clear
echo "Digite um nome de usuário"
read Usuario
case $Usuario in
aluno )
clear ; ls /etc ; cal ; date
;;
root )
clear ; whoami
;;
*)
clear
echo $Usuario não existe
;;
esac

Exemplo 2: Script que exibe informações do sistema:

#!/bin/bash
341 30. 105.2 Personalizar ou criar scripts simples
Fabio Gonçalves De Melo Santana / [email protected]

clear
echo " Escolha uma opção para informações da maquina ( Digite o numero)"
echo " 1 - Horario do sistema "
echo " 2 - Tempo que o servidor esta ligado "
echo " 3 - Quantidade de usuário logados "
echo " 4 - Sair "
read ESC
case $ESC in
1)
H = $ ( uptime | awk -F " " ’{ print $1 } ’)
echo " Agora são $H "
;;
2)
T = $ ( uptime | awk -F " " ’{ print $3 } ’)
echo " O sistema esta $T ligado "
;;
3)
U = $ ( uptime | awk -F " " ’{ print $4 } ’)
echo " Existem $U atualmete logados "
;;
4)
echo " Bye ... "
;;
*)
echo " Opção invalida "
;;
esac

## Utilizando a estrutura while

Quando repetições são necessárias podemos utilizar estruturas de looping como while e for.

while [<expressão>]; do
comandos
done

Exemplo 1: Verificar se um site está no ar:

#!/bin/bash
clear
echo "Digite o endereço de um site"
read SITE
while ping -c1 $SITE > /dev/null 2 >&1
do
echo "O site $SITE está no ar."
done

Exemplo 2: Cria quantos arquivos você indicar com uma determinada extensão:

#!/bin/bash
342 30. 105.2 Personalizar ou criar scripts simples
Fabio Gonçalves De Melo Santana / [email protected]

clear
echo "Digite o nome do arquivo"
read ARQ
clear
echo "Digite a extensão do arquivo"
read EXT
clear
echo "Digite o numero de arquivos criados"
read NUM
i=1
while [ $i -le $NUM ]
do
touch $ARQ$i.$EXT
i='expr $i + 1'
done

Utilizando a estrutura for


O for pode ser utilizado para efetuar um looping no estilo do while, ou para processar uma
lista:

for VARIAVEL in <lista> ; do


comandos com a VARIAVEL
done

Exemplo 1: Compactar todos os arquivos do diretório atual:

#!/bin/bash
for i in 'ls -1'
do
tar -cvzf $i.tar.gz $i
done

Exemplo 2: Apaga todos os arquivos de uma determinada extensão:

#!/bin/bash
clear
echo "Digite a extensão dos arquivos que você quer apagar"
read ARQ
for i in *.$ARQ ; do
rm $i
done
343 30. 105.2 Personalizar ou criar scripts simples
Fabio Gonçalves De Melo Santana / [email protected]

Talvez isso possa te ajudar. . .

- Fonte: https://slideplayer.com.br/slide/8585130/
Fabio Gonçalves De Melo Santana / [email protected]

31
106.1_Instalar_e_configu-
rar_o_X11/

Introdução
X Window System é uma pilha de software usada para exibir texto e gráficos em uma tela. A
aparência geral e o design de um cliente X não são ditados pelo X Window System, mas sim
gerenciados por cada cliente X individual, um gerenciador de janela (por exemplo, Window
Maker, Tab Window Manager) ou um ambiente de desktop completo como KDE, GNOME ou
Xfce.

O X Window System é multiplataforma e roda em diversos sistemas operacionais, como


Linux, BSDs, Solaris e outros sistemas semelhantes ao Unix. Existem também implemen-
tações disponíveis para o macOS da Apple e o Microsoft Windows..

A versão principal do protocolo X usado nas distribuições Linux modernas é X.org) versão 11,
comumente escrita como X11. O protocolo X é o mecanismo de comunicação entre o cliente
X e o servidor X. As diferenças entre o cliente X e o servidor X serão discutidas abaixo.

A arquitetura do X Window System


O X Window System fornece os mecanismos para desenhar formas bidimensionais básicas (e
formas tridimensionais por meio de extensões) em uma tela. Ele se divide em um cliente e

344
345 31. 106.1_Instalar_e_configurar_o_X11/
Fabio Gonçalves De Melo Santana / [email protected]

um servidor e, na maioria das instalações em que uma área de trabalho gráfica é necessária,
ambos os componentes estão no mesmo computador. O componente cliente assume a forma
de um aplicativo, como um emulador de terminal, um game ou um navegador web. Cada
aplicativo cliente informa ao servidor X sobre a localização e o tamanho de sua janela na tela
do computador. O cliente também decide o que vai para aquela janela, e o servidor X exibe
o desenho solicitado na tela. O X Window System também lida com os dados enviados por
dispositivos como mouses, teclados e muito mais.

O X Window System é compatível com rede. Múltiplos clientes X de diferentes computadores


de uma rede podem fazer solicitações de desenho a um único servidor X remoto. A ideia por
trás disso é que um administrador ou usuário pode ter acesso a um aplicativo gráfico em um
sistema remoto que talvez não esteja disponível em seu sistema local.

Um recurso importante do X Window System é que ele é modular. Ao longo da existência


do X Window System, recursos mais novos foram sendo desenvolvidos e adicionados à sua
estrutura. Esses novos componentes foram adicionados apenas como extensões ao servidor
X, deixando o protocolo central do X11 intacto. Essas extensões estão contidas nos arquivos
de biblioteca Xorg. Eis alguns exemplos de bibliotecas Xorg: libXrandr, libXcursor, libX11,
libxkbfile e muitas outras que fornecem funcionalidades extras ao servidor X.

O gerenciador de exibição fornece um login gráfico para um sistema. Esse sistema pode ser um
computador local ou uma máquina em uma rede. O gerenciador de exibição é iniciado após
a inicialização do computador e inicia uma sessão do servidor X para o usuário autenticado.
O gerenciador de exibição também é responsável por manter o servidor X em funcionamento.
Como exemplo de gerenciadores de exibição, podemos citar o GDM e o LightDM.

Cada instância de um servidor X em execução possui um nome de exibição que a identifica.


O nome de exibição contém o seguinte:

hostname:displaynumber.screennumber

O nome de exibição também informa a um aplicativo gráfico onde ele deve ser renderizado e
em qual hospedeiro (no caso de uma conexão X remota).

O hostname refere-se ao nome do sistema que exibirá o aplicativo. Se o nome de exibição


não contiver o nome do hospedeiro, o host local será pressuposto.

O displaynumber faz referência à coleção de “telas” que estão em uso, seja uma única tela de
laptop ou diversas telas em uma estação de trabalho. Cada sessão do servidor X em execução
recebe um número de exibição começando em 0.
346 31. 106.1_Instalar_e_configurar_o_X11/
Fabio Gonçalves De Melo Santana / [email protected]

O screennumber padrão é 0. Esse pode ser o caso se apenas uma tela física ou diversas telas
físicas estiverem configuradas para funcionar como uma só tela. Quando todas as telas de
uma configuração de múltiplos monitores são combinadas em uma única tela lógica, as janelas
do aplicativo podem ser movidas livremente entre as telas. Em situações em que cada tela é
configurada para funcionar independentemente uma da outra, cada tela abrigará as janelas dos
aplicativos que forem abertos dentro delas e as janelas não podem ser movidas de uma tela
para outra. A cada tela independente será atribuído seu próprio número. Se houver apenas
uma tela lógica em uso, o ponto e o número da tela serão omitidos.

O nome de exibição de uma sessão X em execução é armazenado na variável de ambiente


DISPLAY:

root@debian10:/home/debian# echo $DISPLAY


:0

A saída detalha o seguinte:

1. O servidor X em uso está no sistema local, portanto, não há nada impresso à esquerda
dos dois pontos;
2. A sessão atual do servidor X é a primeira indicada por 0 imediatamente após os dois
pontos;
3. Há apenas uma tela lógica em uso, portanto um número de tela não é visível.

Para ilustrar melhor esse conceito, consulte o seguinte diagrama:

Exemplos de configuração de exibição COnfiguracao

(A) - Um único monitor, com uma única configuração de monitor e apenas uma tela.

(B) - Configurado como um único monitor, com dois monitores físicos configurados como
uma tela. As janelas do aplicativo podem ser movidas livremente entre os dois monitores.

(C) - Uma configuração de tela única (conforme indicado por :0), porém cada monitor é uma
tela independente. Ambas as telas ainda compartilharão os mesmos dispositivos de entrada,
como teclado e mouse; porém, um aplicativo aberto na tela :0.0 não pode ser movido para a
tela :0.1 e vice-versa.

Para iniciar um aplicativo em uma tela específica, atribua o número da tela à variável de
ambiente DISPLAY antes de iniciar o aplicativo: $

root@debian10:/home/debian# DISPLAY=:0.1 firefox &


347 31. 106.1_Instalar_e_configurar_o_X11/
Fabio Gonçalves De Melo Santana / [email protected]

Esse comando iniciaria o navegador Firefox na tela à direita do diagrama acima. Alguns kits
de ferramentas também oferecem opções de linha de comando para instruir um aplicativo a
ser executado em uma tela especificada.

Configuração do servidor X
Tradicionalmente, o principal arquivo de configuração usado para configurar um servidor X é
o arquivo /etc/X11/xorg.conf. Nas distribuições Linux modernas, o servidor X configura a si
mesmo em tempo de execução quando é iniciado e, portanto, nenhum arquivo xorg.conf pode
existir.

O arquivo xorg.conf é dividido em estrofes separadas chamadas seções. Cada seção começa
com o termo Section e, após este termo está o nome da seção, que se refere à configuração
de um componente. Cada Section é encerrada por uma EndSection correspondente. Um
arquivo xorg.conf típico contém as seguintes seções:

• InputDevice - Usada para configurar um modelo específico de teclado ou mouse;


• InputClass - Nas distribuições Linux modernas, esta seção é tipicamente encontrada em
um arquivo de configuração à parte, localizado em /etc/X11/xorg.conf.d/. InputClass é
usada para configurar uma classe de dispositivos de hardware como teclados e mouses,
e não um componente específico de hardware. Veja abaixo um exemplo de arquivo
/etc/X11/xorg.conf.d/00- keyboard.conf:

Section "InputClass"
Identifier "system-keyboard"
MatchIsKeyboard "on"
Option "XkbLayout" "us"
Option "XkbModel" "pc105"
EndSection

A opção de XkbLayout determina a disposição das teclas de um teclado, como Dvorak, canhoto
ou destro, QWERTY e idioma. A opção de XkbModel é usada para definir o tipo de teclado
utilizado. Há uma tabela de modelos, layouts e suas descrições em xkeyboard-config(7). Os
arquivos associados aos layouts de teclado podem ser encontrados em /usr/share/X11/xkb.
Um layout de teclado grego politônico em um computador Chromebook apareceria desta
maneira:
348 31. 106.1_Instalar_e_configurar_o_X11/
Fabio Gonçalves De Melo Santana / [email protected]

Section "InputClass"
Identifier "system-keyboard"
MatchIsKeyboard "on"
Option "XkbLayout" "gr(polytonic)"
Option "XkbModel" "chromebook"
EndSection

Alternativamente, o layout de um teclado pode ser modificado durante uma sessão X em


execução com o comando setxkbmap. Eis um exemplo desse comando para configurar o
layout grego politônico em um computador Chromebook:

root@debian10:/home/debian# setxkbmap -model chromebook -layout "gr(polytonic)"

Essa configuração só permanecerá ativa enquanto a sessão X estiver em uso. Para que essas al-
terações se tornem permanentes, modifique o arquivo /etc/X11/xorg.conf.d/00-keyboard.conf
de forma a incluir as configurações necessárias.

As distribuições Linux modernas fornecem o comando localectl através do systemd, que tam-
bém pode ser usado para modificar um layout de teclado e cria automaticamente o arquivo de
configuração /etc/X11/xorg.conf.d/00-keyboard.conf. Novamente, eis um exemplo de con-
figuração de um teclado grego politônico em um Chromebook, desta vez com o comando
localectl:

root@debian10:/home/debian# localectl --no-convert set-x11-keymap "gr(polytonic)"


chromebook

A opção –no-convert é usada aqui para impedir que o localectl modifique o mapa do teclado
no console do hospedeiro.

• Monitor - A seção Monitor descreve o monitor físico utilizado e onde está conectado. Eis
um exemplo de configuração que mostra um monitor de hardware conectado à segunda
porta de vídeo e usado como monitor principal:

Section "Monitor"
Identifier "DP2"
Option "Primary" "true"
EndSection
349 31. 106.1_Instalar_e_configurar_o_X11/
Fabio Gonçalves De Melo Santana / [email protected]

• Device - A seção Device descreve a placa de vídeo física utilizada. A seção também
contém o módulo do kernel usado como driver para a placa de vídeo, junto com sua
localização física na placa-mãe:

Section "Device"
Identifier "Device0"
Driver "i915"
BusID "PCI:0:2:0"
EndSection

• Screen - A seção Screen reúne as seções Monitor e Device. Um exemplo de seção


Screen seria semelhante ao seguinte:

Section "Screen"
Identifier "Screen0"
Device "Device0"
Monitor "DP2"
EndSection

• ServerLayout - A seção ServerLayout agrupa todas as seções como mouse, teclado e


telas em uma única interface do X Window System:

Section "ServerLayout"
Identifier "Layout-1"
Screen "Screen0" 0 0
InputDevice "mouse1" "CorePointer"
InputDevice "system-keyboard" "CoreKeyboard"
EndSection

Os arquivos de configuração específicos ao usuário também residem em /etc/X11/xorg.conf.d/.


Os arquivos de configuração fornecidos pela distribuição localizam-se em /usr/share/X11/x-
org.conf.d/. Os arquivos de configuração localizados em /etc/X11/xorg.conf.d/ são analisados
antes do arquivo /etc/X11/xorg.conf se ele existir no sistema.

O comando xdpyinfo é usado em um computador para exibir informações sobre uma instância
do servidor X em execução. Veja abaixo um exemplo de saída do comando:

root@debian10:/home/debian# xdpyinfo
name of display: :0
version number: 11.0
vendor string: The X.Org Foundation
vendor release number: 12004000
350 31. 106.1_Instalar_e_configurar_o_X11/
Fabio Gonçalves De Melo Santana / [email protected]

X.Org version: 1.20.4


maximum request size: 16777212 bytes
motion buffer size: 256
bitmap unit, bit order, padding: 32, LSBFirst, 32
image byte order: LSBFirst
number of supported pixmap formats: 7
supported pixmap formats:
depth 1, bits_per_pixel 1, scanline_pad 32
depth 4, bits_per_pixel 8, scanline_pad 32
depth 8, bits_per_pixel 8, scanline_pad 32
depth 15, bits_per_pixel 16, scanline_pad 32
depth 16, bits_per_pixel 16, scanline_pad 32
depth 24, bits_per_pixel 32, scanline_pad 32
depth 32, bits_per_pixel 32, scanline_pad 32
keycode range: minimum 8, maximum 255
focus: None
number of extensions: 25
BIG-REQUESTS
Composite
DAMAGE
DOUBLE-BUFFER
DRI3
GLX
Generic Event Extension
MIT-SCREEN-SAVER
MIT-SHM
Present
RANDR
RECORD
RENDER
SECURITY
SHAPE
SYNC
X-Resource
XC-MISC
XFIXES
XFree86-VidModeExtension
XINERAMA
XInputExtension
XKEYBOARD
XTEST
XVideo
default screen number: 0
number of screens: 1

screen #0:
dimensions: 3840x1080 pixels (1016x286 millimeters)
resolution: 96x96 dots per inch
depths (7): 24, 1, 4, 8, 15, 16, 32
root window id: 0x39e
depth of root window: 24 planes
number of colormaps: minimum 1, maximum 1
default colormap: 0x25
default number of colormap cells: 256
preallocated pixels: black 0, white 16777215
options: backing-store WHEN MAPPED, save-unders NO
largest cursor: 3840x1080
current input event mask: 0xda0033
KeyPressMask KeyReleaseMask EnterWindowMask
LeaveWindowMask StructureNotifyMask SubstructureNotifyMask
SubstructureRedirectMask PropertyChangeMask ColormapChangeMask
number of visuals: 270
351 31. 106.1_Instalar_e_configurar_o_X11/
Fabio Gonçalves De Melo Santana / [email protected]

...

As partes mais relevantes da saída estão em negrito, como o nome da tela (que é idêntico ao
conteúdo da variável de ambiente DISPLAY), as informações de versão do servidor X em uso,
o número e a listagem das extensões do Xorg em uso e mais informações sobre a tela em si.

Criando um arquivo de configuração básico do Xorg


Mesmo que nas instalações modernas do Linux o X crie sua configuração após a inicialização
do sistema, um arquivo xorg.conf ainda pode ser usado. Para gerar um arquivo /etc/X11/x-
org.conf permanente, execute o seguinte comando:

debian@debian10:/home/debian$ sudo Xorg -configure

Se já houver uma sessão X em execução, será necessário especificar um DISPLAY


diferente em seu comando, por exemplo:

debian@debian10:/home/debian$ sudo Xorg :1 -configure

Em algumas distribuições Linux, o comando X pode ser usado no lugar de Xorg, pois X é um
link simbólico para Xorg.

Um arquivo xorg.conf.new será criado em seu diretório de trabalho atual. O conteúdo desse
arquivo deriva-se do que o servidor X descobriu estar disponível em hardware e drivers no
sistema local. Para usar esse arquivo, ele deve ser movido para o diretório /etc/X11/ e
renomeado comoxorg.conf:

debian@debian10:/home/debian$ sudo mv xorg.conf.new /etc/X11/xorg.conf

Wayland
Wayland é o protocolo de exibição mais recente, criado para substituir o X Window System.
Ele é o servidor de exibição padrão de muitas distribuições Linux modernas. Foi projetado
352 31. 106.1_Instalar_e_configurar_o_X11/
Fabio Gonçalves De Melo Santana / [email protected]

para usar menos recursos do sistema e ocupar um espaço de instalação menor do que o X.
O projeto foi iniciado em 2010 e ainda está em desenvolvimento ativo, com a colaboração de
desenvolvedores e ex-desenvolvedores do X.org.

Ao contrário do X Window System, não existe uma instância de servidor executada entre o
cliente e o kernel. Em vez disso, uma janela do cliente trabalha com seu próprio código ou o
código de um kit de ferramentas (como Gtk + ou Qt) para realizar a renderização. Para que
a renderização seja feita, uma solicitação é enviada ao kernel do Linux por meio do protocolo
Wayland. O kernel encaminha a solicitação através do protocolo Wayland para o compositor
Wayland, que gerencia os dados inseridos pelo dispositivo, o gerenciamento de janelas e a
composição. O compositor é a parte do sistema que combina os elementos renderizados em
uma saída visual na tela.

A maioria dos kits de ferramentas modernos, como o Gtk + 3 e o Qt 5, foram atualizados


para permitir a renderização para um sistema X Window ou um computador executando o
Wayland. Por enquanto, nem todos os aplicativos autônomos foram escritos para suportar
a renderização no Wayland. Para aplicativos e estruturas que ainda precisam do X Window
System para rodar, o aplicativo pode ser executado dentro do XWayland. O sistema XWayland
é um servidor X separado que roda em um cliente Wayland e, portanto, renderiza o conteúdo
da janela do cliente em uma instância independente do servidor X.

Assim como o X Window System usa uma variável de ambiente DISPLAY para controlar as
telas em uso, o protocolo Wayland usa uma variável de ambiente WAYLAND_DISPLAY. Veja
abaixo um exemplo de saída de um sistema executando um monitor Wayland:

debian@debian10:/home/debian$ echo $WAYLAND_DISPLAY


wayland-0

Esta variável de ambiente não está disponível em sistemas que utilizam X.


353 31. 106.1_Instalar_e_configurar_o_X11/
Fabio Gonçalves De Melo Santana / [email protected]

Talvez isso possa te ajudar. . .

Fig. 31.1: ARQUITETURA

• Fonte: - https://pt.slideshare.net/gnomekr/gnome-on-waylandataglance/9
Fabio Gonçalves De Melo Santana / [email protected]

32
106.2_Areas_de_trabalho_grafi-
cas/

Introdução
Os sistemas operacionais baseados em Linux são conhecidos por sua avançada interface de linha
de comando, mas ela pode assustar um pouco os usuários sem uma formação mais técnica.
Para tornar o uso do computador mais intuitivo, a combinação de telas de alta resolução com
dispositivos apontadores deu origem a interfaces de usuário baseadas em imagens. Enquanto
a interface de linha de comando exige um conhecimento prévio dos nomes dos programas e
suas opções de configuração, a funcionalidade dos programas com interface gráfica do usuário
(GUI) pode ser acionada simplesmente clicando-se em elementos visuais familiares, o que torna
a curva de aprendizado bem mais suave. Além disso, a interface gráfica é mais adequada para
tarefas de multimídia e outras atividades visualmente orientadas.

De fato, a interface gráfica de usuário tornou-se quase um sinônimo de interface de com-


putação. A maioria das distribuições Linux vem com uma interface gráfica instalada por
padrão. Não existe, entretanto, um único programa monolítico responsável pelos desktops
gráficos completos nos sistemas Linux. Em vez disso, cada área de trabalho gráfica compõe-
se, na verdade, de uma grande coleção de programas e suas dependências, que variam segundo
as escolhas da própria distribuição ou o gosto pessoal do usuário.

354
355 32. 106.2_Areas_de_trabalho_graficas/
Fabio Gonçalves De Melo Santana / [email protected]

X Window System
No Linux e em outros sistemas operacionais semelhantes ao Unix, o X Window System (tam-
bém conhecido como X11 ou apenas X) fornece os recursos de baixo nível relacionados à
renderização da interface gráfica e à interação do usuário com ela, como:

• O tratamento dos eventos de entrada, como movimentos do mouse ou pressionamentos


de teclas;
• A capacidade de cortar, copiar e colar conteúdo de texto entre aplicativos separados;
• A interface de programação usada por outros programas para desenhar os elementos
gráficos.

Embora o X Window System seja responsável por controlar a exibição gráfica (o driver de
vídeo em si é parte do X), ele não se destina a desenhar elementos visuais complexos por
conta própria. Formas, cores, sombras e outros efeitos visuais são gerados pelo aplicativo que
roda em cima do X. Esta abordagem dá mais liberdade aos aplicativos para criar interfaces
personalizadas, mas também pode levar a sobrecargas de desenvolvimento que vão além do
escopo do aplicativo, além de inconsistências na aparência e no comportamento em relação a
outras interfaces de programas.

Do ponto de vista do desenvolvedor, a introdução do ambiente de trabalho (ou ambiente de


desktop) facilita a programação da GUI durante o desenvolvimento do aplicativo, ao passo
que, da perspectiva do usuário, ele oferece uma experiência consistente entre aplicativos dis-
tintos. Os ambientes de desktop reúnem interfaces de programação, bibliotecas e programas
de suporte que cooperam para entregar conceitos de design tradicionais, mas em constante
evolução.

Ambiente de trabalho
A GUI tradicional consiste em diversas janelas—o termo janela refere-se aqui a qualquer área
autônoma da tela—associadas aos processos em execução. Como o X Window System sozinho
oferece apenas recursos interativos básicos, a experiência completa do usuário depende dos
componentes fornecidos pelo ambiente de área de trabalho.

O componente mais importante de um ambiente de área de trabalho é provavelmente o geren-


ciador de janelas, que controla o posicionamento e as decorações das janelas. É o gerenciador
de janelas que adiciona a barra de título à janela, bem como os botões de controle—geralmente
associados às ações de minimizar, maximizar e fechar—e gerencia a alternância entre as janelas
abertas.

Todos os ambientes de desktop incluem um gerenciador de janelas cuja aparência e usabilidade


se baseia em um kit de ferramentas de widget. Os widgets são elementos visuais informativos
356 32. 106.2_Areas_de_trabalho_graficas/
Fabio Gonçalves De Melo Santana / [email protected]

ou interativos, como botões ou campos de entrada de texto, distribuídos dentro da janela do


aplicativo. Os componentes padrão da área de trabalho—como o inicializador de aplicativos, a
barra de tarefas etc.—e o próprio gerenciador de janelas dependem desses kits de ferramentas
de widget para estruturar suas interfaces.

As bibliotecas de software, como o GTK+ e o Qt, fornecem widgets que os programadores


podem usar para construir interfaces gráficas elaboradas para seus aplicativos. Historicamente,
os aplicativos desenvolvidos com GTK+ não se assemelhavam aos aplicativos feitos com Qt e
vice-versa, mas o melhor suporte a temas dos ambientes de desktop de hoje torna a distinção
menos óbvia.

No geral, o GTK+ e o Qt oferecem os mesmos recursos em relação aos widgets. Os elementos


interativos simples podem ser indistinguíveis, enquanto os widgets compostos—como a janela
de diálogo usada por aplicativos para abrir ou salvar arquivos—podem, no entanto, ter uma
aparência bem diferenciada. No entanto, aplicativos construídos com kits de ferramentas
distintos podem ser executados simultaneamente, independentemente do kit de ferramentas
de widget usado pelos outros componentes da área de trabalho.

Além dos componentes básicos da área de trabalho, que podem ser considerados programas
individuais por si sós, os ambientes de área de trabalho seguem a metáfora da escrivaninha,
fornecendo um conjunto mínimo de programas acessórios desenvolvidos a partir das mesmas
diretrizes de design. Todos os principais ambientes de desktop propõem variações dos seguintes
aplicativos:

Aplicativos relacionados ao sistema


• Emulador de terminal, gerenciador de arquivos, gerenciador de instalação de pacotes,
ferramentas de configuração do sistema;
• Comunicação e Internet - Gerenciador de contatos, cliente de email, navegador web;
• Aplicativos de escritório - Calendário, calculadora, editor de texto.

Os ambientes de desktop podem incluir muitos outros serviços e aplicativos: a tela de login
inicial, o gerenciador de sessão, a comunicação entre processos, o chaveiro etc. Eles também
incorporam recursos fornecidos por serviços de terceiros, como o PulseAudio para som e o
CUPS para impressão. Esses recursos não necessitam do ambiente gráfico para funcionar, mas
o ambiente de trabalho fornece interfaces gráficas que facilitam sua configuração e operação.

Ambientes de trabalho populares


Muitos sistemas operacionais proprietários suportam oficialmente apenas um único ambiente
de desktop, que é vinculado àquela versão específica e não deve ser alterado. Já os sistemas
357 32. 106.2_Areas_de_trabalho_graficas/
Fabio Gonçalves De Melo Santana / [email protected]

operacionais baseados em Linux suportam diferentes opções de ambiente de trabalho que


podem ser usadas em conjunto com o X. Cada ambiente de área de trabalho tem seus próprios
recursos, mas eles geralmente compartilham alguns conceitos de design:

• Um inicializador de aplicativos que lista os aplicativos internos e de terceiros disponíveis


no sistema;
• Regras que definem os aplicativos padrão associados a tipos de arquivos e protocolos;
• Ferramentas de configuração para personalizar a aparência e o comportamento do am-
biente de trabalho.

O Gnome é um dos ambientes de desktop mais populares, sendo a primeira escolha em dis-
tribuições como Fedora, Debian, Ubuntu, SUSE Linux Enterprise, Red Hat Enterprise Linux,
CentOS, etc. Em sua versão 3, o Gnome recebeu uma grande repaginada em sua aparência e
estrutura, afastando-se da metáfora da escrivaninha e apresentando o Gnome Shell como sua
nova interface.

Gnome Shell - Figura1 - Gnome Shell

O iniciador de tela cheia de uso geral Gnome Shell Activities substituiu o iniciador de aplicativos
e a barra de tarefas tradicionais. No entanto, ainda é possível usar o Gnome 3 com a aparência
antiga escolhendo a opção Gnome Classic na tela de login.

O KDE é um grande ecossistema de aplicativos e plataforma de desenvolvimento. Sua última


versão para o ambiente de desktop, KDE Plasma, é usada por padrão no openSUSE, Mageia,
Kubuntu etc. O emprego da biblioteca Qt é um recurso marcante do KDE, emprestando-lhe
sua aparência inconfundível e uma infinidade de aplicativos originais. O KDE fornece, ainda,
uma ferramenta de configuração para garantir a coesão visual com os aplicativos GTK+.

Interface do KDE - Figura2 - Interface do KDE

O Xfce é um ambiente de desktop que visa ser esteticamente agradável sem consumir muitos
recursos da máquina. Sua estrutura é altamente modularizada, permitindo ao usuário ativar e
desativar componentes de acordo com suas necessidades e preferências.

A área de trabalho do Xfce - Figura3 - A área de trabalho do Xfce

Existem muitos outros ambientes de desktop para Linux, geralmente fornecidos por versões
alternativas das distribuições. A distribuição Linux Mint, por exemplo, propõe dois ambientes
de trabalho originais: o Cinnamon (um fork do Gnome 3) e o MATE (um fork do Gnome 2).
O LXDE é um ambiente de desktop adaptado para baixo consumo de recursos, sendo assim
uma boa escolha para instalação em equipamentos mais antigos ou computadores de placa
única. Embora não ofereça todas as capabilidades dos ambientes de trabalho mais pesados, o
LXDE inclui todos os recursos básicos esperados de uma interface gráfica de usuário moderna.
358 32. 106.2_Areas_de_trabalho_graficas/
Fabio Gonçalves De Melo Santana / [email protected]

Interoperabilidade da área de trabalho


A diversidade dos ambientes de desktop nos sistemas operacionais baseados em Linux impõe
um desafio: como fazê-los funcionar corretamente com aplicativos gráficos de terceiros ou
serviços de sistema sem ser preciso implementar um suporte específico a cada um deles? O
compartilhamento de métodos e especificações entre ambientes de desktop melhoram muito
a experiência do usuário e resolve muitos problemas de desenvolvimento, já que os aplicativos
gráficos precisam interagir com o ambiente de desktop atual, independentemente daquele para
o qual foram originalmente projetados. Além disso, é importante manter as configurações
gerais da área de trabalho caso o usuário decida alterar sua escolha de ambiente.

Um grande conjunto de especificações para a interoperabilidade de áreas de trabalho é mantido


pela organização freedesktop.org. A adoção da especificação completa não é obrigatória, mas
muitas regras são amplamente utilizadas:

• Locais dos diretórios - Onde as configurações pessoais e outros arquivos específicos


do usuário estão localizados;
• Itens da área de trabalho - Os aplicativos de linha de comando podem ser executados
no ambiente da área de trabalho por meio de qualquer emulador de terminal, mas seria
muito confuso disponibilizar todos eles no inicializador de aplicativos. Os itens da área
de trabalho são arquivos de texto que terminam com .desktop, usados pelo ambiente
de desktop para reunir informações sobre os aplicativos de área de trabalho disponíveis
e como usá-los;
• Início automático de aplicativos - Itens da área de trabalho que indicam quais aplica-
tivos devem ser iniciados automaticamente após o usuário efetuar login;
• Arrastar e soltar - Como os aplicativos devem lidar com eventos de arrastar e soltar;
• Lixeira - A localização comum de arquivos excluídos pelo gerenciador de arquivos, bem
como os métodos para armazenar e remover arquivos de lá;
• Temas de ícones - O formato comum para bibliotecas de ícones intercambiáveis.

A facilidade de uso oferecida pelos ambientes de desktop tem uma desvantagem em compara-
ção com as interfaces de texto como o shell: a capacidade de fornecer acesso remoto. Embora
o ambiente shell de linha de comando de uma máquina remota possa ser facilmente acessado
com ferramentas como ssh, o acesso remoto a ambientes gráficos requer métodos diferentes
e o desempenho nem sempre é satisfatório em conexões mais lentas.

Acesso não-local
O X Window System adota um design baseado em displays (telas) autônomos, nos quais o
mesmo X display manager (gerenciador de exibição X) pode controlar mais de uma sessão
de desktop gráfico ao mesmo tempo. Em essência, um display é análogo a um terminal de
359 32. 106.2_Areas_de_trabalho_graficas/
Fabio Gonçalves De Melo Santana / [email protected]

texto: ambos se referem a uma máquina ou aplicativo de software usado como um ponto
de entrada para estabelecer uma sessão independente do sistema operacional. Embora a
configuração mais comum envolva uma única sessão gráfica em execução na máquina local,
outras configurações menos convencionais também são possíveis:

• Alternar entre sessões de desktop gráfico ativas na mesma máquina;


• Mais de um conjunto de dispositivos de exibição (por exemplo, tela, teclado, mouse)
conectados à mesma máquina, cada um controlando sua própria sessão de desktop
gráfico;
• Sessões remotas de desktop gráfico, para as quais a interface gráfica é enviada através
da rede para um monitor remoto.

As sessões de desktop remoto são suportadas nativamente pelo X, que emprega o X Display
Manager Control Protocol (XDMCP) para se comunicar com monitores remotos. Devido ao
alto uso de largura de banda, o XDMCP raramente é usado através da Internet ou em LANs
de baixa velocidade. Também há questões de segurança com o XDMCP: o display local se
comunica com um gerenciador de exibição X remoto privilegiado para executar procedimen-
tos remotos, portanto, uma eventual vulnerabilidade possibilitaria a execução de comandos
privilegiados arbitrários na máquina remota.

Além disso, o XDMCP requer instâncias X em execução em ambas as extremidades da


conexão, o que pode inviabilizar seu uso se o X Window System não estiver disponível em
todas as máquinas envolvidas. Na prática, outros métodos mais eficientes e menos invasivos
são usados para estabelecer sessões remotas de desktop gráfico.

O Virtual Network Computing (VNC) é uma ferramenta não vinculada a uma plataforma que
permite visualizar e controlar ambientes de desktop remotos usando o protocolo Remote Frame
Buffer (RFB). Por meio dele, os eventos produzidos pelo teclado e mouse locais são transmi-
tidos para a área de trabalho remota, que por sua vez envia de volta quaisquer atualizações
de tela para serem exibidas localmente. É possível executar muitos servidores VNC na mesma
máquina, mas cada servidor VNC precisa de uma porta TCP exclusiva na interface de rede
que aceite solicitações de sessão de entrada. Por convenção, o primeiro servidor VNC deve
usar a porta TCP 5900, o segundo deve usar 5901 e assim por diante.

O servidor VNC não precisa de privilégios especiais para ser executado. Um usuário comum
pode, por exemplo, fazer login em sua conta remota e iniciar seu próprio servidor VNC a partir
de lá. Assim, na máquina local, qualquer aplicativo cliente VNC pode ser usado para acessar a
área de trabalho remota (supondo que as portas de rede correspondentes sejam alcançáveis).
O arquivo ~/.vnc/xstartup é um script de shell executado pelo servidor VNC quando ele inicia,
e pode ser usado para definir qual ambiente de desktop o servidor VNC disponibilizará para
o cliente VNC. É importante observar que nativamente o VNC não propõe métodos nativos
de criptografia e autenticação modernos, e por isso deve ser usado em conjunto com um
360 32. 106.2_Areas_de_trabalho_graficas/
Fabio Gonçalves De Melo Santana / [email protected]

aplicativo de terceiros que forneça esses recursos. Com frequência, usam-se métodos que
envolvem túneis VPN e SSH para proteger as conexões VNC.

O Remote Desktop Protocol (RDP) é usado sobretudo para acessar remotamente a área de
trabalho de um sistema operacional Microsoft Windows por meio da porta de rede TCP 3389.
Embora ele empregue o protocolo RDP proprietário da Microsoft, a implementação do cliente
usada nos sistemas Linux consiste em programas de código aberto licenciados sob a GNU
General Public License (GPL) e não tem restrições legais de uso.

O Simple Protocol for Independent Computing Environments (Spice) compreende um conjunto


de ferramentas destinadas a acessar o ambiente de trabalho de sistemas virtualizados, seja
na máquina local ou em um local remoto. Além disso, o protocolo Spice oferece recursos
nativos para integrar os sistemas locais e remotos, como a capacidade de acessar dispositivos
locais (por exemplo, os alto-falantes e os dispositivos USB conectados) da máquina remota e
compartilhamento de arquivos entre os dois sistemas.

Existem comandos de cliente específicos para se conectar a cada um desses protocolos de


desktop remoto, mas o cliente de desktop remoto Remmina fornece uma interface gráfica
integrada que facilita o processo de conexão, com a opção de armazenar as configurações de
conexão para uso posterior. O Remmina tem plugins para cada protocolo individual e existem
plugins para XDMCP, VNC, RDP e Spice. A escolha da ferramenta certa depende dos sistemas
operacionais envolvidos, da qualidade da conexão de rede e dos recursos do ambiente de área
de trabalho remoto que devem estar disponíveis.
Fabio Gonçalves De Melo Santana / [email protected]

33
106.3 Acessibilidade

Introdução
O ambiente de desktop do Linux inclui muitas configurações e ferramentas para adaptar a
interface do usuário a pessoas com deficiência. Os dispositivos de interface humana comuns
podem ser reconfigurados individualmente para compensar deficiências visuais ou uma mobil-
idade reduzida.

É possível, por exemplo, adaptar o esquema de cores da área de trabalho para melhor atender
pessoas daltônicas. Além disso, quem sofre de lesões por esforço repetitivo pode tirar proveito
de métodos alternativos de digitação e clique.

Alguns desses recursos de acessibilidade são fornecidos pelo próprio ambiente de área de
trabalho, como o Gnome ou o KDE, e outros são fornecidos por programas adicionais. Neste
último caso, é importante escolher a ferramenta que melhor se integra ao ambiente de trabalho,
para ter um auxílio de melhor qualidade.

Configurações de acessibilidade
As principais distribuições Linux incluem mais ou menos os mesmos recursos de acessibilidade,
que podem ser personalizados com um módulo especial no gerenciador de configurações que
vem com o ambiente de desktop. O módulo de configurações de acessibilidade é chamado de
Acesso universal na área de trabalho do Gnome, enquanto que no KDE ele está em Configu-
rações do sistema, Personalização, Acessibilidade. Outros ambientes de desktop, como o Xfce,

361
362 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]

também o chamam de Acessibilidade em seu gerenciador de configurações gráficas. Porém,


de maneira geral eles oferecem um conjunto reduzido de funcionalidades em comparação com
o Gnome e o KDE.

O Gnome, por exemplo, pode ser configurado para exibir permanentemente o menu de Acesso
Universal no canto superior direito da tela, permitindo ativar rapidamente as opções de aces-
sibilidade. Podemos usá-las, por exemplo, para substituir o alerta sonoro por um alerta visual,
permitindo que usuários com deficiência auditiva percebam os alertas do sistema com mais
facilidade. Embora o KDE não inclua um menu de acesso rápido semelhante, o recurso de
alerta visual também está disponível com o nome de sino visual.

Assistente de teclado e mouse


O comportamento padrão do teclado e do mouse pode ser modificado para contornar dificul-
dades específicas de mobilidade. As combinações de teclas, a taxa de repetição automática
de teclas e os pressionamentos de tecla não intencionais representam obstáculos significativos
para usuários com mobilidade reduzida das mãos. Para compensar esses contratempos de
digitação, existem três recursos de acessibilidade relacionados ao teclado: Teclas de aderência,
Teclas de repercussão e Teclas lentas.

O recurso Teclas de aderência (Sticky keys), encontrado na seção Digitação da configuração


de Acesso Universal do Gnome, permite ao usuário digitar atalhos de teclado uma tecla por
vez. Quando ativado, combinações de teclas como Ctrl+C não precisam ser pressionadas ao
mesmo tempo. O usuário pode primeiro pressionar a tecla Ctrl, soltá-la e em seguida pressionar
a tecla C. No KDE, esta opção está na guia Teclas modificadoras da janela de configurações
de Acessibilidade. O KDE também oferece a opção de Teclas de bloqueio: se habilitada,
as teclas Alt, Ctrl e Shift permanecerão “apertadas” se o usuário as pressionar duas vezes,
semelhante ao comportamento da tecla Caps lock. Como no caso do recurso Caps lock, o
usuário precisará pressionar a tecla correspondente novamente para liberá-la.

O recurso Teclas de repercussão (Bounce keys) serve para inibir pressionamentos de tecla não
intencionais, adicionando um tempo de latência entre eles, ou seja, um novo pressionamento
de tecla será aceito somente após um período de tempo especificado desde o pressionamento
anterior. Com o recurso de teclas de repercussão, os usuários com tremores nas mãos evitam
os efeitos de pressionar uma tecla várias vezes quando pretendem pressioná-la apenas uma
vez. No Gnome, este recurso diz respeito apenas às repetições da mesma tecla. Já no KDE
são levados em conta os pressionamentos de outras teclas. Ele pode ser encontrado na guia
Filtros do teclado.

O recurso Teclas lentas (Slow keys) também ajuda a evitar toques acidentais nas teclas.
Quando ativadas, as teclas lentas exigem que o usuário mantenha a tecla pressionada por
363 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]

um período de tempo especificado antes de ela ser aceita. Dependendo das necessidades do
usuário, também pode ser útil ajustar a repetição automática enquanto uma tecla é mantida
pressionada, disponível nas configurações do teclado.

Os recursos de acessibilidade de teclas de aderência e teclas lentas podem ser ativados e de-
sativados com Gestos de ativação realizados no teclado. No KDE, a opção Usar gestos para
ativar as teclas de aderência e as teclas lentas deve ser marcada para habilitar os Gestos de
Ativação, enquanto no Gnome esse recurso é chamado de Habilitar por Teclado na janela de
configuração do Assistente de Digitação. Assim que os Gestos de Ativação forem habilitados,
o recurso de teclas de aderência será ativado pressionando-se a tecla Shift cinco vezes consec-
utivas. Para ativar o recurso de teclas lentas, a tecla Shift deve ser mantida pressionada por
oito segundos consecutivos.

Os usuários que acham mais confortável usar o teclado em vez do mouse ou touchpad podem
recorrer aos atalhos de teclado para navegar no ambiente de trabalho. Além disso, um recurso
chamado Mouse por teclado permite que o usuário controle o próprio ponteiro do mouse com o
teclado numérico, presente em teclados de desktop de tamanho normal e em laptops maiores.

O teclado numérico é organizado em uma grade quadrada, de modo que cada número cor-
responde a uma direção: 2 move o cursor para baixo, 4 move o cursor para a esquerda, 7
move o cursor para o noroeste etc. Por padrão, o número 5 corresponde ao clique esquerdo
do mouse.

Ao passo que no Gnome há apenas um interruptor para habilitar a opção Mouse por teclado na
janela de configurações de Acesso universal, no KDE as configurações de Mouse por teclado
estão localizadas em Configurações do sistema, Mouse, Navegação por teclado. Certas opções,
como velocidade e aceleração, podem ser personalizadas.

As teclas lentas, teclas de aderência, teclas de repercussão e o mouse por teclado são
recursos de acessibilidade fornecidos pelo AccessX, um recurso existente na extensão
X keyboard do X Window System. As configurações do AccessX também podem ser
modificadas na linha de comando, com o comando xkbset.

O mouse ou o touchpad podem ser usados para gerar entrada de teclado quando o uso do
teclado físico for demasiado desconfortável ou impossível. Se a opção Teclado virtual nas
configurações de acesso universal do Gnome estiver habilitada, um teclado aparecerá na tela
sempre que o cursor estiver em um campo de texto; um novo texto é inserido clicando-se nas
teclas com o mouse ou os dedos em uma tela de toque, semelhante ao teclado virtual dos
smartphones.

O KDE e outros ambientes de área de trabalho nem sempre trazem o teclado virtual por padrão,
364 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]

mas o pacote onboard, que pode ser instalado manualmente, oferece um teclado virtual simples
que pode ser usado em qualquer ambiente de área de trabalho. Após a instalação, ele ficará
disponível como um aplicativo normal no inicializador de aplicativos.

O comportamento do ponteiro também pode ser modificado, se o gesto de clicar e arrastar o


mouse causar dor ou for impraticável por qualquer outro motivo. Se o usuário não conseguir
clicar com o botão do mouse rápido o suficiente para acionar um evento de clique duplo, por
exemplo, o intervalo de tempo para pressionar o botão do mouse uma segunda vez para um
duplo clique pode ser aumentado em Preferências do mouse na janela de configuração do
sistema.

Se o usuário não conseguir pressionar um ou mais botões do mouse, os cliques podem ser
simulados usando diferentes técnicas. Na seção Assistência de clique do Acesso Universal do
Gnome, a opção Clique secundário simulado simula um clique com o botão direito se o usuário
pressionar e segurar o botão esquerdo do mouse. Com a opção Clique flutuante habilitada,
um evento de clique será disparado quando o usuário segurar o mouse sem movê-lo. No KDE,
o aplicativo KMouseTool fornece esses mesmos recursos para facilitar as ações com o mouse.

Deficiências visuais
Alguns usuários com visão reduzida ainda podem usar a tela do monitor para interagir com
o computador. Dependendo das necessidades do usuário, muitos ajustes visuais são possíveis
para refinar os detalhes de difícil visualização da área de trabalho gráfica padrão.

A seção Visão das configurações de Acesso universal do Gnome inclui opções que podem
ajudar pessoas com visão reduzida:

• Alto contraste - torna as janelas e botões mais visíveis exibindo-os em cores mais
contrastadas;
• Texto grande - amplia o tamanho padrão da fonte na tela;
• Tamanho do cursor - permite escolher um cursor maior e mais fácil de localizar na
tela.

Alguns desses ajustes não estão estritamente relacionados aos recursos de acessibilidade e,
portanto, podem ser encontrados na seção de aparência do utilitário de configuração fornecido
por outros ambientes de desktop. Um usuário que tenha dificuldade em discernir entre os
elementos visuais pode escolher um tema de alto contraste para facilitar a identificação de
botões, janelas sobrepostas etc.

Se os ajustes de aparência por si só não forem suficientes para aprimorar a legibilidade, um


programa de ampliação pode ser usado para aumentar o zoom em certas partes da tela. Esse
recurso é chamado de Ampliação nas configurações de Acesso universal do Gnome, onde
365 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]

opções como taxa de ampliação, posição da lupa e ajustes de cor podem ser personalizadas.

No KDE, o programa KMagnifier oferece os mesmos recursos, mas está disponível como um
aplicativo comum através do inicializador de aplicativos. Outros ambientes de desktop podem
fornecer seus próprios ampliadores de tela. O Xfce, por exemplo, permite aumentar e diminuir
o zoom da tela girando a roda de rolagem do mouse enquanto a tecla Alt está pressionada.

Finalmente, os usuários para os quais a interface gráfica não é uma opção podem usar um
leitor de tela para interagir com o computador. Independentemente do ambiente de trabalho
escolhido, o leitor de tela mais popular para os sistemas Linux é o Orca, que normalmente
vem instalado por padrão na maioria das distribuições. O Orca gera uma voz sintetizada que
descreve os eventos na tela e lê o texto sob o cursor do mouse. O Orca também funciona com
visores braille atualizáveis, dispositivos especiais que exibem caracteres em braille erguendo
pequenos pinos que podem ser sentidos com a ponta dos dedos. Nem todos os aplicativos de
desktop são totalmente adaptados para leitores de tela e nem todos os usuários acharão fácil
usá-los, por isso é importante fornecer o máximo possível de estratégias de leitura de tela para
os usuários terem escolha.

Resumo
Esta aula cobre os recursos gerais de acessibilidade disponíveis nos sistemas Linux. Todos os
principais ambientes de desktop, especialmente o Gnome e o KDE, fornecem diversos aplica-
tivos integrados e de terceiros para auxiliar as pessoas com deficiência visual ou mobilidade
reduzida. A lição abrange os seguintes tópicos:

• Como alterar as configurações de acessibilidade;


• Maneiras alternativas de usar o teclado e o mouse;
• Adaptações da área de trabalho para os deficientes visuais.

Os comandos e procedimentos abordados foram:

• Configurações de acessibilidade do teclado: Teclas de aderência, teclas lentas, teclas de


repercussão;
• Eventos do mouse gerados artificialmente;
• Teclado virtual;
• Ajustes visuais para melhorar a legibilidade;
• Temas da área de trabalho com alto contraste/letras grandes;
• Ampliadores de tela;
• O leitor de tela Orca. # 107.1 Administrar contas de usuários, grupos e arquivos de
sistema relacionados
366 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]

Introdução
A administração de usuários e grupos é uma parte fundamental do trabalho de qualquer
administrador de sistema. As distribuições Linux modernas incluem interfaces gráficas que
permitem gerenciar todas as atividades relacionadas a este aspecto com rapidez e facilidade.
Essas interfaces são visualmente diferentes entre si, mas os recursos são os mesmos. Com
essas ferramentas, torna-se possível visualizar, editar, adicionar e excluir usuários e grupos
locais. No entanto, para tarefas de gerenciamento mais avançadas, é necessário usar a linha
de comando.

Adicionando contas de usuário


No Linux, podemos adicionar uma nova conta de usuário com o comando useradd. Por
exemplo, com privilégios de root, criamos uma nova conta de usuário chamada joatham com
uma configuração padrão, usando o seguinte:

root@debian10:/home/debian# useradd joatham

Quando você executa o comando useradd, as informações do usuário e do grupo armazenadas


nos bancos de dados de senha e grupo são atualizadas para a conta de usuário recém-criada
e, caso especificado, o diretório inicial do novo usuário também é criado, bem como um grupo
com o mesmo nome da nova conta de usuário.

Depois de criar o novo usuário, você pode definir a senha dele usando o comando passwd. Para
rever o ID de usuário (UID), ID de grupo (GID) e os grupos aos quais esse usuário pertence,
usamos os comandos id e groups.

root@debian10:/home/debian# passwd joatham


Changing password for user joatham.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
root@debian10:/home/debian# id joatham
uid=1000(joatham) gid=100(joatham) groups=100(joatham)
root@debian10:/home/debian# groups joatham
joatham : joatham

Lembre-se de que qualquer usuário pode consultar seu UID, GID e os grupos aos
quais pertence simplesmente usando os comandos id e groups sem argumentos, e que
367 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]

qualquer usuário pode alterar sua própria senha com o comando passwd. No entanto,
apenas os usuários com privilégios de root podem alterar a senha de qualquer usuário.

As opções mais importantes que se aplicam ao comando useradd são:

• -c - Cria uma nova conta de usuário com comentários personalizados (por exemplo, o
nome completo do usuário);
• -d - Cria uma nova conta de usuário com um diretório pessoal personalizado;
• -e - Cria uma nova conta de usuário definindo uma data específica na qual ela será
desabilitada;
• -f - Cria uma nova conta de usuário definindo o número de dias após a expiração de
uma senha durante os quais o usuário deve atualizar a senha (caso contrário, a conta
será desabilitada);
• -g - Cria uma nova conta de usuário com um GID específico;
• -G - Cria uma nova conta de usuário adicionando-a a diversos grupos secundários;
• -k - Cria uma nova conta de usuário copiando os arquivos de esqueleto de um diretório
personalizado específico (esta opção só é válida se a opção -m ou –create-home for
especificada);
• -m - Cria uma nova conta de usuário com seu diretório inicial (se ele não existir);
• -M - Cria uma nova conta de usuário sem seu diretório inicial;
• -s - Cria uma nova conta de usuário com um shell de login específico;
• -u - Cria uma nova conta de usuário com um UID específico.

Modificando contas de usuário


Às vezes, precisamos alterar um atributo de uma conta de usuário existente, como o nome
de login, o shell de login, a data de expiração da senha e assim por diante. Nesses casos,
empregamos o comando usermod.

root@debian10:/home/debian# usermod -s /bin/tcsh joatham


root@debian10:/home/debian# usermod -c "joatham User Account" joatham

Assim como no caso de useradd, o comando usermod requer privilégios de root.

Nos exemplos acima, o shell de login de joatham é alterado primeiro e, em seguida, uma breve
descrição é adicionada a esta conta de usuário. Lembre-se de que podemos modificar diversos
atributos de uma vez, especificando-os em um único comando.

As opções mais importantes que se aplicam ao comando usermod são:


368 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]

• -c - Adiciona um breve comentário à conta de usuário especificada;


• -d - Altera o diretório inicial da conta de usuário especificada. Quando usado com a
opção -m, o conteúdo do diretório inicial atual é movido para o novo diretório inicial,
que é criado se ainda não existir;
• -e - Define a data de expiração da conta de usuário especificada;
• -f - Define o número de dias após a expiração da senha durante os quais o usuário deve
atualizá-la (caso contrário, a conta é desabilitada);
• -g - Muda o grupo primário da conta de usuário especificada (o grupo deve existir);
• -G - Adiciona grupos secundários à conta de usuário especificada. Cada grupo deve ex-
istir e ser separado do seguinte por uma vírgula, sem espaços em branco intermediários.
Quando usada sozinha, esta opção remove todos os grupos existentes aos quais o usuário
pertence; quando usada com a opção -a, ela simplesmente anexa novos grupos se-
cundários aos existentes;
• -l - Altera o nome de login da conta de usuário especificada;
• -L - Bloqueia a conta de usuário especificada. Um ponto de exclamação é posto na
frente da senha criptografada dentro do arquivo /etc/shadow, desabilitando assim o
acesso com senha para esse usuário;
• -s - Altera o shell de login da conta de usuário especificada;
• -u - Altera o UID da conta de usuário especificada;
• -U - Desbloqueia a conta de usuário especificada. Remove o ponto de exclamação na
frente da senha criptografada no arquivo /etc/shadow.

Lembre-se que, ao alterar o nome de login de uma conta de usuário, você provavel-
mente deve renomear o diretório pessoal desse usuário e outros itens relacionados a
ele, como arquivos de spool de email. Lembre-se também que, ao alterar o UID de
uma conta de usuário, provavelmente será preciso corrigir a propriedade dos arquivos
e diretórios que estejam fora do diretório inicial do usuário (o ID do usuário é alterado
automaticamente na caixa de email do usuário e em todos os arquivos pertencentes
ao usuário e localizados no diretório inicial do usuário).

Excluindo contas de usuário


Se quiser excluir uma conta de usuário, você pode usar o comando userdel. Em particular,
este comando atualiza as informações armazenadas nos bancos de dados de contas, removendo
todas as entradas referentes ao usuário especificado. A opção -r também remove o diretório
pessoal do usuário e todo o seu conteúdo, junto com o spool de email do usuário. Outros
arquivos, localizados em outros locais, devem ser buscados e excluídos manualmente.

root@debian10:/home/debian# userdel -r joatham


369 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]

Quanto a useradd e usermod, é necessário ter autoridade de root para excluir contas de usuário.

Adicionando, modificando e excluindo grupos


Como no caso do gerenciamento de usuários, podemos adicionar, modificar e excluir grupos
usando os comandos groupadd, groupmod e groupdel com privilégios de root. Se quiser criar
um novo grupo chamado desenvolvedor, execute o seguinte comando:

root@debian10:/home/debian# groupadd -g 1090 desenvolvedor

A opção -g deste comando cria um grupo com um GID específico.

Lembre-se de que quando você adiciona uma nova conta de usuário, o grupo primário
e os grupos secundários aos quais ela pertence precisam existir antes de iniciar o
comando useradd.

Mais tarde, se você quiser renomear o grupo desenvolvedor para desenvolvedor_web e alterar
seu GID, pode executar o seguinte:

root@debian10:/home/debian# groupmod -n desenvolvedor_web -g 1050 desenvolvedor

Se você alterar o GID usando a opção -g, será necessário alterar o GID de todos os
arquivos e diretórios que precisam continuar a pertencer ao grupo.

Finalmente, para excluir o grupo desenvolvedor_web, execute o seguinte:

root@debian10:/home/debian# groupdel desenvolvedor_web

Não é possível excluir um grupo caso se trate do grupo principal de uma conta de usuário.
Portanto, é preciso remover o usuário antes de remover o grupo. Quanto aos usuários, se
você excluir um grupo, os arquivos pertencentes a esse grupo permanecerão em seu sistema
de arquivos e não serão excluídos ou atribuídos a outro grupo.
370 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]

O diretório de esqueleto
Quando você adiciona uma nova conta de usuário e cria seu diretório inicial, o diretório inicial
recém-criado é preenchido com arquivos e pastas copiados do diretório de esqueleto (por
padrão /etc/skel). A ideia é simples: um administrador de sistema deseja adicionar novos
usuários que tenham os mesmos arquivos e diretórios em sua pasta pessoal. Portanto, caso
queira personalizar os arquivos e pastas criados automaticamente no diretório inicial das novas
contas de usuário, você deve adicionar esses novos arquivos e pastas ao diretório de esqueleto.

Se quiser listar todos os arquivos e diretórios no diretório de esqueleto, use o comando


ls -al.

O arquivo /etc/login.defs
No Linux, o arquivo /etc/login.defs especifica os parâmetros de configuração que controlam
a criação de usuários e grupos. Além disso, os comandos mostrados nas seções anteriores
utilizam os valores padrão deste arquivo.

As diretivas mais importantes são:

• UID_MIN e UID_MAX - O intervalo de IDs de usuário que podem ser atribuídos a


novos usuários comuns;
• GID_MIN e GID_MAX - O intervalo de IDs de grupo que podem ser atribuídos a
novos grupos comuns;
• CREATE_HOME - Especifica se um diretório pessoal deve ser criado por padrão para
novos usuários;
• USERGROUPS_ENAB - Especifica se o sistema deve, por padrão, criar um novo
grupo para cada nova conta de usuário com o mesmo nome do usuário, e se, ao deletar
a conta do usuário, o grupo primário do usuário também deve ser removido, caso não
contenha mais membros;
• MAIL_DIR - O diretório de spool de email;
• PASS_MAX_DAYS - O número máximo de dias que uma senha pode ser usada;
• PASS_MIN_DAYS - O número mínimo de dias permitido entre mudanças de senha;
• PASS_MIN_LEN - O comprimento mínimo aceitável da senha;
• PASS_WARN_AGE - O número de dias de aviso antes que uma senha expire.

Ao gerenciar usuários e grupos, sempre verifique este arquivo para visualizar e, even-
tualmente, alterar o comportamento padrão do sistema, se necessário.
371 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]

O comando passwd
Este comando é usado principalmente para alterar a senha de um usuário. Conforme descrito
anteriormente, qualquer usuário pode alterar sua própria senha, mas apenas o root pode alterar
a senha de qualquer usuário. Isso acontece porque o comando passwd tem o bit SUID definido
(um s no lugar do sinalizador executável para o proprietário), o que significa que ele é executado
com os privilégios do proprietário do arquivo (portanto, root).

root@debian10:/home/debian# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 42096 mag 17 2015 /usr/bin/passwd

Dependendo das opções utilizadas com passwd, é possível controlar aspectos específicos do
envelhecimento da senha:

• -d - Apaga a senha de uma conta de usuário (desabilitando o usuário);


• -e - Força a conta de usuário a alterar a senha;
• -i - Define o número de dias de inatividade após a expiração de uma senha, durante os
quais o usuário deve atualizar a senha (caso contrário, a conta será desabilitada);
• -l - Bloqueia a conta de usuário (a senha criptografada é prefixada com um ponto de
exclamação no arquivo /etc/shadow);
• -n - Define o tempo de vida mínimo da senha;
• -S - Exibe informações sobre o status da senha de uma conta de usuário específica;
• -u - Desbloqueia a conta do usuário (o ponto de exclamação é removido do campo de
senha no arquivo /etc/shadow);
• -x - Define o tempo de vida máximo da senha;
• -w - Define o número de dias de aviso antes que a senha expire, durante os quais o
usuário é advertido de que a senha deve ser alterada.

Os grupos também podem ter uma senha, que pode ser definida usando o comando
gpasswd. Os usuários que não são membros de um grupo, mas conhecem a senha
podem ingressar nele temporariamente usando o comando newgrp. gpasswd também
é usado para adicionar e remover usuários de um grupo, e para definir a lista de
administradores e membros comuns do grupo.

O comando chage
Este comando, que significa “alterar idade” (change age), é usado para alterar as informações
de validade da senha de um usuário. O comando chage é restrito ao root, exceto com a opção
-l, que pode ser executada por usuários comuns para listar informações sobre a expiração de
372 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]

senha de suas próprias contas.

As outras opções que se aplicam ao comando chage são:

• -d - Define a última alteração de senha para uma conta de usuário;


• -E - Define a data de expiração para uma conta de usuário;
• -I - Define o número de dias de inatividade após a expiração de uma senha, durante os
quais o usuário deve atualizar a senha (caso contrário, a conta será desabilitada);
• -m - Define o tempo de vida mínimo da senha para uma conta de usuário;
• -M - Define o tempo de vida máximo da senha para uma conta de usuário;
• -W - Define o número de dias de aviso antes que a senha expire, durante os quais o
usuário é advertido de que a senha deve ser alterada.

As ferramentas de linha de comando discutidas nesta aula, e os aplicativos gráficos (fornecidos


pelas distribuições) que executam as mesmas tarefas, atualizam uma série de arquivos, nos
quais são armazenadas informações sobre os usuários e grupos.

Esses arquivos ficam no diretório /etc/ e são:

• /etc/passwd - Um arquivo de sete campos delimitados por dois pontos contendo in-
formações básicas sobre os usuários;
• /etc/group - Um arquivo de quatro campos delimitados por dois pontos contendo
informações básicas sobre os grupos;
• /etc/shadow - Um arquivo de nove campos delimitados por dois pontos contendo
senhas de usuário criptografadas;
• /etc/gshadow - Um arquivo de quatro campos delimitados por dois pontos contendo
senhas de grupo criptografadas.

Embora esses quatro arquivos estejam em texto simples, eles não devem jamais ser editados
diretamente, mas sim por meio das ferramentas fornecidas pela distribuição que se está usando.

/etc/passwd
Este é um arquivo legível por todos contendo uma lista de usuários em linhas separadas. Cada
linha consiste em sete campos delimitados por dois pontos:

• Nome de usuário - O nome usado quando o usuário se loga no sistema;


• Senha - A senha criptografada (ou um x no caso de senhas shadow);
• ID de usuário (UID) - O número de identificação atribuído ao usuário no sistema;
• ID de grupo (GID) - O número do grupo principal do usuário no sistema;
• GECOS - Um campo de comentário opcional, usado para adicionar informações ex-
tras sobre o usuário (como o nome completo). O campo pode conter várias entradas
373 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]

separadas por vírgulas;


• Diretório inicial - O caminho absoluto do diretório inicial do usuário;
• Shell - O caminho absoluto do programa que é iniciado automaticamente quando o
usuário efetua login no sistema (geralmente um shell interativo como /bin/bash).

/etc/group
Este é um arquivo legível por todos contendo uma lista de grupos em linhas separadas. Cada
linha consiste em quatro campos delimitados por dois pontos:

• Nome do grupo - O nome do grupo;


• Senha do grupo - A senha criptografada do grupo (ou um x se forem usadas senhas
shadow);
• ID do grupo (GID) - O número de identificação atribuído ao grupo no sistema;
• Lista de membros - Uma lista delimitada por vírgulas de usuários pertencentes ao
grupo, exceto aqueles para os quais este é o grupo principal.

/etc/shadow
Este é um arquivo que pode ser lido apenas pelo root e por usuários com privilégios de root
contendo senhas de usuário criptografadas em linhas separadas. Cada linha consiste em nove
campos delimitados por dois pontos:

• Nome de usuário - O nome usado quando o usuário se loga no sistema;


• Senha criptografada - A senha criptografada do usuário (se o valor começar com !, a
conta está bloqueada);
• Data da última mudança de senha - A data da última alteração de senha, em
número de dias desde 01/01/1970 (o valor 0 significa que o usuário deve alterar a senha
no próximo login);
• Idade mínima da senha - O número mínimo de dias que devem decorrer após uma
alteração de senha para que o usuário tenha permissão de alterar a senha novamente;
• Idade máxima da senha - O número máximo de dias que devem se passar antes que
uma alteração de senha seja necessária;
• Período de aviso de senha - O número de dias até a expiração da senha, durante os
quais o usuário é avisado de que a senha deve ser alterada;
• Período de inatividade da senha - O número de dias após a expiração de uma senha,
durante os quais o usuário deve atualizá-la. Após esse período, se o usuário não alterar
a senha, a conta é desativada;
• Data de expiração da conta - A data, em número de dias desde 01/01/1970, na
qual a conta do usuário será desativada. Um campo vazio indica que a conta do usuário
nunca expirará;
374 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]

• Um campo reservado - Um campo reservado para uso futuro.

/etc/gshadow
Este é um arquivo legível apenas pelo root e por usuários com privilégios de root que contém
senhas criptografadas para grupos em linhas separadas. Cada linha consiste em quatro campos
delimitados por dois pontos:

• Nome do grupo - O nome do grupo;


• Senha criptografada - A senha criptografada do grupo (é usada quando um usuário
que não é membro do grupo deseja ingressar no grupo usando o comando newgrp–se a
senha começar com !, ninguém tem permissão de acessar o grupo com newgrp);
• Administradores do grupo - Uma lista dos administradores do grupo delimitada por
vírgulas (eles podem alterar a senha do grupo, bem como adicionar ou remover membros
do grupo com o comando gpasswd);
• Membros do grupo - Uma lista dos membros do grupo delimitada por vírgulas.

Como filtrar os bancos de dados de senha e grupo


É frequentemente necessário rever as informações sobre usuários e grupos armazenadas nesses
quatro arquivos e pesquisar por registros específicos. Para realizar esta tarefa, usamos o
comando grep ou, alternativamente, concatenamos cat e grep.

root@debian10:/home/debian# grep emma /etc/passwd


emma:x:1020:1020:User Emma:/home/emma:/bin/bash
root@debian10:/home/debian# cat /etc/group | grep db-admin
db-admin:x:1050:grace,frank

Outra maneira de acessar esses bancos de dados é usar o comando getent. Em geral, esse
comando exibe entradas de bancos de dados suportados pelas bibliotecas Name Service Switch
(NSS) e requer o nome do banco de dados e uma chave de pesquisa. Se nenhum argumento-
chave for fornecido, todas as entradas do banco de dados especificado serão exibidas (a menos
que o banco de dados não suporte enumeração). Caso contrário, se um ou mais argumentos-
chave forem fornecidos, o banco de dados será filtrado de acordo.

root@debian10:/home/debian# getent passwd emma


emma:x:1020:1020:User Emma:/home/emma:/bin/bash
root@debian10:/home/debian# getent group db-admin
db-admin:x:1050:grace,frank
375 33. 106.3 Acessibilidade
Fabio Gonçalves De Melo Santana / [email protected]

O comando getent não requer autoridade de root; você só precisa ter a permissão para ler o
banco de dados do qual deseja recuperar os registros.

Lembre-se de que o getent só pode acessar os bancos de dados configurados no arquivo


/etc/nsswitch.conf.

Talvez isso possa te ajudar. . .

- Fonte: - https://blog.csdn.net/weixin_42499201/article/details/117778817
Fabio Gonçalves De Melo Santana / [email protected]

34
107.2 Automatizar tarefas de
administração do sistema
agendando trabalhos

Introdução
Cara, tenho certeza de que vez ou outra você já precisou ou pensou em agendar uma tarefa
aqui no Linux pra economizar trabalho manual. E essa ideia vem muito bem a calhar, pois
uma das funções mais importantes de um bom administrador de sistema é agendar os jobs
(trabalhos) que precisam ser executados regularmente. Por exemplo, um administrador pode
criar e automatizar jobs para fazer backups, atualizações do sistema e muitas outras atividades
repetitivas. Para isso, usamos o recurso cron, que serve para automatizar o agendamento de
tarefas periódicas.

Como agendar jobs com o cron


No Linux, cron é um daemon que roda continuamente e desperta a cada minuto para verificar
uma série de tabelas em busca de tarefas a executar. Essas tabelas são chamadas de crontabs e
contêm os chamados cron jobs (trabalhos cron). O Cron é adequado para servidores e sistemas
que estão constantemente ligados, pois cada cron job é executado somente se o sistema estiver
rodando no horário programado. Ele pode ser usado por usuários comuns, cada um com seu
próprio crontab, bem como pelo usuário root, que gerencia os crontabs do sistema.

376
377 34. 107.2 Automatizar tarefas de administração do sistema agendando trabalhos
Fabio Gonçalves De Melo Santana / [email protected]

Crontabs de usuário
Os crontabs de usuário são arquivos de texto que gerenciam o agendamento de trabalhos cron
definidos pelo usuário. Eles sempre têm o nome da conta de usuário que os criou, mas a
localização desses arquivos depende da distribuição usada (geralmente é um subdiretório de
/var/spool/cron).

Cada linha em um crontab de usuário contém seis campos separados por um espaço:

• O minuto da hora (0-59);


• A hora do dia (0-23);
• O dia do mês (1-31);
• O mês do ano (1-12);
• O dia da semana (0-7 com Domingo=0 ou Domingo=7);
• O comando a executar.

Para o mês do ano e o dia da semana, podemos usar as três primeiras letras do nome em vez
do número correspondente.

Os primeiros cinco campos indicam quando executar o comando especificado no sexto campo,
e podem conter um ou mais valores. Em particular, é possível especificar vários valores usando:

• * (asterisco): Refere-se a qualquer valor;


• , (vírgula): Especifica uma lista de valores possíveis;
• - (hífen): Especifica um intervalo de valores possíveis;
• / (barra): Especifica valores escalonados.

Muitas distribuições incluem o arquivo /etc/crontab, que pode ser usado como referência para
a disposição dos elementos de um arquivo cron. Eis um exemplo de arquivo /etc/crontab de
uma instalação de Debian:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:


# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
378 34. 107.2 Automatizar tarefas de administração do sistema agendando trabalhos
Fabio Gonçalves De Melo Santana / [email protected]

Crontabs de sistema
Os crontabs de sistema são arquivos de texto que gerenciam a programação de cron jobs
do sistema e só podem ser editados pelo usuário root. /etc/crontab e todos os arquivos no
diretório /etc/cron.d são crontabs de sistema.

A maioria das distribuições inclui também os diretórios /etc/cron.hourly (de hora em hora),
/etc/cron.daily (diariamente), /etc/cron.weekly (semanalmente) e /etc/cron.monthly (men-
salmente), que contêm scripts que devem ser executados com a frequência adequada. Por
exemplo, se você quiser executar um script diariamente, pode colocá-lo em /etc/cron.daily.

Algumas distribuições usam /etc/cron.d/hourly, /etc/cron.d/daily, /etc/cron.d/weekly


e /etc/cron.d/monthly. Lembre-se de sempre conferir os diretórios corretos nos quais
colocar os scripts que o cron deve executar.

A sintaxe dos crontabs de sistema é semelhante à dos crontabs de usuário, porém ela requer
um campo adicional obrigatório que especifica qual usuário executará o cron job. Portanto,
cada linha em um crontab de sistema contém sete campos separados por um espaço:

• O minuto da hora (0-59);


• A hora do dia (0-23);
• O dia do mês (1-31);
• O mês do ano (1-12);
• O dia da semana (0-7 com Domingo=0 ou Domingo=7);
• O nome da conta de usuário a ser usada ao executar o comando;
• O comando a executar.

Quanto aos crontabs do usuário, podemos especificar mais de um valor nos campos de tempo
usando os operadores *, ,, - e /. Também é possível indicar o mês do ano e o dia da semana
com as três primeiras letras do nome em vez do número correspondente.

Especificações de tempo particulares


Ao editar os arquivos crontab, podemos usar atalhos especiais nas primeiras cinco colunas em
vez das especificações de tempo:

• @reboot: Roda a tarefa especificada uma vez após a reinicialização;


• @hourly: Roda a tarefa especificada uma vez por hora no início da hora;
• @daily (or @midnight): Roda a tarefa especificada uma vez por dia à meia-noite;
• @weekly: Roda a tarefa especificada uma vez por semana, à meia-noite de domingo;
379 34. 107.2 Automatizar tarefas de administração do sistema agendando trabalhos
Fabio Gonçalves De Melo Santana / [email protected]

• @monthly: Roda a tarefa especificada uma vez por mês, à meia-noite do primeiro dia
do mês;
• @yearly (or @annually): Roda a tarefa especificada uma vez por ano, à meia-noite de 1ž
de janeiro.

Variáveis no crontab
Dentro de um arquivo crontab, pode haver atribuições de variáveis definidas antes que as
tarefas agendadas sejam declaradas. As variáveis de ambiente comumente definidas são:

• HOME: O diretório no qual o cron invoca os comandos (por padrão, o diretório inicial
do usuário);
• MAILTO: O nome do usuário ou o endereço para o qual a saída e o erro padrão são
enviados (por padrão, o proprietário do crontab). Diversos valores separados por vírgulas
também são permitidos, e um valor vazio indica que nenhum email deve ser enviado;
• PATH: O caminho no qual os comandos podem ser encontrados;
• SHELL: O shell a ser usado (por padrão /bin/sh).

Criando cron jobs de usuário


O comando crontab é usado para manter arquivos crontab para usuários individuais. Em
particular, o comando crontab -e serve para editar seu próprio arquivo crontab ou para criar
um, caso ele ainda não exista.

root@debian10:/home/debian$ crontab -e
no crontab for joatham - using an empty one

Select an editor. To change later, run 'select-editor'.


1. /bin/ed
2. /bin/nano < ‑‑‑‑ easiest
3. /usr/bin/emacs24
4. /usr/bin/vim.tiny

Choose 1-4 [2]:

Por padrão, o comando crontab abre o editor especificado pelas variáveis de ambiente VISUAL
ou EDITOR, para que você possa começar a editar seu arquivo crontab com o editor de sua
preferência. Algumas distribuições, como mostrado no exemplo acima, permitem escolher o
editor em uma lista quando crontab é executado pela primeira vez.

Se você deseja executar o script teste2.sh, localizado em seu diretório inicial, todos os dias às
10:00, adicione a seguinte linha ao seu arquivo crontab:
380 34. 107.2 Automatizar tarefas de administração do sistema agendando trabalhos
Fabio Gonçalves De Melo Santana / [email protected]

0 10 * * * /home/joatham/teste2.sh

Considere os seguintes exemplos de entradas de crontab:

0,15,30,45 08 * * 2 /home/joatham/teste.sh
30 20 1-15 1,6 1-5 /home/joatham/teste2.sh

Na primeira linha, o script teste.sh é executado todas as terças-feiras às 08:00, às 08:15, às


08:30 e às 08:45. Na segunda linha, o script teste2.sh é executado às 20h30 de segunda a
sexta-feira durante os primeiros quinze dias de janeiro e junho.

Embora os arquivos crontab possam ser editados manualmente, é sempre recomendável


usar o comando crontab. As permissões nos arquivos crontab geralmente possibilitam
editá-los por meio do comando crontab.

Além da opção -e mencionada acima, o comando crontab inclui outras opções úteis:

• -l: Exibe o crontab atual na saída padrão;


• -r: Remove o crontab atual;
• -u: Especifica o nome do usuário cujo crontab precisa ser modificado. Esta opção requer
privilégios de root e permite que o usuário root edite os arquivos crontab do usuário.

Criando cron jobs do sistema


Ao contrário dos crontabs de usuário, os crontabs de sistema são atualizados com um editor,
portanto, não é preciso executar o comando crontab para editar /etc/crontab e os arquivos
em /etc/cron.d. Lembre-se de que, ao editar crontabs do sistema, é necessário especificar a
conta que será usada para executar o cron job (geralmente o usuário root).

Por exemplo, para executar o script teste2.sh localizado no diretório /root todos os dias à
01:30, abra /etc/crontab com seu editor preferido e adicione a seguinte linha:

30 01 * * * root /root/teste2.sh >>/root/output.log 2>>/root/error.log

No exemplo acima, a saída do job é anexada a /root/output.log, enquanto os erros são


anexados a /root/error.log.
381 34. 107.2 Automatizar tarefas de administração do sistema agendando trabalhos
Fabio Gonçalves De Melo Santana / [email protected]

Exceto nos casos em que a saída é redirecionada para um arquivo, como no exemplo
acima (ou se a variável MAILTO estiver definida como um valor em branco), toda a
saída de um trabalho cron será enviada ao usuário via email. Uma prática comum é
redirecionar a saída padrão para /dev/null (ou para um arquivo, para revisão posterior,
se necessário) e não redirecionar o erro padrão. Desta forma, o usuário é notificado
imediatamente por email sobre eventuais erros.

Configurando o acesso ao agendamento de trabalhos


No Linux, os arquivos /etc/cron.allow e /etc/cron.deny são usados para definir as restrições do
crontab. Em particular, eles servem para permitir ou proibir o agendamento de trabalhos cron
para diferentes usuários. Se /etc/cron.allow existir, apenas usuários não root listados nele
podem agendar trabalhos cron usando o comando crontab. Se /etc/cron.allow não existir,
mas /etc/cron.deny sim, apenas usuários não root listados neste arquivo não podem agendar
trabalhos cron usando o comando crontab (neste caso, um /etc/cron.deny vazio significa que
todos os usuários têm permissão para agendar trabalhos cron com o crontab). Se nenhum
desses arquivos existir, o acesso do usuário ao agendamento de trabalhos cron dependerá da
distribuição usada.

Os arquivos /etc/cron.allow e /etc/cron.deny contêm uma lista de nomes de usuários


separados por linhas.

Uma alternativa ao cron


Usando o systemd como gerenciador de sistema e serviços, podemos definir temporizadores
como alternativa ao cron para agendar tarefas. Temporizadores são arquivos da unidade
systemd identificados pelo sufixo .timer. Para cada um deles, deve haver um arquivo de
unidade correspondente descrevendo a unidade a ser ativada quando o temporizador terminar.
Por padrão, um timer ativa um serviço com o mesmo nome, exceto pelo sufixo.

Um temporizador inclui uma seção [Timer] que especifica quando os jobs agendados devem ser
executados. Especificamente, podemos usar a opção OnCalendar= para definir temporizadores
em tempo real, que funcionam da mesma maneira que os cron jobs (baseiam-se na expressão
de eventos de calendário). A opção OnCalendar= requer a seguinte sintaxe:

DayOfWeek Year-Month-Day Hour:Minute:Second


382 34. 107.2 Automatizar tarefas de administração do sistema agendando trabalhos
Fabio Gonçalves De Melo Santana / [email protected]

sendo DayOfWeek opcional. Os operadores *, / e , têm o mesmo significado dos que são
usados para cron jobs. Usamos .. entre dois valores para indicar um intervalo contíguo. Na
especificação DayOfWeek (dia da semana), podemos usar as primeiras três letras do nome ou
o nome completo.

Você também pode definir temporizadores monotônicos, que são ativados após algum
tempo decorrido de um ponto de início específico (por exemplo, quando a máquina
foi inicializada ou quando o próprio temporizador foi ativado).

Por exemplo, para rodar o serviço /etc/systemd/system/servico.service às 05:30 da primeira


segunda-feira do mês, adicionamos as seguintes linhas no arquivo de unidade /etc/systemd/sys-
tem/servico.timer correspondente:

[Unit]
Description=Run the servico service

[Timer]
OnCalendar=Mon *-*-1..7 05:30:00
Persistent=true

[Install]
WantedBy=timers.target

Depois de criar o novo temporizador, você pode ativá-lo e iniciá-lo executando os seguintes
comandos como root:

root@debian10:/home/debian# systemctl enable servico.timer


root@debian10:/home/debian# systemctl start servico.timer

Podemos alterar a frequência do trabalho agendado modificando o valor OnCalendar e, em


seguida, digitando o comando systemctl daemon-reload.

Finalmente, se você quiser ver a lista de temporizadores ativos ordenados pelo momento em
que terminam, use o comando systemctl list-timers. A opção –all exibe também as unidades
de temporizador inativas.

Lembre-se de que os temporizadores são registrados no diário do systemd e você pode


rever os registros das diferentes unidades usando o comando journalctl. Além disso,
se estiver trabalhando como um usuário comum, será preciso usar a opção –user dos
383 34. 107.2 Automatizar tarefas de administração do sistema agendando trabalhos
Fabio Gonçalves De Melo Santana / [email protected]

comandos systemctl e journalctl.

Em vez da forma normalizada mais longa mencionada acima, é possível usar algumas expressões
especiais que descrevem frequências específicas para a execução de um job:

• hourly - Roda a tarefa especificada uma vez por hora, no início da hora;
• daily - Roda a tarefa especificada uma vez por dia à meia-noite;
• weekly - Roda a tarefa especificada uma vez por semana, na meia-noite de segunda-
feira;
• monthly - Roda a tarefa especificada uma vez por mês, na meia-noite do primeiro dia
do mês;
• yearly - Roda a tarefa especificada uma vez por ano, na meia-noite de 1ž de janeiro.

Agendamento de trabalhos com at


O comando at é usado para agendamento de tarefas únicas e requer apenas que se especifique
quando o trabalho deve ser executado no futuro. Após inserir at na linha de comando seguido
pela especificação de tempo, você entrará no prompt de at para definir os comandos a serem
executados. Saia do prompt com a sequência de teclas Ctrl+D.

root@debian10:/home/debian# at now +5 minutes


warning: commands will be executed using /bin/sh
at> date
at> Ctrl+D
job 12 at Sat Sep 14 09:15:00 2021

O job at no exemplo acima simplesmente executa o comando date após cinco minutos. Como
no caso do cron, a saída padrão e o erro são enviados por email. Observe que o daemon atd
precisará estar rodando no sistema para ser possível usar o agendamento de tarefas at.

No Linux, o comando batch é semelhante a at, porém os jobs batch são executados
apenas quando a carga do sistema está baixa o suficiente para permiti-lo.

As opções mais importantes do comando at são:

• -c - Imprime os comandos de um ID de trabalho específico na saída padrão;


• -d - Exclui trabalhos com base em seu ID de trabalho. É um alias para atrm;
• -f - Lê o job em um arquivo em vez da entrada padrão;
• -l - Lista as tarefas pendentes do usuário. Se o usuário for root, todos os trabalhos de
384 34. 107.2 Automatizar tarefas de administração do sistema agendando trabalhos
Fabio Gonçalves De Melo Santana / [email protected]

todos os usuários serão listados. É um alias para atq;


• -m - Envia um email para o usuário no final do trabalho, mesmo se não houver saída;
• -q - Especifica uma fila na forma de uma única letra de a a z e de A a Z (por padrão, a
para at e b para batch). Os jobs nas filas com as letras mais altas são executados com
um valor nice maior. Os jobs enviados a uma fila com uma letra maiúscula são tratados
como trabalhos em lote (batch);
• -v - Mostra a hora em que o trabalho será executado antes de ler o trabalho.

Listar jobs programados com atq


Agora vamos agendar mais dois jobs at: o primeiro executa o script teste2.sh às 09:30 e o
segundo executa o script teste.sh após uma hora.

root@debian10:/home/debian# at 09:30 AM
warning: commands will be executed using /bin/sh
at> ./teste2.sh
at> Ctrl+D
job 13 at Sat Sep 14 09:30:00 2021
root@debian10:/home/debian# at now +2 hours
warning: commands will be executed using /bin/sh
at> ./teste.sh
at> Ctrl+D
job 14 at Sat Sep 14 11:10:00 2021

Para listar os jobs pendentes, use o comando atq, que mostra as seguintes informações para
cada job: ID do trabalho, data de execução do trabalho, tempo de execução do trabalho, fila
e nome de usuário.

root@debian10:/home/debian# atq
14 Sat Sep 14 11:10:00 2021 a joatham
13 Sat Sep 14 09:30:00 2021 a joatham
12 Sat Sep 14 09:15:00 2021 a joatham

Lembre-se de que o comando at -l é um alias para atq.

Se você executar atq como root, ele exibirá os trabalhos na fila para todos os usuários.

Excluir jobs com atrm


Se quiser excluir um job at, use o comando atrm seguido do ID do trabalho. Por exemplo,
para excluir o job com ID 14, rodamos o seguinte:
385 34. 107.2 Automatizar tarefas de administração do sistema agendando trabalhos
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# atrm 14

É possível excluir vários trabalhos com atrm especificando diversos IDs separados por espaços.
Lembre-se de que o comando at -d é um alias de atrm.

O usuário que rodar atrm como root pode excluir os jobs de todos os outros usuários.

Configurando o acesso ao agendamento de trabalhos


A autorização para usuários comuns agendarem jobs at é determinada pelos arquivos /etc/at.al-
low e /etc/at.deny. Se /etc/at.allow existir, somente os usuários não-root listados dentro dele
podem agendar jobs at. Se /etc/at.allow não existir, mas /etc/at.deny existir, somente os
usuários não-root listados dentro dele não podem agendar job at (neste caso, um arquivo
/etc/at.deny vazio indica que todos os usuários podem agendar jobs at). Se nenhum desses
arquivos existir, o acesso dos usuários ao agendamento de jobs at depende da distribuição
usada.

Especificações de tempo
Para especificar quando um job at determinado deve ser executado, use o formato HH:MM,
seguido opcionalmente por AM ou PM no caso do formato de 12 horas. Se o momento
especificado já tiver passado, a instrução é aplicada no dia seguinte. Para agendar uma data
em particular para executar o job, é preciso adicionar as informações de data após a hora
usando um dos formatos a seguir: nome-do-mês dia-do-mês, nome-do-mês dia-do-mês ano,
MMDDYY, MM/DD/YY, DD.MM.YY e YYYY-MM-DD).

As palavras-chave a seguir também são aceitas: midnight (meia-noite), noon (meio-dia),


teatime (16h) e now (agora), seguidas por um sinal de mais (+) e um período de tempo
(minutos, horas, dias e semanas). Finalmente, você pode dizer ao at para executar o trabalho
hoje ou amanhã adicionando as palavras today ou tomorrow à hora determinada. Assim,
usaríamos at 07:15 AM Jan 01 para executar um trabalho às 07:15 da manhã de 1ž de janeiro,
e at now +5 minutes para executar um job daqui a cinco minutos. Leia o arquivo timespec na
árvore /usr/share para saber mais sobre a definição exata das especificações de data e hora.

Uma alternativa ao at
Usando o systemd como gerenciador de sistema e serviços, também é possível agendar tare-
fas únicas com o comando systemd-run. Normalmente ele é usado para criar uma unidade
386 34. 107.2 Automatizar tarefas de administração do sistema agendando trabalhos
Fabio Gonçalves De Melo Santana / [email protected]

transiente de temporizador para que um comando seja executado em um momento específico,


sem a necessidade de se criar um arquivo de serviço. Por exemplo, atuando como root, você
pode executar o comando date às 11h30 em 06/10/2021 usando o seguinte:

root@debian10:/home/debian# systemd-run --on-calendar='2021-10-06 11:30' date

Se quiser executar o script teste2.sh, localizado em seu diretório atual, depois de dois minutos,
use:

root@debian10:/home/debian# systemd-run --on-active="2m" ./teste2.sh

CRONTAB

• Fonte: - https://twitter.com/techparida/status/1293072657043173378
Fabio Gonçalves De Melo Santana / [email protected]

35
107.3 Localização e
internacionalização

Introdução
Todas as principais distribuições Linux podem ser configuradas para usar configurações de
localização personalizadas. Essas configurações incluem definições relacionadas à região e
ao idioma, como fuso horário, idioma da interface e codificação de caracteres, e podem ser
modificadas durante a instalação do sistema operacional ou a qualquer momento depois disso.

Os aplicativos contam com variáveis de ambiente, arquivos de configuração do sistema e co-


mandos para decidir o formato de data e hora e o idioma adequados a empregar, assim, a maio-
ria das distribuições Linux compartilha uma maneira padronizada de ajustar as configurações
de data, hora e localização. Esses ajustes são importantes não somente para aprimorar a exper-
iência do usuário, mas também para garantir que o tempo dos eventos do sistema—importante,
por exemplo, para relatar problemas relacionados à segurança—seja calculado corretamente.

Para serem capazes de representar qualquer texto escrito, independentemente da língua falada,
os sistemas operacionais modernos precisam de um padrão de codificação de caracteres de
referência, e os sistemas Linux não fogem à regra. Como os computadores só conseguem lidar
com números, um caractere de texto nada mais é do que um número associado a um símbolo
gráfico. Plataformas de computação distintas podem associar valores numéricos distintos ao
mesmo caractere e, portanto, um padrão comum de codificação de caracteres é necessário
para torná-los compatíveis. Um documento de texto criado em um sistema só será legível

387
388 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]

em outro sistema se ambos concordarem quanto ao formato de codificação e aos números


associados a cada caractere, ou pelo menos se souberem converter entre os dois padrões.

A natureza heterogênea das configurações de localização nos sistemas baseados em Linux re-
sulta em diferenças sutis entre as distribuições. Apesar dessas diferenças, todas as distribuições
compartilham as mesmas ferramentas e conceitos básicos para configurar os aspectos de in-
ternacionalização de um sistema.

Fusos horários
Os fusos horários são faixas distintas da superfície da Terra, aproximadamente proporcionais,
abrangendo o equivalente a uma hora, ou seja, regiões do mundo que experimentam a mesma
hora do dia no mesmo momento. Uma vez que não existe uma única longitude que possa
ser considerada como o início do dia para o mundo inteiro, os fusos horários são relativos
ao meridiano primário, onde o ângulo de longitude da Terra foi definido como 0. O tempo
no primeiro meridiano é chamado de Tempo Universal Coordenado, por convenção abreviado
para UTC. Por razões práticas, os fusos horários não seguem a distância longitudinal exata a
partir do ponto de referência (o meridiano principal). Em vez disso, eles são artificialmente
adaptados de forma a seguir as fronteiras dos países ou outras subdivisões significativas.

As subdivisões políticas são tão relevantes que os fusos horários recebem nomes que home-
nageiam algum agente geográfico importante daquela área específica, geralmente com base
no nome de um grande país ou cidade dentro da zona. No entanto, os fusos horários são
divididos de acordo com seu deslocamento de tempo em relação a UTC; esse deslocamento
também pode ser usado para indicar o fuso em questão. O fuso horário GMT-5, por exemplo,
indica uma região na qual o horário UTC está cinco horas à frente, ou seja, essa região está
5 horas atrás do UTC. Da mesma forma, o fuso horário GMT+3 indica uma região na qual o
horário UTC está três horas atrás. O termo GMT—de Greenwich Mean Time—é usado como
sinônimo de UTC nos nomes de fusos horários que indicam a diferença de hora.

Uma máquina conectada pode ser acessada de diferentes partes do mundo, de forma que é
aconselhável definir o relógio do hardware para UTC (o fuso horário GMT+0) e deixar a escolha
do fuso horário para cada caso particular. Os serviços em nuvem, por exemplo, costumam
ser configurados para usar UTC, o que pode ajudar a mitigar eventuais inconsistências entre
o horário local e o horário dos clientes ou de outros servidores. Por outro lado, os usuários
que abrem uma sessão remota no servidor podem querer usar seu fuso horário local. Assim,
caberá ao sistema operacional configurar o fuso horário correto de acordo com cada caso.

Além da data e hora atuais, o comando date também exibe o fuso horário atualmente con-
figurado:
389 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# date
Mon Oct 21 10:45:21 -03 2019

O deslocamento em relação a UTC é dado pelo valor -03, que indica que a hora exibida é três
horas a menos que UTC. Portanto, o horário UTC está três horas à frente, e assim GMT-3
é o fuso horário correspondente para as configurações de tempo especificadas. O comando
timedatectl, disponível em distribuições que usam o systemd, mostra mais detalhes sobre a
data e hora do sistema:

root@debian10:/home/debian# timedatectl
Local time: Sat 2019-10-19 17:53:18 -03
Universal time: Sat 2019-10-19 20:53:18 UTC
RTC time: Sat 2019-10-19 20:53:18
Time zone: America/Sao_Paulo (-03, -0300)
System clock synchronized: yes
systemd-timesyncd.service active: yes
RTC in local TZ: no

Como vemos na entrada Time zone, nomes de fusos horários baseados em localidades—como
America/Sao_Paulo—também são aceitos. O fuso horário padrão para o sistema é mantido no
arquivo /etc/timezone, seja com o nome descritivo ou com a diferença de hora em relação
a UTC. Os nomes genéricos de fusos horários indicados pela diferença em relação a UTC
devem incluir Etc na primeira parte do nome. Assim, para definir o fuso horário padrão como
GMT+3, o nome do fuso horário deve ser Etc/GMT+3:

root@debian10:/home/debian# cat /etc/timezone


Etc/GMT+3

Embora os nomes de fusos horários com base em localidades não exijam a indicação da
diferença de hora para funcionar, eles não são tão fáceis de escolher. A mesma zona pode ter
mais de um nome, sendo assim mais difícil de lembrar. Para mitigar este problema, o comando
tzselect oferece um método interativo que guia o usuário na definição correta do fuso horário.
O comando tzselect deve estar disponível por padrão em todas as distribuições Linux, já que
é fornecido pelo pacote que contém utilitários necessários relacionados à Biblioteca GNU C.

O comando tzselect será útil, por exemplo, para um usuário que deseja identificar o fuso
horário da “Cidade de São Paulo” no “Brasil”. O tzselect começa perguntando qual a macror-
região do local desejado:
390 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent, ocean, "coord", or "TZ".
1) Africa
2) Americas
3) Antarctica
4) Asia
5) Atlantic Ocean
6) Australia
7) Europe
8) Indian Ocean
9) Pacific Ocean
10) coord - I want to use geographical coordinates.
11) TZ - I want to specify the time zone using the Posix TZ format.
#? 2

A opção 2 refere-se a locais da América do Norte e do Sul, não necessariamente no mesmo


fuso horário. Também é possível especificar o fuso horário com coordenadas geográficas ou
com a notação de deslocamento, também conhecida como formato Posix TZ. A etapa seguinte
é escolher o país:

Please select a country whose clocks agree with yours.


1) Anguilla 19) Dominican Republic 37) Peru
2) Antigua & Barbuda 20) Ecuador 38) Puerto Rico
3) Argentina 21) El Salvador 39) St Barthelemy
4) Aruba 22) French Guiana 40) St Kitts & Nevis
5) Bahamas 23) Greenland 41) St Lucia
6) Barbados 24) Grenada 42) St Maarten (Dutch)
7) Belize 25) Guadeloupe 43) St Martin (French)
8) Bolivia 26) Guatemala 44) St Pierre & Miquelon
9) Brazil 27) Guyana 45) St Vincent
10) Canada 28) Haiti 46) Suriname
11) Caribbean NL 29) Honduras 47) Trinidad & Tobago
12) Cayman Islands 30) Jamaica 48) Turks & Caicos Is
13) Chile 31) Martinique 49) United States
14) Colombia 32) Mexico 50) Uruguay
15) Costa Rica 33) Montserrat 51) Venezuela
16) Cuba 34) Nicaragua 52) Virgin Islands (UK)
17) Curaçao 35) Panama 53) Virgin Islands (US)
18) Dominica 36) Paraguay
#? 9

O território brasileiro abrange quatro fusos horários; portanto, o nome do país por si só não
basta para definir o fuso horário. Na etapa seguinte, o tzselect pede que o usuário especifique
a região local:

Please select one of the following time zone regions.


1) Atlantic islands
2) Pará (east); Amapá
3) Brazil (northeast: MA, PI, CE, RN, PB)
4) Pernambuco
391 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]

5) Tocantins
6) Alagoas, Sergipe
7) Bahia
8) Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS)
9) Mato Grosso do Sul
10) Mato Grosso
11) Pará (west)
12) Rondônia
13) Roraima
14) Amazonas (east)
15) Amazonas (west)
16) Acre
#? 8

Nem todos os nomes de localidade estão presentes, mas escolher a região mais próxima já
basta. As informações fornecidas serão então usadas pelo tzselect para exibir o fuso horário
correspondente:

The following information has been given:

Brazil
Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS)

Therefore TZ='America/Sao_Paulo' will be used.


Selected time is now: sex out 18 18:47:07 -03 2019.
Universal Time is now: sex out 18 21:47:07 UTC 2019.
Is the above information OK?
1) Yes
2) No
#? 1

You can make this change permanent for yourself by appending the line
TZ='America/Sao_Paulo'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
America/Sao_Paulo

O nome do fuso horário resultante, America/Sao_Paulo, também pode ser usado como o
conteúdo de /etc/timezone para informar o fuso horário padrão para o sistema:

root@debian10:/home/debian# cat /etc/timezone


America/Sao_Paulo

Conforme declarado na saída de tzselect, a variável de ambiente TZ define o fuso horário da


sessão do shell, qualquer que seja o fuso horário padrão do sistema. Se adicionarmos a linha
TZ=‘America/Sao_Paulo’; export TZ ao arquivo ~/.profile, America / Sao_Paulo se tornará
392 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]

o fuso horário das sessões futuras do usuário. A variável TZ também pode ser modificada
temporariamente durante a sessão atual, a fim de exibir a hora em um fuso horário diferente:

root@debian10:/home/debian# env TZ='Africa/Cairo' date


Mon Oct 21 15:45:21 EET 2019

No exemplo, o comando env executa o comando fornecido em uma nova sessão de sub-shell
com as mesmas variáveis de ambiente da sessão atual, exceto pela variável TZ, modificada
pelo argumento TZ=‘Africa/Cairo’.

Horário de verão
Muitas regiões adotam o horário de verão, quando os relógios são normalmente adiantados
em uma hora, em parte do ano, o que pode levar um sistema mal configurado a relatar a hora
errada durante aquela estação do ano.

O arquivo /etc/localtime contém os dados usados pelo sistema operacional para ajustar seu
relógio corretamente. Os sistemas Linux padrão têm arquivos para todos os fusos horários
no diretório /usr/share/zoneinfo/, de modo que /etc/localtime é apenas um link simbólico
para o arquivo de dados real dentro desse diretório. Os arquivos em /usr/share/zoneinfo/ são
organizados pelo nome do fuso horário correspondente, então o arquivo de dados para o fuso
horário America/Sao_Paulo será /usr/share/zoneinfo/America/Sao_Paulo.

Como as definições de horário de verão podem mudar, é importante manter em dia os ar-
quivos de /usr/share/zoneinfo/. O comando de atualização da ferramenta de gerenciamento
de pacotes fornecida pela distribuição deve atualizá-los sempre que uma nova versão estiver
disponível.

Idioma e codificação de caracteres


Os sistemas Linux podem funcionar com uma ampla variedade de idiomas e codificações de
caracteres não ocidentais, definições conhecidas como localidades (em inglês, locales). A
configuração de localidade mais básica é a definição da variável de ambiente LANG, a partir
da qual a maioria dos programas do shell identificam o idioma a ser usado.

O conteúdo da variável LANG segue o formato ab_CD, onde ab é o código do idioma e CD é


o código da região. O código do idioma deve seguir o padrão ISO-639 e o código da região,
o padrão ISO-3166. Um sistema configurado para usar o português do Brasil, por exemplo,
deve ter a variável LANG definida como pt_BR.UTF-8:
393 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# echo $LANG


pt_BR.UTF-8

Conforme visto na saída deste exemplo, a variável LANG também contém a codificação de
caracteres destinada ao sistema. O ASCII, abreviação de American Standard Code for Infor-
mation Interchange, foi o primeiro padrão de codificação de caracteres amplamente usado para
comunicação eletrônica. No entanto, como o ASCII tem uma gama muito limitada de valores
numéricos disponíveis e foi baseado no alfabeto inglês, ele não contém caracteres usados por
outros idiomas ou um conjunto extenso de símbolos não-alfabéticos. A codificação UTF-8 é
um Padrão Unicode para os caracteres ocidentais comuns, além de diversos outros símbolos
não convencionais.

As configurações de localidade de todo o sistema são definidas no arquivo /etc/locale.conf. A


variável LANG e outras variáveis relacionadas à localidade são atribuídas neste arquivo como
uma variável de shell comum, por exemplo:

root@debian10:/home/debian# cat /etc/locale.conf


LANG=pt_BR.UTF-8

Os usuários podem empregar uma configuração de localidade personalizada redefinindo a var-


iável de ambiente LANG. Isso pode ser feito apenas para a sessão atual ou para sessões futuras,
adicionando a nova definição ao perfil Bash do usuário em ~/.bash_profile ou ~/.profile. En-
tretanto, até que o usuário efetue login, a localidade padrão do sistema ainda será usada por
programas independentes do usuário, como a tela de login do gerenciador de exibição.

O comando localectl, disponível em sistemas que empregam o systemd como geren-


ciador de sistema, também pode ser usado para consultar e alterar a localidade do
sistema. Por exemplo: localectl set-locale LANG=en_US.UTF-8.

Além da variável LANG, outras variáveis de ambiente afetam aspectos específicos da localidade,
como o símbolo monetário ou o separador de milhar correto para números:

• LC_COLLATE - Define a ordem alfabética. Uma de suas finalidades é definir a ordem


em que os arquivos e diretórios são listados;
• LC_CTYPE - Define como o sistema tratará certos conjuntos de caracteres. Ele define,
por exemplo, quais caracteres considerar como maiúsculas ou minúsculas;
• LC_MESSAGES - Define o idioma para exibir as mensagens de programas (principal-
mente programas do GNU);
394 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]

• LC_MONETARY - Define a unidade monetária e o formato da moeda;


• LC_NUMERIC - Define o formato numérico para valores não-monetários. Sua finali-
dade principal é definir os separadores de milhar e decimais;
• LC_TIME - Define o formato de hora e data;
• LC_PAPER - Define o tamanho padrão do papel;
• LC_ALL - Sobrepõe todas as outras variáveis, incluindo LANG.

O comando locale mostra todas as variáveis definidas na configuração de localidade atual:

root@debian10:/home/debian# locale
LANG=pt_BR.UTF-8
LC_CTYPE="pt_BR.UTF-8"
LC_NUMERIC=pt_BR.UTF-8
LC_TIME=pt_BR.UTF-8
LC_COLLATE="pt_BR.UTF-8"
LC_MONETARY=pt_BR.UTF-8
LC_MESSAGES="pt_BR.UTF-8"
LC_PAPER=pt_BR.UTF-8
LC_NAME=pt_BR.UTF-8
LC_ADDRESS=pt_BR.UTF-8
LC_TELEPHONE=pt_BR.UTF-8
LC_MEASUREMENT=pt_BR.UTF-8
LC_IDENTIFICATION=pt_BR.UTF-8
LC_ALL=

A única variável indefinida é LC_ALL, que pode ser usada para substituir temporariamente
todas as outras configurações locais. O exemplo a seguir mostra como o comando date, sendo
executado em um sistema configurado para a localidade pt_BR.UTF-8, modifica sua saída de
forma a cumprir a nova variável LC_ALL:

root@debian10:/home/debian# date
seg out 21 10:45:21 -03 2019
root@debian10:/home/debian# env LC_ALL=en_US.UTF-8 date
Mon Oct 21 10:45:21 -03 2019

A modificação da variável LC_ALL fez com que ambas as abreviações de dia da semana e
nome do mês fossem mostradas em inglês americano (en_US). Não é obrigatório, entretanto,
definir a mesma localidade para todas as variáveis. É possível, por exemplo, ter a linguagem
definida como pt_BR e o formato numérico (LC_NUMERIC) no padrão americano.

Algumas configurações de localização alteram a forma como os programas lidam com a ordem
alfabética e formatos de numeração. Embora os programas convencionais geralmente sejam
capazes de escolher corretamente uma localidade comum para essas situações, os scripts po-
dem se comportar de forma inesperada ao tentar ordenar corretamente uma lista de itens em
395 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]

ordem alfabética, por exemplo. Por este motivo, recomenda-se definir a variável de ambiente
LANG para a localidade comum C, como em LANG=C, para que o script produza resultados
inequívocos, independentemente das definições de localização usadas no sistema onde é exe-
cutado. A localidade C realiza apenas uma comparação simples de bytes e, portanto, também
terá um desempenho melhor do que as outras.

Conversão de codificação
Um texto pode aparecer com caracteres ilegíveis quando exibido em um sistema com uma
configuração de codificação de caracteres diferente do sistema onde o texto foi criado. O
comando iconv ajuda a resolver este problema, convertendo o arquivo de sua codificação
de caracteres original para a desejada. Por exemplo, para converter um arquivo de nome
original.txt da codificação ISO-8859-1 no arquivo converted.txt utilizando a codificação UTF-
8, o seguinte comando pode ser usado:

root@debian10:/home/debian# iconv -f ISO-8859-1 -t UTF-8 original.txt > converted.txt

A opção -f ISO-8859-1 (ou –from-code=ISO-8859-1) define a codificação do arquivo original,


e a opção -t UTF-8 (ou –to-code=UTF-8) define a codificação do arquivo convertido. Para
listar todas as codificações suportadas pelo comando iconv, usamos o comando iconv -l ou
iconv –list. Ao invés de usar o redirecionamento de saída, como no exemplo, a opção -o
converted.txt ou –output converted.txt também faz o serviço. # 108.1 Controlar a hora do
sistema

Introdução
A prática de controlar a hora pode parecer trivial para o usuário final, mas o sistema precisa
ser capaz de lidar com muitas características e casos extremos de forma inteligente. É preciso
levar em conta o fato de que os fusos horários não são estáticos, mas podem ser alterados
por uma decisão administrativa ou política. Nosso país optou por acabar com o horário de
verão. Felizmente para os administradores de sistema, as soluções para o controle de data e
hora no sistema operacional Linux são maduras, robustas e geralmente funcionam sem muita
interferência.

Quando um computador Linux é inicializado, ele começa a marcar o tempo. Nós nos referimos
a isso como o relógio do sistema, uma vez que é atualizado pelo sistema operacional. Além
disso, os computadores modernos também têm um relógio de hardware ou de tempo real.
Esse relógio de hardware é um recurso da placa-mãe que marca o tempo, esteja o computador
funcionando ou não. Durante a inicialização, a hora do sistema é definida a partir do relógio
396 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]

de hardware, mas na maioria das vezes esses dois relógios funcionam independentemente um
do outro.

Na maioria dos sistemas Linux modernos, a hora do sistema e a hora do hardware são sin-
cronizadas com a hora da rede, implementada pelo Network Time Protocol (NTP). Na grande
maioria dos casos, a única configuração que um usuário normal precisa fazer é definir seu fuso
horário; o NTP cuida do resto.

Hora local e hora universal


O relógio do sistema está configurado para o Tempo Universal Coordenado (UTC), que é a
hora local de Greenwich, Reino Unido. Normalmente, um usuário deseja saber sua hora local.
A hora local é calculada tomando-se a hora UTC e aplicando um deslocamento com base no
fuso horário e no horário de verão. Desta forma, evitam-se muitos cálculos complexos.

O relógio do sistema pode ser definido para a hora UTC ou local, mas é recomendável que
também seja definido para a hora UTC.

Date
date é um utilitário nativo que simplesmente imprime a hora local:

root@debian10:/home/debian# date
Sun Jun 17 12:55:06 EST 2021

Se modificarmos as opções do comando date, mudamos o formato da saída.

Por exemplo, date -u serve para exibir o horário UTC atual.

root@debian10:/home/debian# date -u
Sun Jun 17 18:02:51 UTC 2021

Outras opções comumente usadas retornam a hora local em um formato RFC aceito:

• -I: Data/hora no formato ISO 8601. Anexar =date limita a saída apenas à data. Outros
formatos são hours, minutes, seconds e ns (para nanossegundos);
• -R: Retorna data e hora no formato RFC 5322;
• –rfc-3339: Retorna data e hora no formato RFC 3339.
397 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]

O formato de date pode ser personalizado pelo usuário com as sequências especificadas na
página de manual. Por exemplo, a hora atual pode ser formatada como tempo do Unix da
seguinte maneira:

root@debian10:/home/debian# date +%s


1574014515

Na página de manual de date, podemos ver que %s se refere ao tempo do Unix.

O tempo do Unix é usado internamente na maioria dos sistemas baseados em Unix. Ele
armazena a hora UTC como o número de segundos desde a Época, que foi definida como 1ž
de janeiro de 1970.

Usando essas sequências, podemos formatar a data e a hora em quase todos os formatos
exigidos por qualquer aplicativo. Claro, na maioria dos casos é preferível seguir um padrão
aceito.

Além disso, date –date pode ser usado para formatar um horário que não seja a hora atual.
Neste caso, um usuário pode especificar a data a ser aplicada ao sistema usando o tempo do
Unix, por exemplo:

root@debian10:/home/debian# date --date='@1564013011'


Wed Jul 24 20:03:31 EDT 2021

A opção –debug é muito útil para garantir que uma data possa ser analisada com sucesso.
Observe o que acontece ao passarmos uma data válida para o comando:

root@debian10:/home/debian# date --debug --date="Fri, 03 Jan 2020 14:00:17 -0500"


date: parsed day part: Fri (day ordinal=0 number=5)
date: parsed date part: (Y-M-D) 2020-01-03
date: parsed time part: 14:00:17 UTC-05
date: input timezone: parsed date/time string (-05)
date: using specified time as starting value: '14:00:17'
date: warning: day (Fri) ignored when explicit dates are given
date: starting date/time: '(Y-M-D) 2020-01-03 14:00:17 TZ=-05'
date: '(Y-M-D) 2020-01-03 14:00:17 TZ=-05' = 1578078017 epoch-seconds
date: timezone: system default
date: final: 1578078017.000000000 (epoch-seconds)
date: final: (Y-M-D) 2020-01-03 19:00:17 (UTC)
date: final: (Y-M-D) 2020-01-03 14:00:17 (UTC-05)

Essa é uma ferramenta útil para a resolução de problemas em um aplicativo que gera uma
398 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]

data.

Relógio do hardware
O comando hwclock exibe a hora mantida no relógio de tempo real. Este comando exige
privilégios elevados, portanto, usamos sudo para chamar o comando neste caso:

root@debian10:/home/debian# sudo hwclock


2021-11-20 11:31:29.217627-05:00

A opção –verbose retorna mais resultados, que podem ser úteis para solucionar problemas:

$ sudo hwclock --verbose


hwclock from util-linux 2.34
System Time: 1578079387.976029
Trying to open: /dev/rtc0
Using the rtc interface to the clock.
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
...got clock tick
Time read from Hardware Clock: 2020/01/03 19:23:08
Hw clock time : 2020/01/03 19:23:08 = 1578079388 seconds since 1969
Time since last adjustment is 1578079388 seconds
Calculated Hardware Clock drift is 0.000000 seconds
2020-01-03 14:23:07.948436-05:00

Observe o Calculated Hardware Clock drift. Esta saída informa se a hora do sistema e a hora
do hardware estão divergindo uma da outra.

timedatectl
timedatectl é um comando que pode ser usado para verificar o status geral de hora e data,
incluindo se a hora da rede foi ou não sincronizada (na próxima lição, trataremos do Network
Time Protocol).

Por padrão, timedatectl retorna informações semelhantes a date, mas com a adição da hora
RTC (hardware), bem como o status do serviço NTP:

root@debian10:/home/debian# timedatectl
Local time: Thu 2021-12-05 11:08:05 EST
Universal time: Thu 2021-12-05 16:08:05 UTC
RTC time: Thu 2021-12-05 16:08:05
Time zone: America/Toronto (EST, -0500)
System clock synchronized: yes
399 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]

NTP service: active


RTC in local TZ: no

Configurando a hora com timedatectl


Se o NTP não estiver disponível, recomenda-se usar timedatectl em vez de date ou hwclock
para definir a hora:

root@debian10:/home/debian# timedatectl set-time '2011-11-25 14:00:00'

O processo é semelhante ao de date. O usuário também pode definir a hora independentemente


da data com o formato HH:MM:SS.

Definindo o fuso horário com timedatectl


timedatectl é a melhor maneira de configurar o fuso horário local nos sistemas Linux baseados
em systemd quando não existe GUI. timedatectl lista os fusos horários possíveis e, a partir daí,
o fuso horário pode ser definido usando um deles como argumento.

Primeiro, listamos os fusos horários possíveis:

root@debian10:/home/debian# timedatectl list-timezones


Africa/Abidjan
Africa/Accra
Africa/Algiers
Africa/Bissau
Africa/Cairo
...

A lista de fusos horários possíveis é longa, por isso o uso do comando grep é recomendado
neste caso.

Em seguida, podemos definir o fuso horário usando um dos elementos da lista retornada:

shell root@debian10:/home/debian# timedatectl set-timezone Africa/Cairo root@debian10:/home/debian


# timedatectl Local time: Thu 2021-12-05 18:18:10 EET Universal time: Thu 2021-12-05 16:18:10
UTC RTC time: Thu 2021-12-05 16:18:10 Time zone: Africa/Cairo (EET, +0200)System clock synchronized
: yes NTP service: active RTC in local TZ: no Lembre-se de que o nome do fuso horário deve
ser exato. Africa/Cairo, por exemplo, muda o fuso horário, mas cairo ou africa/cairo não.
400 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]

Desativando o NTP com timedatectl


Em alguns casos, pode ser necessário desativar o NTP. Podemos fazer isso com systemctl,
mas vamos demonstrar o procedimento com timedatectl:

root@debian10:/home/debian# timedatectl set-ntp no


root@debian10:/home/debian# timedatectl
Local time: Thu 2021-12-05 18:19:04 EET Universal time: Thu 2021-12-05
16:19:04 UTC
RTC time: Thu 2021-12-05 16:19:04
Time zone: Africa/Cairo (EET, +0200)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a

Definindo o fuso horário sem timedatectl


A definição do fuso horário é uma etapa padrão ao se instalar o Linux em uma nova máquina.
Se houver um processo de instalação gráfico, isso provavelmente será feito sem nenhuma ação
adicional do usuário.

O diretório /usr/share/zoneinfo contém informações sobre os diferentes fusos horários pos-


síveis. No diretório zoneinfo, há subdiretórios com o nome dos continentes, bem como outros
links simbólicos. Recomenda-se encontrar o zoneinfo da sua região começando por seu conti-
nente.

Os arquivos zoneinfo contêm as regras necessárias para calcular a diferença de horário local
em relação a UTC, e também são importantes se a sua região segue o horário de verão. O
conteúdo de /etc/localtime será lido quando o Linux precisar determinar o fuso horário local.
Para definir o fuso horário sem o uso de uma GUI, o usuário deve criar um link simbólico de
/usr/share/zoneinfo para /etc/localtime informando sua localização. Por exemplo:

root@debian10:/home/debian# ln -s /usr/share/zoneinfo/Canada/Eastern /etc/localtime

Depois de definir o fuso horário correto, recomenda-se executar:

root@debian10:/home/debian# hwclock --systohc

Isso configurará o relógio do hardware a partir do relógio do sistema (ou seja, o relógio em
401 35. 107.3 Localização e internacionalização
Fabio Gonçalves De Melo Santana / [email protected]

tempo real será configurado para a mesma hora que date). Note que este comando é executado
com privilégios de root, neste caso, você está logado como root.

/etc/timezone é semelhante a /etc/localtime. É uma representação de dados do fuso horário


local e, como tal, pode ser lido usando cat:

root@debian10:/home/debian# cat /etc/timezone


America/Toronto

Observe que este arquivo não é usado por todas as distribuições Linux.
Fabio Gonçalves De Melo Santana / [email protected]

36
Configurando data e hora sem
timedatectl
A maioria dos sistemas Linux modernos usa o systemd para sua configuração e serviços,
assim, não é recomendado usar date ou hwclock para definir a hora. O systemd
emprega para isso o timedatectl. No entanto, é importante conhecer esses comandos
legados no caso de você precisar administrar um sistema mais antigo.

Usando date
date tem uma opção para definir a hora do sistema. Use –set ou -s para definir a data e hora.
Também há a opção –debug para verificar a análise correta do comando:

root@debian10:/home/debian# date --set="11 Nov 2011 11:11:11"

Neste caso, é necessário ter privilégios de root para definir a data. Também podemos optar
por alterar a hora ou data independentemente:

root@debian10:/home/debian# date +%Y%m%d -s "20111125"

Aqui, devemos especificar as sequências para que nossa string seja analisada corretamente. Por

402
403 36. Configurando data e hora sem timedatectl
Fabio Gonçalves De Melo Santana / [email protected]

exemplo, %Y refere-se ao ano e, portanto, os primeiros quatro dígitos 2011 serão interpretados
como o ano de 2011. Da mesma forma, %T é a sequência de hora, como demonstrado aqui
ao definirmos a hora:

root@debian10:/home/debian# date +%T -s "13:11:00"

Depois de alterar a hora do sistema, é recomendável também definir o relógio do hardware


para que os relógios do sistema e do hardware estejam sincronizados:

root@debian10:/home/debian# hwclock --systohc

systohc significa “relógio do sistema para relógio do hardware”.

Usando hwclock
Em vez de definir o relógio do sistema e atualizar o relógio do hardware, podemos optar por
reverter o processo. Começaremos ajustando o relógio do hardware:

root@debian10:/home/debian# hwclock --set --date "4/12/2021 11:15:19"


root@debian10:/home/debian# hwclock
Fri 12 Apr 2021 6:15:19 AM EST -0.562862 seconds

Note que, por padrão, hwclock espera a hora UTC, mas retorna a hora local.

Depois de configurar o relógio do hardware, precisamos atualizar o relógio do sistema a partir


dele. hctosys pode ser interpretado como “relógio do hardware para relógio do sistema”.

root@debian10:/home/debian# hwclock --hctosys

Embora os computadores pessoais sejam capazes de manter a hora de maneira razoavelmente


precisa por conta própria, os sistemas de produção e os ambientes de rede exigem um controle
extremamente exato do tempo. A medição de tempo mais precisa é realizada por relógios de
referência, normalmente relógios atômicos. No mundo moderno, todos os sistemas informáti-
cos conectados à Internet podem ser sincronizados com esses relógios de referência usando o
chamado Network Time Protocol (NTP). Um sistema informático com NTP será capaz de
sincronizar os relógios do sistema com a hora fornecida pelos relógios de referência. Se a hora
404 36. Configurando data e hora sem timedatectl
Fabio Gonçalves De Melo Santana / [email protected]

do sistema e a hora medida nesses servidores forem diferentes, o computador aumentará ou


diminuirá a hora do sistema interno gradativamente até que a hora do sistema corresponda à
hora da rede.

O NTP emprega uma estrutura hierárquica para divulgar o tempo. Os relógios de referência
são conectados a servidores no topo da hierarquia. Esses servidores são máquinas Estrato
1 e, normalmente, não são acessíveis ao público. As máquinas Estrato 1 são, entretanto,
acessíveis a máquinas Estrato 2, por sua vez acessíveis a máquinas Estrato 3 e assim por
diante. Os servidores Estrato 2 são acessíveis ao público, assim como qualquer máquina
inferior na hierarquia. Ao configurar o NTP para uma rede grande, é recomendável conectar
um pequeno número de computadores aos servidores Estrato 2+ e, a partir daí, fazer com que
essas máquinas forneçam o NTP a todas as outras máquinas. Desta forma, minimizam-se as
demandas sobre as máquinas Estrato 2.

Alguns termos são importantes ao se falar em NTP. Alguns desses termos aparecem nos
comandos que usamos para rastrear o status do NTP em nossas máquinas:

• Deslocamento (offset): Refere-se à diferença absoluta entre a hora do sistema e a hora


NTP. Por exemplo, se o relógio do sistema marca 12:00:02 e o horário NTP é 11:59:58,
o deslocamento entre os dois relógios é de quatro segundos;
• Salto (step): Se o deslocamento de tempo entre o provedor NTP e um consumidor
for maior que 128ms, o NTP executará uma única alteração significativa na hora do
sistema, em vez de desacelerar ou acelerar o relógio do sistema. Isso é chamado de
stepping;
• Ajuste gradativo (slew): Slew refere-se às alterações feitas na hora do sistema quando
o deslocamento entre a hora do sistema e o NTP é menor que 128ms. Se esse for o
caso, as alterações serão feitas gradualmente. Isso é conhecido como slewing;
• Relógio insano: Se o deslocamento entre a hora do sistema e a hora NTP for maior que
17 minutos, o tempo do sistema é considerado insano e o daemon NTP não introduzirá
nenhuma alteração no relógio do sistema. Será preciso tomar medidas especiais para
trazer a hora do sistema até menos de 17 minutos da hora correta;
• Escorregamento ou deslizamento (drift): O escorregamento se refere ao fenômeno em
que dois relógios ficam fora de sincronia com o tempo. Essencialmente, se dois relógios
são inicialmente sincronizados, mas vão ficando fora de sincronia com o passar do tempo,
está ocorrendo um escorregamento do relógio;
• Variação (jitter): A variação refere-se à quantidade de escorregamento desde a última
vez em que um relógio foi consultado. Portanto, se a última sincronização com o NTP
ocorreu há 17 minutos, e o deslocamento entre o provedor NTP e o consumidor é de 3
milissegundos, então 3 milissegundos é a variação.

Agora vamos discutir algumas das maneiras específicas como o Linux implementa o NTP.
405 36. Configurando data e hora sem timedatectl
Fabio Gonçalves De Melo Santana / [email protected]

timedatectl
Se sua distribuição Linux usa timedatectl, por padrão ela implementa um cliente SNTP ao invés
de uma implementação NTP completa. Esta é uma implementação menos complexa de tempo
de rede e significa que a máquina não servirá NTP para outros computadores conectados.

Neste caso, o SNTP não funcionará a menos que o serviço timesyncd esteja rodando. Como
acontece com todos os serviços systemd, podemos verificar se ele está rodando com:

root@debian10:/home/debian# systemctl status systemd-timesyncd●


systemd-timesyncd.service - Network Time Synchronization
Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset:
enabled)
Drop-In: /lib/systemd/system/systemd-timesyncd.service.d
`-disable-with-time-daemon.conf
Active: active (running) since Thu 2020-01-09 21:01:50 EST; 2 weeks 1 days ago
Docs: man:systemd-timesyncd.service(8)
Main PID: 1032 (systemd-timesyn)
Status: "Synchronized to time server for the first time 91.189.89.198:123 (ntp.ubuntu.
com)."
Tasks: 2 (limit: 4915)
Memory: 3.0M
CGroup: /system.slice/systemd-timesyncd.service
`-1032 /lib/systemd/systemd-timesyncd

Jan 11 13:06:18 NeoMex systemd-timesyncd[1032]: Synchronized to time server for the first
time 91.189.91.157:123 (ntp.ubuntu.com).
...

O status da sincronização SNTP timedatectl pode ser verificado com show-timesync:

root@debian10:/home/debian# timedatectl show-timesync --all


LinkNTPServers=
SystemNTPServers=
FallbackNTPServers=ntp.ubuntu.com
ServerName=ntp.ubuntu.com
ServerAddress=91.189.89.198
RootDistanceMaxUSec=5s
PollIntervalMinUSec=32s
PollIntervalMaxUSec=34min 8s
PollIntervalUSec=34min 8s
NTPMessage={ Leap=0, Version=4, Mode=4, Stratum=2, Precision=-23, RootDelay=8.270ms,
RootDispersion=18.432ms, Reference=91EECB0E, OriginateTimestamp=Sat 2020-01-25
18:35:49 EST, ReceiveTimestamp=Sat 2020-01-25 18:35:49 EST, TransmitTimestamp=Sat
2020-01-25 18:35:49 EST, DestinationTimestamp=Sat 2020-01-25 18:35:49 EST, Ignored=no
PacketCount=263, Jitter=2.751ms }
Frequency=-211336

Essa configuração pode ser adequada para a maioria das situações, porém, conforme já obser-
vamos, ela é insuficiente quando se deseja sincronizar diversos clientes em uma rede. Nesse
406 36. Configurando data e hora sem timedatectl
Fabio Gonçalves De Melo Santana / [email protected]

caso, é recomendável instalar um cliente NTP completo.

Daemon NTP
A hora do sistema é regularmente comparada à hora da rede. Para que isso funcione, é
necessário ter um daemon rodando em segundo plano. Em muitos sistemas Linux, o nome
desse daemon é ntpd. O ntpd permite que uma máquina não seja apenas um consumidor de
tempo (isto é, capaz de sincronizar seu próprio relógio a partir de uma fonte externa), mas
também forneça tempo para outras máquinas.

Vamos supor que nosso computador seja baseado no systemd e use systemctl para controlar
os daemons. Vamos instalar os pacotes ntp usando o gerenciador de pacotes apropriado e, em
seguida, verificar se o daemon ntpd está rodando:

root@debian10:/home/debian# systemctl status ntpd●

ntpd.service - Network Time Service


Loaded: loaded (/usr/lib/systemd/system/ntpd.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2021-12-06 03:27:21 EST; 7h ago
Process: 856 ExecStart=/usr/sbin/ntpd -u ntp:ntp $OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 867 (ntpd)
CGroup: /system.slice/ntpd.service
`-867 /usr/sbin/ntpd -u ntp:ntp -g

Em alguns casos, pode ser necessário iniciar e habilitar o ntpd. Na maioria das máquinas
Linux, isso é feito com:

root@debian10:/home/debian# systemctl enable ntpd && systemctl start ntpd

As consultas NTP acontecem na porta TCP 123. Se o NTP falhar, verifique essa porta está
aberta e escutando.

ntpdate
Durante a configuração inicial, a hora do sistema e o NTP podem ser seriamente dessincroniza-
dos. Se o deslocamento entre o sistema e a hora NTP for maior que 17 minutos, o daemon
NTP não fará alterações na hora do sistema. Neste caso, será necessária uma intervenção
manual.

Primeiramente, se ntpd estiver rodando, será necessário interromper o serviço. Use systemctl
stop ntpd para fazer isso.
407 36. Configurando data e hora sem timedatectl
Fabio Gonçalves De Melo Santana / [email protected]

Em seguida, use ntpdate pool.ntp.org para realizar uma sincronização inicial única, onde
pool.ntp.org se refere ao endereço IP ou URL de um servidor NTP. Pode ser necessária mais
de uma sincronização.

ntpq
ntpq é um utilitário para monitorar o status do NTP. Uma vez que o daemon NTP foi iniciado
e configurado, usamos ntpq para verificar seu status:

root@debian10:/home/debian# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
+37.44.185.42 91.189.94.4 3 u 86 128 377 126.509 -20.398 6.838
+ntp2.0x00.lv 193.204.114.233 2 u 82 128 377 143.885 -8.105 8.478
*inspektor-vlan1 121.131.112.137 2 u 17 128 377 112.878 -23.619 7.959
b1-66er.matrix. 18.26.4.105 2 u 484 128 10 34.907 -0.811 16.123

Neste caso, -p significa imprimir, ou seja, exibir um resumo dos pares. Os endereços de host
também podem ser retornados como endereços IP usando -n.

• remote - nome do host do provedor NTP;


• refid - ID de referência do provedor NTP;
• st - Estrato do provedor;
• when - Número de segundos desde a última consulta;
• poll - Número de segundos entre as consultas;
• reach - ID de status para indicar se um servidor foi alcançado. As conexões bem-
sucedidas aumentam este número em 1;
• delay - Tempo em ms entre a consulta e a resposta do servidor;
• offset - Tempo em ms entre a hora do sistema e a hora NTP;
• jitter - Deslocamento em ms entre a hora do sistema e o NTP na última consulta.

ntpq também inclui um modo interativo, que é acessado quando ele é executado sem opções
ou argumentos. A opção ? retorna uma lista de comandos reconhecidos pelo ntpq.

chrony
chrony é outra forma de implementar o NTP. Ele é instalado por padrão em alguns sistemas
Linux, mas está disponível para download em todas as principais distribuições. chronyd é o
daemon chrony e chronyc é a interface de linha de comando. Pode ser necessário iniciar e
habilitar chronyd antes de interagir com chronyc.

Se a instalação do chrony tiver uma configuração padrão, o uso do comando chronyc tracking
408 36. Configurando data e hora sem timedatectl
Fabio Gonçalves De Melo Santana / [email protected]

fornecerá informações sobre o NTP e a hora do sistema:

root@debian10:/home/debian# chronyc tracking


Reference ID : 3265FB3D (bras-vprn-toroon2638w-lp130-11-50-101-251-61.dsl.)
Stratum : 3
Ref time (UTC) : Thu Jan 09 19:18:35 2020
System time : 0.000134029 seconds fast of NTP time
Last offset : +0.000166506 seconds
RMS offset : 0.000470712 seconds
Frequency : 919.818 ppm slow
Residual freq : +0.078 ppm
Skew : 0.555 ppm
Root delay : 0.006151616 seconds
Root dispersion : 0.010947504 seconds
Update interval : 129.8 seconds
Leap status : Normal

Essa saída contém muitas informações, mais do que as que estão disponíveis em outras im-
plementações:

• Reference ID - O ID de referência e o nome ao qual o computador está sincronizado


no momento;
• Stratum - Número de passos até um computador com um relógio de referência anexado;
• Ref time - Esta é a hora UTC em que a última medição da fonte de referência foi feita;
• System time - Atraso do relógio do sistema do servidor sincronizado;
• Last offset - Deslocamento estimado da última atualização do relógio;
• RMS offset - Média de longo prazo do valor do deslocamento;
• Frequency - Esta é a taxa na qual o relógio do sistema estaria errado se o chronyd não
o estivesse corrigindo. É fornecida em ppm (partes por milhão);
• Residual freq - Frequência residual indicando a diferença entre as medições da fonte
de referência e a frequência atualmente sendo usada;
• Skew - Limite de erro estimado da frequência;
• Root delay - Total de atrasos do caminho de rede até o computador do estrato a partir
do qual o computador está sendo sincronizado;
• Leap status - Este é o status de intercalação, que pode ter um dos seguintes valores:
normal, inserir segundo, excluir segundo ou não sincronizado.

Também podemos ver informações detalhadas sobre a última atualização válida do NTP:

root@debian10:/home/debian# chrony ntpdata


Remote address : 172.105.97.111 (AC69616F)
Remote port : 123
Local address : 192.168.122.81 (C0A87A51)
Leap status : Normal
Version : 4
Mode : Server
409 36. Configurando data e hora sem timedatectl
Fabio Gonçalves De Melo Santana / [email protected]

Stratum : 2
Poll interval : 6 (64 seconds)
Precision : -25 (0.000000030 seconds)
Root delay : 0.000381 seconds
Root dispersion : 0.000092 seconds
Reference ID : 61B7CE58 ()
Reference time : Mon Jan 13 21:50:03 2020
Offset : +0.000491960 seconds
Peer delay : 0.004312567 seconds
Peer dispersion : 0.000000068 seconds
Response time : 0.000037078 seconds
Jitter asymmetry: +0.00
NTP tests : 111 111 1111
Interleaved : No
Authenticated : No
TX timestamping : Daemon
RX timestamping : Kernel
Total TX : 15
Total RX : 15
Total valid RX : 15

Finalmente, chronyc sources retorna informações sobre os servidores NTP usados para sin-
cronizar a hora:

root@debian10:/home/debian# chronyc sources


210 Number of sources = 0
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================

No momento, esta máquina não possui fontes configuradas. Podemos adicionar fontes de
pool.ntp.org abrindo o arquivo de configuração do chrony. Geralmente, ele fica em /etc/chrony.conf.
Quando abrimos este arquivo, podemos ver que alguns servidores estão listados por padrão:

210 Number of sources = 0


MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
# Most computers using chrony will send measurement requests to one or
# more 'NTP servers'. You will probably find that your Internet Service
# Provider or company have one or more NTP servers that you can specify.
# Failing that, there are a lot of public NTP servers. There is a list
# you can access at http://support.ntp.org/bin/view/Servers/WebHome or
# you can use servers from the 3.arch.pool.ntp.org project.

! server 0.arch.pool.ntp.org iburst iburst


! server 1.arch.pool.ntp.org iburst iburst
! server 2.arch.pool.ntp.org iburst iburst

! pool 3.arch.pool.ntp.org iburst


410 36. Configurando data e hora sem timedatectl
Fabio Gonçalves De Melo Santana / [email protected]

Esses servidores também servirão como um guia de sintaxe ao inserir nossos próprios servidores.
No entanto, neste caso, simplesmente removeremos os ! no início de cada linha, fazendo com
que deixem de ser comentários, para usar os servidores padrão do projeto pool.ntp.org.

Além disso, neste arquivo, podemos optar por alterar a configuração padrão em relação ao
skew (diferença entre a frequência real e a ideal) e ao escorregamento, bem como a localização
do driftfile e do keyfile.

Nesta máquina, precisamos fazer uma grande correção inicial do relógio. Optamos por remover
o comentário da seguinte linha:

! makestep 1.0 3

Depois de fazer alterações no arquivo de configuração, reinicie o serviço chronyd e use chronyc
makestep para ajustar manualmente o relógio do sistema:

root@debian10:/home/debian# chronyc makestep


200 OK

E então use chronyc tracking como anteriormente para verificar se as alterações foram real-
izadas.
Fabio Gonçalves De Melo Santana / [email protected]

37
108.2 Registro de eventos do
sistema

Introdução
Sabe quem são os melhores amigos de qualquer administrador de sistemas? Os logs. Logs são
arquivos (geralmente de texto) onde todos os eventos do sistema e da rede são registrados,
em ordem cronológica, a partir do momento em que o sistema é inicializado. Desta forma,
a gama de informações que podem ser encontradas nos logs inclui virtualmente todos os
aspectos do sistema: tentativas de autenticação malsucedidas, erros de programas e serviços,
hosts bloqueados pelo firewall etc. Como você pode imaginar, os logs facilitam muito a vida
dos administradores de sistema quando se trata de resolução de problemas, verificação de
recursos, detecção de comportamento anômalo de programas e assim por diante.

Logs do sistema
No exato momento em que o kernel e os diferentes processos em seu sistema começam a rodar
e a se comunicar uns com os outros, muitas informações são geradas na forma de mensagens
que são, em sua maioria, enviadas para os logs.

Sem eles, os administradores de sistema teriam que descascar uma floresta de abacaxis sempre
que precisassem procurar um evento que aconteceu em um servidor. Os logs são determinantes
e reveladores quando se trata de solucionar problemas e manter a segurança, além de serem

411
412 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]

fontes de dados confiáveis para se compreender as estatísticas do sistema e fazer previsões de


tendências.

Os logs tradicionalmente são tratados por três serviços dedicados principais: syslog, syslog-ng
(syslog nova geração) e rsyslog (“o sistema mais veloz para processamento de log”). O rsyslog
trouxe melhorias importantes (como suporte a RELP) e se tornou a escolha mais popular hoje
em dia. Esses serviços coletam mensagens de outros serviços e programas e as armazenam
em arquivos de log, normalmente em /var/log.

No entanto, alguns serviços cuidam de seus próprios logs (por exemplo, o servidor web Apache
HTTPD ou o sistema de impressão CUPS). Da mesma forma, o kernel do Linux usa um buffer
de anel na memória para armazenar suas mensagens de log.

RELP significa Reliable Event Logging Protocol (Protocolo confiável de registro de


eventos em log) e estende a funcionalidade do protocolo syslog de maneira a assegurar
a entrega de mensagens.

Tipos de log
Como os logs são dados variáveis, costumam ser encontrados em /var/log. A grosso modo,
podem ser classificados em logs do sistema e logs de serviços ou programas.

Vamos conhecer alguns logs do sistema e as informações que eles preservam:

• /var/log/auth.log - Atividades relacionadas aos processos de autenticação: usuários


registrados, informações de sudo, cron jobs, tentativas de login malsucedidas etc.;
• /var/log/syslog - Um arquivo centralizado para praticamente todos os logs capturados
pelo rsyslogd. Por incluir muitas informações, os logs são distribuídos por outros arquivos
de acordo com a configuração fornecida em /etc/rsyslog.conf;
• /var/log/debug - Informações de depuração dos programas;
• /var/log/kern.log - Mensagens do kernel;
• /var/log/messages - Mensagens informativas que não estão relacionadas ao kernel,
mas a outros serviços. É também o destino padrão do log do cliente remoto em uma
implementação de servidor de log centralizado;
• /var/log/daemon.log - Informações relacionadas aos daemons ou serviços em exe-
cução em segundo plano;
• /var/log/mail.log - Informações relacionadas ao servidor de email, por exemplo o
postfix;
• /var/log/Xorg.0.log - Informações relacionadas à placa de vídeo;
• /var/run/utmp e /var/log/wtmp - Logins bem-sucedidos;
413 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]

• /var/log/btmp - Tentativas de login malsucedidas, por exemplo ataques de força bruta


via ssh;
• /var/log/faillog - Tentativas de autenticação malsucedidas;
• /var/log/lastlog - Data e hora dos logins recentes do usuário.

Vejamos agora alguns exemplos de logs de serviço:

• /var/log/cups/ - Diretório para logs do Common Unix Printing System. Geralmente


inclui os seguintes arquivos de log padrão: error_log, page_log e access_log;
• /var/log/apache2/ ou /var/log/httpd - Diretório para logs do Apache Web Server.
Geralmente inclui os seguintes arquivos de log padrão: access.log, error_log e other_vhosts_ac-
cess.log;
• /var/log/mysql - Diretório para logs do MySQL Relational Database Management
System. Geralmente inclui os seguintes arquivos de log padrão: error_log, mysql.log e
mysql-slow.log;
• /var/log/samba/ - Diretório para logs do protocolo Session Message Block (SMB).
Geralmente inclui os seguintes arquivos de log padrão: log., log.nmbd and log.smbd.

O nome e o conteúdo exatos dos arquivos de log podem variar de acordo com as
distribuições Linux. Existem também logs específicos para distribuições específicas
como /var/log/dpkg.log (contendo informações relacionadas aos pacotes dpkg) no
Debian GNU/Linux e seus derivados.

Lendo logs
Para ler os arquivos de log, é preciso ser o usuário root ou ter permissões de leitura para o
arquivo. Podemos usar uma variedade de utilitários, como:

• less ou more - Paginadores que permitem visualizar e rolar uma página por vez:

root@debian:~# less /var/log/auth.log


Sep 12 18:47:56 debian sshd[441]: Received SIGHUP; restarting.
Sep 12 18:47:56 debian sshd[441]: Server listening on 0.0.0.0 port 22.
Sep 12 18:47:56 debian sshd[441]: Server listening on :: port 22.
Sep 12 18:47:56 debian sshd[441]: Received SIGHUP; restarting.
Sep 12 18:47:56 debian sshd[441]: Server listening on 0.0.0.0 port 22.
Sep 12 18:47:56 debian sshd[441]: Server listening on :: port 22.
Sep 12 18:49:46 debian sshd[905]: Accepted password for debian from 192.168.1.65 port 44296
ssh2
Sep 12 18:49:46 debian sshd[905]: pam_unix(sshd:session): session opened for user debian by
(uid=0)
Sep 12 18:49:46 debian systemd-logind[331]: New session 2 of user debian.
Sep 12 18:49:46 debian systemd: pam_unix(systemd-user:session): session opened for user
debian by (uid=0)
(...)
414 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]

• zless ou zmore - O mesmo que less e more, mas usados para logs que foram com-
pactados com o gzip (uma função comum de logrotate):

root@debian:~# zless /var/log/auth.log.3.gz


Aug 19 20:05:57 debian sudo: debian : TTY=pts/0 ; PWD=/home/debian ; USER=root ; COMMAND
=/sbin/shutdown -h now
Aug 19 20:05:57 debian sudo: pam_unix(sudo:session): session opened for user root by debian
(uid=0)
Aug 19 20:05:57 debian lightdm: pam_unix(lightdm-greeter:session): session closed for user
lightdm
Aug 19 23:50:49 debian systemd-logind[333]: Watching system buttons on /dev/input/event2 (
Power Button)
Aug 19 23:50:49 debian systemd-logind[333]: Watching system buttons on /dev/input/event3 (
Sleep Button)
Aug 19 23:50:49 debian systemd-logind[333]: Watching system buttons on /dev/input/event4 (
Video Bus)
Aug 19 23:50:49 debian systemd-logind[333]: New seat seat0.
Aug 19 23:50:49 debian sshd[409]: Server listening on 0.0.0.0 port 22.
(...)

• tail - Visualizar as últimas linhas de um arquivo (por padrão, 10 linhas). O poder


de tail reside—em grande parte—na opção -f, que mostra novas linhas dinamicamente
conforme elas são anexadas:

root@suse-server:~# tail -f /var/log/messages


2019-09-14T13:57:28.962780+02:00 suse-server sudo: pam_unix(sudo:session): session closed
for user root
2019-09-14T13:57:38.038298+02:00 suse-server sudo: debian : TTY=pts/0 ; PWD=/home/debian
; USER=root ; COMMAND=/usr/bin/tail -f /var/log/messages
2019-09-14T13:57:38.039927+02:00 suse-server sudo: pam_unix(sudo:session): session opened
for user root by debian(uid=0)
2019-09-14T14:07:22+02:00 debian debian: appending new message from client to remote server
...

• head - Visualizar as primeiras linhas de um arquivo (por padrão, 10 linhas):

root@suse-server:~# head -5 /var/log/mail


2019-06-29T11:47:59.219806+02:00 suse-server postfix/postfix-script[1732]: the Postfix mail
system is not running
2019-06-29T11:48:01.355361+02:00 suse-server postfix/postfix-script[1925]: starting the
Postfix mail system
2019-06-29T11:48:01.391128+02:00 suse-server postfix/master[1930]: daemon started --
version 3.3.1, configuration /etc/postfix
2019-06-29T11:55:39.247462+02:00 suse-server postfix/postfix-script[3364]: stopping the
Postfix mail system
2019-06-29T11:55:39.249375+02:00 suse-server postfix/master[1930]: terminating on signal 15
415 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]

• grep - Utilitário de filtragem que permite buscar por strings específicas:

root@debian:~# grep "dhclient" /var/log/syslog


Sep 13 11:58:48 debian dhclient[448]: DHCPREQUEST of 192.168.1.4 on enp0s3 to 192.168.1.1
port 67
Sep 13 11:58:49 debian dhclient[448]: DHCPACK of 192.168.1.4 from 192.168.1.1
Sep 13 11:58:49 debian dhclient[448]: bound to 192.168.1.4 -- renewal in 1368 seconds.
(...)

Como você deve ter notado, a saída é impressa no seguinte formato:

• Carimbo de data/hora;
• Nome do host a partir do qual a mensagem se originou;
• Nome do programa/serviço que gerou a mensagem;
• O PID do programa que gerou a mensagem;
• Descrição da ação que ocorreu.

Existem alguns exemplos em que os registros não são em forma de texto, mas arquivos binários
e você deverá usar comandos especiais para analisá-los:

• /var/log/wtmp - Use who (ou w):

root@debian:~# who
root pts/0 2020-09-14 13:05 (192.168.1.75)
root pts/1 2020-09-14 13:43 (192.168.1.75)

• /var/log/btmp - Use utmpdump ou last -f:

root@debian:~# utmpdump /var/log/btmp


Utmp dump of /var/log/btmp
[6] [01287] [ ] [joatham ] [ssh:notty ] [192.168.1.75 ] [192.168.1.75 ]
[2019-09-07T19:33:32,000000+0000]

• /var/log/faillog - Use faillog:

root@debian:~# faillog -a | less


Login Failures Maximum Latest On
416 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]

root 0 0 01/01/70 01:00:00 +0100


daemon 0 0 01/01/70 01:00:00 +0100
bin 0 0 01/01/70 01:00:00 +0100
sys 0 0 01/01/70 01:00:00 +0100
sync 0 0 01/01/70 01:00:00 +0100
games 0 0 01/01/70 01:00:00 +0100
man 0 0 01/01/70 01:00:00 +0100
lp 0 0 01/01/70 01:00:00 +0100
mail 0 0 01/01/70 01:00:00 +0100
(...)

• /var/log/lastlog - Use lastlog:

root@debian:~# lastlog | less


Username Port From Latest
root Never logged in
daemon Never logged in
bin Never logged in
sys Never logged in
(...)
sync Never logged in
avahi Never logged in
colord Never logged in
saned Never logged in
hplip Never logged in
debian pts/1 192.168.1.75 Sat Sep 14 13:43:06 +0200 2019
joatham pts/3 192.168.1.75 Mon Sep 2 14:22:08 +0200 2019

Também existem ferramentas gráficas para ler arquivos de log, como gnome-logs e
KSystemLog.

Como as mensagens são transformadas em logs


O processo a seguir ilustra como uma mensagem é gravada em um arquivo de log:

1. Aplicativos, serviços e o kernel gravam mensagens em arquivos especiais (sockets e


buffers de memória), por exemplo, /dev/log ou /dev/kmsg;
2. O rsyslogd obtém as informações dos sockets ou buffers de memória;
3. Dependendo das regras encontradas em /etc/rsyslog.conf e/ou dos arquivos em /etc/rys-
log.d/, o rsyslogd move as informações para o arquivo de log correspondente (normal-
mente encontrado em /var/log).
417 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]

Recursos, prioridades e ações


O arquivo de configuração de rsyslog é /etc/rsylog.conf (em algumas distribuições, também
podemos encontrar arquivos de configuração em /etc/rsyslog.d/). Ele normalmente é dividido
em três seções: MODULES, GLOBAL DIRECTIVES e RULES. Vamos dar uma olhada neles
explorando o arquivo rsyslog.conf em nosso host GNU/Linux 10 (buster) host—para isso,
usamos sudo less /etc/rsyslog.conf.

• MODULES - inclui suporte modular para registro de eventos, capacidade de mensagem


e recepção de log UDP/TCP:

#################
#### MODULES ####
#################

module(load="imuxsock") # provides support for local system logging


module(load="imklog") # provides kernel logging support
#module(load="immark") # provides --MARK-- message capability

# provides UDP syslog reception


#module(load="imudp")
#input(type="imudp" port="514")

# provides TCP syslog reception


#module(load="imtcp")
#input(type="imtcp" port="514")

• GLOBAL DIRECTIVES - permite configurar uma série de coisas, como logs e per-
missões de diretório de log:

###########################
#### GLOBAL DIRECTIVES ####
###########################

#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

#
# Set the default permissions for all log files.
#
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022

#
# Where to place spool and state files
#
418 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]

$WorkDirectory /var/spool/rsyslog

#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf

• RULES - é onde entram os recursos, prioridades e ações. As configurações desta seção


dizem ao daemon de log para filtrar mensagens de acordo com certas regras e registrá-las
no log ou enviá-las quando necessário. Para entender essas regras, devemos primeiro
explicar os conceitos de recursos e prioridades do rsyslog. Cada mensagem de log recebe
um número de recurso (facility) e uma palavra-chave, ambos associados ao subsistema
interno do Linux que produz a mensagem:

Número Palavra-chave Descrição


0 kern Mensagens do kernel do Linux
1 user Mensagens no nível do usuário
2 mail Sistema de email
3 daemon Daemons do sistema
4 auth, authpriv Mensagens de segurança/autorização
5 syslog Mensagens do syslogd
6 lpr Subsistema de impressora de linha
7 news Subsistema de notícias da rede
8 uucp Subsistema UUCP (Unix-to-Unix Copy Protocol)
9 cron Daemon do relógio
10 auth, authpriv Mensagens de segurança/autorização
11 ftp Daemon FTP (File Transfer Protocol)
12 ntp Daemon NTP (Network Time Protocol)
13 security Auditoria do log
14 console Alerta do log
15 cron Daemon do relógio
16 - 23 local0 até local7 Uso local 0 - 7
——– ———————– ———————————————–

Além disso, cada mensagem recebe um nível de prioridade:

Código Gravidade Palavra-chave Descrição


0 Emergência emerg, panic O sistema está inutilizável
1 Alerta alert É necessário agir imediatamente
2 Crítico crit Condições críticas
419 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]

Código Gravidade Palavra-chave Descrição


3 Erro err, error Condições de erro
4 Aviso warn, warning Condições de aviso
5 Atenção notice Condição normal, mas com alguma importância
6 Informativo info Mensagens informativas
7 Debug debug Mensagens de nível de depuração

Eis um trecho do rsyslog.conf de nosso sistema Debian GNU/Linux 10 (buster) que inclui
alguns exemplos de regras:

###############
#### RULES ####
###############

# First some standard log files. Log by facility.


#
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
#cron.* /var/log/cron.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log

#
# Logging for the mail system. Split it up so that
# it is easy to write scripts to parse these files.
#
mail.info -/var/log/mail.info
mail.warn -/var/log/mail.warn
mail.err /var/log/mail.err

#
# Some "catch-all" log files.
#
*.=debug;\
auth,authpriv.none;\
news.none;mail.none -/var/log/debug
*.=info;*.=notice;*.=warn;\
auth,authpriv.none;\
cron,daemon.none;\
mail,news.none -/var/log/messages

O formato das regras é o seguinte: facility.priority action

O seletor facility.priority filtra as mensagens correspondentes. Os níveis de prioridade são


hierarquicamente inclusivos, o que significa que o rsyslog vai procurar mensagens com a pri-
oridade especificada e superiores. O action mostra qual ação tomar (para onde enviar a
420 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]

mensagem de log). Aqui estão alguns exemplos para maior clareza:

auth,authpriv.* /var/log/auth.log

Independentemente de sua prioridade (*), todas as mensagens dos recursos auth ou authpriv
serão enviadas para /var/log/auth.log.

*.*;auth,authpriv.none -/var/log/syslog

Todas as mensagens serão gravadas em /var/log/syslog (o sinal de menos (-) antes do caminho
evita gravações em disco excessivas). Note o ponto e vírgula (;) para dividir o seletor e a vírgula
(,) para concatenar dois recursos na mesma regra (auth,authpriv).

mail.err /var/log/mail.err

As mensagens do recurso mail com um nível de prioridade de error ou superior (critical, alert
ou emergency) serão enviadas para /var/log/mail.err.

* .=debug;\
auth,authpriv.none;\
news.none;mail.none -/var/log/debug

As mensagens de todos os recursos com a prioridade debug e nenhuma outra (=) serão
gravadas em /var/log/debug—excluindo-se todas as mensagens que venham dos recursos
auth, authpriv, news e mail (note a sintaxe: ;\).

O mecanismo de rotação do log


Os logs são rotacionados regularmente, o que serve a dois propósitos principais:

• Evitar que arquivos de log antigos usem mais espaço em disco do que o necessário;
• Manter os registros em um tamanho gerenciável para facilitar a consulta.

O utilitário responsável pela rotação de log é logrotate. Dentre suas responsabilidades estão
ações como mover arquivos de log para um novo nome, arquivá-los e/ou compactá-los, às vezes
enviando-os por email para o administrador do sistema e, eventualmente, excluí-los quando
421 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]

ficam obsoletos. Existem diversas convenções para nomear esses arquivos de log rotacionados
(por exemplo, adicionar um sufixo com a data ao nome do arquivo), no entanto, a prática
mais comum é simplesmente adicionar um sufixo com um número inteiro:

root@debian:~# ls /var/log/messages*
/var/log/messages /var/log/messages.1 /var/log/messages.2.gz /var/log/messages.3.gz /
var/log/messages.4.gz

Vamos agora explicar o que acontecerá na próxima rotação do log:

1. messages.4.gz será excluído e perdido;


2. O conteúdo de messages.3.gz será movido para messages.4.gz;
3. O conteúdo de messages.2.gz será movido para messages.3.gz;
4. O conteúdo de messages.1 será movido para messages.2.gz;
5. O conteúdo de messages será movido para messages.1 e messages estará vazio e pronto
para registrar novas entradas de log.

Observe como os três arquivos de log mais antigos são compactados, mas os dois mais recentes
não. Além disso, preservamos os registros das últimas 4-5 semanas. Para ler mensagens com
1 semana de idade, consultamos messages.1 (e assim por diante).

O logrotate é executado diariamente como um processo automatizado ou cron job por meio do
script /etc/cron.daily/logrotate. Ele consulta o arquivo de configuração /etc/logrotate.conf.
Este arquivo inclui algumas opções globais e é bem comentado; cada opção é apresentada por
uma breve explicação de sua finalidade:

debian@debian:~$ sudo less /etc/logrotate.conf


# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs


rotate 4

# create new (empty) log files after rotating old ones


create

# uncomment this if you want your log files compressed


#compress

# packages drop log rotation information into this directory


include /etc/logrotate.d

(...)
422 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]

Como vemos, os arquivos de configuração em /etc/logrotate.d para pacotes específicos tam-


bém estão incluídos. Esses arquivos contêm definições locais e especificam os arquivos de
log a serem rotacionados (lembre-se, as definições locais têm precedência sobre as globais e
as definições mais novas substituem as mais antigas). O que se segue é um trecho de uma
definição em /etc/logrotate.d/rsyslog:

/var/log/messages
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
invoke-rc.d rsyslog rotate > /dev/null
endscript
}

Como vemos, cada diretriz é separada de seu valor por um espaço em branco e/ou um sinal de
igual opcional (=). As linhas entre postrotate e endscript, porém, devem aparecer em linhas
próprias. A explicação é a seguinte:

• rotate 4 - Preserva 4 semanas de logs;


• weekly - Rotaciona arquivos de log semanalmente;
• missingok - Não emite uma mensagem de erro se o arquivo de log estiver ausente;
simplesmente passa para o seguinte;
• notifempty - Não rotaciona o log se estiver vazio;
• compress - Compacta arquivos de log com o gzip (padrão);
• delaycompress - Adia a compactação do arquivo de log anterior para o próximo ciclo de
rotação (válido apenas quando usado em combinação com compress). Útil quando um
programa não pode ser instruído a fechar seu arquivo de log e, portanto, pode continuar
gravando no arquivo de log anterior por algum tempo;
• sharedscripts - Relacionado aos scripts prerotate e postrotate. Para evitar que um
script seja executado várias vezes, esse comando executa os scripts apenas uma vez,
independentemente de quantos arquivos de log correspondem a um determinado padrão
(por exemplo, /var/log/mail/*). Porém, os scripts não serão executados se nenhum dos
logs no padrão requerer a rotação. Além disso, se os scripts forem encerrados com erros,
as ações restantes não serão executadas em nenhum log;
• postrotate - Indica o início de um script postrotate;
• invoke-rc.d rsyslog rotate > /dev/null - Usa /bin/sh para executar invoke-rc.d
rsyslog rotate > /dev/null depois de rotacionar os logs;
• endscript - indica o fim do script postrotate.
423 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]

Para uma lista completa de diretrizes e explicações, consulte a página de manual de


logrotate.conf.

O diário do sistema: systemd-journald


systemd-journald é o serviço do sistema que se encarrega de receber as informações de log de
uma variedade de fontes: mensagens do kernel, mensagens do sistema simples e estruturadas,
saída padrão e erro padrão dos serviços, bem como registros de auditoria do subsistema de
auditoria do kernel (para saber mais, consulte a página de manual de systemd-journald). Sua
missão é criar e manter um diário estruturado e indexado.

Seu arquivo de configuração é /etc/systemd/journald.conf e, como no caso de qualquer outro


serviço, usamos o comando systemctl para iniciá-lo, reiniciá-lo, interrompê-lo ou, simplesmente
conferir seu status:

root@debian:~# systemctl status systemd-journald


systemd-journald.service - Journal Service
Loaded: loaded (/lib/systemd/system/systemd-journald.service; static; vendor preset:
enabled)
Active: active (running) since Sat 2019-10-12 13:43:06 CEST; 5min ago
Docs: man:systemd-journald.service(8)
man:journald.conf(5)
Main PID: 178 (systemd-journal)
Status: "Processing requests..."
Tasks: 1 (limit: 4915)
CGroup: /system.slice/systemd-journald.service
`-178 /lib/systemd/systemd-journald
(...)

Quando habilitado, o diário pode ser armazenado persistentemente no disco ou de maneira


volátil em um sistema de arquivos baseado na RAM. O diário não é um arquivo de texto
simples, mas sim binário. Portanto, não é possível usar ferramentas de análise de texto, como
less ou more, para ler seu conteúdo; o comando journalctl é usado em seu lugar.

Consultando o conteúdo do diário


journalctl é o utilitário usado para consultar o diário do systemd. É preciso ser root ou usar sudo
para invocá-lo. Se consultado sem opções, ele imprimirá todo o diário em ordem cronológica
(com as entradas mais antigas listadas primeiro):

root@debian:~# journalctl
-- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:19:46 CEST. --
Oct 12 13:43:06 debian kernel: Linux version 4.9.0-9-amd64 ([email protected])
424 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]

(...)
Oct 12 13:43:06 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=
UUID=b6be6117-5226-4a8a-bade-2db35ccf4cf4 ro qu
(...)

Para fazer consultas mais específicas, há uma série de opções:

• -r - As mensagens do diário serão exibidas em ordem inversa:

root@debian:~# journalctl -r
-- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:30:30 CEST. --
Oct 12 14:30:30 debian sudo[1356]: pam_unix(sudo:session): session opened for user root by
debian(uid=0)
Oct 12 14:30:30 debian sudo[1356]: debian : TTY=pts/0 ; PWD=/home/debian ; USER=root ;
COMMAND=/bin/journalctl -r
Oct 12 14:19:53 debian sudo[1348]: pam_unix(sudo:session): session closed for user root
(...)

• -f - Imprime as mensagens mais recentes do diário e continua a imprimir as novas


mensagens conforme são anexadas ao diário—semelhante a tail -f:

root@debian:~# journalctl -f
-- Logs begin at Sat 2019-10-12 13:43:06 CEST. --
(...)
Oct 12 14:44:42 debian sudo[1356]: pam_unix(sudo:session): session closed for user root
Oct 12 14:44:44 debian sudo[1375]: debian : TTY=pts/0 ; PWD=/home/debian ; USER=root ;
COMMAND=/bin/journalctl -f
Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by
debian(uid=0)

(...)

• -e - Salta para o final do diário, deixando as entradas mais recentes visíveis no paginador:

root@debian:~# journalctl -e
(...)
Oct 12 14:44:44 debian sudo[1375]: debian : TTY=pts/0 ; PWD=/home/debian ; USER=root ;
COMMAND=/bin/journalctl -f
Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by
debian(uid=0)
Oct 12 14:45:57 debian sudo[1375]: pam_unix(sudo:session): session closed for user root
Oct 12 14:48:39 debian sudo[1378]: debian : TTY=pts/0 ; PWD=/home/debian ; USER=root ;
COMMAND=/bin/journalctl -e
Oct 12 14:48:39 debian sudo[1378]: pam_unix(sudo:session): session opened for user root by
debian(uid=0)
425 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]

• -n value, –lines=value - Imprime as linhas mais recentes de value (se não for especi-
ficado um, o padrão é 10):

root@debian:~# journalctl -n 5
(...)
Oct 12 14:44:44 debian sudo[1375]: debian : TTY=pts/0 ; PWD=/home/debian ; USER=root ;
COMMAND=/bin/journalctl -f
Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by
debian(uid=0)
Oct 12 14:45:57 debian sudo[1375]: pam_unix(sudo:session): session closed for user root
Oct 12 14:48:39 debian sudo[1378]: debian : TTY=pts/0 ; PWD=/home/debian ; USER=root ;
COMMAND=/bin/journalctl -e
Oct 12 14:48:39 debian sudo[1378]: pam_unix(sudo:session): session opened for user root by
debian(uid=0)

• -k, –dmesg - Equivale a usar o comando dmesg:

root@debian:~# journalctl -k
-- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:53:20 CEST. --
Oct 12 13:43:06 debian kernel: Linux version 4.9.0-9-amd64 ([email protected])
(gcc version 6.3.0 20170516 (Debian 6.3.0-18
Oct 12 13:43:06 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=
UUID=b6be6117-5226-4a8a-bade-2db35ccf4cf4 ro qu
Oct 12 13:43:06 debian kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point
registers'
Oct 12 13:43:06 debian kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
(...)

Navegando e pesquisando no diário

Para navegar pela saída do diário, usamos:

Teclas PageUp, PageDown e as setinhas para nos mover para cima, para baixo, a direita e a
esquerda.

• para ir ao final da saída;

• < para ir ao início da saída.

Você pode pesquisar strings para a frente e para trás a partir de sua posição atual:

• Busca para a frente: Pressione / e insira a string a pesquisar, depois dê Enter;


• Busca para trás: Pressione ? e insira a string a pesquisar, depois dê Enter.

Para navegar pelas correspondências nas pesquisas, use N para ir para a próxima ocorrência e
Shift+N para ir para a anterior.
426 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]

Filtrando os dados do diário


O diário permite filtrar os dados de log segundo diferentes critérios:

1. Número de inicialização:

• –list-boots - Lista todas as inicializações disponíveis. A saída consiste em três colunas;


a primeira especifica o número do boot (0 refere-se ao boot atual, -1 ao anterior, -2
ao anterior ao anterior e assim por diante); a segunda coluna é o ID de inicialização; a
terceira mostra as marcas temporais (timestamps):

root@debian:~# journalctl --list-boots


0 83df3e8653474ea5aed19b41cdb45b78 Sat 2019-10-12 18:55:41 —CESTSat 2019-10-12 19:02:24
CEST

• -b, –boot - Mostra todas as mensagens da inicialização atual. Para ver as mensagens
de log das inicializações anteriores, basta adicionar um parâmetro de deslocamento
conforme explicado acima. Por exemplo, para imprimir as mensagens da inicialização
anterior, digitamos journalctl -b -1. Lembre-se, porém, de que para recuperar infor-
mações de logs anteriores, a persistência do diário deve ser habilitada (você aprenderá
como fazer isso na próxima seção):

root@debian:~# journalctl -b -1
Specifying boot ID has no effect, no persistent journal was found

2. Prioridade:

• -p - Curiosamente, também podemos filtrar por gravidade/prioridade com a opção -p:

root@debian:~# journalctl -b -0 -p err


-- No entries --

O diário nos informa de que não houve nenhuma mensagem com prioridade de error (ou supe-
rior) da inicialização atual. Nota: -b -0 pode ser omitido quando nos referimos à inicialização
atual.
427 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]

3. Intervalo de tempo:

• Podemos fazer com que o journalctl imprima apenas as mensagens registradas em um


período de tempo específico usando as opções –since e –until. A especificação da
data deve seguir o formato AAAA-MM-DD HH:MM:SS. A meia-noite será usada se
omitirmos o componente de hora. Da mesma forma, se a data for omitida, o dia atual
será pressuposto. Por exemplo, para ver as mensagens registradas das 19h às 19h01,
digitamos:

root@debian:~# journalctl --since "19:00:00" --until "19:01:00"


-- Logs begin at Sat 2019-10-12 18:55:41 CEST, end at Sat 2019-10-12 20:10:50 CEST. --
Oct 12 19:00:14 debian systemd[1]: Started Run anacron jobs.
Oct 12 19:00:14 debian anacron[1057]: Anacron 2.3 started on 2019-10-12
Oct 12 19:00:14 debian anacron[1057]: Normal exit (0 jobs run)
Oct 12 19:00:14 debian systemd[1]: anacron.timer: Adding 2min 47.988096s random time.

Da mesma maneira, podemos usar uma especificação de tempo ligeiramente diferente: “inte-
ger time-unit ago”. Assim, para ver mensagens registradas há dois minutos, digitamos sudo
journalctl –since “2 minutes ago”. Também é possível usar + e - para especificar momentos
relativos à hora atual. Assim, –since “-2 minutes” e –since “2 minutes ago” são equivalentes.

Além das expressões numéricas, podemos especificar uma série de palavras-chave:

• yesterday - A partir de meia-noite do dia anterior ao dia atual;


• today - A partir de meia-noite do dia atual;
• tomorrow - A partir de meia-noite do dia seguinte ao dia atual;
• now - A hora atual.

Vamos ver todas as mensagens desde a meia-noite passada até hoje às 21:00:

root@debian:~# journalctl --since "today" --until "21:00:00"


-- Logs begin at Sat 2019-10-12 20:45:29 CEST, end at Sat 2019-10-12 21:06:15 CEST. --
Oct 12 20:45:29 debian sudo[1416]: debian : TTY=pts/0 ; PWD=/home/debian ; USER=root ;
COMMAND=/bin/systemctl r
Oct 12 20:45:29 debian sudo[1416]: pam_unix(sudo:session): session opened for user root by
debian(uid=0)
Oct 12 20:45:29 debian systemd[1]: Stopped Flush Journal to Persistent Storage.
(...)
428 37. 108.2 Registro de eventos do sistema
Fabio Gonçalves De Melo Santana / [email protected]

Talvez isso possa te ajudar. . .

-
Fonte: https://www.linuxjournal.com/article/5476

Fig. 37.1: SYSLOG

• Fonte: https://cheatography.com/airlove/cheat-sheets/journalctl/
Fabio Gonçalves De Melo Santana / [email protected]

38
108.3 Noções básicas do Mail
Transfer Agent MTA

Introdução
Nos sistemas operacionais do tipo Unix, como o Linux, cada usuário tem sua própria caixa
de entrada: um local especial no sistema de arquivos, inacessível a outros usuários não-root,
para armazenar as mensagens de email pessoais do usuário. Novas mensagens são adicionadas
à caixa de entrada do usuário pelo Mail Transfer Agent (MTA). O MTA é um programa
executado como um serviço do sistema que coleta mensagens enviadas por outras contas
locais, bem como mensagens recebidas da rede, enviadas por contas de usuários remotos.

O mesmo MTA é responsável pelo envio de mensagens para a rede, caso o endereço de destino
se refira a uma conta remota. Ele faz isso usando um local do sistema de arquivos como uma
caixa de saída de email para todos os usuários do sistema: assim que um usuário coloca uma
nova mensagem na caixa de saída, o MTA identifica o nó da rede de destino a partir do nome
de domínio fornecido pelo endereço de email do destino—a parte após o sinal @—e então tenta
transferir a mensagem para o MTA remoto usando o Simple Mail Transfer Protocol (SMTP).
O SMTP foi projetado pensando em redes não confiáveis, portanto, ele tenta estabelecer rotas
de entrega alternativas caso o nó de destino principal do email esteja inacessível.

429
430 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]

MTA local e remoto


As contas de usuário tradicionais das máquinas conectadas em rede constituem o cenário
mais simples de troca de emails, em que cada nó da rede executa seu próprio daemon MTA.
Nenhum outro software além do MTA é necessário para enviar e receber mensagens de email.
Na prática, porém, é mais comum usar uma conta de email remota e não ter um serviço MTA
local ativo (ou seja, usar um aplicativo cliente de email para acessar a conta remota).

Ao contrário das contas locais, uma conta de email remota—também chamada de caixa de
correio remota—requer autenticação do usuário para conceder acesso à caixa de correio do
usuário e ao MTA remoto (neste caso, simplesmente chamado de servidor SMTP). Ao passo
que o usuário que interage com uma caixa de entrada local e o MTA já está identificado pelo
sistema, um sistema remoto precisa verificar a identidade do usuário antes de manipular suas
mensagens por meio de IMAP ou POP3.

Quando um daemon MTA está sendo executado no sistema local, os usuários locais podem
enviar um email para outros usuários locais ou usuários em uma máquina remota, desde que
seu sistema também tenha um serviço MTA que aceite conexões de rede. A porta TCP 25
é a porta padrão para a comunicação SMTP, mas outras portas também podem ser usadas,
dependendo do esquema de autenticação e/ou criptografia empregado (se houver).

Deixando de lado as topologias que envolvem o acesso a caixas de correio remotas, uma rede
de troca de emails entre contas de usuários Linux comuns pode ser implementada, desde que
todos os nós da rede tenham um MTA ativo capaz de realizar as seguintes tarefas:

• Manter a fila de saída das mensagens a serem enviadas. Para cada mensagem na fila, o
MTA local avaliará o MTA de destino a partir do endereço do destinatário;
• Comunicar-se com daemons MTA remotos usando SMTP. O MTA local deve ser capaz
de usar o protocolo SMTP sobre a pilha TCP/IP para receber, enviar e redirecionar
mensagens de/para outros daemons MTA remotos;
• Manter uma caixa de entrada individual para cada conta local. O MTA geralmente
armazena as mensagens no formato mbox: um único arquivo de texto contendo todas
as mensagens de email em sequência.

Normalmente, os endereços de email especificam um nome de domínio como o local, por


exemplo 4linux.com em [email protected]. Quando for esse o caso, o MTA do remetente
consultará o serviço de DNS em busca do registro MX correspondente. O registro DNS MX
contém o endereço IP do MTA que gerencia o email para esse domínio. Se o mesmo domínio
tiver mais de um registro MX especificado no DNS, o MTA tentará contatá-los de acordo com
seus valores de prioridade. Se o endereço do destinatário não especificar um nome de domínio
ou se o domínio não tiver um registro MX, a parte após o símbolo @ será tratada como o host
do MTA de destino.
431 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]

É preciso pensar na segurança se os hosts MTA forem ficar visíveis para os hosts na internet.
Por exemplo, um usuário desconhecido poderia usar o MTA local para se passar por outro
usuário e enviar emails potencialmente perigosos. Um MTA que retransmite cegamente um
email é conhecido como open relay, quando pode ser usado como intermediário para poten-
cialmente disfarçar o verdadeiro remetente da mensagem. Para evitar esses usos indevidos,
recomenda-se aceitar conexões somente de domínios autorizados e implementar um esquema
de autenticação seguro.

Além disso, existem muitas implementações de MTA diferentes para Linux, cada qual enfo-
cando aspectos específicos como compatibilidade, desempenho, segurança etc. No entanto,
todos os MTAs seguem os mesmos princípios básicos e fornecem recursos semelhantes.

MTAs do Linux
O MTA tradicionalmente disponível para os sistemas Linux é o Sendmail, um MTA de uso
geral bastante flexível adotado por muitos sistemas operacionais do tipo Unix. Outros MTAs
comuns são o Postfix, o qmail e o Exim. O principal motivo para escolher um MTA alternativo
é implementar recursos avançados com mais facilidade, pois, configurar servidores de email
personalizados no Sendmail pode ser uma tarefa complicada. Além disso, cada distribuição
pode ter seu MTA preferido, com ajustes predefinidos apropriados à maioria das configurações
comuns. Todos os MTAs pretendem ser substitutos diretos do Sendmail e, portanto, todos
os aplicativos compatíveis com o Sendmail costumam funcionar, independentemente do MTA
que está sendo usado.

Se o MTA estiver em execução, mas não aceitar conexões de rede, ele só poderá entregar
mensagens de email na máquina local. Para o MTA sendmail, o arquivo /etc/mail/sendmail.mc
deve ser modificado para aceitar conexões não locais. Para isso, a entrada

DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

deve ser modificada com o endereço de rede correto e o serviço precisa ser reiniciado. Algumas
distribuições Linux, como o Debian, podem oferecer ferramentas de configuração para ajudar
a guarnecer o servidor de email com um conjunto predefinido de recursos comumente usados.

Uma vez que o MTA está em execução e aceitando conexões da rede, as novas mensagens
de email são passadas para ele com comandos SMTP enviados por meio de uma conexão
TCP. O comando nc—um utilitário de rede que lê e grava dados genéricos na rede—pode ser
usado para enviar comandos SMTP diretamente para o MTA. Se o comando nc não estiver
disponível, ele será instalado com o pacote ncat ou nmap-ncat, dependendo do sistema de
gerenciamento de pacotes em uso. Escrever comandos SMTP diretamente no MTA é útil para
432 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]

entender melhor o protocolo e outros conceitos gerais sobre o email, bem como para ajudar a
diagnosticar problemas no processo de entrega de mensagens.

Se, por exemplo, a usuária thallyne no host lab1.4linux.com.br deseja enviar uma mensagem
ao usuário joatham no host lab2.4linux.com.br, ela pode usar o comando nc para conectar-se
diretamente ao MTA lab2.4linux.com.br, supondo que ele esteja escutando na porta TCP 25:

root@debian10:/home/debian# nc lab2.4linux.com.br 25
220 lab2.4linux.com.br ESMTP Sendmail 8.15.2/8.15.2; Sat, 16 Jun 2019 00:16:07 GMT
HELO lab1.4linux.com.br
250 lab2.4linux.com.br Hello lab1.4linux.com.br [10.0.3.134], pleased to meet you
MAIL FROM: [email protected]
250 2.1.0 [email protected]... Sender ok
RCPT TO: [email protected]
250 2.1.5 [email protected]... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Subject: Recipient MTA Test

Opa joatham, Tudo legal por ai??


.
250 2.0.0 xAG0G7Y0000595 Message accepted for delivery
QUIT
221 2.0.0 lab2.4linux.com.br closing connection

Assim que a conexão é estabelecida, o MTA remoto se identifica e está pronto para receber
comandos SMTP. O primeiro comando SMTP no exemplo, HELO lab1.4linux.com.br, indica
lab1.4linux.com.br como o iniciador da troca. Os dois comandos seguintes, MAIL FROM:
[email protected] e RCPT TO: [email protected], indicam o remetente
e o destinatário. A mensagem de email em si começa após o comando DATA e termina com
um ponto sozinho em uma linha. Para adicionar um campo subject (assunto) ao email, ele
deve estar na primeira linha após o comando DATA, como mostrado no exemplo. Quando
o campo de assunto é usado, deve haver uma linha em branco separando-o do conteúdo do
email. O comando QUIT termina a conexão com o MTA no host lab2.4linux.com.br.

No host lab2.4linux.com.br, o usuário joatham receberá uma mensagem semelhante a You


have new mail in /var/spool/mail/joatham assim que entrar em uma sessão do shell. Este
arquivo conterá a mensagem de email bruta enviada por thallyne, bem como os cabeçalhos
adicionados pelo MTA:

$ cat /var/spool/mail/joatham
From [email protected] Sat Jun 16 00:19:13 2019
Return-Path: <[email protected]>
Received: from lab1.4linux.com.br (lab1.4linux.com.br [10.0.3.134])
by lab2.4linux.com.br (8.15.2/8.15.2) with SMTP id xAG0G7Y0000595
for [email protected]; Sat, 16 Jun 2019 00:17:06 GMT
Date: Sat, 16 Jun 2019 00:16:07 GMT
433 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]

From: [email protected]
Message-Id: <[email protected]>
Subject: Recipient MTA Test

Hi joatham, this is a test for your MTA.

O cabeçalho Received: mostra que a mensagem de lab1.4linux.com.br foi recebida diretamente


por lab2.4linux.com.br. Por padrão, os MTAs só aceitam mensagens para destinatários locais.
O seguinte erro provavelmente ocorrerá se o usuário thallyne tentar enviar um email para o
usuário 4linux no host lab3.4linux.com.br usando o MTA lab2.4linux.com.br em vez do MTA
correto lab3.4linux.com.br:

$ nc lab2.4linux.com.br 25
220 lab2.4linux.com.br ESMTP Sendmail 8.15.2/8.15.2; Sat, 16 Jun 2019 00:31:44 GMT
HELO lab1.4linux.com.br
250 lab2.4linux.com.br Hello lab1.4linux.com.br [10.0.3.134], pleased to meet you
MAIL FROM: [email protected]
250 2.1.0 [email protected]... Sender ok
RCPT TO: [email protected]
550 5.7.1 [email protected]... Relaying denied

Os números de resposta do SMTP que começam com 5, como na mensagem Relaying denied
(retransmissão negada), indicam um erro. Existem situações legítimas em que a retransmissão
é desejável, como quando os hosts que enviam e recebem emails não estão conectados o
tempo todo: um MTA intermediário pode ser configurado para aceitar emails destinados a
outros hosts, agindo como um servidor SMTP retransmissor (ou relay) capaz de encaminhar
mensagens entre MTAs.

A possibilidade de rotear o tráfego de email por meio de servidores SMTP intermediários deses-
timula a tentativa de conexão direta ao host indicado pelo endereço de email do destinatário,
como mostrado nos exemplos anteriores. Além disso, os endereços de email geralmente têm
um nome de domínio como local (após o @), de forma que o nome real do host MTA corre-
spondente deve ser recuperado através do DNS. Portanto, é recomendável delegar a tarefa de
identificar o host de destino apropriado ao MTA local ou ao servidor SMTP remoto quando
usamos caixas de correio remotas.

O Sendmail fornece o comando sendmail para realizar uma série de operações relacionadas
a email, incluindo auxiliar na composição de novas mensagens. Ele também requer que o
usuário digite os cabeçalhos do email manualmente, mas de uma forma mais amigável do
que usar comandos SMTP diretamente. Assim, um método mais adequado para o usuário
[email protected] enviar uma mensagem de email para [email protected]
seria:
434 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# sendmail [email protected]


From: [email protected]
To: [email protected]
Subject: Sender MTA Test

E ai joatham, to so testando seu MTA.


.

Aqui, novamente, o ponto sozinho em uma linha finaliza a mensagem. A mensagem deve
ser enviada imediatamente ao destinatário, a menos que o MTA local não tenha conseguido
contatar o MTA remoto. O comando mailq, se executado pelo root, mostra todas as men-
sagens não entregues. Se, por exemplo, o MTA em lab2.4linux.com.br não respondeu, então
o comando mailq listará a mensagem não entregue e a causa da falha:

root@debian10:/home/debian# mailq
/var/spool/mqueue (1 request)
-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------
xAIK3D9S000453 36 Mon Jun 18 20:03 <[email protected]>
(Deferred: Connection refused by lab2.4linux.com.br.)
<[email protected]>
Total requests: 1

O local padrão da fila da caixa de saída é /var/spool/mqueue/, mas diferentes MTAs podem
usar locais diversos no diretório /var/spool/. O Postfix, por exemplo, cria uma árvore de
diretórios sob /var/spool/postfix/ para gerenciar a fila. O comando mailq equivale a send-
mail -bp, e eles devem estar presentes qualquer que seja o MTA instalado no sistema. Para
garantir a compatibilidade reversa, a maioria dos MTAs inclui esses comandos tradicionais de
administração de email.

Se o principal host de destino do email—quando fornecido a partir de um registro MX DNS


para o domínio—estiver inacessível, o MTA tentará entrar em contato com as entradas com
prioridade mais baixa (se houver alguma especificada). Se nenhuma delas estiver acessível, a
mensagem ficará na fila da caixa de saída local para ser enviada posteriormente. Se configurado
para isso, o MTA pode verificar periodicamente a disponibilidade dos hosts remotos e realizar
uma nova tentativa de entrega. Se estiver usando um MTA compatível com o Sendmail, uma
nova tentativa ocorrerá imediatamente com o comando sendmail -q.

O Sendmail armazena as mensagens recebidas em um arquivo com o nome do proprietário


da caixa de entrada correspondente, por exemplo, /var/spool/mail/joatham. Outros MTAs,
como o Postfix, podem armazenar as mensagens de email recebidas em locais como /var/-
mail/joatham, mas o conteúdo do arquivo é o mesmo. No exemplo, o comando sendmail foi
usado no host do remetente para compor a mensagem, de modo que os cabeçalhos brutos da
435 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]

mensagem mostram que o email atravessou etapas extras antes de chegar ao destino final:

root@debian10:/home/debian#cat /var/spool/mail/joatham
From [email protected] Mon Jun 18 20:07:39 2019
Return-Path: <[email protected]>
Received: from lab1.4linux.com.br (lab1.4linux.com.br [10.0.3.134])
by lab2.4linux.com.br (8.15.2/8.15.2) with ESMTPS id xAIK7clC000432
(version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT)
for <[email protected]>; Mon, 18 Jun 2019 20:07:38 GMT
Received: from lab1.4linux.com.br (localhost [127.0.0.1])
by lab1.4linux.com.br (8.15.2/8.15.2) with ESMTPS id xAIK3D9S000453
(version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT)
for <[email protected]>; Mon, 18 Jun 2019 20:03:13 GMT
Received: (from thallyne@localhost)
by lab1.4linux.com.br (8.15.2/8.15.2/Submit) id xAIK0doL000449
for [email protected]; Mon, 18 Jun 2019 20:00:39 GMT
Date: Mon, 18 Jun 2019 20:00:39 GMT
Message-Id: <[email protected]>
From: [email protected]
To: [email protected]
Subject: Sender MTA Test

E ai joatham, to so testando seu MTA.

De baixo para cima, as linhas que começam com Received: mostram a rota seguida pela men-
sagem. A mensagem foi enviada pela usuária thallyne com o comando sendmail [email protected]
emitido em lab1.4linux.com.br, conforme declarado pelo primeiro cabeçalho Received:. Em
seguida, ainda em lab1.4linux.com.br, o MTA usa ESMTPS—um superconjunto do SMTP, que
adiciona extensões de criptografia—para enviar a mensagem para o MTA em lab2.4linux.com.br,
conforme especificado pelo último (topo) cabeçalho Received:.

O MTA conclui seu trabalho depois que a mensagem é salva na caixa de entrada do usuário. É
comum realizar algum tipo de filtragem de email, como bloqueadores de spam ou a aplicação
de regras de filtragem definidas pelo usuário. Essas tarefas são executadas por aplicativos
de terceiros, trabalhando em conjunto com o MTA. O MTA poderia, por exemplo, chamar o
utilitário SpamAssassin para marcar mensagens suspeitas usando seus recursos de análise de
texto.

Embora possível, não é conveniente ler diretamente o arquivo da caixa de correio. Recomenda-
se usar um programa cliente de email (por exemplo, Thunderbird, Evolution ou KMail), que
analisará o arquivo e gerenciará as mensagens apropriadamente. Esses programas também
oferecem recursos extras, como atalhos para ações comuns, subdiretórios de caixa de entrada
etc.
436 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]

O comando mail e Mail User Agents (MUA)


É possível escrever uma mensagem de email diretamente em seu formato bruto, mas é muito
mais prático usar um aplicativo cliente, também conhecido como MUA (Mail User Agent ou
agente do usuário de email), para agilizar o processo e evitar erros. O MUA cuida do trabalho
de bastidores, ou seja, o cliente de email apresenta e organiza as mensagens recebidas e faz a
comunicação adequada com o MTA após o usuário redigir um email.

Existem muitos tipos distintos de Mail User Agents. Aplicativos de desktop como o Mozilla
Thunderbird e o Evolution, do Gnome, oferecem suporte a contas de email locais e remotas.
Mesmo as interfaces Webmail podem ser vistas como um tipo de MUA, pois intermediam a
interação entre o usuário e o MTA subjacente. No entanto, os clientes de email não estão
restritos às interfaces gráficas; os clientes de email de console são amplamente usados para
acessar caixas de correio não integradas a uma interface gráfica, e para automatizar tarefas
relacionadas a email em scripts do shell.

Originalmente, o comando mail do Unix destinava-se apenas a compartilhar mensagens entre


usuários do sistema local (o primeiro comando mail data da primeira edição do Unix, lançada
em 1971). Quando as trocas de emails em rede se tornaram mais expressivas, outros programas
foram criados para lidar com o novo sistema de entrega e gradualmente substituíram o antigo
programa mail.

Hoje em dia, o comando mail mais comumente usado é fornecido pelo pacote mailx, compatível
com todos os recursos de email modernos. Na maioria das distribuições Linux, o comando mail
é apenas um link simbólico para o comando mailx. Outras implementações, como o pacote
GNU Mailutils, basicamente fornecem os mesmos recursos do mailx. Existem, no entanto,
pequenas diferenças entre eles, especialmente com relação às opções de linha de comando.

Independentemente de sua implementação, todas as variações modernas do comando mail


operam em dois modos: modo normal e modo de envio. Se um endereço de email for fornecido
como argumento para o comando mail, ele entrará no modo de envio, caso contrário, entrará
no modo normal (leitura). No modo normal, as mensagens recebidas são listadas com um
índice numérico para cada uma, para que o usuário possa consultá-las individualmente ao
digitar comandos no prompt interativo. O comando print 1 pode ser usado para exibir o
conteúdo da mensagem número 1, por exemplo. Comandos interativos podem ser abreviados,
de forma que comandos como print, delete ou reply podem ser substituídos por p, d ou
r, respectivamente. O comando mail sempre considerará a última mensagem recebida ou
visualizada quando o número do índice da mensagem for omitido. O comando quit ou q serve
para sair do programa.

O modo de envio (send mode) é especialmente útil para enviar mensagens de email automa-
tizadas. Ele pode ser usado, por exemplo, para enviar um email ao administrador do sistema
437 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]

se um script de manutenção programado falhar em realizar sua tarefa. No modo de envio, o


mail usa o conteúdo da entrada padrão como corpo da mensagem:

root@debian10:/home/debian# mail -s "Falha na manutencao" [email protected] <<<"


este script falhou em `date`"

Neste exemplo, a opção -s foi adicionada para incluir um campo de assunto na mensagem. O
corpo da mensagem foi fornecido pelo redirecionamento Hereline para a entrada padrão, mas
o conteúdo de um arquivo ou a saída de um comando também pode ser canalizado com um
pipe para o stdin do programa. Se nenhum conteúdo for fornecido por um redirecionamento
para a entrada padrão, o programa aguardará que o usuário entre no corpo da mensagem.
Nesse caso, a combinação de teclas Ctrl+D encerra a mensagem. O comando mail é concluído
imediatamente após a mensagem ser adicionada à fila da caixa de saída.

Entrega personalizada
Por padrão, as contas de email em um sistema Linux são associadas às contas de sis-
tema padrão. Por exemplo, se a usuária thallyne tem o nome de login thallyne no host
lab2.4linux.com.br, seu endereço de email será [email protected]. Esta associação
direta entre contas de sistema e caixas de correio pode ser estendida por métodos padrão
fornecidos pela maioria das distribuições Linux, em particular o mecanismo de roteamento de
email fornecido pelo arquivo /etc/aliases.

Um alias de email é um destinatário de email “virtual” cujas mensagens recebidas são redire-
cionadas para caixas de correio locais existentes, ou para outros tipos de destino de armazena-
mento ou processamento de mensagens. Os aliases são úteis, por exemplo, para colocar as
mensagens enviadas para [email protected] na caixa de correio de thallyne, que
é uma caixa de correio local comum do sistema lab2.4linux.com.br. Para isso, a linha post-
master: thallyne deve ser adicionada ao arquivo /etc/aliases em lab2.4linux.com.br. Após
modificar o arquivo /etc/aliases, o comando newaliases deve ser executado para atualizar os
bancos de dados de aliases do MTA e efetivar as alterações. Os comandos sendmail -bi ou
sendmail -I também servem para atualizar o banco de dados de aliases.

Os aliases são definidos em linhas, no formato <alias>: <destination>. Além das caixas de
correio locais comuns, indicadas pelo nome de usuário correspondente, outros tipos de destino
estão disponíveis:

• Um caminho completo (começando com /) para um arquivo. As mensagens enviadas


para o alias correspondente serão anexadas ao arquivo;
• Um comando para processar a mensagem. deve começar com um caractere de pipe e, se
438 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]

o comando contiver caracteres especiais (como espaços em brancos), ele deve ser posto
entre aspas duplas. Por exemplo, o alias subscribe: |subscribe.sh em lab2.4linux.com.br
encaminha todas as mensagens enviadas para [email protected] para a en-
trada padrão do comando subscribe.sh. Se sendmail estiver rodando no modo restrito
do shell, os comandos permitidos, ou os links para eles, deverão estar em /etc/smrsh/;
• Um arquivo de inclusão. Um único alias pode ter diversos destinos (separados por vír-
gulas) e, portanto, pode ser mais prático mantê-los em um arquivo externo. A palavra-
chave :include: deve indicar o caminho do arquivo, como em :include:/var/local/desti-
nations;
• Um endereço externo. Os aliases também podem encaminhar mensagens para endereços
de email externos;
• Outro alias.

Um usuário local sem privilégios pode definir aliases para seu próprio email editando o arquivo
.forward em seu diretório inicial. Como os aliases podem afetar apenas sua própria caixa
de correio, somente a parte é necessária. Para encaminhar todos os emails recebidos para
um endereço externo, por exemplo, o usuário joatham em lab2.4linux.com.br poderia criar o
seguinte arquivo ~/.forward:

root@debian10:/home/debian# cat ~/.forward


[email protected]

Ele encaminhará todas as mensagens de email enviadas para [email protected] para


[email protected]. Como no caso do arquivo /etc/aliases, outras regras de redire-
cionamento podem ser adicionadas a .forward, uma por linha. Entretanto, o arquivo .forward
deve ser gravável apenas por seu dono e não é necessário executar o comando newaliases
após modificá-lo. Os arquivos que começam com um ponto não aparecem nas listagens de
arquivos regulares, fazendo com que o usuário desconheça alguns dos aliases ativos. Portanto,
é importante verificar se o arquivo existe ao diagnosticar problemas de entrega de email.
439 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]

- Fonte: - https://commons.wikimedia.org/wiki/File:MTA-MDA-MUA_relationship.svg

- Fonte: - https://www.lusoaloja.pt/blog/pop3-imap-e-smtp-qual-a-diferenca/
440 38. 108.3 Noções básicas do Mail Transfer Agent MTA
Fabio Gonçalves De Melo Santana / [email protected]

- Fonte: - https://www.bitbaru.com/site/voc-sabe-o-que-smtp-pop-e-imap/
Fabio Gonçalves De Melo Santana / [email protected]

39
108.4 Gerenciamento de
impressoras e impressão

Introdução
Você ainda acha que usar papel e necessário? De qualquer forma é importante para um usuário
saber como imprimir a partir de um sistema, assim como um administrador precisa saber como
manter a capacidade de um computador de trabalhar com impressoras.

No Linux, assim como em muitos outros sistemas operacionais, a pilha de software Common
Unix Printing System (CUPS) permite a impressão e o gerenciamento de impressoras a partir
de um computador. Aqui está um esboço muito simplificado de como um arquivo é impresso
no Linux usando CUPS:

1. Um usuário envia um arquivo para impressão;


2. O daemon do CUPS, cupsd, então põe no spool (fila de espera) o trabalho de impressão.
Ele recebe um número de trabalho do CUPS, junto com informações sobre a fila de
impressão que contém o trabalho, bem como o nome do documento a ser impresso;
3. O CUPS utiliza filtros que são instalados no sistema para gerar um arquivo formatado
que a impressora pode usar;
4. O CUPS então envia o arquivo reformatado à impressora para impressão.

441
442 39. 108.4 Gerenciamento de impressoras e impressão
Fabio Gonçalves De Melo Santana / [email protected]

O serviço CUPS
A maioria das instalações do Linux em máquinas pessoais já vem com os pacotes do CUPS
instalados. Em instalações mínimas do Linux, os pacotes do CUPS podem não estar presentes,
dependendo da distribuição. Uma instalação básica do CUPS pode ser realizada em um sistema
Debian com o seguinte:

root@debian10:/home/debian# sudo apt install cups

Em sistemas Fedora, o processo de instalação é igualmente fácil. É necessário iniciar o serviço


CUPS manualmente após a instalação no Fedora e outras distribuições baseadas no Red Hat:

$ sudo dnf install cups


...
$ sudo systemctl start cups.service

Após a conclusão da instalação, você pode verificar se o serviço CUPS está sendo executado
com o uso do comando systemctl:

root@debian10:/home/debian# systemctl status cups.service●


cups.service - CUPS Scheduler
Loaded: loaded (/lib/systemd/system/cups.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-06-25 14:35:47 EDT; 41min ago
Docs: man:cupsd(8)
Main PID: 3136 (cupsd)
Tasks: 2 (limit: 1119)
Memory: 3.2M
CGroup: /system.slice/cups.service
|--3136 /usr/sbin/cupsd -l
`-3175 /usr/lib/cups/notifier/dbus dbus://

Como acontece com muitos outros daemons do Linux, o CUPS depende de um conjunto de
arquivos de configuração para suas operações. Na lista abaixo estão os que são de maior
interesse para o administrador do sistema:

• /etc/cups/cupsd.conf - Este arquivo contém as configurações do próprio serviço


CUPS. Se você estiver familiarizado com o arquivo de configuração do servidor web
Apache, o arquivo de configuração do CUPS não lhe será estranho, pois ele usa uma
sintaxe muito semelhante. O arquivo cupsd.conf contém configurações para coisas como
controlar o acesso às diversas filas de impressão em uso no sistema, se a interface web do
CUPS está habilitada ou não, bem como o nível de registro no log usado pelo daemon;
443 39. 108.4 Gerenciamento de impressoras e impressão
Fabio Gonçalves De Melo Santana / [email protected]

• /etc/printcap - Este é o arquivo antigo que foi usado pelo protocolo LPD (Line Printer
Daemon) antes do advento do CUPS. O CUPS continua a criar este arquivo para garantir
a compatibilidade com versões anteriores e muitas vezes ele é um link simbólico para
/run/cups/printcap. Cada linha deste arquivo contém uma impressora à qual o sistema
tem acesso;
• /etc/cups/printers.conf - Este arquivo contém as impressoras configuradas para serem
usadas pelo sistema CUPS. Neste arquivo, cada impressora e sua fila de impressão as-
sociada estão contidas em uma estrofe. Este arquivo fornece as listagens individuais
de impressoras encontradas em /etc/printcap. Nenhuma modificação deve ser feita no
arquivo /etc/cups/printers.conf na linha de comando enquanto o serviço CUPS estiver
em execução;
• /etc/cups/ppd/ - Este não é um arquivo de configuração, mas um diretório que
contém os arquivos PostScript Printer Description (PPD) para as impressoras que os
utilizam. A capacidade operacional de cada impressora será armazenada em um arquivo
PPD (terminando com a extensão .ppd). Esses são arquivos de texto simples e seguem
um formato específico.

O serviço CUPS também utiliza o log da mesma maneira que o serviço Apache 2. Os logs
são armazenados em /var/log/cups/ e contêm um access_log, um page_log e um error_log.
O access_log mantém um registro de acesso à interface web do CUPS, bem como as ações
realizadas dentro dela, como o gerenciamento da impressora. O page_log rastreia os trabalhos
de impressão que foram submetidos às filas de impressão gerenciadas pela instalação do CUPS.
O error_log contém as mensagens sobre trabalhos de impressão que falharam e outros erros
registrados pela interface web.

A seguir, veremos as ferramentas e utilitários usados para gerenciar o serviço do CUPS.

Usando a interface web


Como já dissemos, o arquivo de configuração /etc/cups/cupsd.conf determina se a interface
web do sistema CUPS está habilitada. A configuração é semelhante a esta:

# Web interface setting...


WebInterface Yes

Se a interface web estiver habilitada, o CUPS pode ser gerenciado a partir de um navegador
na URL padrão http://localhost:631. Por padrão, um usuário do sistema pode visualizar as
impressoras e filas de impressão, mas qualquer modificação da configuração requer que um
usuário com acesso root se autentique no serviço web. A estrofe de configuração no arquivo
/etc/cups/cupsd.conf para restringir o acesso aos recursos administrativos será semelhante a
444 39. 108.4 Gerenciamento de impressoras e impressão
Fabio Gonçalves De Melo Santana / [email protected]

seguinte:

# All administration operations require an administrator to authenticate...


<Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class
CUPS-Set-Default>
AuthType Default
Require user @SYSTEM
Order deny,allow
</Limit>

Vamos olhar opções mais de perto:

• AuthType Default - usa um prompt de autenticação básico quando uma ação requer
acesso de root;
• Require user @SYSTEM - indica que é necessário um usuário com privilégios ad-
ministrativos para a operação. Pode ser alterado para @groupname, onde membros de
groupname podem administrar o serviço do CUPS, ou ainda, usuários individuais podem
ser listados, como em Require user carol, tim;
• Order deny,allow - funciona de forma semelhante à opção de configuração do Apache
2, onde a ação é negada por padrão a menos que um usuário (ou membro de um grupo)
seja autenticado.

A interface web do CUPS pode ser desabilitada primeiro interrompendo o serviço do CUPS,
alterando a opção WebInterface de Yes para No e, finalmente, reiniciando o serviço do CUPS.

A interface web do CUPS é construída como um site básico, com guias de navegação para as
diversas seções do sistema CUPS. Estas são as guias incluídas na interface:

• Home -A página inicial lista a versão atual do CUPS que está instalada. Ela também
divide o CUPS em seções como:
• CUPS for Users - Fornece uma descrição do CUPS, opções de linha de comando para
trabalhar com impressoras e filas de impressão e um link para o fórum de usuários do
CUPS;
• CUPS for Administrators - Fornece links na interface para instalar e gerenciar impres-
soras e links para informações sobre como trabalhar com impressoras em uma rede;
• CUPS for Developers - Fornece links para o desenvolvimento do próprio CUPS, bem
como para a criação de arquivos PPD para impressoras.
• Administration - A página de administração também é dividida em seções:
• Printers - Aqui, um administrador pode adicionar novas impressoras ao sistema, localizar
as impressoras conectadas ao sistema e gerenciar as impressoras que já estão instaladas;
• Classes - As classes são um mecanismo no qual impressoras podem ser adicionadas a
grupos com políticas específicas. Por exemplo, uma classe pode conter um grupo de
445 39. 108.4 Gerenciamento de impressoras e impressão
Fabio Gonçalves De Melo Santana / [email protected]

impressoras pertencentes a um andar específico de um prédio, na qual apenas os usuários


de um determinado departamento podem imprimir. Outra classe pode ter limitações
sobre quantas páginas um usuário pode imprimir. As classes não são criadas por padrão
na instalação do CUPS e devem ser definidas por um administrador. Esta é a seção da
interface web do CUPS na qual novas classes podem ser criadas e gerenciadas;
• Jobs - Aqui é onde um administrador pode visualizar todos os trabalhos de impressão
que estão atualmente na fila para todas as impressoras gerenciadas por esta instalação
do CUPS;
• Server - Aqui é onde um administrador pode fazer alterações no arquivo /etc/cup-
s/cupsd.conf. Além disso, outras opções de configuração estão disponíveis por meio de
caixas de seleção, como permitir que impressoras conectadas a esta instalação do CUPS
sejam compartilhadas em uma rede, autenticação avançada e permitir a administração
remota de impressoras.
• Classes - Se houver classes de impressoras configuradas no sistema, elas serão listadas
nesta página. Cada classe de impressora tem opções para gerenciar todas as impressoras
da classe de uma vez, bem como visualizar todos os trabalhos que estão na fila para as
impressoras daquela classe;
• Help - Esta guia fornece links para toda a documentação disponível do CUPS instalado
no sistema;
• Jobs - A guia Jobs permite a pesquisa por trabalhos de impressão individuais, bem como
a listagem de todos os trabalhos de impressão atuais gerenciados pelo servidor;
• Printers - A guia Printers lista todas as impressoras atualmente gerenciadas pelo sis-
tema, além de dar uma visão geral rápida do status de cada impressora. É possível
clicar em cada impressora listada para ir à página na qual aquela impressora pode ser
gerenciada mais detalhadamente. As informações sobre as impressoras neste guia vêm
do arquivo /etc/cups/printers.conf.

Instalando uma impressora


Adicionar uma impressora ao sistema é um processo simples na interface web do CUPS:

1. Clique na guia Administration e depois no botão Add Printer;


2. A página seguinte tem uma série de opções dependendo de como a sua impressora estiver
conectada ao sistema. Se for uma impressora local, selecione a opção mais relevante,
como a porta à qual a impressora está conectada ou o software de impressão de terceiros
que estiver instalado. O CUPS também tenta detectar impressoras conectadas à rede
e as exibe aqui. Também é possível escolher uma opção de conexão direta a uma
impressora de rede, dependendo dos protocolos de impressão em rede suportados pela
impressora. Selecione a opção apropriada e clique no botão Continue;
3. A página seguinte permite atribuir um nome, descrição e local (como “escritório” ou
“recepção”) para a impressora. Se quiser compartilhar esta impressora pela rede, marque
446 39. 108.4 Gerenciamento de impressoras e impressão
Fabio Gonçalves De Melo Santana / [email protected]

a caixa de seleção dessa opção nesta página. Depois de inserir as configurações, clique
no botão Continue;
4. A página seguinte é onde a marca e o modelo da impressora podem ser selecionados.
Essa informação permite que o CUPS pesquise em seu banco de dados local pelos drivers
e arquivos PPD mais adequados para usar com a impressora. Se você tiver um arquivo
PPD fornecido pelo fabricante da impressora, navegue até o local em que ele está e
selecione-o. Depois disso, clique no botão Add Printer;
5. A última página é onde são definidas as opções padrão, como o tamanho da página
usada pela impressora e a resolução dos caracteres impressos. Clique no botão Set
Default Options e a impressora estará instalada no sistema.

Talvez isso possa te ajudar. . .

Fig. 39.1: CUPS

• Fonte: https://news.softpedia.com/news/CUPS-Common-UNIX-Printing-System-2-0-
2-Now-Available-for-Download-472671.shtml # 109.1 Fundamentos dos protocolos de
internet
Fabio Gonçalves De Melo Santana / [email protected]

40
Introdução

O TCP/IP (Transmission Control Protocol/Internet Protocol, ou Protocolo de controle de


transmissão/Protocolo de internet) é uma pilha de protocolos usados para permitir a comu-
nicação entre computadores. Apesar do nome, a pilha é composta por diversos protocolos,
como IP, TCP, UDP, ICMP, DNS, SMTP, ARP e outros.

IP (Internet Protocol)
O IP é o protocolo responsável pelo endereçamento lógico de um host, permitindo que o
pacote seja enviado de um host para outro. Para isso, cada dispositivo da rede recebe um
endereço IP exclusivo. É possível atribuir mais de um endereço ao mesmo dispositivo.

Na versão 4 do protocolo IP, normalmente denominado IPv4, o endereço é formado por


um conjunto de 32 bits separados em 4 grupos de 8 bits, representados na forma decimal,
denominados “dotted quad” (quadra pontilhada). Por exemplo:

• Formato binário (4 grupos de 8 bits) - 11000000.10101000.00001010.00010100


• Formato decimal - 192.168.10.20

No IPv4, os valores de cada octeto podem variar de 0 a 255, que é o equivalente a 11111111
em formato binário.

447
448 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Classes de endereço
Teoricamente, os endereços IP são separados em classes, definidas pelo intervalo do primeiro
octeto, conforme mostrado na tabela abaixo:

Classe Primeiro octeto Intervalo Exemplo


A 1-126 1.0.0.0 – 126.255.255.255 10.25.13.10
B 128-191 128.0.0.0 – 191.255.255.255 141.150.200.1
C 192-223 192.0.0.0 – 223.255.255.255 200.178.12.242

IPs públicos e privados


Como já dissemos, para que a comunicação ocorra, cada dispositivo da rede deve estar associ-
ado a pelo menos um endereço IP exclusivo. Porém, se cada dispositivo conectado à Internet
no mundo tivesse um endereço IP exclusivo, não haveria IPs suficientes (v4) para todos. Por
causa disso, foram definidos endereços IP privados.

IPs privados são intervalos de endereços IP reservados para uso em redes internas (privadas)
de empresas, instituições, residências etc. Dentro da mesma rede, o uso de um endereço IP
permanece exclusivo. No entanto, o mesmo endereço IP privado pode ser usado em qualquer
rede privada.

Assim, na internet o tráfego de dados emprega endereços IP públicos, que são reconhecíveis
e roteados pela internet, ao passo que nas redes privadas são usados esses intervalos de IP
reservados. O roteador é responsável por converter o tráfego da rede privada para a rede
pública e vice-versa.

Os intervalos de IPs privados, divididos em classes, podem ser vistos na tabela abaixo:

Classe Primeiro octeto Intervalo IPs privados


A 1-126 1.0.0.0 – 126.255.255.255 10.0.0.0 – 10.255.255.255
B 128-191 128.0.0.0 – 191.255.255.255 172.16.0.0 – 172.31.255.255
C 192-223 192.0.0.0 – 223.255.255.255 192.168.0.0 – 192.168.255.255

Convertendo o formato decimal em binário


Para os temas deste tópico, é importante saber como converter endereços IP entre formatos
binários e decimais.
449 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

A conversão do formato decimal para binário é feita por meio de divisões consecutivas por 2.
Como exemplo, vamos converter o valor 105 empregando seguintes etapas:

1. Ao dividir o valor 105 por 2, temos:

105/2
Quociente = 52
Resto = 1

2. Dividimos o quociente sequencialmente por 2, até que o quociente seja igual a 1:

52/2
Resto = 0
Quociente = 26

26/2
Resto = 0
Quociente = 13

13/2
Resto = 1
Quociente = 6

6/2
Resto = 0
Quociente = 3

3/2
Resto = 1
Quociente = 1

3. Agrupamos o último quociente seguido pelo resto de todas as divisões:

1101001

4. Incluímos 0s à esquerda até chegar a 8 bits:


450 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

01101001

5. No final, descobrimos que o valor 105 em decimal é igual a 01101001 em binário.

Convertendo o formato binário em decimal


Neste exemplo, usaremos o valor binário 10110000.

1. Cada bit é associado a um valor com uma potência de base dois. As potências se iniciam
em 0 e são incrementadas da direita para a esquerda. Neste exemplo teremos:

1 0 1 1 0 0 0 0
2ˆ7 2ˆ6 2ˆ5 2ˆ4 2ˆ3 2ˆ2 2ˆ1 2ˆ0

2. Quando o bit é 1, atribuímos o valor da potência respectiva; quando o bit é 0, o resultado


é 0.

1 0 1 1 0 0 0 0
2ˆ7 2ˆ6 2ˆ5 2ˆ4 2ˆ3 2ˆ2 2ˆ1 2ˆ0
128 0 32 16 0 0 0 0

3. Somamos todos os valores:

128 + 32 + 16 = 176

4. Assim, 10110000 em binário é igual a 176 em decimal.

Netmask
A máscara de rede (ou netmask) é usada em conjunto com o endereço IP para determinar
qual parte do IP representa a rede e qual representa os hosts. Ela tem o mesmo formato do
endereço IP, ou seja, 32 bits em 4 grupos de 8. Por exemplo:

Decimal Binário CIDR


255.0.0.0 11111111.00000000.00000000.00000000 8
255.255.0.0 11111111.11111111.00000000.00000000 16
255.255.255.0 11111111.11111111.11111111.00000000 24
451 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Usando a máscara 255.255.0.0 como exemplo, podemos ver que, no IP associado a ela, os
primeiros 16 bits (2 primeiros decimais) identificam a rede/sub-rede e os últimos 16 bits são
usados para identificar exclusivamente os hosts dentro da rede.

O CIDR (Classless Inter-Domain Routing) mencionado acima está relacionado a uma notação
de máscara simplificada, que indica o número de bits (1) associados à rede/sub-rede. Essa
notação é comumente usada para substituir o formato decimal, por exemplo /24 em vez de
255.255.255.0.

Vale notar que cada classe de IP possui uma máscara padrão, da seguinte maneira:

Classe Primeiro octeto Intervalo Máscara padrão


A 1-126 1.0.0.0 – 126.255.255.255 255.0.0.0 / 8
B 128-191 128.0.0.0 – 191.255.255.255 255.255.0.0 / 16
C 192-223 192.0.0.0 – 223.255.255.255 255.255.255.0 / 24

No entanto, esse padrão não significa que essa máscara sempre será usada. É possível usar
qualquer máscara com qualquer endereço IP, como veremos a seguir.

Aqui estão alguns exemplos de uso de IPs e máscaras:

192.168.8.12 / 255.255.255.0 / 24

• Intervalo - 192.168.8.0 - 192.168.8.255


• Endereço de rede - 192.168.8.0
• Endereço de transmissão - 192.168.8.255
• Hosts - 192.168.8.1 - 192.168.8.254

Neste caso, temos os 3 primeiros dígitos (primeiros 24 bits) do endereço IP definindo a rede; o
dígito final identifica os endereços dos hosts, ou seja, o intervalo desta rede vai de 192.168.8.0
a 192.168 .8.255.

Chegamos assim a dois conceitos importantes: cada rede/sub-rede tem 2 endereços reservados.
O primeiro endereço no intervalo é chamado de endereço da rede. Neste caso, 192.168.8.0,
usado para identificar a própria rede/sub-rede. O último endereço no intervalo é chamado de
endereço de transmissão, neste caso 192.168.8.255. Esse endereço de destino é usado para
enviar a mesma mensagem (pacote) para todos os hosts IP dessa rede/sub-rede.

Os endereços de rede e de transmissão não podem ser usados pelas máquinas da rede. Por-
452 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

tanto, a lista de IPs que podem de fato ser configurados varia de 192.168.8.1 a 192.168.8.254.

Vejamos um exemplo com mesmo IP, mas com uma máscara diferente:

192.168.8.12 / 255.255.0.0 / 16

• Intervalo - 192.168.0.0 - 192.168.255.255


• Endereço de rede - 192.168.0.0
• Endereço de transmissão - 192.168.255.255
• Hosts - 192.168.0.1 – 192.168.255.254

Perceba como a máscara diferente altera o intervalo de IPs que estão na mesma rede/sub-rede.

A divisão das redes por máscaras não se restringe aos valores padrão (8, 16, 24). Podemos
criar subdivisões conforme desejado, adicionando ou removendo bits na identificação da rede,
criando as novas sub-redes.

Por exemplo:

11111111.11111111.11111111.00000000 = 255.255.255.0 = 24

Se quisermos subdividir a rede acima em 2, basta adicionar outro bit à identificação da rede
na máscara, desta maneira:

11111111.11111111.11111111.10000000 = 255.255.255.128 = 25

Teremos então as seguintes sub-redes:

192.168.8.0 - 192.168.8.127
192.168.8.128 - 192.168.8.255

Se aumentarmos ainda mais a subdivisão da rede:

11111111.11111111.11111111.11000000 = 255.255.255.192 = 26
453 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Teremos:

192.168.8.0 - 192.168.8.63
192.168.8.64 - 192.168.8.127
192.168.8.128 - 192.168.8.191
192.168.8.192 - 192.168.8.255

Observe que em cada sub-rede teremos os endereços de rede reservados (a primeira do in-
tervalo) e de transmissão (o último do intervalo), portanto, quanto mais subdividida a rede,
menos IPs poderão ser usados efetivamente pelos hosts.

Identificando os endereços de rede e de transmissão


Por meio de um endereço IP e uma máscara, podemos identificar o endereço de rede e o
endereço de transmissão, e assim definir a faixa de IPs para a rede/sub-rede.

O endereço de rede é obtido usando um “E lógico” entre o endereço IP e a máscara em seus for-
matos binários. Vejamos um exemplo usando o IP 192.168.8.12 e a máscara 255.255.255.192.

Convertendo do formato decimal para o binário, como vimos anteriormente, temos:

11000000.10101000.00001000.00001100 (192.168.8.12)
11111111.11111111.11111111.11000000 (255.255.255.192)

Com o “E lógico”, temos 1 e 1 = 1, 0 e 0 = 0, 1 e 0 = 0, então:

11000000.10101000.00001000.00001100 (192.168.8.12)
11111111.11111111.11111111.11000000 (255.255.255.192)
11000000.10101000.00001000.00000000

Portanto, o endereço de rede para essa sub-rede é 192.168.8.0.

Agora, para obter o endereço de transmissão, usamos o endereço de rede, forçando todos os
bits relacionados ao host a ser 1s:

11000000.10101000.00001000.00000000 (192.168.8.0)
11111111.11111111.11111111.11000000 (255.255.255.192)
11000000.10101000.00001000.00111111
454 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

O endereço de transmissão, nesse caso, é 192.168.8.63.

Para concluir, temos:

192.168.8.12 / 255.255.255.192 / 26

• Intervalo - 192.168.8.0 - 192.168.8.63


• Endereço de rede - 192.168.8.0
• Endereço de transmissão - 192.168.8.63
• Hosts - 192.168.8.1 – 192.168.8.62

Rota padrão
Como vimos até agora, as máquinas que estão na mesma rede/sub-rede lógica podem se
comunicar diretamente por meio do protocolo IP.

Mas vamos considerar o exemplo abaixo:

• Rede 1 - 192.168.10.0/24
• Rede 2 - 192.168.200.0/24

Neste caso, a máquina 192.168.10.20 não pode enviar diretamente um pacote para 192.168.200.100,
pois elas estão em redes lógicas diferentes.

Para habilitar essa comunicação, usamos um roteador (ou um conjunto de roteadores). Um


roteador nesta configuração também pode ser chamado de gateway (portal), pois fornece um
portal entre duas redes. Esse dispositivo tem acesso a ambas as redes, pois está configurado
com o IP das duas; por exemplo, 192.168.10.1 e 192.168.200.1. Por isso, ele é capaz de
intermediar essa comunicação.

Para habilitar essa solução, cada host da rede deve ter configurado o que chamamos de rota
padrão. A rota padrão indica o IP para o qual devem ser enviados todos os pacotes cujo
destino é um IP que não faz parte da rede lógica do host.

No exemplo acima, a rota padrão para as máquinas na rede 192.168.10.0 / 24 será o IP


192.168.10.1, que é o IP do roteador/gateway, ao passo que a rota padrão para as máquinas
na rede 192.168.200.0/24 será 192.168.200.1.

A rota padrão também é utilizada para que as máquinas da rede privada (LAN) tenham acesso
à Internet (WAN) por meio de um roteador.
455 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Portas
Para que um host possa acessar um serviço disponível em outro host, além do protocolo de
endereçamento IP na camada de rede, será necessário utilizar um protocolo na camada de
transporte, como os protocolos TCP e UDP.

Esses protocolos realizam essa comunicação por meio de portas de rede. Portanto, além de
definir um IP de origem e destino, usamos portas de origem e destino para acessar um serviço.

A porta é identificada por um campo de 16 bits, o que resulta em um limite de 65.535


portas possíveis. Os serviços (destino) usam as portas 1 a 1023, que são chamadas de portas
privilegiadas por terem acesso de root ao sistema. A origem da conexão usa o intervalo de
portas de 1024 a 65.535, chamadas de portas não privilegiadas ou portas de socket.

As portas usadas por cada tipo de serviço são padronizadas e controladas pela IANA (Internet
Assigned Numbers Authority). Assim, em qualquer sistema, a porta 22 é usada pelo serviço
SSH, a porta 80 pelo serviço HTTP e assim por diante.

A tabela a seguir contém os principais serviços e suas respectivas portas.

Porta Serviço
20 FTP (dados)
21 FTP (controle)
22 SSH (Secure Socket Shell)
23 Telnet (Conexão remota sem criptografia)
25 SMTP (Simple Mail Transfer Protocol), Enviar emails
53 DNS (Domain Name System)
80 HTTP (Hypertext Transfer Protocol)
110 POP3 (Post Office Protocol), Receber emails
123 NTP (Network Time Protocol)
139 Netbios
143 IMAP (Internet Message Access Protocol), Acessar emails
161 SNMP (Simple Network Management Protocol)
162 SNMPTRAP, Notificações SNMP
389 LDAP (Lightweight Directory Access Protocol)
443 HTTPS (HTTP Seguro)
465 SMTPS (SMTP Seguro)
514 RSH (Shell Remoto)
636 LDAPS (LDAP Seguro)
993 IMAPS (IMAP Seguro)
995 POP3S (POP3 Seguro)
456 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Em um sistema Linux, as portas de serviço padrão são listadas no arquivo /etc/services.

A identificação da porta de destino desejada em uma conexão é feita usando o caractere


: (dois pontos) após o endereço IPv4. Assim, ao buscar acesso ao serviço HTTPS que é
servido pelo hospedeiro IP 200.216.10.15, o cliente deve enviar a solicitação para o destino
200.216.10.15:443.

Os serviços listados acima, e todos os outros, utilizam um protocolo de transporte de acordo


com as características exigidas pelo serviço, sendo o TCP e o UDP os principais.

Transmission Control Protocol (TCP)


O TCP (Protocolo de controle de transmissão) é um protocolo de transporte orientado a
conexões. Isso significa que uma conexão é estabelecida entre o cliente, por meio da porta
de socket, e o serviço, por meio da porta padrão do serviço. O protocolo é responsável por
garantir que todos os pacotes sejam entregues corretamente, verificando a integridade e a
ordem dos pacotes, incluindo a retransmissão de pacotes perdidos por erros de rede.

Assim, o aplicativo não precisa implementar esse controle de fluxo de dados, pois ele já é
garantido pelo protocolo TCP.

User Datagram Protocol (UDP)


O UDP (Protocolo de datagrama do usuário) estabelece uma conexão entre o cliente e o
serviço, mas não controla a transmissão de dados dessa conexão. Ou seja, ele não verifica se
os pacotes se perderam, se estão fora de ordem etc. O aplicativo é responsável por implementar
os controles necessários.

Como há menos controle, o UDP permite um melhor desempenho no fluxo de dados, o que é
importante para alguns tipos de serviços.

Internet Control Message Protocol (ICMP)


O ICMP (Protocolo de mensagens de controle da internet) é um protocolo da camada de
rede na pilha TCP/IP e sua principal função é analisar e controlar os elementos da rede,
possibilitando, por exemplo:

• Controle de volume de tráfego;


• Detecção de destinos inacessíveis;
• Redirecionamento de rota;
• Verificar o status de hosts remotos.
457 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

É o protocolo utilizado pelo comando ping, que será estudado em outro subtópico.

IPv6
Até agora, estudamos a versão 4 do protocolo IP, ou seja, o IPv4. Esta tem sido a versão
padrão usada em todos os ambientes de rede e internet. Porém, ela apresenta limitações,
principalmente no que diz respeito ao número de endereços disponíveis, e como parece claro
que em um futuro próximo todos os dispositivos estarão de alguma forma conectados à Internet
(ver IoT), é cada vez mais comum utilizar a versão 6 do protocolo IP, abreviada como IPv6.

O IPv6 traz uma série de mudanças, novas implementações e recursos, bem como uma nova
representação do próprio endereço.

Cada endereço IPv6 possui 128 bits, divididos em 8 grupos de 16 bits, representados por
valores hexadecimais.

Por exemplo:

2001:0db8:85a3:08d3:1319:8a2e:0370:7344

Abreviações
O IPv6 define maneiras de encurtar os endereços em algumas situações. Vamos analisar o
seguinte endereço:

2001:0db8:85a3:0000:0000:0000:0000:7344

A primeira possibilidade é reduzir as strings de 0000 para apenas um 0, resultando em:

2001:0db8:85a3:0:0:0:0:7344

Além disso, no caso de grupos de strings com valor 0, elas podem ser omitidas da seguinte
forma:

2001:0db8:85a3::7344
458 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Porém, esta última abreviatura só pode ser feita uma vez no endereço. Veja o exemplo:

2001:0db8:85a3:0000:0000:1319:0000:7344

2001:0db8:85a3:0:0:1319:0:7344

2001:0db8:85a3::1319:0:7344

Tipos de endereço IPv6


O IPv6 classifica os endereços em 3 tipos:

• Unicast - Identifica uma única interface de rede. Por padrão, os 64 bits à esquerda
identificam a rede e os 64 bits à direita identificam a interface;
• Multicast - Identifica um conjunto de interfaces de rede. Um pacote enviado a um
endereço multicast será enviado a todas as interfaces que pertencem àquele grupo.
Embora semelhante, não deve ser confundido com o broadcast (transmissão), que não
existe no protocolo IPv6;
• Anycast - Também identifica um conjunto de interfaces na rede, mas o pacote encam-
inhado para um endereço anycast será entregue a apenas um endereço nesse conjunto,
não a todos.

Diferenças entre IPv4 e IPv6


Além do endereço, diversas outras diferenças podem ser apontadas entre as versões 4 e 6 do
IP. Eis algumas delas:

1. As portas de serviço seguem os mesmos padrões e protocolos (TCP, UDP); a diferença


está apenas na representação do IP e no conjunto de portas. No IPv6, o endereço IP
deve ser protegido com [] (colchetes):

• IPv4- 200.216.10.15:443
• IPv6- [2001:0db8:85a3:08d3:1319:8a2e:0370:7344]:443

2. O IPv6 não implementa o recurso de broadcast (transmissão) da mesma maneira que o


IPv4. Porém, o mesmo resultado pode ser obtido enviando-se o pacote para o endereço
ff02::1, que alcança todos os hosts da rede local—semelhante a usar 224.0.0.1 no IPv4
para uma transmissão multicast;
3. Por meio do recurso SLAAC (Stateless Address Autoconfiguration), os hosts IPv6 podem
se autoconfigurar;
459 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

4. O campo TTL (Time to Live) do IPv4 foi substituído pelo “Hop Limit” (limite de saltos)
no cabeçalho do IPv6;
5. Todas as interfaces IPv6 têm um endereço local, denominado endereço de link local,
prefixado com fe80::/10;
6. O IPv6 implementa o Neighbor Discovery Protocol (NDP), semelhante ao ARP usado
pelo IPv4, mas com muito mais funcionalidades.

Talves isso possa te ajudar. . .

- Fonte: - https://www.face-
book.com/TeamARIN/photos/10155243976651290
460 40. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

- Fonte: - https://jared.nyc/cheatsheet.html
109.2 Configuração de rede

461
persistente
41
Fabio Gonçalves De Melo Santana / [email protected]
Fabio Gonçalves De Melo Santana / [email protected]

42
Introdução

Em qualquer rede TCP/IP, cada nó deve configurar seu adaptador de rede para atender aos
requisitos da rede.

As configurações de rede não são dependentes do sistema operacional, mas cada um deles
tem seus próprios métodos para armazenar e aplicar essas configurações. Os sistemas Linux
dependem de configurações armazenadas em arquivos de texto simples no diretório /etc para
ativar a conectividade de rede durante a inicialização.

A Interface de Rede
Interface de rede é o termo pelo qual o sistema operacional se refere ao canal de comunicação
configurado para funcionar com o hardware de rede conectado ao sistema, como um dispositivo
ethernet ou wi-fi. A exceção é a interface loopback, usada quando o sistema operacional precisa
estabelecer uma conexão consigo mesmo, mas o objetivo principal de uma interface de rede é
fornecer uma rota, através da qual os dados locais possam ser enviados, e os dados remotos
recebidos. Se a interface de rede não estiver configurada corretamente, o sistema operacional
não será capaz de se comunicar com outras máquinas na rede.

Na maioria dos casos, as configurações de interface corretas são definidas por padrão ou
personalizadas durante a instalação do sistema operacional. Ainda assim, essas configurações
geralmente precisam ser inspecionadas ou mesmo modificadas, quando a comunicação não está
funcionando corretamente, ou quando o comportamento da interface requer personalização.

462
463 42. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

O Linux tem muitos comandos para listar as interfaces de rede presentes no sistema, mas nem
todos estão disponíveis em todas as distribuições. O comando ip, no entanto, faz parte do
conjunto básico de ferramentas de rede empacotadas com todas as distribuições Linux e pode
ser usado para listar as interfaces de rede. O comando completo para mostrar as interfaces é
ip link show:

root@debian10:/home/debian# ip link show


1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group
default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp3s5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT
group default qlen 1000
link/ether 00:16:3e:8d:2b:5b brd ff:ff:ff:ff:ff:ff

Se disponível, o comando nmcli device também pode ser usado:

root@debian10:/home/debian# nmcli device


DEVICE TYPE STATE CONNECTION
enp3s5 ethernet connected Gigabit Powerline Adapter
lo loopback unmanaged --

Estes comandos não modificam as configurações do sistema e podem ser executados por um
usuário sem privilégios. Ambos os comandos listam duas interfaces de rede: lo (a interface de
loopback) e enp3s5 (uma interface ethernet).

Os desktops e laptops que executam Linux geralmente têm duas ou três interfaces de rede
predefinidas, uma para a interface virtual de loopback e as outras atribuídas ao hardware de
rede encontrado pelo sistema. Os servidores e dispositivos de rede que executam Linux, por
outro lado, podem ter dezenas de interfaces de rede, mas os mesmos princípios se aplicam a
todas elas. A abstração fornecida pelo sistema operacional permite a configuração de interfaces
de rede usando os mesmos métodos, independentemente do hardware usado.

No entanto, é útil conhecer os detalhes sobre o hardware subjacente de uma interface, para
entender melhor o que está acontecendo quando a comunicação não funciona conforme o
esperado. Em um sistema em que há muitas interfaces de rede disponíveis, nem sempre é
óbvio saber qual delas corresponde ao wi-fi, e qual corresponde à ethernet, por exemplo. Por
esse motivo, o Linux usa uma convenção para a nomenclatura de interfaces, que ajuda a
identificar qual interface de rede corresponde a qual dispositivo e porta.
464 42. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Nomes de interface
As distribuições Linux mais antigas atribuíam às interfaces de rede ethernet nomes como eth0,
eth1 etc., numeradas de acordo com a ordem em que o kernel identificava os dispositivos.
As interfaces wireless eram nomeadas wlan0, wlan1 etc. Esta convenção de nomenclatura,
no entanto, não esclarece qual porta Ethernet específica corresponde à interface eth0, por
exemplo. Dependendo de como o hardware fosse detectado, era possível inclusive que duas
interfaces de rede trocassem de nome após uma reinicialização.

Para evitar essa ambiguidade, os sistemas Linux mais recentes empregam uma convenção de
nomenclatura previsível para as interfaces de rede, criando uma aproximação maior entre o
nome da interface e a conexão de hardware subjacente.

Nas distribuições Linux que usam o esquema de nomenclatura do systemd, todos os nomes
de interfaces começam com um prefixo de dois caracteres que indica o tipo de interface:

• en - Ethernet;
• ib - InfiniBand;
• sl - Serial line IP (slip);
• wl - Rede de área local sem fio (WLAN);
• ww - Rede de longa distância sem fio (WWAN).

De prioridade mais alta para mais baixa, as seguintes regras são usadas pelo sistema operacional
para nomear e numerar as interfaces de rede:

1. Nomear a interface de acordo com o índice fornecido pela BIOS ou pelo firmware dos
dispositivos incorporados, por exemplo, eno1;
2. Nomear a interface de acordo com o índice do slot PCI Express, conforme fornecido pela
BIOS ou firmware, por exemplo, ens1;
3. Nomear a interface de acordo com seu endereço no barramento correspondente, por
exemplo, enp3s5;
4. Nomear a interface de acordo com o endereço MAC da interface, por exemplo, enx78e7d1ea46da;
5. Nomear a interface usando a convenção legada, por exemplo, eth0.

É correto pressupor, por exemplo, que a interface de rede enp3s5 recebeu esse nome porque
não se encaixava nos dois primeiros métodos de nomenclatura, de forma que seu endereço
no barramento e no slot correspondentes foi usado. O endereço do dispositivo 03:05.0,
encontrado na saída do comando lspci, revela o dispositivo associado:

$ lspci | fgrep Ethernet


03:05.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8110SC/8169SC Gigabit
Ethernet (rev 10)
465 42. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

As interfaces de rede são criadas pelo próprio kernel do Linux, mas existem muitos comandos
que podem ser usados para interagir com elas. Normalmente, a configuração ocorre auto-
maticamente e não há necessidade de se alterar as configurações manualmente. Ainda assim,
com o nome da interface, é possível informar ao kernel como proceder para configurá-la se
necessário.

Gerenciamento da interface
Embora o antigo, e meu preferido, comando ifconfig ainda possa ser usado para fazer consultas
e configurações de interface simples, ele agora está obsoleto devido ao seu suporte limitado a
interfaces não ethernet. O ifconfig foi substituído pelo comando ip, que é capaz de gerenciar
muitos outros aspectos das interfaces TCP/IP, como rotas e túneis.

Para a maioria das tarefas comuns, a riqueza de recursos do comando ip acaba sendo excessiva,
e por isso existem comandos auxiliares que facilitam a ativação e configuração das interfaces
de rede. Os comandos ifup e ifdown servem para configurar interfaces de rede com base nas
definições de interface encontradas no arquivo /etc/network/interfaces. Embora possam ser
invocados manualmente, esses comandos são, em geral, executados automaticamente durante
a inicialização do sistema.

Todas as interfaces de rede gerenciadas por ifup e ifdown devem estar listadas no arquivo
/etc/network/interfaces. O formato usado no arquivo é simples: as linhas que começam
com a palavra auto são usadas para identificar as interfaces físicas a serem acessadas quando
o ifup é executado com a opção -a. O nome da interface deve seguir a palavra auto na mesma
linha. Todas as interfaces marcadas como auto são ativadas no momento da inicialização, na
ordem em que estão listadas.

A configuração da interface em si é escrita em outra linha, começando com a palavra iface,


seguida pelo nome da interface, o nome da família de endereços usada por ela e o nome do
método empregado para configurá-la. O exemplo a seguir mostra um arquivo de configuração
básico para as interfaces lo (loopback) e enp3s5:

auto lo
iface lo inet loopback

auto enp3s5
iface enp3s5 inet dhcp

A família de endereços deve ser inet para as redes TCP/IP, mas também há suporte a redes
IPX (ipx) e IPv6 (inet6). As interfaces de loopback usam o método de configuração loopback.
Com o método dhcp, a interface usa as configurações de IP fornecidas pelo servidor DHCP
466 42. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

da rede. As configurações de nosso exemplo permitem a execução do comando ifup usando o


nome de interface enp3s5 como argumento:

root@debian10:/home/debian# ifup enp3s5


Internet Systems Consortium DHCP Client 4.4.1
Copyright 2004-2018 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/enp3s5/00:16:3e:8d:2b:5b
Sending on LPF/enp3s5/00:16:3e:8d:2b:5b
Sending on Socket/fallback
DHCPDISCOVER on enp3s5 to 255.255.255.255 port 67 interval 4
DHCPOFFER of 10.90.170.158 from 10.90.170.1
DHCPREQUEST for 10.90.170.158 on enp3s5 to 255.255.255.255 port 67
DHCPACK of 10.90.170.158 from 10.90.170.1
bound to 10.90.170.158 -- renewal in 1616 seconds.

Neste exemplo, o método escolhido para a interface enp3s5 foi dhcp, de modo que o comando
ifup chamou um programa cliente DHCP para obter as configurações de IP do servidor DHCP.
Da mesma forma, o comando ifdown enp3s5 pode ser usado para desativar a interface.

Nas redes sem um servidor DHCP, o método static pode ser usado e as configurações de IP
fornecidas manualmente em /etc/network/interfaces. Por exemplo:

iface enp3s5 inet static


address 192.168.1.2/24
gateway 192.168.1.1

As interfaces que usam o método static não precisam de uma instrução auto correspondente,
pois são ativadas sempre que o hardware de rede é detectado.

Se a mesma interface tiver mais de uma entrada iface, todos os endereços e opções configu-
rados serão aplicados ao se abrir essa interface. Isso é útil para configurar endereços IPv4 e
IPv6 na mesma interface, bem como para configurar diversos endereços do mesmo tipo em
uma única interface.

Nomes locais e remotos


Uma configuração funcional de TCP/IP é apenas o primeiro passo para a usabilidade total da
rede. Além de ser capaz de distinguir os nós da rede por seus números IP, o sistema deve
poder identificá-los com nomes mais facilmente compreensíveis por seres humanos.

O nome pelo qual o sistema se identifica é personalizável e é aconselhável fazê-lo, mesmo se a


467 42. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

máquina não for destinada a se conectar a uma rede. O nome local geralmente corresponde ao
nome da rede da máquina, mas nem sempre. Se o arquivo /etc/hostname existir, o sistema
operacional usará o conteúdo da primeira linha como nome local, que a partir daí é chamado
simplesmente de nome do host (hostname, em inglês). As linhas que começam com # dentro
de /etc/hostname são ignoradas.

O arquivo /etc/hostname pode ser editado diretamente, mas o nome de host da máquina
também pode ser definido com o comando hostnamectl. Quando fornecido com o subcomando
set-hostname, o comando hostnamectl pega o nome dado como argumento e o escreve em
/etc/hostname:

root@debian10:/home/debian# hostnamectl set-hostname storage


# cat /etc/hostname
storage

O nome de host (ou “hospedeiro”) definido em /etc/hostname é o nome estático, ou seja, o


nome usado para inicializar o nome de host do sistema na inicialização. O nome de host estático
pode ser uma string com até 64 caracteres de comprimento. No entanto, é recomendado que
ele consista apenas em caracteres ASCII minúsculos e sem espaços ou pontos. Também é
aconselhável limitá-lo ao formato permitido para rótulos de nomes de domínio DNS, embora
esse não seja um requisito estrito.

O comando hostnamectl pode definir dois outros tipos de nomes de host além do nome de
host estático:

• Hostname pretty

Ao contrário do nome de host estático, o nome de host pretty pode incluir todos os tipos de
caracteres especiais. Ele pode ser usado para definir um nome mais descritivo para a máquina,
por exemplo “Armazenamento compartilhado da LAN”:

root@debian10:/home/debian# hostnamectl --pretty set-hostname "LAN Shared Storage"

• Hostname transiente - Usado quando o nome de host estático não está definido
ou quando ele é o nome localhost padrão. O nome de host transiente é normalmente
definido junto com outras configurações automáticas, mas também pode ser modificado
com o comando hostnamectl, por exemplo:

root@debian10:/home/debian# hostnamectl --transient set-hostname generic-host


468 42. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Se nem a opção –pretty nem –transient forem usadas, os três tipos de nomes de host serão
configurados com o nome fornecido. Para definir o nome de host estático, mas não os nomes
pretty e transiente, usa-se a opção –static. Em todos os casos, somente o nome de host
estático é armazenado no arquivo /etc/hostname. O comando hostnamectl também pode ser
usado para exibir diversas informações descritivas e de identidade sobre o sistema em execução:

root@debian10:/home/debian# hostnamectl status


Static hostname: storage
Pretty hostname: LAN Shared Storage
Transient hostname: generic-host
Icon name: computer-server
Chassis: server
Machine ID: d91962a957f749bbaf16da3c9c86e093
Boot ID: 8c11dcab9c3d4f5aa53f4f4e8fdc6318
Operating System: Debian GNU/Linux 10 (buster)
Kernel: Linux 4.19.0-8-amd64
Architecture: x86-64

Esta é a ação padrão do comando hostnamectl, de modo que o subcomando status pode ser
omitido.

Com relação ao nome dos nós remotos da rede, o sistema operacional tem duas maneiras
básicas à sua disposição para combinar nomes e números IP: usar uma fonte local ou usar
um servidor remoto para traduzir nomes em números IP e vice-versa. Os métodos podem ser
complementares entre si, e sua ordem de prioridade é definida no arquivo de configuração Name
Service Switch: /etc/nsswitch.conf. Este arquivo é usado pelo sistema e pelos aplicativos
para determinar não apenas as fontes para as correspondências de nome-IP, mas também as
fontes das quais obter informações de nome-serviço em uma variedade de categorias, chamadas
bancos de dados.

O banco de dados hosts mantém um registro do mapeamento entre nomes e números de host.
A linha dentro de /etc/nsswitch.conf que começa com hosts define os serviços responsáveis
por fornecer as associações para ele:

hosts: files dns

Neste exemplo, files e dns são os nomes de serviços que especificam como o processo de
pesquisa de nomes de host funciona. Primeiro, o sistema procura por correspondências em
arquivos locais e, em seguida, solicita correspondências ao serviço DNS.

O arquivo local do banco de dados hosts é /etc/hosts, um arquivo de texto simples que associa
endereços IP a nomes de host, com uma linha por endereço IP, por exemplo:
469 42. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

127.0.0.1 localhost

O número IP 127.0.0.1 é o endereço padrão da interface de loopback, daí sua associação com
o nome localhost.

Também é possível vincular aliases opcionais ao mesmo IP. Os aliases podem fornecer grafias
alternativas, nomes de host mais curtos, e devem ser adicionados no final da linha, por exemplo:

192.168.1.10 joatham.4linux.com.br joatham

As regras de formatação para o arquivo /etc/hosts são:

• Os campos da entrada são separados por qualquer número de espaços em branco e/ou
caracteres de tabulação;
• O texto que começa em um caractere # e vai até o final da linha é um comentário e é
ignorado;
• Os nomes de host podem conter apenas caracteres alfanuméricos, sinais de menos e
pontos;
• Os nomes de host devem começar com um caractere alfabético e terminar com um
caractere alfanumérico.

Também podemos adicionar endereços IPv6 a /etc/hosts. A seguinte entrada se refere ao


endereço de loopback IPv6:

::1 localhost ip6-localhost ip6-loopback

Após a especificação do serviço files, a especificação dns diz ao sistema para solicitar a um
serviço DNS a associação nome/IP desejada. O conjunto de rotinas responsáveis por este
método é chamado de resolver (resolvedor) e seu arquivo de configuração é /etc/resolv.conf.
O exemplo a seguir mostra um /etc/resolv.conf genérico contendo entradas para os servidores
DNS públicos do Google:

nameserver 8.8.4.4
nameserver 8.8.8.8

Como mostrado no exemplo, a palavra-chave nameserver indica o endereço IP do servidor


470 42. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

DNS. Apenas um servidor de nomes é necessário, mas é possível informar até três deles. Os
suplementares serão usados como reserva. Se nenhuma entrada de servidor de nomes estiver
presente, o comportamento padrão é usar o servidor de nomes da máquina local.

O resolver pode ser configurado para adicionar automaticamente o domínio aos nomes antes
de consultá-los no servidor de nomes. Por exemplo:

nameserver 8.8.4.4
nameserver 8.8.8.8
domain 4linux.com.br
search mydomain.net mydomain.com

A entrada domain define 4linux.com.br como o nome de domínio local, assim, as consultas por
nomes dentro deste domínio podem usar nomes curtos relativos ao domínio local. A entrada
search tem uma finalidade semelhante, mas aceita uma lista de domínios a experimentar
quando um nome curto é fornecido. Por padrão, ela contém apenas o nome de domínio local.
109.3 Resolução de problemas

471
básicos de rede
43
Fabio Gonçalves De Melo Santana / [email protected]
Fabio Gonçalves De Melo Santana / [email protected]

44
Introdução
O Linux dispõe de recursos de rede extremamente flexíveis e poderosos. Na verdade, os sis-
temas operacionais baseados em Linux são frequentemente usados nos dispositivos de rede
comuns, incluindo equipamentos comerciais de alto padrão. Seria possível criar uma certifi-
cação inteira tendo como tema os recursos de rede do Linux. Tendo isso em mente, esta lição
abordará somente algumas ferramentas básicas de configuração e resolução de problemas.

Sugerimos revisar as lições sobre protocolos de internet e configurações de rede persistente


antes de iniciar esta lição. Aqui, trataremos das ferramentas para configurar e solucionar
problemas nas redes IPv4 e IPv6.

Embora não estejam incluídos nos objetivos oficiais, farejadores de pacotes (packet sniffers)
como o tcpdump são ferramentas úteis para a resolução de problemas. Os sniffers de pa-
cotes permitem visualizar e gravar os pacotes que entram ou saem de uma interface de rede.
Ferramentas como visualizadores hexadecimais e analisadores de protocolo podem, ser usadas
para visualizar esses pacotes com mais detalhes do que um farejador de pacotes normalmente
permitiria. É bom saber que essas opções existem.

Sobre o comando ip
O comando ip é um utilitário bastante recente, usado para visualizar e definir quase tudo
relacionado às configurações de rede. Esta lição cobre alguns dos subcomandos mais usados
do ip, embora mal arranhe a superfície do que está disponível. Vale a pena ler a documentação
para aprender a usá-lo da maneira mais eficaz.

472
473 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Cada subcomando de ip tem sua própria página de manual. A seção SEE ALSO da página do
manual de ip inclui uma lista deles:

root@debian10:/home/debian# man ip
...
SEE ALSO
ip-address(8), ip-addrlabel(8), ip-l2tp(8), ip-link(8), ip-maddress(8),
ip-monitor(8), ip-mroute(8), ip-neighbour(8), ip-netns(8), ip-
ntable(8), ip-route(8), ip-rule(8), ip-tcp_metrics(8), ip-token(8), ip-
tunnel(8), ip-xfrm(8)
IP Command reference ip-cref.ps
...

Em vez de passar por aqui toda vez que você precisar da página de manual, simplesmente
adicione -e o nome do subcomando a ip, por exemplo, man ip-route.

Outra boa fonte de informações é a função de ajuda. Para visualizar a ajuda integrada,
adicione help após o subcomando:

root@debian10:/home/debian# ip address help


Usage: ip address {add|change|replace} IFADDR dev IFNAME [ LIFETIME ]
[ CONFFLAG-LIST ]
ip address del IFADDR dev IFNAME [mngtmpaddr]
ip address {save|flush} [ dev IFNAME ] [ scope SCOPE-ID ]
[ to PREFIX ] [ FLAG-LIST ] [ label LABEL ] [up]
ip address [ show [ dev IFNAME ] [ scope SCOPE-ID ] [ master DEVICE ]
[ type TYPE ] [ to PREFIX ] [ FLAG-LIST ]
[ label LABEL ] [up] [ vrf NAME ] ]
ip address {showdump|restore}
IFADDR := PREFIX | ADDR peer PREFIX
...

Máscara de rede e revisão de roteamento


O IPv4 e o IPv6 são conhecidos como protocolos roteados ou roteáveis. Isso significa que eles
são projetados de forma a permitir que os designers de rede controlem o fluxo de tráfego. O
Ethernet não é um protocolo roteável. Assim, se você conectar diversos dispositivos somente
com Ethernet, haverá pouquíssimas opções para controlar o fluxo de tráfego da rede. Quais-
quer medidas empregadas para controlar o tráfego acabariam tendo resultado semelhante aos
protocolos roteáveis e de roteamento atuais.

Os protocolos roteáveis permitem que os designers de rede segmentem as redes para reduzir os
requisitos de processamento dos dispositivos de conectividade, fornecer redundância e gerenciar
o tráfego.
474 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Os endereços IPv4 e IPv6 têm duas seções. O primeiro conjunto de bits constitui a seção da
rede, ao passo que o segundo representa a seção do host. O número de bits que constituem a
seção da rede é determinado pela máscara de rede (também chamada de máscara de sub-rede).
Ele também pode ser chamado de comprimento do prefixo. Independentemente de como é
chamado, trata-se do número de bits que a máquina trata como sendo a parte da rede do
endereço. No IPv4, ele às vezes é especificado em notação decimal com pontos.

Veja abaixo um exemplo usando IPv4. Observe como os dígitos binários mantêm seu valor de
posição nos octetos, mesmo quando são divididos pela máscara de rede.

192.168.130.5/20

192 168 130 5


11000000 10101000 10000010 00000101

20 bits = 11111111 11111111 11110000 00000000

Network = 192.168.128.0
Host = 2.5

A seção da rede de um endereço é usada pelas máquinas IPv4 ou IPv6 para pesquisar em qual
interface um pacote deve ser enviado em sua tabela de roteamento. Quando um host IPv4
ou IPv6 com roteamento habilitado recebe um pacote que não é destinado ao próprio host,
ele busca uma correspondência para a parte da rede do destino em uma rede da tabela de
roteamento. Se uma entrada correspondente for encontrada, ele envia o pacote ao destino
especificado na tabela. Se nenhuma entrada for encontrada e uma rota padrão estiver config-
urada, ele é enviado para a rota padrão. Se nenhuma entrada for encontrada e nenhuma rota
padrão estiver configurada, o pacote é descartado.

Configurando uma interface


Vamos falar de duas ferramentas que permitem configurar uma interface de rede: ifconfig e
ip. O programa ifconfig, embora ainda amplamente utilizado, é considerado uma ferramenta
legada e nem sempre está disponível em sistemas mais novos.

Nas distribuições Linux mais recentes, a instalação do pacote net-tools fornece os


comandos de rede antigos.

Antes de configurar uma interface, devemos primeiro saber quais interfaces estão disponíveis.
Há algumas maneiras de fazer isso. Uma delas é usar a opção -a de ifconfig:
475 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# ifconfig -a

Outra forma é usar ip. Há diversos exemplos com ip addr, ip a e alguns com ip address.
Eles são todos sinônimos. Oficialmente, o subcomando é ip address. Assim, para visualizar a
página de manual, usamos man ip-address e não man ip-addr.

O subcomando link para ip lista os links de interface disponíveis para configuração:

root@debian10:/home/debian# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group
default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode
DEFAULT group default qlen 1000
link/ether 08:00:27:54:18:57 brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode
DEFAULT group default qlen 1000
link/ether 08:00:27:ab:11:3e brd ff:ff:ff:ff:ff:ff

Pressupondo que o sistema de arquivos sys esteja montado, também podemos listar o conteúdo
de /sys/class/net

root@debian10:/home/debian# ls /sys/class/net
enp0s3 enp0s8 lo

Para configurar uma interface com o ifconfig, você deve estar logado como root ou rodar um
utilitário como sudo para executar o comando com privilégios de root. Siga o exemplo abaixo:

root@debian10:/home/debian# ifconfig enp1s0 192.168.50.50/24

A versão Linux do ifconfig é flexível com a forma de se especificar a máscara de sub-rede:

root@debian10:/home/debian# ifconfig eth2 192.168.50.50 netmask 255.255.255.0


root@debian10:/home/debian# ifconfig eth2 192.168.50.50 netmask 0xffffff00
root@debian10:/home/debian# ifconfig enp0s8 add 2001:db8::10/64

Note como, no IPv6, a palavra-chave add foi usada. Se um endereço IPv6 não for precedido
por add, será exibida uma mensagem de erro.
476 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

O seguinte comando configura uma interface com ip:

root@debian10:/home/debian# ip addr add 192.168.5.5/24 dev enp0s8


root@debian10:/home/debian# ip addr add 2001:db8::10/64 dev enp0s8

No caso do ip, o mesmo comando é usado para IPv4 e IPv6.

Configurando opções de baixo nível


O comando ip link é usado para configurar a interface de baixo nível ou para configurações de
protocolos, como VLANs, ARP ou MTUs, ou ainda para desabilitar uma interface.

Uma tarefa comum para ip link é desabilitar ou habilitar uma interface. Isso também pode ser
feito com o ifconfig:

root@debian10:/home/debian# ip link set dev enp0s8 down


root@debian10:/home/debian# ip link show dev enp0s8
3: enp0s8: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group
default qlen 1000
link/ether 08:00:27:ab:11:3e brd ff:ff:ff:ff:ff:ff
root@debian10:/home/debian# ifconfig enp0s8 up
root@debian10:/home/debian# ip link show dev enp0s8
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode
DEFAULT group default qlen 1000
link/ether 08:00:27:ab:11:3e brd ff:ff:ff:ff:ff:ff

Às vezes é necessário ajustar o MTU de uma interface. Da mesma forma que é possível
habilitar/desabilitar interfaces, esse ajuste também pode ser feito com ifconfig ou ip link:

root@debian10:/home/debian# ip link set enp0s8 mtu 2000


root@debian10:/home/debian# ip link show dev enp0s3
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2000 qdisc pfifo_fast state UP mode
DEFAULT group default qlen 1000
link/ether 08:00:27:54:53:59 brd ff:ff:ff:ff:ff:ff
root@debian10:/home/debian# ifconfig enp0s3 mtu 1500
root@debian10:/home/debian# ip link show dev enp0s3
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode
DEFAULT group default qlen 1000
link/ether 08:00:27:54:53:59 brd ff:ff:ff:ff:ff:ff
477 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

A tabela de roteamento
Os comandos route, netstat -r e ip route podem ser usados para visualizar a tabela de rotea-
mento. Se quiser modificar as rotas, use route ou ip route. Eis abaixo alguns exemplos de
visualização de uma tabela de roteamento:

root@debian10:/home/debian# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default 10.0.2.2 0.0.0.0 UG 0 0 0 enp0s3
10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s3
192.168.150.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s8
root@debian10:/home/debian# ip route
default via 10.0.2.2 dev enp0s3 proto dhcp metric 100
10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15 metric 100
192.168.150.0/24 dev enp0s8 proto kernel scope link src 192.168.150.200
root@debian10:/home/debian# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.0.2.2 0.0.0.0 UG 100 0 0 enp0s3
10.0.2.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3
192.168.150.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s8

Observe como não há saída relacionada ao IPv6. Para visualizar a tabela de roteamento do
IPv6, usamos route -6, netstat -6r e ip -6 route.

root@debian10:/home/debian# route -6
Kernel IPv6 routing table
Destination Next Hop Flag Met Ref Use If
2001:db8::/64 [::] U 256 0 0 enp0s8
fe80::/64 [::] U 100 0 0 enp0s3
2002:a00::/24 [::] !n 1024 0 0 lo
[::]/0 2001:db8::1 UG 1 0 0 enp0s8
localhost/128 [::] Un 0 2 84 lo
2001:db8::10/128 [::] Un 0 1 0 lo
fe80::a00:27ff:fe54:5359/128 [::] Un 0 1 0 lo
ff00::/8 [::] U 256 1 3 enp0s3
ff00::/8 [::] U 256 1 6 enp0s8

Um exemplo de netstat -r6 foi omitido porque sua saída é idêntica à de route -6. Algumas
das saídas do comando route acima são autoexplicativas. A coluna Flag fornece algumas
informações sobre a rota. O sinalizador U indica que uma rota está ativa. Um ! significa rota
rejeitada, ou seja, uma rota com um ! não será usada. O sinalizador n indica que a rota não
foi armazenada em cache. O kernel mantém um cache de rotas separadamente de todas as
rotas conhecidas para permitir pesquisas mais rápidas. O sinalizador G indica um gateway. A
coluna Metric ou Met não é usada pelo kernel. Ela se refere à distância administrativa até o
alvo. Essa distância administrativa é usada pelos protocolos de roteamento para determinar
478 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

rotas dinâmicas. A coluna Ref é a contagem de referência ou o número de usos de uma rota.
Assim como Metric, ela não é usada pelo kernel do Linux. A coluna Use mostra o número de
pesquisas para uma rota.

Na saída de netstat -r, MSS indica o tamanho máximo do segmento para as conexões TCP
nessa rota. A coluna Window mostra o tamanho da janela TCP padrão. irtt mostra o tempo
de ida e volta dos pacotes nesta rota.

A saída de ip route e ip -6 route é interpretada desta maneira:

1. Destino;
2. Endereço opcional seguido pela interface;
3. O protocolo de roteamento usado para adicionar a rota;
4. O escopo da rota. Se omitido, trata-se de um escopo global ou um gateway;
5. A métrica da rota. Ela é usada pelos protocolos de roteamento dinâmico para determinar
o custo da rota. Não é usada pela maioria dos sistemas;
6. Se for uma rota IPv6, a preferência da rota RFC4191.

Para que isso fique mais claro, eis alguns exemplos:

Exemplo de IPv4

default via 10.0.2.2 dev enp0s3 proto dhcp metric 100

1. O destino é a rota padrão;


2. O endereço do gateway é 10.0.2.2, acessível através da interface enp0s3;
3. Ela foi adicionada à tabela de roteamento pelo DHCP;
4. O escopo foi omitido, portanto é global;
5. A rota tem um valor de custo de 100;
6. Não há preferência de rota de IPv6.

Exemplo de IPv6

fc0::/64 dev enp0s8 proto kernel metric 256 pref medium

1. O destino é fc0::/64;
2. Ele é acessível através da interface enp0s8;
3. Foi adicionado automaticamente pelo kernel;
4. O escopo foi omitido, portanto é global;
5. A rota tem um valor de custo de 256;
6. Ela tem uma preferência de IPv6 medium.
479 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Gerenciando as rotas
As rotas podem ser gerenciadas com route ou ip route. Veja abaixo um exemplo de adição
e remoção de uma rota usando o comando route. Com route, adicionamos a opção -6 para
IPv6:

root@debian10:/home/debian# ping6 -c 2 2001:db8:1::20


connect: Network is unreachable
root@debian10:/home/debian# route -6 add 2001:db8:1::/64 gw 2001:db8::3
root@debian10:/home/debian# ping6 -c 2 2001:db8:1::20
PING 2001:db8:1::20(2001:db8:1::20) 56 data bytes
64 bytes from 2001:db8:1::20: icmp_seq=1 ttl=64 time=0.451 ms
64 bytes from 2001:db8:1::20: icmp_seq=2 ttl=64 time=0.438 ms
root@debian10:/home/debian# route -6 del 2001:db8:1::/64 gw 2001:db8::3
root@debian10:/home/debian# ping6 -c 2 2001:db8:1::20
connect: Network is unreachable

Abaixo, o mesmo exemplo usando o comando ip route:

root@debian10:/home/debian# ping6 -c 2 2001:db8:1:20


connect: Network is unreachable
root@debian10:/home/debian# ip route add 2001:db8:1::/64 via 2001:db8::3
root@debian10:/home/debian# ping6 -c 2 2001:db8:1:20
PING 2001:db8:1::20(2001:db8:1::20) 56 data bytes
64 bytes from 2001:db8:1::20: icmp_seq=2 ttl=64 time=0.529 ms
64 bytes from 2001:db8:1::20: icmp_seq=2 ttl=64 time=0.438 ms
root@debian10:/home/debian# ip route del 2001:db8:1::/64 via 2001:db8::3
root@debian10:/home/debian# ping6 -c 2 2001:db8:1::20
connect: Network is unreachable

A melhor maneira de testar uma conexão de rede é tentar usar seu aplicativo. Se isso não
funcionar, existem muitas ferramentas disponíveis para ajudar a diagnosticar o problema.

Testando conexões com ping


Os comandos ping e ping6 enviam uma solicitação de eco ICMP para um endereço IPv4 ou
IPv6, respectivamente. Uma solicitação de eco ICMP envia uma pequena quantidade de dados
ao endereço de destino. Se o endereço de destino estiver acessível, ele manda uma mensagem
de eco ICMP de volta ao remetente com os mesmos dados que lhe foram enviados:

root@debian10:/home/debian# ping -c 3 192.168.50.2


PING 192.168.50.2 (192.168.50.2) 56(84) bytes of data.
64 bytes from 192.168.50.2: icmp_seq=1 ttl=64 time=0.525 ms
64 bytes from 192.168.50.2: icmp_seq=2 ttl=64 time=0.419 ms
64 bytes from 192.168.50.2: icmp_seq=3 ttl=64 time=0.449 ms
480 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

--- 192.168.50.2 ping statistics ---


3 packets transmitted, 3 received, 0% packet loss, time 2006ms
rtt min/avg/max/mdev = 0.419/0.464/0.525/0.047 ms

$ ping6 -c 3 2001:db8::10
PING 2001:db8::10(2001:db8::10) 56 data bytes
64 bytes from 2001:db8::10: icmp_seq=1 ttl=64 time=0.425 ms
64 bytes from 2001:db8::10: icmp_seq=2 ttl=64 time=0.480 ms
64 bytes from 2001:db8::10: icmp_seq=3 ttl=64 time=0.725 ms

--- 2001:db8::10 ping statistics ---


3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.425/0.543/0.725/0.131 ms

A opção -c é usada para especificar o número de pacotes a enviar. Se você omitir esta opção,
ping e ping6 continuarão a enviar pacotes até que você os interrompa, normalmente com a
combinação de teclas Ctrl+C

Não é possível executar ping em um host, mas isso não significa que você não pode se conectar
a ele. Muitas empresas têm firewalls ou listas de controle de acesso ao roteador que bloqueiam
tudo, exceto o mínimo necessário para que os sistemas funcionem. Isso inclui as solicitações
e respostas de eco ICMP. Como esses pacotes podem incluir dados arbitrários, um invasor
astuto poderia usá-los para extrair dados.

Traçando Rotas
Os programas traceroute e traceroute6 servem para mostrar a rota que um pacote faz para
chegar ao seu destino. Para isso, eles enviam diversos pacotes ao destino, incrementando o
campo Time-To-Live (TTL) do cabeçalho IP com cada pacote subsequente. Cada roteador
ao longo do caminho responde com uma mensagem ICMP de TTL excedido:

root@debian10:/home/debian# traceroute 192.168.1.20


traceroute to 192.168.1.20 (192.168.1.20), 30 hops max, 60 byte packets
1 10.0.2.2 (10.0.2.2) 0.396 ms 0.171 ms 0.132 ms
2 192.168.1.20 (192.168.1.20) 2.665 ms 2.573 ms 2.573 ms
root@debian10:/home/debian# traceroute 192.168.50.2
traceroute to 192.168.50.2 (192.168.50.2), 30 hops max, 60 byte packets
1 192.168.50.2 (192.168.50.2) 0.433 ms 0.273 ms 0.171 ms
root@debian10:/home/debian# traceroute6 2001:db8::11
traceroute to 2001:db8::11 (2001:db8::11), 30 hops max, 80 byte packets
1 2001:db8::11 (2001:db8::11) 0.716 ms 0.550 ms 0.641 ms
root@debian10:/home/debian# traceroute 2001:db8::11
traceroute to 2001:db8::11 (2001:db8::11), 30 hops max, 80 byte packets
1 2001:db8::10 (2001:db8::11) 0.617 ms 0.461 ms 0.387 ms
root@debian10:/home/debian# traceroute net2.example.net
traceroute to net2.example.net (192.168.50.2), 30 hops max, 60 byte packets
1 net2.example.net (192.168.50.2) 0.533 ms 0.529 ms 0.504 ms
481 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# traceroute6 net2.example.net


traceroute to net2.example.net (2001:db8::11), 30 hops max, 80 byte packets
1 net2.example.net (2001:db8::11) 0.738 ms 0.607 ms 0.304 ms

Por padrão, o traceroute envia 3 pacotes UDP com dados inúteis para a porta 33434,
incrementando-os a cada vez que envia um pacote. Cada linha na saída do comando é uma
interface de roteador que o pacote atravessa. Os tempos mostrados em cada linha da saída
são o tempo de ida e volta de cada pacote. O endereço IP é o endereço da interface do
roteador em questão. Se o traceroute puder, ele usa o nome DNS da interface do roteador.
Às vezes, aparece * no lugar de uma hora. Quando isso acontece, significa que o traceroute
nunca recebeu a mensagem de TTL excedido para este pacote. Isso geralmente indica que a
última resposta é o último salto da rota.

Se você tiver acesso a root, a opção -I configura o traceroute para usar solicitações de eco
ICMP ao invés de pacotes UDP. Elas geralmente são mais eficazes do que o UDP porque o
host de destino tem mais probabilidade de responder a uma solicitação de eco ICMP do que
ao pacote UDP:

root@debian10:/home/debian# traceroute -I learning.lpi.org


traceroute to learning.lpi.org (208.94.166.201), 30 hops max, 60 byte packets
1 047-132-144-001.res.spectrum.com (47.132.144.1) 9.764 ms 9.702 ms 9.693 ms
2 096-034-094-106.biz.spectrum.com (96.34.94.106) 8.389 ms 8.481 ms 8.480 ms
3 dtr01hlrgnc-gbe-4-15.hlrg.nc.charter.com (96.34.64.172) 8.763 ms 8.775 ms 8.770 ms
4 acr01mgtnnc-vln-492.mgtn.nc.charter.com (96.34.67.202) 27.080 ms 27.154 ms 27.151 ms
5 bbr01gnvlsc-bue-3.gnvl.sc.charter.com (96.34.2.112) 31.339 ms 31.398 ms 31.395 ms
6 bbr01aldlmi-tge-0-0-0-13.aldl.mi.charter.com (96.34.0.161) 39.092 ms 38.794 ms
38.821 ms
7 prr01ashbva-bue-3.ashb.va.charter.com (96.34.3.51) 34.208 ms 36.474 ms 36.544 ms
8 bx2-ashburn.bell.ca (206.126.236.203) 53.973 ms 35.975 ms 38.250 ms
9 tcore4-ashburnbk_0-12-0-0.net.bell.ca (64.230.125.190) 66.315 ms 65.319 ms 65.345 ms
10 tcore4-toronto47_2-8-0-3.net.bell.ca (64.230.51.22) 67.427 ms 67.502 ms 67.498 ms
11 agg1-toronto47_xe-7-0-0_core.net.bell.ca (64.230.161.114) 61.270 ms 61.299 ms 61.291
ms
12 dis4-clarkson16_5-0.net.bell.ca (64.230.131.98) 61.101 ms 61.177 ms 61.168 ms
13 207.35.12.142 (207.35.12.142) 70.009 ms 70.069 ms 59.893 ms
14 unassigned-117.001.centrilogic.com (66.135.117.1) 61.778 ms 61.950 ms 63.041 ms
15 unassigned-116.122.akn.ca (66.135.116.122) 62.702 ms 62.759 ms 62.755 ms
16 208.94.166.201 (208.94.166.201) 62.936 ms 62.932 ms 62.921 ms

Algumas empresas bloqueiam solicitações e respostas de eco ICMP. Para contornar isso, pode-
mos usar o TCP. Usando uma porta TCP aberta conhecida, garantimos que o host de destino
responderá. Para usar o TCP, inclua a opção -T junto com -p para especificar a porta. Como
no caso das solicitações de eco ICMP, é necessário ter acesso de root para fazer isso:

root@debian10:/home/debian# traceroute -m 60 -T -p 80 learning.lpi.org


traceroute to learning.lpi.org (208.94.166.201), 60 hops max, 60 byte packets
482 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

1 * * *
2 096-034-094-106.biz.spectrum.com (96.34.94.106) 12.178 ms 12.229 ms 12.175 ms
3 dtr01hlrgnc-gbe-4-15.hlrg.nc.charter.com (96.34.64.172) 12.134 ms 12.093 ms 12.062
ms
4 acr01mgtnnc-vln-492.mgtn.nc.charter.com (96.34.67.202) 31.146 ms 31.192 ms 31.828 ms
5 bbr01gnvlsc-bue-3.gnvl.sc.charter.com (96.34.2.112) 39.057 ms 46.706 ms 39.745 ms
6 bbr01aldlmi-tge-0-0-0-13.aldl.mi.charter.com (96.34.0.161) 50.590 ms 58.852 ms
58.841 ms
7 prr01ashbva-bue-3.ashb.va.charter.com (96.34.3.51) 34.556 ms 37.892 ms 38.274 ms
8 bx2-ashburn.bell.ca (206.126.236.203) 38.249 ms 36.991 ms 36.270 ms
9 tcore4-ashburnbk_0-12-0-0.net.bell.ca (64.230.125.190) 66.779 ms 63.218 ms tcore3-
ashburnbk_100ge0-12-0-0.net.bell.ca (64.230.125.188) 60.441 ms
10 tcore4-toronto47_2-8-0-3.net.bell.ca (64.230.51.22) 63.932 ms 63.733 ms 68.847 ms
11 agg2-toronto47_xe-7-0-0_core.net.bell.ca (64.230.161.118) 60.144 ms 60.443 ms agg1-
toronto47_xe-7-0-0_core.net.bell.ca (64.230.161.114) 60.851 ms
12 dis4-clarkson16_5-0.net.bell.ca (64.230.131.98) 67.246 ms dis4-clarkson16_7-0.net.bell
.ca (64.230.131.102) 68.404 ms dis4-clarkson16_5-0.net.bell.ca (64.230.131.98)
67.403 ms
13 207.35.12.142 (207.35.12.142) 66.138 ms 60.608 ms 64.656 ms
14 unassigned-117.001.centrilogic.com (66.135.117.1) 70.690 ms 62.190 ms 61.787 ms
15 unassigned-116.122.akn.ca (66.135.116.122) 62.692 ms 69.470 ms 68.815 ms
16 208.94.166.201 (208.94.166.201) 61.433 ms 65.421 ms 65.247 ms
17 208.94.166.201 (208.94.166.201) 64.023 ms 62.181 ms 61.899 ms

Como o ping, o traceroute tem suas limitações. É possível que firewalls e roteadores bloqueiem
os pacotes enviados ou devolvidos ao traceroute. Se você tiver acesso de root, há opções que
podem ajudar a obter resultados precisos.

Encontrando MTUs com tracepath


O comando tracepath é semelhante ao traceroute. A diferença é que ele rastreia os tamanhos
da Maximum Transmission Unit (MTU) ao longo do caminho. A MTU é uma configuração
definida em uma interface de rede, ou uma limitação de hardware sobre a maior unidade de
dados de protocolo que é possível transmitir ou receber. O programa tracepath funciona da
mesma maneira que traceroute no sentido de que incrementa o TTL a cada pacote. A diferença
é o envio de um datagrama UDP muito grande. É quase inevitável que o datagrama seja maior
do que o dispositivo com a menor MTU ao longo da rota. Quando o pacote chega a este
dispositivo, este normalmente responde com um pacote de destino inacessível. O pacote de
destino ICMP inacessível tem um campo para a MTU do link para o qual ele enviaria o pacote
se pudesse. O tracepath então manda todos os pacotes subsequentes com esse tamanho:

root@debian10:/home/debian# tracepath 192.168.1.20


1?: [LOCALHOST] pmtu 1500
1: 10.0.2.2 0.321ms
1: 10.0.2.2 0.110ms
2: 192.168.1.20 2.714ms reached
Resume: pmtu 1500 hops 2 back 64
483 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Ao contrário do traceroute, precisamos obrigatoriamente usar o tracepath6 para IPv6:

root@debian10:/home/debian# tracepath 2001:db8::11


tracepath: 2001:db8::11: Address family for hostname not supported
root@debian10:/home/debian# tracepath6 2001:db8::11
1?: [LOCALHOST] 0.027ms pmtu 1500
1: net2.example.net 0.917ms reached
1: net2.example.net 0.527ms reached
Resume: pmtu 1500 hops 1 back 1

A saída é semelhante à do traceroute. A vantagem do tracepath está na última linha, que


inclui o menor MTU de todo o link. Isso pode ser útil para solucionar problemas de conexões
incapazes de lidar com fragmentos.

Como no caso das ferramentas anteriores de resolução de problemas, existe a possibilidade de


o equipamento bloquear seus pacotes.

Criando Conexões Arbitrárias


O programa nc, conhecido como netcat, pode enviar ou receber dados arbitrários através de
uma conexão de rede TCP ou UDP. Os exemplos a seguir devem deixar clara sua funcionali-
dade.

Aqui está um exemplo de configuração de um ouvinte (listener) na porta 1234:

root@debian10:/home/debian# nc -l 1234
LPI Exemplo

A saída de LPI Example aparece após o exemplo abaixo, que mostra a configuração de um
remetente netcat para enviar pacotes para net2.example.net na porta 1234. A opção -l é usada
para especificar que nc deve receber dados em vez de enviá-los:

root@debian10:/home/debian# nc net2.example.net 1234


LPI Exemplo

Pressione Ctrl+C em qualquer um dos sistemas para interromper a conexão.

O netcat funciona com endereços IPv4 e IPv6. Ele funciona com TCP e UDP. Pode inclusive
ser usado para configurar um shell remoto rudimentar.
484 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# hostname
net2
root@debian10:/home/debian# nc -u -e /bin/bash -l 1234

A opção -u significa UDP. -e instrui o netcat a enviar tudo o que recebe para a entrada padrão
do executável que vem em seguida. Neste exemplo, /bin/bash.

root@debian10:/home/debian# hostname
net1
root@debian10:/home/debian# nc -u net2.example.net 1234
hostname
net2
pwd
/home/emma

Percebeu como a saída do comando hostname corresponde à do host ouvinte e a saída do


comando pwd é um diretório?

Visualizando conexões atuais e listeners


Os programas netstat e ss podem ser usados para visualizar o status de seus ouvintes e conexões
atuais. Como no caso de ifconfig, netstat é uma ferramenta legada. Tanto netstat quanto ss
têm saídas e opções semelhantes. Eis algumas opções disponíveis para ambos os programas:

• -a - Mostra todos os sockets;


• -l - Mostra os sockets de escuta;
• -p - Mostra o processo associado à conexão;
• -n - Impede pesquisas de nome para portas e endereços;
• -t - Mostra as conexões TCP;
• -u - Mostra as conexões UDP.

Os exemplos abaixo mostram a saída de um conjunto de opções, comumente usados em ambos


os programas:

root@debian10:/home/debian# netstat -tulnp


Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program
name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 892/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1141/master
tcp6 0 0 :::22 :::* LISTEN 892/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1141/master
udp 0 0 0.0.0.0:68 0.0.0.0:* 692/
485 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

dhclient
root@debian10:/home/debian# ss -tulnp
root@debian10:/home/debian# ss -tulnp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:
Port
udp UNCONN 0 0 :68 *:
users:(("dhclient",pid=693,fd=6))
tcp LISTEN 0 128 :22 *:
users:(("sshd",pid=892,fd=3))
tcp LISTEN 0 100 127.0.0.1:25 :
users:(("master",pid=1099,fd=13))
tcp LISTEN 0 128 [::]:22 [::]:*
users:(("sshd",pid=892,fd=4))
tcp LISTEN 0 100 [::1]:25 [::]:*
users:(("master",pid=1099,fd=14))

A coluna Recv-Q é o número de pacotes que um socket recebeu, mas não passou para seu
programa. A coluna Send-Q é o número de pacotes que um socket enviou e que não foram
confirmados pelo receptor. As colunas restantes são autoexplicativas.
486 44. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Tavez isso possa te ajudar. . .

Fig. 44.1: COMANDO IP

• Fonte: - https://access.redhat.com/articles/ip-command-cheat-sheet
109.4 Configurar o DNS do lado

487
do cliente
45
Fabio Gonçalves De Melo Santana / [email protected]
Fabio Gonçalves De Melo Santana / [email protected]

46
Introdução
Pense comigo, o que é mais fácil de gravar:

200.139.14.15 ou 4linux.com.br?

200.100.50.99 ou youtube.com?

Acredito que você já tenha essa resposta. . .

O processo de resolução de nome


Os programas que resolvem nomes em números quase sempre usam funções fornecidas pela
biblioteca C padrão, que nos sistemas Linux é a glibc do projeto GNU. A primeira coisa que
essas funções fazem é ler o arquivo /etc/nsswitch.conf para obter instruções sobre como
resolver esse tipo de nome. Esta aula trata da resolução de nomes de host, mas o mesmo
processo também se aplica a outros tipos de resolução de nomes. Depois de ler /etc/nss-
witch.conf, o processo busca pelo nome da maneira especificada. Como /etc/nsswitch.conf
suporta plug-ins, o que vem a seguir pode ser qualquer coisa. Depois que a função termina
de buscar o nome ou número, ela retorna o resultado para o processo de chamada.

Classes DNS
O DNS tem três classes de registro: IN, HS e CH. Nesta aula, todas as consultas de DNS
serão do tipo IN. A classe IN se refere a endereços da internet que usam a pilha TCP/IP. CH

488
489 46. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

significa ChaosNet, uma tecnologia de rede que teve vida curta e não está mais em uso. A
classe HS refere-se ao Hesiod. O Hesiod é uma maneira de armazenar coisas como passwd e
entradas de grupo no DNS. O Hesiod está além do escopo desta aula.

Entendendo /etc/nsswitch.conf
Se liga em um exemplo simples de /etc/nsswitch.conf tirado da man page:

passwd: compat
group: compat
shadow: compat

hosts: dns [!UNAVAIL=return] files


networks: nis [NOTFOUND=return] files
ethers: nis [NOTFOUND=return] files
protocols: nis [NOTFOUND=return] files
rpc: nis [NOTFOUND=return] files
services: nis [NOTFOUND=return] files
# This is a comment. It is ignored by the resolution functions.

O arquivo é organizado em colunas. A coluna mais à esquerda é o tipo de banco de dados


de nomes. O resto das colunas são os métodos que as funções de resolução devem usar para
pesquisar um nome. Os métodos são seguidos pelas funções, da esquerda para a direita.
As colunas com [] são usadas para fornecer uma lógica condicional limitada para a coluna
imediatamente à esquerda.

Suponha que um processo esteja tentando resolver o nome do host lpi.4linux.com.br. Ele faria
uma chamada apropriada à biblioteca C (provavelmente gethostbyname). Esta função então
lê /etc/nsswitch.conf. Como o processo está procurando um nome de host, ele encontrará
a linha que começa com hosts. Em seguida, ele tenta usar o DNS para resolver o nome. A
coluna seguinte [!UNAVAIL=return] indica que, se o serviço não estiver indisponível, não é
necessário tentar a próxima fonte, ou seja, se o DNS estiver disponível, ele para de tentar
resolver o nome do host, mesmo se os servidores de nome forem incapazes de fazê-lo. Se o
DNS estiver indisponível, ele prossegue para a próxima fonte. Neste caso, a próxima fonte é
files.

Quando vemos uma coluna no formato [resultado=ação], isso significa que quando uma
pesquisa do resolvedor na coluna à esquerda resultar em resultado, então a ação é execu-
tada. Se resultado for precedido por !, isso quer dizer que, se o resultado não for resultado,
a ação deve ser executada. Para obter descrições dos resultados e ações possíveis, consulte a
página do manual.

Agora, suponha que um processo esteja tentando resolver um número de porta para um nome
490 46. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

de serviço. Ele leria a linha services. A primeira fonte listada é NIS. NIS significa Network
Information Service (às vezes apelidado de Páginas Amarelas). Este é um serviço antigo que
permitia o gerenciamento central de coisas como usuários. Raramente é usado devido à sua
fraca segurança. A coluna seguinte, [NOTFOUND=return], indica que se a pesquisa foi bem-
sucedida, mas o serviço não foi encontrado, é preciso parar de procurar. Se a condição acima
mencionada não se aplicar, ele usará arquivos locais.

Qualquer coisa à direita de # é um comentário e é ignorado.

O arquivo /etc/resolv.conf
O arquivo /etc/resolv.conf é usado para configurar a resolução do host via DNS. Algumas
distribuições têm scripts de inicialização, daemons e outras ferramentas que gravam neste
arquivo. Lembre-se disso ao editá-lo manualmente. Verifique a documentação de sua dis-
tribuição e de quaisquer ferramentas de configuração de rede, se esse for o seu caso. Algumas
ferramentas, como o NetworkManager, deixam um comentário no arquivo informando que as
alterações manuais serão sobrescritas.

O formato do arquivo é bastante simples. Na coluna da esquerda, temos a opção name. O


resto das colunas na mesma linha são os valores da opção.

A opção mais comum é nameserver. Ela é usada para especificar o endereço IPv4 ou IPv6
de um servidor DNS. Na data em que esta aula foi escrita, era possível especificar até três
servidores de nomes. Se o seu /etc/resolv.conf não tiver a opção nameserver, o sistema usará
por padrão o servidor de nomes da máquina local.

Veja abaixo um exemplo simples, mas representativo de configurações que são comuns:

search 4linux.com.br
nameserver 10.0.0.53
nameserver fd00:ffff::2:53

A opção search é usada para permitir pesquisas curtas. No exemplo, configuramos um


único domínio para pesquisa, 4linux.com.br. Isso significa que qualquer tentativa de re-
solver um nome de host sem uma parte de domínio terá .4linux.com.br incluído antes da
pesquisa. Por exemplo, se pesquisarmos por um host chamado learning, o resolvedor buscará
por lpi.4linux.com.br. É possível configurar até seis domínios de pesquisa.

Outra opção comum é domain. Ela é usada para definir o nome de domínio local. Se esta
opção estiver ausente, o padrão é usar tudo após o primeiro . no nome de host da máquina.
Se o nome do host não contiver um ., presume-se que a máquina faça parte do domínio raiz.
491 46. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Como no caso de search, domain pode ser usado para pesquisas curtas de nomes.

Lembre-se de que domain e search são mutuamente exclusivos. Se ambos estiverem presentes,
será usada a última instância no arquivo.

Muitas opções podem ser definidas de forma a afetar o comportamento do resolvedor. Para
configurá-las, use a palavra-chave option, seguida pelo nome da opção a ser configurada e, se
for o caso, um : seguido pelo valor. Veja abaixo um exemplo de configuração da opção de
tempo limite (timeout), ou seja, o período de tempo em segundos que o resolvedor espera por
um servidor de nome antes de desistir:

option timeout:3

Existem outras opções para resolv.conf, mas essas são as mais comuns.

O arquivo /etc/hosts
O arquivo /etc/hosts é usado para resolver nomes para endereços IP e vice-versa. Há suporte
a IPv4 e IPv6. A coluna da esquerda é o endereço IP, o resto são nomes associados a esse
endereço. O uso mais comum de /etc/hosts é para hosts e endereços nos quais o DNS não é
possível, como endereços de loopback. No exemplo abaixo, são definidos os endereços IP dos
componentes críticos da infraestrutura.

Aqui um exemplo realístico de um arquivo /etc/hosts:

127.0.0.1 localhost
127.0.1.1 proxy
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

10.0.0.1 gateway.4linux.com.br gateway gw


fd00:ffff::1 gateway.4linux.com.br gateway gw

10.0.1.53 dns1.4linux.com.br
fd00:ffff::1:53 dns1.4linux.com.br
10.0.2.53 dns2.4linux.com.br
fd00:ffff::2:53 dns2.4linux.com.br
492 46. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

systemd-resolved
O systemd inclui um serviço chamado systemd-resolved. Ele fornece mDNS, DNS e LLMNR.
Quando está em execução, ele escuta as solicitações de DNS em 127.0.0.53. Ele não fornece
um servidor DNS completo. Quaisquer solicitações de DNS que recebe são pesquisadas nos
servidores configurados em /etc/systemd/resolv.conf ou /etc/resolv.conf. Se você deseja
empregar o serviço, use resolve para hosts em /etc/nsswitch.conf. Lembre-se de que o pacote
do sistema operacional que possui a biblioteca systemd-resolution pode não estar instalado
por padrão.

Ferramentas de resolução de nomes


Existem muitas ferramentas de resolução de nomes disponíveis para os usuários do Linux. Esta
aula cobre três delas. A primeira, getent, é útil para ver como as solicitações do mundo real
serão resolvidas. Outro comando é host, que é ótimo para consultas de DNS simples. Um
programa chamado dig é prático para operações de DNS complexas que podem ajudar na
resolução de problemas do servidor DNS.

O comando getent
O utilitário getent é usado para exibir entradas de bancos de dados de serviços de nome. Ele
é capaz de recuperar registros de qualquer fonte configurável por /etc/nsswitch.conf.

Para usar o getent, inclua o tipo de nome que deseja resolver após o comando e, opcionalmente,
uma entrada específica a pesquisar. Se você especificar apenas o tipo de nome, o getent tentará
exibir todas as entradas referentes àquele tipo de dados:

root@debian10:/home/debian# getent hosts


127.0.0.1 localhost
127.0.1.1 proxy
10.0.1.53 dns1.4linux.com.br
10.0.2.53 dns2.4linux.com.br
127.0.0.1 localhost ip6-localhost ip6-loopback
root@debian10:/home/debian# getent hosts dns1.lpi,org
fd00:ffff::1:53 dns1.4linux.com.br

A partir da versão 2.2.5 do glibc, é possível forçar o getent a usar uma fonte de dados específica
com a opção -s. O exemplo abaixo demonstra isso:

root@debian10:/home/debian# getent -s files hosts lpi.4linux.com.br


::1 lpi.4linux.com.br
root@debian10:/home/debian# getent -s dns hosts lpi.4linux.com.br
493 46. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

208.94.166.198 lpi.4linux.com.br

O comando host
host é um programa simples para procurar entradas DNS. Sem opções, se host receber um
nome, ele retorna os conjuntos de registros A, AAAA e MX. Se um endereço IPv4 ou IPv6 for
fornecido, ele produzirá o registro PTR, caso haja um disponível:

root@debian10:/home/debian# host wikipedia.org


wikipedia.org has address 208.80.154.224
wikipedia.org has IPv6 address 2620:0:861:ed1a::1
wikipedia.org mail is handled by 10 mx1001.wikimedia.org.
wikipedia.org mail is handled by 50 mx2001.wikimedia.org.
$ host 208.80.154.224
224.154.80.208.in-addr.arpa domain name pointer text-lb.eqiad.wikimedia.org.

Se você estiver procurando por um tipo de registro específico, pode usar host -t:

root@debian10:/home/debian# host -t NS 4linux.com.br


4linux.com.br name server dns1.easydns.com.
4linux.com.br name server dns3.easydns.ca.
4linux.com.br name server dns2.easydns.net.
root@debian10:/home/debian# host -t SOA 4linux.com.br
4linux.com.br has SOA record dns1.easydns.com. zone.easydns.com. 1593109612 3600 600
1209600 300

host também pode ser usado para consultar um servidor de nomes específico caso não se
queira usar os que estão em /etc/resolv.conf. Basta adicionar o endereço IP ou nome de host
do servidor que se deseja usar como último argumento:

root@debian10:/home/debian# host -t MX 4linux.com.br dns1.easydns.com


Using domain server:
Name: dns1.easydns.com
Address: 64.68.192.10#53
Aliases:

4linux.com.br mail is handled by 10 aspmx4.googlemail.com.


4linux.com.br mail is handled by 10 aspmx2.googlemail.com.
4linux.com.br mail is handled by 5 alt1.aspmx.l.google.com.
4linux.com.br mail is handled by 0 aspmx.l.google.com.
4linux.com.br mail is handled by 10 aspmx5.googlemail.com.
4linux.com.br mail is handled by 10 aspmx3.googlemail.com.
4linux.com.br mail is handled by 5 alt2.aspmx.l.google.com.
494 46. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

O comando dig
Outra ferramenta para consultar servidores DNS é o dig. Esse comando é muito mais detalhado
do que host. Por padrão, dig consulta os registros A. Ele provavelmente é prolixo demais para
simplesmente buscar um endereço IP ou nome de host. O dig funciona para pesquisas simples,
mas é mais adequado para solucionar problemas de configuração do servidor DNS:

root@debian10:/home/debian# dig lpi.4linux.com.br

; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> lpi.4linux.com.br


;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63004
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: ca7a415be1cec45592b082665ef87f3483b81ddd61063c30 (good)
;; QUESTION SECTION:
;lpi.4linux.com.br. IN A

;; ANSWER SECTION:
lpi.4linux.com.br. 600 IN A 208.94.166.198

;; AUTHORITY SECTION:
4linux.com.br. 86400 IN NS dns2.easydns.net.
4linux.com.br. 86400 IN NS dns1.easydns.com.
4linux.com.br. 86400 IN NS dns3.easydns.ca.

;; ADDITIONAL SECTION:
dns1.easydns.com. 172682 IN A 64.68.192.10
dns2.easydns.net. 170226 IN A 198.41.222.254
dns1.easydns.com. 172682 IN AAAA 2400:cb00:2049:1::a29f:1835
dns2.easydns.net. 170226 IN AAAA 2400:cb00:2049:1::c629:defe

;; Query time: 135 msec


;; SERVER: 192.168.1.20#53(192.168.1.20)
;; WHEN: Sun Jun 28 07:29:56 EDT 2020
;; MSG SIZE rcvd: 266

Como vemos, o dig fornece muitas informações. A saída é dividida em seções. A primeira
seção exibe informações sobre a versão do dig instalada e a consulta enviada, junto com as
opções usadas para o comando. Em seguida vêm informações sobre a consulta e a resposta.

A seção seguinte mostra informações sobre as extensões EDNS usadas e a consulta. No exem-
plo, a extensão cookie é usada. O dig está procurando um registro A para lpi.4linux.com.br.

A seção seguinte mostra o resultado da consulta. O número na segunda coluna é o TTL do


recurso em segundos.

O restante da saída fornece informações sobre os servidores de nome do domínio, incluindo os


495 46. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

registros NS para o servidor, junto com os registros A e AAAA dos servidores no registro NS
do domínio.

Como host, você pode especificar um tipo de registro com a opção -t:

root@debian10:/home/debian# dig -t SOA 4linux.com.br

; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> -t SOA 4linux.com.br


;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16695
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 6

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 185c67140a63baf46c4493215ef8906f7bfbe15bdca3b01a (good)
;; QUESTION SECTION:
;4linux.com.br. IN SOA

;; ANSWER SECTION:
4linux.com.br. 600 IN SOA dns1.easydns.com. zone.easydns.com. 1593109612 3600 600
1209600 300

;; AUTHORITY SECTION:
4linux.com.br. 81989 IN NS dns1.easydns.com.
4linux.com.br. 81989 IN NS dns2.easydns.net.
4linux.com.br. 81989 IN NS dns3.easydns.ca.

;; ADDITIONAL SECTION:
dns1.easydns.com. 168271 IN A 64.68.192.10
dns2.easydns.net. 165815 IN A 198.41.222.254
dns3.easydns.ca. 107 IN A 64.68.196.10
dns1.easydns.com. 168271 IN AAAA 2400:cb00:2049:1::a29f:1835
dns2.easydns.net. 165815 IN AAAA 2400:cb00:2049:1::c629:defe

;; Query time: 94 msec


;; SERVER: 192.168.1.20#53(192.168.1.20)
;; WHEN: Sun Jun 28 08:43:27 EDT 2020
;; MSG SIZE rcvd: 298

O dig tem muitas opções que permitem refinar a saída e a consulta enviada ao servidor. Essas
opções começam com +. Uma delas é a opção short, que suprime todas as saídas, exceto o
resultado:

root@debian10:/home/debian# dig +short 4linux.com.br


65.39.134.165
root@debian10:/home/debian# dig +short -t SOA 4linux.com.br
dns1.easydns.com. zone.easydns.com. 1593109612 3600 600 1209600 300

Eis um exemplo de desativação da extensão EDNS cookie:


496 46. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# dig +nocookie -t MX 4linux.com.br

; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> +nocookie -t MX 4linux.com.br


;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47774
;; flags: qr rd ra; QUERY: 1, ANSWER: 7, AUTHORITY: 3, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;4linux.com.br. IN MX

;; ANSWER SECTION:
4linux.com.br. 468 IN MX 0 aspmx.l.google.com.
4linux.com.br. 468 IN MX 10 aspmx4.googlemail.com.
4linux.com.br. 468 IN MX 10 aspmx5.googlemail.com.
4linux.com.br. 468 IN MX 10 aspmx2.googlemail.com.
4linux.com.br. 468 IN MX 10 aspmx3.googlemail.com.
4linux.com.br. 468 IN MX 5 alt2.aspmx.l.google.com.
4linux.com.br. 468 IN MX 5 alt1.aspmx.l.google.com.

;; AUTHORITY SECTION:
4linux.com.br. 77130 IN NS dns2.easydns.net.
4linux.com.br. 77130 IN NS dns3.easydns.ca.
4linux.com.br. 77130 IN NS dns1.easydns.com.

;; ADDITIONAL SECTION:
dns1.easydns.com. 76140 IN A 64.68.192.10
dns2.easydns.net. 73684 IN A 198.41.222.254
dns1.easydns.com. 76140 IN AAAA 2400:cb00:2049:1::a29f:1835
dns2.easydns.net. 73684 IN AAAA 2400:cb00:2049:1::c629:defe

;; Query time: 2 msec


;; SERVER: 192.168.1.20#53(192.168.1.20)
;; WHEN: Mon Jun 29 10:18:58 EDT 2020
;; MSG SIZE rcvd: 389
497 46. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Tavez isso possa te ajudar. . .

Fig. 46.1: DNS1

• Fonte: https://www.scribd.com/document/395026391/DNS-CheatSheet-V1-02-1
498 46. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Fig. 46.2: DNS2

• Fonte: - https://constellix.com/other/dns-records-cheat-sheet # 110.1 Executar tare-


fas administrativas de segurança
Fabio Gonçalves De Melo Santana / [email protected]

47
Introdução
A segurança é fundamental na administração de qualquer sistema. Como um bom admin-
istrador de sistemas Linux, você deve ficar atento a uma série de coisas, como permissões
especiais em arquivos, validade das senhas de usuário, portas e sockets abertos, limitações no
uso de recursos do sistema, gestão de usuários conectados e escalonamento de privilégios por
meio su e sudo. Nesta lição, trataremos de cada um desses tópicos.

Verificando Arquivos com SUID e SGID


Além do conjunto de permissões tradicional de leitura, escrita e execução, os arquivos de um
sistema Linux também podem ter algumas permissões especiais definidas, como os bits SUID
ou SGID.

O bit SUID permite que o arquivo seja executado com privilégios de proprietário do arquivo.
Numericamente, ele é representado por 4000 e, simbolicamente, por s ou S no bit de permissão
de execução do proprietário. Um exemplo clássico de arquivo executável com a permissão SUID
definida é passwd:

root@debian10:/home/debian# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 63736 Jul 27 2018 /usr/bin/passwd

O s minúsculo em rws indica a presença do SUID no arquivo—junto com a permissão de

499
500 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

execução. Se, no lugar dele, houvesse um S maiúsculo (rwS), isso significaria que a permissão
de execução presumida não foi definida.

Trataremos de passwd na próxima seção. O utilitário é empregado principalmente


pelo root para definir/alterar as senhas de usuário (por exemplo: passwd carol). No
entanto, os usuários regulares também podem usá-lo para alterar suas próprias senhas.
Portanto, ele vem com o SUID definido.

Por outro lado, o bit SGID pode ser definido tanto em arquivos quanto em diretórios. Nos
arquivos, seu comportamento é equivalente ao de SUID, mas os privilégios serão os mesmos
do proprietário do grupo. Quando definido em um diretório, no entanto, ele permite que
todos os arquivos criados ali herdem a propriedade do grupo do diretório. Como o SUID, o
SGID é simbolicamente representado por s ou S no bit de permissão de execução do grupo.
Numericamente, ele é representado por 2000. Para definir o SGID em um diretório, usamos
chmod. É necessário adicionar 2 (SGID) às permissões tradicionais (755, em nosso caso):

root@debian10:/tmp# mkdir teste


root@debian10:/tmp# ls -ld teste/
drwxr-xr-x 2 root root 4096 Jul 13 10:36 teste/
root@debian10:/tmp# chmod 2755 teste/
root@debian10:/tmp# ls -ld teste/
drwxr-sr-x 2 root root 4096 Jul 13 10:36 teste/

Para encontrar arquivos com SUID e/ou SGID definidos, use o comando find com a opção
-perm. Podemos incluir valores numéricos e simbólicos. Os valores, por sua vez, podem ser
passados sozinhos ou precedidos por travessão (-) ou barra (/). O significado é o seguinte:

• -perm numeric-value ou -perm symbolic-value: Encontrar arquivos com a permissão


especial exclusivamente;
• -perm -numeric-value ou -perm -symbolic-value: Encontrar arquivos com a per-
missão especial e outras permissões;
• -perm /numeric-value ou -perm /symbolic-value: Encontrar arquivos com qualquer
uma das permissões especiais (e outras permissões).

Por exemplo, para localizar arquivos com apenas o SUID definido no diretório de trabalho
atual, usaríamos o seguinte comando:

root@debian10:/tmp# find . -perm 4000


root@debian10:/tmp# touch arquivo
root@debian10:/tmp# chmod 4000 arquivo
root@debian10:/tmp# find . -perm 4000
501 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

./arquivo

Observe que, uma vez que não existiam arquivos contendo exclusivamente o SUID, criamos
um para mostrar algumas saídas. Podemos executar o mesmo comando em notação simbólica:

root@debian10:/tmp# find . -perm u+s


./arquivo

Para encontrar arquivos que correspondam ao SUID (independentemente de quaisquer outras


permissões) no diretório /usr/bin/, use um dos seguintes comandos:

root@debian10:/tmp# find /usr/bin/ -perm -4000


/usr/bin/ntfs-3g
/usr/bin/sudo
/usr/bin/pkexec
/usr/bin/chfn
/usr/bin/bwrap
/usr/bin/fusermount
/usr/bin/mount
/usr/bin/gpasswd
/usr/bin/passwd
/usr/bin/umount
/usr/bin/newgrp
/usr/bin/chsh
/usr/bin/su

Se estiver procurando por arquivos no mesmo diretório com o bit SGID definido, execute find
/usr/bin/ -perm -2000 ou find /usr/bin/ -perm -g+s.

Finalmente, para encontrar arquivos com qualquer uma das duas permissões especiais definidas,
adicione 4 e 2 e use /:

root@debian10:/tmp# find /usr/bin/ -perm /6000


/usr/bin/ntfs-3g
/usr/bin/sudo
/usr/bin/pkexec
/usr/bin/chfn
/usr/bin/chage
/usr/bin/bwrap
/usr/bin/fusermount
/usr/bin/dotlockfile
/usr/bin/mount
/usr/bin/gpasswd
/usr/bin/passwd
/usr/bin/expiry
/usr/bin/umount
502 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

/usr/bin/ssh-agent
/usr/bin/bsd-write
/usr/bin/crontab
/usr/bin/newgrp
/usr/bin/wall
/usr/bin/chsh
/usr/bin/su

Gerenciamento e validade das senhas


Como dito acima, o utilitário passwd permite alterar nossa própria senha como um usuário
regular. Além disso, com a opção -S ou –status podemos obter informações de status sobre
nossa conta:

root@debian10:/tmp# passwd -S
root P 02/06/2021 0 99999 7 -1

Eis uma análise dos sete campos obtidos na saída:

• root: Nome de login do usuário;


• P: Indica que o usuário possui uma senha válida (P); outros valores possíveis são L para
uma senha bloqueada e NP para nenhuma senha;
• 02/06/2021: Data da última alteração da senha;
• 0: Idade mínima em dias (o número mínimo de dias entre mudanças de senha). Um
valor de 0 significa que a senha pode ser alterada a qualquer momento;
• 99999: Idade máxima em dias (o número máximo de dias em que a senha é válida).
Um valor de 99999 desabilita a expiração da senha;
• 7: Período de aviso em dias (o número de dias antes da expiração da senha em que um
usuário será avisado);
• -1: Período de inatividade da senha em dias (o número de dias inativos após a expiração
da senha até que a conta seja bloqueada). Um valor de -1 remove a inatividade de uma
conta.

Além de relatar o status da conta, o comando passwd empregado com permissão de root
serve para realizar algumas manutenções básicas de conta. Ele permite bloquear e desbloquear
contas, forçar um usuário a alterar sua senha no próximo login e excluir a senha de um usuário
com as opções -l, -u, -e e -d, respectivamente.

Para testar essas opções, é conveniente apresentarmos o comando su neste momento. Através
do su, você pode trocar de usuário durante uma sessão de login. Assim, por exemplo, usaríamos
passwd como root para bloquear a senha de root. Em seguida, mudaríamos para a conta de
503 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

root para verificar no status da conta se a senha foi de fato bloqueada (L) e não pode ser
alterada. Finalmente, voltando ao usuário root, desbloqueamos a senha de root.

root@debian10:/tmp# passwd -l debian


passwd: password expiry information changed.
root@debian10:/tmp# su - debian
debian@debian10:~$ passwd -S
debian L 02/06/2021 0 99999 7 -1
debian@debian10:~$ passwd
Changing password for debian.
Current password:
passwd: Authentication token manipulation error
passwd: password unchanged
debian@debian10:~$ exit
logout
root@debian10:/tmp# passwd -u debian
passwd: password expiry information changed.

Outra alternativa para bloquear e desbloquear a senha de um usuário é o comando usermod:

• Bloquear a senha do usuário debian: usermod -L debian or usermod –lock debian;


• Desbloquear a senha do usuário debian: usermod -U deian or usermod –unlock
debian.

Com as opções -f ou –inactive, usermod também serve para definir o número de dias
até que uma conta com a senha expirada seja desabilitada (p. ex. usermod -f 3 carol).

Além de passwd e usermod, o comando mais direto para lidar com senhas e validade de contas
é chage (“change age”, ou alterar idade). Como root, você pode passar para chage a opção -l
(ou –list) seguida por um nome de usuário para imprimir na tela a senha atual desse usuário
e as informações de expiração da conta; como usuário comum, você pode ver suas próprias
informações:

root@debian10:/tmp# chage -l debian


Last password change : Feb 06, 2021
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7

Quando executado sem opções e seguido apenas por um nome de usuário, chage se comporta
de maneira interativa:
504 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/tmp# chage debian


Changing the aging information for debian
Enter the new value, or press ENTER for the default

Minimum Password Age [0]:


Maximum Password Age [99999]:
Last Password Change (YYYY-MM-DD) [2021-02-06]:
Password Expiration Warning [7]:
Password Inactive [-1]:
Account Expiration Date (YYYY-MM-DD) [-1]:

As opções para modificar as diferentes configurações de chage são as seguintes:

• -m days username ou –mindays days username: Especifica o número mínimo de


dias entre as alterações de senha (por exemplo: chage -m 5 debian). Um valor de 0
permite que o usuário altere sua senha a qualquer momento;
• -M days username ou –maxdays days username: Especifica o número máximo de
dias em que a senha será válida (por exemplo: chage -M 30 debian). Para desabilitar a
expiração da senha, é comum atribuir a esta opção o valor 99999;
• -d days username ou –lastday days username: Especifica o número de dias desde
que a senha foi alterada pela última vez (por exemplo: chage -d 10 debian). Um valor
de 0 força o usuário a alterar sua senha no próximo login;
• -W days username ou –warndays days username: Especifica o número de dias em
que o usuário será lembrado de que sua senha expirou;
• -I days username ou –inactive days username: Especifica o número de dias de
inatividade após a expiração da senha (por exemplo: chage -I 10 debian)o mesmo que
usermod -f ou usermod –inactive. Transcorridos esses dias, a conta será bloqueada.
Porém, se o valor for 0, a conta não será bloqueada;
• -E date username ou –expiredate date username: Especifica a data (ou número
de dias desde a época—1ž de janeiro de 1970) em que a conta será bloqueada. Nor-
malmente é expresso no formato AAAA-MM-DD (por exemplo: chage -E 2050-12-13
debian).

Para aprender mais sobre passwd, usermod e chage - e suas opções - consulte as
páginas de manual respectivas.

Descobrindo portas abertas


Os administradores de sistema também precisam ficar de olho nas portas abertas e, para isso,
existem quatro utilitários muito poderosos na maioria dos sistemas Linux: lsof, fuser, netstat
e nmap. Falaremos deles nesta seção.
505 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

lsof significa “list open files”, o que não é pouca coisa, já que, para o Linux tudo é arquivo.
Na verdade, se você digitar lsof no terminal, aparecerá uma enorme lista de arquivos comuns,
arquivos de dispositivos, sockets etc. Porém, nesta lição, vamos nos concentrar principalmente
nas portas. Para imprimir a lista de todos os arquivos de rede da “Internet”, execute lsof com
a opção -i:

root@debian10:/tmp# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
avahi-dae 494 avahi 12u IPv4 17676 0t0 UDP *:mdns
avahi-dae 494 avahi 13u IPv6 17677 0t0 UDP *:mdns
avahi-dae 494 avahi 14u IPv4 17678 0t0 UDP *:59828
avahi-dae 494 avahi 15u IPv6 17679 0t0 UDP *:58016
sshd 554 root 3u IPv4 18629 0t0 TCP *:ssh (LISTEN)
sshd 554 root 4u IPv6 18640 0t0 TCP *:ssh (LISTEN)
dhclient 593 root 6u IPv4 19584 0t0 UDP *:bootpc
dhclient 2422 root 8u IPv4 42129 0t0 UDP *:bootpc
sshd 2574 root 3u IPv4 46056 0t0 TCP debian10.linuxvmimages.local:ssh
->192.168.100.23:52118 (ESTABLISHED)
sshd 2691 debian 3u IPv4 46056 0t0 TCP debian10.linuxvmimages.local:ssh
->192.168.100.23:52118 (ESTABLISHED)

Além do serviço bootpc que é usado pelo DHCP a saída mostra dois serviços ouvindo conexões
ssh e o servidor web Apache (http) bem como duas conexões SSH estabelecidas. Podemos
especificar um determinado host com a notação @ip-address para verificar suas conexões:

root@debian10:/tmp# lsof [email protected]


COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 2574 root 3u IPv4 46056 0t0 TCP debian10.linuxvmimages.local:ssh
->192.168.100.23:52118 (ESTABLISHED)
sshd 2691 debian 3u IPv4 46056 0t0 TCP debian10.linuxvmimages.local:ssh
->192.168.100.23:52118 (ESTABLISHED)

Para imprimir apenas os arquivos de rede IPv4 e IPv6, use as opções -i4 e -i6, respec-
tivamente.

Da mesma forma, é possível filtrar por porta, passando para a opção -i (ou -i@ip-address) o
argumento :port:

root@debian10:/tmp# lsof -i :22


COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 554 root 3u IPv4 18629 0t0 TCP *:ssh (LISTEN)
sshd 554 root 4u IPv6 18640 0t0 TCP *:ssh (LISTEN)
sshd 2574 root 3u IPv4 46056 0t0 TCP debian10.linuxvmimages.local:ssh
->192.168.100.23:52118 (ESTABLISHED)
506 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

sshd 2691 debian 3u IPv4 46056 0t0 TCP debian10.linuxvmimages.local:ssh


->192.168.100.23:52118 (ESTABLISHED)

Ao incluir mais de uma porta, nós as separamos com vírgulas (os intervalos são especificados
com um traço):

root@debian10:/tmp# lsof [email protected]:22,80


COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 2574 root 3u IPv4 46056 0t0 TCP debian10.linuxvmimages.local:ssh
->192.168.100.23:52118 (ESTABLISHED)
sshd 2691 debian 3u IPv4 46056 0t0 TCP debian10.linuxvmimages.local:ssh
->192.168.100.23:52118 (ESTABLISHED)

O lsof tem uma quantidade impressionante de opções disponíveis. Para saber mais,
consulte a página de manual.

O próximo na lista de comandos de rede é fuser. Seu propósito principal é encontrar um


“usuário do arquivo”, o que envolve saber quais processos estão acessando quais arquivos;
ele também fornece algumas outras informações, como o tipo de acesso. Por exemplo, para
verificar o diretório de trabalho atual, basta executar fuser .. Mas quando precisamos de mais
informações, é aconselhável usar a opção verbose (-v ou –verbose):

root@debian10:/tmp# fuser .
/tmp: 2924c
root@debian10:/tmp# fuser -v .
USER PID ACCESS COMMAND
/tmp: root kernel mount /tmp
root 2924 ..c.. bash

Vamos detalhar a saída:

• Arquivo: O arquivo sobre o qual estamos obtendo informações (/root);


• Coluna USER: O proprietário do arquivo (root);
• Coluna PID: O identificador do processo (580);
• Coluna ACCESS: Tipo de acesso (..c..). Ele pode ser:
– c: Diretório atual;
– e: Executável em execução;
– f: Arquivo aberto (omitido no modo de exibição padrão);
– F: Arquivo aberto para escrita (omitido no modo de exibição padrão);
507 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

– r: Diretório raiz;
– m: Arquivo mmap ou biblioteca compartilhada;
– .: Espaço reservado (omitido no modo de exibição padrão).
• Coluna COMMAND: O comando afiliado ao arquivo (bash).

Com a opção -n (ou –namespace), podemos encontrar informações sobre portas/sockets de


rede. Também é necessário fornecer o protocolo de rede e o número da porta. Assim, para
obter informações sobre o servidor SSH, o comando seria o seguinte:

root@debian10:/tmp# fuser -vn tcp 22


USER PID ACCESS COMMAND
22/tcp: root 554 F.... sshd
root 2574 F.... sshd
debian 2691 F.... sshd

fuser também pode ser usado para eliminar os processos que estão acessando o arquivo,
com as opções -k ou –kill (p. ex.: fuser -k 80/tcp). Consulte a página de manual para
saber mais detalhes.

Vamos olhar o netstat agora. O netstat é uma ferramenta de rede muito versátil usada
principalmente para imprimir “estatísticas de rede”.

Executado sem opções, netstat exibe as conexões ativas da Internet e os sockets Unix. Devido
ao tamanho da lista, vale a pena canalizar a saída para less:

Active Internet connections (w/o servers)


Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 debian10.linuxvmima:ssh 192.168.100.23:52118 ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 3 [ ] DGRAM 12170 /run/systemd/notify
unix 2 [ ] DGRAM 12185 /run/systemd/journal/syslog
unix 6 [ ] DGRAM 12192 /run/systemd/journal/socket
unix 21 [ ] DGRAM 12204 /run/systemd/journal/dev-log
unix 2 [ ] DGRAM 25027 /run/user/1000/systemd/notify

Para listar apenas as portas e sockets “ouvintes”, usamos as opções -l ou –listening. As


opções -t/–tcp e -u/–udp podem ser adicionadas para filtrar pelos protocolos TCP e UDP,
respectivamente (elas também podem ser combinadas no mesmo comando). Da mesma forma,
-e/–extend exibe informações adicionais:
508 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/tmp# netstat -lu


Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 0.0.0.0:59828 0.0.0.0:*
udp 0 0 0.0.0.0:mdns 0.0.0.0:*
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
udp6 0 0 [::]:58016 [::]:*
udp6 0 0 [::]:mdns [::]:*

root@debian10:/tmp# netstat -lt


Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN

root@debian10:/tmp# netstat -lute


Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State User
Inode
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN root
18629
tcp6 0 0 [::]:ssh [::]:* LISTEN root
18640
udp 0 0 0.0.0.0:59828 0.0.0.0:* avahi
17678
udp 0 0 0.0.0.0:mdns 0.0.0.0:* avahi
17676
udp 0 0 0.0.0.0:bootpc 0.0.0.0:* root
42129
udp 0 0 0.0.0.0:bootpc 0.0.0.0:* root
19584
udp6 0 0 [::]:58016 [::]:* avahi
17679
udp6 0 0 [::]:mdns [::]:* avahi
17677

Se você omitir a opção -l, apenas as conexões estabelecidas serão mostradas:

root@debian10:/tmp# netstat -ute


Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State User
Inode
tcp 0 0 debian10.linuxvmima:ssh 192.168.100.23:52118 ESTABLISHED root
46056

Se você está interessado apenas em informações numéricas sobre portas e hosts, pode usar a
opção -n ou –numeric para imprimir apenas os números de portas e endereços IP. Note como
509 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

ssh se transforma em 22 ao adicionarmos -n ao comando acima:

root@debian10:/tmp# netstat -uten


Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State User
Inode
tcp 0 0 192.168.100.128:22 192.168.100.23:52118 ESTABLISHED 0
46056

Como vemos, é possível tornar os comandos netstat muito úteis e produtivos combinando
algumas de suas opções. Navegue pelas páginas de manual para aprender mais e encontrar as
combinações que melhor atendem às suas necessidades.

Finalmente, vamos falar do nmap—ou “mapeador de rede”. Poderosíssimo, este scanner de


porta é executado especificando-se um endereço IP ou nome de host:

root@debian10:/tmp# nmap localhost


Starting Nmap 7.70 ( https://nmap.org ) at 2021-07-13 11:17 CDT
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000054s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 999 closed ports
PORT STATE SERVICE
22/tcp open ssh

Nmap done: 1 IP address (1 host up) scanned in 1.84 seconds

Além de um host único, o nmap permite escanear:

• Múltiplos hosts: Separando-os com espaços (p. ex.: nmap localhost 192.168.1.7);
• Intervalos de hosts: Usando um traço (p. ex.: nmap 192.168.1.3-20);
• subredes: Usando um curinga ou notação CIDR (p. ex.: nmap 192.168.1. * ou nmap
192.168.1.0/24). Podemos excluir determinados hosts (p. ex.: nmap 192.168.1.0/24
–exclude 192.168.1.7).

Para escanear uma porta específica, use a opção -p seguida pelo número da porta ou nome
do serviço (nmap -p 22 e nmap -p ssh terão a mesma saída):

root@debian10:/tmp# nmap -p 22 localhost


Starting Nmap 7.70 ( https://nmap.org ) at 2021-07-13 11:19 CDT
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00018s latency).
Other addresses for localhost (not scanned): ::1

PORT STATE SERVICE


510 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

22/tcp open ssh

Nmap done: 1 IP address (1 host up) scanned in 0.37 seconds

Também podemos escanear várias portas ou intervalos de portas usando vírgulas e travessões,
respectivamente:

root@debian10:/tmp# nmap -p ssh,80 localhost


Starting Nmap 7.70 ( https://nmap.org ) at 2021-07-13 11:19 CDT
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00010s latency).
Other addresses for localhost (not scanned): ::1

PORT STATE SERVICE


22/tcp open ssh
80/tcp closed http

Nmap done: 1 IP address (1 host up) scanned in 0.36 seconds


root@debian10:/tmp# nmap -p 22-80 localhost
Starting Nmap 7.70 ( https://nmap.org ) at 2021-07-13 11:19 CDT
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000058s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 58 closed ports
PORT STATE SERVICE
22/tcp open ssh

Nmap done: 1 IP address (1 host up) scanned in 1.63 seconds

Duas outras opções importantes e úteis do nmap são:

• -F: Executar um escaneamento rápido das 100 portas mais comuns;


• -v: Obter uma saída detalhada (-vv imprime uma saída mais detalhada ainda).

O nmap é capaz de executar comandos bastante complexos usando vários tipos de


escaneamento. No entanto, esse tópico está fora do escopo desta lição.

Limites em logins de usuário, processos e uso de memória


Os recursos de um sistema Linux não são ilimitados, e portanto, como administrador do
sistema, você deve garantir um bom equilíbrio entre os limites do usuário no uso dos recursos
e o funcionamento adequado do sistema operacional. O ulimit pode ajudá-lo nesse aspecto.

O ulimit lida com os limites soft (flexíveis) e hard (rígidos), especificados pelas opções -S e
-H, respectivamente. Quando executado sem opções ou argumentos, o ulimit exibe os blocos
511 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

de arquivos flexíveis do usuário atual:

root@debian10:/tmp# ulimit
unlimited

Com a opção -a, o ulimit mostra todos os limites flexíveis atuais (o mesmo que -Sa); para
exibir todos os limites rígidos atuais, use -Ha:

root@debian10:/tmp# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 1765
max locked memory (kbytes, -l) 65536
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 1765
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

root@debian10:/tmp# ulimit -Ha


core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 1765
max locked memory (kbytes, -l) 65536
max memory size (kbytes, -m) unlimited
open files (-n) 1048576
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) unlimited
cpu time (seconds, -t) unlimited
max user processes (-u) 1765
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

Os recursos de shell disponíveis são especificados por opções como:

• -b: Tamanho máximo do buffer do socket;


• -f: Tamanho máximo dos arquivos escritos pelo shell e seus processos-filhos;
512 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

• -l: Tamanho máximo da memória que pode ser bloqueada;


• -m: Tamanho máximo do conjunto residente (RSS, resident set size)—a porção atual
da memória mantida por um processo na memória principal (RAM);
• -v: Quantidade máxima de memória virtual;
• -u: Número máximo de processos disponíveis para um único usuário.

Assim, para exibir os limites, usaríamos ulimit seguido por -S (soft) ou -H (hard) e a opção
referente ao recurso; se nenhum -S ou -H for fornecido, os limites flexíveis (soft) serão mostra-
dos:

root@debian10:/tmp# ulimit -u
1765
root@debian10:/tmp# ulimit -Su
1765
root@debian10:/tmp# ulimit -Hu
1765

Da mesma maneira, para definir novos limites para um recurso determinado, especificamos -S
ou -H seguidos pela opção de recurso desejada e o novo valor. Esse valor pode ser um número
ou as palavras especiais soft (limite flexível atual), hard (limite rígido atual) ou unlimited (sem
limite). Se nem -S nem -H forem especificados, ambos os limites serão definidos. Por exemplo,
vamos primeiro ler o valor do tamanho máximo atual para os arquivos gravados pelo shell e
seus filhos:

root@debian10:/tmp# ulimit -Sf


unlimited
root@debian10:/tmp# ulimit -Hf
unlimited

Agora, vamos alterar o valor de unlimited para 500 sem especificar -S ou -H. Observe como
os limites flexíveis e rígidos são alterados:

root@debian10:/tmp# ulimit -f 500


root@debian10:/tmp# ulimit -Sf
500
root@debian10:/tmp# ulimit -Hf
500

Por fim, diminuímos apenas o limite flexível para blocos de 200:

root@debian10:/tmp# ulimit -Sf 200


513 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/tmp# ulimit -Sf


200
root@debian10:/tmp# ulimit -Hf
500

Os limites rígidos só podem ser aumentados pelo usuário root. Por outro lado, os usuários
comuns podem diminuir os limites rígidos e aumentar os limites flexíveis até o valor dos
limites rígidos. Para tornar persistentes os novos valores de limites após a reinicialização, eles
devem ser gravados no arquivo /etc/security/limits.conf. Este também é o arquivo usado pelo
administrador para aplicar restrições a usuários específicos.

Saiba que não existe uma página de manual para ulimit. Trata-se de uma ferramenta
nativa do bash e, por isso, é preciso consultar a man page do bash para saber mais
sobre ela.

Lidando com usuários conectados


Outra de suas funções como administrador do sistema envolve manter o controle dos usuários
conectados. Há três utilitários que podem ajudá-lo com essas tarefas: last, who e w.

O last imprime uma lista dos últimos usuários logados, com as informações mais recentes no
topo:

root@debian10:/tmp# last
debian pts/1 192.168.100.23 Tue Jul 13 10:29 still logged in
debian tty2 tty2 Tue Jul 13 10:26 still logged in
reboot system boot 4.19.0-13-amd64 Tue Jul 13 10:21 still running
debian pts/1 10.11.10.245 Thu Jul 8 14:15 - crash (4+20:05)
debian tty2 tty2 Thu Jul 8 14:15 - crash (4+20:06)
wtmp begins Sat Feb 6 03:20:38 2021

A linha wtmp begins Sat Feb 6 03:20:38 2021 se refere a /var/log/wtmp, o arquivo
especial de log no qual last obtém as informações.

Podemos passar um nome de usuário a last para ver apenas as entradas referentes a ele:

root@debian10:/tmp# last debian


debian pts/1 192.168.100.23 Tue Jul 13 10:29 still logged in
debian tty2 tty2 Tue Jul 13 10:26 still logged in
514 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Em relação à segunda coluna (terminal), pts significa Pseudo Terminal Slave em oposição a
um terminal TeleTYpewriter ou tty; 0 refere-se ao primeiro (a contagem começa em zero).

Para verificar se há tentativas de login incorretas, execute lastb em vez de last.

Os utilitários who e w concentram-se nos usuários atualmente logados e são bastante semel-
hantes. O primeiro exibe quem está conectado, ao passo que o último também exibe infor-
mações sobre o que eles estão fazendo.

Quando executado sem opções, o who exibe quatro colunas correspondentes ao usuário conec-
tado, terminal, data e hora e nome do host:

root@debian10:/tmp# who
debian tty2 2021-07-13 10:26 (tty2)
debian pts/1 2021-07-13 10:29 (192.168.100.23)

O who aceita uma série de opções, dentre as quais podemos destacar as seguintes:

• -b,–boot: Exibe a hora da última inicialização do sistema;


• -r,–runlevel: Mostra o nível de execução atual;
• -H,–heading: Imprime o cabeçalho das colunas.

Comparado ao who, o w fornece uma saída um pouco mais detalhada:

root@debian10:/tmp# w
11:45:40 up 1:24, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
debian tty2 tty2 10:26 1:23m 59.26s 13.12s /usr/bin/gnome-software --
gapplication-service
debian pts/1 192.168.100.23 10:29 0.00s 0.80s 0.04s sshd: debian [priv]

A linha superior fornece informações sobre a hora atual (17:56:12), há quanto tempo o sistema
está ativo (up 40 min), o número de usuários atualmente logados (2 users) e os números
médios de carga (load average: 0.04, 0.12, 0.09). Esses valores referem-se ao número médio
de trabalhos na fila de execução nos últimos 1, 5 e 15 minutos, respectivamente.

Vêm em seguida oito colunas; elas se dividem desta forma:

• USER: Nome de login do usuário;


• TTY: Nome do terminal em que o usuário está;
515 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

• FROM: Host remoto a partir do qual o usuário se logou;


• LOGIN@: Tempo de login;
• IDLE: Tempo ocioso;
• JCPU: Tempo usado por todos os processos ligados ao tty (incluindo os trabalhos
atualmente em execução em segundo plano);
• PCPU: Tempo usado pelo processo atual (que aparece sob WHAT);
• WHAT: Linha de comando do processo atual.

Como no caso do who, podemos passar nomes de usuários ao w:

root@debian10:/tmp# w debian
11:47:16 up 1:25, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
debian tty2 tty2 10:26 1:25m 59.53s 13.14s /usr/bin/gnome-software --
gapplication-service
debian pts/1 192.168.100.23 10:29 2.00s 0.80s 0.04s sshd: debian [priv]

Configuração e uso básicos do sudo


Como já observado nesta lição, su permite alternar para qualquer outro usuário no sistema,
desde que você forneça a senha do usuário de destino. No caso do usuário root, ter sua senha
distribuída ou conhecida por (muitos) usuários põe o sistema em risco, e é uma péssima prática
de segurança. O uso básico de su é su - nome-de-usuário. Ao alternar para root, porém, o
nome de usuário de destino é opcional:

debian@debian10:~$ su - root
Password:
root@debian10:~# logout
debian@debian10:~$ su -
Password:
root@debian10:/home/debian#

O uso do traço (-) garante que o ambiente do usuário de destino seja carregado. Sem ele,
será mantido o ambiente do antigo usuário:

debian@debian10:~$ su
Password:
root@debian10:/home/debian#

Por outro lado, existe o comando sudo. Com ele, é possível executar um comando como
516 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

usuário root ou qualquer outro usuário. Do ponto de vista da segurança, sudo é uma opção
muito melhor do que su, pois apresenta duas vantagens principais:

1. Para executar um comando como root, você não precisa da senha do usuário root, mas
apenas a do usuário atual, em conformidade com uma política de segurança. A política
de segurança padrão é sudoers, especificada em /etc/sudoers e /etc/sudoers.d/*;
2. O sudo permite executar comandos simples com privilégios elevados em vez de lançar
um novo subshell para root, como faria su.

O uso básico de sudo é sudo -u target-username command. Porém, para executar um comando
como usuário root, a opção -u target-username não é necessária:

debian@debian10:~$ sudo -u debian whoami


debian
debian@debian10:~$ sudo whoami
root
debian@debian10:~$

O sudoers usa uma marca temporal por usuário (e por terminal) para ocultar as cre-
denciais, sendo assim possível usar o sudo sem uma senha por um período padrão
de quinze minutos. Esse valor padrão pode ser modificado adicionando-se a opção
timestamp_timeout como configuração de Defaults em /etc/sudoers (p. ex.: De-
faults timestamp_timeout=1 define o tempo limite do cache de credenciais como um
minuto).

O arquivo /etc/sudoers
O arquivo de configuração principal do sudo é /etc/sudoers (também existe o diretório /etc/-
sudoers.d). É ali que os privilégios de sudo dos usuários são determinados. Em outras palavras,
aqui você especifica quem pode executar quais comandos, sob quais nomes de usuário e em
quais máquinas, bem como outras configurações. A sintaxe usada é a seguinte:

# User privilege specification


root ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command


%sudo ALL=(ALL:ALL) NOPASSWD:ALL

A especificação de privilégio para o usuário root é ALL=(ALL:ALL) ALL. Isso se traduz assim:
517 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

o usuário root (root) pode se logar com todos os hosts (ALL), em nome de todos os usuários
e todos os grupos ((ALL:ALL)), além de executar todos os comandos (ALL). O mesmo vale
para os membros do grupo sudo, note como os nomes de grupos são identificados com um
símbolo de porcentagem (%).

Assim, para que a usuário debian seja capaz de verificar o status de apache2 de qualquer host
em nome de qualquer usuário ou grupo, adicionaríamos a seguinte linha ao arquivo sudoers:

debian ALL=(ALL:ALL) /usr/bin/systemctl status apache2

Para evitar o debian o incômodo de precisar fornecer sua senha para executar o comando
systemctl status apache2, modificamos a linha desta maneira:

debian ALL=(ALL:ALL) NOPASSWD: /usr/bin/systemctl status apache2

Digamos que agora você queira restringir seus hosts a 192.168.1.7 e permitir que root execute
systemctl status apache2 no nome do usuário debian. A linha teria de ser modificada desta
forma:

root 192.168.1.7=(debian) /usr/bin/systemctl status apache2

Vamos então verificar o status do servidor SSH como o usuário debian:

debian@debian10:~$ sudo -u debian systemctl status ssh●


ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2021-07-13 10:21:52 CDT; 1h 37min ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 547 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 554 (sshd)
Tasks: 1 (limit: 529)
Memory: 1.2M
CGroup: /system.slice/ssh.service
`-554 /usr/sbin/sshd -D

Se debian fosse promovido a sysadmin e você quisesse conceder a ele todos os privilégios, a
maneira mais fácil seria incluí-la no grupo especial sudo com usermod e a opção -G (e talvez
também a opção -a, que garante que o usuário não seja removido de nenhum outro grupo ao
518 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

qual possa pertencer):

root@debian10:/home/debian# sudo useradd -aG sudo debian

Na família de distribuições Red Hat, o grupo wheel é equivalente ao grupo especial


de administradores sudo dos sistemas Debian.

Em vez de editar /etc/sudoers diretamente, use simplesmente o comando visudo como root
(p. ex. visudo), que abre /etc/sudoers usando o editor de texto predefinido. Para alterar o
editor de texto padrão, adicione a opção editor como configuração de Defaults em /etc/su-
doers.

Outra alternativa é especificar um editor de texto por meio da variável de ambiente


EDITOR usando visudo (e.g.: EDITOR=/usr/bin/nano visudo)

Além dos usuários e grupos, também podemos utilizar aliases em /etc/sudoers. É possível
definir três categorias principais de aliases: aliases de host (Host_Alias), aliases de usuário
(User_Alias) e aliases de comando (Cmnd_Alias). Eis um exemplo:

# Host alias specification

Host_Alias SERVERS = 192.168.1.7, server1, server2

# User alias specification

User_Alias REGULAR_USERS = john, mary, alex

User_Alias PRIVILEGED_USERS = mimi, alex

User_Alias ADMINS = carol, %sudo, PRIVILEGED_USERS, !REGULAR_USERS

# Cmnd alias specification

Cmnd_Alias SERVICES = /usr/bin/systemctl *

# User privilege specification


root ALL=(ALL:ALL) ALL
ADMINS SERVERS=SERVICES

# Allow members of group sudo to execute any command


%sudo ALL=(ALL:ALL) ALL

A partir deste arquivo sudoers de amostra, vamos explicar os três tipos de aliases com um
519 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

pouco mais de detalhes:

• Aliases de host: Incluem uma lista separada por vírgulas de nomes de host, endereços
IP, redes e grupos de rede (precedidos por +). Máscaras de rede também podem estar
especificadas. O alias de host SERVERS inclui um endereço IP e dois nomes de host:

Host_Alias SERVERS = 192.168.1.7, server1, server2

• Aliases de usuário: Incluem uma lista separada por vírgulas de usuários especificados
como nomes de usuários, grupos (precedidos por %) e grupos de rede (precedidos por +).
Para excluir usuários específicos, usamos !. O alias de usuário ADMINS, por exemplo,
inclui o usuário debian, os membros do grupo sudo e os membros do alias de usuário
PRIVILEGE_USERS que não pertencem ao alias de usuário REGULAR_USERS:

User_Alias ADMINS = debian, %sudo, PRIVILEGED_USERS, !REGULAR_USERS

• Aliases de comando: Incluem uma lista separada por vírgulas de comandos e diretórios.
Se um diretório for especificado, qualquer arquivo que esteja nesse diretório será incluído,
mas os subdiretórios serão ignorados. O alias do comando SERVICES inclui um único
comando com todos os seus subcomandos, conforme especificado pelo asterisco ( * ):

Cmnd_Alias SERVICES = /usr/bin/systemctl *

Como resultado das especificações de alias, a linha ADMINS SERVERS=SERVICES na seção


User privilege specification é traduzida como: todos os usuários pertencentes a ADMINS
podem usar sudo para executar qualquer comando em SERVICES em qualquer servidor em
SERVERS.

Tavez isso possa te ajudar. . .


LSOF

• Fonte: - https://quickref.me/lsof

TCPDUMP

• Fonte: - https://www.comparitech.com/net-admin/tcpdump-cheat-sheet/
520 47. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

NMAP

• Fonte: - https://dementium2.com/admin-da-rede/folha-de-dicas-do-nmap/

SS

• Fonte: - https://br.pinterest.com/pin/426505027211060187/
Fabio Gonçalves De Melo Santana / [email protected]

48
110.2 Configurar a segurança do
host

Introdução
Este capítulo explica quatro maneiras básicas de melhorar a segurança do host:

1. Alguns comandos e definições de configuração básicas para aperfeiçoar a segurança da


autenticação com senhas ocultas;
2. Como usar superdaemons para ouvir conexões de rede de entrada;
3. Verificação dos serviços de rede em busca de daemons desnecessários;
4. Uso de TCP wrappers como uma espécie de firewall simples.

Melhorar a segurança da autenticação com senhas ocultas


Os componentes básicos dos dados da conta de um usuário são armazenados no arquivo /etc/-
passwd. Este arquivo contém sete campos: nome de login, identidade do usuário, identidade
do grupo, senha, comentário (também conhecido como GECOS), localização do diretório ini-
cial e, finalmente, o shell padrão. Uma maneira simples de lembrar a ordem desses campos é
pensar sobre o processo de login de um usuário: primeiro você insere um nome de login, em
segundo lugar o sistema o mapeia em um ID de usuário (uid) e depois em um ID de grupo
(gid). O quarto passo pede uma senha, o quinto consulta o comentário, o sexto entra no
diretório inicial do usuário e o sétimo passo configura o shell padrão.

521
522 48. 110.2 Configurar a segurança do host
Fabio Gonçalves De Melo Santana / [email protected]

Porém, nos sistemas modernos, a senha não é mais armazenada no arquivo /etc/passwd.
Em vez disso, o campo de senha contém apenas um x minúsculo. O arquivo /etc/passwd
precisa ser legível por todos os usuários; portanto, não é uma boa ideia armazenar senhas nele.
O x indica que a senha criptografada (com hash) está na verdade armazenada no arquivo
/etc/shadow. Este arquivo não deve ser legível para todos os usuários.

As configurações de senha são definidas com os comandos passwd e chage. Ambos os co-
mandos alteram a entrada referente ao usuário joatham no arquivo /etc/shadow. Como
superusuário, você pode definir a senha do usuário joatham com o seguinte comando:

debian@debian10:~$ sudo passwd joatham


New password:
Retype new password:
passwd: password updated successfully

Em seguida, o sistema pede que a nova senha seja confirmada duas vezes.

Para listar o tempo de expiração da senha e outras configurações de expiração de senha para
o usuário joatham, use:

debian@debian10:~$ sudo chage -l joatham


Last password change : Jul 13, 2021
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7

Para evitar que o usuário joatham faça login no sistema, o superusuário pode definir uma data
de expiração da senha anterior à data atual. Por exemplo, se a data de hoje fosse 29/03/2020,
poderíamos definir uma data mais antiga para a expiração da senha do usuário:

debian@debian10:~$ sudo chage -E 2020-03-28 joatham

Como alternativa, o superusuário poderia usar:

debian@debian10:~$ sudo passwd -l joatham


passwd: password expiry information changed.
523 48. 110.2 Configurar a segurança do host
Fabio Gonçalves De Melo Santana / [email protected]

para bloquear a conta temporariamente através da opção -l em passwd. Para testar os efeitos
dessas alterações, tente fazer o login como o usuário joatham:

debian@debian10:~$ sudo login joatham


Password:

Login incorrect

Para evitar que todos os usuários, exceto o usuário root, se loguem no sistema temporaria-
mente, o superusuário pode criar um arquivo chamado /etc/nologin. Esse arquivo pode conter
uma mensagem para os usuários notificando-os sobre o motivo pelo qual não podem fazer lo-
gin no momento (por exemplo, notificações de manutenção do sistema). Para saber mais,
consulte man 5 nologin. Note que também existe um comando nologin que pode ser usado
para impedir um login quando definido como o shell padrão de um usuário. Por exemplo:

debian@debian10:~$ sudo usermod -s /sbin/nologin joatham

Como usar um superdaemon para ouvir conexões de rede de entrada


Os serviços de rede, como os servidores web, servidores de email e servidores de impressão,
geralmente funcionam como um serviço autônomo que escuta em uma porta de rede dedicada.
Todos esses serviços autônomos são executados lado a lado. No sistema clássico baseado em
Sys-V-init, cada um desses serviços pode ser controlado pelo comando service. Nos sistemas
atuais baseados em systemd, usamos systemctl para gerenciar o serviço.

Antigamente, a disponibilidade de recursos do computador era muito menor. Não era acon-
selhável executar muitos serviços em modo autônomo ao mesmo tempo. Em vez disso, um
superdaemon era usado para escutar as conexões de rede de entrada e iniciar o serviço apro-
priado sob demanda. Este método de construção de uma conexão de rede era um pouco mais
demorado. inetd e xinetd são superdaemons bastante conhecidos. Nos sistemas atuais basea-
dos em systemd, a unidade systemd.socket pode ser usada de maneira semelhante. Nesta
seção, usaremos o xinetd para interceptar conexões com o daemon sshd e iniciar este daemon
no momento adequado para demonstrar como o superdaemon era usado.

Antes de configurar o serviço xinetd, é necessária uma pequena preparação. Não importa
se você usa um sistema baseado em Debian ou Red Hat. Embora estas explicações tenham
sido testadas no Debian/GNU Linux 9.9, elas devem funcionar em qualquer sistema Linux
atual com systemd sem nenhuma alteração significativa. Primeiro, verifique se os pacotes
openssh-server e xinetd estão instalados. Em seguida, confira se o serviço SSH funciona com:
524 48. 110.2 Configurar a segurança do host
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# systemctl status sshd●


ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2021-07-13 10:21:52 CDT; 4h 42min ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 547 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 554 (sshd)
Tasks: 1 (limit: 529)
Memory: 1.2M
CGroup: /system.slice/ssh.service
`-554 /usr/sbin/sshd -D

Verifique também se o serviço SSH está escutando em sua porta de rede padrão 22:

root@debian10:/home/debian# lsof -i:22


COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 554 root 3u IPv4 18629 0t0 TCP *:ssh (LISTEN)
sshd 554 root 4u IPv6 18640 0t0 TCP *:ssh (LISTEN)
sshd 2574 root 3u IPv4 46056 0t0 TCP debian10.linuxvmimages.local:ssh
->192.168.100.23:52118 (ESTABLISHED)
sshd 2691 debian 3u IPv4 46056 0t0 TCP debian10.linuxvmimages.local:ssh
->192.168.100.23:52118 (ESTABLISHED)

Finalmente, interrompa o serviço SSH com:

root@debian10:/home/debian# systemctl stop sshd.service

No caso de você querer tornar esta mudança permanente, sobrevivendo à reinicialização, use
systemctl disable sshd.service.

Agora você pode criar o arquivo de configuração do xinetd /etc/xinetd.d/ssh com algumas
configurações básicas:

service ssh
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/sbin/sshd
server_args = -i
flags = IPv4
interface = 192.168.178.1
}
525 48. 110.2 Configurar a segurança do host
Fabio Gonçalves De Melo Santana / [email protected]

Reinicie o serviço xinetd com:

$ sudo systemctl restart xinetd.service

Verifique nas conexões SSH de entrada qual serviço está escutando no momento.

$ sudo lsof -i :22


COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xinetd 24098 root 5u IPv4 7345141 0t0 TCP 192.168.178.1:ssh (LISTEN)

Podemos ver que o serviço xinetd assumiu o controle do acesso à porta 22.

Eis mais alguns dados sobre a configuração do xinetd. O arquivo de configuração principal é
/etc/xinetd.conf:

# Simple configuration file for xinetd


#
# Some defaults, and include /etc/xinetd.d/

defaults
{

# Please note that you need a log_type line to be able to use log_on_success
# and log_on_failure. The default is the following :
# log_type = SYSLOG daemon info

includedir /etc/xinetd.d

Além das configurações padrão, há apenas uma diretiva para definir um diretório de inclusão.
Neste diretório você pode definir um arquivo de configuração único para cada serviço que
deseja que o xinetd gerencie. Fizemos isso acima para o serviço SSH e chamamos o arquivo de
/etc/xinetd.d/ssh. O nome dos arquivos de configuração pode ser escolhido arbitrariamente,
exceto por nomes de arquivos que contenham um ponto (.) ou que terminem com um til (~).
Mas é comum atribuir ao arquivo o nome do serviço que se deseja configurar.

Alguns arquivos de configuração no diretório /etc/xinet.d/ já são fornecidos pela distribuição:

$ ls -l /etc/xinetd.d
total 52
-rw-r--r-- 1 root root 640 Feb 5 2018 chargen
-rw-r--r-- 1 root root 313 Feb 5 2018 chargen-udp
526 48. 110.2 Configurar a segurança do host
Fabio Gonçalves De Melo Santana / [email protected]

-rw-r--r-- 1 root root 502 Apr 11 10:18 daytime


-rw-r--r-- 1 root root 313 Feb 5 2018 daytime-udp
-rw-r--r-- 1 root root 391 Feb 5 2018 discard
-rw-r--r-- 1 root root 312 Feb 5 2018 discard-udp
-rw-r--r-- 1 root root 422 Feb 5 2018 echo
-rw-r--r-- 1 root root 304 Feb 5 2018 echo-udp
-rw-r--r-- 1 root root 312 Feb 5 2018 servers
-rw-r--r-- 1 root root 314 Feb 5 2018 services
-rw-r--r-- 1 root root 569 Feb 5 2018 time
-rw-r--r-- 1 root root 313 Feb 5 2018 time-udp

Esses arquivos podem ser usados como modelos no raro caso de ser necessário usar alguns
serviços legados, como o daytime, uma implementação ainda incipiente de um servidor de
horário. Todos esses arquivos de modelo contêm a diretiva disable = yes.

Eis mais alguns detalhes sobre as diretivas usadas para ssh no arquivo de exemplo /etc/x-
inetd.d/ssh, acima.

service ssh
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/sbin/sshd
server_args = -i
flags = IPv4
interface = 192.168.178.1
}

• service: Lista o serviço que o xinetd deve controlar. Podemos usar um número de porta,
como 22, ou o nome mapeado para o número da porta em /etc/services, por exemplo
ssh;
• {: Abrimos uma chave para iniciar as configurações detalhadas;
• disable: Para ativar essas configurações, defina esta diretiva como no. Se quiser desabil-
itar a configuração temporariamente, use yes;
• socket_type: Escolha stream para os sockets TCP ou dgram para os sockets UDP e
outros;
• protocol: Escolha TCP ou UDP;
• wait: Para as conexões TCP, esta diretiva costuma estar definida como no;
• user: O serviço iniciado nesta linha será propriedade deste usuário;
• server: Caminho completo para o serviço que deve ser iniciado por xinetd;
• server_args: Aqui, podemos adicionar opções para o serviço. Quando iniciados por um
super-servidor, muitos serviços requerem uma opção especial. Para o SSH, essa opção
seria -i;
527 48. 110.2 Configurar a segurança do host
Fabio Gonçalves De Melo Santana / [email protected]

• flags: Você pode escolher IPv4, IPv6 e outros;


• interface: A interface de rede que o xinetd deve controlar. Nota: você também pode
escolher a diretiva bind, que é simplesmente um sinônimo para interface;
• }: Por fim, fechamos a chave.

Os sucessores dos serviços iniciados pelo super-servidor xinetd são as unidades de socket do
systemd. Configurar essas unidades é muito simples, porque já existe uma unidade de socket
do systemd predefinida para SSH. É preciso garantir que os serviços xinetd e SSH não estejam
em execução.

Agora basta iniciar a unidade de socket SSH:

$ sudo systemctl start ssh.socket

Para verificar qual serviço está escutando agora na porta 22, usamos lsof novamente. Observe
que a opção -P foi usada para mostrar o número da porta em vez do nome do serviço na saída:

$ sudo lsof -i :22 -P


COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 57u IPv6 14730112 0t0 TCP *:22 (LISTEN)

Para completar esta sessão, tentamos fazer o login no servidor com um cliente SSH à escolha.

Em busca de daemons desnecessários nos serviços


Por motivos de segurança, bem como para controlar os recursos do sistema, é importante ter
uma visão geral dos serviços que estão em execução. Serviços desnecessários e não utilizados
devem ser desativados. Por exemplo, caso você não precise distribuir páginas da web, não há
necessidade de executar um servidor web como o Apache ou o nginx.

Nos sistemas baseados em SyS-V-init, podemos verificar o status de todos os serviços com o
seguinte comando:

$ sudo service --status-all

Verifique se cada um dos serviços listados na saída do comando é necessário e desative todos
os que forem desnecessários com (para sistemas baseados em Debian):
528 48. 110.2 Configurar a segurança do host
Fabio Gonçalves De Melo Santana / [email protected]

$ sudo update-rc.d SERVICE-NAME remove

Ou, nos sistemas baseados em Red Hat:

$ sudo chkconfig SERVICE-NAME off

Nos sistemas modernos baseados em systemd, podemos usar o seguinte comando para listar
todos os serviços em execução:

$ systemctl list-units --state active --type service

Em seguida, desativamos as unidades de serviço desnecessárias com:

$ sudo systemctl disable UNIT --now

Este comando interrompe o serviço e o remove da lista de serviços, evitando assim que seja
lançado na próxima inicialização do sistema.

Além disso, para obter um levantamento dos serviços de rede que estão à escuta, podemos
usar netstat em sistemas mais antigos (desde que o pacote net-tools esteja instalado):

$ netstat -ltu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:mysql 0.0.0.0:* LISTEN
tcp6 0 0 [::]:http [::]:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*

Ou, nos sistemas modernos, rodamos o comando equivalente ss (que significa “serviços de
socket”):

$ ss -ltu
Netid State Recv-Q Send-Q Local Address:Port Peer
Address:Port
udp UNCONN 0 0 0.0.0.0:bootpc
529 48. 110.2 Configurar a segurança do host
Fabio Gonçalves De Melo Santana / [email protected]

0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:ssh
0.0.0.0:*
tcp LISTEN 0 80 127.0.0.1:mysql
0.0.0.0:*
tcp LISTEN 0 128 *:http
*:*
tcp LISTEN 0 128 [::]:ssh
[::]:*

Usando TCP wrappers como uma espécie de firewall simples


Nos tempos em que não havia nenhum firewall disponível para Linux, TCP wrappers eram
usados para proteger as conexões de rede em um host. Hoje em dia muitos programas não
obedecem mais a TCP wrappers. Nas distribuições recentes baseadas em Red Hat (por
exemplo, o Fedora 29), o suporte a TCP wrappers foi removido completamente. Porém, para
oferecer suporte aos sistemas Linux legados que ainda usam TCP wrappers, vale a pena ter
algum conhecimento básico sobre essa tecnologia específica.

Usaremos novamente o serviço SSH como exemplo básico. O serviço em nosso host de exemplo
deve ser acessível apenas a partir da rede local. Primeiro, verificamos se o daemon SSH usa
a biblioteca libwrap, que oferece suporte a TCP wrappers:

$ ldd /usr/sbin/sshd | grep "libwrap"


libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007f91dbec0000)

A seguir, adicionamos a seguinte linha ao arquivo /etc/hosts.deny:

sshd: ALL

Finalmente, configuramos uma exceção no arquivo /etc/hosts.allow para conexões SSH da


rede local:

sshd: LOCAL

As alterações entram em vigor imediatamente, sem a necessidade de reiniciar qualquer serviço.


Para verificar, use o cliente ssh.
530 48. 110.2 Configurar a segurança do host
Fabio Gonçalves De Melo Santana / [email protected]

Tavez isso possa te ajudar. . .


HARDENING

• Fonte: - https://www.xmind.net/m/ZBi6/
110.3 Proteção de dados com

531
criptografia
49
Fabio Gonçalves De Melo Santana / [email protected]
Fabio Gonçalves De Melo Santana / [email protected]

50
Introdução
SSH é um protocolo seguro usado como meio principal de conexão remota a servidores Linux.
Ele fornece uma interface baseada em texto gerando um shell remoto. Depois de conectar,
todos os comandos que você digita em seu terminal local são enviados para o servidor remoto
e executados lá.

Visão geral do SSH


A maneira mais comum de se conectar a um servidor Linux remoto é por meio de SSH. SSH
significa Secure Shell e fornece uma maneira segura e protegida de executar comandos, fazer
alterações e configurar serviços remotamente. Quando você se conecta por SSH, você efetua
login usando uma conta existente no servidor remoto.

Como funciona o SSH


1. Quando você se conecta por SSH, você entra em uma sessão de shell, que é uma interface
baseada em texto onde você pode interagir com seu servidor. Durante a sessão SSH,
todos os comandos digitados no terminal local são enviados por meio de um túnel SSH
criptografado e executados no servidor;
2. A conexão SSH é implementada usando um modelo cliente-servidor. Isso significa que
para que uma conexão SSH seja estabelecida, a máquina remota deve estar executando
um software chamado SSH daemon. Este software escuta as conexões em uma porta
de rede específica, autentica as solicitações de conexão e gera o ambiente apropriado,

532
533 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

se o usuário fornecer as credenciais corretas;


3. O computador do usuário deve ter um cliente SSH. Este é um software que sabe como
se comunicar usando o protocolo SSH e pode receber informações sobre o host remoto
ao qual se conectar, o nome de usuário a ser usado e as credenciais que devem ser
passadas para autenticação. O cliente também pode especificar certos detalhes sobre o
tipo de conexão que gostaria de estabelecer.

Como o SSH autentica usuários


1. Os clientes geralmente se autenticam usando senhas (menos seguras e não recomen-
dadas) ou chaves SSH, que são muito seguras;
2. Os logins de senha são criptografados e fáceis de entender para novos usuários. No en-
tanto, bots automatizados e usuários mal-intencionados frequentemente tentarão repeti-
damente se autenticar em contas que permitem logins baseados em senha, o que pode
comprometer a segurança. Por esse motivo, recomendamos sempre configurar a auten-
ticação baseada em chave SSH para a maioria das configurações;
3. As chaves SSH são um conjunto correspondente de chaves criptográficas que podem
ser usadas para autenticação. Cada conjunto contém uma chave pública e uma chave
privada. A chave pública pode ser compartilhada livremente sem preocupação, enquanto
a chave privada deve ser cuidadosamente guardada e nunca exposta a ninguém;
4. Para autenticar usando chaves SSH, o usuário deve ter um par de chaves SSH em seu
computador local. No servidor remoto, a chave pública deve ser copiada para um arquivo
no diretório pessoal do usuário em ~/.ssh/authorized_keys. Este arquivo contém uma
lista de chaves públicas, uma por linha, que estão autorizadas a entrar nesta conta;
5. Quando um cliente se conecta ao host, desejando usar a autenticação de chave SSH, ele
informará o servidor dessa intenção e informará ao servidor qual chave pública usar. O
servidor então verifica seu authorized_keysarquivo em busca da chave pública, gera uma
string aleatória e a criptografa usando a chave pública. Esta mensagem criptografada
só pode ser descriptografada com a chave privada associada. O servidor enviará essa
mensagem criptografada ao cliente para testar se ele realmente possui a chave privada
associada;
6. Ao receber esta mensagem, o cliente irá descriptografá-la usando a chave privada e
combinar a string aleatória que é revelada com um ID de sessão negociado anteriormente.
Em seguida, ele gera um hash MD5 desse valor e o transmite de volta ao servidor. O
servidor já tinha a mensagem original e o ID da sessão, então ele pode comparar um
hash MD5 gerado por esses valores e determinar que o cliente deve ter a chave privada.

Gerando e trabalhando com chaves SSH Esta seção cobrirá como gerar chaves SSH em uma
máquina cliente e distribuir a chave pública aos servidores onde devem ser usadas. Esta é uma
boa seção para começar, caso você não tenha gerado chaves anteriormente, devido à maior
segurança que permite para conexões futuras.
534 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Gerando um par de chaves SSH


Gerar um novo par de chaves SSH públicas e privadas em seu computador local é o primeiro
passo para a autenticação com um servidor remoto sem uma senha. A menos que haja um
bom motivo para não o fazer, você deve sempre autenticar usando chaves SSH.

Vários algoritmos criptográficos podem ser usados para gerar chaves SSH, incluindo RSA, DSA
e ECDSA. As chaves RSA são geralmente preferidas e são o tipo de chave padrão.

Para gerar um par de chaves RSA em seu computador local, digite:

root@debian10:/home/debian# ssh-keygen

Generating public/private rsa key pair.


Enter file in which to save the key (/home/demo/.ssh/id_rsa):

Este prompt permite que você escolha o local para armazenar sua chave privada RSA. Pressione
ENTER para deixar isso como o padrão, o que os armazenará no .sshdiretório oculto no
diretório inicial do usuário. Deixar o local padrão selecionado permitirá que seu cliente SSH
encontre as chaves automaticamente.

Enter passphrase (empty for no passphrase):


Enter same passphrase again:

O próximo prompt permite que você insira uma frase secreta de comprimento arbitrário para
proteger sua chave privada. Por padrão, você terá que inserir qualquer senha definida aqui toda
vez que usar a chave privada, como uma medida de segurança adicional. Sinta-se à vontade
para pressionar ENTER para deixar em branco se não quiser uma senha longa. Porém, lembre-
se de que isso permitirá que qualquer pessoa que obtenha o controle de sua chave privada
faça o login em seus servidores.

Se você optar por inserir uma frase secreta, nada será exibido enquanto você digita. Esta é
uma precaução de segurança.

Your identification has been saved in /root/.ssh/id_rsa.


Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
8c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a root@here
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
535 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

| |
| + |
| o S . |
| o . * + |
| o + = O . |
| + = = + |
| ....Eo+ |
+-----------------+

Este procedimento gerou um par de chaves RSA SSH, localizado no .sshdiretório oculto dentro
do diretório inicial do usuário. Esses arquivos são:

• ~/.ssh/id_rsa: A chave privada. NÃO COMPARTILHE ESTE ARQUIVO!


• ~/.ssh/id_rsa.pub: A chave pública associada. Isso pode ser compartilhado livremente
sem consequências.

Gerando um par de chaves SSH com um número maior de bits


As chaves SSH têm 2048 bits por padrão. Isso geralmente é considerado bom o suficiente
para a segurança, mas você pode especificar um número maior de bits para uma chave mais
protegida.

Para fazer isso, inclua o -bargumento com o número de bits que deseja. A maioria dos
servidores oferece suporte a chaves com comprimento de pelo menos 4096 bits. Chaves mais
longas podem não ser aceitas para fins de proteção DDOS:

root@debian10:/home/debian# ssh-keygen -b 4096

Se você já criou uma chave diferente, será perguntado se deseja substituir a chave anterior:

Overwrite (y/n)?

Se você escolher “sim”, sua chave anterior será substituída e você não poderá mais fazer login
nos servidores usando essa chave. Por isso, certifique-se de substituir as chaves com cuidado.

Removendo ou Alterando a Senha em uma Chave Privada


Se você gerou uma frase secreta para sua chave privada e deseja alterá-la ou removê-la, pode
fazê-lo facilmente.
536 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Nota: Para alterar ou remover a frase secreta, você deve conhecer a frase secreta original. Se
você perdeu a frase secreta da chave, não há recurso e você terá que gerar um novo par de
chaves.

Para alterar ou remover a senha, basta digitar:

root@debian10:/home/debian# ssh-keygen -p

Enter file in which the key is (/root/.ssh/id_rsa):

Você pode digitar a localização da chave que deseja modificar ou pressionar ENTER para
aceitar o valor padrão:

Enter old passphrase:

Digite a senha antiga que deseja alterar. Em seguida, será solicitada uma nova senha longa:

Enter new passphrase (empty for no passphrase):


Enter same passphrase again:

Aqui, digite sua nova senha ou pressione ENTER para removê-la.

Exibindo a impressão digital da chave SSH


Cada par de chaves SSH compartilha uma única “impressão digital” criptográfica que pode
ser usada para identificar as chaves de forma exclusiva. Isso pode ser útil em várias situações.

Para descobrir a impressão digital de uma chave SSH, digite:

root@debian10:/home/debian# ssh-keygen -l

Enter file in which the key is (/root/.ssh/id_rsa):

Você pode pressionar ENTER se esse for o local correto da chave, caso contrário, insira o local
revisado. Você receberá uma string que contém o comprimento de bits da chave, a impressão
digital, a conta e o host para o qual foi criada e o algoritmo usado:
537 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

4096 8e:c4:82:47:87:c2:26:4b:68:ff:96:1a:39:62:9e:4e demo@test (RSA)

Copiando sua chave SSH pública para um servidor com SSH-Copy-ID


Para copiar sua chave pública para um servidor, permitindo a autenticação sem uma senha,
várias abordagens podem ser feitas.

Se você atualmente tem acesso SSH baseado em senha configurado para o seu servidor e tem
o ssh-copy-idutilitário instalado, este é um processo simples. A ssh-copy-idferramenta está
incluída em muitos pacotes OpenSSH de distribuições Linux, portanto, muito provavelmente,
pode ser instalada por padrão.

Se você tiver essa opção, poderá transferir facilmente sua chave pública digitando:

root@debian10:/home/debian# ssh-copy-id username@remote_host

Isso solicitará a senha da conta do usuário no sistema remoto:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.


ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any
that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it
is to install the new keys
[email protected]'s password:

Depois de digitar a senha, o conteúdo da sua ~/.ssh/id_rsa.pubchave será anexado ao final


do ~/.ssh/authorized_keysarquivo da conta do usuário:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh '[email protected]'"


and check to make sure that only the key(s) you wanted were added.

Agora você pode fazer login nessa conta sem uma senha:

root@debian10:/home/debian# ssh username@remote_host


538 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Copiando sua chave SSH pública para um servidor sem SSH-Copy-ID


Se você não tiver o ssh-copy-idutilitário disponível, mas ainda tiver acesso SSH baseado em
senha ao servidor remoto, poderá copiar o conteúdo de sua chave pública de uma maneira
diferente.

Você pode enviar o conteúdo da chave e canalizá-lo para o sshcomando. No lado remoto,
você pode garantir que o ~/.sshdiretório existe e, em seguida, anexar o conteúdo canalizado
ao ~/.ssh/authorized_keysarquivo:

root@debian10:/home/debian# cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.


ssh && cat >> ~/.ssh/authorized_keys"

Você será solicitado a fornecer a senha da conta remota:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.


ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
[email protected]'s password:

Após inserir a senha, sua chave será copiada, permitindo que você faça o login sem uma senha:

root@debian10:/home/debian# ssh username@remote_IP_host

Copiando sua chave SSH pública para um servidor manualmente


Se você não tiver acesso SSH baseado em senha disponível, terá que adicionar sua chave
pública ao servidor remoto manualmente.

Em sua máquina local, você pode encontrar o conteúdo de seu arquivo de chave pública
digitando:

root@debian10:/home/debian# cat ~/.ssh/id_rsa.pub


539 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+
tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+
dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+
PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+
ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12
N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+
xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/
zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+
ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/
YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/
lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test

Você pode copiar esse valor e colá-lo manualmente no local apropriado no servidor remoto.
Você terá que fazer login no servidor remoto por outros meios (como o console da web
DigitalOcean).

No servidor remoto, crie o ~/.sshdiretório se ele ainda não existir:

root@debian10:/home/debian# mkdir -p ~/.ssh

Depois disso, você pode criar ou anexar o ~/.ssh/authorized_keysarquivo digitando:

echo public_key_string >> ~/.ssh/authorized_keys

Agora você deve conseguir fazer login no servidor remoto sem uma senha.

Instruções básicas de conexão


A seção a seguir cobrirá alguns dos princípios básicos sobre como se conectar a um servidor
com SSH.

Conectando-se a um servidor remoto


Para se conectar a um servidor remoto e abrir uma sessão shell, você pode usar o sshcomando.

A forma mais simples assume que seu nome de usuário em sua máquina local é o mesmo que
no servidor remoto. Se isso for verdade, você pode se conectar usando:

root@debian10:/home/debian# ssh remote_host


540 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Se o seu nome de usuário for diferente no servidor remoto, você precisa passar o nome do
usuário remoto desta forma:

root@debian10:/home/debian# ssh username@remote_host

Na primeira vez em que se conectar a um novo host, você verá uma mensagem semelhante a
esta:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.


ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

Digite yes para aceitar a autenticidade do host remoto.

Se você estiver usando autenticação de senha, será solicitada a senha da conta remota aqui.
Se você estiver usando chaves SSH, será solicitada a senha de sua chave privada, se houver
uma definida, caso contrário, você será conectado automaticamente.

Executando um único comando em um servidor remoto


Para executar um único comando em um servidor remoto em vez de gerar uma sessão shell,
você pode adicionar o comando após as informações de conexão, como este:

root@debian10:/home/debian# ssh username@remote_host command_to_run

Isso se conectará ao host remoto, fará a autenticação com suas credenciais e executará o
comando que você especificou. A conexão será encerrada imediatamente em seguida.

Login em um servidor com uma porta diferente


Por padrão, o daemon SSH em um servidor é executado na porta 22. Seu cliente SSH presumirá
que esse é o caso ao tentar se conectar. Se o seu servidor SSH estiver escutando em uma
porta não padrão (isso é demonstrado em uma seção posterior), você terá que especificar o
novo número da porta ao se conectar com o seu cliente.

Você pode fazer isso especificando o número da porta com a opção -p:
541 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# ssh -p port_num username@remote_host

Para evitar ter que fazer isso sempre que efetuar login no servidor remoto, você pode criar
ou editar um arquivo de configuração no diretório ~/.ssh dentro do diretório inicial do seu
computador local.

Edite ou crie o arquivo agora digitando:

root@debian10:/home/debian# nano ~/.ssh/config

Aqui, você pode definir opções de configuração específicas do host. Para especificar sua nova
porta, use um formato como este:

• ~/.ssh/config

Host remote_alias
HostName remote_host
Port port_num

Isso permitirá que você efetue login sem especificar o número da porta específica na linha de
comando.

Adicionando suas chaves SSH a um agente SSH para evitar digitar a


frase secreta
Se você tiver uma frase secreta em sua chave SSH privada, será solicitado que você digite a
frase secreta sempre que a usar para se conectar a um host remoto.

Para evitar ter que fazer isso repetidamente, você pode executar um agente SSH. Este pequeno
utilitário armazena sua chave privada após você inserir a senha pela primeira vez. Ele estará
disponível durante a sua sessão de terminal, permitindo que você se conecte no futuro sem
inserir novamente a senha.

Isso também é importante se você precisar encaminhar suas credenciais SSH (mostradas pos-
teriormente).

Para iniciar o Agente SSH, digite o seguinte em sua sessão de terminal local:
542 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

eval $(ssh-agent)

Agent pid 10891

Isso iniciará o programa do agente e o colocará em segundo plano. Agora, você precisa
adicionar sua chave privada ao agente, para que ele possa gerenciar sua chave:

root@debian10:/home/debian# ssh-add

Enter passphrase for /home/demo/.ssh/id_rsa:


Identity added: /home/demo/.ssh/id_rsa (/home/demo/.ssh/id_rsa)

Você terá que inserir sua senha (se houver). Depois disso, seu arquivo de identidade é adi-
cionado ao agente, permitindo que você use sua chave para entrar sem ter que digitar a senha
novamente.

Encaminhando suas credenciais SSH para uso em um servidor


Se desejar se conectar sem uma senha a um servidor de outro servidor, você precisará encam-
inhar suas informações de chave SSH. Isso permitirá que você se autentique em outro servidor
por meio do servidor ao qual está conectado, usando as credenciais do seu computador local.

Para começar, você deve ter seu agente SSH iniciado e sua chave SSH adicionada ao agente
(veja anteriormente). Depois de fazer isso, você precisa se conectar ao seu primeiro servidor
usando a opção -A. Isso encaminha suas credenciais para o servidor para esta sessão:

root@debian10:/home/debian# ssh -A username@remote_host

A partir daqui você pode fazer SSH em qualquer outro host que sua chave SSH está autorizada
a acessar. Você se conectará como se sua chave SSH privada estivesse localizada neste servidor.

Opções de configuração do lado do servidor


Esta seção contém algumas opções de configuração comuns do lado do servidor que podem
definir a maneira como o servidor responde e quais tipos de conexões são permitidas.
543 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Desativando autenticação de senha

Se você tiver chaves SSH configuradas, testadas e funcionando corretamente, provavelmente


é uma boa ideia desabilitar a autenticação por senha. Isso impedirá que qualquer usuário faça
login com SSH usando uma senha.

Para fazer isso, conecte-se ao servidor remoto e abra o arquivo /etc/ssh/sshd_config com
privilégios de root ou sudo:

root@debian10:/home/debian# vi /etc/ssh/sshd_config

Dentro do arquivo, procure a diretiva PasswordAuthentication. Se estiver comentado, desco-


mente. Defina como no para desativar logins de senha:

PasswordAuthentication no

Depois de fazer a alteração, salve e feche o arquivo. Para implementar as mudanças, você
deve reiniciar o serviço SSH.

root@debian10:/home/debian# service ssh restart

Agora, todas as contas no sistema não poderão fazer login com SSH usando senhas.

Alterando a porta em que o SSH Daemon é executado


Alguns administradores sugerem que você altere a porta padrão em que o SSH é executado.
Isso pode ajudar a diminuir o número de tentativas de autenticação às quais seu servidor está
sujeito a partir de bots automatizados.

Para alterar a porta de escuta do daemon SSH, você terá que fazer login no servidor remoto.
Abra o arquivo sshd_config no sistema remoto com privilégios de root, fazendo login com esse
usuário ou usando sudo:

root@debian10:/home/debian# vi /etc/ssh/sshd_config
544 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Depois de entrar, você pode alterar a porta em que o SSH é executado, encontrando a
especificação Port 22 e modificando-a para refletir a porta que deseja usar. Por exemplo, para
alterar a porta para 4444, coloque isso em seu arquivo:

#Port 22
Port 4444

Salve e feche o arquivo quando terminar. Para implementar as mudanças, você deve reiniciar
o daemon SSH.

root@debian10:/home/debian# service ssh restart

Depois que o daemon for reiniciado, você precisará autenticar especificando o número da porta
(demonstrado em uma seção anterior).

Limitando os usuários que podem se conectar por meio de SSH


Para limitar explicitamente as contas de usuário que podem efetuar login por meio do SSH,
você pode adotar algumas abordagens diferentes, cada uma delas envolvendo a edição do
arquivo de configuração do daemon SSH.

Em seu servidor remoto, abra este arquivo agora com privilégios de root ou sudo:

root@debian10:/home/debian# vi /etc/ssh/sshd_config

O primeiro método de especificar as contas que têm permissão para fazer login é usando
a diretiva AllowUsers. Procure a diretiva AllowUsers no arquivo. Se não existir, crie-o em
qualquer lugar. Após a diretiva, liste as contas de usuário que devem ter permissão para fazer
login por meio de SSH:

AllowUsers user1 user2

Salve e feche o arquivo. Reinicie o daemon para implementar suas mudanças.

root@debian10:/home/debian#service ssh restart


545 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Túneis de porta SSH


O OpenSSH apresenta um recurso de encaminhamento muito poderoso, por meio do qual o
tráfego em uma porta de origem é tunelado, e criptografado por meio de um processo SSH, que
em seguida o redireciona para uma porta em um host de destino. Esse mecanismo é chamado
de tunelamento de porta (port tunnelling) ou encaminhamento de porta (port forwarding) e
oferece vantagens importantes, como as seguintes:

• Permite contornar firewalls para acessar portas em hosts remotos;


• Possibilita o acesso externo a um host em sua rede privada;
• Fornece criptografia para todas as trocas de dados.

Grosso modo, podemos diferenciar entre o tunelamento de portas local e remoto.

Túnel de porta local


Definimos uma porta localmente para encaminhar o tráfego para o host de destino por meio
do processo SSH que fica entre os dois. O processo SSH pode ser executado no host local ou
em um servidor remoto. Por exemplo, se por algum motivo você quisesse fazer um túnel de
conexão para www.gnu.org por SSH usando a porta 8585 em sua máquina local, a operação
seria semelhante à seguinte:

debian@debian:~$ ssh -L 8585:www.gnu.org:80 debian


debian@debian's password:
Linux debian 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2 (2020-04-29) x86_64

The programs included with the Debian GNU/Linux system are free software;
(...)
Last login: Sun Jun 28 13:47:27 2020 from 127.0.0.1

Eis a explicação: com a opção -L, especificamos que, a porta local 8585 deve se conectar
à porta http 80 em www.gnu.org usando o processo SSH executado em debian, nosso host
local. Poderíamos ter escrito ssh -L 8585:www.gnu.org:80 localhost com o mesmo efeito. Se
agora visitássemos http://localhost:8585 com um navegador web, seríamos encaminhados a
www.gnu.org. Para fins de demonstração, usaremos o lynx (o navegador web clássico em
modo texto):

debian@debian:~$ lynx http://localhost:8585


(...)
* Back to Savannah Homepage
* Not Logged in
* Login
* New User
* This Page
546 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

* Language
* Clean Reload
* Printer Version
* Search
* _
(...)

Se você quisesse fazer exatamente a mesma coisa, mas se conectando por meio de um processo
SSH em execução no halof, o procedimento seria o seguinte:

debian@debian:~$ ssh -L 8585:www.gnu.org:80 -Nf [email protected]


Enter passphrase for key '/home/debian/.ssh/id_ecdsa':
debian@debian:~$
debian@debian:~$ lynx http://localhost:8585
(...)
* Back to Savannah Homepage
* Not Logged in
* Login
* New User
* This Page
* Language
* Clean Reload
* Printer Version
* Search
* _
(...)

É importante observar três detalhes no comando:

• Graças à opção -N, não fizemos login no halof, mas sim o encaminhamento de porta;
• A opção -f disse ao SSH para rodar em segundo plano;
• Especificamos o usuário ina para o encaminhamento: [email protected]

Túnel de porta remota


No túnel de porta remota (ou encaminhamento de porta reversa), o tráfego vindo de uma
porta no servidor remoto é encaminhado para o processo SSH em execução em seu host local
e, de lá, para a porta especificada no servidor de destino (que também pode ser a sua máquina
local). Por exemplo, digamos que você queira permitir que alguém de fora de sua rede acesse
o servidor web Apache em execução no seu host local através da porta 8585 do servidor SSH
rodando em halof (192.168.1.77). Você continuaria com o seguinte comando:

debian@debian:~$ ssh -R 8585:localhost:80 -Nf [email protected]


Enter passphrase for key '/home/debian/.ssh/id_ecdsa':
debian@debian:~$
547 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Agora, qualquer pessoa que estabelecer uma conexão com o halof na porta 8585 verá a página
inicial padrão do Apache2 do Debian:

debian@debian:~$ lynx 192.168.1.77:8585


(...)
Apache2 Debian Default
Page: It works (p1 of
3)
Debian Logo Apache2 Debian Default Page
It works!

This is the default welcome page used to test the correct operation of the Apache2
server after
installation on Debian systems. If you can read this page, it means that the Apache HTTP
server
installed at this site is working properly. You should replace this file (located at
/var/www/html/index.html) before continuing to operate your HTTP server.
(...)

Túneis X11
Agora que você já conhece os túneis de portas, vamos encerrar esta lição discutindo o tunela-
mento X11 (também conhecido como X11forwarding). Por meio de um túnel X11, o X Window
System no host remoto é encaminhado para sua máquina local. Para isso, basta passar a opção
-X ao ssh:

debian@debian:~$ ssh -X ina@halof


...

Agora você pode iniciar um aplicativo gráfico, como o navegador firefox, com o seguinte
resultado: o aplicativo será executado no servidor remoto, mas sua exibição será encaminhada
ao seu host local.

Se iniciarmos uma nova sessão SSH com a opção -x, X11forwarding será desabilitado. Tente
iniciar o firefox agora e aparecerá um erro semelhante ao seguinte:

debian@debian:~$ ssh -x ina@halof


[email protected]'s password:
(...)
ina@halof:~$ firefox

(firefox-esr:1779): Gtk-WARNING **: 18:45:45.603: Locale not supported by C library.


Using the fallback 'C' locale.
Error: no DISPLAY environment variable specified
548 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

GPG, ou GNU Privacy Guard


GPG, ou GNU Privacy Guard, é uma implementação de criptografia de chave pública. Isso
permite a transmissão segura de informações entre as partes e pode ser usado para verificar
se a origem de uma mensagem é genuína.

Como funciona a criptografia de chave pública


Um problema que muitos usuários enfrentam é como se comunicar com segurança e validar a
identidade da parte com a qual estão conversando. Muitos esquemas que tentam responder a
essa pergunta requerem, pelo menos em algum ponto, a transferência de uma senha ou outras
credenciais de identificação, em um meio não seguro.

Certifique-se de que apenas a parte pretendida pode ler

Para contornar esse problema, o GPG conta com um conceito de segurança conhecido como
criptografia de chave pública. A ideia é que você pode dividir os estágios de criptografia e
descriptografia da transmissão em duas partes separadas. Dessa forma, você pode distribuir
livremente a parte de criptografia, desde que proteja a parte de descriptografia.

Isso permitiria uma transferência de mensagem unilateral que pode ser criada e criptografada
por qualquer pessoa, mas apenas descriptografada pelo usuário designado (aquele com a chave
de descriptografia privada). Se ambas as partes criarem pares de chaves pública / privada
e fornecerem uma à outra suas chaves de criptografia públicas, ambas podem criptografar
mensagens uma para a outra.

Portanto, neste cenário, cada parte tem sua própria chave privada e a chave pública do outro
usuário.

Validar a identidade do remetente

Outro benefício desse sistema é que o remetente de uma mensagem pode “assinar” a mensagem
com sua chave privada. A chave pública que o receptor possui pode ser usada para verificar
se a assinatura está realmente sendo enviada pelo usuário indicado.

Configurar Chaves GPG


O GPG é instalado por padrão na maioria das distribuições.

Se por algum motivo o GPG não estiver instalado, no Ubuntu e no Debian, você pode atualizar
o índice de repositório local e instalá-lo digitando:
549 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# apt-get update


root@debian10:/home/debian# apt-get install gnupg

Para começar a usar o GPG para criptografar suas comunicações, você precisa criar um par
de chaves. Você pode fazer isso emitindo o seguinte comando:

root@debian10:/home/debian# gpg --gen-key

Isso o levará por algumas perguntas que irão configurar suas chaves:

• Selecione o tipo de chave que deseja: (1) RSA e RSA (padrão);


• Que tamanho de chave você quer? 4096;
• A chave é válida para? 1y (expira após 1 ano. Se você está apenas testando, convém
criar uma chave de curta duração pela primeira vez usando um número como “3”.);
• Isso está correto? y;
• Nome verdadeiro: seu nome verdadeiro aqui;
• Endereço de email: [email protected];
• Comentário: comentário opcional que ficará visível na sua assinatura;
• Alterar (N) ame, (C) omentário, (E) mail ou (O) kay / (Q) uit? O;
• Digite a senha longa: digite uma senha segura aqui (maiúsculas e minúsculas, dígitos,
símbolos).

Neste ponto, gpg irá gerar as chaves usando entropia. Entropia descreve a quantidade de
imprevisibilidade e não determinismo que existe em um sistema. O GPG precisa dessa entropia
para gerar um conjunto seguro de chaves.

Este processo pode demorar muito, dependendo de quão ativo o seu sistema está e do tamanho
da chave que você selecionou.

Criar um certificado de revogação


Você precisa encontrar uma maneira de invalidar seu par de chaves no caso de haver uma
violação de segurança ou no caso de você perder sua chave secreta. Existe uma maneira fácil
de fazer isso com o software GPG.

Isso deve ser feito assim que você fizer o par de chaves, não quando for necessário. Essa chave
de revogação deve ser gerada com antecedência e mantida em um local separado e seguro
para o caso de o computador estar comprometido ou inoperante. Para gerar uma chave de
550 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

revogação, digite:

root@debian10:/home/debian# gpg --output ~/revocation.crt --gen-revoke your_email@address.


com

Você será solicitado a confirmar a criação da chave de revogação e, em seguida, o motivo


pelo qual ela está sendo revogada. Essas informações ficarão visíveis para outros usuários se a
revogação for usada no futuro. Você pode escolher qualquer uma das opções disponíveis, mas
como isso está sendo feito com antecedência, você não terá os detalhes. Frequentemente, é
uma boa ideia criar um certificado de revogação para cada um dos cenários prováveis para
máxima flexibilidade.

Posteriormente, será solicitado que você forneça um comentário e, por fim, que confirme as
seleções. Antes de criar o certificado de revogação, você precisará inserir a senha de sua
chave GPG para confirmar sua identidade. O certificado de revogação será gravado no arquivo
especificado pelo –outputsinalizador ( revocation.crtem nosso exemplo):

Revocation certificate created.

Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable. But have some caution: The print system of
your machine might store the data and make it available to others!

Você deve restringir imediatamente as permissões no arquivo de certificado gerado para evitar
o acesso não autorizado:

root@debian10:/home/debian# chmod 600 ~/revocation.crt

O certificado de revogação deve ser mantido em segurança para que outros usuários não
possam revogar sua chave. Como afirma a mensagem, você deve considerar fazer o backup do
certificado em outras máquinas e imprimi-lo, contanto que possa protegê-lo adequadamente.

Como importar chaves públicas de outros usuários


O GPG seria bastante inútil se você não pudesse aceitar outras chaves públicas de pessoas
com as quais deseja se comunicar.
551 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Você pode importar a chave pública de alguém de várias maneiras. Se você obteve uma chave
pública de alguém em um arquivo de texto, o GPG pode importá-la com o seguinte comando:

root@debian10:/home/debian# gpg --import name_of_pub_key_file

Também existe a possibilidade de que a pessoa com quem você deseja se comunicar tenha
carregado sua chave em um servidor de chave pública. Esses servidores de chaves são usados
para hospedar as chaves públicas de pessoas de todo o mundo.

Um servidor de chave popular que sincroniza suas informações com uma variedade de outros
servidores é o servidor de chave pública MIT. Você pode pesquisar pessoas por nome ou
endereço de e-mail acessando aqui em seu navegador da web:

https://pgp.mit.edu/ Você também pode pesquisar o servidor de chaves de dentro do GPG


digitando o seguinte:

root@debian10:/home/debian# gpg --keyserver pgp.mit.edu --search-keys search_parameters

Você pode usar este método de pesquisa por nome ou endereço de e-mail. Você pode importar
as chaves que encontrar seguindo os prompts.

Como verificar e assinar chaves


Embora você possa distribuir livremente o arquivo de chave pública gerado e as pessoas possam
usar isso para contatá-lo de maneira segura, é importante poder confiar que a chave pertence
a quem você pensa que pertence durante a transmissão inicial da chave pública.

Verifique a identidade da outra pessoa

Como você sabe que a pessoa que está lhe dando a chave pública é quem ela diz ser? Em alguns
casos, isso pode ser simples. Você pode estar sentado ao lado da pessoa com seus laptops
abertos e trocando as chaves. Essa deve ser uma maneira bastante segura de identificar se
você está recebendo a chave correta e legítima.

Mas existem muitas outras circunstâncias em que esse contato pessoal não é possível. Você
pode não conhecer a outra parte pessoalmente ou pode estar separado por uma distância
física. Se você nunca deseja se comunicar através de canais inseguros, a verificação da chave
pública pode ser problemática.
552 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Felizmente, em vez de verificar todas as chaves públicas de ambas as partes, você pode sim-
plesmente comparar a “impressão digital” derivada dessas chaves. Isso lhe dará uma garantia
razoável de que ambos estão usando as mesmas informações de chave pública.

Você pode obter a impressão digital de uma chave pública digitando:

root@debian10:/home/debian# gpg --fingerprint [email protected]

pub 4096R/311B1F84 2013-10-04


Key fingerprint = CB9E C70F 2421 AF06 7D72 F980 8287 6A15 311B 1F84
uid Test User <[email protected]>
sub 4096R/8822A56A 2013-10-04

Isso produzirá uma sequência de números muito mais gerenciável para comparação. Você
pode comparar essa string com a própria pessoa ou com outra pessoa que tenha acesso a essa
pessoa.

Assine a chave deles


Assinar uma chave informa ao software que você confia na chave fornecida e que verificou que
ela está associada à pessoa em questão.

Para assinar uma chave que você importou, basta digitar:

root@debian10:/home/debian# gpg --sign-key [email protected]

Quando você assina a chave, significa que você confia que a pessoa é quem ela afirma ser.
Isso pode ajudar outras pessoas a decidir se também devem confiar nessa pessoa. Se alguém
confia em você e vê que você assinou a chave dessa pessoa, é mais provável que também
confie em sua identidade.

Você deve permitir que a pessoa cuja chave você está assinando tire vantagem de seu rela-
cionamento de confiança, enviando-lhes de volta a chave assinada. Você pode fazer isso
digitando:

root@debian10:/home/debian# gpg --output ~/signed.key --export --armor [email protected]

Você terá que digitar sua senha novamente. Depois, a chave pública, assinada por você,
será exibida. Envie isso a eles, para que eles possam se beneficiar ao obter o seu “selo de
553 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

aprovação” ao interagir com outras pessoas.

Quando eles recebem essa nova chave assinada, eles podem importá-la, adicionando as in-
formações de assinatura que você gerou em seu banco de dados GPG. Eles podem fazer isso
digitando:

root@debian10:/home/debian# gpg --import ~/signed.key

Eles agora podem demonstrar a outras pessoas que você confia que a identidade deles está
correta.

Como tornar sua chave pública altamente disponível


Devido à forma como a criptografia de chave pública é projetada, nada de mal-intencionado
pode acontecer se pessoas desconhecidas tiverem sua chave pública.

Com isso em mente, pode ser benéfico tornar sua chave pública disponível publicamente. As
pessoas podem então encontrar suas informações para enviar mensagens com segurança desde
sua primeira interação.

Você pode enviar sua chave pública a qualquer pessoa, solicitando-a no sistema GPG:

root@debian10:/home/debian# gpg --output ~/mygpg.key --armor --export your_email@address.


com

-----BEGIN PGP PUBLIC KEY BLOCK-----


Version: GnuPG v1.4.11 (GNU/Linux)

mQINBFJPCuABEACiog/sInjg0O2SqgmG1T8n9FroSTdN74uGsRMHHAOuAmGLsTse
9oxeLQpN+r75Ko39RVE88dRcW710fPY0+fjSXBKhpN+raRMUKJp4AX9BJd00YA/4
EpD+8cDK4DuLlLdn1x0q41VUsznXrnMpQedRmAL9f9bL6pbLTJhaKeorTokTvdn6
5VT3pb2o+jr6NETaUxd99ZG/osPar9tNThVLIIzG1nDabcTFbMB+w7wOJuhXyTLQ
JBU9xmavTM71PfV6Pkh4j1pfWImXc1D8dS+jcvKeXInBfm2XZsfOCesk12YnK3Nc
u1Xe1lxzSt7Cegum4S/YuxmYoh462oGZ7FA4Cr2lvAPVpO9zmgQ8JITXiqYg2wB3
. . .

Você pode então enviar esse arquivo para a outra parte por meio de uma mídia apropriada.

Se você deseja publicar sua chave em um servidor de chaves, pode fazê-lo manualmente por
meio dos formulários disponíveis na maioria dos sites de servidor.

Outra opção é fazer isso por meio da interface GPG. Procure sua ID de chave digitando:
554 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

root@debian10:/home/debian# gpg --list-keys [email protected]

A parte destacada na saída abaixo é o ID da chave (procure pub ao longo da coluna à


esquerda se não tiver certeza de qual usar). É uma forma resumida de fazer referência à chave
do software interno.

pub 4096R/311B1F84 2013-10-04


uid Test User <[email protected]>
sub 4096R/8822A56A 2013-10-04

Para enviar sua chave para um determinado servidor de chaves, você pode usar esta sintaxe:

root@debian10:/home/debian# gpg --send-keys --keyserver pgp.mit.edu key_id

A chave será carregada no servidor especificado. Posteriormente, ele provavelmente será


distribuído para outros servidores importantes em todo o mundo.

Criptografar e descriptografar mensagens com GPG


Você pode criptografar e descriptografar mensagens facilmente depois de compartilhar suas
chaves com a outra parte.

Criptografar mensagens

Você pode criptografar mensagens usando o sinalizador “–encrypt” para GPG. A sintaxe básica
seria:

root@debian10:/home/debian# gpg --encrypt --sign --armor -r [email protected] name_of_file

Isso criptografa a mensagem usando a chave pública do destinatário, assina-a com sua própria
chave privada para garantir que ela está vindo de você e gera a mensagem em formato de
texto em vez de bytes brutos. O nome do arquivo será igual ao nome do arquivo de entrada,
mas com uma extensão .asc.

Você deve incluir um segundo destinatário “-r” com seu próprio endereço de e-mail se quiser
ler a mensagem criptografada. Isso ocorre porque a mensagem será criptografada com a chave
555 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

pública de cada pessoa e só poderá ser descriptografada com a chave privada associada.

Portanto, se ela fosse criptografada apenas com a chave pública da outra parte, você não
conseguiria ver a mensagem novamente, a menos que de alguma forma obtivesse a chave
privada. Adicionar a si mesmo como segundo destinatário criptografa a mensagem duas vezes
diferentes, uma para cada destinatário.

Descriptografar mensagens

Ao receber uma mensagem, basta chamar GPG no arquivo de mensagem:

root@debian10:/home/debian# gpg file_name.asc

O software irá avisá-lo conforme necessário.

Se, em vez de um arquivo, você tiver a mensagem como um fluxo de texto bruto, poderá
copiá-la e colá-la após digitar gpg sem nenhum argumento. Você pode pressionar “CTRL-D”
para significar o fim da mensagem e o GPG irá descriptografá-la para você.

Manutenção Chave
Existem vários procedimentos que você pode precisar usar regularmente para gerenciar seu
banco de dados de chaves.

Para listar as chaves GPG disponíveis de outras pessoas, você pode emitir este comando:

root@debian10:/home/debian# gpg --list-keys

Suas informações de chave podem ficar desatualizadas se você estiver contando com infor-
mações obtidas de servidores de chaves públicas. Você não quer depender de chaves revogadas,
porque isso significaria que você está confiando em chaves potencialmente comprometidas.

Você pode atualizar as informações principais emitindo:

root@debian10:/home/debian# gpg --refresh-keys

Isso irá buscar novas informações dos servidores principais.


556 50. Introdução
Fabio Gonçalves De Melo Santana / [email protected]

Você pode obter informações de um servidor de chaves específico usando:

root@debian10:/home/debian# gpg --keyserver key_server --refresh-keys

Você pode receber mensagens de erro se alguma de suas chaves não puder ser encontrada no
servidor de chaves.

Tavez isso possa te ajudar. . .


CHEATSHEETS SSH

• Fonte: - https://www.reddit.com/r/Cheatography/comments/ilezuq/openssh_cheat_sheet_by_mis-
terrabinhalder/

Você também pode gostar